Public API v1 sözleşmesi Gönderiler PA-18
Fiyat teklifleri
GET/api/v1/shipments/{id}/quotes
Amaç
DRAFT gönderi için Sevkora'nın sözleşmeli taşıyıcılarından fiyat teklifi kümesi (Kargonomi GET /shipment-price-comparison/{id} eşleniği; Q-029'un v1 kapsamı, DEC-181(f)). Yan etkisizdir (CQS): hiçbir şey kalıcılaşmaz, ücret kesilmez, taşıyıcıya HTTP çağrısı çıkmaz; fiyat Sevkora SATIŞ tarifesinden hesaplanır; taşıyıcı maliyeti/sözleşme verisi yanıta girmez.
Yetki
Bearer anahtar; policy view yeteneği. PA-05 cancel / PA-06 label gibi AYRI bir yetenek İSTENMEZ ve bu bilinçlidir: RISK-008 ayrımı PARA KESEN uçlara dairdi, teklif ucu ise cüzdana dokunmaz. Başka tenant'ın kaydı 404 (IDOR).
Ön koşul
gönderi DRAFT (değilse 422 {message}; teklif penceresi yalnız onay öncesidir).
Başarı 200
{"data": [{"carrier_code", "carrier_name", "account_model", "price_minor", "currency", "policy_version", "vat_rate_percent", "price_incl_vat_minor", "billing_mode" [, "carrier_account_id"]}, ...], "meta": {"cheapest_carrier_code"}}. KDV DAHİL TOPLAM (TASK-442; REQ-025, DEC-406): bayi satırı vat_rate_percent (yüzde, tam sayı) ve price_incl_vat_minor (tam sayı kuruş) taşır; ikisi de SUNUCUDA türetilir, istemci çarpma yapmaz. Oran Sevkora yapılandırmasından gelir (varsayılan yüzde 20, Türkiye genel KDV oranı) ve toplam tam sayı aritmetiğiyle half-up yuvarlanır. Bunlar GÖSTERİM değerleridir: tarife içi bilgi değil, price_minorın kamusal oranla vergili karşılığıdır; TASK-245'in "yanıt yalnız satış fiyatı taşır" sınırı genişlemez. Kendi-hesap satırında fiyat olmadığı için ikisi de null'dır. `fee_minor` HÂLÂ NET'tir ve anlamı DEĞİŞMEDİ (TASK-448; REQ-026, DEC-405 (b)): değişen şey CÜZDANDAN DÜŞEN tutardır ve onu PA-19/PA-40 meta.charge.total_minor söyler. Zarf ADİTİF büyüdü: eski tüketiciler fee_minorı okumaya devam eder, kesilen tutarı öğrenmek isteyen total_minorı okur ve kendi çarpmasını YAPMAZ (mekanizma çapaları PA-06 charge zarfında ve 06-architecture "KDV'nin İKİ tüketicisi" paragrafındadır). Her aday bir (carrier_code, account_model) ÇİFTİDİR (TASK-411; DEC-365): aynı taşıyıcı iki modelde de varsa iki AYRI satır döner. account_model dealer (Sevkora'nın sözleşmesi) ya da own_account (tenant'ın kendi doğrulanmış taşıyıcı hesabı - REQ-023); billing_mode prepaid ya da carrier_direct. Bayi satırı: price_minor tam sayı kuruştur (DEC-037) ve tenant'ın ÖDEYECEĞİ satış fiyatıdır, currency/policy_version dolu, billing_mode=prepaid, carrier_account_id anahtarı YOKTUR (DEC-185: sistem satırının kimliği tenant'a çıkmaz). Kendi-hesap satırı: price_minor, currency ve policy_version null (DEC-363: teklif Sevkora fiyatı taşımaz, bakiye düşülmez, ücret tenant'ın taşıyıcı cari hesabınadır), billing_mode=carrier_direct, carrier_account_id tenant'ın KENDİ satırının kimliğidir (satır tenant'ındır, yayılır). carrier_name kamuya açık marka adıdır (DEC-191; sistem hesabının adı DEĞİLDİR ve o ad hiçbir tenant yüzeyine çıkmaz). Sıra: fiyatlı adaylar fiyat artan, eşitlikte carrier_code alfabetik; kendi-hesap adayları listenin SONUNDA, kod alfabetik. cheapest_carrier_code yalnız fiyatlı adaylardan türer ve PA-19 auto seçiminin o an SEÇECEĞİ koddur (confirm yine de taze hesaplar; teklif GÖSTERGEDİR, confirm snapshot'ı OTORİTEDİR); fiyatlı aday yoksa null döner ve auto o an seçilemez (PA-19 422 errors.carrier_code - TASK-412). Fiyatsız kendi-hesap adayı auto kümesine HİÇ girmez (DEC-365 (f)): girseydi "en ucuz" olarak her zaman kazanır ve fiyat karşılaştırması anlamını yitirirdi; kendi-hesap adayı yalnız AÇIK seçimle alınır.
Aday kümesi - iki model, iki kelepçe kümesi (DEC-190, DEC-365)
*bayi* adayları aktif sistem satırı olan, createShipment destekleyen VE tenant'a sunulabilir (presentable) taşıyıcılardır - üç kelepçenin kesişimi; sunum kelepçesi DEC-035/328'in fail-closed sunum bayrağıdır ve PA-18 onun ilk tüketicisidir: canlı doğrulaması bitmemiş bir taşıyıcı (bugün yurtici, TASK-241) bayi adayı olarak teklif VERMEZ; fiyatlanamayan bayi adayı kümeden düşer. *Kendi-hesap* adayları tenant'ın status=active VE verification_status=verified satırları ∩ kendi-hesap modeline açık taşıyıcılar (kendi-hesap izin listesi, bugün yalnız mng) ∩ createShipment yeteneğidir; sunum bayrağı bu kümeye UYGULANMAZ (DEC-365 (c): bayrak Sevkora'nın anlaşmasını yönetir, kendi-hesap sunumu tenant'ın kendi doğrulanmış satırına bağlıdır). Doğrulanmamış (pending/failed), devre dışı ya da başka tenant'ın satırı aday DEĞİLDİR; aynı taşıyıcıda birden fazla doğrulanmış satır varsa aday tek satırdır (kod, sonra kimlik sırası) - confirm belirsizliği adıyla reddeder (TASK-412).
SPA ayrıştırıcı sözleşmesi (TASK-416 ile KAPANDI)
geçici ayrışma bitti; SPA artık kendi-hesap satırını da okur ve gösterir. Okuyucu iki yönde KELEPÇELİDİR: prepaid satırı fiyatsız gelemez, carrier_direct satırı fiyat TAŞIYAMAZ; ikisi de sözleşme ihlalidir ve satır DÜŞER. Gösterge YALNIZ fiyatlı adaylardan türer ve fiyatlı aday yoksa null olur; eski "sıranın başı" yedeği kaldırıldı çünkü kendi-hesap satırı listenin başına düştüğü an onu sessizce "en ucuz" yapardı. Aday kimliği ekranda da (carrier_code, account_model) ÇİFTİDİR ve confirm gövdesi ikisini birden taşır (DEC-379(a)); TASK-416 öncesi geçici ayrışmayı anlatan cümle bu satırla emekli oldu
Hatalar
401, 404, 422 {message} (durum DRAFT değil; gönderi fiyatlanamaz: desi yok, DEC-170 çare cümlesi PA-06'daki gibi ama çare OLUŞTURMADIR: taslakta PA-04 ölçü güncellemesi kapalıdır; aday yok ya da hiçbir aday fiyatlanamadı: fail-closed, boş liste DÖNMEZ), 429.
Boş liste yoktur (fail-closed)
aday kümesi boşalırsa uç 200 + [] değil 422 döner. Boş liste, istemcide "seçenek yok" ile "sistem yanlış yapılandırılmış"ı aynı görüntüye indirir ve tenant sessizce onaylanamayan bir taslakla kalırdı.
curl "{{base_url}}/shipments/01K1GNDR000000000000000001/quotes" \
-H "Accept: application/json" \
-H "Authorization: Bearer SEVKORA_API_ANAHTARINIZ"