From ea9f17e8d28390a695ea798ac92694f620a2330e Mon Sep 17 00:00:00 2001 From: Davide Grilli Date: Sun, 6 Sep 2026 23:23:35 +0200 Subject: [PATCH] Riscrive changelog e roadmap: Keep a Changelog e niente doppia numerazione. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 --- PROJECT_STATE.md | 6 +- docs/CHANGELOG.md | 323 +++++++++------------------------------ docs/DESIGN_DECISIONS.md | 4 +- docs/README.md | 6 +- docs/ROADMAP.md | 31 ++-- 5 files changed, 96 insertions(+), 274 deletions(-) diff --git a/PROJECT_STATE.md b/PROJECT_STATE.md index 6f3d626..643c901 100644 --- a/PROJECT_STATE.md +++ b/PROJECT_STATE.md @@ -134,9 +134,9 @@ collega uno slot lo occupa anche in produzione, e va liberato da un admin. ## Prossimo sviluppo -Niente di assegnato: la v1.1 è completa, tesseramento CSI incluso (numero e data di tessera -registrabili da `/admin`, migration `m8_tesseramento_csi`). Le voci ancora aperte stanno in -[docs/ROADMAP.md](docs/ROADMAP.md). +Niente di assegnato: tutto quello che era in lavorazione è chiuso, tesseramento CSI incluso +(numero e data di tessera registrabili da `/admin`, migration `m8_tesseramento_csi`). Le voci +ancora aperte stanno in [docs/ROADMAP.md](docs/ROADMAP.md), sotto «Prossimo». --- diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index 19c65c9..16be79f 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -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`). diff --git a/docs/DESIGN_DECISIONS.md b/docs/DESIGN_DECISIONS.md index 93e80d6..1576cdf 100644 --- a/docs/DESIGN_DECISIONS.md +++ b/docs/DESIGN_DECISIONS.md @@ -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 diff --git a/docs/README.md b/docs/README.md index e497e96..e1bb1c8 100644 --- a/docs/README.md +++ b/docs/README.md @@ -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; diff --git a/docs/ROADMAP.md b/docs/ROADMAP.md index 22971b6..9fff202 100644 --- a/docs/ROADMAP.md +++ b/docs/ROADMAP.md @@ -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