Skip to navigation

Make Policy

Make Policy

Sigorta şirketinin, PolicyRequested aşamasındaki bir iş (job) için ürettiği poliçeyi platforma kaydeder. İstek başarılı olduğunda PolicyMade state geçişi tetiklenir; poliçe, prim ve vade planı kaydedilir, poliçe/bilgilendirme PDF’leri işe eklenir ve ilgili taraflara bildirim e-postası gönderilir.


Uç Nokta (Endpoint)

POST {{baseUrl}}/api/offline/jobs/:jobId/policies


Kullanım

Bu servis, platformdan gelen poliçeleşme talebinin sigorta şirketi tarafındaki karşılığıdır. Önerilen akış:

  1. Authentication Login servisinden token alınır.
  2. GET /api/offline/jobs ile PolicyRequested aşamasındaki işler listelenir.
  3. GET /api/offline/jobs/:jobId/request-details ile işin ProductId, talep edilen ödeme türü ve taksit sayısı okunur.
  4. Poliçe sigorta şirketi sisteminde üretilir.
  5. Bu servis çağrılarak poliçe numarası, prim tutarları ve PDF’ler platforma iletilir.
  6. 201 Created dönerse iş PolicyMade aşamasına geçmiştir; sonraki adım zeyil akışıdır (EndorsementRequested).

💡 grossPremium, netPremium ve commission değerleri, daha önce teklifte sunulan prim ile birebir aynı olmalıdır; aksi hâlde JobState.PremiumMismatch alınır. (Acente bazında prim doğrulaması kapatılmışsa bu kontrol atlanır.)

💡 premium bloğu yalnızca platformda kayıtlı prim/vade planının yerine geçmesi isteniyorsa gönderilir. Gönderilmezse teklif aşamasında kaydedilen prim ve taksit planı kullanılır, taksit tarihleri poliçe başlangıç tarihinden itibaren aylık olarak yeniden üretilir.

⚠️ İş PolicyRequested aşamasında değilse state machine geçişe izin vermez ve istek 500 Internal Server Error / JobState.UnknownBusinessRule ile sonuçlanır.


Kimlik Doğrulama

Bu uç nokta geçerli bir JWT erişim token’ı gerektirir. Token, Authentication Login servisinden alınır ve Authorization başlığında gönderilir.

BaşlıkTürZorunluAçıklama
Authorizationstring✅Bearer <token> biçiminde erişim token’ı.
Content-Typestring✅application/json olmalıdır.

Token’ın InsuranceCompanyAPIUser, InsuranceCompanyAPIAdmin veya Supervizor rollerinden en az birini ve Create yetkisini taşıması gerekir. InsuranceCompanyAPIUser yalnızca kendi üzerine atanmış işlerde işlem yapabilir; InsuranceCompanyAPIAdmin ve Supervizor şirket kapsamındaki tüm işlerde işlem yapabilir.


İstek Parametreleri (Path Variables)

ParametreTürZorunluMinMaxAçıklama
jobIdinteger✅12147483647Poliçesi kaydedilecek işin benzersiz kimliği.

⚠️ jobId yalnızca yoldan alınır. Gövdede jobId göndermek etkisizdir; sunucu bu alanı her zaman yol parametresiyle ezer.


İstek Gövdesi

ParametreTürZorunluAçıklama
productIdinteger✅Poliçenin üretildiği ürünün kimliği. Sıfırdan büyük olmalıdır. İşin request-details yanıtındaki ürün kimliğiyle eşleşmelidir.
policyNumberstring✅Sigorta şirketinin verdiği poliçe numarası.
renewalNointeger✅Poliçenin yenileme numarası. Sıfır veya daha büyük olmalıdır.
policyStartDatestring (date-time)✅Poliçe başlangıç tarihi.
policyEndDatestring (date-time)✅Poliçe bitiş tarihi. policyStartDate değerinden büyük olmalıdır.
processingDatestring (date-time)✅Poliçe tanzim tarihi.
grossPremiumnumber✅Poliçe brüt primi. Sıfırdan büyük olmalıdır.
netPremiumnumber✅Poliçe net primi. Sıfırdan büyük olmalıdır.
commissionnumber✅Poliçe komisyon tutarı. Sıfır veya daha büyük olmalıdır.
currencyTypeinteger✅Poliçe para birimi (CurrencyType). Geçerli değerler için bknz.
exchangeRatenumber✅Poliçe tanzim anındaki döviz kuru. currencyType = TL ise tam olarak 1, diğer para birimlerinde 1’den büyük olmalıdır.
isTransferCompletedboolean—Poliçenin transfer akışıyla kaydedilip kaydedilmediğini belirtir. Varsayılan false.
messagestring—Poliçeye iliştirilen serbest not. En fazla 500 karakter.
premiumobject—Prim ve vade planı bilgisi. Gönderilirse platformda kayıtlı prim yerine bu bilgi kullanılır. Bkz. premium nesnesi.
policyPdfobject—Poliçe PDF dokümanı. Bkz. PolicyFileRequest nesnesi.
informationPdfobject—Bilgilendirme formu PDF dokümanı. Bkz. PolicyFileRequest nesnesi.
resultKeySetsarray—Sigorta şirketinin poliçeyle birlikte döndürdüğü sonuç alanları. Bkz. resultKeySets nesnesi.

