Un audit del modulo Obiettivi ha verificato che gli obiettivi non hanno bisogno di pulizia: sono ricalcolati a runtime sull'elenco eventi corrente. Il problema reale era un livello sotto: cancellare un evento lasciava orfane le righe collegate in 8 tabelle (risposte_presenze, cacche_partita, mvp_voti, pagelle_voti, badge_social_voti, turni_palloni, scout_sessioni, scout_live, scout_partite), nessuna con una foreign key verso eventi_app. Aggiunge un trigger AFTER DELETE su eventi_app (migration m14_pulizia_dati_evento_cancellato) invece di una FK con CASCADE, non applicabile per dati storici disallineati (match_id che a volte punta a id Scout/CSI). Verificato con un nuovo test di integrazione contro il database locale; documentato in DESIGN_DECISIONS.md, DATABASE.md, obiettivi-squadra.md, test/README.md e CHANGELOG.md. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
7.3 KiB
7.3 KiB
Changelog
Tutte le modifiche significative del progetto, dalla più recente. Il formato segue
Keep a Changelog e la numerazione
Semantic Versioning: il numero di versione è quello di
package.json.
L'elenco delle funzionalità disponibili e previste non si ripete qui: sta in ROADMAP.md, che elenca il cosa senza numeri di versione — quelli stanno solo qui.
[Non rilasciato] — 0.9.0
Prima versione, pre-release.
Aggiunto
- Login con Google tramite Supabase Auth e collegamento automatico dell'account al proprio
giocatore confrontando l'email (DD-011, DD-018; migration
m5_email_giocatori_squadra): senza sessione non si entra in nessuna schermata. - Dashboard amministratore
/admin: stato dei profili, download di documento, certificato e foto tessera, export CSV per il tesseramento, aggiunta e disattivazione dei giocatori (la riga non viene mai eliminata, così presenze, voti e badge restano agganciati al suo id). - Profilo giocatore: dati anagrafici, documento, certificato medico e foto tessera con le
relative scadenze (migration
m2_profili_giocatore, bucket privato), divisi nelle tab Stagione, Documenti e Opzioni — modules/profilo-giocatore.md. - Tracciamento del tesseramento CSI: numero e data di tessera in
giocatori_squadra, badge e contatore in dashboard (migrationm8_tesseramento_csi). - Foto profilo condivise tra dispositivi tramite il bucket pubblico
avatar-giocatori(migrationm6_avatar_giocatori). - Serie di presenze calcolate sui dati reali (
serieConsecutiva()), con la colonnarisposto_ilche congela l'istante della prima risposta tramite trigger (migrationm9_risposte_presenze_risposto_il): sblocca la serie "Conferme 24h" e i badge "Risposta lampo" e "Mai un forfait" — modules/serie-presenze.md. - Scout Live sincronizzato tra dispositivi: il blocco "chi sta scoutando" passa dalla tabella
scout_sessionie le partite concluse vengono archiviate inscout_partite(migrationm7_scout_partite). Si apre dalla sezione «Scout live» di/partita/$id, solo il giorno della partita, e può usarlo chiunque sia autenticato: uno per volta, grazie al lock. - Votazione MVP legata all'evento CrAPP e non al referto CSI o allo Scout: si apre due ore
dopo
data+oradella partita, anche senza risultato caricato — modules/mvp.md. - Badge Pagellone: la media pagelle conta per il badge solo con almeno
VOTI_MINIMI_PAGELLA(5) voti ricevuti — prima un singolo voto poteva sbloccarlo o farlo sparire senza nessuna significatività statistica — modules/badge.md. - Sondaggio pre-partita aperto dalle 8:00 del giorno della partita fino al fischio d'inizio
(poi resta chiuso, anche nei giorni successivi) e pulsante «Avvisa tutti del sondaggio» per
gli amministratori (
POST /api/public/apri-sondaggio); nessun cron, l'invio è manuale. - Turni palloni con rotazione automatica sulle partite e assegnazione manuale per gli allenamenti, che restano «da assegnare» finché non si sceglie (migration M10).
- Notifiche push con il testo cifrato dentro la push (
aes128gcm, RFC 8291), così arrivano anche ad app chiusa e a schermo bloccato (DD-026). - Collegamento CSI: classifica e risultati ufficiali letti dal portale Livescore CSI Bologna (stagione 2025/26, Open Misto Eccellenza, Girone B) — modules/collegamento-csi.md.
- Note dell'evento visibili in
/allenamento/$ide/partita/$id, con gli a capo mantenuti. - «Segnala un bug» e «Suggerisci una nuova funzionalità» in
/profilo: due link che aprono una issue GitHub sul template giusto, senza tabelle né schermate di gestione. - Interfaccia accessibile: contrasto dei token colore sopra 4.5:1,
viewport-fit=coveretheme-colorcoerenti con un'app chiara,lang="it",:focus-visibleglobale, tocchi da 44px,aria-current/aria-pressed/aria-controls/aria-busy, niente testo sotto i 12px. - Movimento con molle interrompibili di
motional posto delle@keyframesa durata fissa, swipe fra i mesi del calendario e barre di progresso che misurano l'avanzamento tra un traguardo e il successivo (DD-021). - Suite di test in
test/(unit, integration, end-to-end) eseguita con bun e senza nuove dipendenze:npm run testenpm run test:all. - Convenzioni interne: primitive condivise (
Card,Campo,classiInputinui-bits), cache aggiornata consetQueryDatainvece di rileggere il database dopo ogni scrittura, e logica pura estratta insrc/lib/con i suoi test. - Infrastruttura di sviluppo: migrazione da Lovable a sviluppo locale, repository GitHub indipendente, deploy automatico su Vercel.
Modificato
- In Squadra la classifica interna (filtro «Classifica per» + elenco) è sotto i 6 riquadri di Statistiche; la tab «Classifica» è stata rimossa dalla barra delle sottosezioni.
- Tolto l'hint statico "+2 questo mese" dalla StatTile Presenze in home (sezione «Colpo d'occhio»): mostrava un testo fisso, non un dato calcolato.
- La StatTile Media voto in home applica ora la stessa soglia minima di voti del badge
Pagellone (
VOTI_MINIMI_PAGELLA): sotto soglia mostra—invece di una media poco significativa (DD-028). - L'MVP di una partita richiede ora un quorum minimo di 2 voti totali (
VOTI_MINIMI_MVP) oltre al margine netto già richiesto: un solo voto non assegna più la vittoria (DD-028). Alcuni conteggimvpgià mostrati possono scendere per effetto della nuova regola. - Cancellare un evento pulisce ora a cascata, tramite trigger database, tutte le tabelle
collegate (presenze, pagelle, MVP, badge social, turni palloni, scout) invece di lasciarle
come righe orfane (migration
m14_pulizia_dati_evento_cancellato, DD-029). Le righe orfane generate da cancellazioni precedenti a questa migration non vengono bonificate.
Sicurezza
- Migration
m4_solo_autenticati: tolto al ruoloanonl'accesso alle tabelle dell'app (applicata in produzione il 03/09/2026). - I permessi di amministrazione arrivano solo da
user_roles(src/lib/ruoli.ts): senza, basterebbe scegliere il nome giusto per amministrare. - Migration
m11_scritture_per_ruolo: ogni voto è firmato con lo slot collegato all'account (DD-023); il collegamento account → giocatore non è modificabile dal giocatore stesso (DD-016). - Migration
m12_niente_autovoto: i vincolimvp_no_autovotoebadge_social_no_autovotorifiutano l'auto-voto anche a chi scrive direttamente su PostgREST, come già facevapagelle_voti. - Al voto MVP partecipano solo i presenti (o in ritardo) di quell'evento; il filtro è applicativo, non RLS (modules/mvp.md).
- Migration
m13_convocati_e_pagelle_chiuse(DD-027): la policy di M11 supagelle_voti,mvp_votiebadge_social_votiverifica ora anche che votante e votato siano tra i convocati dell'evento, e per le sole pagelle chepagelle_chiusesia falso — prima erano filtri solo applicativi, aggirabili scrivendo direttamente su PostgREST. - La suite copre i rifiuti
401dirichiediAdmin(DD-024), i permessi dibadge_social_votie le deroghe admin di M11, e verifica che un ripensamento non riscrivarisposto_il(trigger dim9).