Messaggio di fine partita, test a inizio stagione e documenti di stato

Il messaggio dopo «Fine partita» dice solo «Partita salvata» (il voto MVP apre 2 ore dopo
l'inizio, non dipende dallo scout). I due test che pretendevano una gara CSI già giocata
tollerano l'inizio stagione (uno si salta). «Calendario ufficiale» passa in «Fatto» nella
roadmap; PROJECT_STATE conta le migration fino alla m39.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
davideandClaude Sonnet 5.5 committed 2026-11-02 08:49:57 +01:00
1 parent ebafb98b32
commit 252e1528f6
5 files changed
+20 -19

No files matched your search

+7 -7
View File
@@ -1,6 +1,6 @@
# Project State # Project State
Ultimo aggiornamento: 26/10/2026 Ultimo aggiornamento: 02/11/2026
Questo file dice **a che punto siamo ora**. Le funzionalità stanno in Questo file dice **a che punto siamo ora**. Le funzionalità stanno in
[docs/ROADMAP.md](docs/ROADMAP.md), i rilasci in [docs/CHANGELOG.md](docs/CHANGELOG.md), lo [docs/ROADMAP.md](docs/ROADMAP.md), i rilasci in [docs/CHANGELOG.md](docs/CHANGELOG.md), lo
@@ -21,11 +21,11 @@ schema in [docs/DATABASE.md](docs/DATABASE.md), le procedure in
[docs/CHANGELOG.md](docs/CHANGELOG.md). [docs/CHANGELOG.md](docs/CHANGELOG.md).
- **Backend:** Supabase proprietario (`kfkcldwncxqaixetsjes`). Lovable Cloud e il vecchio - **Backend:** Supabase proprietario (`kfkcldwncxqaixetsjes`). Lovable Cloud e il vecchio
Project Ref `hetycilxgkdmccelwerq` non si usano più. Project Ref `hetycilxgkdmccelwerq` non si usano più.
- **Migration:** 49 file in `supabase/migrations/`, fino a `m38_nome_votato_badge_social`. In produzione - **Migration:** 50 file in `supabase/migrations/`, fino a `m39_scout_valutazioni`. In produzione
sono applicate 45 su 49, fino alla `m34_link_maps_evento` (verificato con sono applicate 45 su 50, fino alla `m34_link_maps_evento` (verificato con
`npx supabase migration list --linked` il 26/10/2026: le uniche mancanti sono `m35`-`m38`, nessuna `npx supabase migration list --linked` il 26/10/2026: le uniche mancanti sono `m35`-`m39`, nessuna
migration remota è assente dal repository). **Da applicare ancora: `m35`-`m38`** migration remota è assente dal repository). **Da applicare ancora: `m35`-`m39`**
(voto MVP e badge social, DD-051 e DD-052, branch `feature/gara`): `npx supabase db push` è rinviato (voto MVP e badge social, DD-051 e DD-052, valutazioni dello scout, DD-053; branch `feature/gara`): `npx supabase db push` è rinviato
per scelta, non è stato eseguito. Vanno applicate subito prima del rilascio del codice: con le sole per scelta, non è stato eseguito. Vanno applicate subito prima del rilascio del codice: con le sole
migration il voto MVP dell'app in produzione (1.4.2) smette di funzionare, con il solo codice la migration il voto MVP dell'app in produzione (1.4.2) smette di funzionare, con il solo codice la
vista dei conteggi non esiste. vista dei conteggi non esiste.
@@ -38,7 +38,7 @@ schema in [docs/DATABASE.md](docs/DATABASE.md), le procedure in
- **Lavoro in corso:** branch `feature/gara` per le funzioni di gara (correzioni e nuove - **Lavoro in corso:** branch `feature/gara` per le funzioni di gara (correzioni e nuove
funzioni; in futuro anche lo scouting). Primo lavoro: il voto MVP definitivo, segreto, a tempo e funzioni; in futuro anche lo scouting). Primo lavoro: il voto MVP definitivo, segreto, a tempo e
tra presenti, con i pari merito (DD-051, DD-052). Poi lo scout live ridotto alle valutazioni − / + tra presenti, con i pari merito (DD-051, DD-052). Poi lo scout live ridotto alle valutazioni − / +
per set (DD-053), salvate subito su database. Migration `m39` da applicare in produzione. Non ancora in `main`, non rilasciato, versione per set (DD-053), salvate subito su database. Non ancora in `main`, non rilasciato, versione
invariata. Le altre voci aperte stanno in [docs/ROADMAP.md](docs/ROADMAP.md), sotto «Prossimo». invariata. Le altre voci aperte stanno in [docs/ROADMAP.md](docs/ROADMAP.md), sotto «Prossimo».
## Cose da sapere ## Cose da sapere
+2 -2
View File
@@ -34,6 +34,8 @@ Tutto quello che è rilasciato, fino alla versione 1.0.0 (vedi `CHANGELOG.md`).
- [x] Collegamento CSI (stagione 2026/27) - [x] Collegamento CSI (stagione 2026/27)
- [x] Classifica automatica (campionato e Coppa) - [x] Classifica automatica (campionato e Coppa)
- [x] Risultati campionato - [x] Risultati campionato
- [x] Calendario ufficiale — le gare future del feed CSI compaiono già nella pagina Campionato:
a inizio stagione il calendario c'è prima dei risultati
- [x] Dettaglio partita — formazioni, storico scontri diretti e probabilità di vittoria - [x] Dettaglio partita — formazioni, storico scontri diretti e probabilità di vittoria
calcolata dal CSI calcolata dal CSI
- [x] Ruolo allenatore — gestisce gli eventi e sollecita le presenze, profilo ridotto senza - [x] Ruolo allenatore — gestisce gli eventi e sollecita le presenze, profilo ridotto senza
@@ -54,8 +56,6 @@ Tutto quello che è rilasciato, fino alla versione 1.0.0 (vedi `CHANGELOG.md`).
## Prossimo ## Prossimo
- [ ] Calendario ufficiale — i dati delle gare future arrivano già dal feed CSI, la pagina
Campionato usa solo quelle giocate
- [ ] Database esercizi - [ ] Database esercizi
- [ ] AI Allenamenti - [ ] AI Allenamenti
- [ ] Archivio allenamenti - [ ] Archivio allenamenti
+1 -1
View File
@@ -330,7 +330,7 @@ function ScoutBoard({
toast.error("Salvataggio non riuscito, riprova"); toast.error("Salvataggio non riuscito, riprova");
return; return;
} }
toast.success("Partita salvata: ora la squadra può votare l'MVP"); toast.success("Partita salvata");
finito.current = true; finito.current = true;
void cancella.mutateAsync(partita.id); void cancella.mutateAsync(partita.id);
onFine(); onFine();
+2 -4
View File
@@ -62,10 +62,8 @@ try {
const csi = (await json(res)) as DatiCsi; const csi = (await json(res)) as DatiCsi;
const noi = csi.classifica.find((r) => isNostraSquadra(r.squadra)); const noi = csi.classifica.find((r) => isNostraSquadra(r.squadra));
assert.ok(noi, "la nostra squadra arriva dal portale"); assert.ok(noi, "la nostra squadra arriva dal portale");
assert.ok( // A inizio stagione il calendario c'è ma nessuna gara è ancora stata giocata.
csi.partite.some((p) => p.setNostri !== null), assert.ok(csi.partite.length > 0, "le gare della stagione arrivano dal portale");
"ci sono risultati giocati",
);
const html = await pagina("/classifica"); const html = await pagina("/classifica");
assert.match(titolo(html), /Classifica campionato/); assert.match(titolo(html), /Classifica campionato/);
+8 -5
View File
@@ -124,9 +124,13 @@ try {
assert.ok(Date.now() - t0 < 2_000, "risposta immediata"); assert.ok(Date.now() - t0 < 2_000, "risposta immediata");
}); });
await provaCsi( // A inizio stagione il calendario c'è ma nessuna gara è ancora stata giocata: il test
"GET /api/public/csi-partita/$id restituisce formazioni e precedenti", // del dettaglio non ha un bersaglio e si salta, come per il portale non raggiungibile.
async () => { const nomeDettaglio = "GET /api/public/csi-partita/$id restituisce formazioni e precedenti";
if (csiRaggiungibile && !partiteGiocate(csi?.partite ?? [])[0]) {
salta(nomeDettaglio, "nessuna gara ancora giocata nella stagione");
} else
await provaCsi(nomeDettaglio, async () => {
const primaGiocata = partiteGiocate(csi?.partite ?? [])[0]; const primaGiocata = partiteGiocate(csi?.partite ?? [])[0];
assert.ok(primaGiocata, "serve almeno una gara giocata per testare il dettaglio"); assert.ok(primaGiocata, "serve almeno una gara giocata per testare il dettaglio");
const res = await fetch(url(`/api/public/csi-partita/${primaGiocata.id}`)); const res = await fetch(url(`/api/public/csi-partita/${primaGiocata.id}`));
@@ -147,8 +151,7 @@ try {
const secondo = await fetch(url(`/api/public/csi-partita/${primaGiocata.id}`)); const secondo = await fetch(url(`/api/public/csi-partita/${primaGiocata.id}`));
assert.equal(secondo.status, 200); assert.equal(secondo.status, 200);
assert.ok(Date.now() - t0 < 2_000, "seconda chiamata dalla cache: risposta immediata"); assert.ok(Date.now() - t0 < 2_000, "seconda chiamata dalla cache: risposta immediata");
}, });
);
await provaCsi( await provaCsi(
"GET /api/public/csi-partita/$id con un id davvero inesistente risponde 503, non rompe", "GET /api/public/csi-partita/$id con un id davvero inesistente risponde 503, non rompe",