m25: giocatori_destinatari_evento() include solo i giocatori attivi, quindi l'allenatore non riceve più i promemoria a 24 e 3 ore, per nessun tipo di evento (fino alla m24 li riceveva sempre, DD-034). Riceve ancora i messaggi dello staff. Test: nuovo destinatari-notifiche.test.ts (14 controlli sulle route vere con un servizio push finto: promemoria, messaggio dello staff, sondaggio, sollecito, turno palloni, permessi di allenatore e giocatore) e aggiornato permessi-allenatore. Documentazione: DD-039, tabella delle notifiche dell'allenatore, catalogo e tabella dei test che lo verificano. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
208 lines
11 KiB
Markdown
208 lines
11 KiB
Markdown
# Changelog
|
||
|
||
Le modifiche rilevanti di CrAPP sono documentate qui, in ordine di rilascio. Il formato
|
||
segue [Keep a Changelog](https://keepachangelog.com/it/1.1.0/): ogni versione ha una data
|
||
e le voci sono divise per categoria (Aggiunto, Modificato, Sicurezza...). L'elenco
|
||
completo delle funzionalità, fatte e previste, sta in [ROADMAP.md](ROADMAP.md); qui si
|
||
registra solo _quando_ una voce è stata rilasciata e con quale versione.
|
||
|
||
Le versioni sono sempre a tre cifre (`x.y.z`, mai `x.y`). Dalla `1.0.0` si segue il
|
||
[versionamento semantico](https://semver.org/lang/it/): `x` cresce con i cambi non
|
||
compatibili all'indietro, `y` con le funzionalità nuove, `z` con le sole correzioni. Le
|
||
versioni `0.y.z` erano pre-release.
|
||
|
||
## [Non rilasciato]
|
||
|
||
### Modificato
|
||
|
||
- **L'allenatore non riceve più i promemoria degli eventi** (24 e 3 ore prima, DD-039): per lui non
|
||
c'è nulla da confermare, dato che non risponde alle presenze e non è convocabile, e per una cena di
|
||
squadra il promemoria non aveva senso. Riceve ancora i messaggi dello staff. Migration
|
||
`m25_promemoria_solo_giocatori`.
|
||
|
||
- **Ogni notifica arriva su tutti e tre i canali** (DD-038): i promemoria a 24 e 3 ore, che
|
||
arrivavano solo in-app e per email, partono ora anche come push, mandata dal worker `mailer/`
|
||
(migration `m24_push_promemoria_e_sondaggio`). Il sondaggio pre-partita, che era solo push,
|
||
compare anche nel centro notifiche e arriva per email ai giocatori attivi (non agli allenatori).
|
||
Il worker va ricostruito e configurato con le chiavi VAPID dell'app; senza, manda solo le email.
|
||
|
||
### Corretto
|
||
|
||
- **I promemoria dell'evento non ricompaiono più se li elimini** — il promemoria a 24 e a 3 ore
|
||
eliminato dal centro notifiche veniva rigenerato dal job automatico al giro successivo, come non
|
||
letto e, con le email, con una nuova mail a ogni giro fino all'inizio dell'evento. Ora il job
|
||
ricorda ciò che ha già generato (migration `m23_promemoria_gia_generati`, DD-037). Il difetto
|
||
esisteva dal centro notifiche (`m17`) e si è notato con l'arrivo delle email.
|
||
|
||
### Aggiunto
|
||
|
||
- **Notifiche email** — ogni notifica del centro notifiche in-app (messaggi dello staff,
|
||
promemoria a 24 e 3 ore, turno palloni, sollecito presenze) arriva anche per email
|
||
all'indirizzo Gmail con cui il giocatore si è registrato, gratis e senza aprire porte sul
|
||
router: un worker Docker (`mailer/`) sull'host di casa legge una coda su Supabase (migration
|
||
`m22_notifiche_email`) e invia tramite un account Gmail dedicato. In Profilo → Opzioni c'è
|
||
l'interruttore «Email», acceso di default (DD-036). Migration e worker sono in produzione dal
|
||
29/09/2026; l'interruttore compare con la prossima versione dell'app che lo include. Specifica in
|
||
[notifiche-email.md](modules/notifiche-email.md), installazione e gestione in
|
||
[WORKER_EMAIL.md](WORKER_EMAIL.md).
|
||
|
||
## [1.1.1] - 2026-09-28
|
||
|
||
### Aggiunto
|
||
|
||
- **Keepalive giornaliero** — un Vercel Cron Job chiama `/api/public/keepalive` una volta
|
||
al giorno con una lettura minima, per evitare che il progetto Supabase free tier vada in
|
||
pausa dopo 7 giorni senza richieste API.
|
||
- **Scheda evento** — gli eventi extra-campo (es. cena di squadra) hanno ora una pagina di
|
||
dettaglio propria, come allenamenti e partite, con l'elenco nominativo di chi ha risposto
|
||
presente/assente/forse invece del solo conteggio in card. "Infortunato" non compare più
|
||
tra le opzioni né nei badge/riepiloghi per questi eventi, dato che non è una risposta
|
||
pertinente.
|
||
|
||
### Modificato
|
||
|
||
- **Backup completo** — la cifratura (gpg, `tar.gz.gpg`) è ora il comportamento di default
|
||
invece che opt-in con `--encrypt`, dato che i dump contengono dati sensibili (hash
|
||
password, documenti d'identità); si disattiva con `--no-encrypt`. Aggiunte le istruzioni
|
||
di decompressione nel README.
|
||
|
||
### Corretto
|
||
|
||
- **Squadra** — la card dell'allenatore nella Rosa è collassata come quella dei giocatori
|
||
(nome e ruolo in riga chiusa, data di nascita solo aprendo il dettaglio) invece di
|
||
mostrare subito tutto.
|
||
- **Squadra** — uno scroll verticale veloce nella tab Stats non fa più scattare per errore
|
||
il cambio tab verso Obiettivi.
|
||
- **Turno palloni** — gli eventi generici (es. cena di squadra) non entrano più nel turno
|
||
palloni: niente più proposta automatica, promemoria push o conteggio per eventi che non
|
||
sono allenamenti o partite.
|
||
|
||
## [1.1.0] - 2026-09-27
|
||
|
||
### Aggiunto
|
||
|
||
- **Avviso certificati in scadenza** — in Home, giallo nei 7 giorni prima e nero dopo la
|
||
scadenza del certificato medico. Gli admin vedono i nomi di tutta la rosa (non
|
||
cliccabile); il giocatore interessato vede solo il proprio e il tap apre
|
||
`/profilo?tab=documenti`. Calcolato al volo da `certificato_scadenza`: nessuna migration,
|
||
nessuna push (DD-035).
|
||
|
||
## [1.0.0] - 2026-09-24
|
||
|
||
Prima versione stabile. Oltre al ruolo allenatore riunisce il lavoro fatto dalla 0.9.2:
|
||
centro notifiche in-app, messaggi dell'admin e la nuova Gestione eventi a calendario.
|
||
|
||
### Aggiunto
|
||
|
||
- **Ruolo allenatore** — l'admin registra un allenatore da `/admin` (tipo «Allenatore», con
|
||
l'email Gmail) e lui si collega al primo accesso come i giocatori. Gestisce gli eventi e
|
||
sollecita le presenze; ha un profilo ridotto (dati personali e foto, senza stagione e
|
||
badge), compare in Squadra con la dicitura «Allenatore» e non vede badge né cacche.
|
||
Migration `m20_ruolo_allenatore_enum` e `m21_ruolo_allenatore` (DD-034).
|
||
- **Centro notifiche in-app** — lo storico delle notifiche dentro l'app, indipendente dalla
|
||
push: messaggi dell'admin, promemoria automatici 24 ore e 3 ore prima di un evento, turno
|
||
palloni e sollecito presenze. Ogni notifica si toglie con uno swipe o con la ×. Migration
|
||
`m17_notifiche_utente` (DD-030).
|
||
- **Messaggi dell'admin** — dalla tab Notifiche della dashboard l'admin manda un messaggio
|
||
libero a tutta la squadra o a un solo giocatore; la tab elenca anche chi non ha le
|
||
notifiche attive.
|
||
- **Gestione eventi a calendario** — `/eventi` è una griglia mensile: si tocca un giorno per
|
||
vederne gli eventi e crearne, modificarne o eliminarne uno. Prima di salvare la modifica
|
||
di un evento esistente compare una conferma, come per l'eliminazione.
|
||
- **Backup completo** — uno script scarica schema e dati del database e i file dello
|
||
storage, per poter ripartire se si perde Supabase o Vercel (vedi `PORTABILITA.md`).
|
||
|
||
### Modificato
|
||
|
||
- **Notifiche in-app** — il numero delle non lette è un pallino rosso sull'avatar del
|
||
profilo, al posto della campanella in alto a destra. Toccando il pallino si apre l'elenco
|
||
(leggi ed elimina), toccando l'avatar si va al profilo come prima.
|
||
- **Campionato** — l'header riporta la stagione delle gare CSI (es. «Stagione 2025/26») e lo
|
||
storico partite è diviso per stagione.
|
||
- **Gestione eventi** — tolta la lista "Eventi in calendario": resta solo il calendario
|
||
mensile, che si scorre anche con lo swipe come quello della squadra.
|
||
- **Gestione eventi** — nel form il giorno toccato sul calendario è già fissato: resta da
|
||
scegliere solo l'ora («Cambia» per spostare l'evento in un altro giorno). Il campo
|
||
«Luogo» di un nuovo evento parte vuoto invece che con «Palestra Comunale».
|
||
|
||
### Corretto
|
||
|
||
- **Squadra** — la data di nascita inserita dal proprio Profilo compare a tutta la squadra
|
||
(e nei compleanni del Calendario) invece di «Invalid Date»; allineati anche i profili
|
||
compilati prima della correzione. Migration `m18_nascita_pubblica_giocatori_squadra` e
|
||
`m19_backfill_nascita_da_profili_esistenti` (DD-031).
|
||
- **Squadra** — la rosa non si ricalcola più a ogni render mentre i voti MVP si caricano.
|
||
|
||
## [0.9.2] - 2026-09-10
|
||
|
||
### Aggiunto
|
||
|
||
- **Dashboard amministratore** — nuova tab "Notifiche" che mostra quanti giocatori hanno
|
||
le notifiche push attive e chi sono.
|
||
|
||
### Modificato
|
||
|
||
- **Dashboard amministratore** — le sezioni impilate diventano un menu di tab scorrevole a
|
||
pillole (come Squadra e Campionato); nell'elenco Profili resta aperta una sola scheda
|
||
alla volta.
|
||
- **Profilo** — testi dei campi amministrativi semplificati (label email, rimossa la nota
|
||
su chi vede quei dati).
|
||
|
||
### Rimosso
|
||
|
||
- Le dipendenze e il codice legati all'editor Lovable (login social e reporting errori
|
||
verso l'editor): l'app non ci gira più.
|
||
|
||
## [0.9.1] - 2026-09-10
|
||
|
||
### Modificato
|
||
|
||
- **Storico partite** — ogni scheda mostra il logo accanto al nome di entrambe le squadre
|
||
(CRAP e avversario), risultato e parziali in ordine casa–ospite (verde/rosso restano
|
||
vittoria/sconfitta CRAP) e un chevron a destra per chiarire che la riga apre il dettaglio.
|
||
|
||
## [0.9.0] - 2026-09-09
|
||
|
||
Prima versione pre-release: lo sviluppo precedente non era versionato a parte, quindi
|
||
questa release riunisce tutto ciò che l'app fa oggi in produzione.
|
||
|
||
### Aggiunto
|
||
|
||
- **Gestione squadra** — rosa dei giocatori con ruoli e dati anagrafici di base.
|
||
- **Profilo Giocatore** — dati personali e amministrativi, documento d'identità,
|
||
certificato medico (caricamento, scadenza, stato, download) e foto tessera in
|
||
un'unica schermata, sia lato giocatore sia lato amministratore; lo storico dei
|
||
certificati resta un'estensione futura.
|
||
- **Gestione tesseramenti CSI** — raccolta dei dati richiesti dal CSI, tracciamento di chi
|
||
è già tesserato (numero e data tessera) ed export CSV per il tesseramento.
|
||
- **Calendario** — eventi di allenamento e partita, con schermata di dettaglio dedicata.
|
||
- **Presenze** — conferma o rifiuto della partecipazione a un evento, visibile a tutta la
|
||
squadra al posto di chat e fogli condivisi.
|
||
- **Serie di presenze** — tre serie (presenze, conferme, allenamenti) calcolate sui dati
|
||
reali della rosa.
|
||
- **Scout Live** — un solo referente alla volta registra in tempo reale le azioni di gioco
|
||
durante la partita.
|
||
- **Badge** — gamification con gradi bronzo/argento/oro, badge segreti e badge social
|
||
votati tra compagni.
|
||
- **Pagelle** — voto tra compagni (1-10) a fine partita, con media personale e di squadra.
|
||
- **Votazione MVP** — elezione del migliore in campo della partita tramite voto tra
|
||
compagni, un voto a testa.
|
||
- **Obiettivi di squadra** — traguardi collettivi che avanzano con presenze, risposte alle
|
||
convocazioni, pagelle e risultati di campionato.
|
||
- **Turno palloni** — rotazione condivisa e promemoria di chi porta e riporta i palloni ad
|
||
allenamenti e partite.
|
||
- **Notifiche push** — promemoria intelligenti su un unico opt-in per dispositivo.
|
||
- **Dashboard amministratore** — vista aggregata su tesseramenti, certificati, presenze e
|
||
dati della rosa, con download CSV.
|
||
- **Collegamento CSI** — classifica di campionato e Coppa, storico partite e dettaglio di
|
||
ogni gara (formazioni, storico scontri diretti, probabilità di vittoria calcolata dal
|
||
CSI) letti in tempo reale dal portale ufficiale Livescore CSI Bologna, senza inserimento
|
||
manuale da parte degli amministratori.
|
||
- **Infortuni** — conteggio degli eventi saltati per infortunio, riusando lo stato di
|
||
presenza già registrato per le convocazioni.
|
||
|
||
### Sicurezza
|
||
|
||
- Autenticazione tramite Google via Supabase Auth, unico metodo di accesso; permessi
|
||
differenziati per ruolo (giocatore/amministratore) su tabelle e route.
|