premium nesnesi (gönderilirse aşağıdaki alanların doğrulaması uygulanır):

ParametreTürZorunluAçıklama
paymentOptionTypeinteger✅Ödeme seçeneği türü (PaymentType). Geçerli değerler için bknz. Platformun talep ettiği ödeme türüyle eşleşmelidir.
currencyTypeinteger✅Prim para birimi (CurrencyType). Geçerli değerler için bknz.
installmentNumberinteger✅Taksit sayısı. Sıfırdan büyük olmalı ve platformun talep ettiği taksit sayısıyla eşleşmelidir.
grossPremiumnumber✅Brüt prim. Sıfırdan büyük olmalıdır. Vade planındaki paymentAmount toplamına eşit olmalıdır.
netPremiumnumber✅Net prim. Sıfırdan büyük olmalıdır.
commissionnumber✅Komisyon tutarı. Sıfır veya daha büyük olmalı ve vade planındaki komisyon toplamından küçük olmamalıdır.
premiumInstallmentDetailsarray⚠️ KoşulluVade planı. installmentNumber 1’den büyükse zorunludur ve boş olamaz.
isInstallmentsEqualboolean—Taksitlerin eşit olup olmadığını belirtir. Varsayılan false.
firstInstallmentRateinteger—İlk taksit oranı. Gönderilirse 1–100 aralığında olmalıdır.
exchangeRatenumber—Prim için döviz kuru.
installmentExplanationstring—Vade planı açıklaması.
grossPremiumTLnumber—Kullanılmaz; gönderilse de yok sayılır. TL karşılıkları grossPremium × exchangeRate ile sunucuda hesaplanır.
commissionTLnumber—Kullanılmaz; gönderilse de yok sayılır.

premiumInstallmentDetails nesnesi:

ParametreTürZorunluAçıklama
installmentNumberinteger✅Taksit planının toplam taksit sayısı. Sıfırdan büyük olmalıdır.
installmentNointeger✅Taksitin sıra numarası. Sıfırdan büyük olmalıdır.
paymentAmountnumber✅Taksit tutarı. Sıfırdan büyük olmalıdır.
commissionnumber✅Taksite ait komisyon tutarı. Sıfır veya daha büyük olmalıdır.
paymentDatestring (date-time)✅Taksitin ödeme tarihi.

PolicyFileRequest nesnesi (policyPdf ve informationPdf):

ParametreTürZorunluAçıklama
fileNamestring✅Dosya adı. .pdf uzantısıyla bitmelidir.
base64Contentstring✅Base64 kodlanmış dosya içeriği. Çözüldüğünde %PDF imzasıyla başlayan geçerli bir PDF olmalıdır.
contentTypestring—Yok sayılır; sunucu içerik türünü her zaman application/pdf olarak atar.

⚠️ Sunucu, kaydedilen dosyanın adını {jobId}_{policyNumber}_{renewalNo}_{DokümanTipi}_{rastgele} biçiminde yeniden üretir. Gönderdiğiniz fileName yalnızca uzantı için kullanılır.

resultKeySets nesnesi:

ParametreTürZorunluAçıklama
idinteger—Alanın (key) benzersiz kimliği.
keyNamestring—Alanın adı.
keyValuearray (string)—Alana ait değer listesi.

Örnek İstek:

