📋 Documentazione Sistema Mensa

Guida completa alle operazioni per tutti i ruoli

Aggiornato marzo 2026
👥

Ruoli del sistema

👤 Utente

Dipendente aziendale. Può prenotare, modificare e cancellare il proprio pasto. Accede a /utente.php.

🛠 Amministrazione

Gestisce dipendenti, buoni, menu e visualizza report. Accede a /admin.php. Può anche usare le funzioni utente e cuoca.

👩‍🍳 Cuoca

Operatore mensa. Scansiona QR/matricole al momento della consumazione. Accede a /cuoca/cuoca.php.

🕐

Orari e finestre temporali

ℹ️ Tutti gli orari si riferiscono al fuso orario Europe/Rome. Le finestre si applicano al giorno di consumazione.
Orario Evento Chi è coinvolto Note
09:00 Le notifiche push smettono di partire fino alle 13:30 Utente Silenzio notifiche mattutino
11:00 Apre la finestra "prenota nuovo giorno" (replacement) Utente Solo se si ha già una prenotazione attiva per oggi
13:30 Cutoff prenotazione odierna — la prenotazione di oggi diventa "scaduta" e la finestra replacement si chiude Utente Il sistema la mostra come scaduta; il record resta nel DB. Il replacement richiede prenotazione attiva → dopo le 13:30 non è più possibile.
13:35 Cron chiude le prenotazioni non scannerizzate Cuoca used_at = data_consumazione 13:35:00 sulle prenotazioni IS NULL
13:45 circa Prima notifica push della giornata parte agli utenti senza prenotazione Utente Ogni 15 min fino alle 09:00 del giorno dopo (se non ancora notificato)
15:00
(giorno precedente)
Cutoff modifica/cancella — non è più possibile toccare la prenotazione del giorno lavorativo successivo Utente Admin Conta il giorno lavorativo precedente (salta weekend e festivi)

Timeline giornaliera

00:00 – 09:00
Notifiche push attive (inviate ogni 15 min agli utenti senza prenotazione)
09:00 – 11:00
Silenzio notifiche. Nessuna azione possibile sulle prenotazioni odierne
11:00 – 13:30
Finestra replacement aperta — chi ha prenotazione attiva per oggi può prenotare un giorno futuro
13:30
Scatta il cutoff di oggi — prenotazione odierna diventa "scaduta". La finestra replacement si chiude automaticamente perché non esiste più una prenotazione attiva.
13:35
Cron close_prenotazioni — imposta used_at = 13:35:00 sulle prenotazioni non scannerizzate
13:45 (circa)
Prima notifica push — parte agli utenti senza prenotazione attiva
L'utente ha ~15 minuti per prenotare un giorno futuro prima delle 14:00. Poi ogni 15 minuti fino alle 09:00.
👤

Operazioni Utente

