Integrazione RIS-PACS FHIR
Questa pagina descrive come integrare GipoNext con un sistema RIS-PACS usando lo standard FHIR.
L'obiettivo è rendere chiaro:
- quali risorse implementare;
- come gestire autenticazione e autorizzazione;
- quali endpoint usare nei flussi principali.
Standard e formato
Lo standard di riferimento è FHIR Release 3 (STU v3.0.1).
- Standard: https://www.hl7.org/fhir/STU3
- Formato payload:
application/fhir+json - Specifica HTTP FHIR: https://www.hl7.org/fhir/STU3/http.html
Tutte le comunicazioni devono avvenire su endpoint HTTPS pubblici.
Autenticazione e autorizzazione
L'endpoint ricevente del PACS può usare una delle opzioni seguenti:
- Bearer token / ApiKey via header
Authorization(Bearer XXXXXXXXX) - Basic authentication via header
Authorization(obsoleto)
Per la ricezione referti, GipoNext supporta:
- Bearer token / ApiKey
- OAuth 2.0 con token Bearer ottenuto dai flussi OAuth 2.0 documentati nelle API GipoNext
Risorse coinvolte
Risorse da implementare su RIS-PACS
Patient— https://www.hl7.org/fhir/STU3/patient.htmlProcedureRequest— http://hl7.org/fhir/STU3/procedurerequest.html
Risorsa implementata su GipoNext
DiagnosticReport— https://www.hl7.org/fhir/STU3/diagnosticreport.html
Flussi operativi
Flusso all'accettazione
GipoNext invia verso RIS-PACS:
PUT PatientPOST ProcedureRequest
Flusso ricezione esiti (facoltativo)
RIS-PACS invia verso GipoNext:
POST DiagnosticReport
Endpoint di ricezione su GipoNext
Il formato endpoint è:
https://api.giponext.it/fhir/r3/{userId}/{resource}/{id?}
Dove:
{userId}: identificativo cliente GipoNext (fornito in fase di attivazione){resource}: nome risorsa (esempioDiagnosticReport){id?}: identificativo risorsa (facoltativo, usato perGET,PUT,DELETE)
Limitazioni
- Una volta creata una
ProcedureRequest, la risorsa non è modificabile.
Esempi
PUT Patient (GipoNext → RIS-PACS)
json
{
"resourceType": "Patient",
"id": "101",
"extension": [
{
"url": "http://hl7.org/fhir/StructureDefinition/patient-birthPlace",
"valueAddress": {
"extension": [
{
"url": "https://api.giponext.it/fhir/birthPlace/codice-istat-comune",
"valueCoding": {
"system": "https://www.istat.it/it/archivio/6789",
"code": "015146",
"display": "Milano"
}
}
],
"city": "Milano",
"country": "IT"
}
}
],
"identifier": [
{
"system": "https://www.giponext.it",
"value": "101"
},
{
"system": "urn:oid:2.16.840.1.113883.2.9.4.3.2",
"value": "RSSMRA80B12X876P"
},
{
"system": "RISPACS",
"value": "1"
}
],
"active": true,
"name": [
{
"family": "Rossi",
"given": [
"Mario"
]
}
],
"telecom": [
{
"system": "email",
"value": "mario.rossi@test.it",
"use": "home"
},
{
"system": "phone",
"value": "+39333000000",
"use": "mobile"
},
{
"system": "phone",
"value": "+3902148874",
"use": "home"
},
{
"system": "phone",
"value": "+390211112",
"use": "work"
}
],
"gender": "male",
"birthDate": "1980-02-12",
"address": [
{
"extension": [
{
"url": "https://api.giponext.it/fhir/address/codice-istat-comune",
"valueCoding": {
"system": "https://www.istat.it/it/archivio/6789",
"code": "015146",
"display": "Milano"
}
}
],
"line": [
"Via Bartolomeo D'Alviano"
],
"city": "Milano",
"district": "MI",
"state": "MI",
"postalCode": "20146",
"country": "IT"
}
]
}POST ProcedureRequest (GipoNext → RIS-PACS)
json
{
"resourceType": "ProcedureRequest",
"id": "A100R98I1",
"identifier": [
{
"system": "https://www.giponext.it",
"value": "A100R98I1"
}
],
"requisition": {
"system": "https://www.giponext.it",
"value": "100"
},
"authoredOn": "2019-07-16T12:41:51.0519077+02:00", // facoltativo, eventuale data/ora di accettazione (se presente)
"status": "active",
"intent": "order",
"category": [
// facoltativo eventuali branche/specialità (un elemento per specialità)
{
"coding": [
// codifica della specialità
{
"system": "https://www.giponext.it",
"code": "BR10", // codice specialità di giponext
"userSelected": true // true per la specialità selezionata dall'utente (se più di una presente)
},
{
"system": "https://www.giponext.it",
"code": "BR11",
"userSelected": false
}
]
}
],
"code": {
"coding": [
{
"system": "RISPACS",
"code": "X10010",
"display": "Prestazione di esempio 1"
},
{
"system": "https://www.giponext.it",
"code": "0"
},
{
"system": "sistemats.nomenclatore",
"code": "N",
"display": "Codifica nomenclatore regionale"
},
{
"system": "sistemats.codice",
"code": "XXXXX", // Codice prestazione specialistica secondo il tariffario della regione (facoltativa)
"display": "Codifica nomenclatore nazionale"
}
]
},
"subject": {
"reference": "Patient/101",
"identifier": {
"system": "https://www.giponext.it",
"value": "101"
},
"extension": [
{
"url": "https://www.giponext.it",
"valueString": "101"
},
{
"url": "urn:oid:2.16.840.1.113883.2.9.4.3.2",
"valueString": "RSSMRA80B12X876P"
},
{
"url": "RISPACS",
"valueString": "1"
}
]
},
"occurrenceDateTime": "2026-02-27T11:38:27.4525418+01:00",
"requester": {
"agent": {
"reference": "User/testuser",
"display": "testuser"
}
},
"note": [
{
"text": "Note ordine"
}
],
"performer": {
"reference": "Doctors/doctorid", // Tecnico GipoNext collegato (facoltativo)
"display": "testuser",
"identifier": {
"system": "urn:oid:2.16.840.1.113883.2.9.4.3.2",
"value": "ABCDEF86H12K897O" // codice fiscale del medico / tecnico
}
},
"supportingInfo": [
{
"reference": "Prescription/123456789123456", // impegnativa collegata (rif)
"display": "Impegnativa",
"identifier": {
"system": "urn:oid:2.16.840.1.113883.2.9.4.3.8", // oid ricette dematerializzate
"value": "123456789123456" // numero impegnativa
},
"extension": [
{
"url": "https://api.giponext.it/fhir/impegnativa/oscurato", // valore per l'oscuramento
"valueBoolean": true
},
{
"url": "https://api.giponext.it/fhir/impegnativa/totale-impegnativa", // costo totale dell'impegnativa
"valueDecimal": 36.15
},
{
"url": "https://api.giponext.it/fhir/impegnativa/totale-prestazioni", // costo totale sostenuto dal SSN
"valueDecimal": 52.3
},
{
"url": "https://api.giponext.it/fhir/impegnativa/esente", // flag se l'impegnativa è esente
"valueBoolean": false
},
{
"url": "https://api.giponext.it/fhir/impegnativa/codice-asl", // codice ASL/AUSL/USL/ULSS/ASP dell'assistito
"valueString": "201"
},
{
"url": "https://api.giponext.it/fhir/impegnativa/codice-regione", // codice regione dell'assistito
"valueString": "080"
}
]
}
],
"extension": [
{
"url": "https://api.giponext.it/fhir/assignedReporter", // facoltativo, medico refertante assegnato (se presente)
"valueReference": {
"reference": "Doctors/doctorid", // medico GipoNext collegato
"display": "testuser",
"identifier": {
"system": "urn:oid:2.16.840.1.113883.2.9.4.3.2",
"value": "ABCDEF86H12K897O" // codice fiscale del medico
}
}
}
]
}POST DiagnosticReport (RIS-PACS → GipoNext) - Optional
json
{
"resourceType": "DiagnosticReport",
"id": "REPORT-001", // identificativo univoco del referto nel sistema inviante
"extension": [
{
"url": "https://api.giponext.it/fhir/availableOnline", // extension facoltativa, impostarla a true se il referto deve essere reso disponibili nel portale Referti.OnLine
"valueBoolean": true
}
],
"basedOn": [
{
"reference": "ProcedureRequest/A1230R354I1" // Impostare lo stesso riferimento della ProcedureRequest di origine nel formato "ProcedureRequest/XXXXXX" dove XXXXX è il suo id
},
{
"reference": "ProcedureRequest/A1230R355I1"
}
],
"status": "final",
"code": {
"coding": [
{
"system": "RISPACS", // coding del sistema inviante, facoltativo
"code": "X123456"
},
{
"system": "http://loinc.org",
"code": "18748-4" // codice LOINC (facoltativo, es: https://loinc.org/18748-4/)
}
]
},
"subject": {
"reference": "Patient/123465789" // stesso identificativo inviatovi in fase di creazione ProcedureRequest
},
"issued": "2019-10-22T10:00:00+00:00", // data referto
"performer": [
// lista dei medici
{
"actor": {
"reference": "Doctor/102", // codice del medico nel sistema inviante
"identifier": {
"system": "urn:oid:2.16.840.1.113883.2.9.4.3.2",
"value": "ABCDEF86H12K897O" // codice fiscale del medico (usato per effettuare matching in GipoNext)
},
"display": "Dott. Rossi"
},
"role": {
"coding": [
{
"system": "http://hl7.org/fhir/v2/0912",
"code": "SPRF"
}
],
"text": "Refertante"
}
},
{
"role": {
"coding": [
{
"system": "http://hl7.org/fhir/v2/0912",
"code": "PRF"
}
],
"text": "Tecnico"
},
"actor": {
"reference": "Doctor/103",
"identifier": {
"system": "urn:oid:2.16.840.1.113883.2.9.4.3.2",
"value": "XYZABC90A01H501Z"
},
"display": "Dott. Bianchi"
}
}
],
"presentedForm": [
// elenco referti PDF
{
"title": "TAC", // titolo del documento PDF (viene visualizzato in interfaccia utente)
"contentType": "application/pdf", // supportato soltanto application/pdf
"data": "AAAA", // file PDF in base64 (da usare solo se non si usa "url")
"url": "http://test.test.com/test.pdf" // url da impostare per scaricare il referto (da usare solo se non si usa "data")
}
]
}Note pratiche per integrazione
- Concorda prima i dettagli di autenticazione con il referente tecnico del PACS.
- Verifica sempre
Content-Type: application/fhir+json. - Parti con test su
PatienteProcedureRequest, poi abilita il flusso esiti (DiagnosticReport).
Risorse utili
- FHIR Connector Extension (Mirth) Wiki: http://www.mirthcorp.com/community/wiki/pages/viewpage.action?pageId=36504815
- FHIR Connector Extension (Mirth) Download: http://downloads.mirthcorp.com/fhir/3.6.1/fhir-3.6.1.b237.zip