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
GenelHook key table.close Scope hooks:table.close (consent-gated) Manifest hooks: [{ action, blocking, ui, webhookPath?, includeData? }] Hedef manifest webhookUrl (veya webhookPath) Method POST (senkron, blocking) Yanıt bütçesi timeoutMs (varsayılan ~10s); aşımda failMode
Manifest hook config Kopyala{
"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) Kopyala{
"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)
} Alan Açıklama target.id Masa id’si. Dolu hesabı tables/get?id= ile çekin (gate yalnız id taşır). data Yalnız includeData:true ise. tables/get ile birebir kanonik şekil (orders, total…). 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 Kapatmayı başlatan kullanıcı {userId, role} — imzalı gövdede, güvenilir.
Eklenti → Restomenum (response)allow — kapatma devam
Kopyala{ "decision": "allow" } deny — engelle (message personele gösterilir)
Kopyala{ "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ı)message Anlam plugin.hook.targetNotFound Masa bulunamadı. plugin.hook.notRegistered Manifest’inizde bu hook yok. plugin.scope.denied hooks:table.close onaylı değil. plugin.hook.inactive Kurulum 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).