TIFlow - Datenaustausch BfArM Webdienst
Version 2.0.0-ballot.1 - ci-build

## Technische Umsetzung - Mapping des digitalen Durchschlags

Nach geltenden gesetzlichen Regelungen ist dem BfArM nach Abgabe einer Verordnung eines Arzneimittels nach §3a Abs. 1 Satz 1 AMVV, also die teratogenen Wirkstoffe Lenalidomid, Pomalidomid oder Thalidomid, ein digitaler Durchschlag des E-T-Rezepts zu übermitteln.

Nach erfolgreichem Abschluss eines E-T-Rezept-Workflows - konkret durch den Aufruf der FHIR-Operation `$close` am TI-Flow-Fachdienst durch die Apotheke - erstellt der TI-Flow-Fachdienst für das betroffene E-T-Rezept ein Dokument gemäß dem Profil digitaler Durchschlag T-Rezept und überträgt dieses automatisiert und asynchron an den Webdienst des BfArM. Bei einer temporären Nicht-Erreichbarkeit des BfArM wird die zuverlässige Übertragung durch Backoff-Retry-Mechanismen sichergestellt.

Hintergründe zum Datenmodell und zu den Designentscheidungen finden sich unter Informationen zum Datenmodell.

### Erstellen des digitalen Durchschlags

Der TI-Flow-Fachdienst erstellt ein Artefakt mit dem Profil “digitaler Durchschlag T-Rezept”. Dabei werden Informationen aus der Verordnung, der Dispensierung (Abgabe) und dem FHIR-VZD (Verzeichnisdienst) genutzt. Die fachlichen Inhalte, die hierbei übertragen werden, sind im Logisches Modell digitaler Durchschlag E-T-Rezept abgebildet.

Der TI-Flow-Fachdienst erzeugt diesen Datensatz aus den Eingangsdaten, die nach abschliessender Bereitstellung der Dispensierinformation im E-Rezept-Workflows zur Verfügung stehen. Der relevante Workflow-Typ ist der Flowtype 166 (“Flowtype für Arzneimittel nach § 3a AMVV”), der speziell für diesen Anwendungsfall eingeführt wurde.

### Mapping des digitalen Durchschlags E-T-Rezept

Zur Unterstützung der Implementierung stehen in diesem Projekt StructureMaps bereit, mit denen das Mapping der Eingangsdaten automatisiert erfolgen kann. Die Vorgehensweise ist wie folgt:

#### Grundlegender Mapping-Ansatz

- Es werden alle vorhandenen Quellinformationen in den digitalen Durchschlag übernommen, sofern sie im Zielprofil erlaubt und nicht verboten sind.
- KBV-Extensions werden in Extensions gemappt, die im Packge de.gematik.epa.* definiert wurden.
- Die jeweiligen Zielprofile enthalten Mapping-Tabellen, die aufzeigen, welche Daten aus der Quelle übernommen und wie sie im Ziel abgebildet werden.

#### Vorgehen zur Nutzung der StructureMaps

Die zentrale Mappingdefinition von Quelldaten zum digitalen Durchschlag ist in der StructureMap für digitalen Durchschlag beschrieben. Diese importiert alle projektrelevanten Mappingdaten. Als Eingangsartefakt wird ein FHIR-Bundle benötigt, das folgende Elemente enthält:

- Medikationsanfrage und Arzneimittel der Verordnung nach eRezept der KBV
- Vorgangs- und Dispensierinformationen nach E-Rezept-Workflow der gematik
- Informationen der Apotheke aus dem FHIR-VZD

##### Bundle zum Mapping

Die für das Mapping erforderlichen Informationen können im Mapping-Bundle mit `type: collection` wie folgt zusammengefasst und erstellt werden:

Im Folgenden wird beschrieben, wie das Mapping mit StructureMaps umgesetzt werden kann.

#### Anwendung der StructureMap

Die StructureMap ERP-TPrescription-StructureMap-CarbonCopy kann mittels Java HAPI-FHIR auf ein Mapping-Bundle angewendet werden.

Das Mapping sieht im Wesentlichen die folgende Übertragung vor:

Der Signaturzeitpunkt als Quelle ist in den Mappingartefakten nicht enthalten, da dieser nicht aus einer FHIR-Struktur hervorgeht, sondern aus der QES am Element `1.2.840.113549.1.9.5 signingTime` extrahiert werden muss. Der TI-Flow-Fachdienst transformiert diesen Wert in den FHIR-Datentyp `instant` mit maximaler Sekundengenauigkeit (Format: YYYY-MM-DDThh:mm:ss+zz:zz, z.B. 2026-01-01T00:00:00Z).

Die StructureMap überführt das Mapping-Bundle in den digitalen Durchschlag und ruft dabei selbst weitere StructureMaps auf, die die jeweiligen Unterprofile mappen. Diese können auch entwicklungsunterstützend genutzt werden:

Quellartefakt | Zielprofil | StructureMap
--- | --- | ---
KBV_Prescription (MedicationRequest) | E-T-Rezept Medication Request | StructureMap-MedicationRequest
KBV_Medication_PZN | E-T-Rezept Medication | StructureMap-StructureMap-KBV-PZN-Medication
KBV_Medication_Ingredient | E-T-Rezept Medication | StructureMap-StructureMap-KBV-Ingredient-Medication
KBV_Medication_Compounding | E-T-Rezept Medication | StructureMap-StructureMap-KBV-Compounding-Medication
KBV_Medication_FreeText | E-T-Rezept Medication | StructureMap-StructureMap-KBV-FreeText-Medication
GEM_ERP_PR_Medication | E-T-Rezept Medication | StructureMap-StructureMap-GEM-Medication
GEM_MedicationDispense | E-T-Rezept Medication Dispense | StructureMap-StructureMap-MedicationDispense

