longevity: export pseudonimizzato per costruzione
This commit is contained in:
@@ -0,0 +1,36 @@
|
||||
//
|
||||
// L'export per le statistiche legge SOLO longevity.db, che per costruzione non contiene
|
||||
// nomi: non serve nessuna funzione di anonimizzazione, e non c'è niente da ricordarsi.
|
||||
// I campi liberi (farmaci, patologie) restano fuori: sono per il coach, non per l'analisi.
|
||||
import type Database from 'better-sqlite3';
|
||||
|
||||
const INTESTAZIONI = [
|
||||
'client_code', 'sesso', 'eta', 'data', 'tipo_sessione',
|
||||
'quest_version', 'test_id', 'valore', 'unita', 'fonte', 'fuori_range',
|
||||
];
|
||||
|
||||
export function esportaMisure(db: Database.Database): {
|
||||
intestazioni: string[];
|
||||
righe: (string | number | null)[][];
|
||||
} {
|
||||
const righe = db.prepare(
|
||||
`SELECT sg.client_code, sg.sesso, s.eta_alla_data, s.data, s.tipo, s.quest_version,
|
||||
m.test_id, COALESCE(m.valore_num, m.valore_txt) AS valore, m.unita, m.fonte, m.fuori_range
|
||||
FROM misure m
|
||||
JOIN sessioni s ON s.id = m.sessione_id
|
||||
JOIN soggetti sg ON sg.client_code = m.client_code
|
||||
ORDER BY s.data, m.id`
|
||||
).raw().all() as (string | number | null)[][];
|
||||
|
||||
return { intestazioni: INTESTAZIONI, righe };
|
||||
}
|
||||
|
||||
export function esportaCsv(db: Database.Database): string {
|
||||
const { intestazioni, righe } = esportaMisure(db);
|
||||
const cella = (v: string | number | null) => {
|
||||
if (v === null) return '';
|
||||
const s = String(v);
|
||||
return /[",\n]/.test(s) ? `"${s.replace(/"/g, '""')}"` : s;
|
||||
};
|
||||
return [intestazioni.join(','), ...righe.map((r) => r.map(cella).join(','))].join('\n') + '\n';
|
||||
}
|
||||
Reference in New Issue
Block a user