# Comment intégrer les systèmes de clinique avec un backend FHIR

> Tutoriel : connecter un DME de clinique aux enregistrements FHIR R4 des patients — répertoire de médecins, correspondance par numéro d'enregistrement, une visite comme une transaction unique avec le médecin comme auteur, rapports de laboratoire, données d'autres fournisseurs et webhooks.

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

**Ce tutoriel connecte le logiciel d'une clinique (un DME, un système de gestion de cabinet ou un outil de réservation) aux enregistrements HL7 FHIR R4 des patients dans Anpheros : la clinique et ses médecins sont enregistrés dans le répertoire, les patients sont mis en correspondance par le numéro d'enregistrement de la clinique, une visite est enregistrée comme une transaction unique avec le médecin nommé comme auteur, et la clinique est informée des données ajoutées par d'autres fournisseurs.** Chaque requête est `curl` contre le bac à sable gratuit, et les réponses proviennent de la plateforme elle-même.

L'intégration s'exécute sur le serveur de la clinique, avec une clé API de projet pour les patients que la clinique enregistre et, pour les personnes qui ont déjà un enregistrement Anpheros, une autorisation OAuth qu'elles approuvent.

## Ce qui correspond à quoi

| Dans le système clinique | Dans FHIR R4 |
|---|---|
| la clinique, ses départements | `Organization` |
| un médecin ou une infirmière | `Practitioner` |
| cette personne travaillant dans cette clinique, avec une spécialité | `PractitionerRole` |
| le dossier du patient et son numéro | `Patient` avec un `identifier` dans le système de la clinique |
| une visite | `Encounter` |
| signes vitaux, résultats mesurés pendant la visite | `Observation` liés au `Encounter` |
| un diagnostic | `Condition` (ICD-10), avec `verificationStatus` provisoire ou confirmé |
| une prescription, traitement actuel | `MedicationStatement` (ATC) |
| une lettre, un compte rendu de sortie, une radiographie | `DocumentReference` avec le dossier |
| résultats de laboratoire | le [connecteur de laboratoire](https://developers.anpheros.com/fr/guides/lab-connector), dans `Observation` |

## Étape 1 : enregistrer la clinique et ses médecins

Les ressources de répertoire n'ont pas de patient. D'autres projets dans le même environnement peuvent les lire, de sorte que les autres prestataires d'un patient voient qui a écrit quoi, mais seul votre projet peut les modifier.

```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"}]}'
```

Conservez les identifiants retournés à côté de vos enregistrements du personnel. Lorsqu'une personne quitte l'organisation, définissez son `PractitionerRole` sur `"active": false` ; ses écritures passées conservent son nom, et elle ne peut plus agir via votre système.

## Étape 2 : faire correspondre les patients

Pour les patients que la clinique enregistre, créez le `Patient` avec le numéro d'enregistrement de la clinique comme identifiant :

```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"}'
```

À partir de ce moment, trouvez le patient par ce numéro, jamais par nom et date de naissance :

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

**Lorsque la personne a déjà un dossier Anpheros**, depuis sa propre application ou celle d'un autre fournisseur, la clinique n'en crée pas un second. Elle demande à la personne un accès avec OAuth, depuis une tablette à la réception ou un lien envoyé avant la visite, en utilisant une application **confidential** (le serveur de la clinique conserve le secret). La personne choisit son dossier et la durée pendant laquelle la clinique peut y accéder. Les étapes sont décrites dans [Comment implémenter le consentement du patient avec SMART on FHIR](https://developers.anpheros.com/fr/guides/smart-on-fhir-backend) ; le champ `patient` du token est l'id à stocker avec votre fichier.

## Étape 3 : écrire une visite en une seule transaction

Une visite produit plusieurs ressources qui vont ensemble. Envoyez-les dans une `transaction` afin qu'elles soient stockées toutes en même temps ou pas du tout, et indiquez qui travaille : `X-Anpheros-Acting-As` nomme le rôle du médecin. Il devient l'auteur dans Provenance, est écrit dans le journal d'accès et est affiché au patient par son nom.

```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"}}
  ]}'
```

La `transaction-response` contient `201 Created` pour l'Encounter, l'Observation et la Condition. L'Observation et la Condition pointent maintenant vers le véritable `Encounter/0ca25459-…`. La Provenance de chacune nomme le rôle du médecin, la clinique et le système source :

```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"}}}]
```

Le diagnostic est `provisional` jusqu'à sa confirmation. Mettez-le à jour vers `confirmed` plus tard, et l'historique conserve les deux. La signification de chaque champ est expliquée dans [Provenance des données médicales expliquée](https://developers.anpheros.com/fr/guides/medical-data-provenance).

## Étape 4 : Résultats de laboratoire et documents

Les résultats du laboratoire de la clinique, ou les rapports apportés par le patient, passent par le connecteur de laboratoire en une requête par rapport :

```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
```

Les lettres et les résumés de sortie sont des documents : créez un `DocumentReference` via `/v1/patients/{id}/documents` et téléchargez le PDF. Le fichier original n'est jamais modifié, et les valeurs qui en sont extraites y renvoient. Voir [Comment importer des résultats de laboratoire dans un enregistrement FHIR](https://developers.anpheros.com/fr/guides/import-lab-results-fhir) et [API de données médicales](https://developers.anpheros.com/fr/guides/medical-data-api).

## Étape 5 : lire ce que d'autres fournisseurs ont écrit, et rester dans votre domaine

Avec le consentement du patient, la clinique lit l'intégralité du dossier dans ses périmètres, y compris ce que d'autres cliniques, laboratoires et le patient ont ajouté. Elle ne peut modifier que ce qu'elle a écrit elle-même. Une mise à jour ou une suppression d'une ressource d'une autre organisation répond `403`, et l'original reste tel quel. Pour corriger quelque chose qu'un autre fournisseur a écrit, écrivez votre propre ressource (par exemple, un nouveau `Condition` avec votre évaluation) et laissez le dossier montrer les deux, chacun avec son auteur.

Avant une visite, `GET $BASE/Patient/$PID/$summary` fournit le Résumé International du Patient du dossier : problèmes, médicaments, allergies et signes vitaux récents, provenant de toutes les sources.

## Étape 6 : être informé des nouvelles données

Enregistrez un webhook une seule fois pour le projet de la clinique :

```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"]}'
```

Lorsqu'un autre projet écrit dans un enregistrement auquel votre clinique peut accéder, l'événement l'indique avec `data.external: true` et la source, afin que votre DME puisse afficher "nouveaux résultats d'un autre laboratoire" sans interroger. Un événement `consent.revoked` signifie que la personne a retiré l'accès de la clinique : arrêtez de synchroniser cet enregistrement. Les signatures, les nouvelles tentatives et les charges utiles sont abordées dans [Webhooks](https://developers.anpheros.com/fr/guides/webhooks).

## Ce que le patient voit

Le patient voit la visite, la fréquence cardiaque et le diagnostic provisoire dans son dossier, chacun marqué comme ajouté par le Dr Ana Popescu à la Clinica Cardio Nord. Dans ses connexions, l'application de la clinique liste chaque accès, par nom lorsqu'un praticien était en action. Cette transparence est ce qui incite les patients à accorder l'accès à la clinique suivante.

## Liste de contrôle pour la mise en production

- [ ] Organisation, praticiens et rôles de praticiens enregistrés ; les départs sont marqués comme inactifs
- [ ] Patients identifiés par l'identifiant de la clinique, jamais par le nom
- [ ] Dossiers existants accessibles via le consentement OAuth, sans duplication
- [ ] Chaque requête du personnel clinique inclut `X-Anpheros-Acting-As`
- [ ] Visites enregistrées comme transactions ; diagnostics avec le bon statut de vérification
- [ ] Système source défini sur chaque écriture ; rapports de laboratoire via le connecteur
- [ ] Point de terminaison Webhook vérifiant les signatures ; `consent.revoked` géré
- [ ] Projet de production avec un DPA signé (clés `sk_live_…`) ; voir [Tarification](https://developers.anpheros.com/fr/guides/pricing)

## Questions fréquemment posées

### Anpheros dispose-t-il d'un connecteur prêt à l'emploi pour mon DME ?
Non. Il n'existe pas de connecteurs prêts à l'emploi pour des DME ou des systèmes de laboratoire spécifiques ; l'intégration est construite contre les API FHIR R4 et REST, généralement sous la forme d'un petit service à côté du DME. Les messages de laboratoire HL7 v2 sont acceptés tels quels.

### Un médecin peut-il travailler pour deux cliniques ?
Oui. Un `Practitioner` peut avoir un `PractitionerRole` dans chaque organisation. Le rôle nommé dans `X-Anpheros-Acting-As` décide pour quelle clinique chaque écriture est enregistrée.

### Que se passe-t-il lorsque le patient révoque l'accès de la clinique ?
Les appels de la clinique pour cet enregistrement répondent `401`, et un webhook `consent.revoked` est envoyé. Ce que la clinique a écrit reste dans le dossier du patient avec sa provenance ; la clinique ne peut tout simplement plus le lire ou le modifier.

## Liens Utiles

- [Intégrations de santé](https://developers.anpheros.com/fr/guides/healthcare-integrations) : tous les modèles d'intégration en un coup d'œil
- [Provenance des données médicales expliquée](https://developers.anpheros.com/fr/guides/medical-data-provenance)
- [Comment implémenter le consentement du patient avec SMART on FHIR](https://developers.anpheros.com/fr/guides/smart-on-fhir-backend)
- [Comment importer les résultats de laboratoire dans un enregistrement FHIR](https://developers.anpheros.com/fr/guides/import-lab-results-fhir)
- [Interopérabilité des données de santé](https://developers.anpheros.com/fr/guides/interoperability)
