# HL7 v2 migration to FHIR in French-speaking hospitals

> Inventory of interfaces for a French-speaking HIS: ADT/ORM/ORU, HPRIM Santé, INS overlay, and the HL7 v2-to-FHIR 1.0.0 STU 1 guide as a mapping contract — not a replacement for v2.

Author: Ala Ben Aicha

Canonical page: https://alabenaicha.me/insights/hl7v2-fhir-migration-francophone-hospitals

Updated: 2026-09-17

## Direct answer

Don't cut v2. Inventory ADT, ORM/ORU and, in France, HPRIM. Project PID to Patient with INS (OID 1.2.250.1.213.1.4.8). The HL7 v2-to-FHIR 1.0.0 STU 1 guide is the starting contract, not a replacement.

## Not the architectural playbook, the French-speaking inventory

The English page [HL7 v2 to FHIR migration](https://alabenaicha.me/insights/hl7v2-to-fhir-migration-strategy) describes the hybrid architecture (integration engine, shadow, toggle). **This is the inventory** that a French-speaking hospital must ask *before* this architecture: which protocols really speak, which identifiers pass through the firewall, which national overlay sticks to the `Patient` projected. Detail A01/A04/A08/A03 (PID-3, PV1-19) is in [ADT → Patient / Encounter](https://alabenaicha.me/insights/hl7-adt-to-fhir-patient-encounter) — I'm not rewriting it.

Departure mapping contract: [HL7 Version 2TB FHIR IG 1.0.0 STU 1](https://hl7.org/fhir/uv/v2mappings/) (generated October 7, 2025). Official URL: `http://hl7.org/fhir/uv/v2mappings/ImplementationGuide/hl7.fhir.uv.v2mappings`. Package: `hl7.fhir.uv.v2mappings#1.0.0` on FHIR R4. It's a card **cumulative standard**, not a French national GI.

## Three syntaxes that are not a single channel

In France, Interop'Santé still maintains **HPRIM** (XML / HPRIM Health) and **PN13-IS**, next to HL7 v2 and shutters [CI-SIS](https://esante.gouv.fr/doctrine/interoperabilite). A laboratory SIL can issue an HL7 2.5.1 ORU, an HPRIM Santé 2.4 ORU, or both. Treating them as “v2” in a single Mirth channel means mixing up the code tables and identifiers.

| Source                            | Typical trigger          | FHIR target (IG STU 1 departure)                           | French overlay                                                                           |
| --------------------------------- | ------------------------ | ---------------------------------------------------------- | ---------------------------------------------------------------------------------------- |
| **HL7 v2 ADT**                    | A01, A04, A08, A03       | `Patient` + `Encounter`                                    | INS on `Patient.identifier` ; PPI **in addition**, not instead                           |
| **HL7 v2 ORM/OML**                | O01 / O21                | `ServiceRequest`                                           | Prescriber = IDNatPS (`urn:oid:1.2.250.1.71.4.2.1`), not a noun in ST                    |
| **HL7 v2 ORU**                    | R01                      | `DiagnosticReport` + `Observation`                         | LOINC code if the component requires it; the local HPRIM code is not enough for the EHDS |
| **HPRIM Health**                  | ORM, ORA, ORU            | Same resources, **another parser**                         | HPRIM table 1 (context) and link type (L/C/R) ≠ MSH-9                                    |
| **PN13-IS**                       | Pharmacy / prescriptions | `MedicationRequest` / exemption according to the component | This is not a MedicationRequest EHDS MPD                                                 |
| **CDA CI-SIS** (HL7 v2 transport) | MDM / document           | `DocumentReference` / `Binary`                             | A CDA in an MLLP is not a Patient Summary EEHRxF                                         |

HPRIM Santé 2.5 documents ORM (requests), ORA (requests + admin), ORU (results). The version/binding type field is not MSH-12. If your inventory says "the entire lab is HL7", open an actual file.

## Identifiers: IPP, INS, and what PID-3 doesn't say

PID-3 is a **list**. In France, at least three assignment authorities step on each other if you don't make one. `identifier.system` distinct:

| Identifier         | Pinning system                | Where he lives today                                                                                                      | Trap to FHIR projection                                         |
| ------------------ | ----------------------------- | ------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------- |
| **PPI**            | Institution OID/URI           | Local PID-3, HPRIM, DPI                                                                                                   | FHIR upsert on IPP alone creates cross-establishment duplicates |
| **INS-NIR**        | `urn:oid:1.2.250.1.213.1.4.8` | INSi teleservice, profile [FR Core Patient INS](https://hl7.fr/ig/fhir/core/StructureDefinition-fr-core-patient-ins.html) | Copy the NIR from a card without status `VALI`                  |
| **INS-NIA**        | `urn:oid:1.2.250.1.213.1.4.9` | Waiting identity                                                                                                          | Merge it with the NIR in the same slice                         |
| **Stay number**    | Local OID                     | PV1-19 (see ADT article)                                                                                                  | Use it as `Patient.identifier`                                  |
| **RPPS / IDNatPS** | `urn:oid:1.2.250.1.71.4.2.1`  | PV1, ORC, HPRIM                                                                                                           | An internal prescriber code                                     |

The Patient intended for use **national or European** must carry the FR Core compliant INS, not just the SIH IPP. INS is not invented in the mapper: INSi, then slice `INS-NIR` / `INS-NIA`. Public fixtures use TEST/DEMO OIDs (`1.2.250.1.213.1.4.10` / `.4.11`), never a real NIR.

Example of de-identified (truncated MSH, **not** a production message):

```
MSH|^~\&|SIH|ETAB||DEST|20260917103000||ADT^A01|MSG-EXEMPLE|P|2.5
PID|||IPP-EXEMPLE^^^ETAB^PI||EXEMPLE^JEAN^^^^^D||19700101|M
PV1||I|||||||||||||||||SEJ-EXEMPLE|||||||||||||||||||||||||20260917103000
```

Map it: `IPP-EXEMPLE` + `system` establishment → `Patient.identifier` ; the stay → `Encounter.identifier` (PV1-19), not a second Patient. The INS does not appear **not** in this fragment: it is voluntary. Without INSi, you have no identity `VALI`.

## Shadow, toggle, rollback (short recall)

1. Inventory: issuer, version, volume, identifiers, clinical dependence.
2. Mapping rules on **several** real de-identified messages (correction A08, late ORU, HPRIM and v2 for the same exam).
3. Shadow phase in reading: reconcile missing items, duplicates, late corrections.
4. A single writing path; loop prevention; replay policy.
5. Rollback tested: cut the FHIR writer, restore v2/HPRIM routing, replay without duplicating orders.

The “4–8 week” durations of a spike are **illustrative**, not a quote. The English playbook details the engine architecture; here, the deliverable is **source × identifier × target matrix** signed by the interface owner.

## What this page is not

This is not a rip-and-replace, not an ANS certification, not an official Interop'Santé HPRIM mapping, not a legal opinion, not a clinical advice. The STU 1 guide does not publish a dedicated ConceptMap for each French trigger. I do not “migrate” your HIS into an article.

If you need the engine and the maps (v2, HPRIM, FHIR, INS), it's [HL7/FHIR integration](https://alabenaicha.me/services/hl7-fhir-integration). For a bounded spike, use the [contact with project intention](https://alabenaicha.me/contact?intent=project).
