API Tavoli e Prenotazioni
Panoramica
La gestione tavoli e prenotazioni e distribuita su 5 servizi Moleculer, tutti basati su TenantDbMixin per l'isolamento multi-tenant:
| Servizio | Collection | Descrizione |
|---|---|---|
tavolo | tavoli | CRUD tavoli, stati, locking, QR code |
sala | sale | CRUD sale (room) |
prenotazione | prenotazioni | Prenotazioni con flusso completo |
bookings | bookings | Batch upload prenotazioni (sync) |
capacity | production_categories / slot_config | Slot e capacita |
Tutti gli endpoint richiedono autenticazione JWT. Il tenantId viene estratto automaticamente dal token.
Endpoint Tavoli
Elenco Tavoli
curl -X GET "https://api.example.com/api/tavoli?salaId=<SALA_ID>&attivo=true" \
-H "Authorization: Bearer <JWT_TOKEN>"
Parametri opzionali: attivo (boolean), capacitaMin (numero minimo coperti), posizione, salaId. La risposta include alias inglesi per compatibilita con waiter_ui (id, name, seats, status, roomId).
Aggiornamento Stato Tavolo
curl -X PUT "https://api.example.com/api/tavoli/<TABLE_ID>/status" \
-H "Authorization: Bearer <JWT_TOKEN>" \
-H "Content-Type: application/json" \
-d '{
"status": "occupied",
"orderId": "<ORDER_ID>",
"pax": 4,
"totalAmount": 0
}'
Valori consentiti: free, occupied, open, dirty, reserved, payment_pending. Ogni cambio stato pubblica un messaggio NATS su tenant.{tenantId}.restaurant.tables.status per la sincronizzazione real-time.
Locking Tavolo
# Acquisire lock
curl -X POST "https://api.example.com/api/tavoli/<TABLE_ID>/lock" \
-H "Authorization: Bearer <JWT_TOKEN>" \
-d '{ "deviceId": "device-001", "operatorName": "Mario", "ttl": 300 }'
# Rilasciare lock
curl -X POST "https://api.example.com/api/tavoli/<TABLE_ID>/unlock" \
-d '{ "deviceId": "device-001" }'
Il lock usa Redis con TTL configurabile (default 300 secondi). Solo il device che detiene il lock puo rilasciarlo. L'admin puo forzare il rilascio con DELETE /<TABLE_ID>/lock.
Verifica Disponibilita
curl -X POST "https://api.example.com/api/tavoli/verifica-disponibilita" \
-H "Authorization: Bearer <JWT_TOKEN>" \
-d '{
"dataOra": "2026-03-17T20:00:00",
"numeroPersone": 4,
"durataMediaPasto": 90
}'
Incrocia tavoli attivi con capacita sufficiente e prenotazioni esistenti nella fascia oraria. Restituisce elenco tavoli disponibili con capacita totale.
Endpoint Sale
CRUD Sale
# Lista sale
curl -X GET "https://api.example.com/api/sale" \
-H "Authorization: Bearer <JWT_TOKEN>"
# Crea sala
curl -X POST "https://api.example.com/api/sale" \
-H "Authorization: Bearer <JWT_TOKEN>" \
-d '{
"codice": "TERRAZZA",
"descrizione": "Terrazza panoramica",
"width": 1000,
"height": 800
}'
Il codice viene convertito in maiuscolo. Dimensioni default: 800x600. La risposta include alias inglesi (name, width, height) per waiter_ui.
Endpoint Prenotazioni
Creazione Prenotazione
curl -X POST "https://api.example.com/api/prenotazioni" \
-H "Authorization: Bearer <JWT_TOKEN>" \
-d '{
"covers": 4,
"bookingDate": "2026-03-17T20:00:00",
"customerName": "Mario Rossi",
"customerPhone": "+39 333 1234567",
"tableIds": ["<TABLE_ID>"],
"notes": "Allergia al glutine",
"state": "confermata"
}'
Il servizio accetta parametri sia in inglese (covers, bookingDate, customerName) sia in italiano (numeroPersone, dataOra, cliente). Genera un codice prenotazione univoco di 6 caratteri. Pubblica un messaggio NATS su tenant.{tenantId}.restaurant.bookings.created.
Cambio Stato
# Conferma
curl -X POST "https://api.example.com/api/prenotazioni/<ID>/conferma"
# Annullamento
curl -X POST "https://api.example.com/api/prenotazioni/<ID>/annulla" \
-d '{ "motivo": "Cliente ha chiamato per disdire" }'
# Cambio stato generico
curl -X POST "https://api.example.com/api/prenotazioni/<ID>/stato" \
-d '{ "nuovoStato": "no_show" }'
Stati validi: pending, confermata, caparra_pagata, completata, annullata, no_show.
Sincronizzazione
# Sync down (delta)
curl -X GET "https://api.example.com/api/prenotazioni/sync?modifiedSince=2026-03-17T08:00:00Z"
# Batch upload
curl -X POST "https://api.example.com/api/prenotazioni/batch" \
-d '{ "items": [{ "covers": 2, "bookingDate": "...", "customerName": "..." }] }'
L'endpoint syncDown supporta filtri dal/al (range date) e modifiedSince (delta sync). Default: prenotazioni degli ultimi 7 giorni.
Eventi Realtime
I servizi tavoli e prenotazioni pubblicano eventi NATS per la sincronizzazione:
tenant.{tenantId}.restaurant.tables.status-- Cambio stato tavolotenant.{tenantId}.restaurant.bookings.created-- Nuova prenotazionetenant.{tenantId}.restaurant.bookings.updated-- Prenotazione modificatatenant.{tenantId}.restaurant.bookings.cancelled-- Prenotazione annullata
FAQ
D: Qual e la differenza tra bookings e prenotazione?
R: prenotazione e il servizio principale con CRUD completo, flusso stati e sincronizzazione NATS. bookings e un servizio semplificato per batch upload dal POS (legacy).
D: Come funziona la riconciliazione tavoli/prenotazioni?
R: L'azione tavolo.verificaDisponibilita interroga prenotazione.getPrenotazioniGiorno per ottenere le prenotazioni del giorno e calcolare la sovrapposizione temporale.
D: I parametri italiani sono deprecati? R: No, sono mantenuti per retrocompatibilita. I parametri inglesi hanno priorita. Entrambi i formati sono salvati nel documento per garantire la compatibilita con tutte le app.
Vedi Anche
- Gestione Tavoli -- Guida operatore tavoli
- Prenotazioni -- Guida operatore prenotazioni
- Configurazione Sale e Tavoli -- Setup sale
- Slot Prenotazioni -- Configurazione capacita
- API Ordini -- API gestione ordini