longevity: salvataggio compilazione questionario, versionata

This commit is contained in:
2026-08-21 19:57:35 +02:00
parent d3abbf9bf7
commit f21b64fcc5
2 changed files with 122 additions and 0 deletions
+55
View File
@@ -0,0 +1,55 @@
import type Database from 'better-sqlite3';
import { apriSessione, registraMisure } from './misure';
import { esisteTest } from './registro';
/** Versione del set di domande. Si incrementa quando cambia una domanda. */
export const QUEST_VERSION = 'v1.0';
/**
* Campi testuali che si salvano ma non entrano MAI in una formula
* (indicazione esplicita del cliente, punto 7 della specifica).
*/
export const CAMPI_LIBERI = ['farmaci', 'problematiche_attuali', 'problematiche_pregresse', 'obiettivi'];
export function salvaCompilazione(
db: Database.Database,
input: {
client_code: string; data: string; eta?: number;
risposte: Record<string, number>;
liberi?: Record<string, string>;
}
): number {
// Validare PRIMA di aprire la sessione: altrimenti un id sbagliato lascia
// in giro una sessione vuota.
for (const id of Object.keys(input.risposte)) {
if (!esisteTest(db, id)) throw new Error(`test_id non nel registro: ${id}`);
}
const sessioneId = apriSessione(db, {
client_code: input.client_code,
data: input.data,
tipo: 'questionario',
eta_alla_data: input.eta,
quest_version: QUEST_VERSION,
});
registraMisure(
db, sessioneId, 'questionario',
Object.entries(input.risposte).map(([test_id, valore_num]) => ({ test_id, valore_num }))
);
if (input.liberi) {
const ins = db.prepare(
`INSERT INTO profilo_note (client_code, sessione_id, campo_id, testo) VALUES (?, ?, ?, ?)`
);
const tx = db.transaction(() => {
for (const [campo, testo] of Object.entries(input.liberi!)) {
if (testo.trim() === '') continue;
ins.run(input.client_code, sessioneId, campo, testo);
}
});
tx();
}
return sessioneId;
}