Reject Policy

## Reject Policy Sigorta şirketinin, `PolicyRequested` aşamasındaki bir işin (job) poliçe talebini reddetmesini sağlar. İstek başarılı olduğunda `PolicyRejected` state geçişi tetiklenir; red nedeni işe işlenir, aynı teklifteki diğer işler yeniden aktif edilir ve ilgili taraflara bildirim e-postası gönderilir. --- ### Uç Nokta (Endpoint) `POST {{baseUrl}}/api/offline/jobs/:jobId/policies/reject` --- ### Kullanım Bu servis, poliçeleşme talebi karşılanamadığında kullanılı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/rejectreasons/1` ile `Policy` kategorisindeki geçerli red nedenleri çekilir. Dönen liste, token'daki sigorta şirketi için tanımlı olanlarla sınırlıdır. 4. Bu servis, seçilen `rejectReasonId` ve açıklama mesajıyla çağrılır. 5. `204 No Content` dönerse iş `PolicyRejected` aşamasına geçmiştir. Acente bu işten sonra yeniden poliçe talebinde bulunabilir (`PolicyRejected` → `PolicyRequested` geçişi tanımlıdır). > 💡 Red nedeni listesini sabit kodlamayın: `IncludedInsuranceCompanies` / `ExcludedInsuranceCompanies` kısıtları nedeniyle geçerli nedenler sigorta şirketine göre değişir. Her zaman `rejectreasons` servisinden okuyun. > ⚠️ İş `PolicyRequested` aşamasında değilse state machine geçişe izin vermez ve istek `400 Bad Request` / `OfflinePolicies.StateTransitionFailed` 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ık | Tür | Zorunlu | Açıklama | | --- | --- | --- | --- | | `Authorization` | string | ✅ | `Bearer <token>` biçiminde erişim token'ı. | | `Content-Type` | string | ✅ | `application/json` olmalıdır. | Token'ın `InsuranceCompanyAPIUser`, `InsuranceCompanyAPIAdmin` veya `Supervizor` rollerinden en az birini ve `Update` yetkisini taşıması gerekir. `InsuranceCompanyAPIUser` yalnızca kendi üzerine atanmış işleri reddedebilir; `InsuranceCompanyAPIAdmin` ve `Supervizor` şirket kapsamındaki tüm işleri reddedebilir. --- ### İstek Parametreleri (Path Variables) | Parametre | Tür | Zorunlu | Min | Max | Açıklama | | --- | --- | --- | --- | --- | --- | | `jobId` | integer | ✅ | 1 | 2147483647 | Poliçe talebi reddedilecek 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 | Parametre | Tür | Zorunlu | Açıklama | | --- | --- | --- | --- | | `message` | string | ✅ | Red açıklaması. Boş olamaz, en fazla 1000 karakter. Kaydedilmeden önce sunucuda HTML/script içeriğinden arındırılır. | | `rejectReasonId` | integer | ✅ | Red nedeni kimliği. Sıfırdan büyük olmalı, `Policy` kategorisinde (`ReasonCategory` = 1) tanımlı olmalı ve işin sigorta şirketine kapalı olmamalıdır. Geçerli liste için `GET /api/offline/rejectreasons/1`. | | `attachment` | object | — | Reddi destekleyen PDF belge. Bkz. `PolicyFileRequest` nesnesi. | **`PolicyFileRequest` nesnesi** (`attachment`): | Parametre | Tür | Zorunlu | Açıklama | | --- | --- | --- | --- | | `fileName` | string | ✅ | Dosya adı. `.pdf` uzantısıyla bitmelidir. | | `base64Content` | string | ✅ | Base64 kodlanmış dosya içeriği. Çözüldüğünde `%PDF` imzasıyla başlayan geçerli bir PDF olmalıdır. | | `contentType` | string | — | Yok sayılır; sunucu içerik türünü her zaman `application/pdf` olarak atar. | > ⚠️ `attachment` gönderilirse `fileName` ve `base64Content` alanlarının ikisi de zorunlu hâle gelir. Belge, işe `DocumentType = Other` tipiyle kaydedilir. **Örnek İstek (ek belgesiz):** ```json { "message": "Risk kabul kriterleri poliçe talebini karşılamamaktadır.", "rejectReasonId": 5 } ``` **Örnek İstek (ek belgeli):** ```json { "message": "Poliçe reddi gerekçeleri ekteki belgede detaylandırılmıştır.", "rejectReasonId": 5, "attachment": { "fileName": "rejection_reasons.pdf", "base64Content": "JVBERi0xLjQKJeLjz9M..." } } ``` --- ### İstek Gövdesi Şeması (JSON Schema) ```json { "$schema": "https://json-schema.org/draft/2020-12/schema", "title": "RejectPolicyRequest", "type": "object", "required": ["message", "rejectReasonId"], "properties": { "message": { "type": "string", "minLength": 1, "maxLength": 1000 }, "rejectReasonId": { "type": "integer", "format": "int32", "exclusiveMinimum": 0, "maximum": 2147483647, "$comment": "ReasonCategory = Policy olan kayıtlar. Liste: GET /api/offline/rejectreasons/1 — https://docs.insurgateway.com/offline-constants" }, "attachment": { "$ref": "#/$defs/PolicyFileRequest" } }, "$defs": { "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." } } } } } ``` > 💡 Şemada `additionalProperties: false` bilinçli olarak yoktur: API bilinmeyen alanları yok sayar, isteği reddetmez. --- ### Başarılı Yanıt (204 No Content) Poliçe talebi başarıyla reddedildiğinde HTTP `204 No Content` döner. **Yanıt gövdesi yoktur.** Bu noktada sunucu tarafında gerçekleşenler: | Tablo / Sistem | İşlem | | --- | --- | | `Jobs` | `CurrentStage = PolicyRejected`, `RejectReasonId` güncellenir. | | `JobActions` | `PolicyRejected` tipinde yeni aksiyon eklenir; `RequestDetails` alanına red mesajı yazılır. | | `JobDocuments` | `attachment` gönderildiyse belge `DocumentType = Other` ile kaydedilir. | | Platform | Red aksiyonu ve red nedeni platform servisine iletilir. | | Diğer işler | Aynı teklifteki diğer işler yeniden aktif edilir. | | E-posta | Acente iletişimi kapalı değilse red bildirimi gönderilir. | --- ### Hatalı Yanıt (400 Bad Request) Hatalar `ApiResponse` sarmalayıcısıyla döner: | Alan | Tür | Açıklama | | --- | --- | --- | | `Status` | boolean | Hata durumunda her zaman `false`. | | `Code` | string | Hata kodu. Alan ve red nedeni doğrulamalarında `Validation.General`, state geçişi hatalarında `OfflinePolicies.StateTransitionFailed`. | | `Message` | string | Hata açıklaması. | | `Response` | array \| null | Doğrulama hatalarında `{ Field, Message }` listesi; diğer hatalarda `null`. | **Alan doğrulama hatası:** ```json { "Status": false, "Code": "Validation.General", "Message": "One or more validation errors occurred", "Response": [ { "Field": "Message", "Message": "Message is required." }, { "Field": "RejectReasonId", "Message": "RejectReasonId must be greater than zero." } ] } ``` **Red nedeni doğrulama hataları** — `Response[].Field` alanında dönen kodlar: | `Field` | Ne zaman oluşur | | --- | --- | | `JobRejectReason.RejectReasonNotFound` | Gönderilen `rejectReasonId` sistemde kayıtlı değil. | | `JobRejectReason.InvalidRejectReasonCategory` | Red nedeni `Policy` kategorisine ait değil. | | `JobRejectReason.RejectReasonNotAllowedForInsuranceCompany` | Red nedeni, işin bağlı olduğu sigorta şirketine kapalı. | ```json { "Status": false, "Code": "Validation.General", "Message": "One or more validation errors occurred", "Response": [ { "Field": "JobRejectReason.InvalidRejectReasonCategory", "Message": "The reject reason must be in the Policy category." } ] } ``` **State geçişi hatası** — iş `PolicyRequested` aşamasında değilse ya da red bilgisi platforma iletilemezse: ```json { "Status": false, "Code": "OfflinePolicies.StateTransitionFailed", "Message": "Policy rejection failed: Aksiyon bilgileri platforma iletilemedi! Hata Mesajı: Servis yanıt vermedi.", "Response": null } ``` > ⚠️ Red bilgisi platforma iletilemediğinde aksiyon geri alınır ve iş `PolicyRequested` aşamasına döndürülür; istek yeniden denenebilir. --- ### 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) | `Code` | Ne zaman oluşur | | --- | --- | | `OfflineUsers.InsuranceCompanyNotFound` | Token'da geçerli bir sigorta şirketi ataması yok. | | `OfflineUsers.UserIdentityNotResolved` | Token'dan kullanıcı kimliği çözümlenemedi. | | `OfflineJobs.JobOwnershipDenied` | `InsuranceCompanyAPIUser` rolündeki kullanıcı, kendisine ait olmayan bir işi reddetmeye çalıştı. | ```json { "Status": false, "Code": "OfflineJobs.JobOwnershipDenied", "Message": "You do not have permission to access this job.", "Response": null } ``` --- ### Hatalı Yanıt (404 Not Found) ```json { "Status": false, "Code": "OfflineJobs.JobNotFound", "Message": "No job found for the requested JobId: 999999.", "Response": null } ``` --- ### Hatalı Yanıt (500 Internal Server Error) State geçişi sırasında beklenmeyen bir hata oluştuğunda `JobState.TransitionError` döner. ```json { "Status": false, "Code": "JobState.TransitionError", "Message": "An unexpected error occurred during job state transition.", "Response": null } ```

Authentication

AuthorizationBearer

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

Path parameters

jobIdintegerRequired

Poliçe talebi reddedilecek işin benzersiz kimliği.

Headers

AuthorizationstringOptional

Request

This endpoint expects an object.

Response

No Content

Errors

400
Bad Request Error
403
Forbidden Error
404
Not Found Error