{
"productId": 41,
"policyNumber": "1002340019",
"renewalNo": 0,
"policyStartDate": "2026-08-15T00:00:00",
"policyEndDate": "2027-08-15T00:00:00",
"processingDate": "2026-08-10T00:00:00",
"grossPremium": 12500.75,
"netPremium": 10500.00,
"commission": 1250.00,
"currencyType": 1,
"exchangeRate": 1,
"isTransferCompleted": false,
"message": "Poliçe tanzim edilmiştir.",
"premium": {
"paymentOptionType": 1,
"currencyType": 1,
"isInstallmentsEqual": true,
"installmentNumber": 2,
"firstInstallmentRate": 50,
"grossPremium": 12500.75,
"netPremium": 10500.00,
"commission": 1250.00,
"exchangeRate": 1,
"installmentExplanation": "2 eşit taksit",
"premiumInstallmentDetails": [
{
"installmentNumber": 2,
"installmentNo": 1,
"paymentAmount": 6250.38,
"commission": 625.00,
"paymentDate": "2026-08-15T00:00:00"
},
{
"installmentNumber": 2,
"installmentNo": 2,
"paymentAmount": 6250.37,
"commission": 625.00,
"paymentDate": "2026-09-15T00:00:00"
}
]
},
"policyPdf": {
"fileName": "policy.pdf",
"base64Content": "JVBERi0xLjQKJeLjz9M..."
},
"informationPdf": {
"fileName": "information.pdf",
"base64Content": "JVBERi0xLjQKJeLjz9M..."
},
"resultKeySets": [
{ "id": 1, "keyName": "PolicyNumber", "keyValue": ["1002340019"] }
]
}

İstek Gövdesi Şeması (JSON Schema)

{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"title": "CreatePolicyRequest",
"type": "object",
"required": [
"productId",
"policyNumber",
"renewalNo",
"policyStartDate",
"policyEndDate",
"processingDate",
"grossPremium",
"netPremium",
"commission",
"currencyType",
"exchangeRate"
],
"properties": {
"productId": {
"type": "integer",
"format": "int32",
"exclusiveMinimum": 0,
"maximum": 2147483647
},
"policyNumber": { "type": "string", "minLength": 1 },
"renewalNo": {
"type": "integer",
"format": "int32",
"minimum": 0,
"maximum": 2147483647
},
"policyStartDate": { "type": "string", "format": "date-time" },
"policyEndDate": {
"type": "string",
"format": "date-time",
"$comment": "policyStartDate değerinden büyük olmalıdır."
},
"processingDate": { "type": "string", "format": "date-time" },
"grossPremium": { "type": "number", "format": "decimal", "exclusiveMinimum": 0 },
"netPremium": { "type": "number", "format": "decimal", "exclusiveMinimum": 0 },
"commission": { "type": "number", "format": "decimal", "minimum": 0 },
"currencyType": {
"type": "integer",
"format": "int32",
"minimum": 1,
"maximum": 7,
"$comment": "CurrencyType — https://docs.insurgateway.com/offline-constants#currency-type"
},
"exchangeRate": { "type": "number", "format": "decimal", "exclusiveMinimum": 0 },
"isTransferCompleted": { "type": "boolean", "default": false },
"message": { "type": ["string", "null"], "maxLength": 500 },
"premium": { "$ref": "#/$defs/PremiumEntryRequest" },
"policyPdf": { "$ref": "#/$defs/PolicyFileRequest" },
"informationPdf": { "$ref": "#/$defs/PolicyFileRequest" },
"resultKeySets": {
"type": "array",
"items": { "$ref": "#/$defs/KeySetRequest" }
}
},
"allOf": [
{
"if": { "properties": { "currencyType": { "const": 1 } }, "required": ["currencyType"] },
"then": { "properties": { "exchangeRate": { "const": 1 } } },
"else": { "properties": { "exchangeRate": { "exclusiveMinimum": 1 } } }
}
],
"$defs": {
"PremiumEntryRequest": {
"type": "object",
"required": [
"paymentOptionType",
"currencyType",
"installmentNumber",
"grossPremium",
"netPremium",
"commission"
],
"properties": {
"paymentOptionType": {
"type": "integer",
"format": "int32",
"minimum": 1,
"maximum": 3,
"$comment": "PaymentType — https://docs.insurgateway.com/offline-constants#payment-type"
},
"currencyType": {
"type": "integer",
"format": "int32",
"minimum": 1,
"maximum": 7,
"$comment": "CurrencyType — https://docs.insurgateway.com/offline-constants#currency-type"
},
"isInstallmentsEqual": { "type": "boolean", "default": false },
"firstInstallmentRate": {
"type": ["integer", "null"],
"format": "int16",
"minimum": 1,
"maximum": 100
},
"installmentNumber": {
"type": "integer",
"format": "int16",
"exclusiveMinimum": 0,
"maximum": 32767
},
"grossPremium": { "type": "number", "format": "decimal", "exclusiveMinimum": 0 },
"netPremium": { "type": "number", "format": "decimal", "exclusiveMinimum": 0 },
"commission": { "type": "number", "format": "decimal", "minimum": 0 },
"grossPremiumTL": {
"type": ["number", "null"],
"format": "decimal",
"$comment": "Sunucu tarafında kullanılmaz."
},
"commissionTL": {
"type": ["number", "null"],
"format": "decimal",
"$comment": "Sunucu tarafında kullanılmaz."
},
"exchangeRate": { "type": ["number", "null"], "format": "decimal" },
"installmentExplanation": { "type": ["string", "null"] },
"premiumInstallmentDetails": {
"type": "array",
"items": { "$ref": "#/$defs/PremiumInstallmentDetailRequest" }
}
},
"allOf": [
{
"if": {
"properties": { "installmentNumber": { "exclusiveMinimum": 1 } },
"required": ["installmentNumber"]
},
"then": {
"required": ["premiumInstallmentDetails"],
"properties": { "premiumInstallmentDetails": { "minItems": 1 } }
}
}
]
},
"PremiumInstallmentDetailRequest": {
"type": "object",
"required": ["installmentNumber", "installmentNo", "paymentAmount", "commission", "paymentDate"],
"properties": {
"installmentNumber": {
"type": "integer",
"format": "int16",
"exclusiveMinimum": 0,
"maximum": 32767
},
"installmentNo": {
"type": "integer",
"format": "int16",
"exclusiveMinimum": 0,
"maximum": 32767
},
"paymentAmount": { "type": "number", "format": "decimal", "exclusiveMinimum": 0 },
"commission": { "type": "number", "format": "decimal", "minimum": 0 },
"paymentDate": { "type": "string", "format": "date-time" }
}
},
"PolicyFileRequest": {
"type": "object",
"required": ["fileName", "base64Content"],
"properties": {
"fileName": {
"type": "string",
"minLength": 5,
"pattern": "(?i)\\.pdf$"
},
"base64Content": {
"type": "string",
"minLength": 1,
"contentEncoding": "base64",
"contentMediaType": "application/pdf",
"$comment": "Çözüldüğünde %PDF imzasıyla başlamalıdır."
},
"contentType": {
"type": ["string", "null"],
"$comment": "Yok sayılır; sunucu application/pdf atar."
}
}
},
"KeySetRequest": {
"type": "object",
"properties": {
"id": { "type": "integer", "format": "int32" },
"keyName": { "type": ["string", "null"] },
"keyValue": { "type": ["array", "null"], "items": { "type": "string" } }
}
}
}
}

