Create Premium
# Prim Teklifi 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ı |
---
## Enum Değerleri
### PaymentType (Ödeme Türü)
| Değer | Ad | Açıklama |
| --- | --- | --- |
| `1` | Hesaptan | Hesaptan ödeme |
| `2` | KrediKarti | Kredi kartı ile ödeme |
| `3` | Tumu | Tüm ödeme türleri |
### CurrencyType (Para Birimi)
| Değer | Ad | Görünen Ad |
| --- | --- | --- |
| `1` | Tl | TL |
| `2` | Usd | Dolar |
| `3` | Eur | Euro |
| `4` | Gbp | İngiliz Sterlini |
| `5` | Jpy | Japon Yeni |
| `6` | Chf | İsviçre Frangı |
| `7` | Sek | İsveç Kronu |
---
## İ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 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 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."` |
| `Commision` | `decimal` | Evet | Komisyon tutarı | Zorunlu: `"Commision is required."` <br>0'dan büyük veya eşit olmalı: `"Commision must be greater than or equal to 0."` |
| `CommisionTL` | `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."` |
| `Commision` | `decimal` | Evet | Bu taksitin komisyon tutarı | Zorunlu: `"Commision is required."` <br>0'dan büyük veya eşit olmalı: `"Commision 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."` |
| `ContentType` | `string` | Evet\* | MIME türü | Boş olamaz: `"ContentType must not be empty."` |
| `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."` |
---
## 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 |
| `OfflineJobs.InsuranceCompanyNotFound` | 403 | No valid insurance company assignment found in token. |
| `OfflineJobs.UserNotFound` | 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. |
---
