longevity: nuovo cliente con prima consulenza e scheda rapida, follow-up solo questionario e check-up #15
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: flusso del nuovo cliente e dei follow-up.
PERCHÉ: Nicola, call 27/09 (min 51-56); Adriano 27/09: «Scheda Rapida Profilazione Fisica da aggiungere quando si aggiunge un nuovo cliente».
OGGI: pages/longevity/gestionale/nuovo.astro crea solo l'anagrafica; il check-up si apre a parte dalla scheda cliente.
DA CHIARIRE: elenco obiettivi (oggi performance sportiva, energia quotidiana, recupero e benessere, riabilitazione, ricomposizione corporea, dimagrimento, altro: Nicola vuole aggiungerne); campi dello screening iniziale (ISL_Scheda_CheckUp.xlsx, foglio Profilo Cliente, su Wasabi in Longevity_Project/docs/).
FATTO QUANDO: creare un cliente porta in sequenza a prima consulenza, scheda rapida e questionario; un follow-up non richiede di rifare la prima consulenza.
FONTE: call Adriano–Nicola 27/09/2026, trascrizione e allegati in wasabi:adp-work/AI-OS/projects/azienda/clienti/Insanity_Lab/Longevity_Project/docs/2026-09-27_call/
DECISIONE (Adriano, 27/09/2026): il cliente NON vede la scheda di profilazione (prima consulenza + scheda rapida): solo staff. Il cliente continua a vedere referto, progressione e il questionario da compilare.
🔵 daitarn — preso in carico 2026-09-28T06:14:44Z
ramo:
lavoro/daitarn· capacità: build-windows, gpuANALISI (passo 1, Opus) — gitea:Adriano/InsanityLab-web#15
RAMO: lavoro/daitarn a
b0f30f9(= origin/main, #13 in produzione). Cartella: apps/platforms.FONTI: foglio «Profilo Cliente» di ISL_Scheda_CheckUp.xlsx (wasabi:adp-work/AI-OS/projects/azienda/clienti/Insanity_Lab/Longevity_Project/docs/), call 27/09.
DECISIONI
a. Prima consulenza = una sola scheda per cliente, modificabile in ogni follow-up (gli obiettivi si aggiornano lì); il racconto dei cambi va nel giornale (#16), non in uno storico della scheda.
b. Campi (dal foglio Profilo Cliente, meno anagrafica e altezza che stanno altrove): livello (1/2/3), obiettivo primario (radio: performance sportiva, energia quotidiana, recupero e benessere, riabilitazione, ricomposizione corporea, dimagrimento, altro), obiettivo specifico concordato (testo), data target (data), note mediche/allergie/infortuni pregressi, storia sportiva, limitazioni fisiche attuali, disponibilità giorni/settimana (0-7), fascia oraria preferita (testo), note screening. Tutti facoltativi.
c. Il questionario resta del cliente: nel flusso l'ultimo passo porta a «Crea accesso» (pagina esistente) e dice che il cliente lo compila dal suo accesso, anche sul tablet del centro. Nessuna compilazione per conto del cliente.
d. Flusso guidato con parametro
flusso=nuovopassato di pagina in pagina; ogni passo ha «Salta».MODIFICHE
consulenzain longevity.db (solo client_code, niente nomi): client_code TEXT PRIMARY KEY REFERENCES soggetti(client_code), livello INTEGER CHECK (livello IN (1,2,3)), obiettivo_primario TEXT, obiettivo_specifico TEXT, data_target TEXT, note_mediche TEXT, storia_sportiva TEXT, limitazioni TEXT, disponibilita_giorni INTEGER CHECK (disponibilita_giorni BETWEEN 0 AND 7), fascia_oraria TEXT, note_screening TEXT, aggiornata_da TEXT NOT NULL, aggiornata_at TEXT NOT NULL DEFAULT (datetime('now')). CREATE TABLE IF NOT EXISTS basta su un DB esistente (stesso ragionamento del giornale in #16).consulenzaDi(db, clientCode)→ riga | null;salvaConsulenza(db, { clientCode, autore, campi })→ { ok } | { ok: false, errore }: UPSERT; rifiuta soggetto inesistente, livello fuori 1-3, obiettivo fuori elenco, data_target non AAAA-MM-GG, disponibilità fuori 0-7 o non intera, testo > 5000 caratteri; stringhe vuote → NULL.flusso=nuovo→ /longevity/gestionale/cliente//checkup?flusso=nuovo; senza → scheda cliente?consulenza=salvata#consulenza. Errore → torna alla pagina con?errore=(conservando flusso).ESITO: fatto sul ramo, non in main né in produzione
RIF: gitea:Adriano/InsanityLab-web#15
COSA: controllo finale (passo 3, Opus) del codice Sonnet: il diff fa quello che dice l'analisi e solo quello.
COMMIT (ramo lavoro/daitarn, pushato):
498395dtabella consulenza + consulenza.ts + test;575a398API consulenza, redirect clienti.ts al flusso, checkup.ts flusso→questionario;8aeb25fpagine (consulenza.astro, passo 3 in checkup.astro, sezione Prima consulenza e passo 4 nella scheda cliente);680224eCSS bersagli touch 44px.VERIFICATO A OCCHIO: UPSERT una riga per cliente; validazioni prima della scrittura; autore da locals.user; flusso propagato solo per un check-up nuovo, la correzione (#12) lo ignora; nessuna pagina cliente importa consulenza.ts (test).
PROVA: apps/platforms
npx vitest run→ 336 verdi, 4 rossi = baseline Windows (anagrafica.test.ts segnala solo anagrafica.ts e db.ts);npx tsc --noEmit→ 0 errori; build ok (rapporto agente).LIMITE NOTO: nella scheda cliente i campi testo della consulenza non conservano gli a capo (cosmetico).
DA CONFERMARE CON NICOLA: domande g-j in gitea:Adriano/InsanityLab-web#18.
MANCA: via di Adriano per merge su main e deploy (backup DB prima; tabella nuova IF NOT EXISTS, nessuna migrazione a mano).
Soluzione
ESITO: fatto, in produzione
RIF: gitea:Adriano/InsanityLab-web#15
COSA: flusso guidato del nuovo cliente (anagrafica → prima consulenza → Scheda Rapida → accesso per il questionario, ogni passo saltabile); prima consulenza = una scheda per cliente (tabella consulenza in longevity.db, UPSERT, solo staff), modificabile nei follow-up dalla scheda cliente; bersagli touch 44px per il tablet.
FILE: apps/platforms/src/lib/longevity/consulenza.ts; lib/longevity/db.ts (tabella consulenza); pages/api/longevity/gestionale/consulenza.ts, clienti.ts, checkup.ts; pages/longevity/gestionale/cliente/[code]/consulenza.astro, [code]/checkup.astro, [code].astro; styles/longevity.css; tests/longevity/consulenza.test.ts.
COMMIT:
498395d,575a398,8aeb25f,680224e— main680224e.PROVA: vitest 336 verdi + 4 rossi di baseline Windows; tsc 0 errori. VPS 28/09 06:27 UTC: backup /opt/docker/insanitylab-platforms/backup/20260928T062724-pre-15 (3 DB, integrity ok), container ricostruito, tabella consulenza creata all'apertura, integrity ok, /longevity/gestionale/nuovo → 302 al login.
MANCA: prova in browser loggato; a capo dei testi consulenza nella scheda cliente (cosmetico); conferme di Nicola in #18.