Medication IG DE, published by HL7 Deutschland e.V.. This guide is not an authorized publication; it is the continuous build for version 2.0.0-ballot built by the FHIR (HL7® FHIR® Standard) CI Build. This version is based on the current content of https://github.com/hl7germany/medication-ig-de-r4/ and changes regularly. See the Directory of published versions
Diese Seite beschreibt, wie Dosierungen aus dem dgMP-Profilstand 1.0.7 technisch in den Profilstand 2.0.0 überführt werden. Beschrieben wird ausschließlich die Abbildung der FHIR-Strukturen. Wie ein System die Migration organisiert, ob und wie es Quelldaten aufbewahrt, protokolliert oder mit nicht überführbaren Daten umgeht, liegt beim jeweiligen System und ist nicht Gegenstand dieses Leitfadens.
Grundsatz: Die Überführung erhält die Aussage der Quelldosierung. Zahlenwerte werden nicht gerundet und nicht in andere Einheiten umgerechnet. Neue Angaben werden nur in zwei Fällen ergänzt: Ein vorhandenes boundsDuration wird in die übrigen Dosage-Elemente kopiert (M10), und einem reinen 4-Schema im Freitext wird täglich: vorangestellt (M04). Doppelte Werte innerhalb eines Dosage-Elements werden zusammengeführt und frequency wird an die verbleibenden Werte angepasst (M14). Die Anzeigeeinheit einer Dosis wird auf den Anzeigetext ihres Codes gesetzt (M15). Bei M03 und M11 wird der vorhandene Dosierungstext der Quelle als Freitext übernommen (M03/M11). Für andere nicht überführbare strukturierte Dosierungen gilt der Freitext-Fallback.
| Ressourcentyp | Dosierungsfeld |
|---|---|
MedicationRequest |
dosageInstruction |
MedicationDispense |
dosageInstruction |
MedicationStatement |
dosage |
Betrachtet werden Dosierungen, die dem DosageDgMP-/TimingDgMP-Profil 1.0.7 entsprechen. Bestandsdaten, die bereits das Profil 1.0.7 verletzen, sind nicht Gegenstand der Überführung (siehe Abschnitt „Nicht Gegenstand der Überführung“).
Ressourcenelemente außerhalb der Dosierung und der Text-Extensions bleiben unverändert.
Eine Dosierungs-Liste kann mehrere Dosage-Elemente enthalten, und jedes Element kann mehrere der unten aufgeführten Fälle aufweisen. Die Fall-IDs (M01–M15) sind nur Kennungen für die Unterschiede zwischen 1.0.7 und 2.0.0; ihre Nummern geben keine Reihenfolge vor. Maßgeblich ist der folgende Ablauf, der immer die gesamte Dosierungs-Liste einer Ressource betrachtet.
renderedDosageInstruction oder GeneratedDosageInstructionsMeta ohne Dosierung vorhanden, werden sie entfernt (M12).Dosage.text wird übernommen; besteht der Text nur aus einem 4-Schema (zum Beispiel 1-0-1-0 Stück), wird er nach M04 behandelt. Auf Ressourcenebene werden renderedDosageInstruction mit exakt diesem Text sowie GeneratedDosageInstructionsMeta gesetzt (DosageRequiresGeneratedText, FreeTextMatchesRenderedText, siehe Abschnitt „Text-Extensions“).Dosage-Element wird die Exponentialschreibweise nach M02 normalisiert, doppelte Werte werden nach M14 zusammengeführt, und die Anzeigeeinheit der Dosis wird nach M15 gesetzt. Weitere Änderungen an den Werten finden nicht statt.boundsDuration, wird es nach M10 in die übrigen Elemente kopiert.renderedDosageInstruction und GeneratedDosageInstructionsMeta werden durch die neu erzeugten Werte ersetzt.Dosage-Element oder die Liste als Ganzes weiterhin eine Invariante des Zielprofils, wird für die gesamte Liste der Freitext-Fallback angewendet. M03 und M11 werden bereits in Schritt 5 behandelt.Das Ergebnis ist eine Ressource, die dem 2.0.0-Profil entspricht. Ausgenommen sind die im Abschnitt „Nicht Gegenstand der Überführung“ genannten Daten.
| Fall | Invariante | Anlass | Überführung | Details |
|---|---|---|---|---|
| M01 | DosageDoseQuantityAllowedFractions, DosageDoseValueDecimalNotation |
Dosiswert mit einem Bruchteil außer .125, .25, .33, .5, .66, .75 oder mit mehr als drei Nachkommastellen |
Freitext-Fallback | Freitext-Fallback |
| M02 | DosageDoseValueDecimalNotation |
Exponentialschreibweise im Quellpayload | Exakte Dezimalnormalisierung | M02 |
| M03 | DosageDoseValuePositive |
Dosiswert null oder negativ | Vorhandenen Dosierungstext als Freitext übernehmen | M03/M11 |
| M04 | DosageFourSlotPatternInText |
Freitext besteht nur aus einem 4-Schema | täglich: voranstellen |
M04 |
| M05 | TimingBoundsDurationOnlyWholeNumber |
Nicht ganzzahlige Behandlungsdauer | Freitext-Fallback | Freitext-Fallback |
| M06 | TimingPeriodOnlyWholeNumber |
Nicht ganzzahlige Periode | Freitext-Fallback | Freitext-Fallback |
| M07 | TimingFreqOrPeriodGtOne |
Reines Intervall, Frequenz und Periode beide größer als eins (zum Beispiel „2 x alle 3 Tage“) | Freitext-Fallback | Freitext-Fallback |
| M08 | TimingSingleDosageForTimeOfDay |
Uhrzeiten (ohne Wochentage) auf mehrere Dosage-Elemente verteilt, deren Dosen nicht paarweise verschieden sind. Neu erfasst werden teilweise gleiche Dosen (zum Beispiel 1, 1, 2) und Intervall-Kombinationen mit einer Periode ungleich 1 Tag |
Freitext-Fallback | Freitext-Fallback |
| M09 | TimingSingleDosageForWhen |
Wie M08, für Tagesabschnitte (when) |
Freitext-Fallback | Freitext-Fallback |
| M10 | TimingOnlyOneBounds |
boundsDuration nur an einem Teil der Dosage-Elemente |
boundsDuration in die übrigen Elemente kopieren |
M10 |
| M11 | TimingValuesPositive |
Periode null oder Behandlungsdauer null oder negativ (eine negative Periode schließt bereits die R4-Basisregel tim-5 aus) |
Vorhandenen Dosierungstext als Freitext übernehmen | M03/M11 |
| M12 | ExtRequiresDosage-MR, ExtRequiresDosage-MD, ExtRequiresDosage-MS |
Text-Extension ohne Dosierung | Extensions entfernen | Schritt 1 des Ablaufs |
| M13 | FreeTextSingleDosageOnly |
Mehrere Dosage-Elemente mit demselben Freitext |
Zu einem Element zusammenfassen | Schritt 2 des Ablaufs |
| M14 | TimingNoDuplicateValues |
Wochentage mit Tagesabschnitten oder Uhrzeiten, bei denen ein Dosage-Element denselben Wochentag, Tagesabschnitt oder dieselbe Uhrzeit mehrfach enthält (zum Beispiel montags MORN, MORN mit frequency = 2). In den übrigen Schemata schloss das bereits 1.0.7 aus |
Doppelte Werte zusammenführen, frequency anpassen |
M14 |
| M15 | DosageDoseUnitMatchesCode |
Anzeigeeinheit der Dosis weicht vom Anzeigetext ihres Codes aus KBV_CS_SFHIR_BMP_DOSIEREINHEIT ab (zum Beispiel code = 1 mit unit = Tabletten) |
unit auf den Anzeigetext des Codes setzen |
M15 |
Bei M01 und M05–M07 werden die Werte weder gerundet noch in andere Einheiten umgerechnet noch umgedeutet, auch wenn eine exakte Umrechnung möglich wäre (zum Beispiel eine Periode von 1.5 d in 36 h). „2 x alle 3 Tage“ wird also weder zu „alle 1,5 Tage“ noch zu „alle 36 Stunden“. Die Überführung erhält die Angabe der Quelle, wie sie verordnet wurde; deshalb gilt dort der Freitext-Fallback. Bei M10 wird ausschließlich ein bereits vorhandener Wert wiederholt; er wird nicht verändert.
Der Freitext-Fallback gilt, wenn eine strukturierte 1.0.7-Dosierungs-Liste nach den Schritten M02, M14, M15 und M10 weiterhin mindestens eine Invariante des 2.0.0-Profils verletzt. M03 und M11 werden stattdessen nach dem eigenen Ablauf M03/M11 behandelt. Die übrigen Fälle und ihre Invarianten stehen in der Fallübersicht. Die Dosierung wird dann als reine Freitext-Dosierung abgebildet. Zahlen, Einheiten und Zeitangaben werden dabei weder korrigiert noch umgerechnet; der Freitext gibt die Quelldosierung so wieder, wie sie strukturiert angegeben war.
Dosage-Elementen der Quelle im Zustand nach den Schritten M02, M14, M15 und M10 erzeugt, mit der tatsächlich verwendeten Algorithmusversion (in dieser Beschreibung 2.0.0). Eine vorhandene renderedDosageInstruction der Quellressource wird nicht übernommen, da Bestandsdaten häufig fehlerhaft sind und der Text sonst nicht zur Struktur passen muss.Dosage-Element ersetzt, das nur text mit dem Text aus Schritt 1 enthält, also ohne timing und ohne doseAndRate (DosageStructuredOrFreeText, FreeTextSingleDosageOnly).1-0-1-0 Stück), wird M04 angewendet.renderedDosageInstruction erhält exakt den Wert von Dosage.text. GeneratedDosageInstructionsMeta gibt die Sprache und die Algorithmusversion an, mit der der Text in Schritt 1 erzeugt wurde.Die Textgenerierung setzt grundsätzlich eine gegen das Profil validierte Ressource voraus. Im Freitext-Fallback wird sie abweichend davon auf eine Quelle angewendet, die das 2.0.0-Profil nicht erfüllt. Diese Ausnahme gilt nur für den Freitext-Fallback der Migration. Der erzeugte Text wird nicht als strukturierte Dosierung verwendet, sondern nur als Freitext übernommen.
Bricht die Textgenerierung ab oder liefert sie keinen Text, beschreibt dieser Leitfaden keine Abbildung; wie das System damit umgeht, entscheidet es selbst.
Die Textgenerierung liefert je nach Quellstruktur zum Beispiel:
1.2 Stück: täglich: je 1,2 Stück1.5 d: für 1,5 Tage täglich: je 1 Stück1.5 d: alle 1,5 Tage: je 1 Stück3 d: 2 x alle 3 Tage: je 1 StückQuelle (1.0.7), MedicationRequest:
dosageInstruction[0].doseAndRate.doseQuantity = 1.2 Stück
dosageInstruction[0].timing.repeat = frequency 1, period 1, periodUnit d
renderedDosageInstruction = "täglich: je 1,2 Stück"
GeneratedDosageInstructionsMeta = language de-DE, algorithmVersion <Version der Quelle>
Die Quellangabe renderedDosageInstruction wird nicht übernommen; der Text wird neu aus dosageInstruction erzeugt.
Ziel (2.0.0):
dosageInstruction[0].text = "täglich: je 1,2 Stück"
renderedDosageInstruction = "täglich: je 1,2 Stück"
GeneratedDosageInstructionsMeta = language de-DE, algorithmVersion 2.0.0
timing und doseAndRate entfallen. Der Wert 1.2 wird nicht gerundet und nicht in eine andere Einheit umgerechnet.
DosageDoseValueDecimalNotation verlangt eine einfache Dezimalschreibweise mit höchstens drei Nachkommastellen. Die Prüfung verwendet value.toString(). Ob dabei eine JSON-Exponentialnotation erkannt wird, hängt vom Parser ab: Nach gewöhnlichem JSON-Parsen sind 5e-1 und 0.5 derselbe Zahlenwert. M02 betrifft deshalb die Serialisierung im Quellpayload, nicht nur den geparsten Wert.
Ein Dosiswert ist im Quellpayload mit Exponent serialisiert, zum Beispiel 5e-1 oder 50e-2.
5e-1 → 0.5, 50e-2 → 0.50. Es wird nicht gerundet. FHIR behandelt die Genauigkeit eines decimal einschließlich nachfolgender Nullen als Teil des Werts, und die Textgenerierung gibt sie wieder (je 0,50 Stück).Quelle:
{"value": 5e-1, "unit": "Stück"}
Ziel:
{"value": 0.5, "unit": "Stück"}
5e-1 wird 0.5 und bleibt strukturiert.125e-3 wird 0.125 und bleibt strukturiert.625e-4 wird 0.0625; danach gilt M01.50e-2 wird 0.50, nicht 0.5.12e-1 wird 1.2; danach gilt M01.0e0 wird 0; danach gilt M03.M03 (DosageDoseValuePositive) und M11 (TimingValuesPositive) beanstanden einen Dosiswert von null oder kleiner beziehungsweise eine Periode von null oder eine Behandlungsdauer von null oder kleiner. Für diese Dosierungen wird der vorhandene Dosierungstext der Quelle als Freitext übernommen. Die fehlerhaften strukturierten Werte werden nicht korrigiert.
renderedDosageInstruction der Quelle als Dosage.text übernehmen. In 1.0.7 ist renderedDosageInstruction bei strukturierten Dosierungen Pflicht (DosageStructuredRequiresGeneratedText).Dosage-Element ersetzen, das nur text enthält. timing, doseAndRate und die übrigen Dosierungsfelder entfallen. Die gesamte Liste wird ersetzt, weil Freitext in 2.0.0 nur in einem einzelnen Dosage-Element zulässig ist (FreeTextSingleDosageOnly).Der Text wird nicht neu erzeugt und nicht als strukturierte Dosierung interpretiert. Dosis- und Zeitwerte werden weder angepasst noch umgerechnet.
Texte, die der Algorithmus 1.0.1 für solche Dosierungen erzeugt hat:
0: 0-0-0-0 Stück wird nach M04 zu täglich: 0-0-0-0 Stück.-1: -1-0-0-0 Stück bleibt unverändert, der Text ist kein reines 4-Schema.0: alle 0 Tage: je 1 Stück bleibt unverändert.DosageFourSlotPatternInText verbietet in 2.0.0 einen Freitext, der ausschließlich aus einem 4-Schema besteht, zum Beispiel 1-0-1-0 oder 1-0-1-0 Stück. Ein 4-Schema innerhalb eines weiteren Textes, etwa in der Form täglich: 1-0-1-0 Stück, löst nur die Warnung DosageFourSlotPatternInTextWarning aus.
Dosage.text erfüllt den regulären Ausdruck aus DosageFourSlotPatternInText. Er steht hier ohne das String-Escaping des FHIRPath-Ausdrucks:
^\s*\d+([.,]\d+)?(\s*/\s*\d+)?(\s*[-–]\s*\d+([.,]\d+)?(\s*/\s*\d+)?){3}(\s*[A-Za-zÄÖÜäöüß().]+)?\s*$
M04 gilt für bestehende Freitext-Dosierungen ebenso wie für einen Text, der im Freitext-Fallback entsteht.
täglich: voranstellen. Der übrige Text bleibt unverändert.renderedDosageInstruction auf exakt denselben Text setzen und GeneratedDosageInstructionsMeta angeben (siehe Text-Extensions).Der Text wird nicht in eine strukturierte Dosierung umgewandelt.
Das Voranstellen von täglich: ist die einzige Ergänzung, die die Überführung vornimmt. Sie löst den Konflikt mit DosageFourSlotPatternInText und entspricht der Form, in der die Textgenerierung 2.0.0 ein strukturiertes 4-Schema ausgibt (zum Beispiel täglich: 1-0-1-0 Stück).
Quelle: Dosage.text = "1-0-1-0 Stück"
Ziel: Dosage.text = "täglich: 1-0-1-0 Stück"
renderedDosageInstruction = "täglich: 1-0-1-0 Stück"
1-0-1-0 wird täglich: 1-0-1-0.1/2-0-0-1 Stück wird täglich: 1/2-0-0-1 Stück.1-0-0 hat nur drei Slots und bleibt unverändert.morgens 1-0-0-0 erfüllt den Ausdruck nicht und bleibt unverändert.M10 (TimingOnlyOneBounds) verlangt, dass alle Dosage-Elemente einer Ressource entweder keinen Behandlungszeitraum oder denselben Behandlungszeitraum enthalten. Im Profil 1.0.7 ist Timing.repeat.bounds auf Duration beschränkt. Fehlt boundsDuration nur in einzelnen Elementen, verletzt die Ressource M10. Unterschiedliche Werte oder Einheiten verletzen bereits das Profil 1.0.7 (TimingOnlyOneBounds) und sind nicht Gegenstand der Überführung.
boundsDuration in keinem Element vorhanden, bleibt die Dosierung unverändert.boundsDuration aus einem Element, das es enthält, in alle Elemente kopieren, in denen es fehlt. Bereits vorhandene Werte werden nicht überschrieben. value, system, code und unit bleiben unverändert.Die Prüfung erfolgt vor der Textgenerierung. Diese liest den Zeitrahmen nur aus dem ersten Dosage-Element; ohne M10 könnten fehlende Angaben in weiteren Elementen im erzeugten Text unberücksichtigt bleiben.
Der bereits angegebene Wert wird ergänzt, nicht verändert.
Quelle: Dosage[0].boundsDuration = 5 d
Dosage[1].boundsDuration fehlt
Ziel: Dosage[0].boundsDuration = 5 d
Dosage[1].boundsDuration = 5 d
In 1.0.7 durfte ein Dosage-Element mit Wochentagen und Tagesabschnitten oder Uhrzeiten denselben Wochentag, Tagesabschnitt oder dieselbe Uhrzeit mehrfach enthalten. Das verpflichtende frequency zählte die Doppelung mit (TimingFrequencyCount). 2.0.0 schließt doppelte Werte innerhalb eines Elements aus (TimingNoDuplicateValues). Für when wertet FHIR mehrere Angaben ausdrücklich als Vereinigung, dayOfWeek und timeOfDay nennen die Tage und Uhrzeiten der Gabe. Ein doppelter Wert bezeichnet also keinen weiteren Zeitpunkt.
Dosage-Element in dayOfWeek, when und timeOfDay jeweils nur das erste Vorkommen eines Werts behalten. Die Reihenfolge der übrigen Werte bleibt unverändert.frequency angegeben, frequency auf die Anzahl der verbleibenden Tagesabschnitte beziehungsweise Uhrzeiten multipliziert mit der Anzahl der verbleibenden Wochentage setzen (TimingFrequencyCount). Alle übrigen Angaben, auch Dosis, period und periodUnit, bleiben unverändert.Quelle: dayOfWeek = mon, when = MORN, MORN, frequency = 2
Ziel: dayOfWeek = mon, when = MORN, frequency = 1
Text: montags 1-0-0-0 Stück
Quelle: dayOfWeek = mon, mon, timeOfDay = 08:00:00, frequency = 2
Ziel: dayOfWeek = mon, timeOfDay = 08:00:00, frequency = 1
Text: montags 08:00 Uhr — je 1 Stück
In 1.0.7 war die Anzeigeeinheit unit einer Dosis frei; gebunden war nur der Code an KBV_VS_SFHIR_BMP_DOSIEREINHEIT. 2.0.0 verlangt, dass unit exakt dem Anzeigetext des Codes entspricht (DosageDoseUnitMatchesCode). Maßgeblich ist der Code, mit ihm rechnet etwa die Reichweitenberechnung.
doseQuantity, doseRange.low und doseRange.high jedes Dosage-Elements unit auf den Anzeigetext des Codes aus KBV_CS_SFHIR_BMP_DOSIEREINHEIT setzen. value, system und code bleiben unverändert.maxDosePerPeriod.numerator denselben Code, dort unit ebenso setzen (MaxDoseSameUnitAsDose).Eine Dosisangabe mit einem Code außerhalb dieses CodeSystems verletzt bereits das Profil 1.0.7 und ist nicht Gegenstand der Überführung.
Quelle: when = MORN, doseQuantity = 1, code = 1, unit = Tabletten
Ziel: when = MORN, doseQuantity = 1, code = 1, unit = Stück
Text: täglich: 1-0-0-0 Stück
Für 2.0.0 sind renderedDosageInstruction und GeneratedDosageInstructionsMeta bei jeder Dosierung erforderlich, auch bei Freitext (DosageRequiresGeneratedText). Bei Freitext stimmt renderedDosageInstruction exakt mit Dosage.text überein (FreeTextMatchesRenderedText). Die Umstellung von DosageStructuredRequiresGeneratedText auf DosageRequiresGeneratedText ist daher nicht nur eine Umbenennung: Auch bestehende Freitext-Dosierungen erhalten beide Extensions.
GeneratedDosageInstructionsMeta enthält die Sprache und in algorithmVersion die tatsächlich verwendete Version des Algorithmus der Textgenerierung. Das gilt auch für übernommenen Freitext, da die Textgenerierung einen Freitext unverändert übernimmt. Die Beispiele dieser Migrationsbeschreibung verwenden die Algorithmusversion 2.0.0.
Für die folgenden Bestandsdaten beschreibt dieser Leitfaden keine Abbildung. Wie ein System mit ihnen umgeht, entscheidet es selbst.
timing oder doseAndRate, unterschiedliche Dosis-Codes oder eine Anzeigeeinheit der Behandlungsdauer, die nicht zum UCUM-Code passt. Ihre Ungültigkeit ist keine Folge des Profilwechsels.doseQuantity.value ist in 2.0.0 Pflicht, in 1.0.7 war es optional. Ohne Zahlenwert lässt sich weder eine strukturierte Dosierung noch ein Dosierungstext bilden.Zeit- und Dosiseinheiten werden nicht umgerechnet. value, system und code von Dosis-, Perioden- und Dauerangaben bleiben unverändert, ebenso die Anzeige unit, mit Ausnahme der Anzeigeeinheit der Dosis nach M15. Für periodUnit erlaubt das Ziel-ValueSet min, h, d, wk und mo (in 1.0.7 nur d, wk und mo), für boundsDuration die Codes d, wk, mo und a.