diff --git a/input/fsh/DkCoreCondition.fsh b/input/fsh/DkCoreCondition.fsh index faeaeb3b8..5cf749091 100644 --- a/input/fsh/DkCoreCondition.fsh +++ b/input/fsh/DkCoreCondition.fsh @@ -42,6 +42,27 @@ Description: "HL7 Denmark core profile for professionally asserted conditions, a * recorder only Reference(DkCorePractitioner or DkCorePractitionerRole or DkCorePatient or DkCoreRelatedPerson) * asserter only Reference(DkCorePractitioner or DkCorePractitionerRole) +Mapping: DkCoreConditionToDanishClassifications +Source: DkCoreCondition +Target: "https://medinfo.dk/sks/brows.php" +Title: "Danish Condition Classifications (SKS-D, ICPC-2, FSIII, FFB)" +Id: dk-core-condition-classifications +* -> "Condition / Tilstand" "**Danish condition-classification systems used across sectors. A single DkCoreCondition MAY carry multiple codings when the same condition is represented in more than one classification.**" +* code.coding[SCTConditionCode] -> "SNOMED CT" "International SNOMED CT condition code under `http://snomed.info/sct`; bound to the FHIR R4 condition-code value set." +* code.coding[SKS-D] -> "SKS (Sundhedsvæsenets Klassifikations System), D-hierarkiet" "Secondary-sector diagnosis code from the SKS D-hierarchy under `urn:oid:1.2.208.176.2.4.12`." +* code.coding[ICPC2code] -> "ICPC-2" "International Classification of Primary Care, 2nd edition under `urn:oid:1.2.208.176.2.31`. Primary-care / general practice." +* code.coding[FSIIIConditionCode] -> "FSIII tilstande" "Municipal-care condition code (Fælles Sprog III) under `urn:oid:1.2.208.176.2.21`." +* code.coding[FFBConditionCode] -> "FFB undertemaer" "Municipal rehabilitation sub-theme code (Fælles Faglige Begreber) under `urn:oid:1.2.208.176.2.22`." +* clinicalStatus -> "Klinisk status" "active / recurrence / relapse / inactive / remission / resolved." +* verificationStatus -> "Verifikationsstatus" "unconfirmed / provisional / differential / confirmed / refuted / entered-in-error." +* subject -> "Patient" "DkCorePatient reference." +* recorder -> "Registrerer" "Who recorded the condition (Practitioner / PractitionerRole / Patient / RelatedPerson)." +* asserter -> "Asserter" "Clinician asserting the condition (Practitioner / PractitionerRole)." +* extension[conditionLastAssertedDate] -> "Sidst bekræftet" "Last date the condition was confirmed valid in its current state (typically last follow-up)." +* extension[notFollowedAnymore] -> "Ikke længere fulgt" "Date the condition lost focus in a specific clinical context." +* extension[dueTo] -> "Forårsaget af" "Link to another condition / observation that caused this condition." + + Instance: ConditionPressureUlcer InstanceOf: DkCoreCondition Title: "John tryksår" diff --git a/input/fsh/DkCoreImmunization.fsh b/input/fsh/DkCoreImmunization.fsh new file mode 100644 index 000000000..c81e780b8 --- /dev/null +++ b/input/fsh/DkCoreImmunization.fsh @@ -0,0 +1,109 @@ +Profile: DkCoreImmunization +Parent: Immunization +Id: dk-core-immunization +Title: "Danish Core Immunization Profile" +Description: "HL7 Denmark core profile for an administered vaccination, aligned with Det Danske Vaccinationsregister (DDV) interface 1.4.0 + E1. A registered DDV `Vaccination` is **always** an administered/effectuated vaccination, so `status` is essentially always `completed`; `ActiveStatus` is only used to mark a deletion (a `Vaccination` may exist in several versions with `Status=A` (Active) and later be deleted, whereby the latest version gets `Status=D` (Deleted)) which maps to `entered-in-error`. Refusals/omissions are **not** recorded as DDV Vaccinations, so FHIR `status = not-done` / `statusReason` cannot be derived from DDV. Authoritative DDV XML schemas are published at https://wiki.fmk-teknik.dk/fmk:ddv:extensions:e1 with target namespace `http://vaccinationsregister.dk/schemas/2013/12/01`. A DDV `Vaccination` carries a numeric `VaccinationIdentifier` (with `VaccinationVersionIdentifier` as a revision/optimistic-locking token, mapped to `meta.versionId`), a structured `Vaccine` element (VaccineIdentifier + VaccineName + Disease[] + ATC + SSIDrug[]), an optional `Effectuated` structure (date, effectuator name, authorisation and organisation), an optional `EffectuatedPlannedItem` (course/series context), `CoverageDuration`, `BatchNumber`, `ActiveStatus`, `NegativeConsentIndicator` (citizen private-marking, not a refusal), `VaccinationCredibility` (credibility enum whose values include `Oprettet af borger` / citizen-created), and flags such as `IsPrevious` and `ConfirmedByPrescriptionServer`." +* ^status = #active +* identifier ^slicing.discriminator.type = #value + * ^slicing.discriminator.path = "system" + * ^slicing.rules = #open + * ^slicing.ordered = false + * ^slicing.description = "Slice identifier by system to carry the DDV VaccinationIdentifier" +* identifier contains + DdvVaccinationId 0..1 +* identifier[DdvVaccinationId] ^short = "[DA] DDV VaccinationIdentifier - unik identifikation af en vaccination (positiv long)." + * system 1.. + * system = $DdvVaccinationId (exactly) + * value 1.. +* meta.versionId ^short = "[DA] DDV VaccinationVersionIdentifier - revisionsnummer for vaccinationen. Bruges internt i DDV til optimistic locking ved updates og svarer til FHIRs versionsmekanisme (meta.versionId / _history)." +* meta.security ^short = "[DA] Privatmarkering. Når DDV Vaccination.NegativeConsentIndicator = true har borgeren ønsket at privatmarkere vaccinationen. Den er stadig effektueret på lige fod med øvrige registreringer (status = completed), men må ikke synliggøres med mindre den sundhedsansvarlige anvender værdispring eller har samtykke. Markeres som dk-core gør på Patient: meta.security = http://terminology.hl7.org/CodeSystem/v3-Confidentiality#R (Restricted)." +* status ^short = "Status for vaccinationen. En registreret DDV Vaccination er altid effektueret, så `completed` er den normale værdi (DDV Vaccination.ActiveStatus = true / Status=A). `entered-in-error` bruges når en vaccination er slettet i DDV (ActiveStatus = false / seneste version Status=D). DDV registrerer ikke afviste/undladte vaccinationer, så `not-done`/`statusReason` kan IKKE udledes af DDV. NegativeConsentIndicator er ikke en afvisning, men en privatmarkering - se meta.security." +* statusReason ^short = "Kan IKKE udledes af DDV Vaccination-registreringer. Afviste/undladte vaccinationer registreres ikke som DDV Vaccinations, og historiske PlannedVaccinations kan ikke hentes via snitfladen." +* vaccineCode ^short = "Vaccinen. DDV leverer strukturen DDV Vaccination.Vaccine som VaccineName (≤100 tegn fritekst), ATC (Code + Text), Disease[] (sygdom m. ATC), SSIDrug[] (SSI-lægemiddel) og DisplayMinimumVaccinationPlan[]. VaccineName mappes til vaccineCode.text; ATC til vaccineCode.coding[ATC]." +* vaccineCode.coding ^slicing.discriminator.type = #value + * ^slicing.discriminator.path = "system" + * ^slicing.rules = #open + * ^slicing.ordered = false + * ^slicing.description = "Slice vaccineCode.coding by system to accommodate ATC or SNOMED CT coding alongside the DDV VaccineName free text" +* vaccineCode.coding contains + ATC 0..1 and + SCTVaccineCode 0..1 and + DdvVaccine 0..1 +* vaccineCode.coding[ATC] ^short = "WHO ATC code for vaccinen (J07-gruppen). In DDV: Vaccination.Vaccine.ATC.Code / ATC.Text." + * system 1.. + * system = $atc (exactly) + * code 1.. +* vaccineCode.coding[SCTVaccineCode] ^short = "SNOMED CT code for vaccinen." + * system 1.. + * system = "http://snomed.info/sct" + * code 1.. +* vaccineCode.coding[DdvVaccine] ^short = "[DA] DDV VaccineIdentifier - SSI-numerisk identifikation af vaccinen (findes på Vaccination.Vaccine.VaccineIdentifier)." + * system 1.. + * system = $DdvVaccineId (exactly) + * code 1.. +* patient only Reference(DkCorePatient) +* patient 1.. +* occurrence[x] ^short = "Tidspunktet hvor vaccinationen blev givet. Mappes fra DDV Vaccination.EffectuatedDateTime (eller Vaccination.Effectuated.EffectuatedDateTime når effektueringen er leveret som struktureret element)." +* recorded ^short = "Tidspunkt hvor vaccinationen blev registreret i DDV. Mappes fra DDV Vaccination.Created.CreatedDateTime når det findes; falder tilbage til EffectuatedDateTime." +* performer.actor only Reference(DkCorePractitioner or DkCorePractitionerRole or DkCoreOrganization) +* performer.actor ^short = "Den der har effektueret vaccinationen. DDV Vaccination.Effectuated.EffectuatedByName er en fritekst (≤200 tegn) og placeres i actor.display når en egentlig reference ikke er tilgængelig. Strukturerede felter: Effectuated.AuthorisationIdentifier (yder-/autorisationsnummer), Effectuated.EffectuatedByOrganisationName / Number / Type, Effectuated.EffectuatedInCountryCode." +* lotNumber ^short = "Batchnummer. In DDV: Vaccination.BatchNumber." +* protocolApplied.targetDisease ^short = "Sygdom(me) vaccinationen beskytter imod. In DDV: Vaccination.Vaccine.Disease[] (DiseaseIdentifier + DiseaseName + DiseaseNameDK + ATC)." +* protocolApplied ^short = "Vaccinationsforløb/-serie. Hvis effektueringen er sket som del af et vaccinationsforløb, findes oplysninger om forløbet typisk i DDV Vaccination.EffectuatedPlannedItem." +* note ^short = "Fri tekst. Anvendes blandt andet til DDV CoverageDuration og felter uden et dedikeret Immunization-element. `VaccinationCredibility` angiver troværdighed/oprindelse (fx \"Oprettet af borger\" = borger-registreret). `IsPrevious = true` angiver at selve effektueringen er sket på et andet tidspunkt, sted og/eller af en anden person end den der registrerer - fx vaccinationer modtaget i udlandet eller før registrering i DDV blev lovpligtig; sådanne tidligere vaccinationer kan oprettes af både sundhedsfaglige og borgeren selv (afspejles i VaccinationCredibility). `ConfirmedByPrescriptionServer` har kun historisk interesse og siger noget om datakvaliteten - tilsvarende kan aflæses i VaccinationCredibility." + + +Mapping: DkCoreImmunizationToDdv +Source: DkCoreImmunization +Target: "https://wiki.fmk-teknik.dk/fmk:ddv:extensions:e1" +Title: "Det Danske Vaccinationsregister (DDV)" +Id: dk-core-immunization-ddv +* -> "Vaccination" "**DDV Vaccination (namespace `http://vaccinationsregister.dk/schemas/2013/12/01`).**" +* identifier[DdvVaccinationId] -> "Vaccination.VaccinationIdentifier" "Numeric DDV identifier of the vaccination (positive long)." +* meta.versionId -> "Vaccination.VaccinationVersionIdentifier" "Revision number, used internally in DDV for optimistic locking on updates. Maps to FHIR's resource versioning mechanism (`meta.versionId` / `_history`)." +* status -> "Vaccination.ActiveStatus" "A registered DDV Vaccination is always effectuated, so `completed` is the normal value (ActiveStatus = true / Status=A). `entered-in-error` when the vaccination has been deleted (ActiveStatus = false / latest version Status=D). DDV does not record refusals/omissions, so `not-done`/`statusReason` cannot be derived." +* meta.security -> "Vaccination.NegativeConsentIndicator" "`NegativeConsentIndicator = true` is a citizen private-marking (not a refusal); the vaccination is still effectuated. Carried as `meta.security = http://terminology.hl7.org/CodeSystem/v3-Confidentiality#R`, mirroring DkCorePatient. Only visible via værdispring/consent." +* vaccineCode -> "Vaccination.Vaccine" "Structured DDV `Vaccine` (VaccineName + ATC + Disease[] + SSIDrug[] + …)." +* vaccineCode.coding[ATC] -> "Vaccination.Vaccine.ATC.Code / ATC.Text" "WHO ATC code - typically J07*." +* vaccineCode.coding[DdvVaccine] -> "Vaccination.Vaccine.VaccineIdentifier" "SSI numeric vaccine identifier." +* vaccineCode.text -> "Vaccination.Vaccine.VaccineName" "Free-text product name (≤100 chars)." +* patient -> "Patient" "Vaccinated patient (CPR reference in DDV)." +* occurrence[x] -> "Vaccination.EffectuatedDateTime / Vaccination.Effectuated.EffectuatedDateTime" "Time the vaccination was administered." +* recorded -> "Vaccination.Created.CreatedDateTime" "Time the vaccination record was created in DDV." +* performer.actor -> "Vaccination.Effectuated.EffectuatedByName / AuthorisationIdentifier / EffectuatedByOrganisationName / Number" "Who effectuated the vaccination. DDV often provides this as free text (EffectuatedByName); map to `actor.display` when no structured reference is available, or resolve `AuthorisationIdentifier` / organisation details to a DkCorePractitioner / DkCoreOrganization reference where possible." +* lotNumber -> "Vaccination.BatchNumber" "Lot / batch number." +* protocolApplied.targetDisease -> "Vaccination.Vaccine.Disease[]" "Target disease(s) with optional DiseaseIdentifier + DiseaseName(DK) + ATC." +* protocolApplied -> "Vaccination.EffectuatedPlannedItem" "When the effectuation is part of a vaccination course/series, course information is usually found in the DDV `EffectuatedPlannedItem` element." +* note -> "Vaccination.CoverageDuration / VaccinationCredibility / IsPrevious / ConfirmedByPrescriptionServer" "Free-text notes for DDV fields without a dedicated Immunization element. `IsPrevious = true` = the effectuation happened at another time/place/person than the registrar (e.g. abroad or before DDV registration was mandatory; may be created by professionals or the citizen). `ConfirmedByPrescriptionServer` has historical interest only (data quality), mirrored by `VaccinationCredibility`. `VaccinationCredibility` enum: `Slettet`, `Oprettet af læge / medhjælp`, `Oprettet på baggrund af data fra Sygesikringsregisteret`, `Udleveret på apotek og godkendt af læge`, `Oprettet af læge eller oprettet af borger og godkendt af læge`, `Udleveret på apotek`, `Oprettet af borger`." + + +Instance: JohnImmunizationInfluvac +InstanceOf: DkCoreImmunization +Title: "John's Influvac vaccination" +Description: "Example DkCoreImmunization derived from a DDV Vaccination record for influenza (Influvac)." +Usage: #example +* identifier[DdvVaccinationId].system = $DdvVaccinationId +* identifier[DdvVaccinationId].value = "32206056656" +* status = #completed +* vaccineCode.text = "Influvac mod Influenza" +* vaccineCode.coding[ATC] = $atc#J07BB02 "Influenza, inactivated, split virus or surface antigen" +* patient = Reference(Patient/john) +* occurrenceDateTime = "2025-09-30T09:11:14+02:00" +* recorded = "2025-09-30T09:11:14+02:00" +* performer.actor.display = "Danske Lægers Vaccinations Service" +* note[+].text = "CoverageDuration: 1 year" +* note[+].text = "VaccinationCredibility: Oprettet af læge / medhjælp" + + +Instance: JohnImmunizationNegativeConsent +InstanceOf: DkCoreImmunization +Title: "John's privatmarkerede vaccination" +Description: "Example DkCoreImmunization for a DDV Vaccination where NegativeConsentIndicator = true. The vaccination is still effectuated (status = completed); the citizen has private-marked it, so it carries a Restricted confidentiality security label and is only visible via værdispring or consent." +Usage: #example +* meta.security = $v3-Confidentiality#R "Restricted" +* identifier[DdvVaccinationId].system = $DdvVaccinationId +* identifier[DdvVaccinationId].value = "1" +* status = #completed +* vaccineCode.text = "Example Vaccine" +* patient = Reference(Patient/john) +* occurrenceDateTime = "2025-09-30" diff --git a/input/fsh/DkCoreMedication.fsh b/input/fsh/DkCoreMedication.fsh new file mode 100644 index 000000000..d4a496764 --- /dev/null +++ b/input/fsh/DkCoreMedication.fsh @@ -0,0 +1,65 @@ +Profile: DkCoreMedication +Parent: Medication +Id: dk-core-medication +Title: "Danish Core Medication Profile" +Description: "HL7 Denmark core profile for a medicinal product, aligned with the Danish Shared Medication Record (Fælles Medicinkort, FMK). Used where richer structured data about a drug is needed than fits in an inline CodeableConcept on MedicationRequest / MedicationStatement." +* ^status = #active +* code.coding ^slicing.discriminator.type = #value + * ^slicing.discriminator.path = "system" + * ^slicing.rules = #open + * ^slicing.ordered = false + * ^slicing.description = "Slice code.coding by system to accommodate the terminologies FMK uses for a drug" +* code.coding contains + ATC 0..1 and + ActiveSubstance 0..1 and + Varenummer 0..1 +* code.coding[ATC] + * ^short = "WHO ATC code. In FMK: DrugMedication.Drug.ATC (Code + Text)." + * system 1.. + * system = $atc (exactly) + * code 1.. +* code.coding[ActiveSubstance] + * ^short = "[DA] Aktivt stof. In FMK: DrugMedication.Drug.Substances.ActiveSubstance." + * system 1.. + * system = $FmkActiveSubstance (exactly) + * code 1.. +* code.coding[Varenummer] + * ^short = "[DA] Varenummer fra Medicinpriser (LMS01 felt 1, 11-cifret). In FMK: DrugMedication.Drug.Identifier (source = Medicinpriser / Local / Magistrel / Stærke vitaminer m.v. / Tilknyttede behandlinger)." + * system 1.. + * system = $FmkDrugId (exactly) + * code 1.. +* form ^short = "[DA] Lægemiddelform. In FMK: DrugMedication.Drug.Form (Code + Text)." +* ingredient.strength ^short = "[DA] Styrke. In FMK: DrugMedication.Drug.Strength (Value + UnitCode + UnitText, or free text)." +* manufacturer only Reference(DkCoreOrganization) + + +Mapping: DkCoreMedicationToFmk +Source: DkCoreMedication +Target: "https://wiki.fmk-teknik.dk/fmk:extensions:e5" +Title: "Fælles Medicinkort (FMK)" +Id: dk-core-medication-fmk +* -> "DrugMedication.Drug" "**Named medicinal product within an FMK DrugMedication (lægemiddelordination).**" +* code.coding[ATC] -> "DrugMedication.Drug.ATC.Code / ATC.Text" "WHO ATC code." +* code.coding[ActiveSubstance] -> "DrugMedication.Drug.Substances.ActiveSubstance" "Active-substance coding (source: Medicinpriser / Local / Magistrel)." +* code.coding[Varenummer] -> "DrugMedication.Drug.Identifier" "Danish drug product number (varenummer, 11-digit, Medicinpriser)." +* code.text -> "DrugMedication.Drug.Name (+ Form/Strength)" "Free-text rendering of the drug name, form and strength." +* form -> "DrugMedication.Drug.Form" "Lægemiddelform (Code + Text)." +* ingredient.strength -> "DrugMedication.Drug.Strength" "Styrke (Value + UnitCode + UnitText, or free text)." +* manufacturer -> "DrugMedication.Drug (manufacturer)" "Organisation reference for the drug manufacturer." + + +Instance: SimvastatinActavis40mg +InstanceOf: DkCoreMedication +Title: "Simvastatin \"Actavis\" 40 mg filmovertrukne tabletter" +Description: "Example DkCoreMedication for a named Simvastatin product, as it might be drawn from FMK's DrugMedication." +Usage: #example +* code.coding[ATC] = $atc#C10AA01 "Simvastatin" +* code.coding[ActiveSubstance].system = $FmkActiveSubstance +* code.coding[ActiveSubstance].code = #simvastatin +* code.coding[ActiveSubstance].display = "Simvastatin" +* code.text = "Simvastatin \"Actavis\" filmovertrukne tabletter 40 mg" +* status = #active +* form.text = "filmovertrukne tabletter" +* ingredient.itemCodeableConcept.coding = $FmkActiveSubstance#simvastatin "Simvastatin" +* ingredient.strength.numerator = 40 'mg' "mg" +* ingredient.strength.denominator = 1 '{tablet}' "tablet" diff --git a/input/fsh/DkCoreMedicationRequest.fsh b/input/fsh/DkCoreMedicationRequest.fsh new file mode 100644 index 000000000..f70ec5a1a --- /dev/null +++ b/input/fsh/DkCoreMedicationRequest.fsh @@ -0,0 +1,140 @@ +Profile: DkCoreMedicationRequest +Parent: MedicationRequest +Id: dk-core-medicationrequest +Title: "Danish Core MedicationRequest Profile" +Description: "HL7 Denmark core profile for medication orders (ordinationer), aligned with the Danish Shared Medication Record (Fælles Medicinkort, FMK) and the HL7 Europe Base MedicationRequest profile." +* ^status = #active +* ^extension[+].url = $imposeProfile +* ^extension[=].valueCanonical = $eu-medicationRequest +* extension contains + $mr-effectiveDosePeriod named effectiveDosePeriod 0..1 and + $mr-renderedDosageInstruction named renderedDosageInstruction 0..1 +* extension[effectiveDosePeriod] ^short = "R5 back-port: period over which the medication is to be taken. In FMK: DrugMedication.BeginEndDate.TreatmentStartDate / TreatmentEndDate." +* extension[renderedDosageInstruction] ^short = "R5 back-port: full human-rendered dosage instruction. In FMK: Dosage.Text." +* identifier ^slicing.discriminator.type = #value + * ^slicing.discriminator.path = "system" + * ^slicing.rules = #open + * ^slicing.ordered = false + * ^slicing.description = "Slice identifier by system to carry the FMK DrugMedicationIdentifier." +* identifier contains + FmkDrugMedicationId 0..1 and + FmkDrugMedicationVersion 0..1 +* identifier[FmkDrugMedicationId] ^short = "[DA] FMK DrugMedicationIdentifier - unik identifikation af lægemiddelordinationen (positiv long)." + * system 1.. + * system = $FmkDrugMedicationId (exactly) + * value 1.. +* identifier[FmkDrugMedicationVersion] ^short = "[DA] FMK DrugMedication.Version - pairs with FmkDrugMedicationId to identify a specific revision of the lægemiddelordination." + * system 1.. + * system = $FmkDrugMedicationVersion (exactly) + * value 1.. +* status ^short = "Status for ordinationen. `active` = aktiv på medicinkortet; `stopped` = seponeret (DrugMedication.Withdrawn er sat); `on-hold` = pauseret (DrugMedication.Paused er sat); `completed` = afsluttet behandling." +* intent ^short = "FMK ordinationer modelleres typisk som intent = order." +* medication[x] only CodeableConcept or Reference(DkCoreMedication) +* medicationCodeableConcept.coding ^slicing.discriminator.type = #value + * ^slicing.discriminator.path = "system" + * ^slicing.rules = #open + * ^slicing.ordered = false + * ^slicing.description = "Slice medication.coding by system to accommodate the terminologies FMK uses for a drug" +* medicationCodeableConcept.coding contains + ATC 0..1 and + ActiveSubstance 0..1 +* medicationCodeableConcept.coding[ATC] + * ^short = "WHO ATC code for the ordinated drug. In FMK: DrugMedication.Drug.ATC (Code + Text)." + * system 1.. + * system = $atc (exactly) + * code 1.. +* medicationCodeableConcept.coding[ActiveSubstance] + * ^short = "[DA] Aktivt stof for ordinationen. In FMK: DrugMedication.Drug.Substances.ActiveSubstance." + * system 1.. + * system = $FmkActiveSubstance (exactly) + * code 1.. +* subject only Reference(DkCorePatient) +* subject 1.. +* requester only Reference(DkCorePractitioner or DkCorePractitionerRole or DkCoreOrganization or DkCorePatient or DkCoreRelatedPerson or Device) +* recorder only Reference(DkCorePractitioner or DkCorePractitionerRole) +* performer only Reference(DkCorePractitioner or DkCorePractitionerRole or DkCoreOrganization or DkCorePatient or DkCoreRelatedPerson or Device or CareTeam) +* reasonReference only Reference(DkCoreCondition or DkCoreObservation) +* reasonCode ^short = "Indikation / årsag for ordinationen. In FMK: DrugMedication.Indication (Code + Text, or FreeText)." +* dosageInstruction ^short = "Dosering. In FMK: DrugMedication.Dosage (prefer the renderedDosageInstruction extension for the full FMK dosage text) and DrugMedication.RouteOfAdministration (Code + Text) for the route." +* dispenseRequest.performer only Reference(DkCoreOrganization) + + +Mapping: DkCoreMedicationRequestToFmk +Source: DkCoreMedicationRequest +Target: "https://wiki.fmk-teknik.dk/fmk:extensions:e5" +Title: "Fælles Medicinkort (FMK)" +Id: dk-core-medicationrequest-fmk +* -> "DrugMedication" "**FMK lægemiddelordination (DrugMedication on the medicine card).**" +* identifier[FmkDrugMedicationId] -> "DrugMedication.Identifier" "DrugMedicationIdentifier - unique id of the lægemiddelordination." +* identifier[FmkDrugMedicationVersion] -> "DrugMedication.Version" "Revision number, carried alongside the identifier when a specific version of the ordination is being referenced." +* status -> "DrugMedication.Withdrawn / DrugMedication.Paused" "`active` = neither Withdrawn nor Paused; `stopped` = Withdrawn element present (seponeret); `on-hold` = Paused element present; `completed` = behandlingsperiode afsluttet." +* intent -> "Ordination" "FMK ordinations are typically modelled as `intent = order`." +* medicationCodeableConcept.coding[ATC] -> "DrugMedication.Drug.ATC.Code / ATC.Text" "WHO ATC code." +* medicationCodeableConcept.coding[ActiveSubstance] -> "DrugMedication.Drug.Substances.ActiveSubstance" "Active-substance coding (source: Medicinpriser / Local / Magistrel)." +* medicationCodeableConcept.text -> "DrugMedication.Drug.Name (+ Form/Strength)" "Free-text rendering of the drug name, form and strength." +* subject -> "DrugMedication (context patient)" "FMK patient reference (the MedicineCard.Patient that owns the DrugMedication)." +* authoredOn -> "DrugMedication.Created / DrugMedication.BeginEndDate.CreatedDateTime" "When the ordination was authored." +* requester -> "DrugMedication.Created.By / DrugMedication.ReportedBy" "Ordinerende behandler (prescriber). `ReportedBy` is the E5 addition." +* reasonCode -> "DrugMedication.Indication" "Indikation / årsag (Code + Text, or FreeText)." +* dosageInstruction.text -> "DrugMedication.Dosage" "Human-rendered dosage." +* dosageInstruction.route -> "DrugMedication.RouteOfAdministration" "Administration route (Code + Text)." +* extension[effectiveDosePeriod] -> "DrugMedication.BeginEndDate.TreatmentStartDate / TreatmentEndDate" "R5 back-port: treatment period. FMK also supports `TreatmentStartedPreviously` and `TreatmentEndingUndetermined` as alternatives to concrete dates." +* extension[renderedDosageInstruction] -> "DrugMedication.Dosage" "R5 back-port: full human-rendered dosage string." + + +Instance: JohnMedicationRequestSimvastatin +InstanceOf: DkCoreMedicationRequest +Title: "John's Simvastatin ordination" +Description: "Example of a DkCoreMedicationRequest derived from an FMK lægemiddelordination for Simvastatin 40 mg." +Usage: #example +* identifier[FmkDrugMedicationId].system = $FmkDrugMedicationId +* identifier[FmkDrugMedicationId].value = "987654321" +* status = #active +* intent = #order +* medicationCodeableConcept.coding[ATC] = $atc#C10AA01 "Simvastatin" +* medicationCodeableConcept.coding[ActiveSubstance].system = $FmkActiveSubstance +* medicationCodeableConcept.coding[ActiveSubstance].code = #simvastatin +* medicationCodeableConcept.coding[ActiveSubstance].display = "Simvastatin" +* medicationCodeableConcept.text = "Simvastatin \"Actavis\" filmovertrukne tabletter 40 mg" +* subject = Reference(Patient/john) +* authoredOn = "2024-03-15" +* requester = Reference(Practitioner/AbrahamLaege) +* reasonCode.text = "Hyperkolesterolæmi" +* dosageInstruction + * text = "1 tablet dagligt til aftensmad" + * route = http://snomed.info/sct#26643006 "Oral route" +* extension[effectiveDosePeriod].valuePeriod.start = "2024-03-15" +* extension[renderedDosageInstruction].valueMarkdown = "1 tablet (40 mg) dagligt til aftensmad, til kontrol" + + +Instance: JohnMedicationRequestWithMedicationRef +InstanceOf: DkCoreMedicationRequest +Title: "John's Simvastatin ordination (with Medication reference)" +Description: "Example using Reference(DkCoreMedication) rather than inline CodeableConcept, demonstrating the EU-compatible path." +Usage: #example +* identifier[FmkDrugMedicationId].system = $FmkDrugMedicationId +* identifier[FmkDrugMedicationId].value = "987654322" +* status = #active +* intent = #order +* medicationReference = Reference(Medication/SimvastatinActavis40mg) +* subject = Reference(Patient/john) +* authoredOn = "2024-03-15" +* requester = Reference(Practitioner/AbrahamLaege) +* dosageInstruction.text = "1 tablet dagligt til aftensmad" + + +Instance: JohnMedicationRequestStopped +InstanceOf: DkCoreMedicationRequest +Title: "John's seponerede Metformin ordination" +Description: "Example of a DkCoreMedicationRequest that has been stopped (seponeret) in FMK (the DrugMedication.Withdrawn element is set)." +Usage: #example +* identifier[FmkDrugMedicationId].system = $FmkDrugMedicationId +* identifier[FmkDrugMedicationId].value = "987654323" +* status = #stopped +* intent = #order +* medicationCodeableConcept.coding[ATC] = $atc#A10BA02 "Metformin" +* medicationCodeableConcept.text = "Metformin 500 mg" +* subject = Reference(Patient/john) +* authoredOn = "2023-11-01" +* requester = Reference(Practitioner/AbrahamLaege) +* dosageInstruction.text = "2 tabletter morgen og aften" diff --git a/input/fsh/DkCoreMedicationStatement.fsh b/input/fsh/DkCoreMedicationStatement.fsh new file mode 100644 index 000000000..7b0ee3802 --- /dev/null +++ b/input/fsh/DkCoreMedicationStatement.fsh @@ -0,0 +1,118 @@ +Profile: DkCoreMedicationStatement +Parent: MedicationStatement +Id: dk-core-medicationstatement +Title: "Danish Core MedicationStatement Profile" +Description: "HL7 Denmark core profile for a statement about medication being taken by a patient, aligned with the Danish Shared Medication Record (Fælles Medicinkort, FMK) and the HL7 Europe Base MedicationStatement profile. Intended to represent the current, authoritative medication card snapshot (aktuelt medicinbillede)." +* ^status = #active +* ^extension[+].url = $imposeProfile +* ^extension[=].valueCanonical = $eu-medicationStatement +* extension contains + $ms-adherence named adherence 0..1 +* extension[adherence] ^short = "R5 back-port: whether the medication is being taken / refused / stopped. In FMK, presence of DrugMedication.Withdrawn (seponering) or DrugMedication.Paused should be surfaced here with an appropriate adherence code in addition to (or instead of) status." +* identifier ^slicing.discriminator.type = #value + * ^slicing.discriminator.path = "system" + * ^slicing.rules = #open + * ^slicing.ordered = false + * ^slicing.description = "Slice identifier by system to carry the FMK DrugMedicationIdentifier." +* identifier contains + FmkDrugMedicationId 0..1 and + FmkDrugMedicationVersion 0..1 +* identifier[FmkDrugMedicationId] ^short = "[DA] FMK DrugMedicationIdentifier (positiv long)." + * system 1.. + * system = $FmkDrugMedicationId (exactly) + * value 1.. +* identifier[FmkDrugMedicationVersion] ^short = "[DA] FMK DrugMedication.Version - pairs with FmkDrugMedicationId to identify a specific revision of the lægemiddelordination on the medicinkort." + * system 1.. + * system = $FmkDrugMedicationVersion (exactly) + * value 1.. +* status ^short = "Status of the medication card entry. `active` = aktiv på medicinkortet; `on-hold` = Paused; `stopped` = seponeret (DrugMedication.Withdrawn er sat); `completed` = afsluttet behandling." +* medication[x] only CodeableConcept or Reference(DkCoreMedication) +* medicationCodeableConcept.coding ^slicing.discriminator.type = #value + * ^slicing.discriminator.path = "system" + * ^slicing.rules = #open + * ^slicing.ordered = false + * ^slicing.description = "Slice medication.coding by system to accommodate the terminologies FMK uses for a drug" +* medicationCodeableConcept.coding contains + ATC 0..1 and + ActiveSubstance 0..1 +* medicationCodeableConcept.coding[ATC] + * ^short = "WHO ATC code. In FMK: DrugMedication.Drug.ATC (Code + Text)." + * system 1.. + * system = $atc (exactly) + * code 1.. +* medicationCodeableConcept.coding[ActiveSubstance] + * ^short = "[DA] Aktivt stof. In FMK: DrugMedication.Drug.Substances.ActiveSubstance." + * system 1.. + * system = $FmkActiveSubstance (exactly) + * code 1.. +* subject only Reference(DkCorePatient) +* subject 1.. +* informationSource only Reference(DkCorePractitioner or DkCorePractitionerRole or DkCoreOrganization or DkCorePatient or DkCoreRelatedPerson) +* reasonReference only Reference(DkCoreCondition or DkCoreObservation) +* reasonCode ^short = "Indikation / årsag. In FMK: DrugMedication.Indication (Code + Text, or FreeText)." +* effective[x] only dateTime or Period +* effective[x] ^short = "When the medication is/was being taken. Prefer effectivePeriod when both start and end (or open-ended start) are known - maps to FMK DrugMedication.BeginEndDate.TreatmentStartDate / TreatmentEndDate. Use effectiveDateTime only for point-in-time statements." +* dateAsserted ^short = "Tidspunkt hvor udsagnet om medicineringen blev indført. Typisk hentningstidspunktet for medicinkortet." +* dosage ^short = "Dosering. In FMK: DrugMedication.Dosage; DrugMedication.RouteOfAdministration (Code + Text) maps to dosage.route." + + +Mapping: DkCoreMedicationStatementToFmk +Source: DkCoreMedicationStatement +Target: "https://wiki.fmk-teknik.dk/fmk:extensions:e5" +Title: "Fælles Medicinkort (FMK)" +Id: dk-core-medicationstatement-fmk +* -> "MedicineCard.DrugMedication" "**Snapshot of a lægemiddelordination on the FMK medicinkort (aktuelt medicinbillede).**" +* identifier[FmkDrugMedicationId] -> "DrugMedication.Identifier" "DrugMedicationIdentifier - unique id of the lægemiddelordination." +* identifier[FmkDrugMedicationVersion] -> "DrugMedication.Version" "Revision number, carried alongside the identifier when a specific version of the ordination is being referenced." +* status -> "DrugMedication.Withdrawn / DrugMedication.Paused" "`active` = neither Withdrawn nor Paused; `on-hold` = Paused element present; `stopped` = Withdrawn element present (seponeret) - SHOULD be supplemented via the adherence extension; `completed` = behandlingsperiode afsluttet; `entered-in-error` / `unknown` as per FHIR." +* medicationCodeableConcept.coding[ATC] -> "DrugMedication.Drug.ATC.Code / ATC.Text" "WHO ATC code for the drug." +* medicationCodeableConcept.coding[ActiveSubstance] -> "DrugMedication.Drug.Substances.ActiveSubstance" "Active-substance coding (source: Medicinpriser / Local / Magistrel)." +* medicationCodeableConcept.text -> "DrugMedication.Drug.Name (+ Form/Strength)" "Free-text rendering of the drug name, form and strength." +* subject -> "MedicineCard.Patient" "FMK patient reference." +* effective[x] -> "DrugMedication.BeginEndDate.TreatmentStartDate / TreatmentEndDate" "Prefer `effectivePeriod` when start and/or end are known; use `effectiveDateTime` for point-in-time statements. FMK also supports `TreatmentStartedPreviously` and `TreatmentEndingUndetermined`." +* dateAsserted -> "MedicineCard retrieval timestamp" "Timestamp of the FMK medicinkort retrieval (NOT the ordination date). In FMK, see GetMedicineCardResponse." +* reasonCode -> "DrugMedication.Indication" "Indikation / årsag (Code + Text, or FreeText)." +* dosage.text -> "DrugMedication.Dosage" "Human-rendered dosage." +* dosage.route -> "DrugMedication.RouteOfAdministration" "Administration route (Code + Text)." +* extension[adherence] -> "DrugMedication.Withdrawn / Paused" "R5 adherence code (e.g. `stopped`, `not-taking`, `on-hold`) for richer semantics than `status` alone." + + +Instance: JohnMedicationStatementSimvastatin +InstanceOf: DkCoreMedicationStatement +Title: "John's aktive Simvastatin på medicinkortet" +Description: "Example DkCoreMedicationStatement derived from the current FMK medicinkort for Simvastatin." +Usage: #example +* identifier[FmkDrugMedicationId].system = $FmkDrugMedicationId +* identifier[FmkDrugMedicationId].value = "987654321" +* status = #active +* medicationCodeableConcept.coding[ATC] = $atc#C10AA01 "Simvastatin" +* medicationCodeableConcept.coding[ActiveSubstance].system = $FmkActiveSubstance +* medicationCodeableConcept.coding[ActiveSubstance].code = #simvastatin +* medicationCodeableConcept.coding[ActiveSubstance].display = "Simvastatin" +* medicationCodeableConcept.text = "Simvastatin \"Actavis\" filmovertrukne tabletter 40 mg" +* subject = Reference(Patient/john) +* effectivePeriod.start = "2024-03-15" +* dateAsserted = "2026-04-20" +* reasonCode.text = "Hyperkolesterolæmi" +* dosage.text = "1 tablet dagligt til aftensmad" +* dosage.route = http://snomed.info/sct#26643006 "Oral route" + + +Instance: JohnMedicationStatementStopped +InstanceOf: DkCoreMedicationStatement +Title: "John's seponerede Metformin" +Description: "Example DkCoreMedicationStatement for a medication that has been stopped (seponeret i FMK, dvs. DrugMedication.Withdrawn er sat). Note: uses the adherence extension in addition to status = stopped to carry the richer R5 semantics." +Usage: #example +* identifier[FmkDrugMedicationId].system = $FmkDrugMedicationId +* identifier[FmkDrugMedicationId].value = "987654323" +* status = #stopped +* extension[adherence].extension[code].valueCodeableConcept.coding.system = "http://hl7.org/fhir/CodeSystem/medication-statement-adherence" +* extension[adherence].extension[code].valueCodeableConcept.coding.code = #stopped +* extension[adherence].extension[code].valueCodeableConcept.coding.display = "Stopped" +* medicationCodeableConcept.coding[ATC] = $atc#A10BA02 "Metformin" +* medicationCodeableConcept.text = "Metformin 500 mg" +* subject = Reference(Patient/john) +* effectivePeriod.start = "2022-05-01" +* effectivePeriod.end = "2023-11-01" +* dateAsserted = "2026-04-20" +* dosage.text = "2 tabletter morgen og aften" diff --git a/input/fsh/DkCoreMinimalDocumentReference.fsh b/input/fsh/DkCoreMinimalDocumentReference.fsh index f37d049aa..0d5d24a85 100644 --- a/input/fsh/DkCoreMinimalDocumentReference.fsh +++ b/input/fsh/DkCoreMinimalDocumentReference.fsh @@ -15,6 +15,30 @@ Description: "HL7 Denmark core profile for a Minimal DocumentReference inherited * subject only Reference(DkCorePatient) * context.sourcePatientInfo only Reference(DkCorePatient) +Mapping: DkCoreMinimalDocumentReferenceToXds +Source: DkCoreMinimalDocumentReference +Target: "https://profiles.ihe.net/ITI/TF/Volume3/ch-4.2.html" +Title: "IHE MHD / MedCom XDS DocumentEntry" +Id: dk-core-minimaldocref-xds +* -> "DocumentEntry" "**IHE MHD DocumentReference mapped to an XDS DocumentEntry. Format and category codings follow the Danish XDS OID (`urn:oid:1.2.208.184.100.9`) and the MedCom format OID (`urn:oid:1.2.208.184.100.10`).**" +* masterIdentifier -> "DocumentEntry.uniqueId" "[DocumentEntry.uniqueId](https://profiles.ihe.net/ITI/TF/Volume3/ch-4.2.html#4.2.3.2.26)" +* identifier -> "DocumentEntry.entryUUID" "[DocumentEntry.entryUUID](https://profiles.ihe.net/ITI/TF/Volume3/ch-4.2.html#4.2.3.2.7)" +* status -> "DocumentEntry.availabilityStatus" "[DocumentEntry.availabilityStatus](https://profiles.ihe.net/ITI/TF/Volume3/ch-4.2.html#4.2.3.2.2)" +* type -> "DocumentEntry.typeCode" "[DocumentEntry.typeCode](https://profiles.ihe.net/ITI/TF/Volume3/ch-4.2.html#4.2.3.2.28) - LOINC document type." +* category -> "DocumentEntry.classCode" "[DocumentEntry.classCode](https://profiles.ihe.net/ITI/TF/Volume3/ch-4.2.html#4.2.3.2.3) - bound to the Danish XDS category OID." +* subject -> "DocumentEntry.patientId" "[DocumentEntry.patientId](https://profiles.ihe.net/ITI/TF/Volume3/ch-4.2.html#4.2.3.2.16) - CPR-keyed." +* author -> "DocumentEntry.author" "[DocumentEntry.author](https://profiles.ihe.net/ITI/TF/Volume3/ch-4.2.html#4.2.3.2.1)" +* authenticator -> "DocumentEntry.legalAuthenticator" "[DocumentEntry.legalAuthenticator](https://profiles.ihe.net/ITI/TF/Volume3/ch-4.2.html#4.2.3.2.14)" +* securityLabel -> "DocumentEntry.confidentialityCode" "[DocumentEntry.confidentialityCode](https://profiles.ihe.net/ITI/TF/Volume3/ch-4.2.html#4.2.3.2.4)" +* content.attachment -> "DocumentEntry.repositoryUniqueId / size / hash / mimeType / language" "Physical document metadata and pointer." +* content.format -> "DocumentEntry.formatCode" "[DocumentEntry.formatCode](https://profiles.ihe.net/ITI/TF/Volume3/ch-4.2.html#4.2.3.2.8) - MedCom format OID (e.g. APD, PLR)." +* context.event -> "DocumentEntry.eventCodeList" "[DocumentEntry.eventCodeList](https://profiles.ihe.net/ITI/TF/Volume3/ch-4.2.html#4.2.3.2.6) - SKS event codes." +* context.facilityType -> "DocumentEntry.healthcareFacilityTypeCode" "[DocumentEntry.healthcareFacilityTypeCode](https://profiles.ihe.net/ITI/TF/Volume3/ch-4.2.html#4.2.3.2.10) - SOR organization-type binding." +* context.practiceSetting -> "DocumentEntry.practiceSettingCode" "[DocumentEntry.practiceSettingCode](https://profiles.ihe.net/ITI/TF/Volume3/ch-4.2.html#4.2.3.2.17) - SOR practice-setting binding." +* context.sourcePatientInfo -> "DocumentEntry.sourcePatientInfo" "[DocumentEntry.sourcePatientInfo](https://profiles.ihe.net/ITI/TF/Volume3/ch-4.2.html#4.2.3.2.23)" +* extension[versionid] -> "DocumentEntry.version" "R5 back-port: document version string." + + // DkCoreDocumentReference instance Instance: 94e65db8-2f0c-4a2c-a7c9-06a160d59a12 InstanceOf: DkCoreMinimalDocumentReference diff --git a/input/fsh/DkCoreOrganization.fsh b/input/fsh/DkCoreOrganization.fsh index 2d6b6b0a9..48ca9868f 100644 --- a/input/fsh/DkCoreOrganization.fsh +++ b/input/fsh/DkCoreOrganization.fsh @@ -42,6 +42,24 @@ Description: "HL7 Denmark core profile for a danish health organization" * ^short = "[DA] Producent Id" * type from $sor-organization-type (preferred) +Mapping: DkCoreOrganizationToDanishRegistries +Source: DkCoreOrganization +Target: "https://www.nspop.dk/display/public/web/SOR" +Title: "Danish Organization Registries (SOR, CVR, GLN, Ydernummer, FK-ORG, MedCom)" +Id: dk-core-organization-registries +* -> "Organization" "**Danish organizational identity registries. SOR is the primary source of truth for healthcare organizations; other slices carry the organization's cross-references to parallel registries.**" +* identifier[SOR-ID] -> "SOR (Sundhedsvæsenets Organisationsregister)" "SOR-id under `urn:oid:1.2.208.176.1.1`. Authoritative healthcare-organization registry." +* identifier[CVR-ID] -> "CVR (Det Centrale Virksomhedsregister)" "CVR-nummer under `http://cvr.dk`. The national business register." +* identifier[EAN-ID] -> "GLN (GS1)" "GLN / EAN location number under `https://www.gs1.org/gln`." +* identifier[Ydernummer] -> "Ydernummerregisteret" "Ydernummer under `urn:oid:1.2.208.176.1.4`. Regional register used for primary-care practice settlements." +* identifier[KOMBIT-ORG-ID] -> "FK-ORG (KOMBIT Organisationsregister)" "FK-ORG organizational-unit id under `https://kombit.dk/sts/organisation`. Municipal organization register." +* identifier[Kommunekode] -> "Kommunekoder" "Municipality code under `http://hl7.dk/fhir/core/CodeSystem/dk-core-municipality-codes`." +* identifier[Regionskode] -> "ISO 3166-2 (Danske regioner)" "Region code under `urn:iso:std:iso:3166:-2`." +* identifier[ProducentID] -> "MedCom ProducentID" "MedCom producer identifier under `http://medcomfhir.dk/ig/terminology/CodeSystem/MedComProducentID`." +* type -> "SOR enhedstype" "Organization type, preferred from the SOR organization-type value set." +* partOf -> "SOR parent unit" "Parent SOR unit in the organizational hierarchy." + + Instance: CenterForDiabetes InstanceOf: DkCoreOrganization Title: "Center for Diabetes" diff --git a/input/fsh/DkCorePatient.fsh b/input/fsh/DkCorePatient.fsh index 93215138e..d1f8ea87b 100644 --- a/input/fsh/DkCorePatient.fsh +++ b/input/fsh/DkCorePatient.fsh @@ -46,6 +46,27 @@ Description: "HL7 Denmark core profile for a patient" * link.other only Reference(DkCorePatient or DkCoreRelatedPerson) * contact.relationship from ExtendedPatientContactRelationship (extensible) +Mapping: DkCorePatientToCprAndDawa +Source: DkCorePatient +Target: "https://cpr.dk" +Title: "CPR-registeret (and DAWA for addresses)" +Id: dk-core-patient-cpr +* -> "Person" "**Danish person-identity registries. `identifier[cpr]` / `name[official]` / `gender` / `birthDate` / the official address extension derive from the CPR register; address is curated against DAWA.**" +* identifier[cpr] -> "CPR-nummer" "CPR-nummer under `urn:oid:1.2.208.176.1.2` - the national civil registration number." +* identifier[x-ecpr] -> "X-eCPR" "Externally assigned eCPR from the national eCPR service for persons without a permanent CPR (e.g. foreign patients, newborns pre-registration)." +* identifier[d-ecpr] -> "D-eCPR" "Decentralised eCPR assigned locally." +* name[official] -> "CPR officielt navn" "Official name as recorded in CPR (`use = official`, `family` mandatory)." +* gender -> "CPR køn" "Gender as recorded in CPR (derived from the 10th digit of CPR-nummer unless corrected)." +* birthDate -> "CPR fødselsdag" "Birth date as recorded in CPR." +* address -> "DAWA (Danmarks Adressers Web API)" "Danish addresses curated per https://dawa.aws.dk/." +* address.extension[municipalityCode] -> "Kommunekode" "Municipality code for the address." +* address.extension[regionalSubDivisionCodes] -> "ISO 3166-2 regionskode" "Region code for the address." +* address.extension[address-official] -> "CPR bopælsadresse" "Marks the address as the CPR-registered official address (see https://www.retsinformation.dk/eli/lta/2023/1010)." +* maritalStatus -> "CPR civilstand" "Civil status from the CPR register." +* generalPractitioner -> "SOR almen praksis" "The patient's general practitioner, typically referenced via a SOR unit id." +* managingOrganization -> "Patientens administrerende organisation" "DkCoreOrganization responsible for managing the patient record." + + Instance: 283 InstanceOf: DkCorePatient Title: "Example of valid patient with full address" diff --git a/input/fsh/DkCorePractitioner.fsh b/input/fsh/DkCorePractitioner.fsh index d8b1fa6f3..c73883079 100644 --- a/input/fsh/DkCorePractitioner.fsh +++ b/input/fsh/DkCorePractitioner.fsh @@ -14,6 +14,18 @@ Description: "HL7 Denmark core profile for health professionals and other actors * qualification[officialHealthAuthorization].code from DkCoreProfessionGroupValueSet (extensible) * ^short = "[DA] Kode for kvalifikation, som specificeret af autorisationsregisteret" +Mapping: DkCorePractitionerToAutregweb +Source: DkCorePractitioner +Target: "https://autregweb.sst.dk" +Title: "Autorisationsregisteret (Styrelsen for Patientsikkerhed)" +Id: dk-core-practitioner-autreg +* -> "Authorised health professional" "**Danish Authorization Register (Autorisationsregisteret), maintained by Styrelsen for Patientsikkerhed.**" +* qualification[officialHealthAuthorization] -> "Autorisation" "A formally registered qualification in the national authorization register." +* qualification[officialHealthAuthorization].identifier -> "Autorisations-id" "Authorization identifier under `https://autregweb.sst.dk`." +* qualification[officialHealthAuthorization].code -> "Faggruppekode" "Profession-group code from the `DkCoreProfessionGroupCodes` classification (e.g. `7170` = Læge, `5166` = Sygeplejerske)." +* qualification[officialHealthAuthorization].period -> "Gyldighedsperiode" "Validity period of the authorization (start = authorization granted, end = expiry or revocation)." + + Instance: AbrahamLaege InstanceOf: DkCorePractitioner Title: "AbrahamLæge" diff --git a/input/fsh/DkCorePractitionerRole.fsh b/input/fsh/DkCorePractitionerRole.fsh index d9f2dcb71..e4cea7280 100644 --- a/input/fsh/DkCorePractitionerRole.fsh +++ b/input/fsh/DkCorePractitionerRole.fsh @@ -8,6 +8,20 @@ Description: "HL7 Denmark core profile for health professional roles" * location only Reference(DkCoreLocation) +Mapping: DkCorePractitionerRoleToSor +Source: DkCorePractitionerRole +Target: "https://www.nspop.dk/display/public/web/SOR" +Title: "SOR (Sundhedsvæsenets Organisationsregister)" +Id: dk-core-practitionerrole-sor +* -> "SOR practitioner-at-unit" "**A health professional performing a role at a SOR-registered organizational unit.** Complements the DkCoreOrganization mapping (SOR unit) and the DkCorePractitioner mapping (Autorisationsregisteret)." +* practitioner -> "Autoriseret sundhedsperson" "Reference to the DkCorePractitioner performing the role." +* organization -> "SOR enhed" "Reference to the DkCoreOrganization (SOR-unit) where the role is performed." +* location -> "Fysisk lokation" "Physical site of service delivery." +* code -> "Rollekode" "Role the practitioner performs at the SOR unit." +* specialty -> "Speciale" "SNOMED CT speciality (e.g. `408443003` = almen lægepraksis)." +* availableTime -> "Åbningstider" "Practitioner availability at the SOR unit." + + Instance: AbrahamPractitionerRole InstanceOf: DkCorePractitionerRole Title: "Licensed physician in primary care" diff --git a/input/fsh/aliases.fsh b/input/fsh/aliases.fsh index 93b051260..4aa5613e8 100644 --- a/input/fsh/aliases.fsh +++ b/input/fsh/aliases.fsh @@ -30,6 +30,29 @@ Alias: $v3-Confidentiality = http://terminology.hl7.org/CodeSystem/v3-Confidenti Alias: $v3-RoleCode = http://terminology.hl7.org/CodeSystem/v3-RoleCode Alias: $v3-ActPriority = http://terminology.hl7.org/CodeSystem/v3-ActPriority Alias: $v3-ActCode3.0.0 = http://terminology.hl7.org/ValueSet/v3-ActCode|3.0.0 +Alias: $atc = http://www.whocc.no/atc +// FMK schema namespace (see https://wiki.fmk-teknik.dk/fmk:extensions:e5). FMK's canonical +// identifier for an ordination is the DrugMedicationIdentifier (a long, paired with Version +// when a specific revision is meant); there is no separate "ordination" identifier. +Alias: $FmkDrugMedicationId = http://www.dkma.dk/medicinecard/xml.schema/2015/06/01/DrugMedicationIdentifier +Alias: $FmkDrugMedicationVersion = http://www.dkma.dk/medicinecard/xml.schema/2015/06/01/DrugMedicationVersion +// Varenummer from Medicinpriser (LMS01 field 1); 11-digit product identifier. +Alias: $FmkDrugId = http://www.dkma.dk/medicinecard/xml.schema/2015/06/01/DrugIdentifier +Alias: $FmkActiveSubstance = http://www.dkma.dk/medicinecard/xml.schema/2015/06/01/ActiveSubstance +Alias: $mr-effectiveDosePeriod = http://hl7.org/fhir/5.0/StructureDefinition/extension-MedicationRequest.effectiveDosePeriod +Alias: $mr-renderedDosageInstruction = http://hl7.org/fhir/5.0/StructureDefinition/extension-MedicationRequest.renderedDosageInstruction +Alias: $ms-adherence = http://hl7.org/fhir/5.0/StructureDefinition/extension-MedicationStatement.adherence +Alias: $ihe-prescribedQuantity = https://profiles.ihe.net/PHARM/MPD/StructureDefinition/ihe-ext-medicationrequest-prescribedQuantity +Alias: $imposeProfile = http://hl7.org/fhir/StructureDefinition/structuredefinition-imposeProfile +Alias: $eu-medicationRequest = http://hl7.eu/fhir/base/StructureDefinition/medicationRequest-eu-core +Alias: $eu-medicationStatement = http://hl7.eu/fhir/base/StructureDefinition/medicationStatement-eu-core +Alias: $eu-medication = http://hl7.eu/fhir/base/StructureDefinition/medication-eu-core +// DDV (Det Danske Vaccinationsregister) XML schema namespace, base interface 1.4.0 + E1. +// Source of truth: https://wiki.fmk-teknik.dk/fmk:ddv:extensions:e1 +Alias: $DdvVaccinationId = http://vaccinationsregister.dk/schemas/2013/12/01/VaccinationIdentifier +Alias: $DdvVaccineId = http://vaccinationsregister.dk/schemas/2013/12/01/VaccineIdentifier +Alias: $DdvCredibility = http://vaccinationsregister.dk/schemas/2013/12/01/VaccinationCredibility +Alias: $DdvPatientId = https://www.sundhed.dk/patient Alias: $DanishXdsOid = urn:oid:1.2.208.184.100.9 Alias: $MedComFormatOID = urn:oid:1.2.208.184.100.10 Alias: $IANALanguageOID = urn:oid:2.16.840.1.113883.6.121 diff --git a/input/fsh/codeSystems.fsh b/input/fsh/codeSystems.fsh index f64316296..5f1b98626 100644 --- a/input/fsh/codeSystems.fsh +++ b/input/fsh/codeSystems.fsh @@ -523,7 +523,7 @@ Id: consent-state-codes-dk-supplement Description: "Indicates the state of the consent" * ^experimental = false * ^content = #supplement -* ^supplements = "http://hl7.org/fhir/consent-state-codes" +* ^supplements = "http://hl7.org/fhir/consent-state-codes|4.0.1" * #draft * ^designation.language = #da * ^designation.use = $sct-int#900000000000013009 diff --git a/input/ignoreWarnings.txt b/input/ignoreWarnings.txt index d942bf5bf..29bf4158e 100644 --- a/input/ignoreWarnings.txt +++ b/input/ignoreWarnings.txt @@ -29,6 +29,20 @@ %A definition for CodeSystem 'urn:oid:1.2.208.176.2.4' could not be found, so the code cannot be validated %A definition for CodeSystem 'http://medcomfhir.dk/ig/terminology/CodeSystem/medcom-observation-codes' could not be found, so the code cannot be validated +# FMK (Fælles Medicinkort) schema-namespace URIs used as identifier systems and coded CodeSystems. +# Source of truth: https://wiki.fmk-teknik.dk/fmk:extensions:e5 (DKMA XML schemas). +# Not registered as FHIR NamingSystems/CodeSystems; suppress the unknown-URL noise. +%A definition for CodeSystem 'http://www.dkma.dk/medicinecard/xml.schema/2015/06/01/ActiveSubstance' could not be found, so the code cannot be validated +%A definition for CodeSystem 'http://www.dkma.dk/medicinecard/xml.schema/2015/06/01/DrugIdentifier' could not be found, so the code cannot be validated +%No definition could be found for URL value 'http://www.dkma.dk/medicinecard/xml.schema/2015/06/01/DrugMedicationIdentifier' +%No definition could be found for URL value 'http://www.dkma.dk/medicinecard/xml.schema/2015/06/01/DrugMedicationVersion' + +# DDV (Det Danske Vaccinationsregister) schema-namespace URIs used as identifier systems and coding systems. +# Source of truth: https://wiki.fmk-teknik.dk/fmk:ddv:extensions:e1 (namespace http://vaccinationsregister.dk/schemas/2013/12/01). +%No definition could be found for URL value 'http://vaccinationsregister.dk/schemas/2013/12/01/VaccinationIdentifier' +%No definition could be found for URL value 'http://vaccinationsregister.dk/schemas/2013/12/01/VaccinationVersionIdentifier' +%A definition for CodeSystem 'http://vaccinationsregister.dk/schemas/2013/12/01/VaccineIdentifier' could not be found, so the code cannot be validated + # Missing Danish translations for LOINC codes %There are no valid display names found for the code http://loinc.org% diff --git a/input/pagecontent/StructureDefinition-dk-core-immunization-intro.md b/input/pagecontent/StructureDefinition-dk-core-immunization-intro.md new file mode 100644 index 000000000..d545f990f --- /dev/null +++ b/input/pagecontent/StructureDefinition-dk-core-immunization-intro.md @@ -0,0 +1,78 @@ +### Scope and usage + +The Danish Core Immunization profile is intended to represent an **administered** vaccination, as sourced from Det Danske Vaccinationsregister (DDV). Authoritative DDV XML schemas are published at [wiki.fmk-teknik.dk/fmk:ddv:extensions:e1](https://wiki.fmk-teknik.dk/fmk:ddv:extensions:e1) with target namespace `http://vaccinationsregister.dk/schemas/2013/12/01` (interface 1.4.0 + extension E1). Service delivery is described at [nspop.dk](https://www.nspop.dk/pages/releaseview.action?pageId=31798109). + +#### Two DDV concepts: Vaccinations vs PlannedVaccinations + +DDV exposes two overarching data types, fetched via separate services: + +- **Vaccinations** (`getVaccinationCard`) — administered/effectuated vaccinations. This is what the Danish Core Immunization profile represents. Only `Vaccinations` expose **historical** data via the interface; history is controlled internally in DDV's database with `ValidFrom`/`ValidTo` dates, and `VersionID` is used internally for optimistic locking on updates. +- **PlannedVaccinations** (`getPlannedVaccinations`) — recommended/planned vaccinations. Historical entries for `PlannedVaccinations` **cannot** be fetched via the interface. + +A consequence is that a citizen who has **declined or omitted** a planned/recommended vaccination leaves no trace in DDV `Vaccinations` (a refusal is never recorded there), and because `PlannedVaccinations` history is not retrievable, the refusal cannot be inferred either. Therefore the FHIR fields **`status = not-done` / `statusReason` cannot be derived from DDV** — see the status section below. + +A DDV `Vaccination` carries a numeric `VaccinationIdentifier` (with `VaccinationVersionIdentifier` as a revision/optimistic-locking token, carried in `meta.versionId`), a structured `Vaccine` element (`VaccineIdentifier` + `VaccineName` + `Disease[]` + `ATC` + optional `SSIDrug[]` and keyword metadata), an optional `Effectuated` structure (date, effectuator name, authorisation and organisation), an optional `EffectuatedPlannedItem` (course/series context), `CoverageDuration`, `BatchNumber`, `ActiveStatus`, `NegativeConsentIndicator` (citizen private-marking — **not** a refusal), `VaccinationCredibility` (a credibility enum), and flags such as `IsPrevious` and `ConfirmedByPrescriptionServer`. + +In dk-core the `patient` element has been constrained to [DkCorePatient](StructureDefinition-dk-core-patient.html) and `performer.actor` to the Danish core profiles for Practitioner, PractitionerRole or Organization. When the DDV effectuator is available only as free text (e.g. "Danske Lægers Vaccinations Service"), it should be carried as `performer.actor.display`. + +#### Mapping from DDV + +| DDV field | FHIR target | +| --- | --- | +| `Vaccination.VaccinationIdentifier` | `identifier[DdvVaccinationId]` (`http://vaccinationsregister.dk/schemas/2013/12/01/VaccinationIdentifier`) | +| `Vaccination.VaccinationVersionIdentifier` | `meta.versionId` — revision/optimistic-locking token; aligns with FHIR's `_history` versioning | +| `Vaccination.Vaccine.VaccineIdentifier` | `vaccineCode.coding[DdvVaccine]` (`http://vaccinationsregister.dk/schemas/2013/12/01/VaccineIdentifier`) | +| `Vaccination.Vaccine.VaccineName` | `vaccineCode.text` | +| `Vaccination.Vaccine.ATC.Code` / `ATC.Text` | `vaccineCode.coding[ATC]` (`http://www.whocc.no/atc`) — typically J07* | +| `Vaccination.Vaccine.Disease[]` | `protocolApplied.targetDisease` (with `DiseaseIdentifier` / `DiseaseName` / `DiseaseNameDK` / `ATC` as children) | +| `Vaccination.EffectuatedDateTime` / `Vaccination.Effectuated.EffectuatedDateTime` | `occurrenceDateTime` | +| `Vaccination.Created.CreatedDateTime` | `recorded` (fall back to `EffectuatedDateTime` when the record has no distinct `Created` element) | +| `Vaccination.Effectuated.EffectuatedByName` (≤200 char free text) | `performer.actor.display` | +| `Vaccination.Effectuated.AuthorisationIdentifier` | `performer.actor` → `Reference(DkCorePractitioner)` when resolvable | +| `Vaccination.Effectuated.EffectuatedByOrganisationName` / `Number` / `Type` | `performer.actor` → `Reference(DkCoreOrganization)` when resolvable; free-text fallback via `actor.display` | +| `Vaccination.BatchNumber` | `lotNumber` | +| `Vaccination.EffectuatedPlannedItem` | `protocolApplied` (vaccination course/series context, when the effectuation is part of a planned course) | +| `Vaccination.CoverageDuration` | `note` (free text, e.g. "CoverageDuration: 1 year") | +| `Vaccination.VaccinationCredibility` | `note` (e.g. "VaccinationCredibility: Oprettet af borger"). Credibility/origin of the record. | +| `Vaccination.ActiveStatus = true` (Status=A) | `status = #completed` (a registered DDV Vaccination is always effectuated) | +| `Vaccination.ActiveStatus = false` (Status=D, deleted) | `status = #entered-in-error` | +| `Vaccination.NegativeConsentIndicator = true` | `meta.security = `[`v3-Confidentiality#R`](http://terminology.hl7.org/CodeSystem/v3-Confidentiality)` (Restricted)` — citizen private-marking, **not** a status change. See section below. | +| `Vaccination.IsPrevious = true` | `note` (effectuation done at another time/place/person, e.g. abroad or pre-mandate) | +| `Vaccination.ConfirmedByPrescriptionServer` | `note` (historical data-quality marker; mirrored by `VaccinationCredibility`) | + +#### Status semantics + +A registered DDV `Vaccination` is **always** an administered/effectuated vaccination. `ActiveStatus` is **not** a clinical status — it is only used to indicate deletion: a `Vaccination` may exist in several versions with `Status=A` (Active), and when it is deleted the latest version gets `Status=D` (Deleted). The mapping is therefore: + +- `ActiveStatus = true` (Status=A) → `status = #completed`. This is the normal value. +- `ActiveStatus = false` (Status=D, deleted) → `status = #entered-in-error`. Records whose `VaccinationCredibility` is `Slettet` ("deleted") likewise map here. + +`status = #not-done` and `statusReason` are **not derivable from DDV** and are not used by this profile. A citizen who declines or omits a planned/recommended vaccination leaves no `Vaccination` record (refusals are never written to `Vaccinations`), and `PlannedVaccinations` history is not retrievable via the interface, so the refusal cannot be inferred. Consumers must not infer a refusal from the absence of a record. + +#### Private-marking (NegativeConsentIndicator) + +`NegativeConsentIndicator = true` is **not** a refusal and does **not** change `status` — the vaccination is still effectuated on equal footing with every other registration. The flag indicates that the citizen has chosen to **private-mark** the specific vaccination: it must not be made visible unless the responsible health professional invokes *værdispring* (break-glass) or holds the citizen's consent. + +This is modelled the same way dk-core marks confidential data on [DkCorePatient](StructureDefinition-dk-core-patient.html): a security label + +``` +meta.security = http://terminology.hl7.org/CodeSystem/v3-Confidentiality#R // "Restricted" +``` + +Systems consuming dk-core Immunization resources must treat a `#R` (Restricted) security label as a private-mark and suppress the resource from normal display, releasing it only under *værdispring* or consent. + +#### IsPrevious, ConfirmedByPrescriptionServer and credibility + +- **`IsPrevious = true`** indicates that the actual effectuation happened at a different time, place and/or by a different person than the one performing the registration — e.g. vaccinations received abroad or before registration in DDV became legally required. Such previous vaccinations may be created by health professionals as well as by the citizen themselves; this is reflected in `VaccinationCredibility`. +- **`ConfirmedByPrescriptionServer`** has only historical interest and primarily reflects the data quality of the registration. Comparable information can be read from `VaccinationCredibility`. +- **`EffectuatedPlannedItem`** carries course/series context when the effectuation was part of a planned vaccination course; map to `protocolApplied`. + +Many of the non-mandatory data elements inherited from the generic profile do exist in DDV, but remain optional here and will only be populated in certain cases. + +#### Vaccine coding + +DDV delivers the vaccine as a structured `Vaccine` element with a free-text `VaccineName`, an SSI `VaccineIdentifier`, an ATC code (typically J07*), a list of target diseases (each with its own ATC coding), and optional SSI-defined drugs (`SSIDrug`). The profile accommodates this via three coding slices on `vaccineCode` (`ATC`, `SCTVaccineCode`, `DdvVaccine`) with the free-text name in `vaccineCode.text`. A SNOMED CT coding MAY be added where known. + +#### Identifier namespace note + +Earlier drafts of this profile used `https://www.sundhed.dk/vaccination/...` URLs deduced from the sundhed.dk JSON proxy. Those URLs are not registered anywhere and have been replaced with URIs rooted at the authoritative DDV XML schema namespace (`http://vaccinationsregister.dk/schemas/2013/12/01`). Consumers proxying DDV via sundhed.dk should normalise their identifier systems to these authoritative URIs when producing dk-core resources. diff --git a/input/pagecontent/StructureDefinition-dk-core-medication-intro.md b/input/pagecontent/StructureDefinition-dk-core-medication-intro.md new file mode 100644 index 000000000..92d424dd9 --- /dev/null +++ b/input/pagecontent/StructureDefinition-dk-core-medication-intro.md @@ -0,0 +1,23 @@ +### Scope and usage + +The Danish Core Medication profile describes a medicinal product, in particular as it appears in the Danish Shared Medication Record (Fælles Medicinkort, FMK). It is used when a MedicationRequest or MedicationStatement needs to reference a reusable, structured drug representation — for example, an FMK `DrugMedication.Drug` with form, strength and active-substance information. + +Most Danish systems today will be able to inline the drug as a `CodeableConcept` on [DkCoreMedicationRequest](StructureDefinition-dk-core-medicationrequest.html) / [DkCoreMedicationStatement](StructureDefinition-dk-core-medicationstatement.html). This profile is offered for the cases where structured data about the product itself (ingredients, strength, form, manufacturer) is valuable, or where the same product is referenced from multiple requests/statements. + +#### Mapping from FMK + +In FMK, a `DrugMedication` (lægemiddelordination) contains exactly one `Drug` element, and the drug's attributes (ATC, form, strength, substances, varenummer) are children of `Drug`: + +| FMK field | FHIR target | +| --- | --- | +| `DrugMedication.Drug.ATC.Code` / `ATC.Text` | `code.coding[ATC]` (`http://www.whocc.no/atc`) | +| `DrugMedication.Drug.Substances.ActiveSubstance` | `code.coding[ActiveSubstance]` + `ingredient.itemCodeableConcept` | +| `DrugMedication.Drug.Identifier` (varenummer, LMS01 field 1, 11-digit) | `code.coding[Varenummer]` | +| `DrugMedication.Drug.Name` (with Form and Strength) | `code.text` | +| `DrugMedication.Drug.Form` (Code + Text) | `form` | +| `DrugMedication.Drug.Strength` (Value + UnitCode + UnitText, or Text) | `ingredient.strength` | + +The authoritative FMK schemas are published at [wiki.fmk-teknik.dk](https://wiki.fmk-teknik.dk/fmk:extensions:e5) (XML namespace `http://www.dkma.dk/medicinecard/xml.schema/2015/06/01`). + +#### Relationship to HL7 Europe Base +This profile is deliberately compatible with [Medication (EU core)](https://build.fhir.org/ig/hl7-eu/base/StructureDefinition-medication-eu-core.html) — it uses the same general shape (ATC as a sliced coding, ingredient-based strength) so that Danish content can be promoted to EU-wide exchanges without restructuring. diff --git a/input/pagecontent/StructureDefinition-dk-core-medicationrequest-intro.md b/input/pagecontent/StructureDefinition-dk-core-medicationrequest-intro.md new file mode 100644 index 000000000..9e0084708 --- /dev/null +++ b/input/pagecontent/StructureDefinition-dk-core-medicationrequest-intro.md @@ -0,0 +1,54 @@ +### Scope and usage + +The Danish Core MedicationRequest profile is intended to represent a single medication order (lægemiddelordination), in particular as sourced from the Danish Shared Medication Record (Fælles Medicinkort, FMK). Source documentation for FMK: [wiki.fmk-teknik.dk](https://wiki.fmk-teknik.dk/fmk:extensions:e5) (XML schemas in namespace `http://www.dkma.dk/medicinecard/xml.schema/2015/06/01`). + +In dk-core, the MedicationRequest has been constrained so that `subject` refers to a [DkCorePatient](StructureDefinition-dk-core-patient.html), and `requester` / `recorder` / `performer` refer to the Danish core profiles for Practitioner, PractitionerRole, Organization, Patient or RelatedPerson. + +The profile claims conformance to [MedicationRequest (EU core)](https://build.fhir.org/ig/hl7-eu/base/StructureDefinition-medicationRequest-eu-core.html) via an `imposeProfile` extension — any instance valid against DkCoreMedicationRequest must also be valid against the EU Core profile. + +#### Mapping from FMK + +An FMK `DrugMedication` (lægemiddelordination) on the medicinkort is uniquely identified by a `DrugMedicationIdentifier` (a positive long). A specific revision is identified by the pair `(Identifier, Version)`; there is no separate "ordination" identifier on top of that. + +* **DrugMedicationIdentifier** — mapped to `identifier` slice `FmkDrugMedicationId` with system `http://www.dkma.dk/medicinecard/xml.schema/2015/06/01/DrugMedicationIdentifier`. +* **DrugMedication.Version** — mapped to `identifier` slice `FmkDrugMedicationVersion` with system `http://www.dkma.dk/medicinecard/xml.schema/2015/06/01/DrugMedicationVersion`. Populate alongside the DrugMedicationIdentifier when pointing to a specific revision. + +The medicinal product can be represented in two ways: + +* As an inline `medicationCodeableConcept` (preferred for simple, self-contained FMK mappings), sliced on `coding.system` for: + * **ATC** (`http://www.whocc.no/atc`) from `DrugMedication.Drug.ATC.Code` / `ATC.Text`. + * **Active substance** (`http://www.dkma.dk/medicinecard/xml.schema/2015/06/01/ActiveSubstance`) from `DrugMedication.Drug.Substances.ActiveSubstance`. The FMK `source` attribute may be `Medicinpriser`, `Local` or `Magistrel`. + * A free-text product name in `medicationCodeableConcept.text`. +* As a `medicationReference` to a [DkCoreMedication](StructureDefinition-dk-core-medication.html) — useful when form, strength, ingredients or manufacturer need structured representation. + +FMK indication, treatment-period and dosage fields map as follows: + +| FMK field | FHIR target | +| --- | --- | +| `DrugMedication.Indication` (Code + Text, or FreeText) | `reasonCode` (coded or free text), or `reasonReference` when a coded condition is known | +| `DrugMedication.BeginEndDate.TreatmentStartDate` | `authoredOn` and `extension[effectiveDosePeriod].valuePeriod.start` | +| `DrugMedication.BeginEndDate.TreatmentEndDate` | `extension[effectiveDosePeriod].valuePeriod.end` | +| `DrugMedication.BeginEndDate.TreatmentStartedPreviously` / `TreatmentEndingUndetermined` | Represented by the absence of an explicit start/end in `effectiveDosePeriod.valuePeriod` | +| `DrugMedication.RouteOfAdministration` (Code + Text) | `dosageInstruction.route` | +| `DrugMedication.Dosage` | `dosageInstruction.text` and/or `extension[renderedDosageInstruction].valueMarkdown` | +| `DrugMedication.Withdrawn` element present (seponeret) | `status = #stopped` | +| `DrugMedication.Paused` element present | `status = #on-hold` | +| `DrugMedication.Created.By` / `DrugMedication.ReportedBy` (E5) | `requester` (display / reference) | +| `DrugMedication.Dosage` with a total quantity for dose dispensing | `dispenseRequest.quantity` (and, when IHE Pharmacy MPD becomes an R4 dependency, the `prescribedQuantity` extension) | + +#### Extensions in use +The profile brings forward three extensions from the HL7 Europe Base profile, all of which are already forward-compatible with FHIR R5: + +* **`effectiveDosePeriod`** (R5 back-port) — records the period over which the medication is to be taken. Natural home for FMK's `DrugMedication.BeginEndDate.TreatmentStartDate` / `TreatmentEndDate`. +* **`renderedDosageInstruction`** (R5 back-port) — carries the full human-rendered dosage instruction in Markdown. Natural home for FMK's `DrugMedication.Dosage`. +* **IHE Pharmacy `prescribedQuantity`** — not currently wired in as a slice because the IHE MPD package is R5-based and not yet an R4 dependency of this IG. Implementers may add it as an ad-hoc extension on `dispenseRequest` when needed for FMK dose-dispensing flows. + +#### Status and intent +FMK ordinations are typically modelled with `intent = order`. Active ordinations use `status = active`; ordinations with a `DrugMedication.Paused` element use `status = on-hold`; ordinations that have been stopped (`DrugMedication.Withdrawn` element set) use `status = stopped`. Historical/completed treatments use `status = completed`. + +#### E5-specific considerations +FMK extension E5 introduces a handful of capabilities worth noting for implementers: + +* **`DrugMedication.ReportedBy`** — identifies who reported the medication (distinct from who authored it). Use this where the prescriber differs from the original source, for example when a pharmacy or another clinician reports a medication seen outside of FMK. In FHIR the prescriber maps to `requester`; `ReportedBy` can be surfaced in `requester.display` or via the `reported[x]` field of MedicationRequest. +* **Prescriptions without a CPR** (`CreatePrescriptionWithoutCPR_2015_06_01_E2`) and **for use in practice** (`CreatePrescriptionForUseInPractice_2015_06_01_E2`) — these E5 operations create ordinations that are not tied to a specific person. For the first, `subject` may reference a placeholder Patient resource with an `X-eCPR` / `MedicineCardKey` PersonIdentifier source; for the second, `subject` references an organisational Patient representing the practice itself. In both cases consumers should be prepared for `subject.reference` to not resolve to a standard CPR-based patient. +* **Explicit dose dispensing** (`GetExplicitDoseDispensingCard_2015_06_01_E3`) — the separate DoseDispensingCard view carries per-period dispensed doses. When representing a single MedicationRequest sourced from an ordination attached to a DoseDispensingPeriod, `dispenseRequest.quantity` is appropriate for the period's total dispensed quantity; full period-by-period history is outside the scope of this profile. diff --git a/input/pagecontent/StructureDefinition-dk-core-medicationstatement-intro.md b/input/pagecontent/StructureDefinition-dk-core-medicationstatement-intro.md new file mode 100644 index 000000000..e21406c8f --- /dev/null +++ b/input/pagecontent/StructureDefinition-dk-core-medicationstatement-intro.md @@ -0,0 +1,37 @@ +### Scope and usage + +The Danish Core MedicationStatement profile is intended to represent a statement about a medication that a patient is taking (or has taken), as sourced from the Danish Shared Medication Record (Fælles Medicinkort, FMK). Source documentation for FMK: [wiki.fmk-teknik.dk](https://wiki.fmk-teknik.dk/fmk:extensions:e5) (XML schemas in namespace `http://www.dkma.dk/medicinecard/xml.schema/2015/06/01`). + +A MedicationStatement is the natural FHIR representation of the FMK "medicinkort"/"aktuelt medicinbillede" — the authoritative list of medicines the patient is currently taking, materialised from the `DrugMedication` entries on the `MedicineCard`. Where a [DkCoreMedicationRequest](StructureDefinition-dk-core-medicationrequest.html) is the order that a prescriber issues, a DkCoreMedicationStatement is the snapshot of what is actually on the patient's medicinkort at a point in time. + +In dk-core, the MedicationStatement has been constrained so that `subject` refers to a [DkCorePatient](StructureDefinition-dk-core-patient.html) and `informationSource` refers to the Danish core profiles for Practitioner, PractitionerRole, Organization, Patient or RelatedPerson. + +The profile claims conformance to [MedicationStatement (EU core)](https://build.fhir.org/ig/hl7-eu/base/StructureDefinition-medicationStatement-eu-core.html) via an `imposeProfile` extension — any instance valid against DkCoreMedicationStatement must also be valid against the EU Core profile. + +#### Mapping from FMK + +| FMK field | FHIR target | +| --- | --- | +| `DrugMedication.Identifier` | `identifier[FmkDrugMedicationId]` (`http://www.dkma.dk/medicinecard/xml.schema/2015/06/01/DrugMedicationIdentifier`) | +| `DrugMedication.Version` | `identifier[FmkDrugMedicationVersion]` (`http://www.dkma.dk/medicinecard/xml.schema/2015/06/01/DrugMedicationVersion`) — populate alongside the Identifier when pointing to a specific revision | +| `DrugMedication.Drug.ATC.Code` / `ATC.Text` | `medicationCodeableConcept.coding[ATC]` (`http://www.whocc.no/atc`) or via `medicationReference` to a [DkCoreMedication](StructureDefinition-dk-core-medication.html) | +| `DrugMedication.Drug.Substances.ActiveSubstance` | `medicationCodeableConcept.coding[ActiveSubstance]` (source: `Medicinpriser` / `Local` / `Magistrel`) | +| `DrugMedication.Drug.Name` (with Form/Strength) | `medicationCodeableConcept.text` or the referenced DkCoreMedication | +| `DrugMedication.Indication` (Code + Text, or FreeText) | `reasonCode` | +| `DrugMedication.BeginEndDate.TreatmentStartDate` / `TreatmentEndDate` | `effectivePeriod.start` / `effectivePeriod.end` | +| `DrugMedication.Dosage` | `dosage.text` | +| `DrugMedication.RouteOfAdministration` (Code + Text) | `dosage.route` | +| MedicineCard retrieval timestamp | `dateAsserted` | +| `DrugMedication.Withdrawn` element present (seponeret) | `status = #stopped` plus `extension[adherence]` with an appropriate `stopped` / `not-taking` code | +| `DrugMedication.Paused` element present | `status = #on-hold` plus `extension[adherence]` with `on-hold` | + +Consumers of this profile should be aware that a MedicationStatement derived from the FMK medicinkort is, by design, a *view* on the current state of one or more `DrugMedication` entries rather than an authoritative clinical assertion. When populating `dateAsserted`, use the timestamp of the FMK retrieval, not the ordination date. + +#### Extensions in use +The profile brings forward the R5 `adherence` extension from the HL7 Europe Base profile. FMK's `Withdrawn` / `Paused` elements and card-level status should be surfaced as adherence codes where possible; the coarse `status` value remains but loses nuance compared to adherence codes such as `stopped`, `not-taking`, `on-hold`. + +#### Effective[x] +`effective[x]` is restricted to either `effectiveDateTime` (point-in-time) or `effectivePeriod` (typical for FMK). Prefer `effectivePeriod` when an end date is known, or when the start date is known and the medication is ongoing. FMK alternatives `TreatmentStartedPreviously` and `TreatmentEndingUndetermined` are represented by the absence of an explicit start/end in the period. + +#### Relationship to DkCoreMedicationRequest +When both resources are available (for example when proxying both an ordination detail view and a medicinkort entry), the two resources MAY share the `FmkDrugMedicationId` identifier so that a consumer can correlate a MedicationStatement with the MedicationRequest that it is derived from. diff --git a/sushi-config.yaml b/sushi-config.yaml index 1dc487b1c..cc8b4e01b 100644 --- a/sushi-config.yaml +++ b/sushi-config.yaml @@ -40,6 +40,14 @@ parameters: - urn:oid:1.2.208.176.2.21 - urn:oid:1.2.208.176.2.4.12 path-expansion-params: Parameters-expParam.json + suppress-mappings: + - http://hl7.org/fhir/fivews + - http://hl7.org/fhir/workflow + - http://hl7.org/v3 + - http://hl7.org/v3/cda +# - http://ihe.net/xds + - http://hl7.org/v2 + - http://ncpdp.org/SCRIPT10_6 dependencies: hl7.fhir.uv.xver-r5.r4: 0.1.0 @@ -47,6 +55,8 @@ dependencies: hl7.fhir.uv.phd: 2.0.0 hl7.fhir.uv.ipa: 1.1.0 ihe.iti.mhd: 4.2.3 + # HL7 Europe base profiles - referenced by the DkCoreMedication* profiles via imposeProfile. + hl7.fhir.eu.base: 2.0.0-ballot