Libreria Node.js per la gestione dei flussi informativi sanitari della Regione Sicilia e l'integrazione con i portali istituzionali (Tessera Sanitaria, NAR/NAR2).
- Installazione
- Quick Start
- Architettura
- Moduli
- API Reference
- Struttura del Progetto
- Dipendenze Principali
- Licenza
npm install aziendasanitaria-utilsRequisiti: Node.js >= 14.0.0 | ES Modules (
"type": "module")
import { flussiRegioneSicilia } from "aziendasanitaria-utils";
import { struttureDistrettiMap, distretti, comuniDistretti } from "aziendasanitaria-utils/src/config/sicilia/messina.js";
// Configurazione strutture territoriali
const strutture = new flussiRegioneSicilia.StruttureDistrettiPerProvincia(
distretti, comuniDistretti, struttureDistrettiMap
);
// Impostazioni Flusso M
const impostazioni = new flussiRegioneSicilia.ImpostazioniFlussoM(
"205", // codice ASL
"190", // codice Regione
"/path/to/input", // cartella input
"/path/to/output", // cartella output
"/path/to/FlowLook.mdb", // database FlowLook
strutture
);
// Elaborazione
const flussoM = new flussiRegioneSicilia.FlussoM(impostazioni);aziendasanitaria-utils
|
|-- Flussi Sanitari Elaborazione file a record fisso (TXT 381 char)
| |-- FlussoM Prestazioni specialistiche ambulatoriali
| |-- FlussoSIAD Sistema Informativo Assistenza Domiciliare
| |-- FlussoHOSPICE Cure palliative
| |-- FlussoARSFAR Assistenza Residenziale Semiresidenziale
| `-- FlussoRSA Residenze Sanitarie Assistenziali
|
|-- Servizi Esterni Integrazione con portali istituzionali
| |-- Ts Tessera Sanitaria (HTTP headless + Puppeteer)
| |-- Nar / Nar2 Nuova Anagrafe Regionale (Puppeteer + REST API)
| |-- Assistiti Gestione completa dati assistiti
| `-- Medici Gestione dati medici MMG/PLS
|
|-- Indicatori Calcolo indicatori LEA (D33ZA, D30Z)
|
`-- Config Configurazione territoriale e credenziali
Il modulo principale per l'elaborazione del flusso M (prestazioni ambulatoriali).
| Funzionalita | Stato |
|---|---|
| Verifica formale record | ✅ |
| Acquisizione dati da DB FlowLook | ✅ |
| Unione file TXT | ✅ |
| Verifica duplicati (anche milioni di record) | ✅ |
| Controllo date, nomi file, distretti | ✅ |
| Elaborazione informazioni finanziarie | ✅ |
| Verifica strutture su portale Sogei/TS | ✅ |
| Calcolo differenze e congruita TS | ✅ |
| Report HTML ed Excel | ✅ |
| Invio report via mail per distretto | ✅ |
| Calcolo volumi | ✅ |
| Funzionalita | Stato |
|---|---|
| Conteggio prestazioni | ✅ |
| Funzionalita | Stato |
|---|---|
| Calcolo giornate di degenza | ✅ |
| Funzionalita | Stato |
|---|---|
| Calcolo ammissioni | ✅ |
| Funzionalita | Stato |
|---|---|
| Elaborazione dati RSA | ✅ |
Integrazione con il portale SistemaTS per la verifica e la ricerca di dati sanitari.
Modalita headless (senza browser) - usa axios + cheerio:
import { Ts } from "aziendasanitaria-utils/src/narTsServices/Ts.js";
import { ImpostazioniServiziTerzi } from "aziendasanitaria-utils/src/config/ImpostazioniServiziTerzi.js";
const config = new ImpostazioniServiziTerzi({
ts_username: "CODICE_FISCALE",
ts_password: "PASSWORD"
});
const ts = new Ts(config);
// Ricerca STP/ENI per codice
const risultato = await ts.ricercaStpPerCodice({
prefisso: 'STP', // 'STP' o 'ENI'
codiceAsl: '205',
suffissoCodiceStp: '0000001'
});
// => { error: false, data: { codice_stp_eni, cognome, nome, genere, ... } }
// Ricerca STP/ENI per range
const elenco = await ts.ricercaStpPerRange({
prefisso: 'STP',
codiceAsl: '205',
dal: '0000000',
al: '9999999'
});
// => { error: false, data: [{ codice_stp_eni, cognome, nome, genere, nazionalita }, ...] }
// Ricerca STP/ENI per dati anagrafici
const ricerca = await ts.ricercaStpPerDati({
prefisso: 'STP',
codiceAsl: '205',
cognome: 'ROSSI',
genere: 'M'
});
// Dettaglio da link nella lista
const dettaglio = await ts.getDettaglioStp(elenco.data[0]._detailLink);
// Parsing file forniture assistiti TS (offline, no login)
const { data, stats } = Ts.getDataFromTSFile("/path/to/file.txt");
ts.closeHttpSession();Modalita browser (Puppeteer) - per operazioni legacy:
const page = await ts.getWorkingPage(true); // true = visibile
// ... operazioni con Puppeteer
await ts.doLogout();import { Nar2 } from "aziendasanitaria-utils/src/narTsServices/Nar2.js";
const nar2 = new Nar2(impostazioniServiziTerzi);
const token = await nar2.getToken();
// Ricerca assistiti con parametri
const assistiti = await nar2.getAssistitiFromParams({
[Nar2.PARAMS.COGNOME]: 'ROSSI',
[Nar2.PARAMS.NOME]: 'MARIO',
[Nar2.PARAMS.AZIENDA]: '205'
});Orchestratore che combina dati da TS, NAR e NAR2.
import { Assistiti } from "aziendasanitaria-utils/src/narTsServices/Assistiti.js";
const assistiti = new Assistiti(configServiziTerzi);
const dati = await assistiti.apriMMGAssistiti(codiceMMG, listaCF);| Funzionalita | Stato |
|---|---|
| Verifica data decesso da TS | ✅ |
| Recupero dati da NAR/NAR2 | ✅ |
| Generazione documenti DOCX | ✅ |
| Elaborazione batch parallela | ✅ |
import { Medici } from "aziendasanitaria-utils/src/narTsServices/Medici.js";
const medici = new Medici(impostazioni, true);| Funzionalita | Stato |
|---|---|
| Ricerca medici MMG/PLS | ✅ |
| Integrazione NAR | ✅ |
| Report PDF/Excel | ✅ |
Calcolo degli indicatori LEA (Livelli Essenziali di Assistenza).
| Indicatore | Descrizione |
|---|---|
| D33ZA | Identificazione anziani >75 anni con patologie specifiche (da file ARS) |
| D30Z | Indicatore composito SIAD/Hospice |
Credenziali per i servizi esterni:
const config = new ImpostazioniServiziTerzi({
ts_username: "", // Codice Fiscale per Tessera Sanitaria
ts_password: "", // Password TS
nar_username: "", // Username NAR
nar_password: "", // Password NAR
nar2_username: "", // Username NAR2
nar2_password: "" // Password NAR2
});Configurazione territoriale con distretti, comuni e strutture sanitarie. Include configurazione preconfigurata per Messina.
import { struttureDistrettiMap, distretti, comuniDistretti } from "aziendasanitaria-utils/src/config/sicilia/messina.js";import { flussiRegioneSicilia } from "aziendasanitaria-utils";
const {
// Flussi
FlussoM,
FlussoSIAD,
FlussoHOSPICE,
FlussoARSFAR,
FlussoRSA,
// Configurazione
ImpostazioniFlussoM,
ImpostazioniFlussoRSA,
ImpostazioniFlussoHOSPICE,
ImpostazioniFlussoARSFAR,
ImpostazioniMail,
ImpostazioniServiziTerzi,
StruttureDistrettiPerProvincia,
// Servizi
Assistiti,
Medici,
Indicatori,
// Dati regionali
Messina
} = flussiRegioneSicilia;| Metodo | Parametri | Ritorno |
|---|---|---|
ricercaStpPerCodice() |
{ prefisso, codiceAsl, suffissoCodiceStp } |
{ error, data, message? } |
ricercaStpPerRange() |
{ prefisso, codiceAsl, dal, al } |
{ error, data[], message? } |
ricercaStpPerDati() |
{ prefisso, codiceAsl, cognome, genere } |
{ error, data[], message? } |
getDettaglioStp() |
detailLink |
{ error, data, message? } |
closeHttpSession() |
- | void |
Ts.getDataFromTSFile() |
filePath |
{ data[], stats } |
Campi restituiti (dettaglio singolo):
| Campo | Esempio |
|---|---|
codice_stp_eni |
STP1902050000001 |
cognome |
ROSSI |
nome |
MARIO |
genere |
M |
data_nascita |
01/01/1990 |
nazionalita |
ROMANIA |
indirizzo |
VIA ROMA 1 |
cap |
98100 |
comune |
MESSINA |
provincia |
ME |
medico |
BIANCHI LUIGI |
asl_ao |
205 - ASP MESSINA |
regione |
Sicilia |
tipo_assistito |
assistito STP |
data_inizio_assistenza |
01/01/2024 |
data_fine_assistenza |
01/07/2024 |
motivazione_fine_assistenza |
FINE ASSISTENZA (DA PARTE DEL SSN) |
Campi restituiti (elenco):
| Campo | Descrizione |
|---|---|
codice_stp_eni |
Codice identificativo |
cognome |
Cognome |
nome |
Nome |
genere |
M/F |
nazionalita |
Nazionalita |
_detailLink |
Link per getDettaglioStp() |
aziendasanitaria-utils/
├── index.js # Entry point - export principale
├── package.json
│
├── src/
│ ├── m/
│ │ ├── FlussoM.js # Flusso M - Prestazioni specialistiche
│ │ └── DatiStruttureProgettoTs.js
│ │
│ ├── siad/
│ │ └── FlussoSIAD.js # Flusso SIAD - Assistenza domiciliare
│ │
│ ├── hospice/
│ │ └── FlussoHOSPICE.js # Flusso Hospice
│ │
│ ├── ars-far/
│ │ └── FlussoARSFAR.js # Flusso ARS ex FAR
│ │
│ ├── rsa/
│ │ └── FlussoRSA.js # Flusso RSA
│ │
│ ├── narTsServices/
│ │ ├── Ts.js # Tessera Sanitaria (HTTP + Puppeteer)
│ │ ├── Nar.js # NAR legacy (Puppeteer)
│ │ ├── Nar2.js # NAR2 REST API
│ │ ├── Assistiti.js # Gestione assistiti
│ │ └── Medici.js # Gestione medici
│ │
│ ├── config/
│ │ ├── ImpostazioniServiziTerzi.js
│ │ ├── ImpostazioniFlussoM.js
│ │ ├── ImpostazioniFlussoSIAD.js
│ │ ├── ImpostazioniFlussoHOSPICE.js
│ │ ├── ImpostazioniFlussoARSFAR.js
│ │ ├── ImpostazioniFlussoRSA.js
│ │ ├── ImpostazioniMail.js
│ │ ├── StruttureDistrettiPerProvincia.js
│ │ └── sicilia/
│ │ └── messina.js # Config preconfigurata Messina
│ │
│ ├── classi/
│ │ └── Assistito.js # Classe dati assistito
│ │
│ ├── db/
│ │ ├── DBHelper.js
│ │ └── asp_esenzioni.sql
│ │
│ ├── grid/ # Template report HTML
│ │
│ ├── Utils.js # Utility comuni
│ ├── Indicatori.js # Indicatori LEA
│ ├── Procedure.js
│ ├── Stipendi.js
│ ├── CryptHelper.js
│ └── api/
│ └── APIHelper.js
│
├── config/
│ └── config_example.json # Template configurazione
│
└── example.js # Esempio di utilizzo
| Categoria | Librerie |
|---|---|
| HTTP / Scraping | axios, cheerio, puppeteer, puppeteer-extra |
| Database | sqlite3, mysql, knex, mdb-reader, lokijs, ioredis |
| Documenti | exceljs, xlsx, docx, pdf-lib, libreoffice-convert |
| nodemailer, eml-format, @freiraum/msgreader | |
| Sicurezza | openpgp, argon2, passport, passport-spid |
| File | fs-extra, adm-zip, archiver, unzipper, chokidar |
| Utilita | lodash, moment-timezone, xml2js, stream-json, winston |
| AI | @google/generative-ai |
Creare un file config/config.json partendo dal template:
{
"ts_username": "",
"ts_password": "",
"nar_username": "",
"nar_password": "",
"nar2_username": "",
"nar2_password": ""
}MIT - Roberto De Domenico