💡 Şemada additionalProperties: false bilinçli olarak yoktur: API bilinmeyen alanları yok sayar, isteği reddetmez.


Başarılı Yanıt (201 Created)

Poliçe başarıyla kaydedildiğinde HTTP 201 Created döner. Yanıt gövdesi yoktur.

Bu noktada sunucu tarafında gerçekleşenler:

Tablo / Sistemİşlem
PoliciesPoliçe kaydı eklenir (ProducedChannel = Offline).
Premiums / PremiumInstallmentDetailsPrim ve vade planı yeniden yazılır.
JobsCurrentStage = PolicyMade olarak güncellenir.
JobActionsPolicyMade tipinde yeni aksiyon eklenir.
OperationWatchSuccess = true, Complete = true işaretlenir.
PlatformPoliçe, prim ve aksiyon bilgisi platform servisine yazılır.
Doküman / E-postaPDF’ler arka plan işiyle kaydedilir, bildirim e-postası gönderilir.

Hatalı Yanıt (400 Bad Request)

Hatalar ApiResponse sarmalayıcısıyla döner:

AlanTürAçıklama
StatusbooleanHata durumunda her zaman false.
CodestringHata kodu. Alan bazlı doğrulama hatalarında Validation.General, diğerlerinde ilgili iş kuralı kodu.
MessagestringHata açıklaması.
Responsearray | nullDoğrulama hatalarında { Field, Message } listesi; diğer hatalarda null.

Alan doğrulama hatası:

{
"Status": false,
"Code": "Validation.General",
"Message": "One or more validation errors occurred",
"Response": [
{ "Field": "PolicyNumber", "Message": "PolicyNumber is required." },
{ "Field": "ExchangeRate", "Message": "ExchangeRate must be 1 for TL." }
]
}

İş kuralı hataları:

