Offer Batch Premium

## Toplu Teklif Primi Ver ### Endpoint Bilgileri | Alan | Değer | | --- | --- | | **Method** | `POST` | | **URL** | `{{baseUrl}}/api/Offline/jobs/{jobId}/Premiums/batch` | | **Content-Type** | `application/json` | | **Yetkilendirme** | Bearer Token + `Create` politikası | --- Acentenin açtığı toplu prim isteğine karşılık, sigorta şirketinin **toplu teklif primlerini** iletmesi için kullanılır. Başarılı istekte iş `Toplu Prim Verildi` (`BatchPremiumOffered`) aşamasına geçer, primler platform servisine yazılır, aksiyon kaydı oluşturulup platforma iletilir ve teklif PDF'leri asenkron olarak kaydedilir. > İşin aşaması `Toplu Prim İsteği` (`BatchPremiumRequested`) olmalıdır; aksi halde geçiş reddedilir. --- ### Route Parametreleri | Parametre | Tip | Zorunlu | Açıklama | | --- | --- | --- | --- | | `jobId` | `integer` | Evet | Teklif primlerinin kaydedileceği işin Id bilgisi | --- ### Kimlik Doğrulama Geçerli bir bearer token gerektirir. Token şunları içermelidir: - Tanınan bir rol (`InsuranceCompanyAPIUser`, `InsuranceCompanyAPIAdmin` veya `Supervizor`) - İlgili route için `Create` yetkisi - Geçerli bir sigorta şirketi ataması - Çözümlenebilir bir kullanıcı kimliği > `InsuranceCompanyAPIUser` yalnızca kendi sahibi olduğu işleri işleyebilir. `InsuranceCompanyAPIAdmin` ve `Supervizor` şirketin tüm işlerine erişebilir. --- ### İstek Modeli — `CreateBatchPremiumRequest` | Alan | Tip | Zorunlu | Açıklama | Doğrulama | | --- | --- | --- | --- | --- | | `ProductId` | `integer` | Evet | Teklifin verildiği ürün Id | Zorunlu: `"Product ID is required."` <br>0'dan büyük olmalı: `"Product ID must be greater than 0."` | | `Message` | `string` | Hayır | Teklife iliştirilen not | Maks. 500 karakter: `"Message cannot exceed 500 characters."` | | `Premiums` | `BatchPremiumEntryRequest[]` | Evet | Toplu prim girişleri | Zorunlu: `"Premium list is required."` <br>Boş olamaz: `"Premium list cannot be empty."` | | `OfferPdfs` | `PremiumFileRequest[]` | Evet | Teklif PDF'leri | Zorunlu: `"Offer PDF files are required."` <br>Boş olamaz: `"At least one offer PDF file is required."` | > `JobId` gövdeden alınmaz (`[JsonIgnore]`); route parametresinden set edilir. Bu uçta `JobId` için ayrı bir doğrulama kuralı tanımlı değildir; route kısıtı (`{jobId:int}`) yeterlidir. > > Teklif PDF'i zorunluluğu hem doğrulama katmanında hem de state transition içinde kontrol edilir; doğrulama önce çalıştığı için eksik PDF `400` döner. #### Prim Girişi — `BatchPremiumEntryRequest` | Alan | Tip | Zorunlu | Açıklama | Doğrulama | | --- | --- | --- | --- | --- | | `InsuranceCompanyProposalNumber` | `string` | Hayır | Sigorta şirketi teklif numarası | — | | `InsuranceCompanyPolicyNumber` | `string` | Hayır | Sigorta şirketi poliçe numarası | — | | `InsuranceCompanyEndorsementNumber` | `string` | Hayır | Sigorta şirketi zeyil numarası | — | | `RenewalNumber` | `integer` | Evet | Yenileme numarası | 0'dan büyük veya eşit olmalı: `"Renewal number must be greater than or equal to 0."` | | `GrossPremium` | `decimal` | Evet | Brüt prim | 0'dan büyük olmalı: `"Gross premium must be greater than 0."` | | `NetPremium` | `decimal` | Evet | Net prim | 0'dan büyük olmalı: `"Net premium must be greater than 0."` | | `Commision` | `decimal` | Evet | Komisyon (alan adı tek `s` ile yazılır) | 0'dan büyük veya eşit olmalı: `"Commission must be greater than or equal to 0."` | | `PaymentOptionType` | `integer` | Evet | Ödeme tipi | Tanımlı bir değer olmalı: `"A valid payment option type is required."` | | `CurrencyType` | `integer` | Evet | Para birimi | Tanımlı bir değer olmalı: `"A valid currency type is required."` | #### Ödeme Tipi Değerleri | Değer | Ödeme Tipi | | --- | --- | | `1` | Hesaptan | | `2` | Kredi Kartı | | `3` | Tümü | #### Para Birimi Değerleri | Değer | Para Birimi | | --- | --- | | `1` | TL | | `2` | Dolar | | `3` | Euro | | `4` | İngiliz Sterlini | | `5` | Japon Yeni | | `6` | İsviçre Frangı | | `7` | İsveç Kronu | #### Teklif PDF'i — `PremiumFileRequest` | Alan | Tip | Zorunlu | Açıklama | Doğrulama | | --- | --- | --- | --- | --- | | `FileName` | `string` | Evet | Dosya adı | Boş olamaz: `"FileName must not be empty."` <br>`.pdf` ile bitmeli: `"Only PDF files are allowed."` | | `Base64Content` | `string` | Evet | Base64 kodlu dosya içeriği | Boş olamaz: `"Base64Content must not be empty."` <br>Geçerli base64 olmalı: `"Base64Content must be a valid base64 encoded string."` <br>İçerik geçerli bir PDF olmalı: `"File content is not a valid PDF."` | | `ContentType` | `string` | Hayır | MIME türü | Doğrulanmaz; kayıt sırasında `application/pdf` olarak set edilir | --- ### İş Kuralları State geçişi sırasında sırasıyla aşağıdaki kontroller yapılır: 1. İş `Toplu Prim İsteği` aşamasında olmalıdır. 2. İşe ait teklif (`Proposal`) kaydı bulunmalıdır. 3. Teklif + ürün için `OperationWatch` kaydı bulunmalıdır. 4. Primler platform servisine yazılabilmelidir. 5. Aksiyonu karşılayacak platform kullanıcısı bulunmalı ve aksiyon platforma iletilebilmelidir. > **Geri alma davranışı:** 4. kural başarısız olursa `OperationWatch` başarısız işaretlenir ve iş `Toplu Prim İsteği` aşamasına geri döndürülür. 5. kural başarısız olursa oluşturulan aksiyon kaydı silinir. --- ### Yanıt #### `201 Created` — Başarılı Yanıt Gövde boştur. --- ### Hata Senaryoları #### `400 Bad Request` — Doğrulama Hatası İstek modeli doğrulamadan geçemediğinde döner. Hatalı alanlar `Response` içinde listelenir. ``` json { "Status": false, "Code": "Validation.General", "Message": "One or more validation errors occurred", "Response": [ { "Field": "ProductId", "Message": "Product ID is required." }, { "Field": "OfferPdfs", "Message": "Offer PDF files are required." } ] } ``` --- #### `403 Forbidden` — Geçerli Sigorta Şirketi Ataması Bulunamadı Token'da geçerli bir sigorta şirketi ataması bulunmadığında döner. ``` json { "Status": false, "Code": "OfflineUsers.InsuranceCompanyNotFound", "Message": "No valid insurance company assignment found in token.", "Response": null } ``` --- #### `403 Forbidden` — Kullanıcı Kimliği Çözümlenemedi Token'dan kullanıcı kimliği okunamadığında döner. ``` json { "Status": false, "Code": "OfflineUsers.UserIdentityNotResolved", "Message": "User identity could not be resolved from token.", "Response": null } ``` --- #### `403 Forbidden` — İşe Erişim Reddedildi İş, çağıranın sahipliğinde değilse döner. ``` json { "Status": false, "Code": "OfflineJobs.JobOwnershipDenied", "Message": "You do not have permission to access this job.", "Response": null } ``` --- #### `403 Forbidden` — Rol veya Yetki Yetersiz Kullanıcı tanınan rollerden birine sahip değilse ya da `Create` yetkisi yoksa döner. **Gövde boştur.** --- #### `401 Unauthorized` — Token Yok veya Geçersiz Token gönderilmediğinde, geçersiz olduğunda veya süresi dolduğunda döner. **Gövde boştur.** --- #### `404 Not Found` — İş Bulunamadı Belirtilen `jobId` ile bir iş bulunamadığında döner. ``` json { "Status": false, "Code": "OfflineJobs.JobNotFound", "Message": "No job found for the requested JobId: 100931.", "Response": null } ``` --- #### `404 Not Found` — Teklif Kaydı Bulunamadı İşe ait teklif kaydı bulunamadığında döner. ``` json { "Status": false, "Code": "JobState.ProposalNotFound", "Message": "Proposal record not found for job 100931.", "Response": null } ``` --- #### `404 Not Found` — Operation Watch Kaydı Bulunamadı Teklif + ürün için operasyon kaydı bulunamadığında döner. ``` json { "Status": false, "Code": "JobState.OperationWatchNotFound", "Message": "Operation Watch record not found for job 100931.", "Response": null } ``` --- #### `500 Internal Server Error` — Platform Servisi Hatası Prim bilgileri platform servisine yazılamadığında döner. ``` json { "Status": false, "Code": "JobState.PlatformServiceFailure", "Message": "Failed to write premium information to the platform service. Platform returned: Prim bilgileri platform servisine yazdırılamadı! Servisten dönen hata: Timeout", "Response": null } ``` --- #### `500 Internal Server Error` — İş Kuralı İhlali İş uygun aşamada değilse, aksiyonu karşılayacak kullanıcı bulunamazsa veya aksiyon platforma iletilemezse döner. ``` json { "Status": false, "Code": "JobState.UnknownBusinessRule", "Message": "An unknown business rule error occurred: 'Toplu Prim Verildi' aşamasından 'Toplu Prim Verildi' aşamasına geçiş yapılamaz.", "Response": null } ``` --- #### `500 Internal Server Error` — Beklenmeyen Hata Geçiş sırasında iş kuralı dışında bir hata oluştuğunda 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

Request

This endpoint expects an object.

Response

Created

Errors

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