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
| Official URL: http://ig.fhir.de/igs/medication/StructureDefinition/DosageDgMP | Version: 2.0.0-ballot | |||
| Active as of 2026-10-16 | Computable Name: DosageDgMP | |||
Gibt an, wie das Medikament vom Patienten im Kontext dgMP eingenommen wird/wurde oder eingenommen werden soll.
Dieses Profil beschreibt eine technisch streng validierte Ausprägung der FHIR-Ressource Dosage für den deutschen Kontext und ist speziell für den Einsatz im dgMP-Prozess entwickelt worden. Das Profil enthält gezielte Einschränkungen und Vorgaben, um die technische Überprüfbarkeit und Konsistenz von Dosierungsangaben sicherzustellen.
Usages:
You can also check for usages in the FHIR IG Statistics
Description of Profiles, Differentials, Snapshots and how the different presentations work.
| Name | Flags | Card. | Type | Description & Constraints Filter: ![]() |
|---|---|---|---|---|
![]() |
C | 0..* | DosageDE | How the medication is/was taken or should be taken Constraints: DosageStructuredOrFreeTextWarning, DosageStructuredRequiresBothWarning, DosageDoseUnitSameCodeWarning, DosageDoseValuePositiveWarning, DosageLimitsPositiveWarning, DosageFourSlotPatternInTextWarning, FreeTextSingleDosageOnlyWarning, AsNeededForRequiresAsNeededWarning, dos-1, DosageStructuredOrFreeText, DosageStructuredRequiresBoth, DosageRequiresGeneratedText, FreeTextSingleDosageOnly, FreeTextMatchesRenderedText, DosageDoseQuantityAllowedFractions, DosageDoseUnitSameCode, DosageDoseValueDecimalNotation, DosageDoseValuePositive, DosageLimitsPositive, DosageFourSlotPatternInText, PatientInstructionIdentical, MaxDoseSameUnitAsDose, MaxDoseNotBelowDose, MaxDosePerPeriodOnly24hOr1d, MaxDoseOnlyPureAsNeeded, DoseRangeHighRequiredWhenLowPresent, DoseRangeLowAndHighSameUnit, DoseRangeNoVarPeriod, MinimumIntervalOnlyPureAsNeeded, AsNeededForRequiresAsNeeded, AsNeededSingleDosageOnly, AsNeededIdentical, AsNeededForIdentical, MinimumIntervalUnitMatchesCode |
![]() ![]() |
Content/Rules for all slices | |||
![]() ![]() ![]() |
0..* | (Complex) | Dosage asNeededFor URL: http://hl7.org/fhir/5.0/StructureDefinition/extension-Dosage.asNeededFor | |
![]() ![]() ![]() ![]() |
0..0 | Extension Slice: Unordered, Open by value:url | ||
![]() ![]() ![]() ![]() |
1..1 | uri | "http://hl7.org/fhir/5.0/StructureDefinition/extension-Dosage.asNeededFor" | |
![]() ![]() ![]() ![]() |
0..1 | CodeableConcept | Value of extension Binding: SNOMEDCTMedicationAsNeededReasonCodes (example) | |
![]() ![]() ![]() ![]() ![]() |
1..1 | string | Plain text representation of the concept | |
![]() ![]() |
0..* | Extension | Extension Slice: Unordered, Open by value:url Slicing Note: The rules on this element (including its children) apply to all the slices, but are not repeated in them | |
![]() ![]() ![]() |
0..1 | (Complex) | Minimum Interval Between Administrations URL: http://ig.fhir.de/igs/medication/StructureDefinition/MinimumIntervalBetweenAdministrations | |
![]() ![]() ![]() ![]() |
0..0 | Extension Slice: Unordered, Open by value:url | ||
![]() ![]() ![]() ![]() |
1..1 | uri | "http://ig.fhir.de/igs/medication/StructureDefinition/MinimumIntervalBetweenAdministrations" | |
![]() ![]() ![]() ![]() |
1..1 | Duration | Mindestabstand zwischen zwei Gaben | |
![]() ![]() ![]() ![]() ![]() |
1..1 | decimal | Numerical value (with implicit precision) | |
![]() ![]() ![]() ![]() ![]() |
1..1 | string | Unit representation | |
![]() ![]() ![]() ![]() ![]() |
C | 1..1 | uri | System that defines coded unit form Fixed Value: http://unitsofmeasure.org (no extensions allowed) |
![]() ![]() ![]() ![]() ![]() |
1..1 | code | Coded form of the unit Binding: Mindestabstand UnitsOfTime dgMP ValueSet (required) | |
![]() ![]() |
0..1 | string | Freitext-Dosierungsanweisungen, z. B. 'Maximal 3x täglich 1 Stück bei Bedarf' | |
![]() ![]() |
0..1 | string | Ergänzende Anwendungshinweise für Patientinnen und Patienten | |
![]() ![]() |
C | 0..1 | TimingDgMP | Wann das Medikament verabreicht werden soll Constraints: TimingOnlyOnePeriodForDayOfWeek |
![]() ![]() |
0..1 | boolean | Bedarfsdosierung (nur Ja/Nein-Angabe) | |
![]() ![]() |
0..1 | Element | Menge des verabreichten Medikaments | |
![]() ![]() ![]() |
0..1 | Amount of medication per dose Slice: Unordered, Closed by type:$this Slicing Note: The rules on this element (including its children) apply to all the slices, but are not repeated in them | ||
![]() ![]() ![]() ![]() |
Range | |||
![]() ![]() ![]() ![]() |
Quantity(SimpleQuantity) | |||
![]() ![]() ![]() ![]() |
0..1 | SimpleQuantity |
Menge des Medikaments pro Dosis Binding: https://fhir.kbv.de/ValueSet/KBV_VS_SFHIR_BMP_DOSIEREINHEIT (required) | |
![]() ![]() ![]() ![]() ![]() |
1..1 | decimal | Numerical value (with implicit precision) | |
![]() ![]() ![]() ![]() ![]() |
1..1 | string | Unit representation | |
![]() ![]() ![]() ![]() ![]() |
C | 1..1 | uri | System that defines coded unit form |
![]() ![]() ![]() ![]() ![]() |
1..1 | code | Coded form of the unit | |
![]() ![]() ![]() ![]() |
0..1 | Range | Amount of medication per dose | |
![]() ![]() ![]() ![]() ![]() |
C | 0..1 | SimpleQuantity(4.0.1) | Low limit Binding: https://fhir.kbv.de/ValueSet/KBV_VS_SFHIR_BMP_DOSIEREINHEIT (required) Constraints: sqty-1 |
![]() ![]() ![]() ![]() ![]() ![]() |
1..1 | decimal | Numerical value (with implicit precision) | |
![]() ![]() ![]() ![]() ![]() ![]() |
1..1 | string | Unit representation | |
![]() ![]() ![]() ![]() ![]() ![]() |
C | 1..1 | uri | System that defines coded unit form |
![]() ![]() ![]() ![]() ![]() ![]() |
1..1 | code | Coded form of the unit | |
![]() ![]() ![]() ![]() ![]() |
C | 0..1 | SimpleQuantity(4.0.1) | High limit Binding: https://fhir.kbv.de/ValueSet/KBV_VS_SFHIR_BMP_DOSIEREINHEIT (required) Constraints: sqty-1 |
![]() ![]() ![]() ![]() ![]() ![]() |
1..1 | decimal | Numerical value (with implicit precision) | |
![]() ![]() ![]() ![]() ![]() ![]() |
1..1 | string | Unit representation | |
![]() ![]() ![]() ![]() ![]() ![]() |
C | 1..1 | uri | System that defines coded unit form |
![]() ![]() ![]() ![]() ![]() ![]() |
1..1 | code | Coded form of the unit | |
![]() ![]() |
0..1 | Ratio | Maximale Dosis pro Zeitraum | |
Documentation for this format | ||||
| Path | Status | Usage | ValueSet | Version | Source |
| Dosage.extension:asNeededFor.value[x] | Base | example | SNOMED CT Medication As Needed Reason Codes | 📦4.0.1 | FHIR Std. |
| Dosage.modifierExtension:minimumIntervalBetweenAdministrations.value[x].code | Base | required | Mindestabstand UnitsOfTime dgMP ValueSet | 📦2.0.0-ballot | This IG |
| Dosage.doseAndRate.dose[x]:doseQuantity | Base | required | https://fhir.kbv.de/ValueSet/KBV_VS_SFHIR_BMP_DOSIEREINHEIT | Not State | Unknown |
| Dosage.doseAndRate.dose[x]:doseRange.low | Base | required | https://fhir.kbv.de/ValueSet/KBV_VS_SFHIR_BMP_DOSIEREINHEIT | Not State | Unknown |
| Dosage.doseAndRate.dose[x]:doseRange.high | Base | required | https://fhir.kbv.de/ValueSet/KBV_VS_SFHIR_BMP_DOSIEREINHEIT | Not State | Unknown |
| Id | Grade | Path(s) | Description | Expression |
| AsNeededForIdentical | error | Dosage | The reason for use (asNeededFor) must be populated identically across all Dosage elements of a resource. Multiple reasons per element are allowed but must then match in every element. |
(
%resource.ofType(MedicationRequest).dosageInstruction.combine(%resource.ofType(MedicationDispense).dosageInstruction).combine(%resource.ofType(MedicationStatement).dosage)
).all(
extension.where(
url='http://hl7.org/fhir/5.0/StructureDefinition/extension-Dosage.asNeededFor'
).value.ofType(CodeableConcept).text.distinct().count()
=
(
%resource.ofType(MedicationRequest).dosageInstruction.combine(%resource.ofType(MedicationDispense).dosageInstruction).combine(%resource.ofType(MedicationStatement).dosage)
).extension.where(
url='http://hl7.org/fhir/5.0/StructureDefinition/extension-Dosage.asNeededFor'
).value.ofType(CodeableConcept).text.distinct().count()
)
|
| AsNeededForRequiresAsNeeded | error | Dosage | A reason for use (asNeededFor) may only be given for an as-needed dosage (asNeededBoolean = true). |
extension.where(url='http://hl7.org/fhir/5.0/StructureDefinition/extension-Dosage.asNeededFor').exists() implies asNeeded.ofType(boolean) = true
|
| AsNeededForRequiresAsNeededWarning | warning | Dosage | A reason for use (asNeededFor) should only be given together with asNeededBoolean = true. |
extension.where(url='http://hl7.org/fhir/5.0/StructureDefinition/extension-Dosage.asNeededFor').exists() implies asNeeded.ofType(boolean) = true
|
| AsNeededIdentical | error | Dosage | The as-needed flag (asNeededBoolean) must be populated identically across all Dosage elements of a resource. |
(
(
%resource.ofType(MedicationRequest).dosageInstruction.combine(%resource.ofType(MedicationDispense).dosageInstruction).combine(%resource.ofType(MedicationStatement).dosage)
).asNeeded.ofType(boolean).distinct().count() <= 1
)
and
(
(
(
%resource.ofType(MedicationRequest).dosageInstruction.combine(%resource.ofType(MedicationDispense).dosageInstruction).combine(%resource.ofType(MedicationStatement).dosage)
).asNeeded.ofType(boolean).exists()
)
implies
(
(
%resource.ofType(MedicationRequest).dosageInstruction.combine(%resource.ofType(MedicationDispense).dosageInstruction).combine(%resource.ofType(MedicationStatement).dosage)
).all(asNeeded.ofType(boolean).exists())
)
)
|
| AsNeededSingleDosageOnly | error | Dosage | If an as-needed dosage with asNeededBoolean = true is given without timing, exactly one Dosage element must exist in the resource. |
(
%resource.ofType(MedicationRequest).dosageInstruction.combine(%resource.ofType(MedicationDispense).dosageInstruction).combine(%resource.ofType(MedicationStatement).dosage)
).where(
asNeeded.ofType(boolean) = true and timing.empty()
).exists()
implies
(
%resource.ofType(MedicationRequest).dosageInstruction.combine(%resource.ofType(MedicationDispense).dosageInstruction).combine(%resource.ofType(MedicationStatement).dosage)
).count() = 1
|
| DosageDoseQuantityAllowedFractions | error | Dosage | Dose values in doseQuantity or doseRange must be whole numbers or use one of the following fractional parts: .25, .33, .5, .66 or .75. |
doseAndRate.all(
(
dose.ofType(Quantity).value.empty() or
dose.ofType(Quantity).value.all(
($this mod 1 = 0) or
($this mod 1 = 0.25) or
($this mod 1 = 0.33) or
($this mod 1 = 0.5) or
($this mod 1 = 0.66) or
($this mod 1 = 0.75)
)
)
and
(
dose.ofType(Range).low.value.empty() or
dose.ofType(Range).low.value.all(
($this mod 1 = 0) or
($this mod 1 = 0.25) or
($this mod 1 = 0.33) or
($this mod 1 = 0.5) or
($this mod 1 = 0.66) or
($this mod 1 = 0.75)
)
)
and
(
dose.ofType(Range).high.value.empty() or
dose.ofType(Range).high.value.all(
($this mod 1 = 0) or
($this mod 1 = 0.25) or
($this mod 1 = 0.33) or
($this mod 1 = 0.5) or
($this mod 1 = 0.66) or
($this mod 1 = 0.75)
)
)
)
|
| DosageDoseUnitSameCode | error | Dosage | The dose unit must be the same across all dosages. |
(%resource.ofType(MedicationRequest).dosageInstruction.combine(%resource.ofType(MedicationDispense).dosageInstruction).combine(%resource.ofType(MedicationStatement).dosage)).all(
doseAndRate.exists() implies
(
(%resource.ofType(MedicationRequest).dosageInstruction.combine(%resource.ofType(MedicationDispense).dosageInstruction).combine(%resource.ofType(MedicationStatement).dosage)).doseAndRate.dose.ofType(Quantity).code |
(%resource.ofType(MedicationRequest).dosageInstruction.combine(%resource.ofType(MedicationDispense).dosageInstruction).combine(%resource.ofType(MedicationStatement).dosage)).doseAndRate.dose.ofType(Range).low.code |
(%resource.ofType(MedicationRequest).dosageInstruction.combine(%resource.ofType(MedicationDispense).dosageInstruction).combine(%resource.ofType(MedicationStatement).dosage)).doseAndRate.dose.ofType(Range).high.code
).distinct().count() = 1
)
|
| DosageDoseUnitSameCodeWarning | warning | Dosage | The dose unit should be the same across all dosages. |
(%resource.ofType(MedicationRequest).dosageInstruction.combine(%resource.ofType(MedicationDispense).dosageInstruction).combine(%resource.ofType(MedicationStatement).dosage)).all(
doseAndRate.exists() implies
(
(%resource.ofType(MedicationRequest).dosageInstruction.combine(%resource.ofType(MedicationDispense).dosageInstruction).combine(%resource.ofType(MedicationStatement).dosage)).doseAndRate.dose.ofType(Quantity).code |
(%resource.ofType(MedicationRequest).dosageInstruction.combine(%resource.ofType(MedicationDispense).dosageInstruction).combine(%resource.ofType(MedicationStatement).dosage)).doseAndRate.dose.ofType(Range).low.code |
(%resource.ofType(MedicationRequest).dosageInstruction.combine(%resource.ofType(MedicationDispense).dosageInstruction).combine(%resource.ofType(MedicationStatement).dosage)).doseAndRate.dose.ofType(Range).high.code
).distinct().count() = 1
)
|
| DosageDoseValueDecimalNotation | error | Dosage | Dose values in doseQuantity or doseRange must use plain decimal notation with at most two decimal places. Exponential notation (e.g. 50e-2 instead of 0.5) is not allowed. |
doseAndRate.all(
(
dose.ofType(Quantity).value.empty() or
dose.ofType(Quantity).value.toString().matches('^[0-9]+([.][0-9]{1,2})?$')
)
and
(
dose.ofType(Range).low.value.empty() or
dose.ofType(Range).low.value.toString().matches('^[0-9]+([.][0-9]{1,2})?$')
)
and
(
dose.ofType(Range).high.value.empty() or
dose.ofType(Range).high.value.toString().matches('^[0-9]+([.][0-9]{1,2})?$')
)
)
|
| DosageDoseValuePositive | error | Dosage | doseQuantity.value and doseRange.high.value must be greater than 0. The value 0 is additionally allowed for doseRange.low.value only. |
doseAndRate.all(
dose.ofType(Quantity).value.all($this > 0) and
dose.ofType(Range).low.value.all($this >= 0) and
dose.ofType(Range).high.value.all($this > 0)
)
|
| DosageDoseValuePositiveWarning | warning | Dosage | doseQuantity.value and doseRange.high.value should be greater than 0. The value 0 is additionally allowed for doseRange.low.value only. |
doseAndRate.all(
dose.ofType(Quantity).value.all($this > 0) and
dose.ofType(Range).low.value.all($this >= 0) and
dose.ofType(Range).high.value.all($this > 0)
)
|
| DosageFourSlotPatternInText | error | Dosage | A bare four-slot dosing schema (Viererschema, e.g. 1-0-1-0 or 1-0-1-0 Stück) must not be given as free text in Dosage.text; it has to be represented structurally. A schema embedded in further text, including the generated form 'täglich: 1-0-1-0 Stück', only triggers the warning DosageFourSlotPatternInTextWarning. |
text.exists() implies text.matches('^\\s*\\d+([.,]\\d+)?(\\s*/\\s*\\d+)?(\\s*[-–]\\s*\\d+([.,]\\d+)?(\\s*/\\s*\\d+)?){3}(\\s*[A-Za-zÄÖÜäöüß().]+)?\\s*$').not()
|
| DosageFourSlotPatternInTextWarning | warning | Dosage | A four-slot dosing schema (Viererschema, e.g. 1-1-1-1) was detected in Dosage.text. Please check whether it can be represented structurally. |
text.exists() implies text.matches('.*\\d+\\s*[-–]\\s*\\d+\\s*[-–]\\s*\\d+\\s*[-–]\\s*\\d+.*').not()
|
| DosageLimitsPositive | error | Dosage | The minimum interval between administrations (valueDuration.value) and maxDosePerPeriod (numerator.value, denominator.value) must be greater than 0. |
modifierExtension.where(
url = 'http://ig.fhir.de/igs/medication/StructureDefinition/MinimumIntervalBetweenAdministrations'
).value.ofType(Duration).value.all($this > 0) and
maxDosePerPeriod.numerator.value.all($this > 0) and
maxDosePerPeriod.denominator.value.all($this > 0)
|
| DosageLimitsPositiveWarning | warning | Dosage | The minimum interval between administrations (valueDuration.value) and maxDosePerPeriod (numerator.value, denominator.value) should be greater than 0. |
modifierExtension.where(
url = 'http://ig.fhir.de/igs/medication/StructureDefinition/MinimumIntervalBetweenAdministrations'
).value.ofType(Duration).value.all($this > 0) and
maxDosePerPeriod.numerator.value.all($this > 0) and
maxDosePerPeriod.denominator.value.all($this > 0)
|
| DosageRequiresGeneratedText | error | Dosage | Regardless of the kind of dosage (structured or free text), the GeneratedDosageInstructionsMeta and renderedDosageInstruction extensions must be present. |
%resource.extension.where(
url = 'http://ig.fhir.de/igs/medication/StructureDefinition/GeneratedDosageInstructionsMeta'
).exists() and
(
%resource.extension.where(
url = 'http://hl7.org/fhir/5.0/StructureDefinition/extension-MedicationRequest.renderedDosageInstruction'
).exists() or
%resource.extension.where(
url = 'http://hl7.org/fhir/5.0/StructureDefinition/extension-MedicationDispense.renderedDosageInstruction'
).exists() or
%resource.extension.where(
url = 'http://hl7.org/fhir/5.0/StructureDefinition/extension-MedicationStatement.renderedDosageInstruction'
).exists()
)
|
| DosageStructuredOrFreeText | error | Dosage | A dosage must be given either as free text only or as complete structured information only; mixing both is not allowed. |
(%resource.ofType(MedicationRequest).dosageInstruction.combine(%resource.ofType(MedicationDispense).dosageInstruction).combine(%resource.ofType(MedicationStatement).dosage)).all(
(text.exists() and timing.empty() and doseAndRate.empty()) or
(text.empty() and (timing.exists() or doseAndRate.exists()))
)
|
| DosageStructuredOrFreeTextWarning | warning | Dosage | A dosage must be given either as free text only or as complete structured information only; mixing both is not allowed. |
(%resource.ofType(MedicationRequest).dosageInstruction.combine(%resource.ofType(MedicationDispense).dosageInstruction).combine(%resource.ofType(MedicationStatement).dosage)).all(
(text.exists() and timing.empty() and doseAndRate.empty()) or
(text.empty() and (timing.exists() or doseAndRate.exists()))
)
|
| DosageStructuredRequiresBoth | error | Dosage | If a structured dosage is given, both timing and doseAndRate must be present. For pure as-needed dosages, doseAndRate may be given without timing. |
(%resource.ofType(MedicationRequest).dosageInstruction.combine(%resource.ofType(MedicationDispense).dosageInstruction).combine(%resource.ofType(MedicationStatement).dosage)).all(
(timing.exists() implies doseAndRate.exists()) and
(doseAndRate.exists() implies (
timing.exists() or
asNeeded.ofType(boolean) = true or
extension.where(url='http://hl7.org/fhir/5.0/StructureDefinition/extension-Dosage.asNeededFor').exists()
))
)
|
| DosageStructuredRequiresBothWarning | warning | Dosage | If a structured dosage is given, both timing and doseAndRate should be present. For pure as-needed dosages, doseAndRate may be given without timing. |
(%resource.ofType(MedicationRequest).dosageInstruction.combine(%resource.ofType(MedicationDispense).dosageInstruction).combine(%resource.ofType(MedicationStatement).dosage)).all(
(timing.exists() implies doseAndRate.exists()) and
(doseAndRate.exists() implies (
timing.exists() or
asNeeded.ofType(boolean) = true or
extension.where(url='http://hl7.org/fhir/5.0/StructureDefinition/extension-Dosage.asNeededFor').exists()
))
)
|
| DoseRangeHighRequiredWhenLowPresent | error | Dosage | If a lower bound is given for doseRange, an upper bound must be given as well. |
doseAndRate.dose.ofType(Range).low.empty() or doseAndRate.dose.ofType(Range).high.exists()
|
| DoseRangeLowAndHighSameUnit | error | Dosage | The lower and upper bound of a variable single dose must use the same unit of measure. |
doseAndRate.dose.ofType(Range).low.empty()
or doseAndRate.dose.ofType(Range).high.empty()
or (
doseAndRate.dose.ofType(Range).low.system = doseAndRate.dose.ofType(Range).high.system
and doseAndRate.dose.ofType(Range).low.code = doseAndRate.dose.ofType(Range).high.code
and doseAndRate.dose.ofType(Range).low.unit = doseAndRate.dose.ofType(Range).high.unit
)
|
| DoseRangeNoVarPeriod | warning | Dosage | A variable single dose and a variable period should not be used together. |
doseAndRate.dose.ofType(Range).empty() or timing.repeat.periodMax.empty()
|
| FreeTextMatchesRenderedText | error | Dosage | If a dosage is given as pure free text (text present, timing and doseAndRate empty), the value in dosageInstruction.text must match the value in the renderedDosageInstruction extension. |
(
(%resource.ofType(MedicationRequest).dosageInstruction.combine(%resource.ofType(MedicationDispense).dosageInstruction).combine(%resource.ofType(MedicationStatement).dosage)
).where(text.exists() and timing.empty() and doseAndRate.empty()).exists()
)
implies
(
(
%resource.ofType(MedicationRequest).exists() and
%resource.extension.where(
url = 'http://hl7.org/fhir/5.0/StructureDefinition/extension-MedicationRequest.renderedDosageInstruction'
).value = %resource.dosageInstruction.text
) or
(
%resource.ofType(MedicationDispense).exists() and
%resource.extension.where(
url = 'http://hl7.org/fhir/5.0/StructureDefinition/extension-MedicationDispense.renderedDosageInstruction'
).value = %resource.dosageInstruction.text
) or
(
%resource.ofType(MedicationStatement).exists() and
%resource.extension.where(
url = 'http://hl7.org/fhir/5.0/StructureDefinition/extension-MedicationStatement.renderedDosageInstruction'
).value = %resource.dosage.text
)
)
|
| FreeTextSingleDosageOnly | error | Dosage | If a dosage is given as pure free text, there must be exactly one Dosage element. |
(
(%resource.ofType(MedicationRequest).dosageInstruction.combine(%resource.ofType(MedicationDispense).dosageInstruction).combine(%resource.ofType(MedicationStatement).dosage)
).exists(text.exists() and timing.empty() and doseAndRate.empty())
)
implies
(
(%resource.ofType(MedicationRequest).dosageInstruction.combine(%resource.ofType(MedicationDispense).dosageInstruction).combine(%resource.ofType(MedicationStatement).dosage)
).count() = 1
)
|
| FreeTextSingleDosageOnlyWarning | warning | Dosage | If a dosage is given as pure free text, there should be exactly one Dosage element. |
(
(%resource.ofType(MedicationRequest).dosageInstruction.combine(%resource.ofType(MedicationDispense).dosageInstruction).combine(%resource.ofType(MedicationStatement).dosage)
).exists(text.exists() and timing.empty() and doseAndRate.empty())
)
implies
(
(%resource.ofType(MedicationRequest).dosageInstruction.combine(%resource.ofType(MedicationDispense).dosageInstruction).combine(%resource.ofType(MedicationStatement).dosage)
).count() = 1
)
|
| MaxDoseNotBelowDose | error | Dosage | maxDosePerPeriod.numerator.value must not be smaller than the single dose (doseQuantity.value or doseRange.high.value). |
maxDosePerPeriod.numerator.value.empty() or (
(doseAndRate.dose.ofType(Quantity).value.empty() or
doseAndRate.dose.ofType(Quantity).value <= maxDosePerPeriod.numerator.value) and
(doseAndRate.dose.ofType(Range).high.value.empty() or
doseAndRate.dose.ofType(Range).high.value <= maxDosePerPeriod.numerator.value)
)
|
| MaxDoseOnlyPureAsNeeded | error | Dosage | A maximum amount (maxDosePerPeriod) may only be given for a structured pure as-needed dosage: asNeededBoolean = true, doseAndRate present and no timing. A structured rhythm already determines how much is applied within the reference period. A free-text dosage is rendered verbatim, so a maximum amount next to it could never appear in the text. |
maxDosePerPeriod.exists() implies (asNeeded.ofType(boolean) = true and timing.empty() and doseAndRate.exists())
|
| MaxDosePerPeriodOnly24hOr1d | error | Dosage | maxDosePerPeriod is only allowed with a reference period of 24 hours (24 h) or 1 day (1 d). Other periods (e.g. at most 3 every 6 h) are not allowed. |
maxDosePerPeriod.empty() or (
(maxDosePerPeriod.denominator.value = 24 and maxDosePerPeriod.denominator.code = 'h') or
(maxDosePerPeriod.denominator.value = 1 and maxDosePerPeriod.denominator.code = 'd')
)
|
| MaxDoseSameUnitAsDose | error | Dosage | maxDosePerPeriod must use the same unit, code and system as doseQuantity. |
maxDosePerPeriod.empty() or (
(
doseAndRate.dose.ofType(Quantity).exists() and
doseAndRate.dose.ofType(Quantity).system = maxDosePerPeriod.numerator.system and
doseAndRate.dose.ofType(Quantity).code = maxDosePerPeriod.numerator.code and
doseAndRate.dose.ofType(Quantity).unit = maxDosePerPeriod.numerator.unit
) or (
doseAndRate.dose.ofType(Range).exists() and
(
doseAndRate.dose.ofType(Range).low.empty() or (
doseAndRate.dose.ofType(Range).low.system = maxDosePerPeriod.numerator.system and
doseAndRate.dose.ofType(Range).low.code = maxDosePerPeriod.numerator.code and
doseAndRate.dose.ofType(Range).low.unit = maxDosePerPeriod.numerator.unit
)
) and (
doseAndRate.dose.ofType(Range).high.empty() or (
doseAndRate.dose.ofType(Range).high.system = maxDosePerPeriod.numerator.system and
doseAndRate.dose.ofType(Range).high.code = maxDosePerPeriod.numerator.code and
doseAndRate.dose.ofType(Range).high.unit = maxDosePerPeriod.numerator.unit
)
)
)
)
|
| MinimumIntervalOnlyPureAsNeeded | error | Dosage | A minimum interval between two single administrations (Mindestabstand) may only be given for a structured pure as-needed dosage: asNeededBoolean = true, doseAndRate present and no timing. A structured rhythm already determines the spacing between administrations; a second, weaker lower bound next to it is contradictory. A free-text dosage is rendered verbatim, so a minimum interval next to it could never appear in the text. |
modifierExtension.where(url='http://ig.fhir.de/igs/medication/StructureDefinition/MinimumIntervalBetweenAdministrations').exists() implies (asNeeded.ofType(boolean) = true and timing.empty() and doseAndRate.exists())
|
| MinimumIntervalUnitMatchesCode | error | Dosage | The display unit of the minimum interval (valueDuration.unit) must match the UCUM code (e.g. 'Stunde(n)' only with code='h'). |
modifierExtension.where(
url='http://ig.fhir.de/igs/medication/StructureDefinition/MinimumIntervalBetweenAdministrations'
).value.ofType(Duration).all(
(
code = 'min'
implies
(unit = 'Minute(n)' or unit = 'Minute' or unit = 'Minuten')
) and (
code = 'h'
implies
(unit = 'Stunde(n)' or unit = 'Stunde' or unit = 'Stunden')
)
)
|
| PatientInstructionIdentical | error | Dosage | If patientInstruction is used in a resource with multiple dosages, the field must be populated identically in all Dosage elements. |
(
(
%resource.ofType(MedicationRequest).dosageInstruction.combine(%resource.ofType(MedicationDispense).dosageInstruction).combine(%resource.ofType(MedicationStatement).dosage)
).patientInstruction.distinct().count() <= 1
)
and
(
(
(
%resource.ofType(MedicationRequest).dosageInstruction.combine(%resource.ofType(MedicationDispense).dosageInstruction).combine(%resource.ofType(MedicationStatement).dosage)
).patientInstruction.exists()
)
implies
(
(
%resource.ofType(MedicationRequest).dosageInstruction.combine(%resource.ofType(MedicationDispense).dosageInstruction).combine(%resource.ofType(MedicationStatement).dosage)
).all(patientInstruction.exists())
)
)
|
| TimingOnlyOnePeriodForDayOfWeek | error | Dosage.timing | In a schema that combines dayOfWeek with either timeOfDay or when, each combination of weekday and time must be unique across all Dosage elements of a resource. |
( /* Detect DayOfWeek and Time/4-Schema */
%resource.ofType(MedicationRequest).dosageInstruction.combine(%resource.ofType(MedicationDispense).dosageInstruction).combine(%resource.ofType(MedicationStatement).dosage)
).all(
(
timing.repeat.dayOfWeek.exists() and
(
(timing.repeat.timeOfDay.exists() and timing.repeat.when.empty()) or
(timing.repeat.when.exists() and timing.repeat.timeOfDay.empty())
)
)
implies
(
(
(%resource.ofType(MedicationRequest).exists() or %resource.ofType(MedicationDispense).exists())
implies
(
/* For each day of week */
/* if Mon occurs multiple times */
((%resource.dosageInstruction.timing.repeat.dayOfWeek.where($this = 'mon').count() > 1) implies
(
(%resource.dosageInstruction.timing.repeat.where('mon' in dayOfWeek).when.distinct().count() = %resource.dosageInstruction.timing.repeat.where('mon' in dayOfWeek).when.count()) and
(%resource.dosageInstruction.timing.repeat.where('mon' in dayOfWeek).timeOfDay.distinct().count() = %resource.dosageInstruction.timing.repeat.where('mon' in dayOfWeek).timeOfDay.count())
)) and
/* if tue occurs multiple times */
((%resource.dosageInstruction.timing.repeat.dayOfWeek.where($this = 'tue').count() > 1) implies
(
(%resource.dosageInstruction.timing.repeat.where('tue' in dayOfWeek).when.distinct().count() = %resource.dosageInstruction.timing.repeat.where('tue' in dayOfWeek).when.count()) and
(%resource.dosageInstruction.timing.repeat.where('tue' in dayOfWeek).timeOfDay.distinct().count() = %resource.dosageInstruction.timing.repeat.where('tue' in dayOfWeek).timeOfDay.count())
)) and
/* if wed occurs multiple times */
((%resource.dosageInstruction.timing.repeat.dayOfWeek.where($this = 'wed').count() > 1) implies
(
(%resource.dosageInstruction.timing.repeat.where('wed' in dayOfWeek).when.distinct().count() = %resource.dosageInstruction.timing.repeat.where('wed' in dayOfWeek).when.count()) and
(%resource.dosageInstruction.timing.repeat.where('wed' in dayOfWeek).timeOfDay.distinct().count() = %resource.dosageInstruction.timing.repeat.where('wed' in dayOfWeek).timeOfDay.count())
)) and
/* if thu occurs multiple times */
((%resource.dosageInstruction.timing.repeat.dayOfWeek.where($this = 'thu').count() > 1) implies
(
(%resource.dosageInstruction.timing.repeat.where('thu' in dayOfWeek).when.distinct().count() = %resource.dosageInstruction.timing.repeat.where('thu' in dayOfWeek).when.count()) and
(%resource.dosageInstruction.timing.repeat.where('thu' in dayOfWeek).timeOfDay.distinct().count() = %resource.dosageInstruction.timing.repeat.where('thu' in dayOfWeek).timeOfDay.count())
)) and
/* if fri occurs multiple times */
((%resource.dosageInstruction.timing.repeat.dayOfWeek.where($this = 'fri').count() > 1) implies
(
(%resource.dosageInstruction.timing.repeat.where('fri' in dayOfWeek).when.distinct().count() = %resource.dosageInstruction.timing.repeat.where('fri' in dayOfWeek).when.count()) and
(%resource.dosageInstruction.timing.repeat.where('fri' in dayOfWeek).timeOfDay.distinct().count() = %resource.dosageInstruction.timing.repeat.where('fri' in dayOfWeek).timeOfDay.count())
)) and
/* if sat occurs multiple times */
((%resource.dosageInstruction.timing.repeat.dayOfWeek.where($this = 'sat').count() > 1) implies
(
(%resource.dosageInstruction.timing.repeat.where('sat' in dayOfWeek).when.distinct().count() = %resource.dosageInstruction.timing.repeat.where('sat' in dayOfWeek).when.count()) and
(%resource.dosageInstruction.timing.repeat.where('sat' in dayOfWeek).timeOfDay.distinct().count() = %resource.dosageInstruction.timing.repeat.where('sat' in dayOfWeek).timeOfDay.count())
)) and
/* if sun occurs multiple times */
((%resource.dosageInstruction.timing.repeat.dayOfWeek.where($this = 'sun').count() > 1) implies
(
(%resource.dosageInstruction.timing.repeat.where('sun' in dayOfWeek).when.distinct().count() = %resource.dosageInstruction.timing.repeat.where('sun' in dayOfWeek).when.count()) and
(%resource.dosageInstruction.timing.repeat.where('sun' in dayOfWeek).timeOfDay.distinct().count() = %resource.dosageInstruction.timing.repeat.where('sun' in dayOfWeek).timeOfDay.count())
))
)
)
and
(
%resource.ofType(MedicationStatement).exists()
implies
(
/* For each day of week */
/* if Mon occurs multiple times */
((%resource.dosage.timing.repeat.dayOfWeek.where($this = 'mon').count() > 1) implies
(
(%resource.dosage.timing.repeat.where('mon' in dayOfWeek).when.distinct().count() = %resource.dosage.timing.repeat.where('mon' in dayOfWeek).when.count()) and
(%resource.dosage.timing.repeat.where('mon' in dayOfWeek).timeOfDay.distinct().count() = %resource.dosage.timing.repeat.where('mon' in dayOfWeek).timeOfDay.count())
)) and
/* if tue occurs multiple times */
((%resource.dosage.timing.repeat.dayOfWeek.where($this = 'tue').count() > 1) implies
(
(%resource.dosage.timing.repeat.where('tue' in dayOfWeek).when.distinct().count() = %resource.dosage.timing.repeat.where('tue' in dayOfWeek).when.count()) and
(%resource.dosage.timing.repeat.where('tue' in dayOfWeek).timeOfDay.distinct().count() = %resource.dosage.timing.repeat.where('tue' in dayOfWeek).timeOfDay.count())
)) and
/* if wed occurs multiple times */
((%resource.dosage.timing.repeat.dayOfWeek.where($this = 'wed').count() > 1) implies
(
(%resource.dosage.timing.repeat.where('wed' in dayOfWeek).when.distinct().count() = %resource.dosage.timing.repeat.where('wed' in dayOfWeek).when.count()) and
(%resource.dosage.timing.repeat.where('wed' in dayOfWeek).timeOfDay.distinct().count() = %resource.dosage.timing.repeat.where('wed' in dayOfWeek).timeOfDay.count())
)) and
/* if thu occurs multiple times */
((%resource.dosage.timing.repeat.dayOfWeek.where($this = 'thu').count() > 1) implies
(
(%resource.dosage.timing.repeat.where('thu' in dayOfWeek).when.distinct().count() = %resource.dosage.timing.repeat.where('thu' in dayOfWeek).when.count()) and
(%resource.dosage.timing.repeat.where('thu' in dayOfWeek).timeOfDay.distinct().count() = %resource.dosage.timing.repeat.where('thu' in dayOfWeek).timeOfDay.count())
)) and
/* if fri occurs multiple times */
((%resource.dosage.timing.repeat.dayOfWeek.where($this = 'fri').count() > 1) implies
(
(%resource.dosage.timing.repeat.where('fri' in dayOfWeek).when.distinct().count() = %resource.dosage.timing.repeat.where('fri' in dayOfWeek).when.count()) and
(%resource.dosage.timing.repeat.where('fri' in dayOfWeek).timeOfDay.distinct().count() = %resource.dosage.timing.repeat.where('fri' in dayOfWeek).timeOfDay.count())
)) and
/* if sat occurs multiple times */
((%resource.dosage.timing.repeat.dayOfWeek.where($this = 'sat').count() > 1) implies
(
(%resource.dosage.timing.repeat.where('sat' in dayOfWeek).when.distinct().count() = %resource.dosage.timing.repeat.where('sat' in dayOfWeek).when.count()) and
(%resource.dosage.timing.repeat.where('sat' in dayOfWeek).timeOfDay.distinct().count() = %resource.dosage.timing.repeat.where('sat' in dayOfWeek).timeOfDay.count())
)) and
/* if sun occurs multiple times */
((%resource.dosage.timing.repeat.dayOfWeek.where($this = 'sun').count() > 1) implies
(
(%resource.dosage.timing.repeat.where('sun' in dayOfWeek).when.distinct().count() = %resource.dosage.timing.repeat.where('sun' in dayOfWeek).when.count()) and
(%resource.dosage.timing.repeat.where('sun' in dayOfWeek).timeOfDay.distinct().count() = %resource.dosage.timing.repeat.where('sun' in dayOfWeek).timeOfDay.count())
))
)
)
)
)
|
| dos-1 | error | Dosage | AsNeededFor can only be set if AsNeeded is empty or true |
extension.where(url='http://hl7.org/fhir/5.0/StructureDefinition/extension-Dosage.asNeededFor').empty() or asNeeded.empty() or asNeeded
|
| ele-1 | error | **ALL** elements | All FHIR elements must have a @value or children |
hasValue() or (children().count() > id.count())
|
| ext-1 | error | **ALL** extensions | Must have either extensions or value[x], not both |
extension.exists() != value.exists()
|
| sqty-1 | error | Dosage.doseAndRate.dose[x]:doseRange.low, Dosage.doseAndRate.dose[x]:doseRange.high | The comparator is not used on a SimpleQuantity |
comparator.empty()
|
This structure is derived from DosageDE
| Name | Flags | Card. | Type | Description & Constraints Filter: ![]() |
|---|---|---|---|---|
![]() |
C | 0..* | DosageDE | How the medication is/was taken or should be taken Constraints: DosageStructuredOrFreeText, DosageStructuredRequiresBoth, DosageRequiresGeneratedText, FreeTextSingleDosageOnly, FreeTextMatchesRenderedText, DosageDoseQuantityAllowedFractions, DosageDoseUnitSameCode, DosageDoseValueDecimalNotation, DosageDoseValuePositive, DosageLimitsPositive, DosageFourSlotPatternInText, PatientInstructionIdentical, MaxDoseSameUnitAsDose, MaxDoseNotBelowDose, MaxDosePerPeriodOnly24hOr1d, MaxDoseOnlyPureAsNeeded, DoseRangeHighRequiredWhenLowPresent, DoseRangeLowAndHighSameUnit, DoseRangeNoVarPeriod, MinimumIntervalOnlyPureAsNeeded, AsNeededForRequiresAsNeeded, AsNeededSingleDosageOnly, AsNeededIdentical, AsNeededForIdentical, MinimumIntervalUnitMatchesCode |
![]() ![]() |
Content/Rules for all slices | |||
![]() ![]() ![]() |
0..* | R5 Dosage.asNeededFor | Dosage asNeededFor | |
![]() ![]() ![]() ![]() |
||||
![]() ![]() ![]() ![]() ![]() |
0..0 | Code defined by a terminology system | ||
![]() ![]() ![]() ![]() ![]() |
1..1 | string | Plain text representation of the concept | |
![]() ![]() |
Content/Rules for all slices | |||
![]() ![]() ![]() |
0..1 | MinimumIntervalBetweenAdministrationsEx | Minimum Interval Between Administrations | |
![]() ![]() ![]() ![]() |
||||
![]() ![]() ![]() ![]() ![]() |
1..1 | decimal | Numerical value (with implicit precision) | |
![]() ![]() ![]() ![]() ![]() |
0..0 | < | <= | >= | > - how to understand the value | ||
![]() ![]() ![]() ![]() ![]() |
1..1 | string | Unit representation | |
![]() ![]() ![]() ![]() ![]() |
1..1 | uri | System that defines coded unit form Fixed Value: http://unitsofmeasure.org (no extensions allowed) | |
![]() ![]() ![]() ![]() ![]() |
1..1 | code | Coded form of the unit Binding: Mindestabstand UnitsOfTime dgMP ValueSet (required) | |
![]() ![]() |
0..0 | The order of the dosage instructions | ||
![]() ![]() |
0..0 | Supplemental instruction or warnings to the patient - e.g. "with meals", "may cause drowsiness" | ||
![]() ![]() |
0..1 | string | Ergänzende Anwendungshinweise für Patientinnen und Patienten | |
![]() ![]() |
0..1 | TimingDgMP | Wann das Medikament verabreicht werden soll | |
![]() ![]() |
0..1 | boolean | Bedarfsdosierung (nur Ja/Nein-Angabe) | |
![]() ![]() |
0..0 | Body site to administer to | ||
![]() ![]() |
0..0 | How drug should enter body | ||
![]() ![]() |
0..0 | Technique for administering medication | ||
![]() ![]() |
0..1 | Element | Menge des verabreichten Medikaments | |
![]() ![]() ![]() |
0..0 | The kind of dose or rate specified | ||
![]() ![]() ![]() |
Content/Rules for all slices | |||
![]() ![]() ![]() ![]() |
0..1 | SimpleQuantity | Menge des Medikaments pro Dosis Binding: https://fhir.kbv.de/ValueSet/KBV_VS_SFHIR_BMP_DOSIEREINHEIT (required) | |
![]() ![]() ![]() ![]() ![]() |
1..1 | decimal | Numerical value (with implicit precision) | |
![]() ![]() ![]() ![]() ![]() |
1..1 | string | Unit representation | |
![]() ![]() ![]() ![]() ![]() |
1..1 | uri | System that defines coded unit form | |
![]() ![]() ![]() ![]() ![]() |
1..1 | code | Coded form of the unit | |
![]() ![]() ![]() ![]() |
0..1 | Range | Amount of medication per dose | |
![]() ![]() ![]() ![]() ![]() |
0..1 | SimpleQuantity(4.0.1) | Low limit Binding: https://fhir.kbv.de/ValueSet/KBV_VS_SFHIR_BMP_DOSIEREINHEIT (required) | |
![]() ![]() ![]() ![]() ![]() ![]() |
1..1 | decimal | Numerical value (with implicit precision) | |
![]() ![]() ![]() ![]() ![]() ![]() |
1..1 | string | Unit representation | |
![]() ![]() ![]() ![]() ![]() ![]() |
1..1 | uri | System that defines coded unit form | |
![]() ![]() ![]() ![]() ![]() ![]() |
1..1 | code | Coded form of the unit | |
![]() ![]() ![]() ![]() ![]() |
0..1 | SimpleQuantity(4.0.1) | High limit Binding: https://fhir.kbv.de/ValueSet/KBV_VS_SFHIR_BMP_DOSIEREINHEIT (required) | |
![]() ![]() ![]() ![]() ![]() ![]() |
1..1 | decimal | Numerical value (with implicit precision) | |
![]() ![]() ![]() ![]() ![]() ![]() |
1..1 | string | Unit representation | |
![]() ![]() ![]() ![]() ![]() ![]() |
1..1 | uri | System that defines coded unit form | |
![]() ![]() ![]() ![]() ![]() ![]() |
1..1 | code | Coded form of the unit | |
![]() ![]() ![]() |
0..0 | Amount of medication per unit of time | ||
![]() ![]() |
||||
![]() ![]() ![]() |
||||
![]() ![]() ![]() ![]() |
0..0 | < | <= | >= | > - how to understand the value | ||
![]() ![]() ![]() |
||||
![]() ![]() ![]() ![]() |
0..0 | < | <= | >= | > - how to understand the value | ||
![]() ![]() |
0..0 | Upper limit on medication per administration | ||
![]() ![]() |
0..0 | Upper limit on medication per lifetime of the patient | ||
Documentation for this format | ||||
| Path | Status | Usage | ValueSet | Version | Source |
| Dosage.modifierExtension:minimumIntervalBetweenAdministrations.value[x].code | Base | required | Mindestabstand UnitsOfTime dgMP ValueSet | 📦2.0.0-ballot | This IG |
| Dosage.doseAndRate.dose[x]:doseQuantity | Base | required | https://fhir.kbv.de/ValueSet/KBV_VS_SFHIR_BMP_DOSIEREINHEIT | Not State | Unknown |
| Dosage.doseAndRate.dose[x]:doseRange.low | Base | required | https://fhir.kbv.de/ValueSet/KBV_VS_SFHIR_BMP_DOSIEREINHEIT | Not State | Unknown |
| Dosage.doseAndRate.dose[x]:doseRange.high | Base | required | https://fhir.kbv.de/ValueSet/KBV_VS_SFHIR_BMP_DOSIEREINHEIT | Not State | Unknown |
| Id | Grade | Path(s) | Description | Expression |
| AsNeededForIdentical | error | Dosage | The reason for use (asNeededFor) must be populated identically across all Dosage elements of a resource. Multiple reasons per element are allowed but must then match in every element. |
(
%resource.ofType(MedicationRequest).dosageInstruction.combine(%resource.ofType(MedicationDispense).dosageInstruction).combine(%resource.ofType(MedicationStatement).dosage)
).all(
extension.where(
url='http://hl7.org/fhir/5.0/StructureDefinition/extension-Dosage.asNeededFor'
).value.ofType(CodeableConcept).text.distinct().count()
=
(
%resource.ofType(MedicationRequest).dosageInstruction.combine(%resource.ofType(MedicationDispense).dosageInstruction).combine(%resource.ofType(MedicationStatement).dosage)
).extension.where(
url='http://hl7.org/fhir/5.0/StructureDefinition/extension-Dosage.asNeededFor'
).value.ofType(CodeableConcept).text.distinct().count()
)
|
| AsNeededForRequiresAsNeeded | error | Dosage | A reason for use (asNeededFor) may only be given for an as-needed dosage (asNeededBoolean = true). |
extension.where(url='http://hl7.org/fhir/5.0/StructureDefinition/extension-Dosage.asNeededFor').exists() implies asNeeded.ofType(boolean) = true
|
| AsNeededIdentical | error | Dosage | The as-needed flag (asNeededBoolean) must be populated identically across all Dosage elements of a resource. |
(
(
%resource.ofType(MedicationRequest).dosageInstruction.combine(%resource.ofType(MedicationDispense).dosageInstruction).combine(%resource.ofType(MedicationStatement).dosage)
).asNeeded.ofType(boolean).distinct().count() <= 1
)
and
(
(
(
%resource.ofType(MedicationRequest).dosageInstruction.combine(%resource.ofType(MedicationDispense).dosageInstruction).combine(%resource.ofType(MedicationStatement).dosage)
).asNeeded.ofType(boolean).exists()
)
implies
(
(
%resource.ofType(MedicationRequest).dosageInstruction.combine(%resource.ofType(MedicationDispense).dosageInstruction).combine(%resource.ofType(MedicationStatement).dosage)
).all(asNeeded.ofType(boolean).exists())
)
)
|
| AsNeededSingleDosageOnly | error | Dosage | If an as-needed dosage with asNeededBoolean = true is given without timing, exactly one Dosage element must exist in the resource. |
(
%resource.ofType(MedicationRequest).dosageInstruction.combine(%resource.ofType(MedicationDispense).dosageInstruction).combine(%resource.ofType(MedicationStatement).dosage)
).where(
asNeeded.ofType(boolean) = true and timing.empty()
).exists()
implies
(
%resource.ofType(MedicationRequest).dosageInstruction.combine(%resource.ofType(MedicationDispense).dosageInstruction).combine(%resource.ofType(MedicationStatement).dosage)
).count() = 1
|
| DosageDoseQuantityAllowedFractions | error | Dosage | Dose values in doseQuantity or doseRange must be whole numbers or use one of the following fractional parts: .25, .33, .5, .66 or .75. |
doseAndRate.all(
(
dose.ofType(Quantity).value.empty() or
dose.ofType(Quantity).value.all(
($this mod 1 = 0) or
($this mod 1 = 0.25) or
($this mod 1 = 0.33) or
($this mod 1 = 0.5) or
($this mod 1 = 0.66) or
($this mod 1 = 0.75)
)
)
and
(
dose.ofType(Range).low.value.empty() or
dose.ofType(Range).low.value.all(
($this mod 1 = 0) or
($this mod 1 = 0.25) or
($this mod 1 = 0.33) or
($this mod 1 = 0.5) or
($this mod 1 = 0.66) or
($this mod 1 = 0.75)
)
)
and
(
dose.ofType(Range).high.value.empty() or
dose.ofType(Range).high.value.all(
($this mod 1 = 0) or
($this mod 1 = 0.25) or
($this mod 1 = 0.33) or
($this mod 1 = 0.5) or
($this mod 1 = 0.66) or
($this mod 1 = 0.75)
)
)
)
|
| DosageDoseUnitSameCode | error | Dosage | The dose unit must be the same across all dosages. |
(%resource.ofType(MedicationRequest).dosageInstruction.combine(%resource.ofType(MedicationDispense).dosageInstruction).combine(%resource.ofType(MedicationStatement).dosage)).all(
doseAndRate.exists() implies
(
(%resource.ofType(MedicationRequest).dosageInstruction.combine(%resource.ofType(MedicationDispense).dosageInstruction).combine(%resource.ofType(MedicationStatement).dosage)).doseAndRate.dose.ofType(Quantity).code |
(%resource.ofType(MedicationRequest).dosageInstruction.combine(%resource.ofType(MedicationDispense).dosageInstruction).combine(%resource.ofType(MedicationStatement).dosage)).doseAndRate.dose.ofType(Range).low.code |
(%resource.ofType(MedicationRequest).dosageInstruction.combine(%resource.ofType(MedicationDispense).dosageInstruction).combine(%resource.ofType(MedicationStatement).dosage)).doseAndRate.dose.ofType(Range).high.code
).distinct().count() = 1
)
|
| DosageDoseValueDecimalNotation | error | Dosage | Dose values in doseQuantity or doseRange must use plain decimal notation with at most two decimal places. Exponential notation (e.g. 50e-2 instead of 0.5) is not allowed. |
doseAndRate.all(
(
dose.ofType(Quantity).value.empty() or
dose.ofType(Quantity).value.toString().matches('^[0-9]+([.][0-9]{1,2})?$')
)
and
(
dose.ofType(Range).low.value.empty() or
dose.ofType(Range).low.value.toString().matches('^[0-9]+([.][0-9]{1,2})?$')
)
and
(
dose.ofType(Range).high.value.empty() or
dose.ofType(Range).high.value.toString().matches('^[0-9]+([.][0-9]{1,2})?$')
)
)
|
| DosageDoseValuePositive | error | Dosage | doseQuantity.value and doseRange.high.value must be greater than 0. The value 0 is additionally allowed for doseRange.low.value only. |
doseAndRate.all(
dose.ofType(Quantity).value.all($this > 0) and
dose.ofType(Range).low.value.all($this >= 0) and
dose.ofType(Range).high.value.all($this > 0)
)
|
| DosageFourSlotPatternInText | error | Dosage | A bare four-slot dosing schema (Viererschema, e.g. 1-0-1-0 or 1-0-1-0 Stück) must not be given as free text in Dosage.text; it has to be represented structurally. A schema embedded in further text, including the generated form 'täglich: 1-0-1-0 Stück', only triggers the warning DosageFourSlotPatternInTextWarning. |
text.exists() implies text.matches('^\\s*\\d+([.,]\\d+)?(\\s*/\\s*\\d+)?(\\s*[-–]\\s*\\d+([.,]\\d+)?(\\s*/\\s*\\d+)?){3}(\\s*[A-Za-zÄÖÜäöüß().]+)?\\s*$').not()
|
| DosageLimitsPositive | error | Dosage | The minimum interval between administrations (valueDuration.value) and maxDosePerPeriod (numerator.value, denominator.value) must be greater than 0. |
modifierExtension.where(
url = 'http://ig.fhir.de/igs/medication/StructureDefinition/MinimumIntervalBetweenAdministrations'
).value.ofType(Duration).value.all($this > 0) and
maxDosePerPeriod.numerator.value.all($this > 0) and
maxDosePerPeriod.denominator.value.all($this > 0)
|
| DosageRequiresGeneratedText | error | Dosage | Regardless of the kind of dosage (structured or free text), the GeneratedDosageInstructionsMeta and renderedDosageInstruction extensions must be present. |
%resource.extension.where(
url = 'http://ig.fhir.de/igs/medication/StructureDefinition/GeneratedDosageInstructionsMeta'
).exists() and
(
%resource.extension.where(
url = 'http://hl7.org/fhir/5.0/StructureDefinition/extension-MedicationRequest.renderedDosageInstruction'
).exists() or
%resource.extension.where(
url = 'http://hl7.org/fhir/5.0/StructureDefinition/extension-MedicationDispense.renderedDosageInstruction'
).exists() or
%resource.extension.where(
url = 'http://hl7.org/fhir/5.0/StructureDefinition/extension-MedicationStatement.renderedDosageInstruction'
).exists()
)
|
| DosageStructuredOrFreeText | error | Dosage | A dosage must be given either as free text only or as complete structured information only; mixing both is not allowed. |
(%resource.ofType(MedicationRequest).dosageInstruction.combine(%resource.ofType(MedicationDispense).dosageInstruction).combine(%resource.ofType(MedicationStatement).dosage)).all(
(text.exists() and timing.empty() and doseAndRate.empty()) or
(text.empty() and (timing.exists() or doseAndRate.exists()))
)
|
| DosageStructuredRequiresBoth | error | Dosage | If a structured dosage is given, both timing and doseAndRate must be present. For pure as-needed dosages, doseAndRate may be given without timing. |
(%resource.ofType(MedicationRequest).dosageInstruction.combine(%resource.ofType(MedicationDispense).dosageInstruction).combine(%resource.ofType(MedicationStatement).dosage)).all(
(timing.exists() implies doseAndRate.exists()) and
(doseAndRate.exists() implies (
timing.exists() or
asNeeded.ofType(boolean) = true or
extension.where(url='http://hl7.org/fhir/5.0/StructureDefinition/extension-Dosage.asNeededFor').exists()
))
)
|
| DoseRangeHighRequiredWhenLowPresent | error | Dosage | If a lower bound is given for doseRange, an upper bound must be given as well. |
doseAndRate.dose.ofType(Range).low.empty() or doseAndRate.dose.ofType(Range).high.exists()
|
| DoseRangeLowAndHighSameUnit | error | Dosage | The lower and upper bound of a variable single dose must use the same unit of measure. |
doseAndRate.dose.ofType(Range).low.empty()
or doseAndRate.dose.ofType(Range).high.empty()
or (
doseAndRate.dose.ofType(Range).low.system = doseAndRate.dose.ofType(Range).high.system
and doseAndRate.dose.ofType(Range).low.code = doseAndRate.dose.ofType(Range).high.code
and doseAndRate.dose.ofType(Range).low.unit = doseAndRate.dose.ofType(Range).high.unit
)
|
| DoseRangeNoVarPeriod | warning | Dosage | A variable single dose and a variable period should not be used together. |
doseAndRate.dose.ofType(Range).empty() or timing.repeat.periodMax.empty()
|
| FreeTextMatchesRenderedText | error | Dosage | If a dosage is given as pure free text (text present, timing and doseAndRate empty), the value in dosageInstruction.text must match the value in the renderedDosageInstruction extension. |
(
(%resource.ofType(MedicationRequest).dosageInstruction.combine(%resource.ofType(MedicationDispense).dosageInstruction).combine(%resource.ofType(MedicationStatement).dosage)
).where(text.exists() and timing.empty() and doseAndRate.empty()).exists()
)
implies
(
(
%resource.ofType(MedicationRequest).exists() and
%resource.extension.where(
url = 'http://hl7.org/fhir/5.0/StructureDefinition/extension-MedicationRequest.renderedDosageInstruction'
).value = %resource.dosageInstruction.text
) or
(
%resource.ofType(MedicationDispense).exists() and
%resource.extension.where(
url = 'http://hl7.org/fhir/5.0/StructureDefinition/extension-MedicationDispense.renderedDosageInstruction'
).value = %resource.dosageInstruction.text
) or
(
%resource.ofType(MedicationStatement).exists() and
%resource.extension.where(
url = 'http://hl7.org/fhir/5.0/StructureDefinition/extension-MedicationStatement.renderedDosageInstruction'
).value = %resource.dosage.text
)
)
|
| FreeTextSingleDosageOnly | error | Dosage | If a dosage is given as pure free text, there must be exactly one Dosage element. |
(
(%resource.ofType(MedicationRequest).dosageInstruction.combine(%resource.ofType(MedicationDispense).dosageInstruction).combine(%resource.ofType(MedicationStatement).dosage)
).exists(text.exists() and timing.empty() and doseAndRate.empty())
)
implies
(
(%resource.ofType(MedicationRequest).dosageInstruction.combine(%resource.ofType(MedicationDispense).dosageInstruction).combine(%resource.ofType(MedicationStatement).dosage)
).count() = 1
)
|
| MaxDoseNotBelowDose | error | Dosage | maxDosePerPeriod.numerator.value must not be smaller than the single dose (doseQuantity.value or doseRange.high.value). |
maxDosePerPeriod.numerator.value.empty() or (
(doseAndRate.dose.ofType(Quantity).value.empty() or
doseAndRate.dose.ofType(Quantity).value <= maxDosePerPeriod.numerator.value) and
(doseAndRate.dose.ofType(Range).high.value.empty() or
doseAndRate.dose.ofType(Range).high.value <= maxDosePerPeriod.numerator.value)
)
|
| MaxDoseOnlyPureAsNeeded | error | Dosage | A maximum amount (maxDosePerPeriod) may only be given for a structured pure as-needed dosage: asNeededBoolean = true, doseAndRate present and no timing. A structured rhythm already determines how much is applied within the reference period. A free-text dosage is rendered verbatim, so a maximum amount next to it could never appear in the text. |
maxDosePerPeriod.exists() implies (asNeeded.ofType(boolean) = true and timing.empty() and doseAndRate.exists())
|
| MaxDosePerPeriodOnly24hOr1d | error | Dosage | maxDosePerPeriod is only allowed with a reference period of 24 hours (24 h) or 1 day (1 d). Other periods (e.g. at most 3 every 6 h) are not allowed. |
maxDosePerPeriod.empty() or (
(maxDosePerPeriod.denominator.value = 24 and maxDosePerPeriod.denominator.code = 'h') or
(maxDosePerPeriod.denominator.value = 1 and maxDosePerPeriod.denominator.code = 'd')
)
|
| MaxDoseSameUnitAsDose | error | Dosage | maxDosePerPeriod must use the same unit, code and system as doseQuantity. |
maxDosePerPeriod.empty() or (
(
doseAndRate.dose.ofType(Quantity).exists() and
doseAndRate.dose.ofType(Quantity).system = maxDosePerPeriod.numerator.system and
doseAndRate.dose.ofType(Quantity).code = maxDosePerPeriod.numerator.code and
doseAndRate.dose.ofType(Quantity).unit = maxDosePerPeriod.numerator.unit
) or (
doseAndRate.dose.ofType(Range).exists() and
(
doseAndRate.dose.ofType(Range).low.empty() or (
doseAndRate.dose.ofType(Range).low.system = maxDosePerPeriod.numerator.system and
doseAndRate.dose.ofType(Range).low.code = maxDosePerPeriod.numerator.code and
doseAndRate.dose.ofType(Range).low.unit = maxDosePerPeriod.numerator.unit
)
) and (
doseAndRate.dose.ofType(Range).high.empty() or (
doseAndRate.dose.ofType(Range).high.system = maxDosePerPeriod.numerator.system and
doseAndRate.dose.ofType(Range).high.code = maxDosePerPeriod.numerator.code and
doseAndRate.dose.ofType(Range).high.unit = maxDosePerPeriod.numerator.unit
)
)
)
)
|
| MinimumIntervalOnlyPureAsNeeded | error | Dosage | A minimum interval between two single administrations (Mindestabstand) may only be given for a structured pure as-needed dosage: asNeededBoolean = true, doseAndRate present and no timing. A structured rhythm already determines the spacing between administrations; a second, weaker lower bound next to it is contradictory. A free-text dosage is rendered verbatim, so a minimum interval next to it could never appear in the text. |
modifierExtension.where(url='http://ig.fhir.de/igs/medication/StructureDefinition/MinimumIntervalBetweenAdministrations').exists() implies (asNeeded.ofType(boolean) = true and timing.empty() and doseAndRate.exists())
|
| MinimumIntervalUnitMatchesCode | error | Dosage | The display unit of the minimum interval (valueDuration.unit) must match the UCUM code (e.g. 'Stunde(n)' only with code='h'). |
modifierExtension.where(
url='http://ig.fhir.de/igs/medication/StructureDefinition/MinimumIntervalBetweenAdministrations'
).value.ofType(Duration).all(
(
code = 'min'
implies
(unit = 'Minute(n)' or unit = 'Minute' or unit = 'Minuten')
) and (
code = 'h'
implies
(unit = 'Stunde(n)' or unit = 'Stunde' or unit = 'Stunden')
)
)
|
| PatientInstructionIdentical | error | Dosage | If patientInstruction is used in a resource with multiple dosages, the field must be populated identically in all Dosage elements. |
(
(
%resource.ofType(MedicationRequest).dosageInstruction.combine(%resource.ofType(MedicationDispense).dosageInstruction).combine(%resource.ofType(MedicationStatement).dosage)
).patientInstruction.distinct().count() <= 1
)
and
(
(
(
%resource.ofType(MedicationRequest).dosageInstruction.combine(%resource.ofType(MedicationDispense).dosageInstruction).combine(%resource.ofType(MedicationStatement).dosage)
).patientInstruction.exists()
)
implies
(
(
%resource.ofType(MedicationRequest).dosageInstruction.combine(%resource.ofType(MedicationDispense).dosageInstruction).combine(%resource.ofType(MedicationStatement).dosage)
).all(patientInstruction.exists())
)
)
|
| Name | Flags | Card. | Type | Description & Constraints Filter: ![]() |
|---|---|---|---|---|
![]() |
C | 0..* | DosageDE | How the medication is/was taken or should be taken Constraints: DosageStructuredOrFreeTextWarning, DosageStructuredRequiresBothWarning, DosageDoseUnitSameCodeWarning, DosageDoseValuePositiveWarning, DosageLimitsPositiveWarning, DosageFourSlotPatternInTextWarning, FreeTextSingleDosageOnlyWarning, AsNeededForRequiresAsNeededWarning, dos-1, DosageStructuredOrFreeText, DosageStructuredRequiresBoth, DosageRequiresGeneratedText, FreeTextSingleDosageOnly, FreeTextMatchesRenderedText, DosageDoseQuantityAllowedFractions, DosageDoseUnitSameCode, DosageDoseValueDecimalNotation, DosageDoseValuePositive, DosageLimitsPositive, DosageFourSlotPatternInText, PatientInstructionIdentical, MaxDoseSameUnitAsDose, MaxDoseNotBelowDose, MaxDosePerPeriodOnly24hOr1d, MaxDoseOnlyPureAsNeeded, DoseRangeHighRequiredWhenLowPresent, DoseRangeLowAndHighSameUnit, DoseRangeNoVarPeriod, MinimumIntervalOnlyPureAsNeeded, AsNeededForRequiresAsNeeded, AsNeededSingleDosageOnly, AsNeededIdentical, AsNeededForIdentical, MinimumIntervalUnitMatchesCode |
![]() ![]() |
0..1 | string | Unique id for inter-element referencing | |
![]() ![]() |
0..* | Extension | Additional content defined by implementations Slice: Unordered, Open by value:url | |
![]() ![]() ![]() |
0..* | (Complex) | Dosage asNeededFor URL: http://hl7.org/fhir/5.0/StructureDefinition/extension-Dosage.asNeededFor | |
![]() ![]() ![]() ![]() |
0..1 | string | Unique id for inter-element referencing | |
![]() ![]() ![]() ![]() |
0..0 | Extension Slice: Unordered, Open by value:url | ||
![]() ![]() ![]() ![]() |
1..1 | uri | "http://hl7.org/fhir/5.0/StructureDefinition/extension-Dosage.asNeededFor" | |
![]() ![]() ![]() ![]() |
0..1 | CodeableConcept | Value of extension Binding: SNOMEDCTMedicationAsNeededReasonCodes (example) | |
![]() ![]() ![]() ![]() ![]() |
0..1 | string | Unique id for inter-element referencing | |
![]() ![]() ![]() ![]() ![]() |
0..* | Extension | Additional content defined by implementations Slice: Unordered, Open by value:url | |
![]() ![]() ![]() ![]() ![]() |
1..1 | string | Plain text representation of the concept | |
![]() ![]() |
0..* | Extension | Extension Slice: Unordered, Open by value:url Slicing Note: The rules on this element (including its children) apply to all the slices, but are not repeated in them | |
![]() ![]() ![]() |
0..1 | (Complex) | Minimum Interval Between Administrations URL: http://ig.fhir.de/igs/medication/StructureDefinition/MinimumIntervalBetweenAdministrations | |
![]() ![]() ![]() ![]() |
0..1 | string | Unique id for inter-element referencing | |
![]() ![]() ![]() ![]() |
0..0 | Extension Slice: Unordered, Open by value:url | ||
![]() ![]() ![]() ![]() |
1..1 | uri | "http://ig.fhir.de/igs/medication/StructureDefinition/MinimumIntervalBetweenAdministrations" | |
![]() ![]() ![]() ![]() |
1..1 | Duration | Mindestabstand zwischen zwei Gaben | |
![]() ![]() ![]() ![]() ![]() |
0..1 | string | Unique id for inter-element referencing | |
![]() ![]() ![]() ![]() ![]() |
0..* | Extension | Additional content defined by implementations Slice: Unordered, Open by value:url | |
![]() ![]() ![]() ![]() ![]() |
1..1 | decimal | Numerical value (with implicit precision) | |
![]() ![]() ![]() ![]() ![]() |
1..1 | string | Unit representation | |
![]() ![]() ![]() ![]() ![]() |
C | 1..1 | uri | System that defines coded unit form Fixed Value: http://unitsofmeasure.org (no extensions allowed) |
![]() ![]() ![]() ![]() ![]() |
1..1 | code | Coded form of the unit Binding: Mindestabstand UnitsOfTime dgMP ValueSet (required) | |
![]() ![]() |
0..1 | string | Freitext-Dosierungsanweisungen, z. B. 'Maximal 3x täglich 1 Stück bei Bedarf' | |
![]() ![]() |
0..1 | string | Ergänzende Anwendungshinweise für Patientinnen und Patienten | |
![]() ![]() |
C | 0..1 | TimingDgMP | Wann das Medikament verabreicht werden soll Constraints: TimingOnlyOnePeriodForDayOfWeek |
![]() ![]() |
0..1 | boolean | Bedarfsdosierung (nur Ja/Nein-Angabe) | |
![]() ![]() |
0..1 | Element | Menge des verabreichten Medikaments | |
![]() ![]() ![]() |
0..1 | string | Unique id for inter-element referencing | |
![]() ![]() ![]() |
0..* | Extension | Additional content defined by implementations Slice: Unordered, Open by value:url | |
![]() ![]() ![]() |
0..1 | Amount of medication per dose Slice: Unordered, Closed by type:$this Slicing Note: The rules on this element (including its children) apply to all the slices, but are not repeated in them | ||
![]() ![]() ![]() ![]() |
Range | |||
![]() ![]() ![]() ![]() |
Quantity(SimpleQuantity) | |||
![]() ![]() ![]() ![]() |
0..1 | SimpleQuantity |
Menge des Medikaments pro Dosis Binding: https://fhir.kbv.de/ValueSet/KBV_VS_SFHIR_BMP_DOSIEREINHEIT (required) | |
![]() ![]() ![]() ![]() ![]() |
0..1 | string | Unique id for inter-element referencing | |
![]() ![]() ![]() ![]() ![]() |
0..* | Extension | Additional content defined by implementations Slice: Unordered, Open by value:url | |
![]() ![]() ![]() ![]() ![]() |
1..1 | decimal | Numerical value (with implicit precision) | |
![]() ![]() ![]() ![]() ![]() |
1..1 | string | Unit representation | |
![]() ![]() ![]() ![]() ![]() |
C | 1..1 | uri | System that defines coded unit form |
![]() ![]() ![]() ![]() ![]() |
1..1 | code | Coded form of the unit | |
![]() ![]() ![]() ![]() |
0..1 | Range | Amount of medication per dose | |
![]() ![]() ![]() ![]() ![]() |
0..1 | string | Unique id for inter-element referencing | |
![]() ![]() ![]() ![]() ![]() |
0..* | Extension | Additional content defined by implementations Slice: Unordered, Open by value:url | |
![]() ![]() ![]() ![]() ![]() |
C | 0..1 | SimpleQuantity(4.0.1) | Low limit Binding: https://fhir.kbv.de/ValueSet/KBV_VS_SFHIR_BMP_DOSIEREINHEIT (required) Constraints: sqty-1 |
![]() ![]() ![]() ![]() ![]() ![]() |
0..1 | string | Unique id for inter-element referencing | |
![]() ![]() ![]() ![]() ![]() ![]() |
0..* | Extension | Additional content defined by implementations Slice: Unordered, Open by value:url | |
![]() ![]() ![]() ![]() ![]() ![]() |
1..1 | decimal | Numerical value (with implicit precision) | |
![]() ![]() ![]() ![]() ![]() ![]() |
1..1 | string | Unit representation | |
![]() ![]() ![]() ![]() ![]() ![]() |
C | 1..1 | uri | System that defines coded unit form |
![]() ![]() ![]() ![]() ![]() ![]() |
1..1 | code | Coded form of the unit | |
![]() ![]() ![]() ![]() ![]() |
C | 0..1 | SimpleQuantity(4.0.1) | High limit Binding: https://fhir.kbv.de/ValueSet/KBV_VS_SFHIR_BMP_DOSIEREINHEIT (required) Constraints: sqty-1 |
![]() ![]() ![]() ![]() ![]() ![]() |
0..1 | string | Unique id for inter-element referencing | |
![]() ![]() ![]() ![]() ![]() ![]() |
0..* | Extension | Additional content defined by implementations Slice: Unordered, Open by value:url | |
![]() ![]() ![]() ![]() ![]() ![]() |
1..1 | decimal | Numerical value (with implicit precision) | |
![]() ![]() ![]() ![]() ![]() ![]() |
1..1 | string | Unit representation | |
![]() ![]() ![]() ![]() ![]() ![]() |
C | 1..1 | uri | System that defines coded unit form |
![]() ![]() ![]() ![]() ![]() ![]() |
1..1 | code | Coded form of the unit | |
![]() ![]() |
0..1 | Ratio | Maximale Dosis pro Zeitraum | |
![]() ![]() ![]() |
0..1 | string | Unique id for inter-element referencing | |
![]() ![]() ![]() |
0..* | Extension | Additional content defined by implementations Slice: Unordered, Open by value:url | |
![]() ![]() ![]() |
0..1 | Quantity | Numerator value | |
![]() ![]() ![]() ![]() |
0..1 | string | Unique id for inter-element referencing | |
![]() ![]() ![]() ![]() |
0..* | Extension | Additional content defined by implementations Slice: Unordered, Open by value:url | |
![]() ![]() ![]() ![]() |
0..1 | decimal | Numerical value (with implicit precision) | |
![]() ![]() ![]() ![]() |
0..1 | string | Unit representation | |
![]() ![]() ![]() ![]() |
C | 0..1 | uri | System that defines coded unit form |
![]() ![]() ![]() ![]() |
0..1 | code | Coded form of the unit | |
![]() ![]() ![]() |
0..1 | Quantity | Denominator value | |
![]() ![]() ![]() ![]() |
0..1 | string | Unique id for inter-element referencing | |
![]() ![]() ![]() ![]() |
0..* | Extension | Additional content defined by implementations Slice: Unordered, Open by value:url | |
![]() ![]() ![]() ![]() |
0..1 | decimal | Numerical value (with implicit precision) | |
![]() ![]() ![]() ![]() |
0..1 | string | Unit representation | |
![]() ![]() ![]() ![]() |
C | 0..1 | uri | System that defines coded unit form |
![]() ![]() ![]() ![]() |
0..1 | code | Coded form of the unit | |
Documentation for this format | ||||
| Path | Status | Usage | ValueSet | Version | Source |
| Dosage.extension:asNeededFor.value[x] | Base | example | SNOMED CT Medication As Needed Reason Codes | 📦4.0.1 | FHIR Std. |
| Dosage.modifierExtension:minimumIntervalBetweenAdministrations.value[x].code | Base | required | Mindestabstand UnitsOfTime dgMP ValueSet | 📦2.0.0-ballot | This IG |
| Dosage.doseAndRate.dose[x]:doseQuantity | Base | required | https://fhir.kbv.de/ValueSet/KBV_VS_SFHIR_BMP_DOSIEREINHEIT | Not State | Unknown |
| Dosage.doseAndRate.dose[x]:doseRange.low | Base | required | https://fhir.kbv.de/ValueSet/KBV_VS_SFHIR_BMP_DOSIEREINHEIT | Not State | Unknown |
| Dosage.doseAndRate.dose[x]:doseRange.high | Base | required | https://fhir.kbv.de/ValueSet/KBV_VS_SFHIR_BMP_DOSIEREINHEIT | Not State | Unknown |
| Id | Grade | Path(s) | Description | Expression |
| AsNeededForIdentical | error | Dosage | The reason for use (asNeededFor) must be populated identically across all Dosage elements of a resource. Multiple reasons per element are allowed but must then match in every element. |
(
%resource.ofType(MedicationRequest).dosageInstruction.combine(%resource.ofType(MedicationDispense).dosageInstruction).combine(%resource.ofType(MedicationStatement).dosage)
).all(
extension.where(
url='http://hl7.org/fhir/5.0/StructureDefinition/extension-Dosage.asNeededFor'
).value.ofType(CodeableConcept).text.distinct().count()
=
(
%resource.ofType(MedicationRequest).dosageInstruction.combine(%resource.ofType(MedicationDispense).dosageInstruction).combine(%resource.ofType(MedicationStatement).dosage)
).extension.where(
url='http://hl7.org/fhir/5.0/StructureDefinition/extension-Dosage.asNeededFor'
).value.ofType(CodeableConcept).text.distinct().count()
)
|
| AsNeededForRequiresAsNeeded | error | Dosage | A reason for use (asNeededFor) may only be given for an as-needed dosage (asNeededBoolean = true). |
extension.where(url='http://hl7.org/fhir/5.0/StructureDefinition/extension-Dosage.asNeededFor').exists() implies asNeeded.ofType(boolean) = true
|
| AsNeededForRequiresAsNeededWarning | warning | Dosage | A reason for use (asNeededFor) should only be given together with asNeededBoolean = true. |
extension.where(url='http://hl7.org/fhir/5.0/StructureDefinition/extension-Dosage.asNeededFor').exists() implies asNeeded.ofType(boolean) = true
|
| AsNeededIdentical | error | Dosage | The as-needed flag (asNeededBoolean) must be populated identically across all Dosage elements of a resource. |
(
(
%resource.ofType(MedicationRequest).dosageInstruction.combine(%resource.ofType(MedicationDispense).dosageInstruction).combine(%resource.ofType(MedicationStatement).dosage)
).asNeeded.ofType(boolean).distinct().count() <= 1
)
and
(
(
(
%resource.ofType(MedicationRequest).dosageInstruction.combine(%resource.ofType(MedicationDispense).dosageInstruction).combine(%resource.ofType(MedicationStatement).dosage)
).asNeeded.ofType(boolean).exists()
)
implies
(
(
%resource.ofType(MedicationRequest).dosageInstruction.combine(%resource.ofType(MedicationDispense).dosageInstruction).combine(%resource.ofType(MedicationStatement).dosage)
).all(asNeeded.ofType(boolean).exists())
)
)
|
| AsNeededSingleDosageOnly | error | Dosage | If an as-needed dosage with asNeededBoolean = true is given without timing, exactly one Dosage element must exist in the resource. |
(
%resource.ofType(MedicationRequest).dosageInstruction.combine(%resource.ofType(MedicationDispense).dosageInstruction).combine(%resource.ofType(MedicationStatement).dosage)
).where(
asNeeded.ofType(boolean) = true and timing.empty()
).exists()
implies
(
%resource.ofType(MedicationRequest).dosageInstruction.combine(%resource.ofType(MedicationDispense).dosageInstruction).combine(%resource.ofType(MedicationStatement).dosage)
).count() = 1
|
| DosageDoseQuantityAllowedFractions | error | Dosage | Dose values in doseQuantity or doseRange must be whole numbers or use one of the following fractional parts: .25, .33, .5, .66 or .75. |
doseAndRate.all(
(
dose.ofType(Quantity).value.empty() or
dose.ofType(Quantity).value.all(
($this mod 1 = 0) or
($this mod 1 = 0.25) or
($this mod 1 = 0.33) or
($this mod 1 = 0.5) or
($this mod 1 = 0.66) or
($this mod 1 = 0.75)
)
)
and
(
dose.ofType(Range).low.value.empty() or
dose.ofType(Range).low.value.all(
($this mod 1 = 0) or
($this mod 1 = 0.25) or
($this mod 1 = 0.33) or
($this mod 1 = 0.5) or
($this mod 1 = 0.66) or
($this mod 1 = 0.75)
)
)
and
(
dose.ofType(Range).high.value.empty() or
dose.ofType(Range).high.value.all(
($this mod 1 = 0) or
($this mod 1 = 0.25) or
($this mod 1 = 0.33) or
($this mod 1 = 0.5) or
($this mod 1 = 0.66) or
($this mod 1 = 0.75)
)
)
)
|
| DosageDoseUnitSameCode | error | Dosage | The dose unit must be the same across all dosages. |
(%resource.ofType(MedicationRequest).dosageInstruction.combine(%resource.ofType(MedicationDispense).dosageInstruction).combine(%resource.ofType(MedicationStatement).dosage)).all(
doseAndRate.exists() implies
(
(%resource.ofType(MedicationRequest).dosageInstruction.combine(%resource.ofType(MedicationDispense).dosageInstruction).combine(%resource.ofType(MedicationStatement).dosage)).doseAndRate.dose.ofType(Quantity).code |
(%resource.ofType(MedicationRequest).dosageInstruction.combine(%resource.ofType(MedicationDispense).dosageInstruction).combine(%resource.ofType(MedicationStatement).dosage)).doseAndRate.dose.ofType(Range).low.code |
(%resource.ofType(MedicationRequest).dosageInstruction.combine(%resource.ofType(MedicationDispense).dosageInstruction).combine(%resource.ofType(MedicationStatement).dosage)).doseAndRate.dose.ofType(Range).high.code
).distinct().count() = 1
)
|
| DosageDoseUnitSameCodeWarning | warning | Dosage | The dose unit should be the same across all dosages. |
(%resource.ofType(MedicationRequest).dosageInstruction.combine(%resource.ofType(MedicationDispense).dosageInstruction).combine(%resource.ofType(MedicationStatement).dosage)).all(
doseAndRate.exists() implies
(
(%resource.ofType(MedicationRequest).dosageInstruction.combine(%resource.ofType(MedicationDispense).dosageInstruction).combine(%resource.ofType(MedicationStatement).dosage)).doseAndRate.dose.ofType(Quantity).code |
(%resource.ofType(MedicationRequest).dosageInstruction.combine(%resource.ofType(MedicationDispense).dosageInstruction).combine(%resource.ofType(MedicationStatement).dosage)).doseAndRate.dose.ofType(Range).low.code |
(%resource.ofType(MedicationRequest).dosageInstruction.combine(%resource.ofType(MedicationDispense).dosageInstruction).combine(%resource.ofType(MedicationStatement).dosage)).doseAndRate.dose.ofType(Range).high.code
).distinct().count() = 1
)
|
| DosageDoseValueDecimalNotation | error | Dosage | Dose values in doseQuantity or doseRange must use plain decimal notation with at most two decimal places. Exponential notation (e.g. 50e-2 instead of 0.5) is not allowed. |
doseAndRate.all(
(
dose.ofType(Quantity).value.empty() or
dose.ofType(Quantity).value.toString().matches('^[0-9]+([.][0-9]{1,2})?$')
)
and
(
dose.ofType(Range).low.value.empty() or
dose.ofType(Range).low.value.toString().matches('^[0-9]+([.][0-9]{1,2})?$')
)
and
(
dose.ofType(Range).high.value.empty() or
dose.ofType(Range).high.value.toString().matches('^[0-9]+([.][0-9]{1,2})?$')
)
)
|
| DosageDoseValuePositive | error | Dosage | doseQuantity.value and doseRange.high.value must be greater than 0. The value 0 is additionally allowed for doseRange.low.value only. |
doseAndRate.all(
dose.ofType(Quantity).value.all($this > 0) and
dose.ofType(Range).low.value.all($this >= 0) and
dose.ofType(Range).high.value.all($this > 0)
)
|
| DosageDoseValuePositiveWarning | warning | Dosage | doseQuantity.value and doseRange.high.value should be greater than 0. The value 0 is additionally allowed for doseRange.low.value only. |
doseAndRate.all(
dose.ofType(Quantity).value.all($this > 0) and
dose.ofType(Range).low.value.all($this >= 0) and
dose.ofType(Range).high.value.all($this > 0)
)
|
| DosageFourSlotPatternInText | error | Dosage | A bare four-slot dosing schema (Viererschema, e.g. 1-0-1-0 or 1-0-1-0 Stück) must not be given as free text in Dosage.text; it has to be represented structurally. A schema embedded in further text, including the generated form 'täglich: 1-0-1-0 Stück', only triggers the warning DosageFourSlotPatternInTextWarning. |
text.exists() implies text.matches('^\\s*\\d+([.,]\\d+)?(\\s*/\\s*\\d+)?(\\s*[-–]\\s*\\d+([.,]\\d+)?(\\s*/\\s*\\d+)?){3}(\\s*[A-Za-zÄÖÜäöüß().]+)?\\s*$').not()
|
| DosageFourSlotPatternInTextWarning | warning | Dosage | A four-slot dosing schema (Viererschema, e.g. 1-1-1-1) was detected in Dosage.text. Please check whether it can be represented structurally. |
text.exists() implies text.matches('.*\\d+\\s*[-–]\\s*\\d+\\s*[-–]\\s*\\d+\\s*[-–]\\s*\\d+.*').not()
|
| DosageLimitsPositive | error | Dosage | The minimum interval between administrations (valueDuration.value) and maxDosePerPeriod (numerator.value, denominator.value) must be greater than 0. |
modifierExtension.where(
url = 'http://ig.fhir.de/igs/medication/StructureDefinition/MinimumIntervalBetweenAdministrations'
).value.ofType(Duration).value.all($this > 0) and
maxDosePerPeriod.numerator.value.all($this > 0) and
maxDosePerPeriod.denominator.value.all($this > 0)
|
| DosageLimitsPositiveWarning | warning | Dosage | The minimum interval between administrations (valueDuration.value) and maxDosePerPeriod (numerator.value, denominator.value) should be greater than 0. |
modifierExtension.where(
url = 'http://ig.fhir.de/igs/medication/StructureDefinition/MinimumIntervalBetweenAdministrations'
).value.ofType(Duration).value.all($this > 0) and
maxDosePerPeriod.numerator.value.all($this > 0) and
maxDosePerPeriod.denominator.value.all($this > 0)
|
| DosageRequiresGeneratedText | error | Dosage | Regardless of the kind of dosage (structured or free text), the GeneratedDosageInstructionsMeta and renderedDosageInstruction extensions must be present. |
%resource.extension.where(
url = 'http://ig.fhir.de/igs/medication/StructureDefinition/GeneratedDosageInstructionsMeta'
).exists() and
(
%resource.extension.where(
url = 'http://hl7.org/fhir/5.0/StructureDefinition/extension-MedicationRequest.renderedDosageInstruction'
).exists() or
%resource.extension.where(
url = 'http://hl7.org/fhir/5.0/StructureDefinition/extension-MedicationDispense.renderedDosageInstruction'
).exists() or
%resource.extension.where(
url = 'http://hl7.org/fhir/5.0/StructureDefinition/extension-MedicationStatement.renderedDosageInstruction'
).exists()
)
|
| DosageStructuredOrFreeText | error | Dosage | A dosage must be given either as free text only or as complete structured information only; mixing both is not allowed. |
(%resource.ofType(MedicationRequest).dosageInstruction.combine(%resource.ofType(MedicationDispense).dosageInstruction).combine(%resource.ofType(MedicationStatement).dosage)).all(
(text.exists() and timing.empty() and doseAndRate.empty()) or
(text.empty() and (timing.exists() or doseAndRate.exists()))
)
|
| DosageStructuredOrFreeTextWarning | warning | Dosage | A dosage must be given either as free text only or as complete structured information only; mixing both is not allowed. |
(%resource.ofType(MedicationRequest).dosageInstruction.combine(%resource.ofType(MedicationDispense).dosageInstruction).combine(%resource.ofType(MedicationStatement).dosage)).all(
(text.exists() and timing.empty() and doseAndRate.empty()) or
(text.empty() and (timing.exists() or doseAndRate.exists()))
)
|
| DosageStructuredRequiresBoth | error | Dosage | If a structured dosage is given, both timing and doseAndRate must be present. For pure as-needed dosages, doseAndRate may be given without timing. |
(%resource.ofType(MedicationRequest).dosageInstruction.combine(%resource.ofType(MedicationDispense).dosageInstruction).combine(%resource.ofType(MedicationStatement).dosage)).all(
(timing.exists() implies doseAndRate.exists()) and
(doseAndRate.exists() implies (
timing.exists() or
asNeeded.ofType(boolean) = true or
extension.where(url='http://hl7.org/fhir/5.0/StructureDefinition/extension-Dosage.asNeededFor').exists()
))
)
|
| DosageStructuredRequiresBothWarning | warning | Dosage | If a structured dosage is given, both timing and doseAndRate should be present. For pure as-needed dosages, doseAndRate may be given without timing. |
(%resource.ofType(MedicationRequest).dosageInstruction.combine(%resource.ofType(MedicationDispense).dosageInstruction).combine(%resource.ofType(MedicationStatement).dosage)).all(
(timing.exists() implies doseAndRate.exists()) and
(doseAndRate.exists() implies (
timing.exists() or
asNeeded.ofType(boolean) = true or
extension.where(url='http://hl7.org/fhir/5.0/StructureDefinition/extension-Dosage.asNeededFor').exists()
))
)
|
| DoseRangeHighRequiredWhenLowPresent | error | Dosage | If a lower bound is given for doseRange, an upper bound must be given as well. |
doseAndRate.dose.ofType(Range).low.empty() or doseAndRate.dose.ofType(Range).high.exists()
|
| DoseRangeLowAndHighSameUnit | error | Dosage | The lower and upper bound of a variable single dose must use the same unit of measure. |
doseAndRate.dose.ofType(Range).low.empty()
or doseAndRate.dose.ofType(Range).high.empty()
or (
doseAndRate.dose.ofType(Range).low.system = doseAndRate.dose.ofType(Range).high.system
and doseAndRate.dose.ofType(Range).low.code = doseAndRate.dose.ofType(Range).high.code
and doseAndRate.dose.ofType(Range).low.unit = doseAndRate.dose.ofType(Range).high.unit
)
|
| DoseRangeNoVarPeriod | warning | Dosage | A variable single dose and a variable period should not be used together. |
doseAndRate.dose.ofType(Range).empty() or timing.repeat.periodMax.empty()
|
| FreeTextMatchesRenderedText | error | Dosage | If a dosage is given as pure free text (text present, timing and doseAndRate empty), the value in dosageInstruction.text must match the value in the renderedDosageInstruction extension. |
(
(%resource.ofType(MedicationRequest).dosageInstruction.combine(%resource.ofType(MedicationDispense).dosageInstruction).combine(%resource.ofType(MedicationStatement).dosage)
).where(text.exists() and timing.empty() and doseAndRate.empty()).exists()
)
implies
(
(
%resource.ofType(MedicationRequest).exists() and
%resource.extension.where(
url = 'http://hl7.org/fhir/5.0/StructureDefinition/extension-MedicationRequest.renderedDosageInstruction'
).value = %resource.dosageInstruction.text
) or
(
%resource.ofType(MedicationDispense).exists() and
%resource.extension.where(
url = 'http://hl7.org/fhir/5.0/StructureDefinition/extension-MedicationDispense.renderedDosageInstruction'
).value = %resource.dosageInstruction.text
) or
(
%resource.ofType(MedicationStatement).exists() and
%resource.extension.where(
url = 'http://hl7.org/fhir/5.0/StructureDefinition/extension-MedicationStatement.renderedDosageInstruction'
).value = %resource.dosage.text
)
)
|
| FreeTextSingleDosageOnly | error | Dosage | If a dosage is given as pure free text, there must be exactly one Dosage element. |
(
(%resource.ofType(MedicationRequest).dosageInstruction.combine(%resource.ofType(MedicationDispense).dosageInstruction).combine(%resource.ofType(MedicationStatement).dosage)
).exists(text.exists() and timing.empty() and doseAndRate.empty())
)
implies
(
(%resource.ofType(MedicationRequest).dosageInstruction.combine(%resource.ofType(MedicationDispense).dosageInstruction).combine(%resource.ofType(MedicationStatement).dosage)
).count() = 1
)
|
| FreeTextSingleDosageOnlyWarning | warning | Dosage | If a dosage is given as pure free text, there should be exactly one Dosage element. |
(
(%resource.ofType(MedicationRequest).dosageInstruction.combine(%resource.ofType(MedicationDispense).dosageInstruction).combine(%resource.ofType(MedicationStatement).dosage)
).exists(text.exists() and timing.empty() and doseAndRate.empty())
)
implies
(
(%resource.ofType(MedicationRequest).dosageInstruction.combine(%resource.ofType(MedicationDispense).dosageInstruction).combine(%resource.ofType(MedicationStatement).dosage)
).count() = 1
)
|
| MaxDoseNotBelowDose | error | Dosage | maxDosePerPeriod.numerator.value must not be smaller than the single dose (doseQuantity.value or doseRange.high.value). |
maxDosePerPeriod.numerator.value.empty() or (
(doseAndRate.dose.ofType(Quantity).value.empty() or
doseAndRate.dose.ofType(Quantity).value <= maxDosePerPeriod.numerator.value) and
(doseAndRate.dose.ofType(Range).high.value.empty() or
doseAndRate.dose.ofType(Range).high.value <= maxDosePerPeriod.numerator.value)
)
|
| MaxDoseOnlyPureAsNeeded | error | Dosage | A maximum amount (maxDosePerPeriod) may only be given for a structured pure as-needed dosage: asNeededBoolean = true, doseAndRate present and no timing. A structured rhythm already determines how much is applied within the reference period. A free-text dosage is rendered verbatim, so a maximum amount next to it could never appear in the text. |
maxDosePerPeriod.exists() implies (asNeeded.ofType(boolean) = true and timing.empty() and doseAndRate.exists())
|
| MaxDosePerPeriodOnly24hOr1d | error | Dosage | maxDosePerPeriod is only allowed with a reference period of 24 hours (24 h) or 1 day (1 d). Other periods (e.g. at most 3 every 6 h) are not allowed. |
maxDosePerPeriod.empty() or (
(maxDosePerPeriod.denominator.value = 24 and maxDosePerPeriod.denominator.code = 'h') or
(maxDosePerPeriod.denominator.value = 1 and maxDosePerPeriod.denominator.code = 'd')
)
|
| MaxDoseSameUnitAsDose | error | Dosage | maxDosePerPeriod must use the same unit, code and system as doseQuantity. |
maxDosePerPeriod.empty() or (
(
doseAndRate.dose.ofType(Quantity).exists() and
doseAndRate.dose.ofType(Quantity).system = maxDosePerPeriod.numerator.system and
doseAndRate.dose.ofType(Quantity).code = maxDosePerPeriod.numerator.code and
doseAndRate.dose.ofType(Quantity).unit = maxDosePerPeriod.numerator.unit
) or (
doseAndRate.dose.ofType(Range).exists() and
(
doseAndRate.dose.ofType(Range).low.empty() or (
doseAndRate.dose.ofType(Range).low.system = maxDosePerPeriod.numerator.system and
doseAndRate.dose.ofType(Range).low.code = maxDosePerPeriod.numerator.code and
doseAndRate.dose.ofType(Range).low.unit = maxDosePerPeriod.numerator.unit
)
) and (
doseAndRate.dose.ofType(Range).high.empty() or (
doseAndRate.dose.ofType(Range).high.system = maxDosePerPeriod.numerator.system and
doseAndRate.dose.ofType(Range).high.code = maxDosePerPeriod.numerator.code and
doseAndRate.dose.ofType(Range).high.unit = maxDosePerPeriod.numerator.unit
)
)
)
)
|
| MinimumIntervalOnlyPureAsNeeded | error | Dosage | A minimum interval between two single administrations (Mindestabstand) may only be given for a structured pure as-needed dosage: asNeededBoolean = true, doseAndRate present and no timing. A structured rhythm already determines the spacing between administrations; a second, weaker lower bound next to it is contradictory. A free-text dosage is rendered verbatim, so a minimum interval next to it could never appear in the text. |
modifierExtension.where(url='http://ig.fhir.de/igs/medication/StructureDefinition/MinimumIntervalBetweenAdministrations').exists() implies (asNeeded.ofType(boolean) = true and timing.empty() and doseAndRate.exists())
|
| MinimumIntervalUnitMatchesCode | error | Dosage | The display unit of the minimum interval (valueDuration.unit) must match the UCUM code (e.g. 'Stunde(n)' only with code='h'). |
modifierExtension.where(
url='http://ig.fhir.de/igs/medication/StructureDefinition/MinimumIntervalBetweenAdministrations'
).value.ofType(Duration).all(
(
code = 'min'
implies
(unit = 'Minute(n)' or unit = 'Minute' or unit = 'Minuten')
) and (
code = 'h'
implies
(unit = 'Stunde(n)' or unit = 'Stunde' or unit = 'Stunden')
)
)
|
| PatientInstructionIdentical | error | Dosage | If patientInstruction is used in a resource with multiple dosages, the field must be populated identically in all Dosage elements. |
(
(
%resource.ofType(MedicationRequest).dosageInstruction.combine(%resource.ofType(MedicationDispense).dosageInstruction).combine(%resource.ofType(MedicationStatement).dosage)
).patientInstruction.distinct().count() <= 1
)
and
(
(
(
%resource.ofType(MedicationRequest).dosageInstruction.combine(%resource.ofType(MedicationDispense).dosageInstruction).combine(%resource.ofType(MedicationStatement).dosage)
).patientInstruction.exists()
)
implies
(
(
%resource.ofType(MedicationRequest).dosageInstruction.combine(%resource.ofType(MedicationDispense).dosageInstruction).combine(%resource.ofType(MedicationStatement).dosage)
).all(patientInstruction.exists())
)
)
|
| TimingOnlyOnePeriodForDayOfWeek | error | Dosage.timing | In a schema that combines dayOfWeek with either timeOfDay or when, each combination of weekday and time must be unique across all Dosage elements of a resource. |
( /* Detect DayOfWeek and Time/4-Schema */
%resource.ofType(MedicationRequest).dosageInstruction.combine(%resource.ofType(MedicationDispense).dosageInstruction).combine(%resource.ofType(MedicationStatement).dosage)
).all(
(
timing.repeat.dayOfWeek.exists() and
(
(timing.repeat.timeOfDay.exists() and timing.repeat.when.empty()) or
(timing.repeat.when.exists() and timing.repeat.timeOfDay.empty())
)
)
implies
(
(
(%resource.ofType(MedicationRequest).exists() or %resource.ofType(MedicationDispense).exists())
implies
(
/* For each day of week */
/* if Mon occurs multiple times */
((%resource.dosageInstruction.timing.repeat.dayOfWeek.where($this = 'mon').count() > 1) implies
(
(%resource.dosageInstruction.timing.repeat.where('mon' in dayOfWeek).when.distinct().count() = %resource.dosageInstruction.timing.repeat.where('mon' in dayOfWeek).when.count()) and
(%resource.dosageInstruction.timing.repeat.where('mon' in dayOfWeek).timeOfDay.distinct().count() = %resource.dosageInstruction.timing.repeat.where('mon' in dayOfWeek).timeOfDay.count())
)) and
/* if tue occurs multiple times */
((%resource.dosageInstruction.timing.repeat.dayOfWeek.where($this = 'tue').count() > 1) implies
(
(%resource.dosageInstruction.timing.repeat.where('tue' in dayOfWeek).when.distinct().count() = %resource.dosageInstruction.timing.repeat.where('tue' in dayOfWeek).when.count()) and
(%resource.dosageInstruction.timing.repeat.where('tue' in dayOfWeek).timeOfDay.distinct().count() = %resource.dosageInstruction.timing.repeat.where('tue' in dayOfWeek).timeOfDay.count())
)) and
/* if wed occurs multiple times */
((%resource.dosageInstruction.timing.repeat.dayOfWeek.where($this = 'wed').count() > 1) implies
(
(%resource.dosageInstruction.timing.repeat.where('wed' in dayOfWeek).when.distinct().count() = %resource.dosageInstruction.timing.repeat.where('wed' in dayOfWeek).when.count()) and
(%resource.dosageInstruction.timing.repeat.where('wed' in dayOfWeek).timeOfDay.distinct().count() = %resource.dosageInstruction.timing.repeat.where('wed' in dayOfWeek).timeOfDay.count())
)) and
/* if thu occurs multiple times */
((%resource.dosageInstruction.timing.repeat.dayOfWeek.where($this = 'thu').count() > 1) implies
(
(%resource.dosageInstruction.timing.repeat.where('thu' in dayOfWeek).when.distinct().count() = %resource.dosageInstruction.timing.repeat.where('thu' in dayOfWeek).when.count()) and
(%resource.dosageInstruction.timing.repeat.where('thu' in dayOfWeek).timeOfDay.distinct().count() = %resource.dosageInstruction.timing.repeat.where('thu' in dayOfWeek).timeOfDay.count())
)) and
/* if fri occurs multiple times */
((%resource.dosageInstruction.timing.repeat.dayOfWeek.where($this = 'fri').count() > 1) implies
(
(%resource.dosageInstruction.timing.repeat.where('fri' in dayOfWeek).when.distinct().count() = %resource.dosageInstruction.timing.repeat.where('fri' in dayOfWeek).when.count()) and
(%resource.dosageInstruction.timing.repeat.where('fri' in dayOfWeek).timeOfDay.distinct().count() = %resource.dosageInstruction.timing.repeat.where('fri' in dayOfWeek).timeOfDay.count())
)) and
/* if sat occurs multiple times */
((%resource.dosageInstruction.timing.repeat.dayOfWeek.where($this = 'sat').count() > 1) implies
(
(%resource.dosageInstruction.timing.repeat.where('sat' in dayOfWeek).when.distinct().count() = %resource.dosageInstruction.timing.repeat.where('sat' in dayOfWeek).when.count()) and
(%resource.dosageInstruction.timing.repeat.where('sat' in dayOfWeek).timeOfDay.distinct().count() = %resource.dosageInstruction.timing.repeat.where('sat' in dayOfWeek).timeOfDay.count())
)) and
/* if sun occurs multiple times */
((%resource.dosageInstruction.timing.repeat.dayOfWeek.where($this = 'sun').count() > 1) implies
(
(%resource.dosageInstruction.timing.repeat.where('sun' in dayOfWeek).when.distinct().count() = %resource.dosageInstruction.timing.repeat.where('sun' in dayOfWeek).when.count()) and
(%resource.dosageInstruction.timing.repeat.where('sun' in dayOfWeek).timeOfDay.distinct().count() = %resource.dosageInstruction.timing.repeat.where('sun' in dayOfWeek).timeOfDay.count())
))
)
)
and
(
%resource.ofType(MedicationStatement).exists()
implies
(
/* For each day of week */
/* if Mon occurs multiple times */
((%resource.dosage.timing.repeat.dayOfWeek.where($this = 'mon').count() > 1) implies
(
(%resource.dosage.timing.repeat.where('mon' in dayOfWeek).when.distinct().count() = %resource.dosage.timing.repeat.where('mon' in dayOfWeek).when.count()) and
(%resource.dosage.timing.repeat.where('mon' in dayOfWeek).timeOfDay.distinct().count() = %resource.dosage.timing.repeat.where('mon' in dayOfWeek).timeOfDay.count())
)) and
/* if tue occurs multiple times */
((%resource.dosage.timing.repeat.dayOfWeek.where($this = 'tue').count() > 1) implies
(
(%resource.dosage.timing.repeat.where('tue' in dayOfWeek).when.distinct().count() = %resource.dosage.timing.repeat.where('tue' in dayOfWeek).when.count()) and
(%resource.dosage.timing.repeat.where('tue' in dayOfWeek).timeOfDay.distinct().count() = %resource.dosage.timing.repeat.where('tue' in dayOfWeek).timeOfDay.count())
)) and
/* if wed occurs multiple times */
((%resource.dosage.timing.repeat.dayOfWeek.where($this = 'wed').count() > 1) implies
(
(%resource.dosage.timing.repeat.where('wed' in dayOfWeek).when.distinct().count() = %resource.dosage.timing.repeat.where('wed' in dayOfWeek).when.count()) and
(%resource.dosage.timing.repeat.where('wed' in dayOfWeek).timeOfDay.distinct().count() = %resource.dosage.timing.repeat.where('wed' in dayOfWeek).timeOfDay.count())
)) and
/* if thu occurs multiple times */
((%resource.dosage.timing.repeat.dayOfWeek.where($this = 'thu').count() > 1) implies
(
(%resource.dosage.timing.repeat.where('thu' in dayOfWeek).when.distinct().count() = %resource.dosage.timing.repeat.where('thu' in dayOfWeek).when.count()) and
(%resource.dosage.timing.repeat.where('thu' in dayOfWeek).timeOfDay.distinct().count() = %resource.dosage.timing.repeat.where('thu' in dayOfWeek).timeOfDay.count())
)) and
/* if fri occurs multiple times */
((%resource.dosage.timing.repeat.dayOfWeek.where($this = 'fri').count() > 1) implies
(
(%resource.dosage.timing.repeat.where('fri' in dayOfWeek).when.distinct().count() = %resource.dosage.timing.repeat.where('fri' in dayOfWeek).when.count()) and
(%resource.dosage.timing.repeat.where('fri' in dayOfWeek).timeOfDay.distinct().count() = %resource.dosage.timing.repeat.where('fri' in dayOfWeek).timeOfDay.count())
)) and
/* if sat occurs multiple times */
((%resource.dosage.timing.repeat.dayOfWeek.where($this = 'sat').count() > 1) implies
(
(%resource.dosage.timing.repeat.where('sat' in dayOfWeek).when.distinct().count() = %resource.dosage.timing.repeat.where('sat' in dayOfWeek).when.count()) and
(%resource.dosage.timing.repeat.where('sat' in dayOfWeek).timeOfDay.distinct().count() = %resource.dosage.timing.repeat.where('sat' in dayOfWeek).timeOfDay.count())
)) and
/* if sun occurs multiple times */
((%resource.dosage.timing.repeat.dayOfWeek.where($this = 'sun').count() > 1) implies
(
(%resource.dosage.timing.repeat.where('sun' in dayOfWeek).when.distinct().count() = %resource.dosage.timing.repeat.where('sun' in dayOfWeek).when.count()) and
(%resource.dosage.timing.repeat.where('sun' in dayOfWeek).timeOfDay.distinct().count() = %resource.dosage.timing.repeat.where('sun' in dayOfWeek).timeOfDay.count())
))
)
)
)
)
|
| dos-1 | error | Dosage | AsNeededFor can only be set if AsNeeded is empty or true |
extension.where(url='http://hl7.org/fhir/5.0/StructureDefinition/extension-Dosage.asNeededFor').empty() or asNeeded.empty() or asNeeded
|
| ele-1 | error | **ALL** elements | All FHIR elements must have a @value or children |
hasValue() or (children().count() > id.count())
|
| ext-1 | error | **ALL** extensions | Must have either extensions or value[x], not both |
extension.exists() != value.exists()
|
| sqty-1 | error | Dosage.doseAndRate.dose[x]:doseRange.low, Dosage.doseAndRate.dose[x]:doseRange.high | The comparator is not used on a SimpleQuantity |
comparator.empty()
|
This structure is derived from DosageDE
Key Elements View
| Name | Flags | Card. | Type | Description & Constraints Filter: ![]() |
|---|---|---|---|---|
![]() |
C | 0..* | DosageDE | How the medication is/was taken or should be taken Constraints: DosageStructuredOrFreeTextWarning, DosageStructuredRequiresBothWarning, DosageDoseUnitSameCodeWarning, DosageDoseValuePositiveWarning, DosageLimitsPositiveWarning, DosageFourSlotPatternInTextWarning, FreeTextSingleDosageOnlyWarning, AsNeededForRequiresAsNeededWarning, dos-1, DosageStructuredOrFreeText, DosageStructuredRequiresBoth, DosageRequiresGeneratedText, FreeTextSingleDosageOnly, FreeTextMatchesRenderedText, DosageDoseQuantityAllowedFractions, DosageDoseUnitSameCode, DosageDoseValueDecimalNotation, DosageDoseValuePositive, DosageLimitsPositive, DosageFourSlotPatternInText, PatientInstructionIdentical, MaxDoseSameUnitAsDose, MaxDoseNotBelowDose, MaxDosePerPeriodOnly24hOr1d, MaxDoseOnlyPureAsNeeded, DoseRangeHighRequiredWhenLowPresent, DoseRangeLowAndHighSameUnit, DoseRangeNoVarPeriod, MinimumIntervalOnlyPureAsNeeded, AsNeededForRequiresAsNeeded, AsNeededSingleDosageOnly, AsNeededIdentical, AsNeededForIdentical, MinimumIntervalUnitMatchesCode |
![]() ![]() |
Content/Rules for all slices | |||
![]() ![]() ![]() |
0..* | (Complex) | Dosage asNeededFor URL: http://hl7.org/fhir/5.0/StructureDefinition/extension-Dosage.asNeededFor | |
![]() ![]() ![]() ![]() |
0..0 | Extension Slice: Unordered, Open by value:url | ||
![]() ![]() ![]() ![]() |
1..1 | uri | "http://hl7.org/fhir/5.0/StructureDefinition/extension-Dosage.asNeededFor" | |
![]() ![]() ![]() ![]() |
0..1 | CodeableConcept | Value of extension Binding: SNOMEDCTMedicationAsNeededReasonCodes (example) | |
![]() ![]() ![]() ![]() ![]() |
1..1 | string | Plain text representation of the concept | |
![]() ![]() |
0..* | Extension | Extension Slice: Unordered, Open by value:url Slicing Note: The rules on this element (including its children) apply to all the slices, but are not repeated in them | |
![]() ![]() ![]() |
0..1 | (Complex) | Minimum Interval Between Administrations URL: http://ig.fhir.de/igs/medication/StructureDefinition/MinimumIntervalBetweenAdministrations | |
![]() ![]() ![]() ![]() |
0..0 | Extension Slice: Unordered, Open by value:url | ||
![]() ![]() ![]() ![]() |
1..1 | uri | "http://ig.fhir.de/igs/medication/StructureDefinition/MinimumIntervalBetweenAdministrations" | |
![]() ![]() ![]() ![]() |
1..1 | Duration | Mindestabstand zwischen zwei Gaben | |
![]() ![]() ![]() ![]() ![]() |
1..1 | decimal | Numerical value (with implicit precision) | |
![]() ![]() ![]() ![]() ![]() |
1..1 | string | Unit representation | |
![]() ![]() ![]() ![]() ![]() |
C | 1..1 | uri | System that defines coded unit form Fixed Value: http://unitsofmeasure.org (no extensions allowed) |
![]() ![]() ![]() ![]() ![]() |
1..1 | code | Coded form of the unit Binding: Mindestabstand UnitsOfTime dgMP ValueSet (required) | |
![]() ![]() |
0..1 | string | Freitext-Dosierungsanweisungen, z. B. 'Maximal 3x täglich 1 Stück bei Bedarf' | |
![]() ![]() |
0..1 | string | Ergänzende Anwendungshinweise für Patientinnen und Patienten | |
![]() ![]() |
C | 0..1 | TimingDgMP | Wann das Medikament verabreicht werden soll Constraints: TimingOnlyOnePeriodForDayOfWeek |
![]() ![]() |
0..1 | boolean | Bedarfsdosierung (nur Ja/Nein-Angabe) | |
![]() ![]() |
0..1 | Element | Menge des verabreichten Medikaments | |
![]() ![]() ![]() |
0..1 | Amount of medication per dose Slice: Unordered, Closed by type:$this Slicing Note: The rules on this element (including its children) apply to all the slices, but are not repeated in them | ||
![]() ![]() ![]() ![]() |
Range | |||
![]() ![]() ![]() ![]() |
Quantity(SimpleQuantity) | |||
![]() ![]() ![]() ![]() |
0..1 | SimpleQuantity |
Menge des Medikaments pro Dosis Binding: https://fhir.kbv.de/ValueSet/KBV_VS_SFHIR_BMP_DOSIEREINHEIT (required) | |
![]() ![]() ![]() ![]() ![]() |
1..1 | decimal | Numerical value (with implicit precision) | |
![]() ![]() ![]() ![]() ![]() |
1..1 | string | Unit representation | |
![]() ![]() ![]() ![]() ![]() |
C | 1..1 | uri | System that defines coded unit form |
![]() ![]() ![]() ![]() ![]() |
1..1 | code | Coded form of the unit | |
![]() ![]() ![]() ![]() |
0..1 | Range | Amount of medication per dose | |
![]() ![]() ![]() ![]() ![]() |
C | 0..1 | SimpleQuantity(4.0.1) | Low limit Binding: https://fhir.kbv.de/ValueSet/KBV_VS_SFHIR_BMP_DOSIEREINHEIT (required) Constraints: sqty-1 |
![]() ![]() ![]() ![]() ![]() ![]() |
1..1 | decimal | Numerical value (with implicit precision) | |
![]() ![]() ![]() ![]() ![]() ![]() |
1..1 | string | Unit representation | |
![]() ![]() ![]() ![]() ![]() ![]() |
C | 1..1 | uri | System that defines coded unit form |
![]() ![]() ![]() ![]() ![]() ![]() |
1..1 | code | Coded form of the unit | |
![]() ![]() ![]() ![]() ![]() |
C | 0..1 | SimpleQuantity(4.0.1) | High limit Binding: https://fhir.kbv.de/ValueSet/KBV_VS_SFHIR_BMP_DOSIEREINHEIT (required) Constraints: sqty-1 |
![]() ![]() ![]() ![]() ![]() ![]() |
1..1 | decimal | Numerical value (with implicit precision) | |
![]() ![]() ![]() ![]() ![]() ![]() |
1..1 | string | Unit representation | |
![]() ![]() ![]() ![]() ![]() ![]() |
C | 1..1 | uri | System that defines coded unit form |
![]() ![]() ![]() ![]() ![]() ![]() |
1..1 | code | Coded form of the unit | |
![]() ![]() |
0..1 | Ratio | Maximale Dosis pro Zeitraum | |
Documentation for this format | ||||
| Path | Status | Usage | ValueSet | Version | Source |
| Dosage.extension:asNeededFor.value[x] | Base | example | SNOMED CT Medication As Needed Reason Codes | 📦4.0.1 | FHIR Std. |
| Dosage.modifierExtension:minimumIntervalBetweenAdministrations.value[x].code | Base | required | Mindestabstand UnitsOfTime dgMP ValueSet | 📦2.0.0-ballot | This IG |
| Dosage.doseAndRate.dose[x]:doseQuantity | Base | required | https://fhir.kbv.de/ValueSet/KBV_VS_SFHIR_BMP_DOSIEREINHEIT | Not State | Unknown |
| Dosage.doseAndRate.dose[x]:doseRange.low | Base | required | https://fhir.kbv.de/ValueSet/KBV_VS_SFHIR_BMP_DOSIEREINHEIT | Not State | Unknown |
| Dosage.doseAndRate.dose[x]:doseRange.high | Base | required | https://fhir.kbv.de/ValueSet/KBV_VS_SFHIR_BMP_DOSIEREINHEIT | Not State | Unknown |
| Id | Grade | Path(s) | Description | Expression |
| AsNeededForIdentical | error | Dosage | The reason for use (asNeededFor) must be populated identically across all Dosage elements of a resource. Multiple reasons per element are allowed but must then match in every element. |
(
%resource.ofType(MedicationRequest).dosageInstruction.combine(%resource.ofType(MedicationDispense).dosageInstruction).combine(%resource.ofType(MedicationStatement).dosage)
).all(
extension.where(
url='http://hl7.org/fhir/5.0/StructureDefinition/extension-Dosage.asNeededFor'
).value.ofType(CodeableConcept).text.distinct().count()
=
(
%resource.ofType(MedicationRequest).dosageInstruction.combine(%resource.ofType(MedicationDispense).dosageInstruction).combine(%resource.ofType(MedicationStatement).dosage)
).extension.where(
url='http://hl7.org/fhir/5.0/StructureDefinition/extension-Dosage.asNeededFor'
).value.ofType(CodeableConcept).text.distinct().count()
)
|
| AsNeededForRequiresAsNeeded | error | Dosage | A reason for use (asNeededFor) may only be given for an as-needed dosage (asNeededBoolean = true). |
extension.where(url='http://hl7.org/fhir/5.0/StructureDefinition/extension-Dosage.asNeededFor').exists() implies asNeeded.ofType(boolean) = true
|
| AsNeededForRequiresAsNeededWarning | warning | Dosage | A reason for use (asNeededFor) should only be given together with asNeededBoolean = true. |
extension.where(url='http://hl7.org/fhir/5.0/StructureDefinition/extension-Dosage.asNeededFor').exists() implies asNeeded.ofType(boolean) = true
|
| AsNeededIdentical | error | Dosage | The as-needed flag (asNeededBoolean) must be populated identically across all Dosage elements of a resource. |
(
(
%resource.ofType(MedicationRequest).dosageInstruction.combine(%resource.ofType(MedicationDispense).dosageInstruction).combine(%resource.ofType(MedicationStatement).dosage)
).asNeeded.ofType(boolean).distinct().count() <= 1
)
and
(
(
(
%resource.ofType(MedicationRequest).dosageInstruction.combine(%resource.ofType(MedicationDispense).dosageInstruction).combine(%resource.ofType(MedicationStatement).dosage)
).asNeeded.ofType(boolean).exists()
)
implies
(
(
%resource.ofType(MedicationRequest).dosageInstruction.combine(%resource.ofType(MedicationDispense).dosageInstruction).combine(%resource.ofType(MedicationStatement).dosage)
).all(asNeeded.ofType(boolean).exists())
)
)
|
| AsNeededSingleDosageOnly | error | Dosage | If an as-needed dosage with asNeededBoolean = true is given without timing, exactly one Dosage element must exist in the resource. |
(
%resource.ofType(MedicationRequest).dosageInstruction.combine(%resource.ofType(MedicationDispense).dosageInstruction).combine(%resource.ofType(MedicationStatement).dosage)
).where(
asNeeded.ofType(boolean) = true and timing.empty()
).exists()
implies
(
%resource.ofType(MedicationRequest).dosageInstruction.combine(%resource.ofType(MedicationDispense).dosageInstruction).combine(%resource.ofType(MedicationStatement).dosage)
).count() = 1
|
| DosageDoseQuantityAllowedFractions | error | Dosage | Dose values in doseQuantity or doseRange must be whole numbers or use one of the following fractional parts: .25, .33, .5, .66 or .75. |
doseAndRate.all(
(
dose.ofType(Quantity).value.empty() or
dose.ofType(Quantity).value.all(
($this mod 1 = 0) or
($this mod 1 = 0.25) or
($this mod 1 = 0.33) or
($this mod 1 = 0.5) or
($this mod 1 = 0.66) or
($this mod 1 = 0.75)
)
)
and
(
dose.ofType(Range).low.value.empty() or
dose.ofType(Range).low.value.all(
($this mod 1 = 0) or
($this mod 1 = 0.25) or
($this mod 1 = 0.33) or
($this mod 1 = 0.5) or
($this mod 1 = 0.66) or
($this mod 1 = 0.75)
)
)
and
(
dose.ofType(Range).high.value.empty() or
dose.ofType(Range).high.value.all(
($this mod 1 = 0) or
($this mod 1 = 0.25) or
($this mod 1 = 0.33) or
($this mod 1 = 0.5) or
($this mod 1 = 0.66) or
($this mod 1 = 0.75)
)
)
)
|
| DosageDoseUnitSameCode | error | Dosage | The dose unit must be the same across all dosages. |
(%resource.ofType(MedicationRequest).dosageInstruction.combine(%resource.ofType(MedicationDispense).dosageInstruction).combine(%resource.ofType(MedicationStatement).dosage)).all(
doseAndRate.exists() implies
(
(%resource.ofType(MedicationRequest).dosageInstruction.combine(%resource.ofType(MedicationDispense).dosageInstruction).combine(%resource.ofType(MedicationStatement).dosage)).doseAndRate.dose.ofType(Quantity).code |
(%resource.ofType(MedicationRequest).dosageInstruction.combine(%resource.ofType(MedicationDispense).dosageInstruction).combine(%resource.ofType(MedicationStatement).dosage)).doseAndRate.dose.ofType(Range).low.code |
(%resource.ofType(MedicationRequest).dosageInstruction.combine(%resource.ofType(MedicationDispense).dosageInstruction).combine(%resource.ofType(MedicationStatement).dosage)).doseAndRate.dose.ofType(Range).high.code
).distinct().count() = 1
)
|
| DosageDoseUnitSameCodeWarning | warning | Dosage | The dose unit should be the same across all dosages. |
(%resource.ofType(MedicationRequest).dosageInstruction.combine(%resource.ofType(MedicationDispense).dosageInstruction).combine(%resource.ofType(MedicationStatement).dosage)).all(
doseAndRate.exists() implies
(
(%resource.ofType(MedicationRequest).dosageInstruction.combine(%resource.ofType(MedicationDispense).dosageInstruction).combine(%resource.ofType(MedicationStatement).dosage)).doseAndRate.dose.ofType(Quantity).code |
(%resource.ofType(MedicationRequest).dosageInstruction.combine(%resource.ofType(MedicationDispense).dosageInstruction).combine(%resource.ofType(MedicationStatement).dosage)).doseAndRate.dose.ofType(Range).low.code |
(%resource.ofType(MedicationRequest).dosageInstruction.combine(%resource.ofType(MedicationDispense).dosageInstruction).combine(%resource.ofType(MedicationStatement).dosage)).doseAndRate.dose.ofType(Range).high.code
).distinct().count() = 1
)
|
| DosageDoseValueDecimalNotation | error | Dosage | Dose values in doseQuantity or doseRange must use plain decimal notation with at most two decimal places. Exponential notation (e.g. 50e-2 instead of 0.5) is not allowed. |
doseAndRate.all(
(
dose.ofType(Quantity).value.empty() or
dose.ofType(Quantity).value.toString().matches('^[0-9]+([.][0-9]{1,2})?$')
)
and
(
dose.ofType(Range).low.value.empty() or
dose.ofType(Range).low.value.toString().matches('^[0-9]+([.][0-9]{1,2})?$')
)
and
(
dose.ofType(Range).high.value.empty() or
dose.ofType(Range).high.value.toString().matches('^[0-9]+([.][0-9]{1,2})?$')
)
)
|
| DosageDoseValuePositive | error | Dosage | doseQuantity.value and doseRange.high.value must be greater than 0. The value 0 is additionally allowed for doseRange.low.value only. |
doseAndRate.all(
dose.ofType(Quantity).value.all($this > 0) and
dose.ofType(Range).low.value.all($this >= 0) and
dose.ofType(Range).high.value.all($this > 0)
)
|
| DosageDoseValuePositiveWarning | warning | Dosage | doseQuantity.value and doseRange.high.value should be greater than 0. The value 0 is additionally allowed for doseRange.low.value only. |
doseAndRate.all(
dose.ofType(Quantity).value.all($this > 0) and
dose.ofType(Range).low.value.all($this >= 0) and
dose.ofType(Range).high.value.all($this > 0)
)
|
| DosageFourSlotPatternInText | error | Dosage | A bare four-slot dosing schema (Viererschema, e.g. 1-0-1-0 or 1-0-1-0 Stück) must not be given as free text in Dosage.text; it has to be represented structurally. A schema embedded in further text, including the generated form 'täglich: 1-0-1-0 Stück', only triggers the warning DosageFourSlotPatternInTextWarning. |
text.exists() implies text.matches('^\\s*\\d+([.,]\\d+)?(\\s*/\\s*\\d+)?(\\s*[-–]\\s*\\d+([.,]\\d+)?(\\s*/\\s*\\d+)?){3}(\\s*[A-Za-zÄÖÜäöüß().]+)?\\s*$').not()
|
| DosageFourSlotPatternInTextWarning | warning | Dosage | A four-slot dosing schema (Viererschema, e.g. 1-1-1-1) was detected in Dosage.text. Please check whether it can be represented structurally. |
text.exists() implies text.matches('.*\\d+\\s*[-–]\\s*\\d+\\s*[-–]\\s*\\d+\\s*[-–]\\s*\\d+.*').not()
|
| DosageLimitsPositive | error | Dosage | The minimum interval between administrations (valueDuration.value) and maxDosePerPeriod (numerator.value, denominator.value) must be greater than 0. |
modifierExtension.where(
url = 'http://ig.fhir.de/igs/medication/StructureDefinition/MinimumIntervalBetweenAdministrations'
).value.ofType(Duration).value.all($this > 0) and
maxDosePerPeriod.numerator.value.all($this > 0) and
maxDosePerPeriod.denominator.value.all($this > 0)
|
| DosageLimitsPositiveWarning | warning | Dosage | The minimum interval between administrations (valueDuration.value) and maxDosePerPeriod (numerator.value, denominator.value) should be greater than 0. |
modifierExtension.where(
url = 'http://ig.fhir.de/igs/medication/StructureDefinition/MinimumIntervalBetweenAdministrations'
).value.ofType(Duration).value.all($this > 0) and
maxDosePerPeriod.numerator.value.all($this > 0) and
maxDosePerPeriod.denominator.value.all($this > 0)
|
| DosageRequiresGeneratedText | error | Dosage | Regardless of the kind of dosage (structured or free text), the GeneratedDosageInstructionsMeta and renderedDosageInstruction extensions must be present. |
%resource.extension.where(
url = 'http://ig.fhir.de/igs/medication/StructureDefinition/GeneratedDosageInstructionsMeta'
).exists() and
(
%resource.extension.where(
url = 'http://hl7.org/fhir/5.0/StructureDefinition/extension-MedicationRequest.renderedDosageInstruction'
).exists() or
%resource.extension.where(
url = 'http://hl7.org/fhir/5.0/StructureDefinition/extension-MedicationDispense.renderedDosageInstruction'
).exists() or
%resource.extension.where(
url = 'http://hl7.org/fhir/5.0/StructureDefinition/extension-MedicationStatement.renderedDosageInstruction'
).exists()
)
|
| DosageStructuredOrFreeText | error | Dosage | A dosage must be given either as free text only or as complete structured information only; mixing both is not allowed. |
(%resource.ofType(MedicationRequest).dosageInstruction.combine(%resource.ofType(MedicationDispense).dosageInstruction).combine(%resource.ofType(MedicationStatement).dosage)).all(
(text.exists() and timing.empty() and doseAndRate.empty()) or
(text.empty() and (timing.exists() or doseAndRate.exists()))
)
|
| DosageStructuredOrFreeTextWarning | warning | Dosage | A dosage must be given either as free text only or as complete structured information only; mixing both is not allowed. |
(%resource.ofType(MedicationRequest).dosageInstruction.combine(%resource.ofType(MedicationDispense).dosageInstruction).combine(%resource.ofType(MedicationStatement).dosage)).all(
(text.exists() and timing.empty() and doseAndRate.empty()) or
(text.empty() and (timing.exists() or doseAndRate.exists()))
)
|
| DosageStructuredRequiresBoth | error | Dosage | If a structured dosage is given, both timing and doseAndRate must be present. For pure as-needed dosages, doseAndRate may be given without timing. |
(%resource.ofType(MedicationRequest).dosageInstruction.combine(%resource.ofType(MedicationDispense).dosageInstruction).combine(%resource.ofType(MedicationStatement).dosage)).all(
(timing.exists() implies doseAndRate.exists()) and
(doseAndRate.exists() implies (
timing.exists() or
asNeeded.ofType(boolean) = true or
extension.where(url='http://hl7.org/fhir/5.0/StructureDefinition/extension-Dosage.asNeededFor').exists()
))
)
|
| DosageStructuredRequiresBothWarning | warning | Dosage | If a structured dosage is given, both timing and doseAndRate should be present. For pure as-needed dosages, doseAndRate may be given without timing. |
(%resource.ofType(MedicationRequest).dosageInstruction.combine(%resource.ofType(MedicationDispense).dosageInstruction).combine(%resource.ofType(MedicationStatement).dosage)).all(
(timing.exists() implies doseAndRate.exists()) and
(doseAndRate.exists() implies (
timing.exists() or
asNeeded.ofType(boolean) = true or
extension.where(url='http://hl7.org/fhir/5.0/StructureDefinition/extension-Dosage.asNeededFor').exists()
))
)
|
| DoseRangeHighRequiredWhenLowPresent | error | Dosage | If a lower bound is given for doseRange, an upper bound must be given as well. |
doseAndRate.dose.ofType(Range).low.empty() or doseAndRate.dose.ofType(Range).high.exists()
|
| DoseRangeLowAndHighSameUnit | error | Dosage | The lower and upper bound of a variable single dose must use the same unit of measure. |
doseAndRate.dose.ofType(Range).low.empty()
or doseAndRate.dose.ofType(Range).high.empty()
or (
doseAndRate.dose.ofType(Range).low.system = doseAndRate.dose.ofType(Range).high.system
and doseAndRate.dose.ofType(Range).low.code = doseAndRate.dose.ofType(Range).high.code
and doseAndRate.dose.ofType(Range).low.unit = doseAndRate.dose.ofType(Range).high.unit
)
|
| DoseRangeNoVarPeriod | warning | Dosage | A variable single dose and a variable period should not be used together. |
doseAndRate.dose.ofType(Range).empty() or timing.repeat.periodMax.empty()
|
| FreeTextMatchesRenderedText | error | Dosage | If a dosage is given as pure free text (text present, timing and doseAndRate empty), the value in dosageInstruction.text must match the value in the renderedDosageInstruction extension. |
(
(%resource.ofType(MedicationRequest).dosageInstruction.combine(%resource.ofType(MedicationDispense).dosageInstruction).combine(%resource.ofType(MedicationStatement).dosage)
).where(text.exists() and timing.empty() and doseAndRate.empty()).exists()
)
implies
(
(
%resource.ofType(MedicationRequest).exists() and
%resource.extension.where(
url = 'http://hl7.org/fhir/5.0/StructureDefinition/extension-MedicationRequest.renderedDosageInstruction'
).value = %resource.dosageInstruction.text
) or
(
%resource.ofType(MedicationDispense).exists() and
%resource.extension.where(
url = 'http://hl7.org/fhir/5.0/StructureDefinition/extension-MedicationDispense.renderedDosageInstruction'
).value = %resource.dosageInstruction.text
) or
(
%resource.ofType(MedicationStatement).exists() and
%resource.extension.where(
url = 'http://hl7.org/fhir/5.0/StructureDefinition/extension-MedicationStatement.renderedDosageInstruction'
).value = %resource.dosage.text
)
)
|
| FreeTextSingleDosageOnly | error | Dosage | If a dosage is given as pure free text, there must be exactly one Dosage element. |
(
(%resource.ofType(MedicationRequest).dosageInstruction.combine(%resource.ofType(MedicationDispense).dosageInstruction).combine(%resource.ofType(MedicationStatement).dosage)
).exists(text.exists() and timing.empty() and doseAndRate.empty())
)
implies
(
(%resource.ofType(MedicationRequest).dosageInstruction.combine(%resource.ofType(MedicationDispense).dosageInstruction).combine(%resource.ofType(MedicationStatement).dosage)
).count() = 1
)
|
| FreeTextSingleDosageOnlyWarning | warning | Dosage | If a dosage is given as pure free text, there should be exactly one Dosage element. |
(
(%resource.ofType(MedicationRequest).dosageInstruction.combine(%resource.ofType(MedicationDispense).dosageInstruction).combine(%resource.ofType(MedicationStatement).dosage)
).exists(text.exists() and timing.empty() and doseAndRate.empty())
)
implies
(
(%resource.ofType(MedicationRequest).dosageInstruction.combine(%resource.ofType(MedicationDispense).dosageInstruction).combine(%resource.ofType(MedicationStatement).dosage)
).count() = 1
)
|
| MaxDoseNotBelowDose | error | Dosage | maxDosePerPeriod.numerator.value must not be smaller than the single dose (doseQuantity.value or doseRange.high.value). |
maxDosePerPeriod.numerator.value.empty() or (
(doseAndRate.dose.ofType(Quantity).value.empty() or
doseAndRate.dose.ofType(Quantity).value <= maxDosePerPeriod.numerator.value) and
(doseAndRate.dose.ofType(Range).high.value.empty() or
doseAndRate.dose.ofType(Range).high.value <= maxDosePerPeriod.numerator.value)
)
|
| MaxDoseOnlyPureAsNeeded | error | Dosage | A maximum amount (maxDosePerPeriod) may only be given for a structured pure as-needed dosage: asNeededBoolean = true, doseAndRate present and no timing. A structured rhythm already determines how much is applied within the reference period. A free-text dosage is rendered verbatim, so a maximum amount next to it could never appear in the text. |
maxDosePerPeriod.exists() implies (asNeeded.ofType(boolean) = true and timing.empty() and doseAndRate.exists())
|
| MaxDosePerPeriodOnly24hOr1d | error | Dosage | maxDosePerPeriod is only allowed with a reference period of 24 hours (24 h) or 1 day (1 d). Other periods (e.g. at most 3 every 6 h) are not allowed. |
maxDosePerPeriod.empty() or (
(maxDosePerPeriod.denominator.value = 24 and maxDosePerPeriod.denominator.code = 'h') or
(maxDosePerPeriod.denominator.value = 1 and maxDosePerPeriod.denominator.code = 'd')
)
|
| MaxDoseSameUnitAsDose | error | Dosage | maxDosePerPeriod must use the same unit, code and system as doseQuantity. |
maxDosePerPeriod.empty() or (
(
doseAndRate.dose.ofType(Quantity).exists() and
doseAndRate.dose.ofType(Quantity).system = maxDosePerPeriod.numerator.system and
doseAndRate.dose.ofType(Quantity).code = maxDosePerPeriod.numerator.code and
doseAndRate.dose.ofType(Quantity).unit = maxDosePerPeriod.numerator.unit
) or (
doseAndRate.dose.ofType(Range).exists() and
(
doseAndRate.dose.ofType(Range).low.empty() or (
doseAndRate.dose.ofType(Range).low.system = maxDosePerPeriod.numerator.system and
doseAndRate.dose.ofType(Range).low.code = maxDosePerPeriod.numerator.code and
doseAndRate.dose.ofType(Range).low.unit = maxDosePerPeriod.numerator.unit
)
) and (
doseAndRate.dose.ofType(Range).high.empty() or (
doseAndRate.dose.ofType(Range).high.system = maxDosePerPeriod.numerator.system and
doseAndRate.dose.ofType(Range).high.code = maxDosePerPeriod.numerator.code and
doseAndRate.dose.ofType(Range).high.unit = maxDosePerPeriod.numerator.unit
)
)
)
)
|
| MinimumIntervalOnlyPureAsNeeded | error | Dosage | A minimum interval between two single administrations (Mindestabstand) may only be given for a structured pure as-needed dosage: asNeededBoolean = true, doseAndRate present and no timing. A structured rhythm already determines the spacing between administrations; a second, weaker lower bound next to it is contradictory. A free-text dosage is rendered verbatim, so a minimum interval next to it could never appear in the text. |
modifierExtension.where(url='http://ig.fhir.de/igs/medication/StructureDefinition/MinimumIntervalBetweenAdministrations').exists() implies (asNeeded.ofType(boolean) = true and timing.empty() and doseAndRate.exists())
|
| MinimumIntervalUnitMatchesCode | error | Dosage | The display unit of the minimum interval (valueDuration.unit) must match the UCUM code (e.g. 'Stunde(n)' only with code='h'). |
modifierExtension.where(
url='http://ig.fhir.de/igs/medication/StructureDefinition/MinimumIntervalBetweenAdministrations'
).value.ofType(Duration).all(
(
code = 'min'
implies
(unit = 'Minute(n)' or unit = 'Minute' or unit = 'Minuten')
) and (
code = 'h'
implies
(unit = 'Stunde(n)' or unit = 'Stunde' or unit = 'Stunden')
)
)
|
| PatientInstructionIdentical | error | Dosage | If patientInstruction is used in a resource with multiple dosages, the field must be populated identically in all Dosage elements. |
(
(
%resource.ofType(MedicationRequest).dosageInstruction.combine(%resource.ofType(MedicationDispense).dosageInstruction).combine(%resource.ofType(MedicationStatement).dosage)
).patientInstruction.distinct().count() <= 1
)
and
(
(
(
%resource.ofType(MedicationRequest).dosageInstruction.combine(%resource.ofType(MedicationDispense).dosageInstruction).combine(%resource.ofType(MedicationStatement).dosage)
).patientInstruction.exists()
)
implies
(
(
%resource.ofType(MedicationRequest).dosageInstruction.combine(%resource.ofType(MedicationDispense).dosageInstruction).combine(%resource.ofType(MedicationStatement).dosage)
).all(patientInstruction.exists())
)
)
|
| TimingOnlyOnePeriodForDayOfWeek | error | Dosage.timing | In a schema that combines dayOfWeek with either timeOfDay or when, each combination of weekday and time must be unique across all Dosage elements of a resource. |
( /* Detect DayOfWeek and Time/4-Schema */
%resource.ofType(MedicationRequest).dosageInstruction.combine(%resource.ofType(MedicationDispense).dosageInstruction).combine(%resource.ofType(MedicationStatement).dosage)
).all(
(
timing.repeat.dayOfWeek.exists() and
(
(timing.repeat.timeOfDay.exists() and timing.repeat.when.empty()) or
(timing.repeat.when.exists() and timing.repeat.timeOfDay.empty())
)
)
implies
(
(
(%resource.ofType(MedicationRequest).exists() or %resource.ofType(MedicationDispense).exists())
implies
(
/* For each day of week */
/* if Mon occurs multiple times */
((%resource.dosageInstruction.timing.repeat.dayOfWeek.where($this = 'mon').count() > 1) implies
(
(%resource.dosageInstruction.timing.repeat.where('mon' in dayOfWeek).when.distinct().count() = %resource.dosageInstruction.timing.repeat.where('mon' in dayOfWeek).when.count()) and
(%resource.dosageInstruction.timing.repeat.where('mon' in dayOfWeek).timeOfDay.distinct().count() = %resource.dosageInstruction.timing.repeat.where('mon' in dayOfWeek).timeOfDay.count())
)) and
/* if tue occurs multiple times */
((%resource.dosageInstruction.timing.repeat.dayOfWeek.where($this = 'tue').count() > 1) implies
(
(%resource.dosageInstruction.timing.repeat.where('tue' in dayOfWeek).when.distinct().count() = %resource.dosageInstruction.timing.repeat.where('tue' in dayOfWeek).when.count()) and
(%resource.dosageInstruction.timing.repeat.where('tue' in dayOfWeek).timeOfDay.distinct().count() = %resource.dosageInstruction.timing.repeat.where('tue' in dayOfWeek).timeOfDay.count())
)) and
/* if wed occurs multiple times */
((%resource.dosageInstruction.timing.repeat.dayOfWeek.where($this = 'wed').count() > 1) implies
(
(%resource.dosageInstruction.timing.repeat.where('wed' in dayOfWeek).when.distinct().count() = %resource.dosageInstruction.timing.repeat.where('wed' in dayOfWeek).when.count()) and
(%resource.dosageInstruction.timing.repeat.where('wed' in dayOfWeek).timeOfDay.distinct().count() = %resource.dosageInstruction.timing.repeat.where('wed' in dayOfWeek).timeOfDay.count())
)) and
/* if thu occurs multiple times */
((%resource.dosageInstruction.timing.repeat.dayOfWeek.where($this = 'thu').count() > 1) implies
(
(%resource.dosageInstruction.timing.repeat.where('thu' in dayOfWeek).when.distinct().count() = %resource.dosageInstruction.timing.repeat.where('thu' in dayOfWeek).when.count()) and
(%resource.dosageInstruction.timing.repeat.where('thu' in dayOfWeek).timeOfDay.distinct().count() = %resource.dosageInstruction.timing.repeat.where('thu' in dayOfWeek).timeOfDay.count())
)) and
/* if fri occurs multiple times */
((%resource.dosageInstruction.timing.repeat.dayOfWeek.where($this = 'fri').count() > 1) implies
(
(%resource.dosageInstruction.timing.repeat.where('fri' in dayOfWeek).when.distinct().count() = %resource.dosageInstruction.timing.repeat.where('fri' in dayOfWeek).when.count()) and
(%resource.dosageInstruction.timing.repeat.where('fri' in dayOfWeek).timeOfDay.distinct().count() = %resource.dosageInstruction.timing.repeat.where('fri' in dayOfWeek).timeOfDay.count())
)) and
/* if sat occurs multiple times */
((%resource.dosageInstruction.timing.repeat.dayOfWeek.where($this = 'sat').count() > 1) implies
(
(%resource.dosageInstruction.timing.repeat.where('sat' in dayOfWeek).when.distinct().count() = %resource.dosageInstruction.timing.repeat.where('sat' in dayOfWeek).when.count()) and
(%resource.dosageInstruction.timing.repeat.where('sat' in dayOfWeek).timeOfDay.distinct().count() = %resource.dosageInstruction.timing.repeat.where('sat' in dayOfWeek).timeOfDay.count())
)) and
/* if sun occurs multiple times */
((%resource.dosageInstruction.timing.repeat.dayOfWeek.where($this = 'sun').count() > 1) implies
(
(%resource.dosageInstruction.timing.repeat.where('sun' in dayOfWeek).when.distinct().count() = %resource.dosageInstruction.timing.repeat.where('sun' in dayOfWeek).when.count()) and
(%resource.dosageInstruction.timing.repeat.where('sun' in dayOfWeek).timeOfDay.distinct().count() = %resource.dosageInstruction.timing.repeat.where('sun' in dayOfWeek).timeOfDay.count())
))
)
)
and
(
%resource.ofType(MedicationStatement).exists()
implies
(
/* For each day of week */
/* if Mon occurs multiple times */
((%resource.dosage.timing.repeat.dayOfWeek.where($this = 'mon').count() > 1) implies
(
(%resource.dosage.timing.repeat.where('mon' in dayOfWeek).when.distinct().count() = %resource.dosage.timing.repeat.where('mon' in dayOfWeek).when.count()) and
(%resource.dosage.timing.repeat.where('mon' in dayOfWeek).timeOfDay.distinct().count() = %resource.dosage.timing.repeat.where('mon' in dayOfWeek).timeOfDay.count())
)) and
/* if tue occurs multiple times */
((%resource.dosage.timing.repeat.dayOfWeek.where($this = 'tue').count() > 1) implies
(
(%resource.dosage.timing.repeat.where('tue' in dayOfWeek).when.distinct().count() = %resource.dosage.timing.repeat.where('tue' in dayOfWeek).when.count()) and
(%resource.dosage.timing.repeat.where('tue' in dayOfWeek).timeOfDay.distinct().count() = %resource.dosage.timing.repeat.where('tue' in dayOfWeek).timeOfDay.count())
)) and
/* if wed occurs multiple times */
((%resource.dosage.timing.repeat.dayOfWeek.where($this = 'wed').count() > 1) implies
(
(%resource.dosage.timing.repeat.where('wed' in dayOfWeek).when.distinct().count() = %resource.dosage.timing.repeat.where('wed' in dayOfWeek).when.count()) and
(%resource.dosage.timing.repeat.where('wed' in dayOfWeek).timeOfDay.distinct().count() = %resource.dosage.timing.repeat.where('wed' in dayOfWeek).timeOfDay.count())
)) and
/* if thu occurs multiple times */
((%resource.dosage.timing.repeat.dayOfWeek.where($this = 'thu').count() > 1) implies
(
(%resource.dosage.timing.repeat.where('thu' in dayOfWeek).when.distinct().count() = %resource.dosage.timing.repeat.where('thu' in dayOfWeek).when.count()) and
(%resource.dosage.timing.repeat.where('thu' in dayOfWeek).timeOfDay.distinct().count() = %resource.dosage.timing.repeat.where('thu' in dayOfWeek).timeOfDay.count())
)) and
/* if fri occurs multiple times */
((%resource.dosage.timing.repeat.dayOfWeek.where($this = 'fri').count() > 1) implies
(
(%resource.dosage.timing.repeat.where('fri' in dayOfWeek).when.distinct().count() = %resource.dosage.timing.repeat.where('fri' in dayOfWeek).when.count()) and
(%resource.dosage.timing.repeat.where('fri' in dayOfWeek).timeOfDay.distinct().count() = %resource.dosage.timing.repeat.where('fri' in dayOfWeek).timeOfDay.count())
)) and
/* if sat occurs multiple times */
((%resource.dosage.timing.repeat.dayOfWeek.where($this = 'sat').count() > 1) implies
(
(%resource.dosage.timing.repeat.where('sat' in dayOfWeek).when.distinct().count() = %resource.dosage.timing.repeat.where('sat' in dayOfWeek).when.count()) and
(%resource.dosage.timing.repeat.where('sat' in dayOfWeek).timeOfDay.distinct().count() = %resource.dosage.timing.repeat.where('sat' in dayOfWeek).timeOfDay.count())
)) and
/* if sun occurs multiple times */
((%resource.dosage.timing.repeat.dayOfWeek.where($this = 'sun').count() > 1) implies
(
(%resource.dosage.timing.repeat.where('sun' in dayOfWeek).when.distinct().count() = %resource.dosage.timing.repeat.where('sun' in dayOfWeek).when.count()) and
(%resource.dosage.timing.repeat.where('sun' in dayOfWeek).timeOfDay.distinct().count() = %resource.dosage.timing.repeat.where('sun' in dayOfWeek).timeOfDay.count())
))
)
)
)
)
|
| dos-1 | error | Dosage | AsNeededFor can only be set if AsNeeded is empty or true |
extension.where(url='http://hl7.org/fhir/5.0/StructureDefinition/extension-Dosage.asNeededFor').empty() or asNeeded.empty() or asNeeded
|
| ele-1 | error | **ALL** elements | All FHIR elements must have a @value or children |
hasValue() or (children().count() > id.count())
|
| ext-1 | error | **ALL** extensions | Must have either extensions or value[x], not both |
extension.exists() != value.exists()
|
| sqty-1 | error | Dosage.doseAndRate.dose[x]:doseRange.low, Dosage.doseAndRate.dose[x]:doseRange.high | The comparator is not used on a SimpleQuantity |
comparator.empty()
|
Differential View
This structure is derived from DosageDE
| Name | Flags | Card. | Type | Description & Constraints Filter: ![]() |
|---|---|---|---|---|
![]() |
C | 0..* | DosageDE | How the medication is/was taken or should be taken Constraints: DosageStructuredOrFreeText, DosageStructuredRequiresBoth, DosageRequiresGeneratedText, FreeTextSingleDosageOnly, FreeTextMatchesRenderedText, DosageDoseQuantityAllowedFractions, DosageDoseUnitSameCode, DosageDoseValueDecimalNotation, DosageDoseValuePositive, DosageLimitsPositive, DosageFourSlotPatternInText, PatientInstructionIdentical, MaxDoseSameUnitAsDose, MaxDoseNotBelowDose, MaxDosePerPeriodOnly24hOr1d, MaxDoseOnlyPureAsNeeded, DoseRangeHighRequiredWhenLowPresent, DoseRangeLowAndHighSameUnit, DoseRangeNoVarPeriod, MinimumIntervalOnlyPureAsNeeded, AsNeededForRequiresAsNeeded, AsNeededSingleDosageOnly, AsNeededIdentical, AsNeededForIdentical, MinimumIntervalUnitMatchesCode |
![]() ![]() |
Content/Rules for all slices | |||
![]() ![]() ![]() |
0..* | R5 Dosage.asNeededFor | Dosage asNeededFor | |
![]() ![]() ![]() ![]() |
||||
![]() ![]() ![]() ![]() ![]() |
0..0 | Code defined by a terminology system | ||
![]() ![]() ![]() ![]() ![]() |
1..1 | string | Plain text representation of the concept | |
![]() ![]() |
Content/Rules for all slices | |||
![]() ![]() ![]() |
0..1 | MinimumIntervalBetweenAdministrationsEx | Minimum Interval Between Administrations | |
![]() ![]() ![]() ![]() |
||||
![]() ![]() ![]() ![]() ![]() |
1..1 | decimal | Numerical value (with implicit precision) | |
![]() ![]() ![]() ![]() ![]() |
0..0 | < | <= | >= | > - how to understand the value | ||
![]() ![]() ![]() ![]() ![]() |
1..1 | string | Unit representation | |
![]() ![]() ![]() ![]() ![]() |
1..1 | uri | System that defines coded unit form Fixed Value: http://unitsofmeasure.org (no extensions allowed) | |
![]() ![]() ![]() ![]() ![]() |
1..1 | code | Coded form of the unit Binding: Mindestabstand UnitsOfTime dgMP ValueSet (required) | |
![]() ![]() |
0..0 | The order of the dosage instructions | ||
![]() ![]() |
0..0 | Supplemental instruction or warnings to the patient - e.g. "with meals", "may cause drowsiness" | ||
![]() ![]() |
0..1 | string | Ergänzende Anwendungshinweise für Patientinnen und Patienten | |
![]() ![]() |
0..1 | TimingDgMP | Wann das Medikament verabreicht werden soll | |
![]() ![]() |
0..1 | boolean | Bedarfsdosierung (nur Ja/Nein-Angabe) | |
![]() ![]() |
0..0 | Body site to administer to | ||
![]() ![]() |
0..0 | How drug should enter body | ||
![]() ![]() |
0..0 | Technique for administering medication | ||
![]() ![]() |
0..1 | Element | Menge des verabreichten Medikaments | |
![]() ![]() ![]() |
0..0 | The kind of dose or rate specified | ||
![]() ![]() ![]() |
Content/Rules for all slices | |||
![]() ![]() ![]() ![]() |
0..1 | SimpleQuantity | Menge des Medikaments pro Dosis Binding: https://fhir.kbv.de/ValueSet/KBV_VS_SFHIR_BMP_DOSIEREINHEIT (required) | |
![]() ![]() ![]() ![]() ![]() |
1..1 | decimal | Numerical value (with implicit precision) | |
![]() ![]() ![]() ![]() ![]() |
1..1 | string | Unit representation | |
![]() ![]() ![]() ![]() ![]() |
1..1 | uri | System that defines coded unit form | |
![]() ![]() ![]() ![]() ![]() |
1..1 | code | Coded form of the unit | |
![]() ![]() ![]() ![]() |
0..1 | Range | Amount of medication per dose | |
![]() ![]() ![]() ![]() ![]() |
0..1 | SimpleQuantity(4.0.1) | Low limit Binding: https://fhir.kbv.de/ValueSet/KBV_VS_SFHIR_BMP_DOSIEREINHEIT (required) | |
![]() ![]() ![]() ![]() ![]() ![]() |
1..1 | decimal | Numerical value (with implicit precision) | |
![]() ![]() ![]() ![]() ![]() ![]() |
1..1 | string | Unit representation | |
![]() ![]() ![]() ![]() ![]() ![]() |
1..1 | uri | System that defines coded unit form | |
![]() ![]() ![]() ![]() ![]() ![]() |
1..1 | code | Coded form of the unit | |
![]() ![]() ![]() ![]() ![]() |
0..1 | SimpleQuantity(4.0.1) | High limit Binding: https://fhir.kbv.de/ValueSet/KBV_VS_SFHIR_BMP_DOSIEREINHEIT (required) | |
![]() ![]() ![]() ![]() ![]() ![]() |
1..1 | decimal | Numerical value (with implicit precision) | |
![]() ![]() ![]() ![]() ![]() ![]() |
1..1 | string | Unit representation | |
![]() ![]() ![]() ![]() ![]() ![]() |
1..1 | uri | System that defines coded unit form | |
![]() ![]() ![]() ![]() ![]() ![]() |
1..1 | code | Coded form of the unit | |
![]() ![]() ![]() |
0..0 | Amount of medication per unit of time | ||
![]() ![]() |
||||
![]() ![]() ![]() |
||||
![]() ![]() ![]() ![]() |
0..0 | < | <= | >= | > - how to understand the value | ||
![]() ![]() ![]() |
||||
![]() ![]() ![]() ![]() |
0..0 | < | <= | >= | > - how to understand the value | ||
![]() ![]() |
0..0 | Upper limit on medication per administration | ||
![]() ![]() |
0..0 | Upper limit on medication per lifetime of the patient | ||
Documentation for this format | ||||
| Path | Status | Usage | ValueSet | Version | Source |
| Dosage.modifierExtension:minimumIntervalBetweenAdministrations.value[x].code | Base | required | Mindestabstand UnitsOfTime dgMP ValueSet | 📦2.0.0-ballot | This IG |
| Dosage.doseAndRate.dose[x]:doseQuantity | Base | required | https://fhir.kbv.de/ValueSet/KBV_VS_SFHIR_BMP_DOSIEREINHEIT | Not State | Unknown |
| Dosage.doseAndRate.dose[x]:doseRange.low | Base | required | https://fhir.kbv.de/ValueSet/KBV_VS_SFHIR_BMP_DOSIEREINHEIT | Not State | Unknown |
| Dosage.doseAndRate.dose[x]:doseRange.high | Base | required | https://fhir.kbv.de/ValueSet/KBV_VS_SFHIR_BMP_DOSIEREINHEIT | Not State | Unknown |
| Id | Grade | Path(s) | Description | Expression |
| AsNeededForIdentical | error | Dosage | The reason for use (asNeededFor) must be populated identically across all Dosage elements of a resource. Multiple reasons per element are allowed but must then match in every element. |
(
%resource.ofType(MedicationRequest).dosageInstruction.combine(%resource.ofType(MedicationDispense).dosageInstruction).combine(%resource.ofType(MedicationStatement).dosage)
).all(
extension.where(
url='http://hl7.org/fhir/5.0/StructureDefinition/extension-Dosage.asNeededFor'
).value.ofType(CodeableConcept).text.distinct().count()
=
(
%resource.ofType(MedicationRequest).dosageInstruction.combine(%resource.ofType(MedicationDispense).dosageInstruction).combine(%resource.ofType(MedicationStatement).dosage)
).extension.where(
url='http://hl7.org/fhir/5.0/StructureDefinition/extension-Dosage.asNeededFor'
).value.ofType(CodeableConcept).text.distinct().count()
)
|
| AsNeededForRequiresAsNeeded | error | Dosage | A reason for use (asNeededFor) may only be given for an as-needed dosage (asNeededBoolean = true). |
extension.where(url='http://hl7.org/fhir/5.0/StructureDefinition/extension-Dosage.asNeededFor').exists() implies asNeeded.ofType(boolean) = true
|
| AsNeededIdentical | error | Dosage | The as-needed flag (asNeededBoolean) must be populated identically across all Dosage elements of a resource. |
(
(
%resource.ofType(MedicationRequest).dosageInstruction.combine(%resource.ofType(MedicationDispense).dosageInstruction).combine(%resource.ofType(MedicationStatement).dosage)
).asNeeded.ofType(boolean).distinct().count() <= 1
)
and
(
(
(
%resource.ofType(MedicationRequest).dosageInstruction.combine(%resource.ofType(MedicationDispense).dosageInstruction).combine(%resource.ofType(MedicationStatement).dosage)
).asNeeded.ofType(boolean).exists()
)
implies
(
(
%resource.ofType(MedicationRequest).dosageInstruction.combine(%resource.ofType(MedicationDispense).dosageInstruction).combine(%resource.ofType(MedicationStatement).dosage)
).all(asNeeded.ofType(boolean).exists())
)
)
|
| AsNeededSingleDosageOnly | error | Dosage | If an as-needed dosage with asNeededBoolean = true is given without timing, exactly one Dosage element must exist in the resource. |
(
%resource.ofType(MedicationRequest).dosageInstruction.combine(%resource.ofType(MedicationDispense).dosageInstruction).combine(%resource.ofType(MedicationStatement).dosage)
).where(
asNeeded.ofType(boolean) = true and timing.empty()
).exists()
implies
(
%resource.ofType(MedicationRequest).dosageInstruction.combine(%resource.ofType(MedicationDispense).dosageInstruction).combine(%resource.ofType(MedicationStatement).dosage)
).count() = 1
|
| DosageDoseQuantityAllowedFractions | error | Dosage | Dose values in doseQuantity or doseRange must be whole numbers or use one of the following fractional parts: .25, .33, .5, .66 or .75. |
doseAndRate.all(
(
dose.ofType(Quantity).value.empty() or
dose.ofType(Quantity).value.all(
($this mod 1 = 0) or
($this mod 1 = 0.25) or
($this mod 1 = 0.33) or
($this mod 1 = 0.5) or
($this mod 1 = 0.66) or
($this mod 1 = 0.75)
)
)
and
(
dose.ofType(Range).low.value.empty() or
dose.ofType(Range).low.value.all(
($this mod 1 = 0) or
($this mod 1 = 0.25) or
($this mod 1 = 0.33) or
($this mod 1 = 0.5) or
($this mod 1 = 0.66) or
($this mod 1 = 0.75)
)
)
and
(
dose.ofType(Range).high.value.empty() or
dose.ofType(Range).high.value.all(
($this mod 1 = 0) or
($this mod 1 = 0.25) or
($this mod 1 = 0.33) or
($this mod 1 = 0.5) or
($this mod 1 = 0.66) or
($this mod 1 = 0.75)
)
)
)
|
| DosageDoseUnitSameCode | error | Dosage | The dose unit must be the same across all dosages. |
(%resource.ofType(MedicationRequest).dosageInstruction.combine(%resource.ofType(MedicationDispense).dosageInstruction).combine(%resource.ofType(MedicationStatement).dosage)).all(
doseAndRate.exists() implies
(
(%resource.ofType(MedicationRequest).dosageInstruction.combine(%resource.ofType(MedicationDispense).dosageInstruction).combine(%resource.ofType(MedicationStatement).dosage)).doseAndRate.dose.ofType(Quantity).code |
(%resource.ofType(MedicationRequest).dosageInstruction.combine(%resource.ofType(MedicationDispense).dosageInstruction).combine(%resource.ofType(MedicationStatement).dosage)).doseAndRate.dose.ofType(Range).low.code |
(%resource.ofType(MedicationRequest).dosageInstruction.combine(%resource.ofType(MedicationDispense).dosageInstruction).combine(%resource.ofType(MedicationStatement).dosage)).doseAndRate.dose.ofType(Range).high.code
).distinct().count() = 1
)
|
| DosageDoseValueDecimalNotation | error | Dosage | Dose values in doseQuantity or doseRange must use plain decimal notation with at most two decimal places. Exponential notation (e.g. 50e-2 instead of 0.5) is not allowed. |
doseAndRate.all(
(
dose.ofType(Quantity).value.empty() or
dose.ofType(Quantity).value.toString().matches('^[0-9]+([.][0-9]{1,2})?$')
)
and
(
dose.ofType(Range).low.value.empty() or
dose.ofType(Range).low.value.toString().matches('^[0-9]+([.][0-9]{1,2})?$')
)
and
(
dose.ofType(Range).high.value.empty() or
dose.ofType(Range).high.value.toString().matches('^[0-9]+([.][0-9]{1,2})?$')
)
)
|
| DosageDoseValuePositive | error | Dosage | doseQuantity.value and doseRange.high.value must be greater than 0. The value 0 is additionally allowed for doseRange.low.value only. |
doseAndRate.all(
dose.ofType(Quantity).value.all($this > 0) and
dose.ofType(Range).low.value.all($this >= 0) and
dose.ofType(Range).high.value.all($this > 0)
)
|
| DosageFourSlotPatternInText | error | Dosage | A bare four-slot dosing schema (Viererschema, e.g. 1-0-1-0 or 1-0-1-0 Stück) must not be given as free text in Dosage.text; it has to be represented structurally. A schema embedded in further text, including the generated form 'täglich: 1-0-1-0 Stück', only triggers the warning DosageFourSlotPatternInTextWarning. |
text.exists() implies text.matches('^\\s*\\d+([.,]\\d+)?(\\s*/\\s*\\d+)?(\\s*[-–]\\s*\\d+([.,]\\d+)?(\\s*/\\s*\\d+)?){3}(\\s*[A-Za-zÄÖÜäöüß().]+)?\\s*$').not()
|
| DosageLimitsPositive | error | Dosage | The minimum interval between administrations (valueDuration.value) and maxDosePerPeriod (numerator.value, denominator.value) must be greater than 0. |
modifierExtension.where(
url = 'http://ig.fhir.de/igs/medication/StructureDefinition/MinimumIntervalBetweenAdministrations'
).value.ofType(Duration).value.all($this > 0) and
maxDosePerPeriod.numerator.value.all($this > 0) and
maxDosePerPeriod.denominator.value.all($this > 0)
|
| DosageRequiresGeneratedText | error | Dosage | Regardless of the kind of dosage (structured or free text), the GeneratedDosageInstructionsMeta and renderedDosageInstruction extensions must be present. |
%resource.extension.where(
url = 'http://ig.fhir.de/igs/medication/StructureDefinition/GeneratedDosageInstructionsMeta'
).exists() and
(
%resource.extension.where(
url = 'http://hl7.org/fhir/5.0/StructureDefinition/extension-MedicationRequest.renderedDosageInstruction'
).exists() or
%resource.extension.where(
url = 'http://hl7.org/fhir/5.0/StructureDefinition/extension-MedicationDispense.renderedDosageInstruction'
).exists() or
%resource.extension.where(
url = 'http://hl7.org/fhir/5.0/StructureDefinition/extension-MedicationStatement.renderedDosageInstruction'
).exists()
)
|
| DosageStructuredOrFreeText | error | Dosage | A dosage must be given either as free text only or as complete structured information only; mixing both is not allowed. |
(%resource.ofType(MedicationRequest).dosageInstruction.combine(%resource.ofType(MedicationDispense).dosageInstruction).combine(%resource.ofType(MedicationStatement).dosage)).all(
(text.exists() and timing.empty() and doseAndRate.empty()) or
(text.empty() and (timing.exists() or doseAndRate.exists()))
)
|
| DosageStructuredRequiresBoth | error | Dosage | If a structured dosage is given, both timing and doseAndRate must be present. For pure as-needed dosages, doseAndRate may be given without timing. |
(%resource.ofType(MedicationRequest).dosageInstruction.combine(%resource.ofType(MedicationDispense).dosageInstruction).combine(%resource.ofType(MedicationStatement).dosage)).all(
(timing.exists() implies doseAndRate.exists()) and
(doseAndRate.exists() implies (
timing.exists() or
asNeeded.ofType(boolean) = true or
extension.where(url='http://hl7.org/fhir/5.0/StructureDefinition/extension-Dosage.asNeededFor').exists()
))
)
|
| DoseRangeHighRequiredWhenLowPresent | error | Dosage | If a lower bound is given for doseRange, an upper bound must be given as well. |
doseAndRate.dose.ofType(Range).low.empty() or doseAndRate.dose.ofType(Range).high.exists()
|
| DoseRangeLowAndHighSameUnit | error | Dosage | The lower and upper bound of a variable single dose must use the same unit of measure. |
doseAndRate.dose.ofType(Range).low.empty()
or doseAndRate.dose.ofType(Range).high.empty()
or (
doseAndRate.dose.ofType(Range).low.system = doseAndRate.dose.ofType(Range).high.system
and doseAndRate.dose.ofType(Range).low.code = doseAndRate.dose.ofType(Range).high.code
and doseAndRate.dose.ofType(Range).low.unit = doseAndRate.dose.ofType(Range).high.unit
)
|
| DoseRangeNoVarPeriod | warning | Dosage | A variable single dose and a variable period should not be used together. |
doseAndRate.dose.ofType(Range).empty() or timing.repeat.periodMax.empty()
|
| FreeTextMatchesRenderedText | error | Dosage | If a dosage is given as pure free text (text present, timing and doseAndRate empty), the value in dosageInstruction.text must match the value in the renderedDosageInstruction extension. |
(
(%resource.ofType(MedicationRequest).dosageInstruction.combine(%resource.ofType(MedicationDispense).dosageInstruction).combine(%resource.ofType(MedicationStatement).dosage)
).where(text.exists() and timing.empty() and doseAndRate.empty()).exists()
)
implies
(
(
%resource.ofType(MedicationRequest).exists() and
%resource.extension.where(
url = 'http://hl7.org/fhir/5.0/StructureDefinition/extension-MedicationRequest.renderedDosageInstruction'
).value = %resource.dosageInstruction.text
) or
(
%resource.ofType(MedicationDispense).exists() and
%resource.extension.where(
url = 'http://hl7.org/fhir/5.0/StructureDefinition/extension-MedicationDispense.renderedDosageInstruction'
).value = %resource.dosageInstruction.text
) or
(
%resource.ofType(MedicationStatement).exists() and
%resource.extension.where(
url = 'http://hl7.org/fhir/5.0/StructureDefinition/extension-MedicationStatement.renderedDosageInstruction'
).value = %resource.dosage.text
)
)
|
| FreeTextSingleDosageOnly | error | Dosage | If a dosage is given as pure free text, there must be exactly one Dosage element. |
(
(%resource.ofType(MedicationRequest).dosageInstruction.combine(%resource.ofType(MedicationDispense).dosageInstruction).combine(%resource.ofType(MedicationStatement).dosage)
).exists(text.exists() and timing.empty() and doseAndRate.empty())
)
implies
(
(%resource.ofType(MedicationRequest).dosageInstruction.combine(%resource.ofType(MedicationDispense).dosageInstruction).combine(%resource.ofType(MedicationStatement).dosage)
).count() = 1
)
|
| MaxDoseNotBelowDose | error | Dosage | maxDosePerPeriod.numerator.value must not be smaller than the single dose (doseQuantity.value or doseRange.high.value). |
maxDosePerPeriod.numerator.value.empty() or (
(doseAndRate.dose.ofType(Quantity).value.empty() or
doseAndRate.dose.ofType(Quantity).value <= maxDosePerPeriod.numerator.value) and
(doseAndRate.dose.ofType(Range).high.value.empty() or
doseAndRate.dose.ofType(Range).high.value <= maxDosePerPeriod.numerator.value)
)
|
| MaxDoseOnlyPureAsNeeded | error | Dosage | A maximum amount (maxDosePerPeriod) may only be given for a structured pure as-needed dosage: asNeededBoolean = true, doseAndRate present and no timing. A structured rhythm already determines how much is applied within the reference period. A free-text dosage is rendered verbatim, so a maximum amount next to it could never appear in the text. |
maxDosePerPeriod.exists() implies (asNeeded.ofType(boolean) = true and timing.empty() and doseAndRate.exists())
|
| MaxDosePerPeriodOnly24hOr1d | error | Dosage | maxDosePerPeriod is only allowed with a reference period of 24 hours (24 h) or 1 day (1 d). Other periods (e.g. at most 3 every 6 h) are not allowed. |
maxDosePerPeriod.empty() or (
(maxDosePerPeriod.denominator.value = 24 and maxDosePerPeriod.denominator.code = 'h') or
(maxDosePerPeriod.denominator.value = 1 and maxDosePerPeriod.denominator.code = 'd')
)
|
| MaxDoseSameUnitAsDose | error | Dosage | maxDosePerPeriod must use the same unit, code and system as doseQuantity. |
maxDosePerPeriod.empty() or (
(
doseAndRate.dose.ofType(Quantity).exists() and
doseAndRate.dose.ofType(Quantity).system = maxDosePerPeriod.numerator.system and
doseAndRate.dose.ofType(Quantity).code = maxDosePerPeriod.numerator.code and
doseAndRate.dose.ofType(Quantity).unit = maxDosePerPeriod.numerator.unit
) or (
doseAndRate.dose.ofType(Range).exists() and
(
doseAndRate.dose.ofType(Range).low.empty() or (
doseAndRate.dose.ofType(Range).low.system = maxDosePerPeriod.numerator.system and
doseAndRate.dose.ofType(Range).low.code = maxDosePerPeriod.numerator.code and
doseAndRate.dose.ofType(Range).low.unit = maxDosePerPeriod.numerator.unit
)
) and (
doseAndRate.dose.ofType(Range).high.empty() or (
doseAndRate.dose.ofType(Range).high.system = maxDosePerPeriod.numerator.system and
doseAndRate.dose.ofType(Range).high.code = maxDosePerPeriod.numerator.code and
doseAndRate.dose.ofType(Range).high.unit = maxDosePerPeriod.numerator.unit
)
)
)
)
|
| MinimumIntervalOnlyPureAsNeeded | error | Dosage | A minimum interval between two single administrations (Mindestabstand) may only be given for a structured pure as-needed dosage: asNeededBoolean = true, doseAndRate present and no timing. A structured rhythm already determines the spacing between administrations; a second, weaker lower bound next to it is contradictory. A free-text dosage is rendered verbatim, so a minimum interval next to it could never appear in the text. |
modifierExtension.where(url='http://ig.fhir.de/igs/medication/StructureDefinition/MinimumIntervalBetweenAdministrations').exists() implies (asNeeded.ofType(boolean) = true and timing.empty() and doseAndRate.exists())
|
| MinimumIntervalUnitMatchesCode | error | Dosage | The display unit of the minimum interval (valueDuration.unit) must match the UCUM code (e.g. 'Stunde(n)' only with code='h'). |
modifierExtension.where(
url='http://ig.fhir.de/igs/medication/StructureDefinition/MinimumIntervalBetweenAdministrations'
).value.ofType(Duration).all(
(
code = 'min'
implies
(unit = 'Minute(n)' or unit = 'Minute' or unit = 'Minuten')
) and (
code = 'h'
implies
(unit = 'Stunde(n)' or unit = 'Stunde' or unit = 'Stunden')
)
)
|
| PatientInstructionIdentical | error | Dosage | If patientInstruction is used in a resource with multiple dosages, the field must be populated identically in all Dosage elements. |
(
(
%resource.ofType(MedicationRequest).dosageInstruction.combine(%resource.ofType(MedicationDispense).dosageInstruction).combine(%resource.ofType(MedicationStatement).dosage)
).patientInstruction.distinct().count() <= 1
)
and
(
(
(
%resource.ofType(MedicationRequest).dosageInstruction.combine(%resource.ofType(MedicationDispense).dosageInstruction).combine(%resource.ofType(MedicationStatement).dosage)
).patientInstruction.exists()
)
implies
(
(
%resource.ofType(MedicationRequest).dosageInstruction.combine(%resource.ofType(MedicationDispense).dosageInstruction).combine(%resource.ofType(MedicationStatement).dosage)
).all(patientInstruction.exists())
)
)
|
Snapshot View
| Name | Flags | Card. | Type | Description & Constraints Filter: ![]() |
|---|---|---|---|---|
![]() |
C | 0..* | DosageDE | How the medication is/was taken or should be taken Constraints: DosageStructuredOrFreeTextWarning, DosageStructuredRequiresBothWarning, DosageDoseUnitSameCodeWarning, DosageDoseValuePositiveWarning, DosageLimitsPositiveWarning, DosageFourSlotPatternInTextWarning, FreeTextSingleDosageOnlyWarning, AsNeededForRequiresAsNeededWarning, dos-1, DosageStructuredOrFreeText, DosageStructuredRequiresBoth, DosageRequiresGeneratedText, FreeTextSingleDosageOnly, FreeTextMatchesRenderedText, DosageDoseQuantityAllowedFractions, DosageDoseUnitSameCode, DosageDoseValueDecimalNotation, DosageDoseValuePositive, DosageLimitsPositive, DosageFourSlotPatternInText, PatientInstructionIdentical, MaxDoseSameUnitAsDose, MaxDoseNotBelowDose, MaxDosePerPeriodOnly24hOr1d, MaxDoseOnlyPureAsNeeded, DoseRangeHighRequiredWhenLowPresent, DoseRangeLowAndHighSameUnit, DoseRangeNoVarPeriod, MinimumIntervalOnlyPureAsNeeded, AsNeededForRequiresAsNeeded, AsNeededSingleDosageOnly, AsNeededIdentical, AsNeededForIdentical, MinimumIntervalUnitMatchesCode |
![]() ![]() |
0..1 | string | Unique id for inter-element referencing | |
![]() ![]() |
0..* | Extension | Additional content defined by implementations Slice: Unordered, Open by value:url | |
![]() ![]() ![]() |
0..* | (Complex) | Dosage asNeededFor URL: http://hl7.org/fhir/5.0/StructureDefinition/extension-Dosage.asNeededFor | |
![]() ![]() ![]() ![]() |
0..1 | string | Unique id for inter-element referencing | |
![]() ![]() ![]() ![]() |
0..0 | Extension Slice: Unordered, Open by value:url | ||
![]() ![]() ![]() ![]() |
1..1 | uri | "http://hl7.org/fhir/5.0/StructureDefinition/extension-Dosage.asNeededFor" | |
![]() ![]() ![]() ![]() |
0..1 | CodeableConcept | Value of extension Binding: SNOMEDCTMedicationAsNeededReasonCodes (example) | |
![]() ![]() ![]() ![]() ![]() |
0..1 | string | Unique id for inter-element referencing | |
![]() ![]() ![]() ![]() ![]() |
0..* | Extension | Additional content defined by implementations Slice: Unordered, Open by value:url | |
![]() ![]() ![]() ![]() ![]() |
1..1 | string | Plain text representation of the concept | |
![]() ![]() |
0..* | Extension | Extension Slice: Unordered, Open by value:url Slicing Note: The rules on this element (including its children) apply to all the slices, but are not repeated in them | |
![]() ![]() ![]() |
0..1 | (Complex) | Minimum Interval Between Administrations URL: http://ig.fhir.de/igs/medication/StructureDefinition/MinimumIntervalBetweenAdministrations | |
![]() ![]() ![]() ![]() |
0..1 | string | Unique id for inter-element referencing | |
![]() ![]() ![]() ![]() |
0..0 | Extension Slice: Unordered, Open by value:url | ||
![]() ![]() ![]() ![]() |
1..1 | uri | "http://ig.fhir.de/igs/medication/StructureDefinition/MinimumIntervalBetweenAdministrations" | |
![]() ![]() ![]() ![]() |
1..1 | Duration | Mindestabstand zwischen zwei Gaben | |
![]() ![]() ![]() ![]() ![]() |
0..1 | string | Unique id for inter-element referencing | |
![]() ![]() ![]() ![]() ![]() |
0..* | Extension | Additional content defined by implementations Slice: Unordered, Open by value:url | |
![]() ![]() ![]() ![]() ![]() |
1..1 | decimal | Numerical value (with implicit precision) | |
![]() ![]() ![]() ![]() ![]() |
1..1 | string | Unit representation | |
![]() ![]() ![]() ![]() ![]() |
C | 1..1 | uri | System that defines coded unit form Fixed Value: http://unitsofmeasure.org (no extensions allowed) |
![]() ![]() ![]() ![]() ![]() |
1..1 | code | Coded form of the unit Binding: Mindestabstand UnitsOfTime dgMP ValueSet (required) | |
![]() ![]() |
0..1 | string | Freitext-Dosierungsanweisungen, z. B. 'Maximal 3x täglich 1 Stück bei Bedarf' | |
![]() ![]() |
0..1 | string | Ergänzende Anwendungshinweise für Patientinnen und Patienten | |
![]() ![]() |
C | 0..1 | TimingDgMP | Wann das Medikament verabreicht werden soll Constraints: TimingOnlyOnePeriodForDayOfWeek |
![]() ![]() |
0..1 | boolean | Bedarfsdosierung (nur Ja/Nein-Angabe) | |
![]() ![]() |
0..1 | Element | Menge des verabreichten Medikaments | |
![]() ![]() ![]() |
0..1 | string | Unique id for inter-element referencing | |
![]() ![]() ![]() |
0..* | Extension | Additional content defined by implementations Slice: Unordered, Open by value:url | |
![]() ![]() ![]() |
0..1 | Amount of medication per dose Slice: Unordered, Closed by type:$this Slicing Note: The rules on this element (including its children) apply to all the slices, but are not repeated in them | ||
![]() ![]() ![]() ![]() |
Range | |||
![]() ![]() ![]() ![]() |
Quantity(SimpleQuantity) | |||
![]() ![]() ![]() ![]() |
0..1 | SimpleQuantity |
Menge des Medikaments pro Dosis Binding: https://fhir.kbv.de/ValueSet/KBV_VS_SFHIR_BMP_DOSIEREINHEIT (required) | |
![]() ![]() ![]() ![]() ![]() |
0..1 | string | Unique id for inter-element referencing | |
![]() ![]() ![]() ![]() ![]() |
0..* | Extension | Additional content defined by implementations Slice: Unordered, Open by value:url | |
![]() ![]() ![]() ![]() ![]() |
1..1 | decimal | Numerical value (with implicit precision) | |
![]() ![]() ![]() ![]() ![]() |
1..1 | string | Unit representation | |
![]() ![]() ![]() ![]() ![]() |
C | 1..1 | uri | System that defines coded unit form |
![]() ![]() ![]() ![]() ![]() |
1..1 | code | Coded form of the unit | |
![]() ![]() ![]() ![]() |
0..1 | Range | Amount of medication per dose | |
![]() ![]() ![]() ![]() ![]() |
0..1 | string | Unique id for inter-element referencing | |
![]() ![]() ![]() ![]() ![]() |
0..* | Extension | Additional content defined by implementations Slice: Unordered, Open by value:url | |
![]() ![]() ![]() ![]() ![]() |
C | 0..1 | SimpleQuantity(4.0.1) | Low limit Binding: https://fhir.kbv.de/ValueSet/KBV_VS_SFHIR_BMP_DOSIEREINHEIT (required) Constraints: sqty-1 |
![]() ![]() ![]() ![]() ![]() ![]() |
0..1 | string | Unique id for inter-element referencing | |
![]() ![]() ![]() ![]() ![]() ![]() |
0..* | Extension | Additional content defined by implementations Slice: Unordered, Open by value:url | |
![]() ![]() ![]() ![]() ![]() ![]() |
1..1 | decimal | Numerical value (with implicit precision) | |
![]() ![]() ![]() ![]() ![]() ![]() |
1..1 | string | Unit representation | |
![]() ![]() ![]() ![]() ![]() ![]() |
C | 1..1 | uri | System that defines coded unit form |
![]() ![]() ![]() ![]() ![]() ![]() |
1..1 | code | Coded form of the unit | |
![]() ![]() ![]() ![]() ![]() |
C | 0..1 | SimpleQuantity(4.0.1) | High limit Binding: https://fhir.kbv.de/ValueSet/KBV_VS_SFHIR_BMP_DOSIEREINHEIT (required) Constraints: sqty-1 |
![]() ![]() ![]() ![]() ![]() ![]() |
0..1 | string | Unique id for inter-element referencing | |
![]() ![]() ![]() ![]() ![]() ![]() |
0..* | Extension | Additional content defined by implementations Slice: Unordered, Open by value:url | |
![]() ![]() ![]() ![]() ![]() ![]() |
1..1 | decimal | Numerical value (with implicit precision) | |
![]() ![]() ![]() ![]() ![]() ![]() |
1..1 | string | Unit representation | |
![]() ![]() ![]() ![]() ![]() ![]() |
C | 1..1 | uri | System that defines coded unit form |
![]() ![]() ![]() ![]() ![]() ![]() |
1..1 | code | Coded form of the unit | |
![]() ![]() |
0..1 | Ratio | Maximale Dosis pro Zeitraum | |
![]() ![]() ![]() |
0..1 | string | Unique id for inter-element referencing | |
![]() ![]() ![]() |
0..* | Extension | Additional content defined by implementations Slice: Unordered, Open by value:url | |
![]() ![]() ![]() |
0..1 | Quantity | Numerator value | |
![]() ![]() ![]() ![]() |
0..1 | string | Unique id for inter-element referencing | |
![]() ![]() ![]() ![]() |
0..* | Extension | Additional content defined by implementations Slice: Unordered, Open by value:url | |
![]() ![]() ![]() ![]() |
0..1 | decimal | Numerical value (with implicit precision) | |
![]() ![]() ![]() ![]() |
0..1 | string | Unit representation | |
![]() ![]() ![]() ![]() |
C | 0..1 | uri | System that defines coded unit form |
![]() ![]() ![]() ![]() |
0..1 | code | Coded form of the unit | |
![]() ![]() ![]() |
0..1 | Quantity | Denominator value | |
![]() ![]() ![]() ![]() |
0..1 | string | Unique id for inter-element referencing | |
![]() ![]() ![]() ![]() |
0..* | Extension | Additional content defined by implementations Slice: Unordered, Open by value:url | |
![]() ![]() ![]() ![]() |
0..1 | decimal | Numerical value (with implicit precision) | |
![]() ![]() ![]() ![]() |
0..1 | string | Unit representation | |
![]() ![]() ![]() ![]() |
C | 0..1 | uri | System that defines coded unit form |
![]() ![]() ![]() ![]() |
0..1 | code | Coded form of the unit | |
Documentation for this format | ||||
| Path | Status | Usage | ValueSet | Version | Source |
| Dosage.extension:asNeededFor.value[x] | Base | example | SNOMED CT Medication As Needed Reason Codes | 📦4.0.1 | FHIR Std. |
| Dosage.modifierExtension:minimumIntervalBetweenAdministrations.value[x].code | Base | required | Mindestabstand UnitsOfTime dgMP ValueSet | 📦2.0.0-ballot | This IG |
| Dosage.doseAndRate.dose[x]:doseQuantity | Base | required | https://fhir.kbv.de/ValueSet/KBV_VS_SFHIR_BMP_DOSIEREINHEIT | Not State | Unknown |
| Dosage.doseAndRate.dose[x]:doseRange.low | Base | required | https://fhir.kbv.de/ValueSet/KBV_VS_SFHIR_BMP_DOSIEREINHEIT | Not State | Unknown |
| Dosage.doseAndRate.dose[x]:doseRange.high | Base | required | https://fhir.kbv.de/ValueSet/KBV_VS_SFHIR_BMP_DOSIEREINHEIT | Not State | Unknown |
| Id | Grade | Path(s) | Description | Expression |
| AsNeededForIdentical | error | Dosage | The reason for use (asNeededFor) must be populated identically across all Dosage elements of a resource. Multiple reasons per element are allowed but must then match in every element. |
(
%resource.ofType(MedicationRequest).dosageInstruction.combine(%resource.ofType(MedicationDispense).dosageInstruction).combine(%resource.ofType(MedicationStatement).dosage)
).all(
extension.where(
url='http://hl7.org/fhir/5.0/StructureDefinition/extension-Dosage.asNeededFor'
).value.ofType(CodeableConcept).text.distinct().count()
=
(
%resource.ofType(MedicationRequest).dosageInstruction.combine(%resource.ofType(MedicationDispense).dosageInstruction).combine(%resource.ofType(MedicationStatement).dosage)
).extension.where(
url='http://hl7.org/fhir/5.0/StructureDefinition/extension-Dosage.asNeededFor'
).value.ofType(CodeableConcept).text.distinct().count()
)
|
| AsNeededForRequiresAsNeeded | error | Dosage | A reason for use (asNeededFor) may only be given for an as-needed dosage (asNeededBoolean = true). |
extension.where(url='http://hl7.org/fhir/5.0/StructureDefinition/extension-Dosage.asNeededFor').exists() implies asNeeded.ofType(boolean) = true
|
| AsNeededForRequiresAsNeededWarning | warning | Dosage | A reason for use (asNeededFor) should only be given together with asNeededBoolean = true. |
extension.where(url='http://hl7.org/fhir/5.0/StructureDefinition/extension-Dosage.asNeededFor').exists() implies asNeeded.ofType(boolean) = true
|
| AsNeededIdentical | error | Dosage | The as-needed flag (asNeededBoolean) must be populated identically across all Dosage elements of a resource. |
(
(
%resource.ofType(MedicationRequest).dosageInstruction.combine(%resource.ofType(MedicationDispense).dosageInstruction).combine(%resource.ofType(MedicationStatement).dosage)
).asNeeded.ofType(boolean).distinct().count() <= 1
)
and
(
(
(
%resource.ofType(MedicationRequest).dosageInstruction.combine(%resource.ofType(MedicationDispense).dosageInstruction).combine(%resource.ofType(MedicationStatement).dosage)
).asNeeded.ofType(boolean).exists()
)
implies
(
(
%resource.ofType(MedicationRequest).dosageInstruction.combine(%resource.ofType(MedicationDispense).dosageInstruction).combine(%resource.ofType(MedicationStatement).dosage)
).all(asNeeded.ofType(boolean).exists())
)
)
|
| AsNeededSingleDosageOnly | error | Dosage | If an as-needed dosage with asNeededBoolean = true is given without timing, exactly one Dosage element must exist in the resource. |
(
%resource.ofType(MedicationRequest).dosageInstruction.combine(%resource.ofType(MedicationDispense).dosageInstruction).combine(%resource.ofType(MedicationStatement).dosage)
).where(
asNeeded.ofType(boolean) = true and timing.empty()
).exists()
implies
(
%resource.ofType(MedicationRequest).dosageInstruction.combine(%resource.ofType(MedicationDispense).dosageInstruction).combine(%resource.ofType(MedicationStatement).dosage)
).count() = 1
|
| DosageDoseQuantityAllowedFractions | error | Dosage | Dose values in doseQuantity or doseRange must be whole numbers or use one of the following fractional parts: .25, .33, .5, .66 or .75. |
doseAndRate.all(
(
dose.ofType(Quantity).value.empty() or
dose.ofType(Quantity).value.all(
($this mod 1 = 0) or
($this mod 1 = 0.25) or
($this mod 1 = 0.33) or
($this mod 1 = 0.5) or
($this mod 1 = 0.66) or
($this mod 1 = 0.75)
)
)
and
(
dose.ofType(Range).low.value.empty() or
dose.ofType(Range).low.value.all(
($this mod 1 = 0) or
($this mod 1 = 0.25) or
($this mod 1 = 0.33) or
($this mod 1 = 0.5) or
($this mod 1 = 0.66) or
($this mod 1 = 0.75)
)
)
and
(
dose.ofType(Range).high.value.empty() or
dose.ofType(Range).high.value.all(
($this mod 1 = 0) or
($this mod 1 = 0.25) or
($this mod 1 = 0.33) or
($this mod 1 = 0.5) or
($this mod 1 = 0.66) or
($this mod 1 = 0.75)
)
)
)
|
| DosageDoseUnitSameCode | error | Dosage | The dose unit must be the same across all dosages. |
(%resource.ofType(MedicationRequest).dosageInstruction.combine(%resource.ofType(MedicationDispense).dosageInstruction).combine(%resource.ofType(MedicationStatement).dosage)).all(
doseAndRate.exists() implies
(
(%resource.ofType(MedicationRequest).dosageInstruction.combine(%resource.ofType(MedicationDispense).dosageInstruction).combine(%resource.ofType(MedicationStatement).dosage)).doseAndRate.dose.ofType(Quantity).code |
(%resource.ofType(MedicationRequest).dosageInstruction.combine(%resource.ofType(MedicationDispense).dosageInstruction).combine(%resource.ofType(MedicationStatement).dosage)).doseAndRate.dose.ofType(Range).low.code |
(%resource.ofType(MedicationRequest).dosageInstruction.combine(%resource.ofType(MedicationDispense).dosageInstruction).combine(%resource.ofType(MedicationStatement).dosage)).doseAndRate.dose.ofType(Range).high.code
).distinct().count() = 1
)
|
| DosageDoseUnitSameCodeWarning | warning | Dosage | The dose unit should be the same across all dosages. |
(%resource.ofType(MedicationRequest).dosageInstruction.combine(%resource.ofType(MedicationDispense).dosageInstruction).combine(%resource.ofType(MedicationStatement).dosage)).all(
doseAndRate.exists() implies
(
(%resource.ofType(MedicationRequest).dosageInstruction.combine(%resource.ofType(MedicationDispense).dosageInstruction).combine(%resource.ofType(MedicationStatement).dosage)).doseAndRate.dose.ofType(Quantity).code |
(%resource.ofType(MedicationRequest).dosageInstruction.combine(%resource.ofType(MedicationDispense).dosageInstruction).combine(%resource.ofType(MedicationStatement).dosage)).doseAndRate.dose.ofType(Range).low.code |
(%resource.ofType(MedicationRequest).dosageInstruction.combine(%resource.ofType(MedicationDispense).dosageInstruction).combine(%resource.ofType(MedicationStatement).dosage)).doseAndRate.dose.ofType(Range).high.code
).distinct().count() = 1
)
|
| DosageDoseValueDecimalNotation | error | Dosage | Dose values in doseQuantity or doseRange must use plain decimal notation with at most two decimal places. Exponential notation (e.g. 50e-2 instead of 0.5) is not allowed. |
doseAndRate.all(
(
dose.ofType(Quantity).value.empty() or
dose.ofType(Quantity).value.toString().matches('^[0-9]+([.][0-9]{1,2})?$')
)
and
(
dose.ofType(Range).low.value.empty() or
dose.ofType(Range).low.value.toString().matches('^[0-9]+([.][0-9]{1,2})?$')
)
and
(
dose.ofType(Range).high.value.empty() or
dose.ofType(Range).high.value.toString().matches('^[0-9]+([.][0-9]{1,2})?$')
)
)
|
| DosageDoseValuePositive | error | Dosage | doseQuantity.value and doseRange.high.value must be greater than 0. The value 0 is additionally allowed for doseRange.low.value only. |
doseAndRate.all(
dose.ofType(Quantity).value.all($this > 0) and
dose.ofType(Range).low.value.all($this >= 0) and
dose.ofType(Range).high.value.all($this > 0)
)
|
| DosageDoseValuePositiveWarning | warning | Dosage | doseQuantity.value and doseRange.high.value should be greater than 0. The value 0 is additionally allowed for doseRange.low.value only. |
doseAndRate.all(
dose.ofType(Quantity).value.all($this > 0) and
dose.ofType(Range).low.value.all($this >= 0) and
dose.ofType(Range).high.value.all($this > 0)
)
|
| DosageFourSlotPatternInText | error | Dosage | A bare four-slot dosing schema (Viererschema, e.g. 1-0-1-0 or 1-0-1-0 Stück) must not be given as free text in Dosage.text; it has to be represented structurally. A schema embedded in further text, including the generated form 'täglich: 1-0-1-0 Stück', only triggers the warning DosageFourSlotPatternInTextWarning. |
text.exists() implies text.matches('^\\s*\\d+([.,]\\d+)?(\\s*/\\s*\\d+)?(\\s*[-–]\\s*\\d+([.,]\\d+)?(\\s*/\\s*\\d+)?){3}(\\s*[A-Za-zÄÖÜäöüß().]+)?\\s*$').not()
|
| DosageFourSlotPatternInTextWarning | warning | Dosage | A four-slot dosing schema (Viererschema, e.g. 1-1-1-1) was detected in Dosage.text. Please check whether it can be represented structurally. |
text.exists() implies text.matches('.*\\d+\\s*[-–]\\s*\\d+\\s*[-–]\\s*\\d+\\s*[-–]\\s*\\d+.*').not()
|
| DosageLimitsPositive | error | Dosage | The minimum interval between administrations (valueDuration.value) and maxDosePerPeriod (numerator.value, denominator.value) must be greater than 0. |
modifierExtension.where(
url = 'http://ig.fhir.de/igs/medication/StructureDefinition/MinimumIntervalBetweenAdministrations'
).value.ofType(Duration).value.all($this > 0) and
maxDosePerPeriod.numerator.value.all($this > 0) and
maxDosePerPeriod.denominator.value.all($this > 0)
|
| DosageLimitsPositiveWarning | warning | Dosage | The minimum interval between administrations (valueDuration.value) and maxDosePerPeriod (numerator.value, denominator.value) should be greater than 0. |
modifierExtension.where(
url = 'http://ig.fhir.de/igs/medication/StructureDefinition/MinimumIntervalBetweenAdministrations'
).value.ofType(Duration).value.all($this > 0) and
maxDosePerPeriod.numerator.value.all($this > 0) and
maxDosePerPeriod.denominator.value.all($this > 0)
|
| DosageRequiresGeneratedText | error | Dosage | Regardless of the kind of dosage (structured or free text), the GeneratedDosageInstructionsMeta and renderedDosageInstruction extensions must be present. |
%resource.extension.where(
url = 'http://ig.fhir.de/igs/medication/StructureDefinition/GeneratedDosageInstructionsMeta'
).exists() and
(
%resource.extension.where(
url = 'http://hl7.org/fhir/5.0/StructureDefinition/extension-MedicationRequest.renderedDosageInstruction'
).exists() or
%resource.extension.where(
url = 'http://hl7.org/fhir/5.0/StructureDefinition/extension-MedicationDispense.renderedDosageInstruction'
).exists() or
%resource.extension.where(
url = 'http://hl7.org/fhir/5.0/StructureDefinition/extension-MedicationStatement.renderedDosageInstruction'
).exists()
)
|
| DosageStructuredOrFreeText | error | Dosage | A dosage must be given either as free text only or as complete structured information only; mixing both is not allowed. |
(%resource.ofType(MedicationRequest).dosageInstruction.combine(%resource.ofType(MedicationDispense).dosageInstruction).combine(%resource.ofType(MedicationStatement).dosage)).all(
(text.exists() and timing.empty() and doseAndRate.empty()) or
(text.empty() and (timing.exists() or doseAndRate.exists()))
)
|
| DosageStructuredOrFreeTextWarning | warning | Dosage | A dosage must be given either as free text only or as complete structured information only; mixing both is not allowed. |
(%resource.ofType(MedicationRequest).dosageInstruction.combine(%resource.ofType(MedicationDispense).dosageInstruction).combine(%resource.ofType(MedicationStatement).dosage)).all(
(text.exists() and timing.empty() and doseAndRate.empty()) or
(text.empty() and (timing.exists() or doseAndRate.exists()))
)
|
| DosageStructuredRequiresBoth | error | Dosage | If a structured dosage is given, both timing and doseAndRate must be present. For pure as-needed dosages, doseAndRate may be given without timing. |
(%resource.ofType(MedicationRequest).dosageInstruction.combine(%resource.ofType(MedicationDispense).dosageInstruction).combine(%resource.ofType(MedicationStatement).dosage)).all(
(timing.exists() implies doseAndRate.exists()) and
(doseAndRate.exists() implies (
timing.exists() or
asNeeded.ofType(boolean) = true or
extension.where(url='http://hl7.org/fhir/5.0/StructureDefinition/extension-Dosage.asNeededFor').exists()
))
)
|
| DosageStructuredRequiresBothWarning | warning | Dosage | If a structured dosage is given, both timing and doseAndRate should be present. For pure as-needed dosages, doseAndRate may be given without timing. |
(%resource.ofType(MedicationRequest).dosageInstruction.combine(%resource.ofType(MedicationDispense).dosageInstruction).combine(%resource.ofType(MedicationStatement).dosage)).all(
(timing.exists() implies doseAndRate.exists()) and
(doseAndRate.exists() implies (
timing.exists() or
asNeeded.ofType(boolean) = true or
extension.where(url='http://hl7.org/fhir/5.0/StructureDefinition/extension-Dosage.asNeededFor').exists()
))
)
|
| DoseRangeHighRequiredWhenLowPresent | error | Dosage | If a lower bound is given for doseRange, an upper bound must be given as well. |
doseAndRate.dose.ofType(Range).low.empty() or doseAndRate.dose.ofType(Range).high.exists()
|
| DoseRangeLowAndHighSameUnit | error | Dosage | The lower and upper bound of a variable single dose must use the same unit of measure. |
doseAndRate.dose.ofType(Range).low.empty()
or doseAndRate.dose.ofType(Range).high.empty()
or (
doseAndRate.dose.ofType(Range).low.system = doseAndRate.dose.ofType(Range).high.system
and doseAndRate.dose.ofType(Range).low.code = doseAndRate.dose.ofType(Range).high.code
and doseAndRate.dose.ofType(Range).low.unit = doseAndRate.dose.ofType(Range).high.unit
)
|
| DoseRangeNoVarPeriod | warning | Dosage | A variable single dose and a variable period should not be used together. |
doseAndRate.dose.ofType(Range).empty() or timing.repeat.periodMax.empty()
|
| FreeTextMatchesRenderedText | error | Dosage | If a dosage is given as pure free text (text present, timing and doseAndRate empty), the value in dosageInstruction.text must match the value in the renderedDosageInstruction extension. |
(
(%resource.ofType(MedicationRequest).dosageInstruction.combine(%resource.ofType(MedicationDispense).dosageInstruction).combine(%resource.ofType(MedicationStatement).dosage)
).where(text.exists() and timing.empty() and doseAndRate.empty()).exists()
)
implies
(
(
%resource.ofType(MedicationRequest).exists() and
%resource.extension.where(
url = 'http://hl7.org/fhir/5.0/StructureDefinition/extension-MedicationRequest.renderedDosageInstruction'
).value = %resource.dosageInstruction.text
) or
(
%resource.ofType(MedicationDispense).exists() and
%resource.extension.where(
url = 'http://hl7.org/fhir/5.0/StructureDefinition/extension-MedicationDispense.renderedDosageInstruction'
).value = %resource.dosageInstruction.text
) or
(
%resource.ofType(MedicationStatement).exists() and
%resource.extension.where(
url = 'http://hl7.org/fhir/5.0/StructureDefinition/extension-MedicationStatement.renderedDosageInstruction'
).value = %resource.dosage.text
)
)
|
| FreeTextSingleDosageOnly | error | Dosage | If a dosage is given as pure free text, there must be exactly one Dosage element. |
(
(%resource.ofType(MedicationRequest).dosageInstruction.combine(%resource.ofType(MedicationDispense).dosageInstruction).combine(%resource.ofType(MedicationStatement).dosage)
).exists(text.exists() and timing.empty() and doseAndRate.empty())
)
implies
(
(%resource.ofType(MedicationRequest).dosageInstruction.combine(%resource.ofType(MedicationDispense).dosageInstruction).combine(%resource.ofType(MedicationStatement).dosage)
).count() = 1
)
|
| FreeTextSingleDosageOnlyWarning | warning | Dosage | If a dosage is given as pure free text, there should be exactly one Dosage element. |
(
(%resource.ofType(MedicationRequest).dosageInstruction.combine(%resource.ofType(MedicationDispense).dosageInstruction).combine(%resource.ofType(MedicationStatement).dosage)
).exists(text.exists() and timing.empty() and doseAndRate.empty())
)
implies
(
(%resource.ofType(MedicationRequest).dosageInstruction.combine(%resource.ofType(MedicationDispense).dosageInstruction).combine(%resource.ofType(MedicationStatement).dosage)
).count() = 1
)
|
| MaxDoseNotBelowDose | error | Dosage | maxDosePerPeriod.numerator.value must not be smaller than the single dose (doseQuantity.value or doseRange.high.value). |
maxDosePerPeriod.numerator.value.empty() or (
(doseAndRate.dose.ofType(Quantity).value.empty() or
doseAndRate.dose.ofType(Quantity).value <= maxDosePerPeriod.numerator.value) and
(doseAndRate.dose.ofType(Range).high.value.empty() or
doseAndRate.dose.ofType(Range).high.value <= maxDosePerPeriod.numerator.value)
)
|
| MaxDoseOnlyPureAsNeeded | error | Dosage | A maximum amount (maxDosePerPeriod) may only be given for a structured pure as-needed dosage: asNeededBoolean = true, doseAndRate present and no timing. A structured rhythm already determines how much is applied within the reference period. A free-text dosage is rendered verbatim, so a maximum amount next to it could never appear in the text. |
maxDosePerPeriod.exists() implies (asNeeded.ofType(boolean) = true and timing.empty() and doseAndRate.exists())
|
| MaxDosePerPeriodOnly24hOr1d | error | Dosage | maxDosePerPeriod is only allowed with a reference period of 24 hours (24 h) or 1 day (1 d). Other periods (e.g. at most 3 every 6 h) are not allowed. |
maxDosePerPeriod.empty() or (
(maxDosePerPeriod.denominator.value = 24 and maxDosePerPeriod.denominator.code = 'h') or
(maxDosePerPeriod.denominator.value = 1 and maxDosePerPeriod.denominator.code = 'd')
)
|
| MaxDoseSameUnitAsDose | error | Dosage | maxDosePerPeriod must use the same unit, code and system as doseQuantity. |
maxDosePerPeriod.empty() or (
(
doseAndRate.dose.ofType(Quantity).exists() and
doseAndRate.dose.ofType(Quantity).system = maxDosePerPeriod.numerator.system and
doseAndRate.dose.ofType(Quantity).code = maxDosePerPeriod.numerator.code and
doseAndRate.dose.ofType(Quantity).unit = maxDosePerPeriod.numerator.unit
) or (
doseAndRate.dose.ofType(Range).exists() and
(
doseAndRate.dose.ofType(Range).low.empty() or (
doseAndRate.dose.ofType(Range).low.system = maxDosePerPeriod.numerator.system and
doseAndRate.dose.ofType(Range).low.code = maxDosePerPeriod.numerator.code and
doseAndRate.dose.ofType(Range).low.unit = maxDosePerPeriod.numerator.unit
)
) and (
doseAndRate.dose.ofType(Range).high.empty() or (
doseAndRate.dose.ofType(Range).high.system = maxDosePerPeriod.numerator.system and
doseAndRate.dose.ofType(Range).high.code = maxDosePerPeriod.numerator.code and
doseAndRate.dose.ofType(Range).high.unit = maxDosePerPeriod.numerator.unit
)
)
)
)
|
| MinimumIntervalOnlyPureAsNeeded | error | Dosage | A minimum interval between two single administrations (Mindestabstand) may only be given for a structured pure as-needed dosage: asNeededBoolean = true, doseAndRate present and no timing. A structured rhythm already determines the spacing between administrations; a second, weaker lower bound next to it is contradictory. A free-text dosage is rendered verbatim, so a minimum interval next to it could never appear in the text. |
modifierExtension.where(url='http://ig.fhir.de/igs/medication/StructureDefinition/MinimumIntervalBetweenAdministrations').exists() implies (asNeeded.ofType(boolean) = true and timing.empty() and doseAndRate.exists())
|
| MinimumIntervalUnitMatchesCode | error | Dosage | The display unit of the minimum interval (valueDuration.unit) must match the UCUM code (e.g. 'Stunde(n)' only with code='h'). |
modifierExtension.where(
url='http://ig.fhir.de/igs/medication/StructureDefinition/MinimumIntervalBetweenAdministrations'
).value.ofType(Duration).all(
(
code = 'min'
implies
(unit = 'Minute(n)' or unit = 'Minute' or unit = 'Minuten')
) and (
code = 'h'
implies
(unit = 'Stunde(n)' or unit = 'Stunde' or unit = 'Stunden')
)
)
|
| PatientInstructionIdentical | error | Dosage | If patientInstruction is used in a resource with multiple dosages, the field must be populated identically in all Dosage elements. |
(
(
%resource.ofType(MedicationRequest).dosageInstruction.combine(%resource.ofType(MedicationDispense).dosageInstruction).combine(%resource.ofType(MedicationStatement).dosage)
).patientInstruction.distinct().count() <= 1
)
and
(
(
(
%resource.ofType(MedicationRequest).dosageInstruction.combine(%resource.ofType(MedicationDispense).dosageInstruction).combine(%resource.ofType(MedicationStatement).dosage)
).patientInstruction.exists()
)
implies
(
(
%resource.ofType(MedicationRequest).dosageInstruction.combine(%resource.ofType(MedicationDispense).dosageInstruction).combine(%resource.ofType(MedicationStatement).dosage)
).all(patientInstruction.exists())
)
)
|
| TimingOnlyOnePeriodForDayOfWeek | error | Dosage.timing | In a schema that combines dayOfWeek with either timeOfDay or when, each combination of weekday and time must be unique across all Dosage elements of a resource. |
( /* Detect DayOfWeek and Time/4-Schema */
%resource.ofType(MedicationRequest).dosageInstruction.combine(%resource.ofType(MedicationDispense).dosageInstruction).combine(%resource.ofType(MedicationStatement).dosage)
).all(
(
timing.repeat.dayOfWeek.exists() and
(
(timing.repeat.timeOfDay.exists() and timing.repeat.when.empty()) or
(timing.repeat.when.exists() and timing.repeat.timeOfDay.empty())
)
)
implies
(
(
(%resource.ofType(MedicationRequest).exists() or %resource.ofType(MedicationDispense).exists())
implies
(
/* For each day of week */
/* if Mon occurs multiple times */
((%resource.dosageInstruction.timing.repeat.dayOfWeek.where($this = 'mon').count() > 1) implies
(
(%resource.dosageInstruction.timing.repeat.where('mon' in dayOfWeek).when.distinct().count() = %resource.dosageInstruction.timing.repeat.where('mon' in dayOfWeek).when.count()) and
(%resource.dosageInstruction.timing.repeat.where('mon' in dayOfWeek).timeOfDay.distinct().count() = %resource.dosageInstruction.timing.repeat.where('mon' in dayOfWeek).timeOfDay.count())
)) and
/* if tue occurs multiple times */
((%resource.dosageInstruction.timing.repeat.dayOfWeek.where($this = 'tue').count() > 1) implies
(
(%resource.dosageInstruction.timing.repeat.where('tue' in dayOfWeek).when.distinct().count() = %resource.dosageInstruction.timing.repeat.where('tue' in dayOfWeek).when.count()) and
(%resource.dosageInstruction.timing.repeat.where('tue' in dayOfWeek).timeOfDay.distinct().count() = %resource.dosageInstruction.timing.repeat.where('tue' in dayOfWeek).timeOfDay.count())
)) and
/* if wed occurs multiple times */
((%resource.dosageInstruction.timing.repeat.dayOfWeek.where($this = 'wed').count() > 1) implies
(
(%resource.dosageInstruction.timing.repeat.where('wed' in dayOfWeek).when.distinct().count() = %resource.dosageInstruction.timing.repeat.where('wed' in dayOfWeek).when.count()) and
(%resource.dosageInstruction.timing.repeat.where('wed' in dayOfWeek).timeOfDay.distinct().count() = %resource.dosageInstruction.timing.repeat.where('wed' in dayOfWeek).timeOfDay.count())
)) and
/* if thu occurs multiple times */
((%resource.dosageInstruction.timing.repeat.dayOfWeek.where($this = 'thu').count() > 1) implies
(
(%resource.dosageInstruction.timing.repeat.where('thu' in dayOfWeek).when.distinct().count() = %resource.dosageInstruction.timing.repeat.where('thu' in dayOfWeek).when.count()) and
(%resource.dosageInstruction.timing.repeat.where('thu' in dayOfWeek).timeOfDay.distinct().count() = %resource.dosageInstruction.timing.repeat.where('thu' in dayOfWeek).timeOfDay.count())
)) and
/* if fri occurs multiple times */
((%resource.dosageInstruction.timing.repeat.dayOfWeek.where($this = 'fri').count() > 1) implies
(
(%resource.dosageInstruction.timing.repeat.where('fri' in dayOfWeek).when.distinct().count() = %resource.dosageInstruction.timing.repeat.where('fri' in dayOfWeek).when.count()) and
(%resource.dosageInstruction.timing.repeat.where('fri' in dayOfWeek).timeOfDay.distinct().count() = %resource.dosageInstruction.timing.repeat.where('fri' in dayOfWeek).timeOfDay.count())
)) and
/* if sat occurs multiple times */
((%resource.dosageInstruction.timing.repeat.dayOfWeek.where($this = 'sat').count() > 1) implies
(
(%resource.dosageInstruction.timing.repeat.where('sat' in dayOfWeek).when.distinct().count() = %resource.dosageInstruction.timing.repeat.where('sat' in dayOfWeek).when.count()) and
(%resource.dosageInstruction.timing.repeat.where('sat' in dayOfWeek).timeOfDay.distinct().count() = %resource.dosageInstruction.timing.repeat.where('sat' in dayOfWeek).timeOfDay.count())
)) and
/* if sun occurs multiple times */
((%resource.dosageInstruction.timing.repeat.dayOfWeek.where($this = 'sun').count() > 1) implies
(
(%resource.dosageInstruction.timing.repeat.where('sun' in dayOfWeek).when.distinct().count() = %resource.dosageInstruction.timing.repeat.where('sun' in dayOfWeek).when.count()) and
(%resource.dosageInstruction.timing.repeat.where('sun' in dayOfWeek).timeOfDay.distinct().count() = %resource.dosageInstruction.timing.repeat.where('sun' in dayOfWeek).timeOfDay.count())
))
)
)
and
(
%resource.ofType(MedicationStatement).exists()
implies
(
/* For each day of week */
/* if Mon occurs multiple times */
((%resource.dosage.timing.repeat.dayOfWeek.where($this = 'mon').count() > 1) implies
(
(%resource.dosage.timing.repeat.where('mon' in dayOfWeek).when.distinct().count() = %resource.dosage.timing.repeat.where('mon' in dayOfWeek).when.count()) and
(%resource.dosage.timing.repeat.where('mon' in dayOfWeek).timeOfDay.distinct().count() = %resource.dosage.timing.repeat.where('mon' in dayOfWeek).timeOfDay.count())
)) and
/* if tue occurs multiple times */
((%resource.dosage.timing.repeat.dayOfWeek.where($this = 'tue').count() > 1) implies
(
(%resource.dosage.timing.repeat.where('tue' in dayOfWeek).when.distinct().count() = %resource.dosage.timing.repeat.where('tue' in dayOfWeek).when.count()) and
(%resource.dosage.timing.repeat.where('tue' in dayOfWeek).timeOfDay.distinct().count() = %resource.dosage.timing.repeat.where('tue' in dayOfWeek).timeOfDay.count())
)) and
/* if wed occurs multiple times */
((%resource.dosage.timing.repeat.dayOfWeek.where($this = 'wed').count() > 1) implies
(
(%resource.dosage.timing.repeat.where('wed' in dayOfWeek).when.distinct().count() = %resource.dosage.timing.repeat.where('wed' in dayOfWeek).when.count()) and
(%resource.dosage.timing.repeat.where('wed' in dayOfWeek).timeOfDay.distinct().count() = %resource.dosage.timing.repeat.where('wed' in dayOfWeek).timeOfDay.count())
)) and
/* if thu occurs multiple times */
((%resource.dosage.timing.repeat.dayOfWeek.where($this = 'thu').count() > 1) implies
(
(%resource.dosage.timing.repeat.where('thu' in dayOfWeek).when.distinct().count() = %resource.dosage.timing.repeat.where('thu' in dayOfWeek).when.count()) and
(%resource.dosage.timing.repeat.where('thu' in dayOfWeek).timeOfDay.distinct().count() = %resource.dosage.timing.repeat.where('thu' in dayOfWeek).timeOfDay.count())
)) and
/* if fri occurs multiple times */
((%resource.dosage.timing.repeat.dayOfWeek.where($this = 'fri').count() > 1) implies
(
(%resource.dosage.timing.repeat.where('fri' in dayOfWeek).when.distinct().count() = %resource.dosage.timing.repeat.where('fri' in dayOfWeek).when.count()) and
(%resource.dosage.timing.repeat.where('fri' in dayOfWeek).timeOfDay.distinct().count() = %resource.dosage.timing.repeat.where('fri' in dayOfWeek).timeOfDay.count())
)) and
/* if sat occurs multiple times */
((%resource.dosage.timing.repeat.dayOfWeek.where($this = 'sat').count() > 1) implies
(
(%resource.dosage.timing.repeat.where('sat' in dayOfWeek).when.distinct().count() = %resource.dosage.timing.repeat.where('sat' in dayOfWeek).when.count()) and
(%resource.dosage.timing.repeat.where('sat' in dayOfWeek).timeOfDay.distinct().count() = %resource.dosage.timing.repeat.where('sat' in dayOfWeek).timeOfDay.count())
)) and
/* if sun occurs multiple times */
((%resource.dosage.timing.repeat.dayOfWeek.where($this = 'sun').count() > 1) implies
(
(%resource.dosage.timing.repeat.where('sun' in dayOfWeek).when.distinct().count() = %resource.dosage.timing.repeat.where('sun' in dayOfWeek).when.count()) and
(%resource.dosage.timing.repeat.where('sun' in dayOfWeek).timeOfDay.distinct().count() = %resource.dosage.timing.repeat.where('sun' in dayOfWeek).timeOfDay.count())
))
)
)
)
)
|
| dos-1 | error | Dosage | AsNeededFor can only be set if AsNeeded is empty or true |
extension.where(url='http://hl7.org/fhir/5.0/StructureDefinition/extension-Dosage.asNeededFor').empty() or asNeeded.empty() or asNeeded
|
| ele-1 | error | **ALL** elements | All FHIR elements must have a @value or children |
hasValue() or (children().count() > id.count())
|
| ext-1 | error | **ALL** extensions | Must have either extensions or value[x], not both |
extension.exists() != value.exists()
|
| sqty-1 | error | Dosage.doseAndRate.dose[x]:doseRange.low, Dosage.doseAndRate.dose[x]:doseRange.high | The comparator is not used on a SimpleQuantity |
comparator.empty()
|
This structure is derived from DosageDE
Other representations of profile: CSV, Excel, Schematron