Riscrive changelog e roadmap: Keep a Changelog e niente doppia numerazione.
Il changelog aveva sezioni narrative sotto «Versione attuale», che non diceva quale versione, e una «Versione 1.0 — luglio 2026» data per rilasciata mentre il pacchetto è alla 0.9.0 ancora da distribuire. Ora la testa è `[Non rilasciato] — 0.9.0` in formato Keep a Changelog: essendo la prima versione tutto è Aggiunto, con la sola Sicurezza a parte — niente Modificato, Rimosso o Corretto, che presuppongono qualcosa già uscito. La roadmap perde i numeri di versione (1.0, 1.1, 1.2, 2.0) e diventa Fatto / Prossimo / Idee future: numerava per traguardo funzionale mentre il changelog numera i rilasci, e tenere allineate due numerazioni diverse per lo stesso progetto è lavoro che nessuno farà. Le versioni ora stanno solo nel changelog. Nessuna voce persa. Aggiornati i rimandi rimasti indietro: la regola di manutenzione e l'indice in docs/README.md, la citazione «CHANGELOG v1.0.6» e la nota su AI Allenamenti in DESIGN_DECISIONS.md, «la v1.1 è completa» in PROJECT_STATE.md. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
+75
-248
@@ -1,257 +1,84 @@
|
||||
# Changelog
|
||||
|
||||
Tutte le modifiche significative del progetto vengono registrate in questo documento, in
|
||||
ordine dalla più recente. L'elenco delle funzionalità disponibili e previste non si ripete
|
||||
qui: sta in [ROADMAP.md](ROADMAP.md).
|
||||
Tutte le modifiche significative del progetto, dalla più recente. Il formato segue
|
||||
[Keep a Changelog](https://keepachangelog.com/it/1.1.0/) e la numerazione
|
||||
[Semantic Versioning](https://semver.org/lang/it/): il numero di versione è quello di
|
||||
`package.json`.
|
||||
|
||||
## Versione attuale — agosto 2026
|
||||
L'elenco delle funzionalità disponibili e previste non si ripete qui: sta in
|
||||
[ROADMAP.md](ROADMAP.md), che elenca il _cosa_ senza numeri di versione — quelli stanno solo
|
||||
qui.
|
||||
|
||||
### Il voto MVP apre due ore dopo il fischio d'inizio, e vota solo chi c'era
|
||||
## [Non rilasciato] — 0.9.0
|
||||
|
||||
- La votazione non dipende più dal referto CSI né dallo Scout: il pannello ha una sezione sua
|
||||
in `/partita/$id` e si apre due ore dopo `data`+`ora` dell'evento, anche senza risultato
|
||||
caricato.
|
||||
- Votano — e sono votabili — solo i giocatori dati `presente` o `ritardo` a quell'evento.
|
||||
- I voti sono ora legati all'id dell'evento CrAPP: le righe scritte prima con l'id dello
|
||||
scout o della partita CSI restano nel database ma non vengono più lette.
|
||||
Prima versione, pre-release.
|
||||
|
||||
### Tre riletture in meno dopo ogni salvataggio
|
||||
### Aggiunto
|
||||
|
||||
- «Aggiungi giocatore», salvataggio ed eliminazione di una partita scoutata e cambio della
|
||||
foto profilo aggiornavano la cache con `invalidateQueries`, cioè rileggendo tutto dal
|
||||
database. Ora usano `setQueryData` come il resto dell'app: il dato scritto è noto, non
|
||||
serve richiederlo indietro.
|
||||
- Resta una sola eccezione, `scout-live.ts`: lì il lock può essere stato preso da un altro
|
||||
dispositivo, quindi rileggere è l'unico modo per sapere chi ha vinto.
|
||||
- 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](modules/profilo-giocatore.md).
|
||||
- Tracciamento del tesseramento CSI: numero e data di tessera in `giocatori_squadra`, badge e
|
||||
contatore in dashboard (migration `m8_tesseramento_csi`).
|
||||
- Foto profilo condivise tra dispositivi tramite il bucket pubblico `avatar-giocatori`
|
||||
(migration `m6_avatar_giocatori`).
|
||||
- Serie di presenze calcolate sui dati reali (`serieConsecutiva()`), con la colonna
|
||||
`risposto_il` che congela l'istante della **prima** risposta tramite trigger (migration
|
||||
`m9_risposte_presenze_risposto_il`): sblocca la serie "Conferme 24h" e i badge "Risposta
|
||||
lampo" e "Mai un forfait" — [modules/serie-presenze.md](modules/serie-presenze.md).
|
||||
- Scout Live sincronizzato tra dispositivi: il blocco "chi sta scoutando" passa dalla tabella
|
||||
`scout_sessioni` e le partite concluse vengono archiviate in `scout_partite` (migration
|
||||
`m7_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`+`ora` della partita, anche senza risultato caricato — [modules/mvp.md](modules/mvp.md).
|
||||
- Sondaggio pre-partita con apertura programmata alle 8:00 del giorno della partita 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](modules/collegamento-csi.md).
|
||||
- Note dell'evento visibili in `/allenamento/$id` e `/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=cover` e
|
||||
`theme-color` coerenti con un'app chiara, `lang="it"`, `:focus-visible` globale, tocchi da
|
||||
44px, `aria-current`/`aria-pressed`/`aria-controls`/`aria-busy`, niente testo sotto i 12px.
|
||||
- Movimento con molle interrompibili di `motion` al posto delle `@keyframes` a 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 test` e `npm run test:all`.
|
||||
- Convenzioni interne: primitive condivise (`Card`, `Campo`, `classiInput` in `ui-bits`),
|
||||
cache aggiornata con `setQueryData` invece di rileggere il database dopo ogni scrittura, e
|
||||
logica pura estratta in `src/lib/` con i suoi test.
|
||||
- Infrastruttura di sviluppo: migrazione da Lovable a sviluppo locale, repository GitHub
|
||||
indipendente, deploy automatico su Vercel.
|
||||
|
||||
### Il cronometro delle conferme è verificato dai test
|
||||
### Sicurezza
|
||||
|
||||
- `test/integration/scritture.test.ts` controlla ora che un ripensamento non riscriva
|
||||
`risposto_il`, cioè che il trigger di `m9` sia davvero al suo posto: prima il test guardava
|
||||
`aggiornato_il`, che è l'ultima modifica e non alimenta nessuna statistica, quindi restava
|
||||
verde anche senza trigger.
|
||||
- Il calcolo dei destinatari del sollecito presenze esce dalla route ed è ora
|
||||
`destinatariSollecito()` in `src/lib/presenze.ts`, con i suoi test — stesso trattamento già
|
||||
dato ad `avvisiPalloniEvento()` per i palloni.
|
||||
|
||||
### Nessuno si vota da solo
|
||||
|
||||
- L'elenco della votazione MVP non mostra più il votante: prima bastava toccare il proprio
|
||||
nome per eleggersi MVP, e il titolo finiva tra le statistiche come qualsiasi altro.
|
||||
- I vincoli `mvp_no_autovoto` e `badge_social_no_autovoto` (migration `m12_niente_autovoto`)
|
||||
rifiutano l'auto-voto anche a chi scrive direttamente su PostgREST, come `pagelle_voti`
|
||||
faceva già dalla v1.0. Le righe che violavano la regola vengono cancellate dalla migration.
|
||||
|
||||
### La suite copre i conteggi presenze, il calendario e la guardia delle notifiche
|
||||
|
||||
- Nuovi check unitari su `contaPresenzeGiocatore`/`totaliEventiGiocatore` (numeratore e
|
||||
denominatore delle statistiche), su `compleanniEventi`, `convocatiEvento` ed `eventoVuoto`,
|
||||
su `mvpVintiPerGiocatore` e sui rifiuti `401` di `richiediAdmin` (DD-024).
|
||||
- I test dei permessi coprono ora anche `badge_social_voti` e le deroghe
|
||||
«Gli admin gestiscono tutti/e …» introdotte da M11.
|
||||
- Perché servivano modifiche al codice: le funzioni di conteggio presenze leggevano la data
|
||||
di oggi dall'orologio e non erano verificabili — ora accettano `oggi` come parametro,
|
||||
come già facevano le serie; `richiediAdmin` scarta anche i token con segmenti vuoti
|
||||
(`Bearer ..`), che prima arrivavano fino alla chiamata di rete.
|
||||
|
||||
### Le notifiche push arrivano anche ad app chiusa
|
||||
|
||||
- Il testo della notifica viaggia ora cifrato **dentro** la push (`aes128gcm`, RFC 8291)
|
||||
invece di essere recuperato dal service worker con una fetch al risveglio: era quella fetch
|
||||
a non arrivare mai in tempo a telefono bloccato, e la notifica non compariva affatto
|
||||
(DD-026).
|
||||
- Spariscono la route `/api/public/push-messaggio`, la coda `promemoria_push` e
|
||||
`messaggioPalloniOggi()`: esistevano solo per rimediare al payload vuoto.
|
||||
|
||||
### Lo Scout Live si apre dalla pagina della partita
|
||||
|
||||
- Tolto dalla home, era rimasto senza nessun link: `/scout` si raggiungeva solo scrivendo
|
||||
l'URL. Ora la card `ScoutEntry` sta in `/partita/$id`, sezione «Scout live».
|
||||
- Si accende solo se la partita aperta è quella di oggi (nuova prop `eventoId`), altrimenti
|
||||
resta grigia con «Si attiva il giorno della partita». Lock di sessione invariato.
|
||||
- Non è più riservato agli admin: può scoutare chiunque sia autenticato, uno per volta grazie
|
||||
al lock. Sparisce il messaggio «Scout riservato».
|
||||
|
||||
### Il sondaggio pre-partita apre alle 8:00 del giorno della partita
|
||||
|
||||
- Prima era sempre votabile, anche settimane prima: ora la card resta chiusa con l'avviso di
|
||||
apertura e si sblocca alle 8:00 del giorno stesso.
|
||||
- Quando è aperto, gli amministratori hanno nella card il pulsante «Avvisa tutti del
|
||||
sondaggio» (`POST /api/public/apri-sondaggio`), che manda la push a tutti i dispositivi
|
||||
iscritti — stesso meccanismo del sollecito presenze. Nessun cron: l'invio è manuale.
|
||||
|
||||
### Le note dell'evento si leggono aprendolo
|
||||
|
||||
- Il campo Note del form eventi si poteva scrivere ma non lo vedeva nessuno: ora compare
|
||||
nella scheda di `/allenamento/$id` e `/partita/$id`, sotto orario e luogo, con gli a capo
|
||||
mantenuti. Se è vuoto non compare niente.
|
||||
|
||||
### Form eventi: data e ora non sfondano più la card su iOS
|
||||
|
||||
- Lo stesso difetto già corretto sul tesseramento: `Campo` e le classi degli input erano
|
||||
ricopiati identici in tre file, quindi il `min-w-0` aggiunto in `ProfiloAmministrativo`
|
||||
non arrivava né al form «Nuovo evento» né alla dashboard admin. Ora `Campo` e
|
||||
`classiInput` stanno una volta sola in `ui-bits`.
|
||||
- La regola CSS che rende ridimensionabili i controlli nativi copre anche
|
||||
`input[type="time"]`, che nel form eventi sta affiancato alla data in `grid-cols-2`.
|
||||
|
||||
### Profilo: tab Documenti e Opzioni, barra senza scroll
|
||||
|
||||
- L'etichetta nominava lo scopo (il tesseramento CSI) invece del contenuto: dentro ci sono
|
||||
dati personali, documento, certificato medico e foto tessera. Cambia anche la rotta
|
||||
(`/profilo?tab=documenti`): i vecchi link `?tab=tesseramento` aprono la tab Stagione.
|
||||
- «Impostazioni» diventa «Opzioni»: con le quattro etichette accorciate la barra delle
|
||||
sottosezioni ci sta in uno schermo da telefono. Le voci ora si dividono la riga in parti
|
||||
uguali (`grow basis-0`) e tornano a scorrere solo se non ci stanno, quindi vale anche per
|
||||
le barre di Squadra e Classifica.
|
||||
|
||||
### Palloni: allenamenti senza proposta automatica
|
||||
|
||||
- `completaTurni` non assegna più gli allenamenti: restano «da assegnare» finché non si
|
||||
sceglie a mano. Le partite tengono la rotazione. Migration M10 cancella eventuali turni
|
||||
salvati su allenamenti da oggi in poi.
|
||||
|
||||
### Profilo: etichetta notifiche allineata al comportamento
|
||||
|
||||
- L’interruttore in Impostazioni non è più «Notifiche turno palloni»: iscrive il dispositivo
|
||||
a tutte le push (palloni, solleciti) e alle smart in app. Testo e docs aggiornati.
|
||||
- Il widget Home «Completa il tuo profilo» apre direttamente la tab Tesseramento
|
||||
(`/profilo?tab=tesseramento`).
|
||||
|
||||
### Revisione dell'interfaccia: accessibilità, movimento, peso
|
||||
|
||||
- **Contrasto**: `--success`, `--info` e `--training` erano tra 3.3:1 e 3.5:1 con il testo
|
||||
bianco sopra (chip «Presente», «Allenamento», celle del calendario): ora sono sotto la
|
||||
soglia di luminosità che garantisce 4.5:1. I gradi dei badge usavano `text-oro` e
|
||||
`text-argento` su bianco, cioè 1.9:1 e 2.5:1 — praticamente invisibili: nascono i token
|
||||
`--oro-testo`, `--argento-testo`, `--bronzo-testo` per il testo, mentre le versioni chiare
|
||||
restano su sfondi e bordi.
|
||||
- **PWA**: mancava `viewport-fit=cover`, quindi `env(safe-area-inset-bottom)` valeva sempre 0
|
||||
e su iPhone la BottomNav finiva sotto la home bar. `theme-color` e `background_color` erano
|
||||
`#111111` su un'app chiara: barra di stato nera e splash nero prima di una UI bianca.
|
||||
- **`lang="it"`** al posto di `lang="en"`, su un'app interamente in italiano; 404 e schermata
|
||||
d'errore tradotte; anteprima social ripulita dall'immagine Lovable scaduta e da
|
||||
`twitter:site` che puntava a `@Lovable`.
|
||||
- **Tocco e tastiera**: nessun `:focus-visible` era definito (ora c'è una regola globale);
|
||||
chip presenza, filtri e bottoni icona portati a 44px; `aria-current` sulla navigazione,
|
||||
`aria-pressed` sui controlli a stato, `aria-controls` sulle sezioni a tendina, `aria-busy`
|
||||
sui caricamenti. Il testo sotto i 12px è sparito (108 occorrenze).
|
||||
- **Movimento** (DD-021): molle interrompibili di `motion` al posto delle `@keyframes` a
|
||||
durata fissa. `Reveal` compare quando entra davvero nel viewport (prima consumava
|
||||
l'animazione a vuoto sotto la piega); `Barra` anima `scaleX` invece di `width`; `Numero`
|
||||
cambia rotta se il dato cambia a metà conteggio. Il calendario si cambia mese anche con lo
|
||||
swipe, con il punto d'arrivo scelto proiettando la velocità di rilascio.
|
||||
- **Meno dipendenze** (DD-021): rimossi 43 componenti `src/components/ui/` non importati da
|
||||
nessuna parte e ~45 dipendenze (tutti i `@radix-ui/*`, `recharts`, `react-hook-form`,
|
||||
`date-fns`, `embla`, `cmdk`; `zod` resta perché lo usano le route API). Restano `drawer` e
|
||||
`sonner`. Il bundle **non** cala per questo — quel codice era già escluso dal
|
||||
tree-shaking — ma cala la superficie da aggiornare e da controllare: 50 dipendenze dirette
|
||||
diventano 21. Il bundle client cresce di ~42 KB gzip per `motion` (267 → 308 KB).
|
||||
- **Primitiva `Card`**: `rounded-3xl bg-card p-4 shadow-card` era ricopiato a mano 22 volte.
|
||||
- **Tema scuro rimosso** (DD-022): esisteva un blocco `.dark` mai applicato e incoerente.
|
||||
- Tolte le quattro switch di notifica in `/profilo` che erano `defaultChecked` e non facevano
|
||||
niente, e la conferma nativa prima di _cambiare_ la foto profilo (resta su quella che la
|
||||
rimuove, che è irreversibile).
|
||||
- Le celle del calendario con più tipi di evento non usano più un gradiente a fette con
|
||||
un'ombra bianca sul numero per restare leggibili: fondo neutro e un puntino per tipo.
|
||||
|
||||
### Serie di presenze calcolate sui dati reali
|
||||
|
||||
- `serieConsecutiva()` (`src/lib/presenze.ts`) deriva le serie da eventi passati e
|
||||
`risposte_presenze`: prima erano `0` fisso in `useRosa()` e la sezione «Serie di presenze»
|
||||
del profilo era di fatto inerte, insieme ai badge e all'obiettivo «Continuità di squadra»
|
||||
che ne dipendono.
|
||||
- Migration `m9_risposte_presenze_risposto_il`: nuova colonna `risposto_il` con l'istante
|
||||
della **prima** risposta, resa immutabile da un trigger (`aggiornato_il` registrava solo
|
||||
l'ultima modifica, quindi chi rispondeva subito e cambiava idea dopo risultava lento).
|
||||
Confrontata con `eventi_app.creato_il` sblocca finalmente la serie "Conferme 24h" e i badge
|
||||
"Risposta lampo" e "Mai un forfait". Il dato non è ricostruibile all'indietro: vale da qui
|
||||
in avanti (vedi [modules/serie-presenze.md](modules/serie-presenze.md)).
|
||||
- La barra di progresso di una serie ora misura l'avanzamento fra il traguardo raggiunto e il
|
||||
successivo: prima usava `valore/prossimo` e tornava indietro a ogni traguardo (2/3 = 67%,
|
||||
poi 3/6 = 50%).
|
||||
|
||||
### Segnalazioni dal profilo
|
||||
|
||||
- «Segnala un bug» e «Suggerisci una nuova funzionalità» in `/profilo` → Impostazioni: due
|
||||
link che aprono una issue GitHub sul template giusto
|
||||
(`.github/ISSUE_TEMPLATE/bug_report.yml`, `feature_request.yml`). Nessuna tabella e nessuna
|
||||
schermata di gestione: la segnalazione vive su GitHub
|
||||
(vedi [modules/profilo-giocatore.md](modules/profilo-giocatore.md)).
|
||||
|
||||
### Autenticazione e dashboard amministratore (in produzione)
|
||||
|
||||
- Login con Google tramite Supabase Auth (DD-011). Al primo accesso l'account si collega a
|
||||
un giocatore di `giocatori_squadra`, e il collegamento non è più modificabile dal
|
||||
giocatore stesso (DD-016 regola 2).
|
||||
- La selezione libera del giocatore è stata rimossa: `/benvenuto` offre solo l'accesso con
|
||||
Google e senza sessione non si entra in nessuna schermata. Sparita anche la variabile
|
||||
`VITE_AUTH_OBBLIGATORIA` (non serve più) e il pulsante «Cambia giocatore» in `/profilo`.
|
||||
- I permessi di amministrazione arrivano solo da `user_roles` (`src/lib/ruoli.ts`): la lista
|
||||
di nomi in `crapp-data.ts` è stata eliminata, altrimenti bastava scegliere il nome giusto
|
||||
per amministrare.
|
||||
- Migration `m4_solo_autenticati`: toglie al ruolo `anon` l'accesso alle tabelle v1.0.
|
||||
Applicata in produzione il 03/09/2026, dopo aver impostato l'email di tutta la rosa
|
||||
attiva — il login era già l'unica via d'accesso lato app, quindi il collegamento dei
|
||||
singoli account (che resta un processo continuo a ogni login) non era comunque
|
||||
condizionato da questa migration.
|
||||
- Collegamento automatico al proprio giocatore per email (DD-018, migration
|
||||
`m5_email_giocatori_squadra`): niente più scelta manuale da un elenco, `/benvenuto`
|
||||
confronta l'email dell'account Google con `giocatori_squadra.email` e collega da solo.
|
||||
Senza corrispondenza compare solo un messaggio d'errore, con un pulsante per uscire e
|
||||
riprovare con un altro account.
|
||||
- Dashboard admin: nuove azioni "Aggiungi giocatore" (con email opzionale per il
|
||||
collegamento automatico) e "Disattiva/Riattiva giocatore" per chi lascia la squadra — la
|
||||
riga non viene mai eliminata, così presenze, voti, pagelle e badge della stagione restano
|
||||
agganciati al suo id. L'email è anche modificabile dal pannello "Dati squadra" di ogni
|
||||
giocatore già in rosa.
|
||||
- Tracciamento tesseramento CSI (migration `m8_tesseramento_csi`): numero e data di tessera
|
||||
in `giocatori_squadra`, come gli altri campi che gestisce solo l'admin (DD-016/DD-018). La
|
||||
dashboard mostra chi è già tesserato (badge sulla scheda, contatore in "Squadra") e un
|
||||
pannello per registrare numero e data una volta arrivata la tessera dal CSI.
|
||||
- Profilo giocatore: da `/profilo` ognuno compila i propri dati anagrafici e carica
|
||||
documento, certificato medico e foto tessera con le relative scadenze
|
||||
([modules/profilo-giocatore.md](modules/profilo-giocatore.md)).
|
||||
- Nuova schermata `/admin`: stato dei profili della squadra, download di documento,
|
||||
certificato e foto tessera, export CSV per il tesseramento CSI.
|
||||
- Migration `m2_profili_giocatore` (tabella dei profili e bucket privato), additiva.
|
||||
- Dalla dashboard l'amministratore modifica i dati squadra (nome, cognome, numero, ruolo),
|
||||
compila i dati personali al posto di un giocatore e scollega un account da un profilo
|
||||
(DD-017). I file restano esclusi: li carica solo il giocatore. Nessuna migration: le
|
||||
policy di M1 e M2 lo consentivano già.
|
||||
- Foto profilo sincronizzate tra dispositivi: da `/profilo` la foto caricata finisce nel
|
||||
bucket pubblico `avatar-giocatori` (migration `m6_avatar_giocatori`) invece che in
|
||||
`localStorage`, così compare per tutta la squadra e non solo su chi l'ha caricata.
|
||||
L'Avatar mostra numero/iniziali finché la foto non è presente.
|
||||
- Scout Live sincronizzato tra dispositivi: il blocco "chi sta scoutando" ora passa dalla
|
||||
tabella `scout_sessioni` invece che da `localStorage`, quindi due telefoni non possono più
|
||||
prendere il controllo insieme sovrascrivendosi a vicenda. Le partite scoutate concluse
|
||||
vengono archiviate nella nuova tabella `scout_partite` (migration `m7_scout_partite`):
|
||||
prima restavano visibili solo sul telefono di chi aveva chiuso la partita.
|
||||
|
||||
### Test
|
||||
|
||||
- Suite di test in `test/` (unit, integration, end-to-end) eseguita con bun,
|
||||
senza nuove dipendenze: `npm run test` e `npm run test:all`.
|
||||
- Corretto un difetto emerso dai test: una sessione Scout Live con timestamp
|
||||
illeggibile restava bloccata per sempre invece di scadere.
|
||||
|
||||
### Collegamento CSI
|
||||
|
||||
- Classifica e risultati ufficiali letti dal portale Livescore CSI Bologna
|
||||
(stagione 2025/26, Campionato Open Misto Eccellenza, Girone B).
|
||||
- La pagina Campionato non usa più dati dimostrativi.
|
||||
- Dettagli e limiti in [modules/collegamento-csi.md](modules/collegamento-csi.md).
|
||||
|
||||
### Infrastruttura
|
||||
|
||||
- Migrazione completa da Lovable a sviluppo locale.
|
||||
- Configurazione Git.
|
||||
- Repository GitHub indipendente.
|
||||
- Deploy automatico tramite Vercel.
|
||||
- Branch main e develop.
|
||||
|
||||
## Versione 1.0 — luglio 2026
|
||||
|
||||
Prima versione usata dalla squadra. Funzionalità incluse: vedi
|
||||
[ROADMAP.md § Versione 1.0](ROADMAP.md#versione-10--rilasciata).
|
||||
- Migration `m4_solo_autenticati`: tolto al ruolo `anon` l'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 vincoli `mvp_no_autovoto` e `badge_social_no_autovoto`
|
||||
rifiutano l'auto-voto anche a chi scrive direttamente su PostgREST, come già faceva
|
||||
`pagelle_voti`.
|
||||
- Al voto MVP partecipano solo i presenti (o in ritardo) di quell'evento; il filtro è
|
||||
applicativo, non RLS ([modules/mvp.md](modules/mvp.md)).
|
||||
- La suite copre i rifiuti `401` di `richiediAdmin` (DD-024), i permessi di
|
||||
`badge_social_voti` e le deroghe admin di M11, e verifica che un ripensamento non riscriva
|
||||
`risposto_il` (trigger di `m9`).
|
||||
|
||||
@@ -246,7 +246,7 @@ Usare l’AI solo quando riduce lavoro agli admin o migliora concretamente l’e
|
||||
|
||||
**Conseguenze**
|
||||
|
||||
- “AI Allenamenti” è in roadmap v1.2, non v1.1.
|
||||
- “AI Allenamenti” è tra le voci ancora da fare in roadmap.
|
||||
- Ogni proposta AI va valutata con la domanda: _chi risparmia tempo e quanto?_
|
||||
|
||||
**Riesame**
|
||||
@@ -887,7 +887,7 @@ come «da verificare lato hosting»: nei fatti quel promemoria non è mai partit
|
||||
funziona e che nessuno chiama.
|
||||
|
||||
Nel frattempo l'app aveva già il precedente giusto: `apri-sondaggio` è manuale fin dall'inizio
|
||||
(«Nessun cron: l'invio è manuale», CHANGELOG v1.0.6).
|
||||
(«Nessun cron: l'invio è manuale», CHANGELOG).
|
||||
|
||||
**Decisione**
|
||||
Il promemoria lo fa partire un amministratore dal pulsante «Avvisa chi è di turno», dentro il
|
||||
|
||||
+4
-2
@@ -8,7 +8,7 @@ ancora e va **prima documentata** (vedi [DD-002](DESIGN_DECISIONS.md#dd-002--svi
|
||||
|
||||
| Documento | Risponde a |
|
||||
| ------------------------------------------ | ---------------------------------------------------------------------------- |
|
||||
| [ROADMAP.md](ROADMAP.md) | Cosa è fatto e cosa è previsto, versione per versione |
|
||||
| [ROADMAP.md](ROADMAP.md) | Cosa è fatto, cosa è previsto, cosa resta un'idea |
|
||||
| [ARCHITECTURE.md](ARCHITECTURE.md) | Com'è fatta l'app: stack, struttura del codice, flusso di sviluppo |
|
||||
| [DATABASE.md](DATABASE.md) | Quali tabelle esistono, a cosa servono, chi le usa |
|
||||
| [DESIGN_DECISIONS.md](DESIGN_DECISIONS.md) | Perché abbiamo scelto così, cosa abbiamo escluso e quando riaprire la scelta |
|
||||
@@ -30,7 +30,9 @@ Prima di modificare il codice, nell'ordine: questo indice → `ROADMAP.md` → `
|
||||
Ogni informazione ha **una sola casa**, per evitare che le copie divergano:
|
||||
|
||||
- l'elenco delle funzionalità (fatte e previste) sta solo in `ROADMAP.md`;
|
||||
- `CHANGELOG.md` registra _quando_ qualcosa è stato rilasciato, non ripete l'elenco;
|
||||
- `CHANGELOG.md` registra _quando_ qualcosa è stato rilasciato, non ripete l'elenco: segue
|
||||
il formato Keep a Changelog, con il lavoro non ancora rilasciato sotto `[Non rilasciato]`
|
||||
e le voci divise per categoria (Aggiunto, Modificato, Sicurezza…);
|
||||
- il lavoro in corso sta solo in `PROJECT_STATE.md`, che rimanda alla roadmap per il resto;
|
||||
- lo schema del database sta solo in `DATABASE.md`, allineato alle migration in
|
||||
`supabase/migrations/`: una tabella nuova si documenta nella stessa modifica che la crea;
|
||||
|
||||
+12
-19
@@ -1,10 +1,12 @@
|
||||
# Roadmap
|
||||
|
||||
Elenco unico delle funzionalità di CrAPP, fatte e previste. È la fonte di riferimento per
|
||||
il _cosa_: `CHANGELOG.md` registra _quando_ una voce è stata rilasciata,
|
||||
il _cosa_: `CHANGELOG.md` registra _quando_ una voce è stata rilasciata e con quale versione,
|
||||
[PROJECT_STATE.md](../PROJECT_STATE.md) cosa si sta facendo adesso.
|
||||
|
||||
## Versione 1.0 — rilasciata
|
||||
## Fatto
|
||||
|
||||
Tutto quello che è in `main` e finirà nella prima release.
|
||||
|
||||
- [x] Gestione squadra
|
||||
- [x] Calendario
|
||||
@@ -16,32 +18,23 @@ il _cosa_: `CHANGELOG.md` registra _quando_ una voce è stata rilasciata,
|
||||
- [x] Pagelle
|
||||
- [x] Obiettivi di squadra
|
||||
- [x] Notifiche Push (promemoria intelligenti)
|
||||
|
||||
## Versione 1.1
|
||||
|
||||
Le voci spuntate sono in produzione su `main`. I passaggi di attivazione ancora aperti (per
|
||||
esempio il collegamento dei singoli account) stanno in [PROJECT_STATE.md](../PROJECT_STATE.md).
|
||||
|
||||
- [x] Dashboard amministratore
|
||||
- [x] Download CSV dati
|
||||
- [x] Certificati medici — caricamento, scadenza, stato e download; lo storico dei
|
||||
certificati resta un'estensione futura
|
||||
- [x] Gestione tesseramenti CSI — raccolta dati, export CSV e tracciamento di chi è già
|
||||
tesserato (numero e data di tessera)
|
||||
- [x] Dashboard amministratore
|
||||
- [x] Download CSV dati
|
||||
|
||||
## Versione 1.2
|
||||
|
||||
- [ ] Database esercizi
|
||||
- [ ] AI Allenamenti
|
||||
- [ ] Archivio allenamenti
|
||||
|
||||
## Versione 2.0
|
||||
|
||||
- [x] Collegamento CSI (stagione 2025/26)
|
||||
- [x] Classifica automatica
|
||||
- [x] Risultati campionato
|
||||
|
||||
## Prossimo
|
||||
|
||||
- [ ] Calendario ufficiale — i dati delle gare future arrivano già dal feed CSI, la pagina
|
||||
Campionato usa solo quelle giocate
|
||||
- [ ] Database esercizi
|
||||
- [ ] AI Allenamenti
|
||||
- [ ] Archivio allenamenti
|
||||
|
||||
## Idee future
|
||||
|
||||
|
||||
Reference in New Issue
Block a user