CodeNe zaman oluşur
JobState.PremiumMismatchPoliçe brüt/net/komisyon tutarı, teklifte sunulan prim ile aynı değil.
JobState.InstallmentTotalMismatchpremiumInstallmentDetails toplamı brüt prime eşit değil ya da komisyon toplamı komisyon primini aşıyor.
JobState.PaymentOptionMismatchGönderilen paymentOptionType, platformun talep ettiği ödeme türüyle eşleşmiyor.
JobState.InstallmentNumberMismatchGönderilen installmentNumber, teklifte sunulan taksit seçenekleri arasında yok.
{
"Status": false,
"Code": "JobState.PremiumMismatch",
"Message": "Premium values do not match between policy and proposal: Poliçe ve Teklif'te alınan bilgilerde brüt prim farkı oluşmuştur. Teklif ve Poliçe brüt priminin doğru olduğundan eminiz olunuz. Teklif Brüt Prim: 12.400,00 Poliçe Brüt Prim: 12.500,75",
"Response": null
}

Hatalı Yanıt (401 Unauthorized)

Token gönderilmediğinde, geçersiz olduğunda veya süresi dolduğunda HTTP 401 Unauthorized döner. Yanıt gövdesi boştur.

💡 Token’ın süresi dolduysa yanıtta Token-Expired: true başlığı bulunur. Bu durumda POST /api/authentication/refreshtoken ile yeni token alınmalıdır.


Hatalı Yanıt (403 Forbidden)

CodeNe zaman oluşur
OfflineUsers.InsuranceCompanyNotFoundToken’da geçerli bir sigorta şirketi ataması yok.
OfflineUsers.UserIdentityNotResolvedToken’dan kullanıcı kimliği çözümlenemedi.
OfflineJobs.JobInsuranceCompanyDeniedİş, token’daki sigorta şirketi kapsamının dışında.
OfflineJobs.JobOwnershipDeniedInsuranceCompanyAPIUser rolündeki kullanıcı, kendisine ait olmayan bir işte işlem yapmaya çalıştı.
{
"Status": false,
"Code": "OfflineJobs.JobOwnershipDenied",
"Message": "You do not have permission to access this job.",
"Response": null
}

Hatalı Yanıt (404 Not Found)

CodeNe zaman oluşur
OfflineJobs.JobNotFoundVerilen jobId ile eşleşen iş kaydı yok.
JobState.OperationWatchNotFoundTeklif ve ürün için poliçe operasyon kaydı bulunamadı.
JobState.PremiumNotFoundTeklifte, talep edilen taksit ve ödeme türüne ait prim kaydı bulunamadı (ve istekte premium gönderilmedi).
JobState.PlatformUserNotFoundAksiyonu karşılayacak platform kullanıcısı bulunamadı.
{
"Status": false,
"Code": "OfflineJobs.JobNotFound",
"Message": "No job found for the requested JobId: 999999.",
"Response": null
}

Hatalı Yanıt (409 Conflict)

CodeNe zaman oluşur
JobState.PolicyMadeByOtherCompanyTeklif başka bir sigorta şirketi tarafından poliçeleştirilmiş.
JobState.PolicyAlreadyExistsAynı poliçe/zeyil/yenileme numarasıyla kayıt zaten var ya da ürün için poliçe bilgisi mevcut.
{
"Status": false,
"Code": "JobState.PolicyAlreadyExists",
"Message": "A policy already exists for job 12345.",
"Response": null
}

Hatalı Yanıt (500 Internal Server Error)

CodeNe zaman oluşur
JobState.PlatformServiceFailurePoliçe, prim ve taksit bilgileri platform servisine yazılamadı.
JobState.UnknownBusinessRuleEşlenmemiş bir iş kuralı ihlali oluştu. İş PolicyRequested aşamasında değilken bu servis çağrıldığında da bu kod döner.
JobState.TransitionErrorState geçişi sırasında beklenmeyen bir hata oluştu.
{
"Status": false,
"Code": "JobState.UnknownBusinessRule",
"Message": "An unknown business rule error occurred: 'Poliçe Yapıldı' aşamasından 'Poliçe Yapıldı' aşamasına geçiş yapılamaz. Bu aşamadan yalnızca şu aşamalara geçiş yapılabilir: Mesaj, Zeyil Talebi.",
"Response": null
}

Authentication

AuthorizationBearer

Bearer authentication of the form Bearer <token>, where token is your auth token.

Path parameters

jobIdintegerRequired

Poliçesi kaydedilecek işin benzersiz kimliği.

Headers

AuthorizationstringOptional

Request

This endpoint expects an object.

Response

Created

Errors

400
Bad Request Error
403
Forbidden Error
404
Not Found Error
409
Conflict Error
500
Internal Server Error