Files
CRAPP/docs/CHANGELOG.md
T
davideandClaude Sonnet 5.5 7996dd050e CHANGELOG: la correzione della card evento è parte della 1.4.1
Sposta la voce da «Non rilasciato» alla sezione 1.4.1.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-19 08:31:10 +02:00

24 KiB
Raw Blame History

Changelog

Le modifiche rilevanti di CrAPP sono documentate qui, in ordine di rilascio. Il formato segue Keep a Changelog: 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; 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: 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]

[1.4.1] - 2026-10-19

Gli eventi con dei convocati si vedono solo a loro, e «Rosa e presenze» elenca solo i convocati. Nessuna migration.

Modificato

  • Un evento con dei convocati compare nel Calendario, in Home e nell'elenco eventi solo ai convocati. Admin e allenatori lo vedono sempre; convocati vuoto = visibile a tutti. È un filtro dell'interfaccia: i dati restano leggibili dal database (RLS di eventi_app invariata).

Corretto

  • «Rosa e presenze» di allenamenti, partite ed eventi mostra solo i convocati (prima elencava sempre tutta la rosa, anche se ne era stato convocato uno solo). Il conteggio «Hanno risposto», il pulsante «Sollecita» e il riquadro «La tua risposta» seguono la stessa regola; convocati vuoto resta «tutta la rosa».
  • La card dell'evento (Calendario e Home) conta «presenti/convocati» invece di dividere per tutta la rosa, e i pulsanti di presenza compaiono solo ai convocati: un admin che è anche giocatore ma non è convocato vede l'evento senza poter rispondere. In «Da confermare» (Home) non finiscono più gli eventi a cui non sei convocato.

[1.4.0] - 2026-10-09

Gli admin e gli allenatori vengono avvisati quando una presenza cambia a ridosso di una partita o di un allenamento. Due migration, m32 e m33, entrambe applicate in produzione il 09/10/2026.

Aggiunto

  • Notifica «Presenza modificata» (DD-050) — quando una risposta a una partita o a un allenamento cambia, compare o viene ritirata a meno di 6 ore dall'inizio, gli admin e gli allenatori ricevono una notifica (centro notifiche, push, email) con chi, quale evento e lo stato prima e dopo. Migration m32 (solo admin, applicata in produzione il 09/10/2026) e m33 (aggiunge gli allenatori, applicata il 09/10/2026).

[1.3.1] - 2026-10-06

Il Calendario mostra solo i prossimi compleanni del mese, e le serie di presenze sono due invece di tre: sparisce «Conferme 24h» con i due badge che ne dipendevano. Nessuna migration da applicare.

Modificato

  • Calendario: «Prossimi compleanni» — la sezione in fondo mostra solo i compleanni del mese in corso non ancora passati, non più quelli del mese selezionato nella griglia; se nel mese non ce ne sono, lo dice («Nessun compleanno questo mese»).

Rimosso

  • Serie «Conferme 24h» e badge collegati — la serie non compare più nel profilo, in Home né nelle notifiche di traguardo; restano Allenamenti e Partite. Rimossi anche il badge «Risposta lampo» e il segreto «Mai un forfait», che si basavano su di essa. Nessuna migrazione: la colonna risposto_il resta, inutilizzata.

[1.3.0] - 2026-10-06

Gli auguri di compleanno arrivano da soli, gli obiettivi di squadra si possono toccare per capire come funzionano e le presenze si contano solo sugli eventi a cui si è convocati. In tutta l'app i caratteri sono più grandi e gli avvisi in Home più chiari. La migration m31_notifica_compleanno è da applicare in produzione (npx supabase db push); il resto non tocca il database.

