Public API v1 sözleşmesi Gönderiler PA-05
Gönderi iptali
POST/api/v1/shipments/{id}/cancel
Amaç
Toplama öncesi iptal. Kayıt SİLİNMEZ: taşıyıcıda iptal edilir, Sevkora'da durum CANCELLED olur ve sistem olayı yazılır (tek transaction). SPA iptal ucuyla aynı kurallar.
Yetki
Bearer anahtar; policy cancel yeteneği (salt-okuma view'dan AYRI; RISK-008/TASK-050, SPA iptal ile aynı policy noktası); başka tenant'ın kaydı 404 (IDOR).
Kurallar
yalnız DRAFT | CREATED | PREPARING | READY_TO_SHIP durumları iptal edilebilir (sonrası RECALL işidir, 09-integrations); 36 saat benzeri süre kuralı YOKTUR. Hesabın taşıyıcısı cancelShipment desteklemeli (bugün yalnız hepsijet; tex'te iptal pazaryeri akışıdır, 422, taşıyıcıya istek atılmaz, credential'lı adaptör hiç kurulmaz). DRAFT YÜRÜRLÜKTEDİR (TASK-247/DEC-186-3): taşıyıcı çağrısı ATLANIR, taşıyıcıda kayıt yoktur, dolayısıyla capability şartı ve hesap bağı ARANMAZ (bağsız taslak "hesabın taşıyıcı hesabı yok" 422'sini ALMAZ); durum CANCELLED + system olayı yazılır, ücret iadesi doğal no-op'tur. Kararı taşıyıcıya inip inmeyeceği yönünden veren şey servisin KİLİT-ALTI taze okumasıdır: yarışan bir confirm taslağı CREATED'a çevirmişse taşıyıcı fazı aynen koşar. SPA iptal ucu aynı kuralı BİREBİR taşır. PA-04 ölçü güncellemesinin durum kümesi bundan AYRIDIR ve DRAFT'ı kapsamaz (06-architecture "Durum kümelerinin ayrımı").
Başarı 200
detay gövdesi; status = CANCELLED, olay akışında CANCELLED (source=system) satırı. İptal başarılıysa AYAKTA duran etiket ücreti aynı transaction'da İADE edilir (TASK-047; DEC-043 append-only Refund); ücretlenmemiş ya da zaten settle edilmiş (reversal/iade) gönderide no-op, idempotent (10-security "Para hareketi"). Kendi-hesap (billing_mode=carrier_direct) gönderisinde iade YOKTUR ve bu YAPISAL bir no-op'tur: geri alınacak bir kesim hiç olmadığı için iade yolu ikinci bir bayrakla kapatılmaz, dokunacağı satır yoktur (DEC-363). Defter sayımı iptalden ÖNCE ve SONRA aynıdır; bu "sıfır tutarlı iade" DEĞİLDİR.
Hatalar
401, 404, 409 {message} (aynı gönderinin iptali ZATEN yürütülüyor; eşzamanlı ikinci istek sabit mesajla reddedilir, taşıyıcıya çift cancelShipment gitmez; TASK-053/DEC-049), 422 {message} (durum uygun değil / capability yok / taşıyıcı reddi; hata durumunda Sevkora kaydı DEĞİŞMEZ), 429, 502 (taşıyıcıya ulaşılamıyor; kayıt değişmedi). Tekrarlanan iptal çağrısı ikinci kez 422 döner (durum artık CANCELLED). Taslak için bir onay (PA-19) yürürken gelen iptal de 409 {message} alır (TASK-562/DEC-554): onay talebi tazeyken taslak iptal edilmez; taslak, bakiye ve kayıt DEĞİŞMEZ ve taşıyıcıya istek atılmaz. İstemci onay sonuçlanınca taze durumu okuyup yeniden dener: onay gönderiyi oluşturduysa iptal taşıyıcıya iner, onay hatayla bittiyse taslak iptali çalışır. Taslak iptali tek işlemdir, bu yüzden taslakta eşzamanlı ikinci iptal 422 alır (durum artık CANCELLED); iptal yürüyor 409'u taşıyıcıya inen, taslak dışı durumlar içindir.
Eşzamanlılık + telafi (TASK-053; RISK-010, DEC-049)
SPA iptal ucuyla aynı çekirdek. İptal niyeti kısa kilitli transaction'da tek istek tarafından kazanılır; claim TTL'i varsayılan 600 sn'dir ve yapılandırılabilir; TTL'i aşan yarım-kalan claim yeniden kazanılır. Taşıyıcı iptali onayladıktan sonra yerel yazım düşerse (500) isteğin TEKRARI taşıyıcıya inmeden yerel kesinleştirmeyi tamamlar (idempotent tamamlanma; taşıyıcı çağrısı DB transaction'ı DIŞINDA kalır, DEC-044).
curl -X POST "{{base_url}}/shipments/01K1GNDR000000000000000001/cancel" \
-H "Accept: application/json" \
-H "Authorization: Bearer SEVKORA_API_ANAHTARINIZ"
ONAY YÜRÜRKEN TASLAK İPTALİ: 409, taslak değişmez (TASK-562; DEC-554).
Taslağın onayı (PA-19) yürürken gelen iptal 409 döner ve taslak değişmez: *"Bu gönderi için onay isteği yürütülüyor; taslak bu sırada iptal edilemez. Onay sonuçlanınca taze durumu okuyup yeniden dene."* SPA iptal ucu ve iş ortağı iptali (PA-42) aynı kuralı ve aynı metni taşır.
DAVRANIŞ DEĞİŞİKLİĞİ, adıyla
bu durumda iptal daha önce 200 ile taslağı iptal ediyordu. Yürüyen onay siparişi taşıyıcıda o anda kurmuş olabileceği için bu sonuç taşıyıcıda Sevkora kaydı olmayan bir sipariş bırakabiliyordu. 409'u yeniden denenebilir sayan bir istemcinin değişiklik yapması gerekmez. Aynı taslağa eşzamanlı iki iptal gelirse ikincisi artık 409 değil 422 alır, çünkü taslak iptali tek işlemdir ve ilk iptal tamamlanmıştır.
ETİKETİ ALINMIŞ GÖNDERİ: 422, taşıyıcıya ÇIKILMAZ (TASK-480; RISK-119, DEC-463/DEC-464).
Bir gönderinin etiketi bir kez alındıysa uç taşıyıcıya hiç istek yazmaz ve 422 döner: *"Bu gönderinin etiketi zaten alındı. Taşıyıcı aynı etiketi yeniden üretmez; ilk aldığınız belgeyi kullanın. Kayıt değiştirilmedi."*
DAVRANIŞ DEĞİŞİKLİĞİ, adıyla
bu durum daha önce 502 + carrier_unavailable dönüyordu ve kullanıcıya *"birazdan yeniden dene"* diyordu. Ret KALICIDIR, dolayısıyla o öğüt yanlıştı ve her yeniden deneme taşıyıcıya gereksiz bir iş çağrısı yazıyordu. İş ortağı tarafında etkisi şudur ve İSTENEN sonuç budur: 502'yi yeniden denenebilir sayan bir istemci artık 422 görür ve durumu kalıcı kabul eder.
KARAR TAŞIYICIDAN DEĞİL KENDİ KAYDIMIZDAN verilir
Sevkora'nın kendi kaydında tutulan taşıyıcı gönderi kimliği yalnızca etiket anında öğrenilir, yani dolu olması etiketin çizildiğinin kanıtıdır. Bu kimlik yanıt zarflarında YAYIMLANMAZ: kararı uç sizin yerinize verir ve istemcinin okuması gereken ayrı bir işaret tanımlanmamıştır. Taşıyıcının kendi cevabı bu ayrımı VEREMEZ, ve bu ölçüldü: mükerrer çağrı 200 ile boş barkod döner, hata kodu dönmez.
KAPI TAŞIYICIYA ÖZEL DEĞİLDİR ve diğerlerini KISITLAMAZ
kimliği yalnızca onu bildiren adaptör yazar. Hepsijet ve Yurtiçi böyle bir kimlik döndürmez, dolayısıyla onların etiketleri ESKİSİ GİBİ yeniden alınabilir.
Bu uç etiketi YENİDEN DÖNDÜRMEZ (DEC-521 (c)): etiketi alınmış gönderide ikinci istek bu 422 ile biter ve belgeyi taşımaz; ilk aldığınız belgeyi saklamak sizin sorumluluğunuzdadır. Belgeyi bir daha vermeyen taşıyıcıda Sevkora etiketi ilk alışta kendi paneli için şifreli olarak saklar ve gönderi teslim edildiğinde, iptal ya da iade edildiğinde veya alıcı verisi anonimleştirildiğinde siler (DEC-521 (b)). Gönderi açık kalsa bile saklanan belgenin ömrü etiketin alındığı andan itibaren 30 gündür: bu süre dolunca belge panelden de indirilemez ve günlük temizlikte silinir (DEC-537). Bu saklama bu ucun davranışını DEĞİŞTİRMEZ.