# Cum să stocați dosare medicale folosind FHIR R4

> Tutorial: creați un Pacient, o Observație a tensiunii arteriale și o Condiție, folosiți o tranzacție, căutați, actualizați cu istoric și citiți proveniența — fiecare cerere cu curl și răspunsul real, pe sandbox-ul gratuit.

Source: https://developers.anpheros.com/ro/guides/store-medical-records-fhir

**Acest tutorial stochează un mic dosar medical ca resurse HL7 FHIR R4: un `Patient`, o `Observation` a tensiunii arteriale și un diagnostic sub forma unui `Condition`, apoi un pacient și o măsurătoare împreună într-o singură tranzacție. Le caută, actualizează diagnosticul fără a pierde versiunea anterioară și citește cine a scris ce. Fiecare cerere este `curl` simplu împotriva sandbox-ului gratuit Anpheros, iar fiecare răspuns afișat este ceea ce returnează API-ul.

Dacă sunteți nou în FHIR, citiți mai întâi [Platforma FHIR](https://developers.anpheros.com/ro/guides/fhir) pentru concepte. Această pagină este partea practică.

## Cele trei resurse cu care încep majoritatea înregistrărilor

| Resursă | Ce conține | Codificat cu |
|---|---|---|
| `Patient` | despre cine este înregistrarea: nume, data nașterii, gen, identificatori din alte sisteme | sistemele dvs. de identificare |
| `Observation` | orice este măsurat sau raportat: semne vitale, rezultate de laborator, o greutate, un scor de simptome | LOINC, unități UCUM |
| `Condition` | un diagnostic sau o problemă de sănătate, cu stadiul său în timp | ICD-10 (SNOMED CT în spatele unui indicator de licență) |

Medicamentele (`MedicationStatement`), alergiile (`AllergyIntolerance`), imunizările și documentele urmează același model; cele [26 de tipuri de resurse suportate](https://developers.anpheros.com/ro/guides/fhir) sunt listate în declarația de capabilități la `/fhir/R4/metadata`.

## Înainte de a începe

Obțineți o cheie de sandbox (`sk_test_…`) la [platform.anpheros.com/dashboard](https://platform.anpheros.com/dashboard/) cu opțiunea **Get a sandbox key**. Nimic din ceea ce creați acolo nu reprezintă date reale ale pacienților și nimic nu este vizibil pentru alte proiecte.

```bash
export BASE=https://platform.anpheros.com/fhir/R4
export KEY=sk_test_…
```

## Pasul 1: Crearea unui pacient

```bash
curl -X POST "$BASE/Patient" -H "Authorization: Bearer $KEY" -H "Content-Type: application/fhir+json" -d '{
  "resourceType": "Patient",
  "identifier": [{"system": "https://clinic.example/mrn", "value": "MRN-10442"}],
  "name": [{"family": "Marin", "given": ["Ioana"]}],
  "gender": "female",
  "birthDate": "1979-04-12"
}'
```

`201 Created`, cu id-ul și versiunea alocate de server:

```json
{"resourceType": "Patient",
 "identifier": [{"system": "https://clinic.example/mrn", "value": "MRN-10442"}],
 "name": [{"family": "Marin", "given": ["Ioana"]}], "gender": "female", "birthDate": "1979-04-12",
 "id": "d09e3942-ed86-4458-b099-fa674ab21b84",
 "meta": {"versionId": "1", "lastUpdated": "2026-10-12T20:16:51.043Z"}}
```

Păstrați propriile id-uri în `identifier` cu un `system` pe care îl controlați (aici un număr de înregistrare al clinicii), astfel încât să puteți găsi întotdeauna pacientul din nou cu `GET $BASE/Patient?identifier=https://clinic.example/mrn|MRN-10442`. `id` FHIR este al platformei și este specific proiectului dumneavoastră: un alt proiect vede aceeași persoană sub un id diferit.

```bash
export PID=d09e3942-ed86-4458-b099-fa674ab21b84
```

## Pasul 2: stocarea unei măsurători ca Observație

Tensiunea arterială este o observație cu două componente, sistolică și diastolică, fiecare cu propriul cod LOINC. Specificați cine a efectuat măsurătoarea: aici un dispozitiv de acasă.

```bash
curl -X POST "$BASE/Observation" -H "Authorization: Bearer $KEY" -H "Content-Type: application/fhir+json" \
     -H "X-Anpheros-Author-Type: device" -H "Idempotency-Key: bp-2026-10-10-0830" -d '{
  "resourceType": "Observation",
  "status": "final",
  "category": [{"coding": [{"system": "http://terminology.hl7.org/CodeSystem/observation-category", "code": "vital-signs"}]}],
  "code": {"coding": [{"system": "http://loinc.org", "code": "85354-9", "display": "Blood pressure panel"}]},
  "subject": {"reference": "Patient/'$PID'"},
  "effectiveDateTime": "2026-10-10T08:30:00Z",
  "component": [
    {"code": {"coding": [{"system": "http://loinc.org", "code": "8480-6"}]},
     "valueQuantity": {"value": 138, "unit": "mmHg", "system": "http://unitsofmeasure.org", "code": "mm[Hg]"}},
    {"code": {"coding": [{"system": "http://loinc.org", "code": "8462-4"}]},
     "valueQuantity": {"value": 88, "unit": "mmHg", "system": "http://unitsofmeasure.org", "code": "mm[Hg]"}}
  ]
}'
```

Răspunsul este resursa stocată cu `id` și `meta.versionId: "1"`. Trei detalii sunt importante pentru un record utilizabil:

- **Coduri, nu etichete.** `85354-9` înseamnă „panel tensiune arterială” în orice sistem FHIR; un text liber „BP” nu înseamnă. Căutați coduri cu `GET /v1/terminology/loinc?q=blood pressure` ([Sisteme de coduri FHIR](https://developers.anpheros.com/ro/guides/fhir-code-systems)).
- **Unități UCUM** (`mm[Hg]`, `kg`, `mg/dL`) în `valueQuantity.code`, astfel încât valorile să poată fi comparate și convertite.
- **`Idempotency-Key`.** O reîncercare după un timeout returnează primul răspuns în loc să stocheze citirea de două ori.

Rezultatele de laborator sunt aceeași resursă cu `category` `laboratory` și, de obicei, un `referenceRange`. Pentru a importa rapoarte de laborator complete, consultați [Cum se importă rezultatele de laborator într-un record FHIR](https://developers.anpheros.com/ro/guides/import-lab-results-fhir).

## Pasul 3: înregistrați un diagnostic ca o Condiție

```bash
curl -X POST "$BASE/Condition" -H "Authorization: Bearer $KEY" -H "Content-Type: application/fhir+json" \
     -H "X-Anpheros-Author-Type: practitioner" -d '{
  "resourceType": "Condition",
  "subject": {"reference": "Patient/'$PID'"},
  "clinicalStatus": {"coding": [{"system": "http://terminology.hl7.org/CodeSystem/condition-clinical", "code": "active"}]},
  "verificationStatus": {"coding": [{"system": "http://terminology.hl7.org/CodeSystem/condition-ver-status", "code": "confirmed"}]},
  "code": {"coding": [{"system": "http://hl7.org/fhir/sid/icd-10", "code": "I10", "display": "Essential (primary) hypertension"}]},
  "onsetDateTime": "2026-03-02"
}'
```

`clinicalStatus` (activă, rezolvată, în remisie) și `verificationStatus` (confirmată, provizorie) sunt separate intenționat: un diagnostic suspectat nu este același lucru cu unul confirmat, iar o problemă rezolvată face în continuare parte din istoric.

## Pasul 4: crearea resurselor asociate într-o singură tranzacție

Când un pacient și prima sa măsurătoare sosesc împreună, de exemplu dintr-un sistem de clinică, trimiteți-le ca un `transaction` Bundle. Fie totul este stocat, fie nimic nu este. Referințele între resursele noi folosesc `urn:uuid:` id-uri temporare pe care serverul le înlocuiește:

```bash
curl -X POST "$BASE" -H "Authorization: Bearer $KEY" -H "Content-Type: application/fhir+json" -d '{
  "resourceType": "Bundle", "type": "transaction",
  "entry": [
    {"fullUrl": "urn:uuid:9f1c0d1e-0000-4000-8000-000000000001",
     "resource": {"resourceType": "Patient", "name": [{"family": "Stan", "given": ["Mihai"]}], "gender": "male", "birthDate": "1990-02-01"},
     "request": {"method": "POST", "url": "Patient"}},
    {"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": "29463-7", "display": "Body weight"}]},
       "subject": {"reference": "urn:uuid:9f1c0d1e-0000-4000-8000-000000000001"},
       "effectiveDateTime": "2026-10-10",
       "valueQuantity": {"value": 82.4, "unit": "kg", "system": "http://unitsofmeasure.org", "code": "kg"}},
     "request": {"method": "POST", "url": "Observation"}}
  ]
}'
```

`transaction-response` are o intrare per resursă, cu `"status": "201 Created"`, `location` și resursa stocată. `subject`-ul Observation indică acum `Patient/fad3665a-…`-ul real.

## Pasul 5: căutare

```bash
curl "$BASE/Observation?patient=$PID&code=http://loinc.org|85354-9&date=ge2026-10-01&_sort=-date" \
     -H "Authorization: Bearer $KEY"
```

Veți primi un `searchset` Bundle cu `total` și resursele corespondente, cele mai noi primele. Alte căutări pe care le veți folosi frecvent: `Condition?patient=$PID&clinical-status=active`, `Observation?patient=$PID&category=laboratory` și `Patient/$PID/$everything` pentru întregul dosar.

## Pasul 6: actualizare fără pierderea istoricului

Hipertensiunea arterială se rezolvă. Modificați starea și adăugați data de încheiere, și folosiți `If-Match` cu versiunea pe care ați citit-o pentru a nu suprascrie niciodată modificarea altcuiva:

```bash
curl -X PUT "$BASE/Condition/$CID" -H "Authorization: Bearer $KEY" -H "Content-Type: application/fhir+json" \
     -H 'If-Match: W/"1"' -d '{ …the same Condition…, "clinicalStatus": {"coding": [{"system": "http://terminology.hl7.org/CodeSystem/condition-clinical", "code": "resolved"}]}, "abatementDateTime": "2026-10-11" }'
```

`200 OK` cu `ETag: W/"2"`. Dacă o altă scriere a ajuns acolo prima, veți primi `412` și veți citi din nou. Versiunea anterioară este încă acolo:

```bash
curl "$BASE/Condition/$CID/_history" -H "Authorization: Bearer $KEY"
```

returnează ambele versiuni: `versionId` 2 (`resolved`) și 1 (`active`). `GET $BASE/Condition/$CID/_history/1` citește versiunea veche. Nimic dintr-o înregistrare nu este suprascris silențios.

## Pasul 7: vedeți cine a scris ce

Fiecare scriere creează o resursă `Provenance`. Pentru înregistrarea tensiunii arteriale:

```bash
curl "$BASE/Provenance?target=Observation/$OBS" -H "Authorization: Bearer $KEY"
```

```json
{"resourceType": "Provenance",
 "target": [{"reference": "Observation/d83d9075-…/_history/1"}],
 "recorded": "2026-10-12T20:16:51.056000Z",
 "activity": {"coding": [{"system": "http://terminology.hl7.org/CodeSystem/v3-DataOperation", "code": "CREATE"}]},
 "agent": [{"type": {"coding": [{"system": "http://terminology.hl7.org/CodeSystem/provenance-participant-type", "code": "author"}]},
            "who": {"identifier": {"system": "https://anpheros.com/fhir/CodeSystem/author-type", "value": "device"}, "display": "proj_…"},
            "onBehalfOf": {"identifier": {"system": "https://anpheros.com/fhir/sid/organization", "value": "org_…"}, "display": "…"}}]}
```

Tipul autorului pe care l-ați trimis (`device`) este înregistrat împreună cu proiectul și organizația. Trimiteți `X-Anpheros-Author-Ref: Practitioner/<id>` pentru a numi clinicianul din spatele unei scrieri.

## Pasul 8: înregistrarea ca rezumat

```bash
curl "$BASE/Patient/$PID/\$summary" -H "Authorization: Bearer $KEY"
```

returnează un Rezumat Internațional al Pacientului (International Patient Summary): un `document` Bundle care începe cu un `Composition` și are secțiuni precum Probleme, Medicație, Alergii și Semne vitale, construit din resursele de mai sus. Acesta este formatul de transmis către un alt sistem sau de tipărit pentru un medic ([platforma FHIR](https://developers.anpheros.com/ro/guides/fhir)).

## Preferi JSON fără FHIR?

Aceleași date sunt disponibile printr-o vizualizare REST mai simplă, `/v1`, cu aceleași ID-uri: `POST /v1/patients/{id}/observations` preia `{"code": "85354-9", "category": "vital-signs", "effective_at": "…", "components": […]}` și stochează același FHIR Observation. Folosește ce se potrivește codului tău. Vezi [Medical data API](https://developers.anpheros.com/ro/guides/medical-data-api) și [SDKs](https://developers.anpheros.com/ro/guides/sdks).

## Întrebări frecvente

### Care este cea mai bună modalitate de a stoca dosare medicale?
Ca resurse codificate, versionate, cu o înregistrare a cine a scris fiecare. HL7 FHIR R4 vă oferă structura (Patient, Observation, Condition și altele), sisteme de codificare standard precum LOINC și ICD-10, și istoric; un backend FHIR adaugă căutare, consimțământ și proveniență deasupra.

### Am nevoie de un server FHIR pentru a utiliza FHIR?
Aveți nevoie de un loc care stochează și caută resurse FHIR și impune cine le poate citi. Puteți rula singur un server FHIR open-source sau puteți utiliza unul gestionat precum Anpheros; [Cum se compară Anpheros cu alte servere FHIR](https://developers.anpheros.com/ro/guides/fhir-server-comparison) analizează opțiunile, iar [FHIR vs. o bază de date medicală personalizată](https://developers.anpheros.com/ro/guides/fhir-vs-custom-database) acoperă crearea propriului schemă în schimb.

### Cum stochez tensiunea arterială în FHIR?
Ca o singură `Observation` cu codul LOINC `85354-9` și două `component` intrări: sistolică `8480-6` și diastolică `8462-4`, fiecare cu o `valueQuantity` în `mm[Hg]`.

### Pot modifica o resursă stocată?
Da, cu `PUT` și `If-Match`. Fiecare modificare creează o nouă versiune; versiunile anterioare rămân lizibile prin `_history`, iar Provenance înregistrează cine a făcut fiecare modificare. Ștergerile sunt soft și păstrează istoricul.

## Conexe

- [Platforma FHIR](https://developers.anpheros.com/ro/guides/fhir): conceptele, tipurile de resurse și operațiunile
- [Sisteme de coduri FHIR](https://developers.anpheros.com/ro/guides/fhir-code-systems): LOINC, ICD-10, ATC, UCUM
- [Cum se importă rezultatele de laborator într-un fișier FHIR](https://developers.anpheros.com/ro/guides/import-lab-results-fhir)
- [API pentru date medicale](https://developers.anpheros.com/ro/guides/medical-data-api): vizualizarea REST mai simplă a acelorași date
- [Bază de date și sandbox FHIR gratuite](https://developers.anpheros.com/ro/guides/free-fhir-database)
