Seiteninhalt:
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 E-Rezept-Fachdienst durch die Apotheke – erstellt der E-Rezept-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.
Der E-Rezept-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 E-Rezept-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.
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:
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:
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.
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 E-Rezept-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:
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/Bundle-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 |
Nachdem der digitale Durchschlag E-T-Rezept erzeugt wurde, wird dieser RESTful über das Internet an den BfArM Webdienst übertragen.
Vorgaben zur Authentifizierung des E-Rezept-Fachdienstes gegenüber dem Webdienst sind in der Spezifikation des E-Rezept-Fachdienst beschrieben.
Die folgende OpenAPI-Definition dient als Hilfestellung bei der Implementierung des Aufrufs am BfArM Webdienst:
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"
]
}
]
}