# DD-052 — Voto MVP segreto, nome dal database e votazione che si chiude **Data:** 26 ottobre 2026 **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 leggere da `mvp_voti` chi aveva votato chi; `votato_nome` lo scriveva il client e poteva non corrispondere a `votato_id` (il titolo andava all'id, il nome mostrato era un altro); e la votazione, una volta aperta, non si chiudeva mai. **Decisione** - **Voto segreto.** La lettura diretta di `mvp_voti` è del solo votante (il proprio voto) e degli admin. La squadra legge i conteggi dalla vista `mvp_voti_anonimi`, una riga per voto senza `votante_id` e ordinata per candidato (la sequenza di arrivo non rivela nulla). La vista gira con i permessi del proprietario: è ciò che le permette di leggere tutte le righe senza esporre chi ha votato. Non è leggibile senza account. - **Nome dal database.** Un trigger riempie `votato_nome` da `giocatori_squadra` a partire da `votato_id`, ignorando quello inviato (anche se omesso, vuoto o diverso; e anche quando un admin corregge un voto). Se l'id non è in rosa resta il nome ricevuto. Lo stesso trigger vale per i badge social (`m38`), che avevano lo stesso difetto; le pagelle non hanno un nome del votato. - **Chiusura.** Il voto si apre 2 ore dopo l'inizio della partita e si chiude 24 ore dopo l'apertura (cioè 26 ore dopo l'inizio). A database lo impone `voto_mvp_consentito()`; nell'app `votoMvpChiuso()`. Gli admin restano fuori dal vincolo. - **Tutte le partite.** Il voto vale per ogni evento di tipo partita, amichevoli comprese (invariato). **Alternative scartate** - Filtrare i voti solo nell'app → chi scrive su PostgREST li leggerebbe comunque. - Togliere la lettura anche agli admin → non potrebbero più correggere un voto sbagliato; restano gli unici a poter leggere la tabella, e l'app non mostra a nessuno chi ha votato chi. - Chiudere 24 ore dopo l'inizio della partita (22 ore di voto) → si è scelto 24 ore piene dall'apertura. **Conseguenze** - Le partite già chiuse da più di 26 ore non si votano più: chi non aveva votato perde la possibilità. I voti già dati restano e contano. - I conteggi restano visibili durante la votazione: chi vota può vedere chi è in testa. - Un admin che legge la tabella dal database vede ancora chi ha votato chi. **Riesame** Se si vuole un voto davvero cieco, nascondere i risultati fino alla chiusura (la chiusura a 24 ore lo rende possibile).