Aggiunto

  • Notifica di compleanno — ogni giorno, dalle 8:00, il festeggiato riceve un messaggio di auguri e tutti gli altri membri attivi, allenatori compresi, il solo avviso «Oggi è il compleanno di …»; con più compleanni lo stesso giorno un solo messaggio a testa. Push, centro notifiche ed email. Il 29 febbraio non è gestito (DD-047, issue #11). Migration m31_notifica_compleanno, da applicare in produzione.
  • Obiettivi cliccabili — toccando un obiettivo (in Squadra o nella card della Home) si apre una card che spiega tutto: come si calcola, cosa conta e cosa no, cosa è una presenza persa, periodo di validità, fonte dei dati, un esempio con numeri. Nessuna migration.

Modificato

  • Obiettivo «90% di presenze del mese» — i posti sono i convocati di ogni partita e allenamento (tutta la rosa se non ce ne sono), come nelle presenze collettive: chi non è convocato non abbassa più la percentuale. Assente, forse, infortunato e nessuna risposta restano presenze perse. Nessuna migration.
  • Obiettivo «Presenze collettive» — sostituisce «250 presenze complessive»: è la percentuale di presenze di tutta la rosa su allenamenti e partite definiti in stagione (passati e futuri, posti = convocati), con target 90%. Nessuna migration.
  • Obiettivo «1 evento di squadra al mese» — si completa quando arriva l'ora dell'evento, non appena viene creato. Un evento futuro non conta finché la sua data e ora non sono passate. Nessuna migration.
  • Avvisi in Home più leggibili — certificati e turno palloni usano lo stesso componente (Avviso): icona propria per ogni caso (non solo il colore), titolo e testo più grandi, elenchi di persone in righe con il dettaglio a destra e il conteggio, freccia dove la card porta ai documenti, comparsa graduale. Il turno palloni ha la pillola «Oggi»/«In arrivo» e i messaggi in riquadri. Solo aspetto: testi e regole di quando compaiono non cambiano. Nessuna migration.
  • Caratteri più grandi in tutta l'app — ogni testo sotto i 16 px sale di un passo (12→13, 14→15, ecc.), nelle card, negli elenchi, nelle statistiche e nei drawer. Restano uguali le barre a pillola dei menu (navigazione in basso e sottosezioni) e i badge minuscoli. Solo aspetto, nessuna migration (DD-049).
  • Etichetta «Cacche» nella rosa — nella scheda del giocatore in Squadra la riga «Cacche/partita» si chiama «Cacche»; il valore resta la media per partita. Nessuna migration.

Rimosso

  • Tessera CSI dalla dashboard — in Profili spariscono il blocco «Tesseramento CSI» (numero e data tessera), il badge «Tesserato»/«Da tesserare» e il riquadro «Tesserati» della tab Squadra. L'export CSV non cambia. Le colonne numero_tessera e data_tessera restano a database, non più usate (DD-048). Nessuna migration.

[1.2.3] - 2026-10-04

Nella Home si vede anche chi non ha caricato il certificato medico, e le dipendenze sono aggiornate perché Vercel bloccava il deploy. Nessuna migration.

Modificato

  • Avviso certificati mancanti — nella Home chi non ha caricato il certificato medico compare in una card rossa: il giocatore vede il proprio avviso, l'admin l'elenco di chi manca, sopra scaduti e in scadenza (DD-046).

Sicurezza

  • Dipendenze aggiornate — @tanstack/react-start dalla 1.168.34 alla 1.168.60 (con react-router, router-plugin e react-query): Vercel bloccava il deploy per la versione precedente. npm audit fix chiude anche le tre vulnerabilità alte di brace-expansion e nanoid; npm audit segnala 0 vulnerabilità.

[1.2.2] - 2026-10-01

Meno notifiche automatiche e un profilo più snello: gli avvisi dei palloni e delle presenze partono una sola volta, il promemoria degli eventi non c'è più, la foto tessera è stata tolta e l'avviso del certificato medico arriva al giocatore un mese prima. Le migration m27–m30 sono applicate in produzione dal 01/10/2026; questa versione porta il codice dell'app che le accompagna, da rilasciare subito: la m29 ha tolto la colonna foto_path che la versione precedente ancora legge.

Rimosso

  • Foto tessera del profilo — il giocatore non la carica più e l'admin non la vede nella scheda; il completamento del profilo si calcola su dati personali (34%), documento (33%) e certificato (33%). Migration m29_senza_foto_tessera (elimina la colonna foto_path); i file già caricati sono stati cancellati dal bucket profili-giocatore (DD-044). Applicata in produzione il 01/10/2026, con la cancellazione dei 4 file già caricati.

  • Promemoria evento a 24 e 3 ore — non partono più per nessun evento (allenamenti, partite, extra-campo): niente notifica, push né email. Migration m28_niente_promemoria_evento (tolti i due job pg_cron; funzione, tipi e notifiche già generate restano). Applicata in produzione il 01/10/2026 (DD-043).

Modificato

  • Sollecito presenze: un solo avviso automatico, 24 ore prima — a chi non ha risposto o ha risposto «forse»; prima ne partivano tre (24, 12 e 6 ore). Il pulsante «Sollecita» non cambia. Migration m30_sollecito_solo_24h, applicata in produzione il 01/10/2026 (DD-045).

  • Turno palloni: un solo avviso, 3 ore prima — a chi deve portare i palloni e a chi li deve prendere; prima ne partivano tre (12, 6 e 3 ore). Migration m27_palloni_solo_3h, applicata in produzione il 01/10/2026 (DD-042).

  • Avviso certificati: giocatore a 30 giorni — il giocatore vede l'avviso giallo sul proprio certificato medico da un mese prima della scadenza (prima 7 giorni). Per gli admin non cambia nulla: 7 giorni prima in giallo, nero dopo la scadenza (DD-041).

[1.2.1] - 2026-09-30

Turno palloni e sollecito presenze partono anche da soli, a orari fissi prima dell'evento, e i testi di tutte le notifiche legate agli eventi sono più formali e completi (DD-040). La migration m26 è applicata in produzione dal 30/09/2026; questa versione porta il codice dell'app che la accompagna.

Aggiunto

  • Turno palloni automatico — 12, 6 e 3 ore prima di allenamenti e partite con un incaricato confermato, all'incaricato («incarico assegnato») e a chi aveva i palloni all'evento precedente («riconsegna»), se è un'altra persona. Se l'incaricato cambia, chi era stato avvisato riceve una sola volta «Turno palloni: incarico revocato». Arriva come push e nel centro notifiche, non per email. Il pulsante «Avvisa chi è di turno» resta.
  • Sollecito presenze automatico — 24, 12 e 6 ore prima dell'evento, ai convocati (o a tutta la rosa attiva se non ce ne sono) che in quel momento non hanno risposto o hanno risposto «forse», mai all'allenatore; chi risponde smette di riceverlo. Un evento creato tardi riceve solo il sollecito della sua fascia. Push, notifica in app ed email. Il pulsante «Sollecita» resta.
  • Migration m26_notifiche_automatiche — tipi di notifica nuovi (turno_palloni_12h, _6h, _3h, turno_palloni_revocato, sollecita_presenze_24h, _12h, _6h), funzioni SQL dei job e due job pg_cron ogni 15 minuti (avvisi-palloni-automatici, solleciti-presenze-automatici), riservati alla service role. Ogni notifica automatica si genera una sola volta per giocatore, evento e tipo, anche se viene eliminata (registro promemoria_eventi_generati). Le fasce sono contigue: un evento creato tardi non riceve tutte le notifiche insieme.
  • Test — nuovo test di integrazione notifiche-automatiche (26 prove) sui job veri del database: finestre, destinatari, doppioni, revoca, code push ed email, permessi, pianificazione, e confronto con i testi e l'ordine del codice TypeScript. Nuovi test unitari di testi, destinatari, date e a capo delle notifiche; aggiornati i test di promemoria, code push ed email, worker e route dei pulsanti.
  • Documentazione — DD-040 in decisions/; sezione «Testi delle notifiche» nel catalogo di modules/notifiche.md; tabella delle funzioni SQL e dei job in DATABASE.md.

Modificato

  • Testi delle notifiche — i promemoria a 24 e 3 ore dicono «domani» se l'evento è domani, «oggi» altrimenti, con data, ora e luogo. Turno palloni e sollecito hanno righe etichettate (Evento, Data, Ora, Luogo, Incarico, Azione). Stessi testi per i pulsanti e per i job. I promemoria già generati non cambiano.
  • Sollecito manuale — il pulsante «Sollecita» ora segue i convocati dell'evento, come l'automatico, invece di tutti i giocatori attivi; il testo dice la risposta attuale e chi lo ha chiesto. Il turno palloni manuale non parte più per email.
  • Turno palloni manuale — senza un incaricato per l'evento non parte più nessun avviso, nemmeno quello di riconsegna, come già descritto nel catalogo.
  • Ordine degli eventi dei palloni — data, poi ora, poi id (prima solo la data): «evento precedente» e «successivo» coincidono con quelli dei job del database.
  • Centro notifiche — le righe del corpo di una notifica vanno a capo.
  • Il sollecito e il turno palloni non sono più descritti come «solo manuali» nel catalogo delle notifiche.

Corretto

  • PROJECT_STATE.md dava m23–m25 come non applicate in produzione: lo sono dal 29/09/2026.

[1.2.0] - 2026-09-29

Le notifiche arrivano su tre canali (push, centro notifiche in-app ed email) e non si ripetono più. Le migration m22–m25 sono già in produzione dal 29/09/2026 e il worker delle email è in funzione; questa versione porta il codice dell'app che le usa.

Aggiunto

  • Notifiche email — ogni notifica del centro notifiche in-app (messaggi dello staff, promemoria a 24 e 3 ore, turno palloni, sollecito presenze, sondaggio pre-partita) 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, con nuovi tentativi in caso di errore e un tetto giornaliero sotto il limite di Gmail. In Profilo → Opzioni c'è l'interruttore «Email», acceso di default, per account (tabella preferenze_utente; DD-036).
  • Push dei promemoria — i promemoria a 24 e 3 ore, che arrivavano solo in-app e per email, partono ora anche come push a tutti i dispositivi iscritti del giocatore. Nascono nel database, che non può firmare una push, quindi la manda lo stesso worker con lo stesso modulo dell'app (migration m24_push_promemoria_e_sondaggio, DD-038). Le iscrizioni scadute vengono eliminate e una push rimasta in coda oltre 3 ore si scarta. Il worker va ricostruito e configurato con le chiavi VAPID dell'app (vedi WORKER_EMAIL.md); senza, manda solo le email.
  • Sondaggio pre-partita nel centro notifiche e per email — prima era solo una push. Ora compare anche tra le notifiche in-app e arriva per email ai giocatori attivi, allenatori esclusi (DD-038).
  • Documentazione e test — nuovo WORKER_EMAIL.md (installazione, gestione, diagnosi, prova in locale, spostamento su un altro host); catalogo delle notifiche in notifiche.md, con cosa le fa partire, a chi arrivano e su quali canali; tabella delle notifiche dell'allenatore in allenatore.md; decisioni DD-036, DD-037, DD-038 e DD-039. Nuovi test di integrazione per la coda delle email, il registro dei promemoria, la coda push, il sondaggio e i destinatari per ruolo (promemoria, messaggio dello staff, sondaggio, sollecito e turno palloni con allenatore e giocatore), più i test unitari del worker.

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.
  • Messaggio del pulsante «Sondaggio» — se nessun dispositivo ha le notifiche attive dice che l'avviso è stato inviato in app e per email, invece di «Nessun dispositivo con le notifiche attive».
  • ops/ fuori da git — il playbook Ansible locale per il backup cifrato non è più tracciato.

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.

[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.