longevity: grafico della progressione con il cambio di versione dichiarato #5

Closed
opened 2026-09-26 12:22:13 +00:00 by Adriano · 5 comments
Owner

COSA: seconda pagina del cliente: andamento degli score per sessione; un marker dove cambia quest_version o model_version (confermato da Nicola il 22/08, spec §6).
FATTO QUANDO: pagina con la serie dagli score congelati, marker visibile, test.

COSA: seconda pagina del cliente: andamento degli score per sessione; un marker dove cambia quest_version o model_version (confermato da Nicola il 22/08, spec §6). FATTO QUANDO: pagina con la serie dagli score congelati, marker visibile, test.
Adriano added the sviluppo label 2026-09-26 12:22:13 +00:00
Adriano added the assegnata:goldrake label 2026-09-26 12:53:28 +00:00
Author
Owner

🤖 goldrake — preso in carico 2026-09-26T12:53:29Z
ramo: lavoro/goldrake · capacità: docker, pubblica, sempre-accesa, systemd

🤖 goldrake — **preso in carico** 2026-09-26T12:53:29Z ramo: `lavoro/goldrake` · capacità: docker, pubblica, sempre-accesa, systemd
Author
Owner

ESITO: richiesta
RIF: gitea:Adriano/InsanityLab-web#5
COSA: analisi (passo 1). Pagina del cliente con l'andamento degli score per sessione e un segno dove cambia la versione del questionario o del modello.
RAMO: lavoro/goldrake-i5 — worktree goldrake:~/lavoro/InsanityLab-web-i5 da af8afeb (#1 incluso). Si fonde in lavoro/goldrake dopo il controllo.

Stato verificato

  • score (lib/longevity/db.ts): righe per sessione con quest_version, model_version; leggiScore (motore/index.ts) prende per ogni elemento la riga con MAX(id) della sessione. Le sessioni checkup hanno quest_version NULL.
  • pages/longevity/io.astro: referto dell'ultima sessione; codice cliente da codicePerUtenteLoggato. /longevity/* è aperto a cliente, trainer, admin (auth.ts RULES).
  • components/longevity/Radar.tsx: colori come costanti esadecimali (recharts vuole attributi SVG), copiati dai token del sito.

Modifiche

  1. Nuovo lib/longevity/progressione.ts: progressioneDi(db, clientCode): PuntoProgressione[], sessioni del cliente in ordine data ASC, id ASC, solo quelle con righe in score. Per sessione: sessioneId, data, tipo, questVersion (null per i check-up), modelVersion, assi: Record<nome, number|null>, macro: Record<nome, number|null>, fitnessAge: number|null — valori da leggiScore, null quando lo stato è insufficiente. Mai un ricalcolo.
    cambioVersione: string | null sul punto: testo del cambio rispetto al punto precedente, se modelVersion è diversa, o se questVersion non nulla è diversa dall'ultima questVersion non nulla vista prima. Es. «questionario v1.0 → v1.1». Primo punto: null.
  2. Nuovo components/longevity/Progressione.tsx (recharts LineChart): una serie per macro-score (PERFORMANCE, ENERGY, RECOVERY), asse X = data, Y 0-100; connectNulls={false} (un valore mancante è un buco, non una linea inventata); una ReferenceLine verticale tratteggiata con etichetta su ogni punto con cambioVersione. Sotto, una tabella per asse (righe = 7 assi, colonne = date, «—» dove null). Colori: solo le costanti già usate in Radar.tsx; serie distinte per tratteggio e spessore, non per colori nuovi.
  3. Nuova pages/longevity/progressione.astro: stesso modello di io.astro (codice da codicePerUtenteLoggato, nessuna query diretta), layout Longevity variante referto. Meno di due punti: messaggio «serve almeno un secondo check-up o questionario per vedere un andamento» e niente grafico.
  4. pages/longevity/io.astro: link «Andamento nel tempo» a /longevity/progressione.

TEST

  • tests/longevity/progressione.test.ts: due questionari (salvaDalForm) e un check-up → tre punti in ordine; valori uguali a leggiScore; asse insufficiente → null; cambioVersione null se le versioni non cambiano; cambio di quest_version (UPDATE diretto in tabella sessioni/score nella fixture) → testo presente; un check-up (quest null) fra due questionari v1.0 non produce un cambio; sessione senza righe in score esclusa.
  • tests/longevity/pagine.test.ts esteso: progressione.astro non contiene .prepare(, usa codicePerUtenteLoggato, non contiene Identity.
  • Tutti i test esistenti verdi (212 in partenza); npx tsc --noEmit -p . 0 errori.

NON TOCCARE

motore, registro, db.ts, anagrafica.ts, auth.ts, API del questionario, styles/longevity.css salvo classi nuove lg-* con i soli colori ammessi dal test di pagine.test.ts, apps/sito/.

ESITO: richiesta RIF: gitea:Adriano/InsanityLab-web#5 COSA: analisi (passo 1). Pagina del cliente con l'andamento degli score per sessione e un segno dove cambia la versione del questionario o del modello. RAMO: lavoro/goldrake-i5 — worktree goldrake:~/lavoro/InsanityLab-web-i5 da af8afeb (#1 incluso). Si fonde in lavoro/goldrake dopo il controllo. ## Stato verificato - `score` (lib/longevity/db.ts): righe per sessione con `quest_version`, `model_version`; `leggiScore` (motore/index.ts) prende per ogni elemento la riga con MAX(id) della sessione. Le sessioni `checkup` hanno `quest_version` NULL. - `pages/longevity/io.astro`: referto dell'ultima sessione; codice cliente da `codicePerUtenteLoggato`. `/longevity/*` è aperto a cliente, trainer, admin (auth.ts RULES). - `components/longevity/Radar.tsx`: colori come costanti esadecimali (recharts vuole attributi SVG), copiati dai token del sito. ## Modifiche 1. Nuovo `lib/longevity/progressione.ts`: `progressioneDi(db, clientCode): PuntoProgressione[]`, sessioni del cliente in ordine data ASC, id ASC, **solo quelle con righe in `score`**. Per sessione: `sessioneId`, `data`, `tipo`, `questVersion` (null per i check-up), `modelVersion`, `assi: Record<nome, number|null>`, `macro: Record<nome, number|null>`, `fitnessAge: number|null` — valori da `leggiScore`, `null` quando lo stato è insufficiente. Mai un ricalcolo. `cambioVersione: string | null` sul punto: testo del cambio rispetto al punto precedente, se `modelVersion` è diversa, o se `questVersion` non nulla è diversa dall'ultima `questVersion` non nulla vista prima. Es. «questionario v1.0 → v1.1». Primo punto: null. 2. Nuovo `components/longevity/Progressione.tsx` (recharts `LineChart`): una serie per macro-score (PERFORMANCE, ENERGY, RECOVERY), asse X = data, Y 0-100; `connectNulls={false}` (un valore mancante è un buco, non una linea inventata); una `ReferenceLine` verticale tratteggiata con etichetta su ogni punto con `cambioVersione`. Sotto, una tabella per asse (righe = 7 assi, colonne = date, «—» dove null). Colori: solo le costanti già usate in Radar.tsx; serie distinte per tratteggio e spessore, non per colori nuovi. 3. Nuova `pages/longevity/progressione.astro`: stesso modello di io.astro (codice da `codicePerUtenteLoggato`, nessuna query diretta), layout `Longevity` variante referto. Meno di due punti: messaggio «serve almeno un secondo check-up o questionario per vedere un andamento» e niente grafico. 4. `pages/longevity/io.astro`: link «Andamento nel tempo» a `/longevity/progressione`. ## TEST - `tests/longevity/progressione.test.ts`: due questionari (salvaDalForm) e un check-up → tre punti in ordine; valori uguali a `leggiScore`; asse insufficiente → null; `cambioVersione` null se le versioni non cambiano; cambio di `quest_version` (UPDATE diretto in tabella `sessioni`/`score` nella fixture) → testo presente; un check-up (quest null) fra due questionari v1.0 **non** produce un cambio; sessione senza righe in `score` esclusa. - `tests/longevity/pagine.test.ts` esteso: progressione.astro non contiene `.prepare(`, usa `codicePerUtenteLoggato`, non contiene `Identity`. - Tutti i test esistenti verdi (212 in partenza); `npx tsc --noEmit -p .` 0 errori. ## NON TOCCARE motore, registro, db.ts, anagrafica.ts, auth.ts, API del questionario, `styles/longevity.css` salvo classi nuove `lg-*` con i soli colori ammessi dal test di pagine.test.ts, `apps/sito/`.
Author
Owner

ESITO: fatto, in attesa di merge
RIF: gitea:Adriano/InsanityLab-web#5
COMMIT: 4cd9110 progressioneDi · 5dc6b85 pagina /longevity/progressione, componente Progressione.tsx, link da io.astro — ramo lavoro/goldrake-i5 (pushato)
PROVA: npx vitest run → 221 passed (212 + 9); tsc 0 errori
CONTROLLO FINALE (Opus): conforme all'analisi; versioni lette dall'ultima riga di score della sessione (coerente con leggiScore).

ESITO: fatto, in attesa di merge RIF: gitea:Adriano/InsanityLab-web#5 COMMIT: 4cd9110 progressioneDi · 5dc6b85 pagina /longevity/progressione, componente Progressione.tsx, link da io.astro — ramo lavoro/goldrake-i5 (pushato) PROVA: npx vitest run → 221 passed (212 + 9); tsc 0 errori CONTROLLO FINALE (Opus): conforme all'analisi; versioni lette dall'ultima riga di score della sessione (coerente con leggiScore).
Author
Owner

Soluzione

Progressione nel tempo: lib/longevity/progressione.ts progressioneDi (con cambioVersione), components/longevity/Progressione.tsx, pages/longevity/progressione.astro, link da io.astro, test progressione.test.ts. Commit 4cd9110, 5dc6b85, merge 6cbb205. Stato: sul ramo lavoro/goldrake (commit 2c9a74f), NON ancora in main né in produzione. PROVA: vitest 259/259, tsc 0 errori, build ok.

**Soluzione** Progressione nel tempo: lib/longevity/progressione.ts progressioneDi (con cambioVersione), components/longevity/Progressione.tsx, pages/longevity/progressione.astro, link da io.astro, test progressione.test.ts. Commit 4cd9110, 5dc6b85, merge 6cbb205. Stato: sul ramo lavoro/goldrake (commit 2c9a74f), NON ancora in main né in produzione. PROVA: vitest 259/259, tsc 0 errori, build ok.
Adriano removed the assegnata:goldrake label 2026-09-26 13:12:25 +00:00
Author
Owner

ESITO: fatto
COSA: in produzione su piattaforme.tielogic.xyz, 2026-09-26 13:17 UTC. main 12b2e91.
PROVA: docker compose up -d --build → container Up; migra() → colonne verifica/verificata_da/verificata_at presenti; registro_test f_ = 24; misure 20 prima e dopo.
BACKUP: /opt/docker/insanitylab-platforms/backup/*-pre-gestionale (sqlite3 .backup, integrity ok).

ESITO: fatto COSA: in produzione su piattaforme.tielogic.xyz, 2026-09-26 13:17 UTC. main 12b2e91. PROVA: docker compose up -d --build → container Up; migra() → colonne verifica/verificata_da/verificata_at presenti; registro_test f_ = 24; misure 20 prima e dopo. BACKUP: /opt/docker/insanitylab-platforms/backup/*-pre-gestionale (sqlite3 .backup, integrity ok).
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: Adriano/InsanityLab-web#5