Toglie duplicazioni dalla sezione Implementazione di badge.md

Il bullet MVP ripeteva per intero il meccanismo di voto già documentato in mvp.md
(e con un'imprecisione: l'RLS di m11 non è una barriera contro l'autovoto, impedisce
solo di votare a nome di un altro). Ora rimanda a mvp.md e tiene solo ciò che serve
a capire il badge. Tolto anche il bullet iniziale sui segreti, che ripeteva parola
per parola l'intro della sezione "Elenco badge".

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
2026-09-08 13:44:00 +02:00
co-authored by Claude Sonnet 5
parent c7588c5aa2
commit 8c9cf370e8
+15 -18
View File
@@ -26,10 +26,13 @@ badge assegnati per voto dai compagni.
## Implementazione ## Implementazione
- `badgeDefs`/`badgeSegreti` (`badges.ts`) definiscono ogni badge con una funzione - `badgeDefs`/`badgeSegreti` (`badges.ts`) definiscono ogni badge con una funzione
`valore(g)` e soglie bronzo/argento/oro. Le fonti dato sono solo statistiche indipendenti `valore(g)` e tre soglie bronzo/argento/oro (elenco completo con fonte e soglie di ognuno in
dal ruolo in campo: MVP, media pagelle, turni palloni, presenze, serie, infortuni, "Elenco badge" sotto). Il grado è calcolato da `gradoRaggiunto()`/`statoBadge()`: soglie
ritardi, cacche — **mai** punti/ace/muri dello Scout Live, coerentemente con DD-008. inclusive, vince l'ultima raggiunta o superata. Per la maggior parte dei badge il valore è
- I badge segreti restano nascosti (icona lucchetto) finché non sbloccati. già pronto: `Giocatore` arriva da `useRosa()` con presenze, palloni, serie, infortuni,
ritardi, cacche e media pagelle già calcolati da altri moduli — `badges.ts` si limita a
confrontarli con le soglie. Fanno eccezione, con logica propria descritta sotto, l'MVP e i
badge social.
- **Badge social** (`badge-social.ts`, tabella `badge_social_voti`): 5 categorie fisse per - **Badge social** (`badge-social.ts`, tabella `badge_social_voti`): 5 categorie fisse per
partita ("Compagno affidabile", "Miglior spirito di squadra", "Fair play", "Meme della partita ("Compagno affidabile", "Miglior spirito di squadra", "Fair play", "Meme della
partita", "Cuore del gruppo"), votabili una volta a testa per categoria/partita partita", "Cuore del gruppo"), votabili una volta a testa per categoria/partita
@@ -37,20 +40,14 @@ badge assegnati per voto dai compagni.
database (vincolo `badge_social_no_autovoto`, migration `m12_niente_autovoto`). A database (vincolo `badge_social_no_autovoto`, migration `m12_niente_autovoto`). A
differenza delle [Pagelle](pagelle.md), qui non c'è alcun tentativo di anonimato: differenza delle [Pagelle](pagelle.md), qui non c'è alcun tentativo di anonimato:
`votante_id`/`votato_id` sono entrambi visibili. `votante_id`/`votato_id` sono entrambi visibili.
- **Badge MVP** (`mvp`, in `badgeDefs`): l'unico badge normale la cui fonte dato arriva da - **Badge MVP** (`mvp`, in `badgeDefs`): l'unico badge normale la cui fonte non è un contatore
un'altra tabella di voto invece che da un contatore semplice. Pipeline completa: già pronto ma il risultato della votazione MVP tra compagni — meccanismo di voto (chi vota
1. Ogni giocatore vota l'MVP della partita su `mvp_voti` (`mvp-voti.ts`), un voto per chi, apertura, autovoto, RLS) descritto per intero in [mvp.md](mvp.md), non ripetuto qui.
partita/votante (`upsert` su `match_id,votante_id`), apribile solo 2 ore dopo l'inizio Quello che serve per capire il badge: `mvpVintiPerGiocatore()` (`mvp-voti.ts`) conta, per
match (`votoMvpAperto()`). Autovoto impossibile per due strade indipendenti: RLS di ogni giocatore, quante partite ha vinto con un **vantaggio netto** sul secondo (non il
`m11_scritture_per_ruolo` (`votante_id` legato al proprio `auth.uid()` via totale dei voti ricevuti; in caso di parità la partita non conta per nessuno). `rosa.ts`
`giocatori_squadra`) e `CHECK (votante_id <> votato_id)` a database (`useRosa()`) scrive quel numero in `Giocatore.mvp`, che `badgeDefs` legge con
(`mvp_no_autovoto`, migration `m12_niente_autovoto`). `valore: (g) => g.mvp` e confronta con le soglie 1/3/5 (bronzo/argento/oro).
2. `vincitoriMvp()`/`mvpVintiPerGiocatore()` (`mvp-voti.ts`) contano, per ogni partita, chi
ha ricevuto più voti **con un vantaggio netto** sul secondo: in caso di parità nessun MVP
è assegnato per quella partita. Il conteggio finale per giocatore è il numero di partite
vinte nettamente, non il totale dei voti ricevuti.
3. `rosa.ts` (`useRosa()`) scrive quel numero in `Giocatore.mvp`, che `badgeDefs` legge con
`valore: (g) => g.mvp` e confronta con le soglie 1/3/5 (bronzo/argento/oro).
- `CollezioneBadge.tsx` mostra sbloccati, in progresso, badge social vinti e un contatore di - `CollezioneBadge.tsx` mostra sbloccati, in progresso, badge social vinti e un contatore di
badge segreti ancora da scoprire; `BadgeDrawer.tsx` il dettaglio di un singolo badge; badge segreti ancora da scoprire; `BadgeDrawer.tsx` il dettaglio di un singolo badge;
`CelebrazioneBadge.tsx` l'overlay celebrativo alla prima visualizzazione di un badge nuovo. `CelebrazioneBadge.tsx` l'overlay celebrativo alla prima visualizzazione di un badge nuovo.