diff --git a/apps/platforms/src/pages/longevity/gestionale/cliente/[code].astro b/apps/platforms/src/pages/longevity/gestionale/cliente/[code].astro
index b5debe4..c773d3f 100644
--- a/apps/platforms/src/pages/longevity/gestionale/cliente/[code].astro
+++ b/apps/platforms/src/pages/longevity/gestionale/cliente/[code].astro
@@ -13,6 +13,7 @@ import { misureDaVerificare } from '../../../../lib/longevity/misure';
import { refertoDi, ultimaSessioneDi } from '../../../../lib/longevity/vista';
import { formattaNumero } from '../../../../lib/longevity/formato';
import { vociDelGiornale } from '../../../../lib/longevity/giornale';
+import { consulenzaDi, OBIETTIVI } from '../../../../lib/longevity/consulenza';
export const prerender = false;
@@ -28,6 +29,8 @@ const daVerificare = misureDaVerificare(db, cliente.client_code);
const ultimaId = ultimaSessioneDi(db, cliente.client_code);
const referto = ultimaId !== null ? refertoDi(db, ultimaId) : null;
const voci = vociDelGiornale(db, cliente.client_code); // #16: giornale di bordo, solo staff
+const consulenza = consulenzaDi(db, cliente.client_code); // #15: prima consulenza, solo staff
+const ETICHETTA_OBIETTIVO = new Map(OBIETTIVI.map((o) => [o.chiave, o.etichetta]));
const ETICHETTA_TIPO: Record<'checkup' | 'questionario', string> = {
checkup: 'Check-up',
@@ -55,6 +58,10 @@ const MESSAGGIO_GIORNALE: Record<'aggiunta' | 'cancellata', string> = {
};
const messaggioGiornale =
giornaleEsito === 'aggiunta' || giornaleEsito === 'cancellata' ? MESSAGGIO_GIORNALE[giornaleEsito] : null;
+const consulenzaEsito = params.get('consulenza'); // #15: 'salvata', dal redirect dell'API consulenza
+// Passo 4 del flusso guidato per un cliente nuovo (#15): dopo il check-up si torna qui con
+// ?flusso=questionario — il questionario resta del cliente, quindi qui c'è solo l'indicazione.
+const flusso = params.get('flusso');
---
{messaggioVerifica}
} {messaggioGiornale &&{messaggioGiornale}
} + {consulenzaEsito === 'salvata' &&Prima consulenza salvata.
} + {flusso === 'questionario' && ( +Passo 4 di 4 — Questionario
+ {cliente.ha_accesso ? ( +Il questionario lo compila il cliente dal suo accesso, anche sul tablet del centro.
+ ) : ( + <> +Il questionario lo compila il cliente dal suo accesso, anche sul tablet del centro: crealo per continuare.
+ Crea accesso al referto + > + )} +{fuoriCount} {Number(fuoriCount) === 1 ? 'misura è' : 'misure sono'} fuori dal range di @@ -96,6 +117,31 @@ const messaggioGiornale =
Data di nascita: {cliente.data_nascita ? formattaData(cliente.data_nascita) : '—'}
+Prima consulenza
+ + {consulenza ? 'Modifica' : 'Compila'} + +Non ancora compilata.
+ ) : ( + <> +Livello: {consulenza.livello ?? '—'}
+Obiettivo primario: {consulenza.obiettivo_primario ? ETICHETTA_OBIETTIVO.get(consulenza.obiettivo_primario) ?? consulenza.obiettivo_primario : '—'}
+Obiettivo specifico: {consulenza.obiettivo_specifico ?? '—'}
+Data target: {consulenza.data_target ? formattaData(consulenza.data_target) : '—'}
+Note mediche: {consulenza.note_mediche ?? '—'}
+Storia sportiva: {consulenza.storia_sportiva ?? '—'}
+Limitazioni fisiche attuali: {consulenza.limitazioni ?? '—'}
+Disponibilità: {consulenza.disponibilita_giorni ?? '—'} giorni/settimana
+Fascia oraria preferita: {consulenza.fascia_oraria ?? '—'}
+Note screening: {consulenza.note_screening ?? '—'}
+ > + )} +Giornale di bordo
Solo lo staff lo vede. Una nota sbagliata si cancella e si riscrive: non si modifica.
diff --git a/apps/platforms/src/pages/longevity/gestionale/cliente/[code]/checkup.astro b/apps/platforms/src/pages/longevity/gestionale/cliente/[code]/checkup.astro index 8616422..0a8fed8 100644 --- a/apps/platforms/src/pages/longevity/gestionale/cliente/[code]/checkup.astro +++ b/apps/platforms/src/pages/longevity/gestionale/cliente/[code]/checkup.astro @@ -40,6 +40,9 @@ const valoriPreselezione = sessione ? new Map([...valori.entries()].filter((kv): kv is [string, number] => kv[1] !== null)) : valoriUltimoCheckup(db, cliente.client_code); const errore = Astro.url.searchParams.get('errore'); +// Passo 3 del flusso guidato per un cliente nuovo (?flusso=nuovo, #15): solo per un +// check-up NUOVO — in correzione (?sessione={cliente.cognome} {cliente.nome} — {cliente.client_code}. Lascia vuoto ciò che non hai misurato.
+ {flusso === 'nuovo' &&Passo 3 di 4 — Scheda Rapida
}{errore}
} @@ -56,6 +60,7 @@ const errore = Astro.url.searchParams.get('errore'); diff --git a/apps/platforms/src/pages/longevity/gestionale/cliente/[code]/consulenza.astro b/apps/platforms/src/pages/longevity/gestionale/cliente/[code]/consulenza.astro new file mode 100644 index 0000000..7358216 --- /dev/null +++ b/apps/platforms/src/pages/longevity/gestionale/cliente/[code]/consulenza.astro @@ -0,0 +1,113 @@ +--- +// La scheda di prima consulenza (#15): livello, obiettivo, note dello screening iniziale. +// Precompilata se esiste già — correggere e salvare SOVRASCRIVE, nessuno storico (decisione +// di Adriano, 27/09/2026). L'invio va all'API del gestionale, che fa la validazione vera +// (pages/api/longevity/gestionale/consulenza.ts) — qui c'è solo il form. +// +// Passo 2 del flusso guidato per un cliente nuovo (?flusso=nuovo, #15): il parametro passa +// di pagina in pagina fino al questionario, e ogni passo ha un link «Salta». +import Longevity from '../../../../../layouts/Longevity.astro'; +import { getLongevityDb } from '../../../../../lib/longevity/db'; +import { clienteDaCodice } from '../../../../../lib/longevity/anagrafica'; +import { consulenzaDi, OBIETTIVI } from '../../../../../lib/longevity/consulenza'; + +export const prerender = false; + +const { code } = Astro.params; +const cliente = code ? clienteDaCodice(code) : null; +if (!cliente) return new Response('Cliente non trovato', { status: 404 }); + +const db = getLongevityDb(); +const scheda = consulenzaDi(db, cliente.client_code); +const errore = Astro.url.searchParams.get('errore'); +const flusso = Astro.url.searchParams.get('flusso') ?? ''; +const query = flusso ? `?flusso=${encodeURIComponent(flusso)}` : ''; +--- +{cliente.cognome} {cliente.nome} — {cliente.client_code}. Tutti i campi sono facoltativi.
+ {flusso === 'nuovo' &&Passo 2 di 4 — Prima consulenza
} +{errore}
} + + +