Sipariş platformu tipi eklentiler için: packets/create ile oluşturduğunuz paketlerin statü geçişlerinde söz sahibi olun. Restoran paneli, sizin oluşturduğunuz bir paketin statüsünü değiştirmeden ÖNCE eklentinize senkron sorar; allow/deny dönersiniz. deny → geçiş engellenir, message personele gösterilir.
| Hook key | packet.status.update |
| Scope | hooks:packet.status (consent-gated güçlü yetki) |
| Manifest | hooks: [{ event, ui, timeoutMs, failMode, statuses?, includeData }] |
| Hedef | manifest actionUrl (yoksa webhookUrl) |
| Method | POST (senkron) |
| Rate limit | hook kovası (varsayılan 60/dk per-install) |
{
"event": "packet.status.update",
"ui": { "kind": "none" }, // gate genelde UI'sız karar; form/iframe da desteklenir
"timeoutMs": 5000, // cevap bütçesi [1s,10s]; aşımda failMode uygulanır
"failMode": "open", // VARSAYILAN: open (timeout/hata → geçişe izin ver + uyar)
"statuses": ["OnDelivery", "Delivered"], // OPS: yalnız bu HEDEF statülere geçişte sor; yoksa hepsi
"includeData": true // OPT-IN: gövdeye paketin kanonik verisi gömülür (packets/get şekli)
}Varsayılan open: endpoint’iniz cevap veremezse geçiş engellenmez (degraded uyarısıyla devam). "closed" seçebilirsiniz ama ciddi sorumluluk: sunucunuz düştüğünde restoranın o paketlerdeki tüm statü geçişleri bloklanır. Yalnız geçişin gerçekten durdurulması zorunluysa kullanın.
enforce bu hook’ta DESTEKLENMEZ (manifest’te verseniz de yok sayılır): statü yazımının sunucu-taraflı sert doğrulayıcısı henüz yok; karar panel-işbirlikli uygulanır. Sert garanti gerektiren akışları buna kurmayın (Faz 2’de backend status ucuyla gelecek).
{
"type": "hook",
"event": "packet.status.update",
"stage": "before",
"tenantId": "<tenantId>",
"target": { "type": "packet", "id": "<packetId>" },
"transition": { "from": "Approved", "to": "OnDelivery" },
"data": {
"packetId": "<packetId>", "docNo": 12,
"customer": { "id": "c1", "name": "...", "phone": "..." },
"orders": [ { "id": "...", "title": "...", "quantity": 1, "options": [], "lineTotal": 130 } ],
"entegrasyon": "packet", "total": 130, "paid": 0, "totalDiscount": 0
},
"formData": { "<sizin-field-keyiniz>": "<personel-degeri>" }, // DİNAMİK: formunuzdaki key'ler; yalnız ui.kind form/iframe ise
"actor": { "userId": "<uid>", "role": "staff" },
"timeoutMs": 5000,
"occurredAt": 1718000000000,
"hookId": "hk_<uuid>"
}| Alan | Açıklama |
|---|---|
| transition | Onaylanan geçiş: to her zaman var (hedef statü); from eski paketlerde olmayabilir. |
| target.id | Paket id’si. Veriyi packets/get?packetId= ile de çekebilirsiniz. |
| data | Yalnız includeData:true ise. packets/get ile birebir kanonik şekil; customer yalnız customers:read + PII consent ile, data yalnız orders:read ile. |
| formData | Yalnız ui.kind form/iframe ise gelir. İçeriği DİNAMİKTİR: anahtarlar SİZİN formunuzda tanımladığınız field key’ler, değerler personelin girdiği değerlerdir (her eklentiye özel; sabit şema yok). ui.kind none ise hiç gelmez. |
| actor | Geçişi yapan kullanıcı {userId, role} (manager/staff) — imzalı gövdede, güvenilir. |
| hookId | Bu çağrının id’si (loglama/dedup). |
{ "decision": "allow", "message": "Kurye atandı, yola çıkabilir." }{ "decision": "deny", "message": "Kurye henüz atanmadı — yola çıkarılamaz." }| message | Anlam |
|---|---|
| plugin.hook.notOwner | Paket sizin değil (sahiplik damgası eşleşmedi). |
| plugin.hook.targetNotFound | Paket bulunamadı. |
| plugin.hook.missingTransition | Geçiş bağlamı eksik/geçersiz (panel hatası). |
| plugin.hook.notRegistered | Manifest’inizde bu hook yok. |
| plugin.scope.denied | hooks:packet.status onaylı değil. |
| plugin.hook.inactive | Kurulum pasif (kill-switch / billing / connect). |
1. Sipariş geldi → POST /plugin-api/packets/create (callbackUrl + idempotencyKey ile)
2. Restoran "Yola Çıkar"a bastı
→ Restomenum → sizin actionUrl: { type:"hook", event:"packet.status.update",
transition:{from:"Approved", to:"OnDelivery"}, ... }
→ siz: kurye atandı mı? → { decision:"allow" } / { decision:"deny", message:"..." }
3. (yakında) Statü değişti → packet.status_changed event'i callbackUrl'inize düşer
4. Kurye teslim etti → packets:status callback'leriyle Delivered'ı SİZ setlersiniz