2026-10-01 08:53:38 +02:00
# DD-035 — Avviso certificati: calcolato in Home, visibile solo al titolare e agli admin
**Data:** 24 settembre 2026
2026-11-15 18:55:46 +01:00
**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`
2026-10-01 08:53:38 +02:00
**Contesto**
Il certificato medico ha una data di scadenza (`profili_giocatore.certificato_scadenza` ), ma
oggi ci si accorge che è scaduto solo aprendo la tab Profili di `/admin` : spesso quando il
giocatore è già fuori regola. La richiesta è un avviso in Home, giallo nei 7 giorni prima
della scadenza e nero dopo, con i nomi dei giocatori, che sparisca da solo quando il
certificato viene rinnovato. Specifica completa in
[modules/profilo-giocatore.md ](../modules/profilo-giocatore.md#avviso-certificati ).
**Decisione**
1. L'avviso si **calcola al volo** dalla data già salvata, con una funzione pura in
`profili-core.ts` : nessuna tabella, nessuno stato «avvisato», nessuna migration.
2. Lo vedono **solo gli admin** , con i nomi di tutta la rosa, e **il giocatore interessato** ,
riferito solo a sé. L'allenatore e i compagni non lo vedono.
3. L'avviso dello staff **non è cliccabile** ; quello personale apre
`/profilo?tab=documenti` .
4. Soglia fissa di **7 giorni** in una costante; il giorno della scadenza il certificato vale
ancora (come `statoScadenza()` ).
5. **Niente push** : l'avviso vive solo in Home.
**Alternative scartate**
- Mostrarlo anche all'allenatore → il certificato è un dato sanitario che oggi l'allenatore
non vede (DD-034); servirebbe una funzione `SECURITY DEFINER` apposta per un'informazione
che all'allenatore non serve ad agire.
- Salvare gli avvisi in una tabella o nel centro notifiche (DD-030) → uno stato da tenere
allineato alla data, che si disallinea appena il giocatore corregge la scadenza; calcolarlo
è gratis e sempre giusto.
- Avviso dello staff cliccabile verso `/admin?tab=profili` → l'admin non può caricare il file
al posto del giocatore (DD-017), quindi il tocco non gli farebbe fare nulla in più, e
richiederebbe di aggiungere a `/admin` la lettura della tab dall'URL.
- Mostrare al massimo alcuni nomi e un «e altri N» → a inizio stagione ne scadono molti
insieme ed è proprio lì che l'elenco completo serve.
- Push quotidiana a chi ha il certificato in scadenza → servirebbe un cron, che oggi non
esiste per nessuna push (DD-025), e le push vanno riservate agli eventi importanti
([EFFICIENZA_CLOUD.md ](../EFFICIENZA_CLOUD.md )).
- Includere i certificati mancanti → è un problema diverso (profilo incompleto), già coperto
2026-10-04 14:29:47 +02:00
dal widget «Completa il tuo profilo» e dalla tab Profili. _Superata da [DD-046 ](DD-046.md ):
anche i mancanti hanno un avviso, rosso._
2026-10-01 08:53:38 +02:00
**Conseguenze**
- Nessuna query nuova: si riusa `useProfili()` , già in cache per Profilo e `/admin` , e le RLS
esistenti decidono quanti profili arrivano (tutti all'admin, il proprio al giocatore).
- Il rinnovo non richiede nessuna azione di chiusura: cambiata la data, l'avviso si aggiorna
da solo.
- Chi non apre l'app non viene avvisato: l'avviso raggiunge solo chi entra in Home.
2026-10-01 14:21:25 +02:00
- ~~Un admin che è anche giocatore vede solo l'avviso dello staff~~ → superato da DD-041: vede anche il proprio avviso personale.
2026-10-01 08:53:38 +02:00
**Riesame**
Se gli avvisi in Home non bastano (certificati che scadono comunque senza essere rinnovati),
valutare una push, legata a un cron o a un invio manuale dell'admin come per i palloni. Se 7
giorni si rivelano pochi per prenotare una visita, alzare la costante o renderla regolabile.