# Cum să integrați sistemele clinice cu un backend FHIR

> Tutorial: conectați un EMR clinic la înregistrările FHIR R4 ale pacienților — director de medici, potrivire după numărul de înregistrare, o vizită ca o singură tranzacție cu medicul ca autor, rapoarte de laborator, date de la alți furnizori și webhooks.

Source: https://developers.anpheros.com/ro/guides/integrate-clinic-systems-fhir

**Acest tutorial conectează software-ul unei clinici (un EMR, un sistem de management al practicii sau un instrument de rezervare) la înregistrările HL7 FHIR R4 ale pacienților din Anpheros: clinica și medicii săi sunt înregistrați în director, pacienții sunt potriviți după numărul de înregistrare al clinicii, o vizită este înregistrată ca o singură tranzacție cu medicul numit ca autor, iar clinica află despre datele pe care le adaugă alți furnizori.** Fiecare cerere este `curl` împotriva sandbox-ului gratuit, iar răspunsurile sunt ale platformei.

Integrarea rulează pe serverul clinicii, cu o cheie API de proiect pentru pacienții pe care clinica îi înregistrează și, pentru persoanele care au deja o înregistrare Anpheros, o autorizație OAuth pe care o aprobă.

## Ce se mapează la ce

| În sistemul clinicii | În FHIR R4 |
|---|---|
| clinica, departamentele sale | `Organization` |
| un medic sau asistent medical | `Practitioner` |
| acea persoană care lucrează la acea clinică, cu o specialitate | `PractitionerRole` |
| fișa pacientului și numărul acesteia | `Patient` cu un `identifier` în sistemul clinicii |
| o vizită | `Encounter` |
| semne vitale, rezultate măsurate în timpul vizitei | `Observation` legate de `Encounter` |
| un diagnostic | `Condition` (ICD-10), cu `verificationStatus` provizoriu sau confirmat |
| o prescripție, tratament curent | `MedicationStatement` (ATC) |
| o scrisoare, un sumar de externare, o scanare | `DocumentReference` cu fișierul |
| rezultate de laborator | [conectorul de laborator](https://developers.anpheros.com/ro/guides/lab-connector), în `Observation` |

## Pasul 1: înregistrați clinica și medicii săi

Resursele de tip Director nu au pacienți. Alte proiecte din același mediu le pot citi, astfel încât alți furnizori ai unui pacient să vadă cine a scris ce, dar numai proiectul dumneavoastră le poate modifica.

```bash
export BASE=https://platform.anpheros.com/fhir/R4
export KEY=sk_test_…
H=(-H "Authorization: Bearer $KEY" -H "Content-Type: application/fhir+json")

curl -X POST $BASE/Organization "${H[@]}" -d '{"resourceType": "Organization", "active": true, "name": "Clinica Cardio Nord",
  "identifier": [{"system": "https://clinic.example/org", "value": "CCN"}]}'

curl -X POST $BASE/Practitioner "${H[@]}" -d '{"resourceType": "Practitioner", "active": true,
  "name": [{"family": "Popescu", "given": ["Ana"], "prefix": ["Dr."]}]}'

curl -X POST $BASE/PractitionerRole "${H[@]}" -d '{"resourceType": "PractitionerRole", "active": true,
  "practitioner": {"reference": "Practitioner/'$PRACTITIONER'"},
  "organization": {"reference": "Organization/'$ORG'"},
  "code": [{"text": "Cardiologist"}]}'
```

Păstrați ID-urile returnate lângă înregistrările personalului dumneavoastră. Când cineva pleacă, setați `PractitionerRole` la `"active": false`; scrierile lor anterioare își păstrează numele, iar ei nu mai pot acționa prin sistemul dumneavoastră.

## Pasul 2: potrivirea pacienților

Pentru pacienții pe care clinica îi înregistrează, creați `Patient` cu numărul de înregistrare al clinicii ca identificator:

```bash
curl -X POST $BASE/Patient "${H[@]}" -d '{"resourceType": "Patient",
  "identifier": [{"system": "https://clinic.example/mrn", "value": "MRN-20981"}],
  "name": [{"family": "Dinu", "given": ["Andrei"]}], "gender": "male", "birthDate": "1968-11-05"}'
```

De atunci, găsiți pacientul după acel număr, niciodată după nume și data nașterii:

```bash
curl "$BASE/Patient?identifier=https://clinic.example/mrn|MRN-20981" -H "Authorization: Bearer $KEY"
```

**Când persoana are deja o înregistrare Anpheros**, din propria aplicație sau de la un alt furnizor, clinica nu creează o a doua. Aceasta solicită persoanei acces cu OAuth, de pe o tabletă la recepție sau printr-un link trimis înainte de vizită, folosind o aplicație **confidențială** (serverul clinicii păstrează secretul). Persoana își alege înregistrarea și cât timp clinica poate accesa aceasta. Pașii sunt detaliați în [Cum se implementează consimțământul pacientului cu SMART on FHIR](https://developers.anpheros.com/ro/guides/smart-on-fhir-backend); câmpul `patient` al token-ului este id-ul de stocat cu fișierul dumneavoastră.

## Pasul 3: scrieți o vizită ca o singură tranzacție

O vizită produce mai multe resurse care aparțin împreună. Trimiteți-le într-o `transaction` pentru ca acestea să fie stocate toate odată sau deloc, și specificați cine lucrează: `X-Anpheros-Acting-As` numește rolul medicului. Acesta devine autorul în Provenance, este scris în logul de acces și este afișat pacientului pe nume.

```bash
curl -X POST $BASE "${H[@]}" \
  -H "X-Anpheros-Acting-As: PractitionerRole/$ROLE" \
  -H "X-Anpheros-Author-Type: practitioner" \
  -H "X-Anpheros-Source-System: ccn-emr" -d '{
  "resourceType": "Bundle", "type": "transaction",
  "entry": [
    {"fullUrl": "urn:uuid:aa000000-0000-4000-8000-000000000001",
     "resource": {"resourceType": "Encounter", "status": "finished",
       "class": {"system": "http://terminology.hl7.org/CodeSystem/v3-ActCode", "code": "AMB", "display": "ambulatory"},
       "subject": {"reference": "Patient/'$PID'"},
       "serviceProvider": {"reference": "Organization/'$ORG'"},
       "participant": [{"individual": {"reference": "PractitionerRole/'$ROLE'"}}],
       "period": {"start": "2026-10-09T10:00:00Z", "end": "2026-10-09T10:30:00Z"}},
     "request": {"method": "POST", "url": "Encounter"}},
    {"resource": {"resourceType": "Observation", "status": "final",
       "category": [{"coding": [{"system": "http://terminology.hl7.org/CodeSystem/observation-category", "code": "vital-signs"}]}],
       "code": {"coding": [{"system": "http://loinc.org", "code": "8867-4", "display": "Heart rate"}]},
       "subject": {"reference": "Patient/'$PID'"},
       "encounter": {"reference": "urn:uuid:aa000000-0000-4000-8000-000000000001"},
       "effectiveDateTime": "2026-10-09T10:10:00Z",
       "valueQuantity": {"value": 92, "unit": "/min", "system": "http://unitsofmeasure.org", "code": "/min"}},
     "request": {"method": "POST", "url": "Observation"}},
    {"resource": {"resourceType": "Condition",
       "subject": {"reference": "Patient/'$PID'"},
       "encounter": {"reference": "urn:uuid:aa000000-0000-4000-8000-000000000001"},
       "clinicalStatus": {"coding": [{"system": "http://terminology.hl7.org/CodeSystem/condition-clinical", "code": "active"}]},
       "verificationStatus": {"coding": [{"system": "http://terminology.hl7.org/CodeSystem/condition-ver-status", "code": "provisional"}]},
       "code": {"coding": [{"system": "http://hl7.org/fhir/sid/icd-10", "code": "I48.0", "display": "Paroxysmal atrial fibrillation"}]}},
     "request": {"method": "POST", "url": "Condition"}}
  ]}'
```

`transaction-response` are `201 Created` pentru Encounter, Observation și Condition. Observation și Condition indică acum `Encounter/0ca25459-…` real. Provenance-ul fiecăruia numește rolul medicului, clinica și sistemul sursă:

```json
"agent": [{"who": {"reference": "PractitionerRole/e6d8c227-…",
                   "identifier": {"system": "https://anpheros.com/fhir/CodeSystem/author-type", "value": "practitioner"}},
           "onBehalfOf": {"reference": "Organization/c3a56a4b-…", "display": "Clinica Cardio Nord"}}],
"entity": [{"role": "source", "what": {"identifier": {"system": "ccn-emr"}}}]
```

Diagnosticul este `provisional` până când este confirmat. Actualizați-l la `confirmed` mai târziu, iar istoricul păstrează ambele. Ce înseamnă fiecare câmp este explicat în [Medical data provenance explained](https://developers.anpheros.com/ro/guides/medical-data-provenance).

## Pasul 4: Rezultate de laborator și documente

Rezultatele de la laboratorul propriu al clinicii sau rapoartele aduse de pacient trec prin conectorul de laborator într-o singură cerere per raport:

```bash
curl -X POST "https://platform.anpheros.com/v1/patients/$PID/labs/import" -H "Authorization: Bearer $KEY" \
     -H "Content-Type: x-application/hl7-v2+er7" -H "X-Anpheros-Source-System: ccn-lab" --data-binary @oru.hl7
```

Scrisorile și rezumatele de externare sunt documente: creați un `DocumentReference` prin `/v1/patients/{id}/documents` și încărcați PDF-ul. Fișierul original nu este niciodată modificat, iar valorile extrase din acesta indică înapoi către el. Consultați [Cum se importă rezultatele de laborator într-un fișier FHIR](https://developers.anpheros.com/ro/guides/import-lab-results-fhir) și [API-ul de date medicale](https://developers.anpheros.com/ro/guides/medical-data-api).

## Pasul 5: citiți ce au scris alți furnizori și respectați-vă aria de competență

Cu consimțământul pacientului, clinica citește întregul dosar în limitele domeniilor sale de aplicare, inclusiv ceea ce au adăugat alte clinici, laboratoare și pacientul. Poate modifica doar ceea ce a scris ea însăși. O actualizare sau ștergere a unui resursă al altei organizații va returna `403`, iar originalul va rămâne așa cum a fost. Pentru a corecta ceva scris de un alt furnizor, scrieți propria resursă (de exemplu, un nou `Condition` cu evaluarea dumneavoastră) și lăsați dosarul să arate ambele, fiecare cu autorul său.

Înainte de o vizită, `GET $BASE/Patient/$PID/$summary` oferă rezumatul internațional al pacientului din dosar: probleme, medicamente, alergii și semne vitale recente, din fiecare sursă.

## Pasul 6: Aflați despre date noi

Înregistrați un webhook o singură dată pentru proiectul clinicii:

```bash
curl -X POST https://platform.anpheros.com/v1/webhooks -H "Authorization: Bearer $KEY" -H "Content-Type: application/json" \
     -d '{"url": "https://ccn.example/anpheros/hook", "events": ["resource.created", "resource.updated", "consent.revoked"]}'
```

Când un alt proiect scrie într-o înregistrare la care clinica dvs. are acces, evenimentul indică acest lucru cu `data.external: true` și sursa, astfel încât EMR-ul dvs. să poată afișa „rezultate noi de la un alt laborator” fără a interoga. Un eveniment `consent.revoked` înseamnă că persoana a retras accesul clinicii: opriți sincronizarea acelei înregistrări. Semnăturile, reîncercările și sarcinile utile sunt acoperite în [Webhooks](https://developers.anpheros.com/ro/guides/webhooks).

## Ce vede pacientul

Pacientul vede vizita, ritmul cardiac și diagnosticul provizoriu în fișa sa, fiecare marcat ca fiind adăugat de Dr. Ana Popescu de la Clinica Cardio Nord. În conexiunile sale, aplicația clinicii listează fiecare acces, după nume atunci când un practician a acționat. Această transparență este ceea ce îi face pe pacienți dispuși să acorde acces următoarei clinici.

## Listă de verificare pentru lansarea în producție

- [ ] Organizații, Practicieni și Roluri Practician înregistrate; persoanele care părăsesc organizația setate ca inactive
- [ ] Pacienți identificați prin identificatorul clinicii, niciodată prin nume
- [ ] Înregistrări existente accesate prin consimțământ OAuth, fără duplicări
- [ ] Fiecare cerere de la personalul clinic conține `X-Anpheros-Acting-As`
- [ ] Vizite înregistrate ca tranzacții; diagnostice cu statutul corect de verificare
- [ ] Sistemul sursă setat la fiecare scriere; rapoarte de laborator prin conector
- [ ] Endpoint webhook care verifică semnăturile; `consent.revoked` gestionat
- [ ] Proiect de producție cu un DPA semnat (chei `sk_live_…`); vezi [Prețuri](https://developers.anpheros.com/ro/guides/pricing)

## Întrebări frecvente

### Are Anpheros un conector gata făcut pentru EMR-ul meu?
Nu. Nu există conectori gata făcuți pentru EMR-uri sau sisteme de laborator specifice; integrarea se construiește pe baza API-urilor FHIR R4 și REST, de obicei ca un mic serviciu lângă EMR. Mesajele de laborator HL7 v2 sunt acceptate așa cum sunt.

### Poate un medic să lucreze pentru două clinici?
Da. Un `Practitioner` poate avea un `PractitionerRole` la fiecare organizație. Rolul menționat în `X-Anpheros-Acting-As` decide pentru ce clinică este înregistrat fiecare scriere.

### Ce se întâmplă când pacientul revocă accesul clinicii?
Apelurile clinicii pentru acea înregistrare răspund cu `401`, iar un webhook `consent.revoked` este trimis. Ceea ce a scris clinica rămâne în dosarul pacientului cu proveniența sa; clinica pur și simplu nu mai poate citi sau modifica.

## Conexe

- [Integrații în domeniul sănătății](https://developers.anpheros.com/ro/guides/healthcare-integrations): toate modelele de integrare dintr-o privire
- [Proveniența datelor medicale explicată](https://developers.anpheros.com/ro/guides/medical-data-provenance)
- [Cum să implementați consimțământul pacientului cu SMART on FHIR](https://developers.anpheros.com/ro/guides/smart-on-fhir-backend)
- [Cum să importați rezultatele de laborator într-un fișier FHIR](https://developers.anpheros.com/ro/guides/import-lab-results-fhir)
- [Interoperabilitatea datelor din domeniul sănătății](https://developers.anpheros.com/ro/guides/interoperability)
