Masa Kapatma Gate’i — table.close ✓ Canlı

Masa (dine-in) hesabı kapatılmadan ÖNCE araya giren before-hook. Restoran "Hesabı Kapat" dediğinde eklentinize senkron sorulur; allow/deny dönersiniz (deny → kapatma durur, message personele gösterilir). Ödeme/sadakat/fatura entegrasyonları için kapanış anını yakalar.

← Hook'lar

Genel

Hook keytable.close
Scopehooks:table.close (consent-gated)
Manifesthooks: [{ action, blocking, ui, webhookPath?, includeData? }]
Hedefmanifest webhookUrl (veya webhookPath)
MethodPOST (senkron, blocking)
Yanıt bütçesitimeoutMs (varsayılan ~10s); aşımda failMode

Manifest hook config

{
  "action": "table.close",
  "blocking": true,                // akışı durdurur (tüm hook'lar blocking)
  "ui": { "kind": "none" },        // none → doğrudan webhook'a sorulur; form/iframe da olur
  "webhookPath": "/hooks/table-close"  // ops — boşsa ana webhookUrl
}

failMode

table.close varsayılanı closed: cevap gelmeden masa kapatma DURUR. open opt-in’dir (h.failMode:"open"). Sunucunuz güvenilir değilse open düşünün.

Restomenum → eklenti (request body)

{
  "type": "hook",
  "event": "table.close",
  "stage": "before",
  "tenantId": "<tenantId>",
  "target": { "type": "table", "id": "<tableId>" },
  "formData": { "<sizin-field-keyiniz>": "<personel-degeri>" },   // DİNAMİK: formunuzdaki key'ler; yalnız ui.kind form/iframe ise
  "actor": { "userId": "<uid>", "role": "staff" },
  "occurredAt": 1718000000000,
  "hookId": "hk_<uuid>"
  // includeData:true ise data: { tableId, tableName, orders[], total, ... } (tables/get şekli)
}
AlanAçıklama
target.idMasa id’si. Dolu hesabı tables/get?id= ile çekin (gate yalnız id taşır).
dataYalnız includeData:true ise. tables/get ile birebir kanonik şekil (orders, total…).
formDataYalnı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.
actorKapatmayı başlatan kullanıcı {userId, role} — imzalı gövdede, güvenilir.

Eklenti → Restomenum (response)

allow — kapatma devam
{ "decision": "allow" }
deny — engelle (message personele gösterilir)
{ "decision": "deny", "message": "Önce fişi yazdırın." }
  • decision: allow (kapatma devam) / deny (durdur; message personele gösterilir).
  • Geçersiz/boş cevap veya timeout → failMode uygulanır.
  • attach desteklenir (allowlist: invoiceNo / reference / note).

Hata mesajları (hook çağrısı)

messageAnlam
plugin.hook.targetNotFoundMasa bulunamadı.
plugin.hook.notRegisteredManifest’inizde bu hook yok.
plugin.scope.deniedhooks:table.close onaylı değil.
plugin.hook.inactiveKurulum pasif (kill-switch / billing / connect).

Güvenlik

  • İmza: X-Restomenum-Signature (HMAC, ±5dk) — webhook/action ile aynı şema; type:"hook" ile ayırt edin.
  • Gate yalnız target.id taşır → dolu hesabı tables/get ile çekin; cross-tenant kontrolü yapın.
  • Bir action başına tenant’ta yalnız bir blocking hook (çakışma → ilk aktif kurulum sahiplenir).