diff --git a/docs/ARCHITECTURE.md b/docs/ARCHITECTURE.md index febec84..563f62b 100644 --- a/docs/ARCHITECTURE.md +++ b/docs/ARCHITECTURE.md @@ -30,6 +30,32 @@ test/ suite di test (unit, integration, end-to-end) docs/ documentazione ufficiale ``` +### File di supporto + +I file che i documenti dei moduli non citano, con il loro scopo: + +| File | Cosa fa | +| ------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `src/routes/__root.tsx` | Radice delle route: meta, viewport (`viewport-fit=cover` per le safe area su iOS) e layout comune | +| `src/routes/benvenuto.tsx` | Ingresso dopo il login: si arriva solo da loggati e con uno slot collegato (DD-011) | +| `src/routes/api/public/keepalive.ts` | Lettura minima chiamata dal Cron di Vercel per evitare la pausa del progetto Supabase free tier | +| `src/routes/api/public/apri-sondaggio.ts` | Avviso «sondaggio pre-partita aperto», lanciato da un admin dalla pagina partita | +| `src/routes/api/public/notifica-personalizzata.ts` | Messaggio push libero a un giocatore o a tutti, con storico in-app (M17) | +| `src/routes/api/public/notifiche-attive.ts` | Elenco dei giocatori con almeno un dispositivo iscritto alle push (solo admin) | +| `src/lib/notifiche-attive.server.ts`, `src/lib/notifiche-admin.ts` | Lato server dell'elenco sopra; hook client dell'elenco e dell'invio push libero | +| `src/lib/eventi-visibili.ts` | Gli eventi che l'utente corrente può vedere (calendario, home, elenco) | +| `src/lib/presenze-mese-core.ts` | Calcolo puro della percentuale di presenze dell'ultimo mese, separato dagli hook | +| `src/lib/error-capture.ts`, `src/lib/error-page.ts` | Cattura dell'errore lato server e pagina di errore statica | +| `src/lib/utils.ts` | `cn()`: unisce classi CSS condizionali risolvendo i conflitti di Tailwind | +| `src/integrations/supabase/types.ts` | Tipi generati dallo schema: non si modificano a mano | +| `src/integrations/supabase/auth-attacher.ts`, `src/integrations/supabase/auth-middleware.ts`, `src/integrations/supabase/client.server.ts` | File generati: il browser allega il token alle chiamate server, il server le autentica; `client.server.ts` ha il client con service role. Non si modificano a mano | +| `src/integrations/supabase/client-nuove-tabelle.ts` | Accesso tipizzato alle tabelle che `types.ts` generato non include ancora | +| `src/components/crapp/Avatar.tsx`, `src/components/crapp/BottomNav.tsx`, `src/components/crapp/BarraSottosezioni.tsx` | Foto del giocatore (con ricarica forzata), barra di navigazione a 4 voci, sottosezioni con pannello animato | +| `src/components/crapp/ProfiloAmministrativo.tsx` | Campi del profilo condivisi tra giocatore e dashboard admin (DD-017) | +| `src/components/crapp/ScoutReport.tsx` | Lettura dello scout di una partita: squadra, set per set, dettaglio per giocatore | +| `src/components/motion/Barra.tsx`, `src/components/motion/Numero.tsx`, `src/components/motion/Reveal.tsx` | Barra di avanzamento a molla, contatore animato, comparsa graduale all'ingresso nel viewport | +| `src/components/ui/drawer.tsx`, `src/components/ui/sonner.tsx` | Le due primitive shadcn in uso (drawer di vaul e toast) | + ## Punti fermi - **Routing**: file-based in `src/routes/`. `src/routeTree.gen.ts` è **generato**, non si diff --git a/docs/decisions/DD-007.md b/docs/decisions/DD-007.md index e47111d..ada1113 100644 --- a/docs/decisions/DD-007.md +++ b/docs/decisions/DD-007.md @@ -1,7 +1,8 @@ # DD-007 — Badge calcolati dall’app, non salvati nel database **Data:** origine progetto -**Stato:** Accettata +**Stato:** Accettata +**Codice:** `src/lib/profili-core.ts` **Contesto** I badge dipendono da statistiche già disponibili (presenze, MVP, cacche, ecc.). Salvare ogni badge sbloccato nel database aggiungerebbe complessità senza beneficio immediato. diff --git a/docs/decisions/DD-011.md b/docs/decisions/DD-011.md index 84de709..d4d3325 100644 --- a/docs/decisions/DD-011.md +++ b/docs/decisions/DD-011.md @@ -1,7 +1,8 @@ # DD-011 — Autenticazione reale prima del profilo amministrativo completo **Data:** agosto 2026 -**Stato:** Accettata +**Stato:** Accettata +**Codice:** `src/lib/auth-route.server.ts`, `src/lib/auth.ts`, `src/lib/crapp-data.ts`, `src/lib/ruoli.ts`, `src/routes/__root.tsx`, `src/routes/benvenuto.tsx`, `supabase/migrations/20260831120000_m4_solo_autenticati.sql`, `supabase/migrations/20260901140000_m6_avatar_giocatori.sql`, `supabase/migrations/20260924120100_m21_ruolo_allenatore.sql` **Contesto** Oggi l’app identifica l’utente con la selezione del giocatore da una lista, senza login. Documenti, certificati e dati personali richiedono sapere _chi_ sta operando e impedire accessi non autorizzati. diff --git a/docs/decisions/DD-013.md b/docs/decisions/DD-013.md index 43d96eb..391cb33 100644 --- a/docs/decisions/DD-013.md +++ b/docs/decisions/DD-013.md @@ -1,7 +1,8 @@ # DD-013 — Portabilità: l’app non deve dipendere da servizi esclusivi **Data:** luglio 2026 -**Stato:** Accettata +**Stato:** Accettata +**Codice:** `src/integrations/supabase/client-nuove-tabelle.ts` **Contesto** La squadra potrebbe voler cambiare hosting, database o fornitore auth in futuro. diff --git a/docs/decisions/DD-017.md b/docs/decisions/DD-017.md index 4ceee4f..2a91176 100644 --- a/docs/decisions/DD-017.md +++ b/docs/decisions/DD-017.md @@ -1,7 +1,8 @@ # DD-017 — L'amministratore può compilare i dati al posto del giocatore **Data:** agosto 2026 -**Stato:** Accettata +**Stato:** Accettata +**Codice:** `src/components/crapp/ProfiloAmministrativo.tsx`, `src/lib/giocatori-squadra.ts`, `src/routes/admin.tsx`, `supabase/migrations/20260831170000_correzione_schema_profili_giocatore.sql`, `supabase/migrations/20260906120000_m11_scritture_per_ruolo.sql` **Contesto** Il modulo Profilo Giocatore era costruito su un confine netto: ognuno scrive solo la propria riga, l'amministratore legge e scarica. Nella pratica quel confine blocca il lavoro che il modulo doveva togliere: se metà squadra non compila i propri dati, l'export per il tesseramento CSI resta incompleto e l'admin torna a chiedere le informazioni in chat — esattamente ciò che CrAPP deve eliminare. Inoltre le docs assegnavano già agli admin la gestione dei dati squadra (nome, cognome, numero, ruolo) e il reset del collegamento all'account (DD-016 regola 2), senza che esistesse una schermata per farlo. diff --git a/docs/decisions/DD-025.md b/docs/decisions/DD-025.md index 67ac8f4..29ef927 100644 --- a/docs/decisions/DD-025.md +++ b/docs/decisions/DD-025.md @@ -1,7 +1,8 @@ # DD-025 — Il promemoria palloni lo manda l'admin, per un evento **Data:** 6 settembre 2026 -**Stato:** Accettata +**Stato:** Accettata +**Codice:** `src/lib/palloni-core.ts`, `src/routes/api/public/promemoria-palloni.ts` **Contesto** `promemoria-palloni` era disegnata per un cron quotidiano: calcolava chi è di turno **oggi** e diff --git a/docs/decisions/DD-028.md b/docs/decisions/DD-028.md index 874ba0a..29e6ae5 100644 --- a/docs/decisions/DD-028.md +++ b/docs/decisions/DD-028.md @@ -1,7 +1,8 @@ # DD-028 — Soglia minima di campione per Media voto e MVP in home **Data:** 9 settembre 2026 -**Stato:** Accettata +**Stato:** Accettata +**Codice:** `src/lib/pagelle.ts` **Contesto** Un audit della sezione «Colpo d'occhio» in home (`index.tsx`, StatTile Presenze/Media diff --git a/docs/decisions/DD-034.md b/docs/decisions/DD-034.md index 75609af..e5d030c 100644 --- a/docs/decisions/DD-034.md +++ b/docs/decisions/DD-034.md @@ -1,7 +1,8 @@ # DD-034 — L'allenatore è uno slot della squadra con tipo diverso, non un giocatore **Data:** 24 settembre 2026 -**Stato:** Accettata (implementata con le migration M20 e M21) +**Stato:** Accettata (implementata con le migration M20 e M21) +**Codice:** `src/components/crapp/EventoCard.tsx`, `src/components/crapp/Pagelle.tsx`, `src/components/crapp/ProfiloAmministrativo.tsx`, `src/components/crapp/PromemoriaPalloni.tsx`, `src/components/crapp/RosaPresenze.tsx`, `src/components/crapp/SondaggioCacche.tsx`, `src/components/crapp/VotazioneMvp.tsx`, `src/components/crapp/VotoSocial.tsx`, `src/lib/auth-route.server.ts`, `src/lib/cacche.ts`, `src/lib/giocatori-squadra.ts`, `src/lib/presenze.ts`, `src/lib/profili-core.ts`, `src/lib/rosa.ts`, `src/lib/ruoli.ts`, `src/lib/user-store.ts`, `src/routes/admin.tsx`, `src/routes/api/public/apri-sondaggio.ts`, `src/routes/eventi.tsx`, `src/routes/index.tsx`, `src/routes/partita.$id.tsx`, `src/routes/profilo.tsx`, `src/routes/squadra.tsx`, `supabase/migrations/20260924120000_m20_ruolo_allenatore_enum.sql`, `supabase/migrations/20260924120100_m21_ruolo_allenatore.sql`, `supabase/migrations/20260929180000_m25_promemoria_solo_giocatori.sql` **Contesto** Serve un account per l'allenatore: deve gestire gli eventi (oggi solo admin, `m11`) ma non è diff --git a/docs/decisions/DD-035.md b/docs/decisions/DD-035.md index 92b49b7..a07fafd 100644 --- a/docs/decisions/DD-035.md +++ b/docs/decisions/DD-035.md @@ -1,7 +1,8 @@ # DD-035 — Avviso certificati: calcolato in Home, visibile solo al titolare e agli admin **Data:** 24 settembre 2026 -**Stato:** Accettata (implementata, versione 1.1.0). La soglia del giocatore è stata alzata a 30 giorni da [DD-041](DD-041.md); quella dello staff resta 7. [DD-046](DD-046.md) aggiunge l'avviso per chi non ha caricato il certificato. +**Stato:** Accettata (implementata, versione 1.1.0). La soglia del giocatore è stata alzata a 30 giorni da [DD-041](DD-041.md); quella dello staff resta 7. [DD-046](DD-046.md) aggiunge l'avviso per chi non ha caricato il certificato. +**Codice:** `src/components/crapp/AvvisoCertificati.tsx`, `src/lib/profili-core.ts`, `src/lib/ruoli.ts` **Contesto** Il certificato medico ha una data di scadenza (`profili_giocatore.certificato_scadenza`), ma diff --git a/docs/decisions/DD-036.md b/docs/decisions/DD-036.md index 4a6db8d..625f067 100644 --- a/docs/decisions/DD-036.md +++ b/docs/decisions/DD-036.md @@ -1,7 +1,8 @@ # DD-036 — Notifiche email via Gmail, da un worker Docker sull'host di casa **Data:** 29 settembre 2026 -**Stato:** Accettata +**Stato:** Accettata +**Codice:** `mailer/mailer-core.ts`, `mailer/mailer.mjs`, `src/lib/preferenze-utente.ts`, `supabase/migrations/20260929120000_m22_notifiche_email.sql` **Contesto** Le notifiche di CrAPP arrivano solo con la push (che dipende da Chrome vivo in background, diff --git a/docs/decisions/DD-039.md b/docs/decisions/DD-039.md index ee48142..e19f19f 100644 --- a/docs/decisions/DD-039.md +++ b/docs/decisions/DD-039.md @@ -1,7 +1,8 @@ # DD-039 — L'allenatore non riceve i promemoria degli eventi **Data:** 29 settembre 2026 -**Stato:** Accettata +**Stato:** Accettata +**Codice:** `supabase/migrations/20260929180000_m25_promemoria_solo_giocatori.sql` **Contesto** DD-034 stabilì che l'allenatore riceve i promemoria a 24 e 3 ore prima di un evento, sempre, convocato diff --git a/docs/decisions/DD-040.md b/docs/decisions/DD-040.md index c0ea9f0..8326a28 100644 --- a/docs/decisions/DD-040.md +++ b/docs/decisions/DD-040.md @@ -1,7 +1,8 @@ # DD-040 — Promemoria con «oggi» o «domani», turno palloni e solleciti automatici **Data:** 30 settembre 2026 -**Stato:** Accettata (implementata: migration `m26`, applicata in produzione il 30 settembre 2026, job, route e test). Il sollecito presenze è poi passato a un solo avviso a 24 ore da [DD-045](DD-045.md). Il turno palloni è poi passato a un solo avviso a 3 ore da [DD-042](DD-042.md). +**Stato:** Accettata (implementata: migration `m26`, applicata in produzione il 30 settembre 2026, job, route e test). Il sollecito presenze è poi passato a un solo avviso a 24 ore da [DD-045](DD-045.md). Il turno palloni è poi passato a un solo avviso a 3 ore da [DD-042](DD-042.md). +**Codice:** `src/lib/palloni-core.ts`, `src/lib/presenze.ts`, `src/routes/api/public/sollecita-presenze.ts`, `supabase/migrations/20260930120000_m26_notifiche_automatiche.sql` **Contesto** Quattro notifiche su sei partivano da un pulsante premuto da un admin (DD-025 per i palloni): se nessuno diff --git a/docs/decisions/DD-041.md b/docs/decisions/DD-041.md index 688ea4f..c1873d5 100644 --- a/docs/decisions/DD-041.md +++ b/docs/decisions/DD-041.md @@ -1,7 +1,8 @@ # DD-041 — Avviso certificati: il giocatore è avvisato un mese prima dello staff **Data:** 1 ottobre 2026 -**Stato:** Accettata (modifica la soglia di [DD-035](DD-035.md) per il solo giocatore) +**Stato:** Accettata (modifica la soglia di [DD-035](DD-035.md) per il solo giocatore) +**Codice:** `src/components/crapp/AvvisoCertificati.tsx`, `src/lib/profili-core.ts` **Contesto** Con DD-035 giocatore e admin vedono l'avviso negli stessi 7 giorni prima della scadenza. Per diff --git a/docs/decisions/DD-042.md b/docs/decisions/DD-042.md index ac911f6..1fc6780 100644 --- a/docs/decisions/DD-042.md +++ b/docs/decisions/DD-042.md @@ -1,7 +1,8 @@ # DD-042 — Turno palloni: un solo avviso, 3 ore prima **Data:** 1 ottobre 2026 -**Stato:** Accettata (migration `m27`, applicata in produzione il 1 ottobre 2026; modifica la parte «turno palloni» di [DD-040](DD-040.md)) +**Stato:** Accettata (migration `m27`, applicata in produzione il 1 ottobre 2026; modifica la parte «turno palloni» di [DD-040](DD-040.md)) +**Codice:** `supabase/migrations/20261001120000_m27_palloni_solo_3h.sql` **Contesto** DD-040 manda l'avviso del turno palloni a 12, 6 e 3 ore prima dell'evento: tre messaggi identici per diff --git a/docs/decisions/DD-043.md b/docs/decisions/DD-043.md index 026c21d..2d8f5c8 100644 --- a/docs/decisions/DD-043.md +++ b/docs/decisions/DD-043.md @@ -1,7 +1,8 @@ # DD-043 — Niente promemoria automatico a 24 e 3 ore prima degli eventi **Data:** 1 ottobre 2026 -**Stato:** Accettata (migration `m28`, applicata in produzione il 1 ottobre 2026; sostituisce il promemoria di +**Stato:** Accettata (migration `m28`, applicata in produzione il 1 ottobre 2026; sostituisce il promemoria di +**Codice:** `supabase/migrations/20261001150000_m28_niente_promemoria_evento.sql` [DD-030](DD-030.md), [DD-037](DD-037.md) e [DD-040](DD-040.md)) **Contesto** diff --git a/docs/decisions/DD-044.md b/docs/decisions/DD-044.md index a82236f..76e9b6f 100644 --- a/docs/decisions/DD-044.md +++ b/docs/decisions/DD-044.md @@ -1,7 +1,8 @@ # DD-044 — Via la foto tessera dal profilo **Data:** 1 ottobre 2026 -**Stato:** Accettata (migration `m29`, applicata in produzione il 1 ottobre 2026) +**Stato:** Accettata (migration `m29`, applicata in produzione il 1 ottobre 2026) +**Codice:** `supabase/migrations/20261001170000_m29_senza_foto_tessera.sql` **Contesto** Il profilo amministrativo chiedeva al giocatore una foto formato tessera (DD-016), per il diff --git a/docs/decisions/DD-045.md b/docs/decisions/DD-045.md index 4ddfd9e..e148951 100644 --- a/docs/decisions/DD-045.md +++ b/docs/decisions/DD-045.md @@ -1,7 +1,8 @@ # DD-045 — Sollecito presenze: un solo avviso automatico, 24 ore prima **Data:** 1 ottobre 2026 -**Stato:** Accettata (migration `m30`, applicata in produzione il 1 ottobre 2026; modifica la parte «sollecito presenze» +**Stato:** Accettata (migration `m30`, applicata in produzione il 1 ottobre 2026; modifica la parte «sollecito presenze» +**Codice:** `supabase/migrations/20261001190000_m30_sollecito_solo_24h.sql` di [DD-040](DD-040.md)) **Contesto** diff --git a/docs/decisions/DD-046.md b/docs/decisions/DD-046.md index 1deb569..a2cac9c 100644 --- a/docs/decisions/DD-046.md +++ b/docs/decisions/DD-046.md @@ -1,7 +1,8 @@ # DD-046 — Avviso certificati: anche chi non l'ha caricato **Data:** 4 ottobre 2026 -**Stato:** Accettata (modifica [DD-035](DD-035.md): il certificato mancante non è più escluso dall'avviso) +**Stato:** Accettata (modifica [DD-035](DD-035.md): il certificato mancante non è più escluso dall'avviso) +**Codice:** `src/components/crapp/AvvisoCertificati.tsx`, `src/lib/profili-core.ts` **Contesto** L'avviso certificati di DD-035 guarda solo la scadenza e salta chi non ha mai caricato il diff --git a/docs/decisions/DD-047.md b/docs/decisions/DD-047.md index 8678cc3..625fa34 100644 --- a/docs/decisions/DD-047.md +++ b/docs/decisions/DD-047.md @@ -1,7 +1,8 @@ # DD-047 — Notifica di compleanno **Data:** 6 ottobre 2026 -**Stato:** Accettata (migration `m31`, non ancora applicata in produzione; nasce dalla issue #11 «notifica») +**Stato:** Accettata (migration `m31`, non ancora applicata in produzione; nasce dalla issue #11 «notifica») +**Codice:** `supabase/migrations/20261006120000_m31_notifica_compleanno.sql` **Contesto** I compleanni si vedono solo aprendo il Calendario, dove `compleanniEventi()` li calcola dalla data di diff --git a/docs/decisions/DD-050.md b/docs/decisions/DD-050.md index f2e8608..c8f87ef 100644 --- a/docs/decisions/DD-050.md +++ b/docs/decisions/DD-050.md @@ -1,7 +1,8 @@ # DD-050 — Avviso a admin e allenatori se una presenza cambia a meno di 6 ore dall'evento **Data:** 8 ottobre 2026 -**Stato:** Implementata per admin e allenatori (migration `m32`, solo admin, applicata in produzione il 9 ottobre 2026; `m33`, anche allenatori) +**Stato:** Implementata per admin e allenatori (migration `m32`, solo admin, applicata in produzione il 9 ottobre 2026; `m33`, anche allenatori) +**Codice:** `supabase/migrations/20261009120000_m32_presenza_modificata.sql`, `supabase/migrations/20261009150000_m33_presenza_modificata_allenatori.sql` **Contesto** Un giocatore può cambiare la risposta a un evento fino all'ultimo minuto. Chi organizza (admin e allenatore) diff --git a/docs/decisions/DD-051.md b/docs/decisions/DD-051.md index 795a49a..7a2ee8e 100644 --- a/docs/decisions/DD-051.md +++ b/docs/decisions/DD-051.md @@ -1,7 +1,8 @@ # DD-051 — Voto MVP definitivo e MVP a pari merito **Data:** 26 ottobre 2026 -**Stato:** Accettata (migration `m35` e `m36`) +**Stato:** Accettata (migration `m35` e `m36`) +**Codice:** `supabase/migrations/20261026150000_m35_voto_mvp_definitivo.sql`, `supabase/migrations/20261026160000_m36_voto_mvp_presenti_e_orario.sql` **Contesto** Il voto MVP si poteva cambiare senza limiti e senza storico (`mvp.md`), e una parità in testa non diff --git a/docs/decisions/DD-052.md b/docs/decisions/DD-052.md index c9f251a..084a17c 100644 --- a/docs/decisions/DD-052.md +++ b/docs/decisions/DD-052.md @@ -1,7 +1,8 @@ # DD-052 — Voto MVP segreto, nome dal database e votazione che si chiude **Data:** 26 ottobre 2026 -**Stato:** Accettata (migration `m37` e `m38`) +**Stato:** Accettata (migration `m37` e `m38`) +**Codice:** `src/lib/mvp-voti.ts`, `supabase/migrations/20261026170000_m37_voto_mvp_segreto_e_chiusura.sql`, `supabase/migrations/20261026180000_m38_nome_votato_badge_social.sql` **Contesto** Dopo DD-051 il voto è definitivo e controllato a database, ma restavano tre difetti: chiunque poteva