Fine della fase di prova: la funzione avvisa admin e allenatori attivi. Test aggiornato (l'allenatore ora è tra i destinatari), DD-050, notifiche, allenatore, DATABASE, CHANGELOG, ROADMAP e PROJECT_STATE allineati. m33 non ancora applicata in produzione. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
5.1 KiB
DD-050 — Avviso a admin e allenatori se una presenza cambia a meno di 6 ore dall'evento
Data: 8 ottobre 2026
Stato: Implementata per admin e allenatori (migration m32, solo admin, applicata in produzione il 9 ottobre 2026; m33, anche allenatori)
Contesto
Un giocatore può cambiare la risposta a un evento fino all'ultimo minuto. Chi organizza (admin e allenatore)
se ne accorge solo riaprendo l'evento: un «assente» detto due ore prima di una partita può far saltare la
formazione o il numero minimo per l'allenamento. Oggi nessuna notifica avvisa chi gestisce gli eventi di una
risposta (notifiche.md, «Cosa non genera nessuna notifica»).
Decisione
-
Cosa fa scattare l'avviso. Una riga di
risposte_presenzeche cambia — nuova, modificata o ritirata — quando mancano da 0 a 6 ore all'inizio di una partita o un allenamento (non agli altri tipi di evento). Scatta per qualsiasi cambio di stato, da qualunque valore a qualunque altro (presente, assente, forse, in ritardo, infortunato) e anche per la prima risposta e per il ritiro; non scatta solo se lo stato resta quello di prima (nessun cambio reale). Vale per qualunque giocatore, anche se la modifica la fa un admin per conto suo. -
Chi la riceve: gli admin e gli allenatori attivi (chi ha il ruolo
adminoallenatoreinuser_rolese uno slot attivo ingiocatori_squadra), tranne la persona a cui appartiene la presenza (se un admin cambia la propria, non avvisa se stesso). Chi ha il ruolo ma nessuno slot collegato non può ricevere notifiche, perchénotifiche_utenteè per slot. -
Come funziona. Un trigger
AFTER INSERT OR UPDATE OF stato OR DELETEsurisposte_presenzechiama una funzioneSECURITY DEFINER(avvisa_presenza_modificata(), migrationm32). La funzione:- ignora il caso in cui lo stato prima e dopo è lo stesso;
- legge l'evento e continua solo se
tipoèpartitaoallenamentoeinizio_evento(data, ora) - now()sta tra 0 e 6 ore (stessainizio_evento()di M26: fusoEurope/Rome, ora illeggibile = nessun avviso); - inserisce una riga in
notifiche_utenteper ogni destinatario, con il tipo nuovopresenza_modificata.
Dal database in poi il resto è già fatto: il trigger di M22/M26 accoda l'email, il trigger delle push (esteso con il tipo nuovo) accoda la push, la riga è il centro notifiche in-app (DD-038). Nessuna route dell'app e nessun codice lato client oltre al nuovo valore di
TipoNotifica. -
Testo. Titolo
Presenza modificata: <Nome Cognome>; corpo su righe:Evento: <titolo>,Data: <GG/MM/AAAA>, ore <ora>,Da: <stato prima>,A: <stato dopo>. Gli stati sono «presente», «assente», «forse», «in ritardo», «infortunato», «nessuna risposta» (prima di una risposta nuova, o dopo un ritiro). Non c'è un link all'evento: il pulsante «Apri CrAPP» della mail e il tocco sulla push aprono l'app. -
Una notifica per modifica, senza raggruppare.
evento_idresta NULL (come i messaggiadmin), così laUNIQUE (giocatore_id, evento_id, tipo)non si applica e due modifiche dello stesso evento non si sovrascrivono. Contro: se la stessa persona cambia idea cinque volte, ognuno dei destinatari riceve cinque notifiche e cinque email. -
Nessuna configurazione. Né una soglia modificabile (6 ore è scritto nella funzione), né un interruttore per ruolo: l'email e la push seguono le preferenze già esistenti di ciascuno (
preferenze_utente, DD-036).
Fase di prova (conclusa)
La m32 (9 ottobre 2026) l'ha attivata per i soli admin, per vedere in pratica quante notifiche genera. Dopo la
prova la m33 (stesso giorno) ha aggiunto 'allenatore' alla lista dei ruoli in avvisa_presenza_modificata():
ora vale la regola del punto 2.
Alternative scartate
- Una route dell'app invocata dal client dopo il salvataggio (come
sollecita-presenze) → il client scrive surisposte_presenzedirettamente con RLS: una route in più sarebbe aggirabile e dipenderebbe dal fatto che l'app sia ancora aperta al momento del salvataggio. Il trigger copre ogni scrittura. - Raggruppare in una sola notifica per evento (upsert con
evento_id) → perde il dettaglio di chi ha cambiato cosa, e l'upsert non rifa partire la push (il trigger delle push è soloINSERT). - Notificare anche chi ha il ruolo ma è il giocatore stesso → inutile: sa già cosa ha fatto.
Conseguenze
- Nuova migration
m32(CHECK dei tipi, tre funzioni, due trigger);docs/DATABASE.mde il catalogo innotifiche.mdsi aggiornano con essa. Applicata in produzione il 9 ottobre 2026. - L'allenatore, che prima non riceveva nulla sulle presenze, riceve questa notifica: aggiunta a allenatore.md.
- Rumore possibile a ridosso dell'evento (punto 5). Se in pratica dà fastidio, il primo ritocco è raggruppare per evento, non togliere l'avviso.
Riesame
Dopo qualche settimana d'uso: se arrivano troppe notifiche per lo stesso giocatore, raggruppare; se 6 ore
sono troppe o poche, spostare la soglia (una costante nella funzione).