Documentazione: DD-051 e DD-052, modulo MVP, database e changelog
Voto MVP definitivo, a pari merito, segreto e a tempo; nome del votato dalla rosa. PROJECT_STATE segna che m35-m38 restano da applicare su Supabase (db push rinviato) e il lavoro su feature/gara. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
5fed105850
commit
9d047a6ecd
7 files changed
+194
-53
No files matched your search
@@ -0,0 +1,45 @@
|
||||
# DD-051 — Voto MVP definitivo e MVP a pari merito
|
||||
|
||||
**Data:** 26 ottobre 2026
|
||||
**Stato:** Accettata (migration `m35` e `m36`)
|
||||
|
||||
**Contesto**
|
||||
Il voto MVP si poteva cambiare senza limiti e senza storico (`mvp.md`), e una parità in testa non
|
||||
assegnava l'MVP a nessuno finché non arrivavano altri voti. Con voti modificabili la classifica di una
|
||||
partita poteva ribaltarsi dopo che la squadra l'aveva già vista; e una parità, che a fine serata non si
|
||||
risolve più perché nessuno vota ancora, lasciava la partita senza MVP per sempre.
|
||||
|
||||
**Decisione**
|
||||
|
||||
- **Il voto è definitivo.** Il giocatore lo registra una volta sola per partita. L'interfaccia chiede una
|
||||
conferma prima di inviarlo e non offre più «Cambia voto»; la mutazione è un `INSERT` e un secondo voto
|
||||
viene rifiutato dal vincolo `UNIQUE (match_id, votante_id)`. A database (`m35`) il giocatore ha solo la
|
||||
policy di `INSERT`: `UPDATE` e `DELETE` restano agli admin (policy di M11), che possono correggere un
|
||||
voto sbagliato.
|
||||
- **Una parità in testa dà più MVP.** `mvpPartita()` restituisce tutti i più votati; ognuno conta un
|
||||
titolo in `mvpVintiPerGiocatore()`, e dove si mostra un solo nome per partita (Home, Classifica)
|
||||
i nomi sono uniti («Anna e Bruno»). Il quorum di DD-028 (`VOTI_MINIMI_MVP = 2`) resta: sotto due voti
|
||||
totali nessuno è MVP.
|
||||
|
||||
- **Presenza e orario a database (`m36`).** Il voto MVP richiede, oltre a convocati e non-allenatori, che
|
||||
l'evento sia una partita, che votante e votato siano `presente` o `ritardo` e che siano passate 2 ore
|
||||
dall'inizio. Sta in una funzione dedicata, `voto_mvp_consentito()`, perché `evento_permette_voto()` è
|
||||
condivisa con pagelle e badge social, che non hanno queste regole. Gli admin restano esclusi dai
|
||||
vincoli.
|
||||
|
||||
**Alternative scartate**
|
||||
|
||||
- Lasciare il voto modificabile entro una scadenza → serve una scadenza che non esiste (`mvp.md`,
|
||||
«Evoluzioni possibili») e un cambio di idea tardivo resta possibile.
|
||||
- Spareggio con un criterio automatico (media pagella, presenze) → introduce regole nascoste che i
|
||||
giocatori non vedono; il pari merito è il risultato più semplice da spiegare.
|
||||
|
||||
**Conseguenze**
|
||||
|
||||
- Un voto dato per errore si corregge solo da un admin.
|
||||
- I voti già dati restano, ma le partite con una parità in testa assegnano ora i titoli: i conteggi MVP
|
||||
dei giocatori possono salire (badge «MVP» e «Uomo tie-break» compresi).
|
||||
- Con tre o più pari merito (per esempio tre voti a tre persone diverse) gli MVP sono tre.
|
||||
|
||||
**Riesame**
|
||||
Se i pari merito risultano troppo frequenti, alzare il quorum (DD-028) o introdurre uno spareggio.
|
||||
@@ -0,0 +1,44 @@
|
||||
# DD-052 — Voto MVP segreto, nome dal database e votazione che si chiude
|
||||
|
||||
**Data:** 26 ottobre 2026
|
||||
**Stato:** Accettata (migration `m37` e `m38`)
|
||||
|
||||
**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).
|
||||
@@ -87,6 +87,8 @@ Una decisione sostituita non si cancella: si cambia il suo **Stato** e si rimand
|
||||
| [DD-039](DD-039.md) | Niente promemoria all'allenatore |
|
||||
| [DD-040](DD-040.md) | Palloni e solleciti automatici |
|
||||
| [DD-050](DD-050.md) | Avviso se una presenza cambia a meno di 6 ore dall'evento |
|
||||
| [DD-051](DD-051.md) | Voto MVP definitivo e MVP a pari merito |
|
||||
| [DD-052](DD-052.md) | Voto MVP segreto, nome dal database e chiusura |
|
||||
| [DD-049](DD-049.md) | Caratteri più grandi in tutta l'app |
|
||||
| [DD-048](DD-048.md) | Via la tessera dalla dashboard |
|
||||
| [DD-047](DD-047.md) | Notifica di compleanno |
|
||||
|
||||
Reference in new issue
Block a user