Questo repository contiene la documentazione architetturale e le specifiche tecniche del progetto. Il codice sorgente è in un repo privato per motivi commerciali.
Meezy è una piattaforma SaaS multi-tenant per digitalizzare la gestione dei ristoranti: menu dinamici, monitoraggio tavoli, comande in tempo reale e report sulle vendite.
Le due parti più particolari del progetto sono il monitor di sala (KDS), costruito con un'architettura event-driven per tenere basso il carico sul server, e un modulo che usa l'AI per estrarre automaticamente un menu da un PDF cartaceo.
Il cliente accede scansionando un QR code legato al tavolo, con token dinamico e sessione condivisa. Il carrello è sincronizzato in tempo reale tra tutti quelli seduti allo stesso tavolo. Da qui si inviano le comande in cucina, si chiama il cameriere e si può dividere il conto piatto per piatto.
Il monitor di sala mostra comande e chiamate in tempo reale. Il gestore può costruire il menu (categorie, allergeni, prezzi, variazioni) e riordinarlo trascinando gli elementi. C'è un parser AI che legge un PDF del menu cartaceo e lo trasforma in dati strutturati usando le API di Google Gemini. I tavoli hanno tre stati (libero / occupato / chiuso) con QR generati automaticamente, e c'è una sezione di analytics con incassi, ordini e i piatti più venduti. Anche logo, copertina e colori del tema sono personalizzabili per ogni ristorante.
Gestione dei tenant: registrazione e provisioning dei ristoranti affiliati.
| Livello | Tecnologia | Note |
|---|---|---|
| Backend | PHP 8 | Procedurale, mysqli con prepared statement |
| Database | MySQL/MariaDB | InnoDB, con vincoli, indici e trigger |
| Realtime | Server-Sent Events | Basato su tabella di stato + trigger DB, niente WebSocket |
| Frontend | HTML/CSS/JS vanilla | CSS custom properties per i temi dinamici |
| AI | Google Gemini API | Parsing dei PDF menu |
| QR | Endroid QR Code 5.0 | Via Composer |
| Server | Apache | .htaccess per rewrite e sicurezza |
Invece di usare i WebSocket, la comunicazione tra cucina e tavoli passa da SSE combinati con trigger MySQL:
Cliente invia comanda → scrittura su DB → trigger MySQL
│
▼
Monitor di sala (KDS) ← endpoint SSE ← tabella sse_stato
Ogni volta che qualcosa cambia (nuovo ordine, stato tavolo, chiamata cameriere) un trigger incrementa un contatore di versione nella tabella sse_stato. L'endpoint SSE controlla quel contatore e manda dati al client solo quando è effettivamente cambiato qualcosa, invece di fare polling continuo.
- Prepared statement ovunque, niente query concatenate a mano
- Token CSRF su form e chiamate AJAX, controllo dell'header Origin
- Rate limiting sui login: blocco dopo 5 tentativi falliti in 15 minuti per IP
- Cookie di sessione con
HttpOnlyeSameSite=Strict, rigenerazione periodica dell'ID .htaccessblocca l'accesso diretto a file sensibili (.env,db.php,composer.json) e disabilita il directory listing- Controlli su estensione e dimensione per gli upload
restaurantsaas/
├── admin/ # amministrazione e registrazione tenant
├── backend/ # handler di sistema e utility
├── clienti/ # app web per l'ordinazione
│ └── backend/ # endpoint AJAX per carrello condiviso e SSE
├── css/ # design system e temi dinamici
├── includes/ # helper (CSRF, cookie, toast, branding)
├── ristoranti/ # dashboard gestore e KDS
│ ├── backend/ # endpoint AJAX, generatore QR, engine SSE
│ └── testAI/ # ingestion PDF con Google Gemini
├── schema_update.sql # tabelle, vincoli, indici e trigger
└── index.php # landing page