Toplama ve Dönüş
Çarşı siparişinde ikame tercihi, toplama sonucu ve kapanışı, toplama kapısı, müşteri verisi ve teslim edilemeyen siparişin dönüşü.
Sipariş okuma, durum yazma, iptal ve ödeme iki dikeyde ortaktır ve Sipariş Yaşam Döngüsü sayfasındadır. Bu sayfadaki iki uç yalnız Çarşı işletmelerinde (vertical: store) vardır; restoran anahtarıyla çağrılırsa 404 not_available_for_vertical döner.
Her satır API referansındaki tam tanıma gider — alanlar, yanıt kodları ve deneme konsolu orada.
İkame tercihi (kalem başına)
Markette ürün her zaman rafta olmaz. Müşteri tercihini sipariş anında kalem kalem belirtir; sipariş kaleminde substitutionPreference olarak gelir:
| Alan | Tip | Açıklama |
|---|---|---|
ask | enum | Sor: benzerini bul ama müşteriden onay al. |
similar | enum | Benzerini ver. |
cancel | enum | İkame etme. |
Toplayıcının hangi işlemi yapabileceğini bu alan belirler; kendi ekranınızda da aynı kısıtı uygulayın. İkame daha pahalıysa fark müşteriden tahsil edilmez; daha ucuzsa fark iade edilir.
Toplama sonucunu yazma
curl -X POST "https://api.supergelsin.com/api/partner/v1/orders/cm_ornek_siparis/picking" \
-H "Authorization: Basic $(printf '%s:%s' "$API_KEY" "$API_SECRET" | base64)" \
-H "X-Integrator: Ornek POS" \
-H "X-Operator: kasiyer_01" \
-H "Content-Type: application/json" \
-d '{ "items": [
{ "clientReferenceId": "POS-1042", "status": "not_found" },
{ "clientReferenceId": "POS-1043", "status": "partial", "pickedQuantity": 2, "note": "Stokta 2 adet kaldı" },
{ "clientReferenceId": "POS-1044", "status": "substituted", "substituteClientReferenceId": "POS-2010", "customerApproved": true }
] }'{ "orderId": "cm_ornek_siparis", "applied": 3, "failed": 0, "completed": false,
"results": [ { "clientReferenceId": "POS-1042", "ok": true, "refundAmount": 42.5 } ],
"adjustmentTotal": 42.5 }Kalem sonuçları ve kapanış tek istekte yazılır. Kalemler sırayla işlenir; bir kalemin reddi öbürlerini etkilemez, her kalemin sonucu results[] içindedir. İade tutarı sunucuda hesaplanır. İlk kalem sonucu yazıldığında confirmed sipariş preparing olur. Toplama yalnız confirmed ya da preparing siparişte yazılır.
| Alan | Tip | Açıklama |
|---|---|---|
items[] | array | İstek başına en çok 200 kalem. Her kalemde clientReferenceId (siparişteki items[].clientReferenceId) ve status (picked, partial, not_found, substituted) gerekir. |
pickedQuantity | number | partial için adet; 1 ile sipariş adedi arasında olmalıdır. |
pickedWeight | number | Tartılı ürün için gram; tam sayı ve sıfırdan büyük olmalıdır. Sipariş anında donmuş banda karşı sınanır: bandın üstü reddedilir; altında kalan gerçek bir eksik partial ile ve notla bildirilir. |
substituteClientReferenceId | string | substituted için ikame ürünün clientReferenceId değeri. |
customerApproved | boolean | Müşteri ikameyi onayladıysa true. Tercihi ask olan kalemde onay gerekir. |
note | string | Serbest not; kısmi tartıda zorunludur. |
Kalem düzeyindeki ret kodları (order_not_pickable, picking_closed, invalid_weight, substitution_not_allowed, approval_required ve diğerleri) results[].error içinde döner; tam liste Hata Kodları sayfasındadır.
Toplamayı kapatma
curl -X POST "https://api.supergelsin.com/api/partner/v1/orders/cm_ornek_siparis/picking" \
-H "Authorization: Basic $(printf '%s:%s' "$API_KEY" "$API_SECRET" | base64)" \
-H "X-Integrator: Ornek POS" \
-H "X-Operator: kasiyer_01" \
-H "Content-Type: application/json" \
-d '{ "complete": true, "receiptUrl": "https://ornek-entegrator.example/fis/1044.jpg", "bagCount": 3 }'complete: true toplamayı kapatır; yalnız items gönderen istek kapatmaz. items ya da complete: true alanlarından en az biri gerekir. receiptUrl ve bagCount yalnız complete: true ile gönderilir. Toplama kapandıktan sonra POST /orders/{id}/status ile dispatch yazılabilir.
| Alan | Tip | Açıklama |
|---|---|---|
picking_incomplete | 409 | Kapanışta her kalem bir sonuca bağlanmış olmalıdır; aksi hâlde döner ve ileti eksik sayısını söyler. Toplama kapanmadan dispatch yazılırsa ya da ready toplama kapalı değilken yazılırsa da aynı kod döner. |
nothing_found | 409 | Hiçbir ürün bulunamadıysa toplama tamamlanamaz; siparişi out_of_stock sebebiyle iptal edin, müşteriye tam iade yapılır. |
exceeds_band | 409 | Toplama sonucu sipariş tutarını aşıyor; ileti tutarları söyler. |
- Kapanış reddedilirse önceki kalem sonuçları geri alınmaz.
- Tamamlanmış siparişe tekrar
completegönderilirse200vecompleted: truedöner; iade, defter ve bildirim yeniden çalışmaz. Tamamlanmış bir sipariş sonradan toplanamaz duruma geçerse (ör. iptal)completetekrarı409 picking_incompletedöner. - Fiş görseli ve poşet adedi yalnız kapanış başarılıysa yazılır. Fiş görseli dış bir https bağlantısından indirilip platform deposuna alınır (görsel, en fazla 8 MB). Fiş zaten kayıtlıysa yeniden yazılmaz ve
receipt_already_saveduyarısı döner; yalnızbagCountgönderilen tekrar isteğinde poşet adedi de yazılmaz. Fiş görseli kopyalanamazsa kapanış durmaz,receipt_not_saveduyarısı döner. - Toplama eksiği kapıda tahsil edilecek tutardan düşer:
adjustmentTotalyanıtta,payment.dueAmountsipariş gövdesinde güncellenir. Siparişi toplama sonrasında yeniden okuyun.
Müşteri verisi ve test siparişi
Çarşı siparişinde müşteri telefonu, enlem ve boylamı hiçbir zaman paylaşılmaz; customer.phone, latitude ve longitude her zaman null döner. Sipariş teslim edildikten ya da iptal edildikten 2 saat sonra müşteri bilgisi daraltılır: ad kısalır (Ayşe Y.), adres yalnız İlçe / İl olarak kalır ve müşterinin serbest notu note alanından düşer. customer.redacted daraltmanın yapıldığını, visibleUntil tam görünürlüğün bitiş anını söyler. Daraltılmış alanlar hata değildir; entegrasyonunuz bunlara hata vermemelidir. Bu veriyi kendi tarafınızda da süresiz saklamayın (KVKK m.4/2).
isTest: true, siparişin POST /orders/test ile açılmış bir test siparişi olduğunu gösterir. Test siparişi işletmenin toplama ekranına düşmez (toplama sonucu bu API ile yazılabilir); ciroya, komisyona ve hakedişe girmez.
Teslim edilemeyen siparişin dönüşü
Kurye müşteriye ulaşamaz ya da adres yanlışsa yoldaki sipariş yalnız customer_unreachable ya da invalid_address koduyla iptal edilir. Çarşı'da bu durumda online ödemede tutarın tamamı müşteriye iade edilir (deliveryFailed.completedSale her zaman false). Ürünler dükkâna dönünce dönüş kalem kalem onaylanır.
curl "https://api.supergelsin.com/api/partner/v1/orders?status=return_pending" \
-H "Authorization: Basic $(printf '%s:%s' "$API_KEY" "$API_SECRET" | base64)" \
-H "X-Integrator: Ornek POS" \
-H "X-Operator: kasiyer_01"curl -X POST "https://api.supergelsin.com/api/partner/v1/orders/cm_ornek_siparis/return" \
-H "Authorization: Basic $(printf '%s:%s' "$API_KEY" "$API_SECRET" | base64)" \
-H "X-Integrator: Ornek POS" \
-H "X-Operator: kasiyer_01" \
-H "Content-Type: application/json" \
-d '{ "lines": [{ "lineId": "cm_ornek_satir", "returnedQuantity": 1, "reason": "lost" }] }'Bekleyen satırlar GET /orders/{id} yanıtındaki returnLines alanındadır (lineId, clientReferenceId, sku, barcode, name, quantity). Her satır tam bir kez gönderilir. Dönen adet stoğa eklenir; dönmeyen adet için reason (lost kayıp, damaged hasarlı) zorunludur ve sebep siparişin kaydına geçer. İki eşzamanlı onaydan yalnız biri uygulanır. Yanıt { orderId, restockedLines } biçimindedir.
| Alan | Tip | Açıklama |
|---|---|---|
not_cancelled | 409 | Sipariş iptal edilmemiş. |
not_failed_delivery | 409 | Sipariş teslim edilemedi olarak kapatılmamış. |
already_confirmed | 409 | Siparişin dönüşü zaten onaylanmış. |
invalid_lines | 400 | Dönüş satırları siparişle uyuşmuyor. |
not_found | 404 | Sipariş bulunamadı. İleti: Sipariş bulunamadı. |