Sabor & Mesa
Key features
Full transactional cycle: per-table mutex (409 if the table already has an active order), validated state transitions Sent → Cooking → Served → Paid and table released on payment
Server-side reservation expiry: expiresAt = now + 15 min, 30 s sweeper cancelling expired PENDING reservations and freeing the table automatically
Receipt off the web: downloadable/printable SVG QR + simulated email on payment
Loyalty derived from the real amount: 1 point per 10 € (points == floor(total/10€)), movement ledger and profile history
Manager dining room: real-time tables, reservation confirmation, daily KPIs and SVG hourly-revenue chart with axes, dates and tooltips
Digital menu with category, diet and allergen filters, search and dish detail; kitchen with live queue and per-dish serving
Description
The full restaurant experience, built around the diner. At the table you scan the QR and open the digital menu by category (Starters, Mains, Desserts, Drinks) with photo, description, price, allergens and diets (vegan, gluten-free, spicy); filter and add dishes with quantities and notes. The order reaches the kitchen with the table number and advances through a validated state machine (Sent → Cooking → Served → Paid) that you follow live with a timeline and per-dish summary; if the table already has an active order the backend answers 409 (transactional mutex, no double sale). On payment the total is always computed server-side, the table goes back to Free and you get a receipt with a downloadable/printable SVG QR + simulated email; you also earn loyalty points derived from the real amount (1 point per 10 €) shown in your profile with the order history. Reservations close the loop too: pick date, time and party size, the backend returns available tables for the slot, creates the PENDING reservation with expiresAt computed ON THE SERVER (15 min) and a 30 s sweeper cancels expired ones and frees the table without waiting for any request; the host confirms from the dining-room view. The kitchen sees the live order queue with a per-dish timer and serves dish by dish; the manager sees the dining room (tables with real-time status), confirms reservations and checks daily KPIs (revenue, average ticket) with an SVG hourly-revenue chart with axes and tooltips. Login with email or username, persistent JWT, 3 roles (Diner, Kitchen, Manager). Angular 22 + NestJS 11 + SQLite.
Technologies used
Angular
TypeScript
SQLite