Calcola davvero le serie di presenze e sblocca badge e obiettivo.
I tre contatori (serieAllenamenti, seriePartite, serieConferme) e streak erano zero fisso in useRosa(): la sezione Serie di presenze del profilo mostrava sempre progresso nullo, i badge legati alla costanza erano impossibili da sbloccare e l'obiettivo Continuita di squadra restava a 0/12. serieConsecutiva() e serieConferme() (src/lib/presenze.ts) derivano le serie dagli eventi passati e da risposte_presenze gia in cache, senza query aggiuntive. Migration m9: nuova colonna risposto_il con l'istante della prima risposta, resa immutabile da un trigger, confrontata con eventi_app.creato_il per le conferme entro 24 ore. Serviva perche aggiornato_il registra l'ultima modifica, quindi chi rispondeva subito e cambiava idea dopo risultava lento. Corregge anche la barra di progresso, che misurava valore/prossimo e tornava indietro a ogni traguardo raggiunto (2/3 = 67%, poi 3/6 = 50%). Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,37 @@
|
||||
-- M9 — Istante della prima risposta alla convocazione (serie "Conferme 24h")
|
||||
--
|
||||
-- La serie "Conferme 24h" del modulo Serie di presenze richiede di sapere quanto tempo
|
||||
-- passa fra la convocazione e la risposta del giocatore. Il primo dato c'è già
|
||||
-- (`eventi_app.creato_il`), il secondo no: `risposte_presenze.aggiornato_il` registra
|
||||
-- l'ULTIMA modifica, quindi un giocatore che risponde subito e poi cambia idea dopo una
|
||||
-- settimana risulterebbe lento. Serve un istante separato, scritto una volta sola.
|
||||
--
|
||||
-- Non è un dato ricostruibile a posteriori: chi risponde prima che questa colonna esista
|
||||
-- non lascia traccia. Le righe già presenti ereditano `aggiornato_il` come miglior
|
||||
-- approssimazione disponibile.
|
||||
|
||||
ALTER TABLE public.risposte_presenze
|
||||
ADD COLUMN risposto_il timestamptz NOT NULL DEFAULT now();
|
||||
|
||||
UPDATE public.risposte_presenze SET risposto_il = aggiornato_il;
|
||||
|
||||
COMMENT ON COLUMN public.risposte_presenze.risposto_il IS
|
||||
'Istante della PRIMA risposta del giocatore per questo evento: non cambia se poi cambia stato. Si confronta con eventi_app.creato_il per la serie "Conferme 24h".';
|
||||
|
||||
-- Il client fa upsert senza questa colonna, quindi un aggiornamento non la tocca. Il
|
||||
-- trigger difende comunque il valore originale da qualsiasi altra scrittura.
|
||||
CREATE OR REPLACE FUNCTION public.blocca_risposto_il()
|
||||
RETURNS trigger
|
||||
LANGUAGE plpgsql
|
||||
SECURITY DEFINER
|
||||
SET search_path = public
|
||||
AS $$
|
||||
BEGIN
|
||||
NEW.risposto_il := OLD.risposto_il;
|
||||
RETURN NEW;
|
||||
END;
|
||||
$$;
|
||||
|
||||
CREATE TRIGGER risposte_presenze_risposto_il_immutabile
|
||||
BEFORE UPDATE ON public.risposte_presenze
|
||||
FOR EACH ROW EXECUTE FUNCTION public.blocca_risposto_il();
|
||||
Reference in New Issue
Block a user