From a59b4e0c0e36a2c122d6ff7229297b08b441d28c Mon Sep 17 00:00:00 2001 From: AdrianoDev Date: Thu, 3 Sep 2026 13:02:54 +0000 Subject: [PATCH] crea-fascicolo: aprire il fascicolo di chi ha gia' un account "Anche un admin deve avere il suo referto" (Adriano). Il codice lo permetteva gia': il referto si aggancia all'utente, non al ruolo. Mancava il modo di creare la riga che lega utente e fascicolo senza passare da seed-demo, che inventa anche la persona e le risposte. Non indovina niente: --sesso e' obbligatorio perche' entra nelle curve dei punteggi, la data di nascita si puo' omettere e allora l'eta' resta vuota - meglio un campo vuoto di una data plausibile e falsa. Si ferma se quell'utente ha gia' un fascicolo: due fascicoli per la stessa persona sono due storie parallele, e nessuna e' quella giusta. Il fascicolo nasce vuoto: il referto dice "non hai ancora compilato il questionario" finche' la persona non lo compila, che e' il percorso vero. Co-Authored-By: Claude Opus 5 (1M context) Claude-Session: https://claude.ai/code/session_01EndnceRA5WnA6rvA5iV9WL --- apps/platforms/package.json | 3 +- apps/platforms/scripts/crea-fascicolo.ts | 75 ++++++++++++++++++++++++ 2 files changed, 77 insertions(+), 1 deletion(-) create mode 100644 apps/platforms/scripts/crea-fascicolo.ts diff --git a/apps/platforms/package.json b/apps/platforms/package.json index c380f01..55cbf1a 100644 --- a/apps/platforms/package.json +++ b/apps/platforms/package.json @@ -11,7 +11,8 @@ "test": "vitest run", "create-user": "node scripts/create-user.mjs", "sync-campus": "node scripts/sync-campus.mjs", - "seed-demo": "tsx scripts/seed-demo.ts" + "seed-demo": "tsx scripts/seed-demo.ts", + "crea-fascicolo": "tsx scripts/crea-fascicolo.ts" }, "dependencies": { "@astrojs/node": "11.0.1", diff --git a/apps/platforms/scripts/crea-fascicolo.ts b/apps/platforms/scripts/crea-fascicolo.ts new file mode 100644 index 0000000..9626667 --- /dev/null +++ b/apps/platforms/scripts/crea-fascicolo.ts @@ -0,0 +1,75 @@ +/** + * crea-fascicolo.ts — apre il fascicolo Longevity di una persona che ha già un account. + * + * A COSA SERVE: il referto si aggancia all'utente, non al ruolo (`codicePerUtenteLoggato`), + * quindi chiunque abbia un account — cliente, trainer o admin — può avere il proprio, ma + * solo se esiste la riga che lo lega al fascicolo. Finché non c'è il gestionale trainer, + * questo è l'unico modo di crearla senza inventarsi dati come fa seed-demo. + * + * COME SI USA: + * npm run crea-fascicolo -- --utente nicola --nome Nicola --cognome Antonelli --sesso M + * opzionali: --nascita 1980-01-31 --email x@y.it --telefono 333... + * percorsi: --utenti-db / --longevity-db / --identity-db, oppure DB_PATH / + * LONGEVITY_DB_PATH / IDENTITY_DB_PATH (gli stessi nomi del container). + * + * ⚠️ NON inventa niente. `--sesso` è obbligatorio perché entra nel calcolo dei punteggi + * (le curve dei test fisici sono distinte per sesso), e la data di nascita si può omettere + * ma allora l'età della sessione resta vuota: meglio un campo vuoto che una data + * plausibile e falsa. + * ⚠️ Si ferma se quell'utente ha già un fascicolo: due fascicoli per la stessa persona + * significano due storie parallele, e nessuna delle due è quella giusta. + * ⚠️ Il fascicolo nasce VUOTO: il referto dirà «non hai ancora compilato il questionario» + * finché la persona non lo compila da sé, che è il percorso vero. + * + * DIPENDE DA: tsx (devDependency). + */ +import { createLongevityDb, createIdentityDb } from '../src/lib/longevity/db'; +import { creaCliente, codicePerUtente } from '../src/lib/longevity/anagrafica'; +import { createDb } from '../src/lib/db'; + +const argv = process.argv.slice(2); +const opt = (nome: string, def?: string): string | undefined => { + const i = argv.indexOf(nome); + return i >= 0 && argv[i + 1] && !argv[i + 1].startsWith('--') ? argv[i + 1] : def; +}; + +const utente = opt('--utente'); +const nome = opt('--nome'); +const cognome = opt('--cognome'); +const sesso = opt('--sesso'); + +if (!utente || !nome || !cognome || (sesso !== 'M' && sesso !== 'F')) { + console.error('Uso: npm run crea-fascicolo -- --utente --nome --cognome --sesso '); + console.error(' opzionali: --nascita AAAA-MM-GG --email --telefono '); + process.exit(1); +} + +const utentiDb = createDb(opt('--utenti-db', process.env.DB_PATH ?? 'data/piattaforme.db')); +const longevity = createLongevityDb(opt('--longevity-db', process.env.LONGEVITY_DB_PATH ?? 'data/longevity.db')); +const identity = createIdentityDb(opt('--identity-db', process.env.IDENTITY_DB_PATH ?? 'data/identity.db')); + +const riga = utentiDb.prepare('SELECT id, role FROM users WHERE username = ?').get(utente) as + { id: number; role: string } | undefined; +if (!riga) { + console.error(`L'utente "${utente}" non esiste: crealo prima con npm run create-user.`); + process.exit(1); +} + +const esistente = codicePerUtente(identity, riga.id); +if (esistente) { + console.error(`"${utente}" ha già il fascicolo ${esistente}: non ne apro un secondo.`); + process.exit(1); +} + +const code = creaCliente(identity, longevity, { + nome, cognome, sesso, + data_nascita: opt('--nascita'), + email: opt('--email'), + telefono: opt('--telefono'), + user_id: riga.id, +}); + +console.log(`fascicolo ${code} aperto per ${nome} ${cognome}`); +console.log(` utente ${utente} (id ${riga.id}, ruolo ${riga.role})`); +console.log(` nascita ${opt('--nascita') ?? '— non dichiarata: l\'età delle sessioni resterà vuota'}`); +console.log('\nÈ vuoto: da /longevity/questionario la persona lo compila e il referto compare.');