La votazione non dipendeva dal tempo ma dal risultato: compariva solo con un referto CSI o uno scout salvato, e chiunque avesse un profilo poteva votare. Ora `votoMvpAperto()` la apre due ore dopo `data`+`ora` dell'evento, il pannello sta in una sezione sua e votano — e sono votabili — solo i presenti (o in ritardo) di quell'evento. I voti passano dall'id scout/CSI a quello dell'evento CrAPP: home e classifica leggono il vincitore tramite la mappa data → evento che avevano già. Le regole sono applicative, non RLS: chi scrive su PostgREST le aggira, come già annotato tra i limiti noti del modulo. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2.5 KiB
2.5 KiB
Modulo — Votazione MVP
Stato: implementato (v1.0)
File principali: src/lib/mvp-voti.ts, src/components/crapp/VotazioneMvp.tsx
Obiettivo
Eleggere il MVP di una partita tramite voto tra compagni, un voto a testa, con vincitore calcolato a runtime.
Dati
Tabella mvp_voti, vincolo UNIQUE (match_id, votante_id) — un solo voto per giocatore per
partita, sovrascrivibile.
match_id è l'id dell'evento CrAPP, non quello del referto CSI né dello Scout: la
votazione non dipende più da nessuna delle due fonti (i voti scritti prima con l'id scout/CSI
restano nel database ma non vengono più letti da nessuna schermata).
Implementazione
- Il pannello sta in
partita.$id.tsxin una sezione sua, sempre presente:votoMvpAperto()lo apreORE_ATTESA_MVP(2) ore dopodata+oradell'evento, prima di allora mostra solo quando aprirà. Nessun legame con il risultato caricato. - Votano e sono votabili solo i presenti di quell'evento (
presenteoritardoinusePresenzeEvento): chi non c'era ha il bottone disabilitato e non compare nell'elenco. useVotaMvp()fa upsertonConflict: match_id, votante_id: il voto è modificabile senza limiti, senza storico.- Nessuno vota sé stesso:
VotazioneMvp.tsxtoglie il votante dall'elenco e il vincolomvp_no_autovoto(migrationm12_niente_autovoto) rifiuta la riga anche a chi scrive direttamente su PostgREST, come già facevapagelle_no_autovotoper le pagelle. conteggioPartita()/vincitoriMvp()richiedono un margine netto: in caso di parità, nessun vincitore viene assegnato per quella partita finché non arrivano altri voti.mvpVintiPerGiocatore()conta una vittoria per ogni partita "vinta" con margine netto; il risultato alimenta il campomvpdelGiocatoreinuseRosa(), mostrato come StatTile nel profilo e in home.
Limiti noti
- Nessuna scadenza o chiusura della votazione: una volta aperta resta aperta indefinitamente.
- Il voto è legato a chi lo scrive: da
m11_scritture_per_ruolola policy impone chevotante_idsia lo slot collegato all'account (DD-023). Su chi viene votato l'unico vincolo è che non sia il votante stesso (mvp_no_autovoto): che votante e votato fossero presenti a quella partita, e che siano passate due ore dall'inizio, restano filtri solo applicativi — chi scrive su PostgREST li aggira. - In caso di parità, nessun MVP viene assegnato per quella partita.
Evoluzioni possibili
- Introdurre una scadenza (es. la votazione si chiude N giorni dopo la partita).