Create Premium

# Prim Teklifi Oluşturma API Dokümantasyonu Bu dokümantasyon, offline iş akışı kapsamında prim teklifi oluşturma endpoint'inin teknik kullanım kılavuzudur. Endpoint aracılığıyla sigorta şirketi API kullanıcıları; prim bilgilerini çeşitli ödeme seçenekleriyle (peşin veya taksitli) iletebilir, teklif ve bilgilendirme belgelerini PDF olarak ekleyebilir. --- ## Endpoint Bilgisi | Özellik | Değer | | --- | --- | | **HTTP Metodu** | `POST` | | **URL** | `/api/offline/jobs/{jobId}/premiums` | | **Content-Type** | `application/json` | | **Yetkilendirme** | `Authorization: Bearer {token}` | ### Yetkilendirme Rolleri Çağıranın aşağıdaki rollerden birine sahip olması gerekir: | Rol | Erişim Kapsamı | | --- | --- | | `InsuranceCompanyAPIUser` | Sadece kendi işlerine erişebilir | | `InsuranceCompanyAPIAdmin` | Şirketin tüm işlerine erişebilir | | `Supervizor` | Şirketin tüm işlerine erişebilir | ### Route Parametreleri | Parametre | Tip | Zorunlu | Açıklama | | --- | --- | --- | --- | | `jobId` | `integer` | Evet | İşin benzersiz tanımlayıcısı | --- --- ## İstek Modeli ### Ana İstek — `CreateOfferPremiumRequest` | Alan | Tip | Zorunlu | Açıklama | Doğrulama Kuralları | | --- | --- | --- | --- | --- | | `InsuranceCompanyProposalNumber` | `string` | Evet | Sigorta şirketinin teklif numarası | Boş olamaz: `"Insurance company proposal number is required."` | | `RenewalNumber` | `integer` | Evet | Yenileme numarası | Zorunlu: `"Renewal number is required."` <br>0'dan büyük veya eşit olmalı: `"Renewal number must be greater than or equal to 0."` | | `ProductId` | `integer` | Evet | Ürün tanımlayıcısı | Zorunlu: `"Product ID is required."` | | `Message` | `string` | Hayır | İsteğe bağlı mesaj | Maks. 500 karakter: `"Message cannot exceed 500 characters."` | | `OfferPdf` | `PremiumFileRequest` | Hayır | Teklif PDF dosyası | Sağlanırsa `PremiumFileRequest` doğrulamaları uygulanır | | `InformationPdf` | `PremiumFileRequest` | Hayır | Bilgi PDF dosyası | Sağlanırsa `PremiumFileRequest` doğrulamaları uygulanır | | `Premiums` | `PremiumEntryRequest[]` | Evet | Prim girişleri listesi | Zorunlu: `"Premium list is required."` <br>Boş olamaz: `"Premium list cannot be empty."` <br>Tekrarsız olmalı: `"Duplicate premium entries are not allowed for the same installment, payment type, and installment option."` | > **Benzersizlik Kuralı:** Aynı `IsInstallmentsEqual` + `PaymentOptionType` + `InstallmentNumber` kombinasyonuna sahip birden fazla prim girişi gönderilemez. ### Prim Girişi — `PremiumEntryRequest` | Alan | Tip | Zorunlu | Açıklama | Doğrulama Kuralları | | --- | --- | --- | --- | --- | | `PaymentOptionType` | `integer` | Evet | Ödeme seçeneği türü | Zorunlu: `"PaymentOptionType is required."` <br>Geçerli enum değeri ([bknz.](https://docs.insurgateway.com/offline-constants#payment-type)) olmalı: `"PaymentOptionType must be a valid payment type."` | | `CurrencyType` | `integer` | Evet | Para birimi türü | Zorunlu: `"CurrencyType is required."` <br>Geçerli enum değeri ([bknz.](https://docs.insurgateway.com/offline-constants#currency-type)) olmalı: `"CurrencyType must be a valid currency type."` | | `IsInstallmentsEqual` | `boolean` | Evet | Taksitler eşit tutarlı mı? | — | | `FirstInstallmentRate` | `integer` | Hayır | İlk taksit oranı (%) | 1–100 arasında olmalı _(sağlanırsa)_: `"FirstInstallmentRate must be between 1 and 100."` | | `InstallmentNumber` | `integer` | Evet | Taksit sayısı | Zorunlu: `"InstallmentNumber is required."` <br>0'dan büyük olmalı: `"InstallmentNumber must be greater than 0."` | | `GrossPremium` | `decimal` | Evet | Brüt prim tutarı | Zorunlu: `"GrossPremium is required."` <br>0'dan büyük olmalı: `"GrossPremium must be greater than 0."` | | `GrossPremiumTL` | `decimal` | Hayır | Brüt prim TL karşılığı | — | | `NetPremium` | `decimal` | Evet | Net prim tutarı | Zorunlu: `"NetPremium is required."` <br>0'dan büyük olmalı: `"NetPremium must be greater than 0."` | | `Commission` | `decimal` | Evet | Komisyon tutarı | Zorunlu: `"Commission is required."` <br>0'dan büyük veya eşit olmalı: `"Commission must be greater than or equal to 0."` | | `CommissionTL` | `decimal` | Hayır | Komisyon TL karşılığı | — | | `ExchangeRate` | `decimal` | Hayır | Döviz kuru | — | | `InstallmentExplanation` | `string` | Hayır | Taksit açıklama metni | — | | `PremiumInstallmentDetails` | `PremiumInstallmentDetailRequest[]` | Koşullu | Taksit detayları (`InstallmentNumber > 1` olduğunda zorunlu) | Zorunlu: `"Premium installment details are required when InstallmentNumber is greater than 1."` <br>Boş olamaz: `"Premium installment details cannot be empty when InstallmentNumber is greater than 1."` | ### Taksit Detayı — `PremiumInstallmentDetailRequest` | Alan | Tip | Zorunlu | Açıklama | Doğrulama Kuralları | | --- | --- | --- | --- | --- | | `InstallmentNumber` | `integer` | Evet | Toplam taksit sayısı | Zorunlu: `"InstallmentNumber is required"` <br>0'dan büyük olmalı: `"InstallmentNumber must be greater than 0."` | | `InstallmentNo` | `integer` | Evet | Taksit sıra numarası | Zorunlu: `"InstallmentNo is required"` <br>0'dan büyük olmalı: `"InstallmentNo must be greater than 0."` | | `PaymentAmount` | `decimal` | Evet | Bu taksitin ödeme tutarı | Zorunlu: `"PaymentAmount is required"` <br>0'dan büyük olmalı: `"PaymentAmount must be greater than 0."` | | `Commission` | `decimal` | Evet | Bu taksitin komisyon tutarı | Zorunlu: `"Commission is required."` <br>0'dan büyük veya eşit olmalı: `"Commission must be greater than or equal to 0."` | | `PaymentDate` | `datetime` | Evet | Ödeme tarihi | Zorunlu: `"PaymentDate is required"` <br>Boş olamaz: `"PaymentDate must not be empty."` | ### PDF Dosyası — `PremiumFileRequest` > Aşağıdaki alanlar yalnızca `OfferPdf` veya `InformationPdf` nesnesi gönderildiğinde zorunludur. | Alan | Tip | Zorunlu | Açıklama | Doğrulama Kuralları | | --- | --- | --- | --- | --- | | `FileName` | `string` | Evet\* | Dosya adı | Boş olamaz: `"FileName must not be empty."` <br>`.pdf` uzantısı olmalı: `"Only PDF files are allowed."` | | `ContentType` | `string` | Evet\* | MIME türü | Boş olamaz: `"ContentType must not be empty."` <br>`application/pdf` olmalı: `"ContentType must be 'application/pdf'."` | | `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."` | --- ## Yanıt Formatı ### Başarılı Yanıt **HTTP Durumu:** `201 Created` Yanıt gövdesi boştur. ### Hata Yanıtı ``` json { "Status": false, "Code": "Error.Code", "Message": "Error description", "Response": null } ``` Doğrulama hatalarında `Response` alanı detayları içerir: ``` json { "Status": false, "Code": "Validation.General", "Message": "One or more validation errors occurred", "Response": [ { "Field": "FieldName", "Message": "Error message description" } ] } ``` --- ## HTTP Durum Kodları | Durum | Açıklama | | --- | --- | | `201 Created` | Prim teklifi başarıyla oluşturuldu | | `400 Bad Request` | Doğrulama hatası veya prim zaten mevcut | | `401 Unauthorized` | Eksik, geçersiz veya süresi dolmuş token | | `403 Forbidden` | Yetersiz yetki veya iş sahipliği reddedildi | | `404 Not Found` | İş, teklif veya operation watch bulunamadı | | `500 Internal Server Error` | Platform servisi hatası veya beklenmeyen hata | --- ## Hata Kodları Referansı | Kod | HTTP Durumu | Mesaj | | --- | --- | --- | | `Validation.General` | 400 | One or more validation errors occurred | | `OfflineUsers.InsuranceCompanyNotFound` | 403 | No valid insurance company assignment found in token. | | `OfflineUsers.UserIdentityNotResolved` | 403 | User identity could not be resolved from token. | | `OfflineJobs.JobNotFound` | 404 | No job found for the requested JobId. | | `OfflineJobs.JobOwnershipDenied` | 403 | You do not have permission to access this job. | | `JobState.ProposalNotFound` | 404 | Proposal record not found for job {jobId}. | | `JobState.OperationWatchNotFound` | 404 | Operation Watch record not found for job {jobId}. | | `JobState.PremiumAlreadyExists` | 400 | Premium information already exists for job {jobId}. | | `JobState.PlatformServiceFailure` | 500 | Failed to write premium information to the platform service. Platform returned: {msg} | | `JobState.TransitionError` | 500 | An unexpected error occurred during job state transition. | ---