Für das Mapping werden die Artefakte aus dem FHIR-VZD benötigt. Diese bestehen aus einem Bundle mit den FHIR-Ressourcen Organization, HealthcareService und Location. Hierzu gibt es das Beispiel Bundle-VZD-SearchSet-Bundle. Die StructureMap-StructureMap-Organization überführt eine solche Organization in ein Artefakt für den digitalen Durchschlag.

#### HAPI FHIR Transformation

Um HAPI FHIR zur Transformation zu nutzen, müssen FHIR-Version, die verwendeten FHIR-Packages für das Mapping sowie der Output-Pfad angegeben werden. Zum Test kann der folgende Befehl auf der Root Ebene des GitHub Repositories ausgeführt werden (Lokaler Pfad zum HAPI FHIR muss angegeben werden):

    sushi && \
    java -jar <path-to>/fhir_hapi.jar fsh-generated/resources/example-case-01-mapping-bundle.json \
    -transform https://gematik.de/fhir/erp-t-prescription/StructureMap/ERPTPrescriptionStructureMapCarbonCopy \
    -version 4.0.1 \
    -ig ./fsh-generated/resources \
    -ig de.gematik.erezept-workflow.r4 \
    -ig kbv.ita.erp \
    -ig de.gematik.fhir.directory \
    -ig de.gematik.ti \
    -output ./digitaler_durchschlag_e_t_rezept.json

Die Mapping-Engine im FHIR-HAPI transformiert das Bundle in einen digitalen Durchschlag E-T-Rezept.

Die folgenden Beispiele können als Referenz herangezogen werden:

Beispiel | Beschreibung
--- | ---
Bundle-Mapping-Bundle | Beispiel eines Mapping-Bundles zur Erzeugung eines digitalen Durchschlags E-T-Rezept
TRP-Carbon-Copy | Manuell erzeugter digitaler Durchschlag E-T-Rezept
Mapped CarbonCopy | Von der HAPI Transformation Engine erzeugtes JSON

### Übertragen des digitalen Durchschlags

Nachdem der digitale Durchschlag E-T-Rezept erzeugt wurde, wird dieser RESTful über das Internet an den BfArM Webdienst übertragen.

Vorgaben zur Authentifizierung des TI-Flow-Fachdienstes gegenüber dem Webdienst sind in der Spezifikation des TI-Flow-Fachdienst beschrieben.

Die API für den Endpunkt am BfArM Webdienst ist in E-Rezept API Dokumentation zum Datenaustausch mit dem BfArM dokumentiert.

### Fehlerbehandlung der Übertragung

Im Falle, dass der BfArM Webdienst die übertragene Instanz abweist, z.B. aufgrund von invaliden Datenfeldern, wird ein Fehlercode `400 Bad Request`, sowie eine FHIR-OperationOutcome bereitgestellt. Diese enthält wesentliche Angaben dazu, was für eine Art von Fehler aufgetreten ist. Es gibt keine enummerierte Liste von Fehlerkategorien, sondern jeweils eine Freitextangabe der Fehlerauswertung.

Folgende Instanz dient als Beispiel für eine Response mit Fehlercode 400:

    {
      "resourceType" : "OperationOutcome",
      "id" : "ERP-TPrescription-OperationOutcome-1",
      "text" : {
        "status" : "generated",
        "div" : "<div xmlns=\"http://www.w3.org/1999/xhtml\"><p class=\"res-header-id\"><b>Generated Narrative: OperationOutcome ERP-TPrescription-OperationOutcome-1</b></p><a name=\"ERP-TPrescription-OperationOutcome-1\"> </a><a name=\"hcERP-TPrescription-OperationOutcome-1\"> </a><blockquote><p><b>issue</b></p><p><b>severity</b>: Error</p><p><b>code</b>: Invalid Content</p><p><b>details</b>: <span title=\"Codes:\">Invalid request payload</span></p><p><b>diagnostics</b>: This field is required</p><p><b>expression</b>: parameter[rxPrescription].part[prescriptionId].value</p></blockquote><blockquote><p><b>issue</b></p><p><b>severity</b>: Error</p><p><b>code</b>: Element value invalid</p><p><b>details</b>: <span title=\"Codes:\">Invalid format for field</span></p><p><b>diagnostics</b>: Value must be a date</p><p><b>expression</b>: parameter[rxPrescription].part[medicationRequest].resource.authoredOn</p></blockquote></div>"
      },
      "issue" : [
        {
          "severity" : "error",
          "code" : "invalid",
          "details" : {
            "text" : "Invalid request payload"
          },
          "diagnostics" : "This field is required",
          "expression" : [
            "parameter[rxPrescription].part[prescriptionId].value"
          ]
        },
        {
          "severity" : "error",
          "code" : "value",
          "details" : {
            "text" : "Invalid format for field"
          },
          "diagnostics" : "Value must be a date",
          "expression" : [
            "parameter[rxPrescription].part[medicationRequest].resource.authoredOn"
          ]
        }
      ]
    }