Operazione Quando è possibile Condizioni
Nuova prenotazione Qualsiasi ora, per date future Saldo buoni > 0 · Nessuna prenotazione attiva · Data = giorno lavorativo
Modifica prenotazione attiva Prima delle 15:00 del giorno lavorativo precedente Prenotazione esistente · Non ancora consumata
Cancellazione prenotazione Solo passando dall'ufficio (admin) Date future: sempre · Oggi: solo prima delle 09:30 · Buoni vengono restituiti
Replacement (prenota altro giorno) Solo tra le 11:00 e le 13:30 Avere prenotazione attiva per OGGI · Saldo buoni > 0 · Nuovo giorno > oggi
Visualizza saldo buoni Sempre
Visualizza storico pasti Sempre
Download menu Sempre (se caricato dall'admin) Menu settimana corrente e prossima
Attivare notifiche push Sempre Browser compatibile · Permesso notifiche concesso

Cosa compone una prenotazione

🍝 Primo piatto

  • Codice piatto dal menu
  • Testo descrittivo
  • Sostituzione (opzionale)

🥩 Secondo piatto

  • Codice piatto dal menu
  • Testo descrittivo
  • Sostituzione (opzionale)

📝 Note

  • Campo testo libero opzionale
  • Visibile alla cuoca
ℹ️ Quando il saldo arriva a 0, il sistema accredita automaticamente 20 buoni e incrementa di 1 il contatore blocchetti da pagare. L'utente può continuare a prenotare senza interruzioni.
🛠

Operazioni Admin

Gestione dipendenti

AzioneDettaglio
Aggiungi dipendente Nome, cognome, email, password (min 4 char). Il numero matricola viene assegnato automaticamente dal sistema.
Modifica dipendente Nome, cognome, email, password (opzionale). Il numero matricola non è modificabile.
Elimina dipendente Rimuove dipendente e tutti i dati correlati (prenotazioni, movimenti buoni, sessioni). Operazione irreversibile.

Gestione prenotazioni dipendenti

AzioneCondizione
Modifica prenotazione Date future: sempre · Oggi: solo prima delle 09:30 · Date passate: mai (nessun vincolo sulle 15:00 del giorno precedente — regola solo per l'utente)
Cancella prenotazione Date future: sempre · Oggi: prima delle 09:30 · I buoni vengono restituiti
Riepilogo giornaliero/mensile Visualizza il numero totale di prenotazioni per data

Gestione buoni pasto

AzioneDettaglio
Aggiunge buoni Inserisce un movimento di tipo "acquisto". Il trigger aggiorna automaticamente il saldo.
Visualizza saldo Saldo attuale per ogni dipendente
Storico movimenti Tutti i movimenti (acquisto, uso, rettifica, bonus, storno)

Gestione menu

AzioneDettaglio
Upload manuale menu Carica immagine o PDF per la settimana corrente e/o prossima. Formati: png, jpg, jpeg, gif, webp, pdf. Max 10MB.
Aggiornamento automatico da email Il cron scarica il PDF allegato alle email di cinzia@mollificiolecchese.it con "menu" in oggetto o allegato, e lo salva automaticamente.
Rotazione menu Ogni settimana il menu "prossima" diventa "corrente" automaticamente.
👩‍🍳

Operazioni Cuoca

La cuoca accede a /cuoca/cuoca.php. Può selezionare la data di consumazione (default: oggi) e scansionare le matricole.

Scansione prenotazione

Stato rispostaSignificatoAzione consigliata
✅ OK Prenotazione trovata e marcata come consumata (used_at = NOW()) Servire il pasto
🔁 GRACE Scansione ripetuta entro 60 secondi dalla prima (ri-passata accidentale) Ignorare, il pasto è già stato segnato
⛔ USED Prenotazione già consumata in precedenza (oltre 60s fa) Non servire. Mostra orario prima consumazione.
❌ NOT FOUND Nessuna prenotazione trovata per questa matricola nella data selezionata Verificare la data o contattare l'amministrazione

Cosa vede la cuoca

📋 Dettaglio pasto

  • Nome dipendente
  • Primo piatto (codice + testo)
  • Secondo piatto (codice + testo)
  • Eventuali sostituzioni
  • Note speciali

📡 Display live

  • Aggiornamento automatico in tempo reale
  • Mostra ultimo scan con nome e piatti
  • Polling ogni pochi secondi

📝 Note cuoca

  • Note interne per la giornata
  • Salvate per data
  • Non visibili agli utenti
⚠️ Le prenotazioni non scannerizzate entro le 13:35 vengono chiuse automaticamente dal sistema con used_at = 13:35:00. La cuoca può continuare a scansionare dopo le 13:35 solo se aveva già scansionato prima (prenotazioni con used_at NULL non ce ne sono più).
🔔

Notifiche Push

📲 Attivazione

  • L'utente clicca sull'icona campanellina in /utente.php
  • Il browser chiede il permesso notifiche
  • La subscription viene salvata nel DB

🕐 Quando arriva la notifica

  • Prima notifica: circa 13:45
  • Poi ogni 15 minuti fino alle 09:00
  • Solo se NON hai una prenotazione attiva
  • Solo una volta al giorno (poi non riparte)

📩 Contenuto notifica

  • Titolo: 🔔 PROMEMORIA MENSA
  • Testo: Non hai ancora prenotato il pranzo! Clicca qui per prenotare subito.
  • Cliccando si apre direttamente /utente.php

Logica invio

09:00 – 13:30
Cron gira ogni 15 min ma esce subito senza fare nulla
13:35 (close_prenotazioni)
Prenotazioni non scannerizzate vengono chiuse (used_at = 13:35:00)
13:45 (primo run utile)
Il cron trova utenti con used_at IS NULL e last_notified_date < oggi → invia notifica
14:30 – 09:00
Cron continua ogni 15 min, ma gli utenti già notificati oggi vengono saltati (last_notified_date = oggi)
🎟

Sistema Buoni Pasto

Tipo movimentoChi lo generaEffetto sul saldo
acquisto Admin aggiunge buoni manualmente + incrementa
uso Utente effettua una prenotazione − decrementa
bonus Bonus automatici del sistema + incrementa
rettifica Correzione manuale admin ± dipende dal valore
storno Cancellazione prenotazione + ripristino buono
ℹ️ Quando il saldo scende a 0, il sistema accredita automaticamente 20 buoni e incrementa di 1 il contatore blocchetti da pagare. L'utente può quindi continuare a prenotare senza interruzioni.
⚙️

Job automatici (Cron)

JobScheduleCosa fa
close_prenotazioni.php 35 13 * * * Imposta used_at = 13:35:00 su tutte le prenotazioni di oggi non ancora scannerizzate. Permette al cron push di distinguere prenotazioni "aperte" da "scadute".
push_notifications.php */15 * * * * Ogni 15 minuti, nella finestra 13:30–09:00, invia una notifica push agli utenti che non hanno prenotazioni attive (used_at IS NULL) e non sono già stati notificati oggi.
aggiorna_menu.php configurabile Controlla la casella Gmail, scarica il PDF del menu allegato alle email di Cinzia, e aggiorna automaticamente il menu corrente/prossima settimana.
💡 Per eseguire manualmente close_prenotazioni.php dal browser:
https://prenotazionimensa.mydigitaltools.it/trigger_close.php?token=mensa_close_2026
Per le push: trigger_push.php?token=mensa_push_2026
🔄

Flusso completo — dalla prenotazione alla consumazione

1

Utente prenota

Accede a /utente.php, sceglie data, primo, secondo (e note opzionali). Il sistema scala 1 buono dal saldo e assegna il numero matricola per il QR.

2

Modifica / cancellazione (opzionale)

Prima delle 15:00 del giorno lavorativo precedente, l'utente può modificare primo/secondo/note o cancellare (con restituzione del buono).

3

Giorno di consumazione — mattina

La prenotazione è attiva. Tra le 11:00 e le 13:30 l'utente può facoltativamente prenotare un altro giorno futuro (replacement) senza toccare quella di oggi.

4

Cuoca scansiona (durante il pasto)

La cuoca legge il QR/matricola. Se la prenotazione esiste e used_at IS NULL, viene marcata come consumata con used_at = NOW(). Risposta: ✅ OK.

5

13:35 — Chiusura automatica

Il cron close_prenotazioni.php imposta used_at = 13:35:00 su tutte le prenotazioni di oggi non scannerizzate. Da questo momento nessuna prenotazione odierna risulta "aperta".

6

13:45 — Notifica push

Il cron push verifica chi non ha prenotazioni con used_at IS NULL e non è stato ancora notificato oggi. Invia il promemoria "Non hai ancora prenotato il pranzo!".

7

Ciclo successivo

Se l'utente ha già una prenotazione futura (inserita tramite replacement), questa diventerà la nuova "attiva" il giorno successivo. Altrimenti dovrà prenotare ex-novo.

Sistema Prenotazioni Mensa — Documentazione interna · Marzo 2026