longevity: conferma delle misure fuori range dal gestionale #7
Reference in New Issue
Block a user
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
COSA: spec §9: le misure con fuori_range=1 non entrano nello score finché qualcuno non le conferma. La colonna di conferma non esiste; calcolaSessione (motore/index.ts) le esclude sempre.
FATTO QUANDO: il trainer conferma o scarta una misura marcata; la conferma ricalcola la sessione; test.
🤖 goldrake — preso in carico 2026-09-26T12:53:29Z
ramo:
lavoro/goldrake· capacità: docker, pubblica, sempre-accesa, systemdESITO: richiesta
RIF: gitea:Adriano/InsanityLab-web#7
COSA: analisi (passo 1). Verifica delle misure fuori range: confermata (entra nello score) o scartata; migrazione dello schema; ricalcolo. Parte libreria + API; il pulsante nella scheda cliente arriva con le pagine del gestionale (#2).
RAMO: lavoro/goldrake-i7 — worktree goldrake:~/lavoro/InsanityLab-web-i7 da
af8afeb.Stato verificato
misure.fuori_range(lib/longevity/db.ts) marcato daregistraMisure(misure.ts);misureValideAlla(motore/index.ts) filtrafuori_range = 0; commento lì rimanda a questa issue.CREATE TABLE IF NOT EXISTSnon aggiunge colonne a una tabella esistente → serve una migrazione vera (commento suscorein db.ts descrive la stessa trappola).leggiScorelegge per ogni elemento la riga con MAX(id) della sessione: un ricalcolo che aggiunge righe ascoresostituisce il referto senza cancellare la storia.Modifiche
db.ts: inSCHEMA_LONGEVITY, tabellamisure, tre colonne:verifica TEXT CHECK (verifica IN ('confermata','scartata')),verificata_da TEXT,verificata_at TEXT. Nuova funzione privatamigra(db)chiamata increateLongevityDbdopo lo schema:PRAGMA table_info(misure),ALTER TABLE misure ADD COLUMN ...per ogni colonna assente. Idempotente. Commento: perché serve (il DB di produzione esiste dal 03/09).motore/index.tsmisureValideAlla: filtro(m.fuori_range = 0 OR m.verifica = 'confermata'); aggiornare il commento (la conferma ora esiste).misure.ts:misureDaVerificare(db, clientCode):fuori_range = 1 AND verifica IS NULL, conid,test_id, etichetta dal registro,valore_num,unita, range min/max, data della sessione; ordine data DESC.verificaMisura(db, { misuraId, esito: 'confermata'|'scartata', operatore })→{ ok: true; sessioniRicalcolate: number[] } | { ok: false; errore }. Rifiuta: misura inesistente,fuori_range = 0, già verificata. Transazione: UPDATE (esito, operatore,datetime('now')); solo seconfermata:salvaScore(db, id, calcolaSessione(db, id))per la sessione della misura e per ogni sessione successiva dello stesso cliente (data > D OR (data = D AND id > S)), perché anche quelle ereditano la misura tramitemisureValideAlla.scartatanon ricalcola niente.pages/api/longevity/gestionale/verifica.tsPOST (form):misura_id,esito.operatore=locals.user.username. Il codice cliente del redirect si legge dal DB (la misura), mai dal corpo. Esito: 303 a/longevity/gestionale/cliente/<code>?verificata=<esito>; errore: 303 alla stessa pagina con?errore=<testo>; misura inesistente: 404 JSON.TEST (
tests/longevity/verifica-misure.test.ts)misurevecchia (senza le tre colonne) e una riga →createLongevityDb(path)→ colonne presenti, riga intatta; seconda apertura senza errori.leggiScoredella sua sessione cambia; una sessione successiva senza quel test ne eredita il valore e viene ricalcolata;sessioniRicalcolatele elenca.score.ok:false, nessuna scrittura.canAccessPath('cliente', '/api/longevity/gestionale/verifica')false; trainer true.NON TOCCARE
anagrafica.ts, auth.ts, registro.ts, motore/fisici.ts, pagine
.astro,lib/longevity/gestionale.ts(lo sta scrivendo un altro agente su un altro ramo),apps/sito/.ESITO: fatto (libreria + API), in attesa di merge
RIF: gitea:Adriano/InsanityLab-web#7
COMMIT:
f096807schema + migra() ·922ab40verificaMisura, misureDaVerificare, POST /api/longevity/gestionale/verifica — ramo lavoro/goldrake-i7 (pushato)PROVA: npx vitest run → 219 passed (212 + 7), migrazione provata su file temporaneo con la vecchia tabella misure; tsc 0 errori
CONTROLLO FINALE (Opus): conforme all'analisi.
MANCA: pulsanti Conferma/Scarta nella scheda cliente (pagine di #2, 2b, usano oggi misureFuoriRange: da passare a misureDaVerificare dopo il merge). Al primo avvio in produzione migra() aggiunge 3 colonne al longevity.db esistente: backup del file prima del deploy.
ESITO: richiesta
RIF: gitea:Adriano/InsanityLab-web#7, #8, #2
COSA: analisi (passo 1). Collegare alla scheda cliente del gestionale la verifica dei fuori range (#7) e la creazione dell'accesso (#8). Ramo lavoro/goldrake a
6cbb205(merge di #5, #7, #8 sopra la 2b di #2; 257 test verdi, build ok).Stato verificato
apps/platforms/src/pages/longevity/gestionale/cliente/[code].astro: sezione fuori range letta conmisureFuoriRange(lib/longevity/gestionale.ts:148), senza id misura né azioni; mostra?salvato,?fuori,?errore; nessun link all'accesso.lib/longevity/misure.tsmisureDaVerificare(db, code): stesse misure ma solo quelle non ancora verificate, conid,range_min,range_max.pages/api/longevity/gestionale/verifica.tsPOST formmisura_id,esito(confermata|scartata) → 303 alla scheda con?verificata=<esito>o?errore=<testo>.pages/longevity/gestionale/cliente/[code]/accesso.astroesiste (#8); nessuna pagina ci porta.misureFuoriRangeha un solo chiamante (la scheda) e un test (tests/longevity/gestionale.test.ts:128-143).Modifiche
[code].astro:a. sezione fuori range da
misureDaVerificareal posto dimisureFuoriRange. Per riga: etichetta, valore + unità, range atteso «min–max», data, due form POST verso/api/longevity/gestionale/verificaconmisura_idnascosto e un bottone ciascuno: «Conferma: il dato è vero» (esito=confermata) e «Scarta: è un errore» (esito=scartata). Una riga di spiegazione sopra la tabella: una misura confermata entra nei punteggi e ricalcola quella sessione e le successive; una scartata resta fuori.b. messaggio per
?verificata=confermata(«Misura confermata: punteggi ricalcolati.») e?verificata=scartata(«Misura scartata.»).c. se
!cliente.ha_accesso: link-bottone «Crea accesso al referto» verso/longevity/gestionale/cliente/<code>/accesso, accanto a «Nuovo check-up».lib/longevity/gestionale.ts: toglieremisureFuoriRangee il suo tipoMisuraFuoriRange; il test di gestionale.test.ts che la usa passa amisureDaVerificare(stesse asserzioni sul contenuto).accesso.astro: link «Torna alla scheda» verso/longevity/gestionale/cliente/<code>in tutti gli stati della pagina.TEST
tests/longevity/pagine.test.ts: la scheda contieneaction="/api/longevity/gestionale/verifica",name="misura_id", entrambi gli esiti, il link/accesso; nessuna pagina contiene piùmisureFuoriRange.npx vitest runtutto verde (partenza 257);npx tsc --noEmit -p .0 errori;npm run buildok.NON TOCCARE
motore, db.ts, misure.ts, anagrafica.ts, accesso.ts, le API, auth.ts, gli altri file .astro,
apps/sito/. Niente parolaselectnelle pagine (tests/longevity/referto.test.ts la legge come SQL).Soluzione
Verifica misure fuori range: db.ts colonne verifica/verificata_da/verificata_at con migra() idempotente all'avvio (ALTER TABLE: backup di longevity.db prima del deploy); misureValideAlla accetta fuori_range solo se confermata; misure.ts misureDaVerificare e verificaMisura (ricalcola sessione e successive); API pages/api/longevity/gestionale/verifica.ts; form Conferma/Scarta nella scheda cliente. Commit
f096807,922ab40,2c9a74f. Stato: sul ramo lavoro/goldrake (commit2c9a74f), NON ancora in main né in produzione. PROVA: vitest 259/259, tsc 0 errori, build 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).