diff --git a/ig.ini b/ig.ini index 82644d7d4..03e5b5867 100644 --- a/ig.ini +++ b/ig.ini @@ -1,4 +1,3 @@ [IG] ig = fsh-generated/resources/ImplementationGuide-hl7.fhir.dk.core.json template = https://github.com/hl7dk/dk-ig-template -;template = fhir.base.template#current \ No newline at end of file diff --git a/input/fsh/DkCoreBasicParameter.fsh b/input/fsh/DkCoreBasicParameter.fsh new file mode 100644 index 000000000..6f984d178 --- /dev/null +++ b/input/fsh/DkCoreBasicParameter.fsh @@ -0,0 +1,328 @@ +Profile: DkCoreBasicObservation +Parent: dk-core-observation +Id: dk-core-basic-observation +Title: "Danish Core Basic Observation Profile" +Description: "HL7 Denmark core profile for basic observations, which is a profiling of DkCoreObservation." +* category 1..1 +* category = $observation-category#vital-signs +* code.coding[LOINC] 1.. +* code.coding[LOINC] from LoincBasicObservation (extensible) +* code.coding[SNOMEDCT] from SCTBasicObservation (extensible) +* code.coding[NPU] from NPUBasicObservation (extensible) +* code.coding[IEEE] from IEEEBasicObservation (extensible) +* valueQuantity.system from UCUMBasicUnits (extensible) +* component.valueQuantity.system from UCUMBasicUnits (extensible) + + + +Instance: ObservationRespiratoryBasicObservation +InstanceOf: DkCoreBasicObservation +Title: "John's Respiratory rate measurement (Basic observation)" +Description: "A simple basic observation of a hyperventilating patient" +Usage: #example +* category = $observation-category#vital-signs +* status = #final +* code.coding[LOINC] = $LOINC#9279-1 "Respiratory rate" +* valueQuantity.value = 50 +* valueQuantity.code = #/min +* valueQuantity.system = $ucum +* valueQuantity.unit = "/min" +* effectiveDateTime = 2023-11-20T18:00:00+01:00 +* subject = Reference(john) +* performer = Reference(AbrahamLaege) + +Instance: ObservationOxySatBasicObservationOrg +InstanceOf: DkCoreBasicObservation +Title: "John's oxygen saturation measurement (Basic observation)" +Usage: #example +* category = $observation-category#vital-signs +* status = #final +* code.coding[LOINC] = $LOINC#2708-6 "Oxygen saturation in Arterial blood" +* code.coding[IEEE] = $IEEEx73#150456 "MDC_PULS_OXIM_SAT_O2" +* valueQuantity.value = 97.0 +* valueQuantity.code = #% +* valueQuantity.system = $ucum +* valueQuantity.unit = "%" +* effectiveDateTime = 2023-11-01T12:00:00+01:00 +* subject = Reference(john) +* performer = Reference(AbrahamLaege) + +Instance: ObservationOxySatObservation +InstanceOf: DkCoreObservation +Title: "John's oxygen saturation measurement (Observation)" +Description: """ +This example suggests a way to handle the oxygen saturation case, where the original measurement +was reported in '%' by a device or typed in manually, and then 'translated' to the NPU system, +which requires the value to be unitless. +""" +Usage: #example +* category = $observation-category#vital-signs +* status = #final +* code.coding[NPU] = $NPU#NPU27280 "Hb(Fe; O₂-bind.;aB)—Oxygen(O₂); sat.(Pulse oximetry) = ?" +* valueQuantity.value = 0.97 +* valueQuantity.code = #1 +* valueQuantity.system = $ucum +* subject = Reference(john) +* performer = Reference(AbrahamLaege) +* effectiveDateTime = 2023-11-01T12:00:00+01:00 +* contained[0] = ObservationOxySatBasicObservationOrg +* derivedFrom = Reference(ObservationOxySatBasicObservationOrg) + + +/* ************** + * + * TOBS example + * + * ************** */ + +Instance: ElseConsciousness +InstanceOf: DkCoreObservation +Usage: #example +* status = #final +* code = $sct#6942003 +* subject = Reference(else) +* valueCodeableConcept.coding[+] = $sct#450847001 +* method = $sct#733985002 "Reported (qualifier value)" +* effectiveDateTime = "2023-09-12T17:45:00.000Z" +* performer = Reference(SidselSygeplejerske) + +Instance: ElseBloodPressure +InstanceOf: DkCoreBasicObservation +Usage: #example +* status = #final +* category = $observation-category#vital-signs +* code.coding[SNOMEDCT] = $sct#75367002 +* code.coding[LOINC] = $LOINC#85354-9 +* subject = Reference(else) +* component[0].code.coding[LOINC] = $LOINC#8480-6 +* component[=].code.coding[SNOMEDCT] = $sct#407554009 +* component[=].valueQuantity = 147 'mm[Hg]' "mmHg" +* component[+].code.coding[LOINC] = $LOINC#8462-4 +* component[=].code.coding[SNOMEDCT] = $sct#407555005 +* component[=].valueQuantity = 95 'mm[Hg]' "mmHg" +* method = $sct#272391002 "Measurement technique (qualifier value)" +* effectiveDateTime = "2023-09-12T17:45:00.000Z" +* performer = Reference(SidselSygeplejerske) + + +Instance: ElseBodyTemperature +InstanceOf: DkCoreBasicObservation +Usage: #example +* status = #final +* category = $observation-category#vital-signs +* code.coding[SNOMEDCT] = $sct#276885007 +* code.coding[LOINC] = $LOINC#8310-5 +* subject = Reference(else) +* method = $sct#272391002 "Measurement technique (qualifier value)" +* effectiveDateTime = "2023-09-12T17:45:00.000Z" +* valueQuantity = 38.7 'Cel' "grader celcius" +* performer = Reference(SidselSygeplejerske) + +Instance: ElseHeartRate +InstanceOf: DkCoreBasicObservation +Usage: #example +* status = #final +* category = $observation-category#vital-signs +* code.coding[SNOMEDCT] = $sct#364075005 +* code.coding[LOINC] = $LOINC#8867-4 +* subject = Reference(else) +* method = $sct#272391002 "Measurement technique (qualifier value)" +* effectiveDateTime = "2023-09-12T17:45:00.000Z" +* valueQuantity = 92 '/min' "slag/minut" +* performer = Reference(SidselSygeplejerske) + +Instance: ElseRespirationRate +InstanceOf: DkCoreBasicObservation +Usage: #example +* status = #final +* category = $observation-category#vital-signs +* code.coding[SNOMEDCT] = $sct#86290005 +* code.coding[LOINC] = $LOINC#9279-1 +* subject = Reference(else) +* method = $sct#272391002 "Measurement technique (qualifier value)" +* effectiveDateTime = "2023-09-12T17:45:00.000Z" +* valueQuantity = 19 '/min' "/min" +* performer = Reference(SidselSygeplejerske) + +Instance: ElsesTOBSscore +InstanceOf: DkCoreObservation +Usage: #example +* status = #final +* code.coding = $Medcom#MCS88125 "Pt—Tidlig Opsporing af Begyndende Sygdom (TOBS) score; antal (værdi 0-15) = ?" +* subject = Reference(else) +* effectiveDateTime = "2023-09-12T17:45:00.000Z" +* valueQuantity.value = 3 +* valueQuantity.code = #1 +* valueQuantity.system = $ucum +* performer = Reference(SidselSygeplejerske) + + +Instance: ElsesTOBS +InstanceOf: Bundle +Title: "Else's TOBS measurements" +Description: "An example of TOBS (Danish: Tidlig opsporing af begyndende sygdom), which includes level of consciousness, heart rate, respiration rate, blood pressure and temperature." +Usage: #example +* type = #collection +* timestamp = "2023-09-12T17:45:00.000Z" +* entry[+].fullUrl = "Patient/else" +* entry[=].resource = else +* entry[+].fullUrl = "Observation/ElseConsciousness" +* entry[=].resource = ElseConsciousness +* entry[+].fullUrl = "Observation/ElseBloodPressure" +* entry[=].resource = ElseBloodPressure +* entry[+].fullUrl = "Observation/ElseBodyTemperature" +* entry[=].resource = ElseBodyTemperature +* entry[+].fullUrl = "Observation/ElseHeartRate" +* entry[=].resource = ElseHeartRate +* entry[+].fullUrl = "Observation/ElseRespirationRate" +* entry[=].resource = ElseRespirationRate +* entry[+].fullUrl = "Observation/ElsesTOBSscore" +* entry[=].resource = ElsesTOBSscore +* entry[+].fullUrl = "Practitioner/SidselSygeplejerske" +* entry[=].resource = SidselSygeplejerske + +/* ************** +* +* TOKS eksempel inkl. GCS +* +* ************** */ + +Instance: MaxConsciousness +InstanceOf: DkCoreObservation +Usage: #example +* status = #final +* category = $observation-category#vital-signs +* code.coding[0] = $sct#6942003 +* code.coding[LOINC] = $LOINC#80288-4 +* subject = Reference(Max) +* valueCodeableConcept.coding = $sct#450847001 +* method = $sct#733985002 "Reported (qualifier value)" +* effectiveDateTime = "2023-08-08T13:30:00.000Z" + +Instance: MaxRespirationRate +InstanceOf: DkCoreBasicObservation +Usage: #example +* status = #final +* code.coding[SNOMEDCT] = $sct#86290005 +* code.coding[LOINC] = $LOINC#9279-1 +* subject = Reference(Max) +* method = $sct#272391002 "Measurement technique (qualifier value)" +* effectiveDateTime = "2023-08-08T13:30:00.000Z" +* valueQuantity = 13 '/min' "/min" + +Instance: MaxHeartRate +InstanceOf: DkCoreBasicObservation +Usage: #example +* status = #final +* category = $observation-category#vital-signs +* code.coding[SKS] = $SKS#ZZ3140 +* code.coding[LOINC] = $LOINC#8867-4 +* subject = Reference(Max) +* effectiveDateTime = "2023-08-08T13:30:00.000Z" +* method = $sct#272391002 "Measurement technique (qualifier value)" +* valueQuantity = 68 '/min' "slag/minut" + +Instance: MaxBodyTemperature +InstanceOf: DkCoreBasicObservation +Usage: #example +* status = #final +* category = $observation-category#vital-signs +* code.coding[SKS] = $SKS#ZZ0253 +* code.coding[LOINC] = $LOINC#8310-5 +* subject = Reference(Max) +* effectiveDateTime = "2023-08-08T13:30:00.000Z" +* method = $sct#272391002 "Measurement technique (qualifier value)" +* valueQuantity = 37 'Cel' "grader celcius" + +Instance: MaxBloodPressure +InstanceOf: DkCoreBasicObservation +Usage: #example +* status = #final +* category = $observation-category#vital-signs +* code.coding[SKS] = $SKS#ZZ3160 +* code.coding[LOINC] = $LOINC#85354-9 +* subject = Reference(Max) +* effectiveDateTime = "2023-08-08T13:30:00.000Z" +* method = $sct#272391002 "Measurement technique (qualifier value)" +* component[0].code.coding[0] = $LOINC#8480-6 +* component[=].code.coding[+] = $sct#407554009 +* component[=].valueQuantity = 156 'mm[Hg]' "mmHg" +* component[+].code.coding[0] = $LOINC#8462-4 +* component[=].code.coding[+] = $sct#407555005 +* component[=].valueQuantity = 78 'mm[Hg]' "mmHg" + +Instance: MaxSaturation +InstanceOf: DkCoreBasicObservation +Usage: #example +* category = $observation-category#vital-signs +* status = #final +* code.coding[LOINC] = $LOINC#2708-6 "Oxygen saturation in Arterial blood" +* valueQuantity = 99.0 '%' "%" +* subject = Reference(Max) +* effectiveDateTime = "2023-08-08T13:30:00.000Z" +* method = $sct#272391002 "Measurement technique (qualifier value)" + +Instance: MaxGlasgowComaScale +InstanceOf: DkCoreObservation +Usage: #example +* status = #final +* code.coding[LOINC] = $LOINC#9269-2 +* code.coding[+] = $sct#248241002 +* subject = Reference(Max) +* valueQuantity = 13 '{score}' +* referenceRange[0].high = 8 '{score}' +* referenceRange[=].type.text = "Severe TBI" +* referenceRange[+].low = 9 '{score}' +* referenceRange[=].high = 12 '{score}' +* referenceRange[=].type.text = "Moderate TBI" +* referenceRange[+].low = 13 '{score}' +* referenceRange[=].type.text = "Mild TBI" +* effectiveDateTime = "2023-08-08T13:30:00.000Z" +* component[0].code = $LOINC#9268-4 "Glasgow coma score motor" +* component[=].valueCodeableConcept.coding = $LOINC#LA6566-9 "Localizing pain" +* component[+].code = $LOINC#9270-0 "Glasgow coma score verbal" +* component[=].valueCodeableConcept.coding = $LOINC#LA6560-2 "Confused" +* component[+].code = $LOINC#9267-6 "Glasgow coma score eye opening" +* component[=].valueCodeableConcept.coding = $LOINC#LA6556-0 "Eyes open spontaneously" + + +Instance: MaxTOKS +InstanceOf: Bundle +Title: "Max TOKS measurements, including Glasgow Coma Scale assesment" +Description: "An example of TOBS (Danish: Tidlig opsporing af begyndende sygdom), which includes level of consciousness, heart rate, respiration rate, blood pressure and temperature." +Usage: #example +* type = #collection +* timestamp = "2023-08-08T13:30:00.000Z" +* entry[+].fullUrl = "Patient/Max" +* entry[=].resource = Max +* entry[+].fullUrl = "Observation/MaxConsciousness" +* entry[=].resource = MaxConsciousness +* entry[+].fullUrl = "Observation/MaxBloodPressure" +* entry[=].resource = MaxBloodPressure +* entry[+].fullUrl = "Observation/MaxBodyTemperature" +* entry[=].resource = MaxBodyTemperature +* entry[+].fullUrl = "Observation/MaxHeartRate" +* entry[=].resource = MaxHeartRate +* entry[+].fullUrl = "Observation/MaxRespirationRate" +* entry[=].resource = MaxRespirationRate +* entry[+].fullUrl = "Observation/MaxGlasgowComaScale" +* entry[=].resource = MaxGlasgowComaScale + +/* ************** +* +* Vital signs panel +* +* ************** */ + +Instance: MaxVitalSignsPanel +InstanceOf: DkCoreBasicObservation +Usage: #example +* category = $observation-category#vital-signs +* status = #final +* code.coding[LOINC] = $LOINC#85353-1 "Vital signs, weight, height, head circumference, oxygen saturation and BMI panel" +* subject = Reference(Max) +* effectiveDateTime = "2023-08-08T13:30:00.000Z" +* hasMember[+] = Reference(MaxBloodPressure) +* hasMember[+] = Reference(MaxRespirationRate) +* hasMember[+] = Reference(MaxHeartRate) +* hasMember[+] = Reference(MaxBodyTemperature) \ No newline at end of file diff --git a/input/fsh/DkCoreObservation.fsh b/input/fsh/DkCoreObservation.fsh index 9edb83cbf..638bb12e5 100644 --- a/input/fsh/DkCoreObservation.fsh +++ b/input/fsh/DkCoreObservation.fsh @@ -95,10 +95,9 @@ Description: "HL7 Denmark core profile for observations" * method.coding ^slicing.rules = #open * method.coding contains SCTCode 0..1 -* method.coding[SCTCode] from TechniquesSCTCodes (required) +* method.coding[SCTCode] from TechniquesSCTCodes (example) * method.coding[SCTCode].system = $sct - Invariant: dk-core-observation-mandatory-units Description: "If value is specified then unit and/or code must be specified" Severity: #error @@ -147,6 +146,17 @@ Title: "The device that performed the observation" * deviceName.type = #user-friendly-name * serialNumber = "74E8FFFEFF051C00.001C05FFE874" */ +Instance: ElseUrinStix +InstanceOf: DkCoreObservation +Usage: #example +* status = #final +* code.coding[0] = $NPU#NPU03987 "U—Leukocytter; arb.k.(proc.) = ?" +* code.coding[+] = $sct#252385000 "Urine dipstick for leukocyte esterase (procedure)" +* subject = Reference(else) +* effectiveDateTime = "2023-09-12T17:45:00.000Z" +* valueString = "Påviselige leukocytter" +* method = $sct#272391002 "Measurement technique (qualifier value)" + Instance: ElsePainVRS InstanceOf: dk-core-observation Usage: #example @@ -161,22 +171,6 @@ Description: "Elses smerte målt med VRS" * status = #final * effectiveDateTime = 2020-06-01 - -Instance: ObservationRespiratoryVitalSigns -InstanceOf: DkCoreObservation -Title: "John's Respiratory rate measurement, Vital Signs" -Usage: #example -* category = $observation-category#vital-signs -* status = #final -* code.coding[LOINC] = $LOINC#9279-1 "Respiratory rate" -* valueQuantity.value = 50 -* valueQuantity.code = #/min -* valueQuantity.system = $ucum -* valueQuantity.unit = "Breaths / minute" -* effectiveDateTime = 2023-11-01T12:00:00+01:00 -* subject = Reference(john) -* performer = Reference(AbrahamLaege) - Instance: ObservationOxySat InstanceOf: DkCoreObservation Title: "John's oxygen saturation measurement" @@ -190,23 +184,6 @@ Usage: #inline * subject = Reference(john) * performer = Reference(AbrahamLaege) -Instance: ObservationOxySatVitalSigns -InstanceOf: DkCoreObservation -Title: "John's oxygen saturation measurement, Vital Signs" -Usage: #example -* category = $observation-category#vital-signs -* status = #final -* code.coding[LOINC] = $LOINC#2708-6 "Oxygen saturation in Arterial blood" -* valueQuantity.value = 97.0 -* valueQuantity.code = #% -* valueQuantity.system = $ucum -* valueQuantity.unit = "%" -* effectiveDateTime = 2023-11-01T12:00:00+01:00 -* subject = Reference(john) -* performer = Reference(AbrahamLaege) -* contained[0] = ObservationOxySat -* derivedFrom = Reference(ObservationOxySat) - diff --git a/input/fsh/DkCoreObservationVitalSigns.fsh b/input/fsh/DkCoreObservationVitalSigns.fsh deleted file mode 100644 index 171e9c1a5..000000000 --- a/input/fsh/DkCoreObservationVitalSigns.fsh +++ /dev/null @@ -1,34 +0,0 @@ -/* Profile: DkCoreObservationVitalSigns -Parent: dk-core-observation -Id: dk-core-observation-vitalsigns -Title: "Danish Core Observation Profile for Vital Signs" -Description: "HL7 Denmark core profile for observations of vital signs" -* category 1..1 -* category = #vital-signs -* code.coding[LOINC] - * code from http://hl7.dk/fhir/core/ValueSet/dk-core-LoincVitalSigns (preferred) - */ - -/* Instance: ObservationBloodPressureNPU -InstanceOf: DkCoreObservationVitalSignsNPU -Title: "John's blood pressure measurement" -Description: "John, blood pressure measurement, NPU-code" -Usage: #example -[Add content here] -*/ - - - -/* Instance: ObservationHeightVitalSigns -InstanceOf: DkCoreObservationVitalSigns -Title: "John's Respiratory rate measurement, Vital Signs" -* category = #vital-signs -* status = #final -* code.coding[LOINC] = $LOINC#9279-1 "Respiratory rate" -* valueQuantity.value = 50 -* valueQuantity.code = #{Breaths}/min -* valueQuantity.system = $ucum -* valueQuantity.unit = "Breaths / minute" -* subject = Reference(john) -* performer = Reference(AbrahamLaege) */ - diff --git a/input/fsh/DkCorePatient.fsh b/input/fsh/DkCorePatient.fsh index 91f0fb6f9..0bb8573a4 100644 --- a/input/fsh/DkCorePatient.fsh +++ b/input/fsh/DkCorePatient.fsh @@ -8,9 +8,16 @@ Description: "HL7 Denmark core profile for a patient" * ^slicing.discriminator.type = #value * ^slicing.discriminator.path = "system" * ^slicing.rules = #open -* identifier contains cpr 0..1 +* identifier contains + cpr 0..1 and + x-ecpr 0..1 and + d-ecpr 0..1 * identifier[cpr] only DkCoreCprIdentifier * ^short = "[DA] cpr-nummer, som det fremgår af CPR registeret" +* identifier[x-ecpr] only DkCoreXeCprIdentifier + * ^short = "[DA] X-eCPR, tildelt fra den nationale eCPR service" +* identifier[d-ecpr] only DkCoreDeCprIdentifier + * ^short = "[DA] D-eCPR, decentral eCPR" * name ^slicing.discriminator.type = #value * ^slicing.discriminator.path = "use" * ^slicing.rules = #open @@ -54,7 +61,7 @@ Usage: #example * address.use = #home * address.type = #postal * address.line = "Nordre Ringgade 3" -* address.city = "Frederiksberg C" +* address.city = "Aarhus" * address.postalCode = "8000" * address.country = "DK" * maritalStatus = $v3-MaritalStatus#U "unmarried" @@ -69,6 +76,8 @@ Description: "Example of a patient with confidential adress and name" Usage: #example * text.div = "
This instance is an example of a Danish citizen who has requested name and address protection (Navne- og adressebeskyttelse), why the instance is marked with a security label. Only personnel using systems in public/official affairs are allowed to see name and address for the citizen, why these information are included in the profile.

Resource \"Confidential\"

Profile: Danish Core Patient Profile

Security Labels: http://terminology.hl7.org/CodeSystem/v3-Confidentiality

identifier: id: 1502779995

name: Hans Hansen (OFFICIAL)

gender: male

birthDate: 1976-08-09

address: Julianevej 22 6000 Kolding (HOME)

" * text.status = #additional +* meta.security.code = $v3-Confidentiality#R +* meta.security.display = "Restricted" * identifier.system = "urn:oid:1.2.208.176.1.2" * identifier.value = "1502779995" * name.use = #official @@ -79,7 +88,9 @@ Usage: #example * birthDate = "1977-02-15" * address.use = #home * address.line = "Julianevej 22" -* address.city = "6000 Kolding" +* address.city = "Kolding" +* address.postalCode = "6000" + Instance: else InstanceOf: DkCorePatient @@ -116,7 +127,7 @@ Usage: #example * generalPractitioner.identifier.value = "487341000016005" * generalPractitioner.display = "Charlottenlund Lægehus" -Instance: mogensen +Instance: Max InstanceOf: DkCorePatient Title: "Example of valid patient with danish marital status" Description: "Example of valid patient with danish marital status" @@ -124,12 +135,13 @@ Usage: #example * identifier.system = "urn:oid:1.2.208.176.1.2" * identifier.value = "0107729995" * name.use = #official -* name.family = "Mogensen" -* name.given = "Jan" +* name.family = "Berggren" +* name.given[0] = "Max" +* name.given[1] = "Test" * name.prefix = "Mr" * gender = #male * birthDate = "1972-07-01" -* maritalStatus = $dk-marital-status#P "Registreret partnerskab" +* maritalStatus = $dk-marital-status#P Instance: ukendt InstanceOf: DkCorePatient @@ -139,11 +151,38 @@ Usage: #example * identifier.system = "http://rn.dk" * identifier.value = "0706830VJ9" * name.use = #temp -* name.family = "Ukendt" +* name.family.extension.url = "http://hl7.org/fhir/StructureDefinition/data-absent-reason" +* name.family.extension.valueCode = http://terminology.hl7.org/CodeSystem/data-absent-reason#unknown * name.given = "Anders" * gender = #male * birthDate = "1983-06-07" + +Instance: ukendt-D-eCPR +InstanceOf: DkCorePatient +Title: "Example of valid patient with a D-eCPR as identifier" +Description: "Example of valid patient with a D-eCPR as identifier." +Usage: #example +* identifier.system = #urn:oid:1.2.208.176.1.6.1.3.177 +* identifier.value = "1206550VK9" +* name.use = #temp +* name.family.extension.url = "http://hl7.org/fhir/StructureDefinition/data-absent-reason" +* name.family.extension.valueCode = http://terminology.hl7.org/CodeSystem/data-absent-reason#unknown +* name.given = "Peter" +* gender = #male + +Instance: ukendt-X-eCPR +InstanceOf: DkCorePatient +Title: "Example of valid patient with a X-eCPR as identifier" +Description: "Example of valid patient with a X-eCPR as identifier." +Usage: #example +* identifier.system = "urn:oid:1.2.208.176.1.6.1.1" +* identifier.value = "0703921VJ4" +* name.use = #temp +* name.family = "Madsen" +* gender = #female +* birthDate = "1992-03-07" + Invariant: marital-status-unknown-usage Description: "Status in maritalStatus is unknown in a danish context. Consider mapping the value to UNK. See https://cpr.dk/borgere/hvad-staar-der-om-mig-i-cpr-registerindsigt/hvad-og-hvem-er-registreret-i-cpr-og-hvem-opdaterer-oplysninger-om-dig-i-cpr/" Severity: #warning diff --git a/input/fsh/DkCorePractitioner.fsh b/input/fsh/DkCorePractitioner.fsh index 9f6e19a1b..d9bef145d 100644 --- a/input/fsh/DkCorePractitioner.fsh +++ b/input/fsh/DkCorePractitioner.fsh @@ -25,6 +25,15 @@ Usage: #example * name.given = "Abraham" * name.family = "Murakami" +Instance: SidselSygeplejerske +InstanceOf: DkCorePractitioner +Title: "SidselSygeplejerske" +Description: "Eksempel på en sygeplejerske" +Usage: #example +* qualification.code = $DkCoreProfessionGroupCodes#5166 "Sygeplejerske" +* name.given = "Sidsel" +* name.family = "Andersen" + Instance: HanneSocialraadgiver InstanceOf: DkCorePractitioner Title: "HanneSocialrådgiver" diff --git a/input/fsh/DkCoreeCprIdentifier.fsh b/input/fsh/DkCoreeCprIdentifier.fsh new file mode 100644 index 000000000..6ad68153f --- /dev/null +++ b/input/fsh/DkCoreeCprIdentifier.fsh @@ -0,0 +1,35 @@ +Profile: DkCoreXeCprIdentifier +Parent: Identifier +Id: dk-core-x-ecpr-identifier +Title: "National eCPR service, called X-eCPR" +Description: "This strucure holds the danish [X-eCPR](https://www.nspop.dk/pages/viewpage.action?pageId=226757583#eCPRFormater(XeCPRogDeCPR)-Formatetfornationaleerstatningspersonnumre-X-eCPR) identifier, maintained by the Danish Health Data Authority." +* use = #temp (exactly) +* system 1.. +* system = "urn:oid:1.2.208.176.1.6.1.1" (exactly) +* value 1.. + * obeys x-ecpr + * ^maxLength = 10 + * ^mustSupport = false + +Invariant: x-ecpr +Description: "Requirement of danish X-eCPR. See https://www.nspop.dk/pages/viewpage.action?pageId=226757583#eCPRFormater(XeCPRogDeCPR)-Formatetfornationaleerstatningspersonnumre-X-eCPR" +Severity: #error +Expression: "value.matches('^((((0[1-9]|1[0-9]|2[0-9]|3[0-1])(01|03|05|07|08|10|12))|((0[1-9]|1[0-9]|2[0-9]|30)(04|06|09|11))|((0[1-9]|1[0-9]|2[0-9])(02)))([0-9]{2})((1|7){1})([A-Z]{2})([0-9]{1}))$')" + +Profile: DkCoreDeCprIdentifier +Parent: Identifier +Id: dk-core-d-ecpr-identifier +Title: "Decentralised eCPR, called D-eCPR" +Description: "This strucure holds the danish [D-eCPR](https://www.nspop.dk/pages/viewpage.action?pageId=226757583#eCPRFormater(XeCPRogDeCPR)-Formatetfordecentraleerstatningspersonnumre-D-eCPR) identifier, which is often used by the Danish regions." +* use = #temp (exactly) +* system 1.. +* system from DkCoreDeCPRValueSet +* value 1.. + * obeys d-ecpr + * ^maxLength = 10 + * ^mustSupport = false + +Invariant: d-ecpr +Description: "Requirement of danish D-eCPR. See https://www.nspop.dk/pages/viewpage.action?pageId=226757583#eCPRFormater(XeCPRogDeCPR)-Formatetfordecentraleerstatningspersonnumre-D-eCPR" +Severity: #error +Expression: "value.matches('^((((0[1-9]|1[0-9]|2[0-9]|3[0-1])(01|03|05|07|08|10|12))|((0[1-9]|1[0-9]|2[0-9]|30)(04|06|09|11))|((0[1-9]|1[0-9]|2[0-9])(02)))([0-9]{2})((0|5|6){1})([A-Z]{2})([0-9]{1}))$')" diff --git a/input/fsh/Lpr3Identifier.fsh b/input/fsh/Lpr3Identifier.fsh index cb63f6f3c..1cf326a6d 100644 --- a/input/fsh/Lpr3Identifier.fsh +++ b/input/fsh/Lpr3Identifier.fsh @@ -14,4 +14,5 @@ Severity: #error Expression: "matches('urn:uuid:[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[5][a-fA-F0-9]{3}-[89aAbB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}')" * requirements = "LPR3 episode of care identifiers must conform to a UUIDv5" * source = "https://scandihealth.github.io/lpr3-docs/" - */ \ No newline at end of file +*/ + diff --git a/input/fsh/aliases.fsh b/input/fsh/aliases.fsh index 56440b845..9d1e23ba3 100644 --- a/input/fsh/aliases.fsh +++ b/input/fsh/aliases.fsh @@ -23,3 +23,5 @@ Alias: $observation-vitalsigns = http://hl7.org/fhir/StructureDefinition/vitalsi Alias: $observation-bodyweight = http://hl7.org/fhir/StructureDefinition/bodyweight Alias: $observation-heartrate = http://hl7.org/fhir/StructureDefinition/heartrate Alias: $observation-bp = http://hl7.org/fhir/StructureDefinition/bp +Alias: $LOINC-vitalsigns = http://hl7.org/fhir/ValueSet/observation-vitalsignresult +Alias: $v3-Confidentiality = http://terminology.hl7.org/CodeSystem/v3-Confidentiality \ No newline at end of file diff --git a/input/fsh/codeSystems.fsh b/input/fsh/codeSystems.fsh index 49c1d4bed..f43b707ca 100644 --- a/input/fsh/codeSystems.fsh +++ b/input/fsh/codeSystems.fsh @@ -700,4 +700,20 @@ Title: "DK Request Status" * ^designation.language = #da * ^designation.use.system = "http://snomed.info/sct" * ^designation.use = $sct#900000000000013009 - * ^designation.value = "Ukendt" \ No newline at end of file + * ^designation.value = "Ukendt" + + +CodeSystem: DkCoreDeCPRCodes +Id: dk-core-d-ecpr-codes +Title: "DK Decentralised eCPR Systems" +Description: "DK " +* ^experimental = false +* ^status = #active +* ^content = #complete +* ^caseSensitive = false +* #urn:oid:1.2.208.176.1.6.1.3 "D-eCPR" +* #urn:oid:1.2.208.176.1.6.1.3.177 "D-eCPR fra Region Sjælland" +* #urn:oid:1.2.208.176.1.6.1.3.179 "D-eCPR fra Region Nordjylland" +* #urn:oid:1.2.208.176.1.6.1.3.181 "D-eCPR fra Region Midtjylland" +* #urn:oid:1.2.208.176.1.6.1.3.183 "D-eCPR fra Region Syddanmark" +* #urn:oid:1.2.208.176.1.6.1.3.187 "D-eCPR fra Region Hovedstaden" \ No newline at end of file diff --git a/input/fsh/valueSets.fsh b/input/fsh/valueSets.fsh index 5dc2d87f6..0b8820220 100644 --- a/input/fsh/valueSets.fsh +++ b/input/fsh/valueSets.fsh @@ -21,18 +21,224 @@ Description: "Subdivision codes (Regional codes) used in Denmark" * ^experimental = false * include codes from system DKCoreRegionalSubdivisionCodes -ValueSet: LoincVitalSigns -Id: dk-core-LoincVitalSigns -Title: "DK Core Vital Signs" -Description: "LOINC codes describing vital signs." +ValueSet: LoincBasicObservation +Id: dk-core-LoincBasicObservation +Title: "DK Core LOINC Basic Observations" +Description: "LOINC codes describing Basic Observations usable in Denmark." * ^experimental = false * $LOINC#9279-1 "Respiratory rate" * $LOINC#8867-4 "Heart rate" * $LOINC#2708-6 "Oxygen saturation in Arterial blood" * $LOINC#8310-5 "Body temperature" +* $LOINC#85353-1 "Vital signs, weight, height, head circumference, oxygen saturation & BMI panel" +* $LOINC#8302-2 "Body height" +* $LOINC#9843-4 "Head Occipital-frontal circumference" +* $LOINC#29463-7 "Body weight" +* $LOINC#39156-5 "Body mass index (BMI) [Ratio]" +* $LOINC#85354-9 "Blood pressure panel with all children optional" * $LOINC#8480-6 "Systolic blood pressure" * $LOINC#8462-4 "Diastolic blood pressure" +* $LOINC#8478-0 "Mean blood pressure" +* $LOINC#59408-5 "Oxygen saturation in Arterial blood by Pulse oximetry" +ValueSet: SCTBasicObservation +Id: dk-core-SCTBasicObservation +Title: "Dk Core SNOMED CT Basic Observation" +Description: "SNOMED CT codes for Basic Observations usable in Denmark" +* ^experimental = false +//Vital signs +* $sct#446226005 //Diastolic blood pressure on admission +* $sct#400975005 //Standing diastolic blood pressure +* $sct#407557002 //Lying diastolic blood pressure +* $sct#407555005 //Sitting diastolic blood pressure +* $sct#271650006 //Diastolic blood pressure +* $sct#72313002 //Systolic arterial pressure +* $sct#400974009 //Standing systolic blood pressure +* $sct#399304008 //Systolic blood pressure on admission +* $sct#407556006 //Lying systolic blood pressure +* $sct#407554009 //Sitting systolic blood pressure +* $sct#271649006 //Systolic blood pressure +* codes from system $sct where concept is-a #431314004 //SpO2 +* $sct#422119006 //Brachial pulse rate +* $sct#429614003 //Posterior tibial pulse rate +* $sct#429525003 //Dorsalis pedis pulse rate +* $sct#399017001 //Heart rate on admission +* $sct#78564009 //Pulse rate +* $sct#444981005 //Resting heart rate +* $sct#364075005 //Heart rate +* $sct#424927000 //Body weight with shoes +* $sct#445541000 // Dry body weight +* $sct#425024002 // Body weight without shoes +* $sct#364589006 //Birth weight +* $sct#27113001 //Body weight +* codes from system $sct where concept is-a #86290005 //(Respiratory rate) +* codes from system $sct where concept is-a #276885007 // Core Body temperature +* $sct#1153637007 //Body height (observable entity)| +* $sct#248333004 //|Standing height (observable entity)| +* $sct#1149101003 //|Recumbent body height| +* $sct#1162392001 //|Pre-amputation measured body height| + + +ValueSet: IEEEBasicObservation +Id: dk-core-IEEEBasicObservation +Title: "Dk Core IEEE Basic Observation" +Description: "IEEE MDC codes for Basic Observations usable in Denmark" +* ^experimental = false +* ^copyright = "IEEE" +* ^purpose = """ +### Purpose of this ValueSet +This ValueSet comprises the most common IEEE MDC codes used to represent observations +that are considered "basic" by this profile. This ValueSet is **not** meant to be exhaustive! + +The origin of an MDC code is usually the equipment used to perform the measurement, +and often the code carries supplemental information about how (or where on the body) +the observation was performed. +""" +* $IEEEx73#151562 "MDC_RESP_RATE" + * ^designation.use = $sct#900000000000003001 + * ^designation.value = "Rate of breathing; method not specified." +* $IEEEx73#151570 "MDC_AWAY_RESP_RATE" + * ^designation.use = $sct#900000000000003001 + * ^designation.value = "Rate of breathing; method: direct airway flow measurement." +* $IEEEx73#151578 "MDC_TTHOR_RESP_RATE" + * ^designation.use = $sct#900000000000003001 + * ^designation.value = "Rate of breathing; method: transthoracic impedance variations." +* $IEEEx73#151594 "MDC_CO2_RESP_RATE" + * ^designation.use = $sct#900000000000003001 + * ^designation.value = "Rate of breathing; method: carbon dioxide measurement." +* $IEEEx73#151602 "MDC_PRESS_RESP_RATE" + * ^designation.use = $sct#900000000000003001 + * ^designation.value = "Rate of breathing; method: non-airway pressure measurement, e.g. central venous blood pressure (CVP)." +* $IEEEx73#151650 "MDC_ACOUSTIC_RESP_RATE" + * ^designation.use = $sct#900000000000003001 + * ^designation.value = "Rate of breathing; method: acoustic." +* $IEEEx73#151658 "MDC_PULS_OXIM_PLETH_RESP_RATE" + * ^designation.use = $sct#900000000000003001 + * ^designation.value = "Rate of breathing; method: SpO2 plethysmography." +* $IEEEx73#8410992 "MDC_SABTE_RESP_RATE" + * ^designation.use = $sct#900000000000003001 + * ^designation.value = "Value of respiration rate. [measured by sleep apnoea breathing therapy equipment]" +* $IEEEx73#149514 "MDC_PULS_RATE" + * ^designation.use = $sct#900000000000003001 + * ^designation.value = "Rate of blood pulse in an artery." +* $IEEEx73#149522 "MDC_BLD_PULS_RATE_INV" + * ^designation.use = $sct#900000000000003001 + * ^designation.value = "Rate of blood pulse in an artery, measured invasively." +* $IEEEx73#149546 "MDC_PULS_RATE_NON_INV" + * ^designation.use = $sct#900000000000003001 + * ^designation.value = "Rate of blood pulse in an artery, measured non-invasively." +* $IEEEx73#149530 "MDC_PULS_OXIM_PULS_RATE" + * ^designation.use = $sct#900000000000003001 + * ^designation.value = "Rate of blood pulse as obtained by pulse oximetry." +* $IEEEx73#147842 "MDC_ECG_HEART_RATE" + * ^designation.use = $sct#900000000000003001 + * ^designation.value = "Rate of cardiac beats (ECG)." +* $IEEEx73#8410590 "MDC_ECG_HEART_RATE_INSTANT" + * ^designation.use = $sct#900000000000003001 + * ^designation.value = "Instantaneous heart rate." +* $IEEEx73#149554 "MDC_TTHOR_HEART_RATE" + * ^designation.use = $sct#900000000000003001 + * ^designation.value = "Heart rate obtained from the variation of transthoracic impedance." +* $IEEEx73#149562 "MDC_PALPATION_HEART_RATE" + * ^designation.use = $sct#900000000000003001 + * ^designation.value = "Heart rate obtained from an artery that is close to the surface and a pulse can be felt." +* $IEEEx73#8454258 "MDC_HF_HR" + * ^designation.use = $sct#900000000000003001 + * ^designation.value = "This is an object representing the heart rate over a period of time. [Exercise / fitness equipment]" +* $IEEEx73#150324 "MDC_SAT_O2_ART" + * ^designation.use = $sct#900000000000003001 + * ^designation.value = "Arterial oxygen saturation. [no method]" +* $IEEEx73#150456 "MDC_PULS_OXIM_SAT_O2" + * ^designation.use = $sct#900000000000003001 + * ^designation.value = "Oxygen saturation. [using pulse oximetry]" +* $IEEEx73#150364 "MDC_TEMP_BODY" + * ^designation.use = $sct#900000000000003001 + * ^designation.value = "Body temperature. [unspecified]" +* $IEEEx73#150368 "MDC_TEMP_CORE" + * ^designation.use = $sct#900000000000003001 + * ^designation.value = "Core temperature." +* $IEEEx73#150388 "MDC_TEMP_SKIN" + * ^designation.use = $sct#900000000000003001 + * ^designation.value = "Skin temperature." +* $IEEEx73#150392 "MDC_TEMP_TYMP" + * ^designation.use = $sct#900000000000003001 + * ^designation.value = "Tympanic temperature." +* $IEEEx73#188420 "MDC_TEMP_RECT" + * ^designation.use = $sct#900000000000003001 + * ^designation.value = "Rectal temperature." +* $IEEEx73#188424 "MDC_TEMP_ORAL" + * ^designation.use = $sct#900000000000003001 + * ^designation.value = "Oral temperature." +* $IEEEx73#188428 "MDC_TEMP_EAR" + * ^designation.use = $sct#900000000000003001 + * ^designation.value = "Ear temperature." +* $IEEEx73#188452 "MDC_TEMP_AXILLA" + * ^designation.use = $sct#900000000000003001 + * ^designation.value = "Axillary (armpit) temperature." +* $IEEEx73#188456 "MDC_TEMP_GIT" + * ^designation.use = $sct#900000000000003001 + * ^designation.value = "Gastro-intestinal tract temperature." +* $IEEEx73#188740 "MDC_LEN_BODY_ACTUAL" + * ^designation.use = $sct#900000000000003001 + * ^designation.value = "The actual height of the patient." +* $IEEEx73#153856 "MDC_CIRCUM_HEAD" + * ^designation.use = $sct#900000000000003001 + * ^designation.value = "Circumference of the head." +* $IEEEx73#188736 "MDC_MASS_BODY_ACTUAL" + * ^designation.use = $sct#900000000000003001 + * ^designation.value = "The measurement of the mass of patient." +* $IEEEx73#188752 "MDC_RATIO_MASS_BODY_LEN_SQ" + * ^designation.use = $sct#900000000000003001 + * ^designation.value = "The individual's body weight, in kilograms, divided by the square of height, in meters." +* $IEEEx73#150020 "MDC_PRESS_BLD_NONINV" + * ^designation.use = $sct#900000000000003001 + * ^designation.value = "Pressure of the blood, obtained noninvasively." +* $IEEEx73#150021 "MDC_PRESS_BLD_NONINV_SYS" + * ^designation.use = $sct#900000000000003001 + * ^designation.value = "Pressure of the blood, obtained noninvasively, at the systolic phase." +* $IEEEx73#150022 "MDC_PRESS_BLD_NONINV_DIA" + * ^designation.use = $sct#900000000000003001 + * ^designation.value = "Pressure of the blood, obtained noninvasively, at the diastolic phase." +* $IEEEx73#150023 "MDC_PRESS_BLD_NONINV_MEAN" + * ^designation.use = $sct#900000000000003001 + * ^designation.value = "Pressure of the blood, obtained noninvasively, as computed by averaging on one cycle." + +ValueSet: NPUBasicObservation +Id: dk-core-NPUBasicObservation +Title: "Dk Core NPU Basic Observation" +Description: "NPU codes for Basic Observations usable in Denmark" +* ^experimental = false +* $NPU#NPU03011 "Hb(Fe; O₂-bind.;aB)—Oxygen(O₂); sat. = ?" +* $NPU#NPU27280 "Hb(Fe; O₂-bind.;aB)—Oxygen(O₂); sat.(Pulse oximetry) = ?" +* $NPU#NPU04034 "Pt(spec.)—Blood; temp. = ? °C" +* $NPU#NPU08676 "Pt—Body; temp. = ? °C" +* $NPU#NPU58033 "Artery(spec.)—Blood pressure(systolic); pr.(proc.) = ? mmHg" +* $NPU#NPU57947 "Artery(spec.)—Blood; pr.(systolic;proc.) = ? mmHg" +* $NPU#NPU58034 "Artery(spec.)—Blood pressure(diastolic); pr.(proc.) = ? mmHg" +* $NPU#NPU57948 "Artery(spec.)—Blood; pr.(diastolic;proc.) = ? mmHg" +* $NPU#NPU21692 "Heart—Systole; freq. = ? * 1/min" +* $NPU#NPU03794 "Pt—Body; height = ? m" +* $NPU#NPU03804 "Pt—Body; mass = ? kg" +* $NPU#NPU27281 "Pt—Body; mass coefficient(mass/squared height) = ? kg/m²" + +ValueSet: UCUMBasicUnits +Id: dk-core-UCUM-BasicUnits +Title: "Dk Core UCUM Basic Units" +Description: "UCUM codes to represent units for basic Observations usable in Denmark" +* ^experimental = false +* $ucum#% "percent" +* $ucum#cm "centimeter" +* $ucum#[in_i] "inch (international)" +* $ucum#kg "kilogram" +* $ucum#g "gram" +* $ucum#[lb_av] "pound (US and British)" +* $ucum#Cel "degree Celsius" +* $ucum#[degF] "degree Fahrenheit" +* $ucum#mm[Hg] "millimeter of mercury" +* $ucum#/min "per minute" +* $ucum#kg/m2 "kilogram / (meter ^ 2)" +* $ucum#m2 "square meter" +* $ucum#{fraction} "fraction" ValueSet: TechniquesSCTCodes Id: dk-core-TechniquesSCTCodes @@ -42,3 +248,11 @@ Description: "SNOMED CT Codes for the technique used when obtaining an observati * $sct#761996005 "Estimation technique (qualifier value)" * $sct#733985002 "Reported (qualifier value)" * $sct#272391002 "Measurement technique (qualifier value)" + +ValueSet: DkCoreDeCPRValueSet +Id: DkCoreDeCPRValueSet +Title: "DK D-eCPR OID values" +Description: "DK D-eCPR OID values" +* ^experimental = false +* ^status = #active +* include codes from system DkCoreDeCPRCodes diff --git a/input/ignoreWarnings.txt b/input/ignoreWarnings.txt index 7a54de118..7a87bcbf9 100644 --- a/input/ignoreWarnings.txt +++ b/input/ignoreWarnings.txt @@ -1,16 +1,14 @@ == Suppressed Messages == # The real A&D devices actually produce these strings with an extra space at the end. So to make the examples realistic, we accept this bad behaviour here -WARNING: Bundle/ContinuaBundleWithDevice: Bundle.entry[2].resource/*Device/BPMonitor.C4F312FFFE53F2C9*/.manufacturer: value should not start or finish with whitespace% -WARNING: Bundle/ContinuaBundleWithDevice: Bundle.entry[2].resource/*Device/BPMonitor.C4F312FFFE53F2C9*/.modelNumber: value should not start or finish with whitespace% -WARNING: Bundle/ContinuaBundleWithDevice: Bundle.entry[2].resource/*Device/BPMonitor.C4F312FFFE53F2C9*/.version[3].value: value should not start or finish with whitespace% -WARNING: Device/WeightScale.606405FFFECFC604: Device.modelNumber: value should not start or finish with whitespace% -WARNING: Device/WeightScale.606405FFFECFC604: Device.manufacturer: value should not start or finish with whitespace% - -# This is the "Conditional Create"-identifier (see http://hl7.org/fhir/uv/phd/ObservationIdentifier.html) used to create a unique hash value of the observation to prevent duplicates - and therefore DOES carry a meaning without a system -#WARNING: Observation/ObservationHeightVitalSigns: Observation.category[0].coding[0]: A code with no system has no defined meaning. A system should be provided -#WARNING: StructureDefinition/dk-core-observation-vitalsigns: StructureDefinition.snapshot.element[13].pattern.ofType(CodeableConcept).coding[0]: A code with no system has no defined meaning. A system should be provided -#WARNING: StructureDefinition/dk-core-observation-vitalsigns: StructureDefinition.differential.element[1].pattern.ofType(CodeableConcept).coding[0]: A code with no system has no defined meaning. A system should be provided +%Device/BPMonitor.C4F312FFFE53F2C9: Device.manufacturer: value should not start or finish with whitespace% +%Device/BPMonitor.C4F312FFFE53F2C9*/.manufacturer: value should not start or finish with whitespace% +%Device/BPMonitor.C4F312FFFE53F2C9: Device.modelNumber: value should not start or finish with whitespace% +%Device/BPMonitor.C4F312FFFE53F2C9*/.modelNumber: value should not start or finish with whitespace% +%Device/BPMonitor.C4F312FFFE53F2C9: Device.version[3].value: value should not start or finish with whitespace% +%Device/BPMonitor.C4F312FFFE53F2C9*/.version[3].value: value should not start or finish with whitespace% +%Device/WeightScale.606405FFFECFC604: Device.modelNumber: value should not start or finish with whitespace% +%Device/WeightScale.606405FFFECFC604: Device.manufacturer: value should not start or finish with whitespace% # This code DOES exist and is published by IEEE. But somehow the code system tooling missed it along the way ERROR: Bundle/ContinuaBundleWithDevice: Bundle.entry[7].resource/*Observation/BloodPressureStatus.Poul.133527*/.code.coding[0]: Local Error: Resolved system urn:iso:std:iso:11073:10101 (v2.0.1), but the definition is not complete. Server Error: The code "8410608" is not valid in the system urn:iso:std:iso:11073:10101; The code provided (urn:iso:std:iso:11073:10101#8410608) is not valid in the value set 'All codes known to the system' (from http://tx.fhir.org/r4) for 'urn:iso:std:iso:11073:10101#8410608' diff --git a/input/pagecontent/StructureDefinition-dk-core-basic-observation-intro.md b/input/pagecontent/StructureDefinition-dk-core-basic-observation-intro.md new file mode 100644 index 000000000..6d7738fc9 --- /dev/null +++ b/input/pagecontent/StructureDefinition-dk-core-basic-observation-intro.md @@ -0,0 +1,40 @@ +### Scope and usage +The Danish Core Basic Observation profile is intended to represent basis observations performed on a subject. The purpose of this profile is to ensure a common structure of frequently measured and shared observations. A basic observation is, in a Danish context, a measurable and often used value. This can be observations such as vital signs and basic observations like height and weight. + +The profile is a further profiling of DkCoreObservation and in most cases it complies to [HL7's Vital Signs profile](http://hl7.org/fhir/R4/vitalsigns.html). Since there is an expansion of one code to each of the LOINC ValueSet and the UCUM ValueSet, it means when using these codes, the instance will not be compliant. + +#### Codes +It is required to include a LOINC code at Observation.code. The [LOINC ValueSet](http://hl7.org/fhir/R4/valueset-observation-vitalsignresult.html) used in the HL7's Vital Signs profile is expanded with the code `59408-5 "Oxygen saturation in Arterial blood by Pulse oximetry"` because it is an often used, measurable parameter in Denmark. + +Further, [Dk Core NPU Basic Observation](./ValueSet-dk-core-NPUBasicObservation.html), [Dk Core IEEE Basic Observation](./ValueSet-dk-core-IEEEBasicObservation.html), and [Dk Core SNOMED CT Basic Observation](./ValueSet-dk-core-SCTBasicObservation.html) ValueSets are added to the given slices, and codes from these ValueSets are optional to include. + +An overall guidance of using the ValueSets follows the guidance of DkCoreObservation and is further specified here: +* NPU codes can be used when communicating observations from the laboratory area. NPU also covers codes concerning basic observations. For this reason, NPU is included. +* IEEE codes can be used, if the original observation of the device is represented with IEEE codes. +* SNOMED CT codes are accepted in Denmark. They can be included as a reference terminology, where it is used in addition to the original coding. SNOMED CT codes can also be used in areas where NPU does not cover. + +The codes in the three ValueSets are selected to best represent the codes included in the LOINC ValueSet. The following describes the possible use of additional codes: +* No meaningful code: Not all LOINC codes are represented in ValueSets, as no meaningful codes exists in the terminology. An example is that the `8478-0 Mean blood pressure` does not exists in the NPUBasicObservation ValueSet. +* One meaningful code: When one meaningful code is included from the ValueSet, as the code best represents the LOINC code. An example is the `150022 MDC_PRESS_BLD_NONINV_DIA` from the IEEE ValueSet which represents `8462-4 Diastolic blood pressure` the best. +* Multiple meaningful codes: Multiple codes in a ValueSet may be used to represent a code from the LOINC ValueSet, which may be relevant to express a higher level of granularity. An example is multiple codes representing systolic blood pressure in the SNOMED CT ValueSet depending on the circumstances of the measurement, which all represents `8480-6 Systolic blood pressure`. + +If a measurement is documented in a system or device e.g. with a SNOMED CT or IEEE code, but no LOINC code. The system must map the SNOMED CT or IEEE code to the LOINC code before exchanging it. Otherwise, it will not accommodate the requirements of the DkCoreBasicObservation profile, since a LOINC code is required. + +#### Units +The [UCUM ValueSet](http://hl7.org/fhir/ValueSet/ucum-vitals-common) used in HL7's Vital Signs profile is extended in the [Dk Core UCUM Basic Units ValueSet](./ValueSet-dk-core-UCUM-BasicUnits.html) to include a code for fraction `{fraction} fraction`. In the NPU ValueSet, this unit is used for the code `NPU27280 Hb(Fe; O2-bind.;aB)—Oxygen(O2); sat.(Pulse oximetry) = ?`, why it is included. However, using the fraction unit is not compliant with [HL7's Vital Signs profile](http://hl7.org/fhir/R4/vitalsigns.html), here the unit `% percent` is used for the LOINC code `"2708-6 "Oxygen saturation in Arterial blood"`. The example [John's oxygen saturation measurement (Observation)](./Observation-ObservationOxySatObservation.html) illustrates how this can be handled by deriving the instance with the NPU code from an instance with a LOINC and IEEE code. + +The Dk Core UCUM Basic Units ValueSet is added to the elements Observation.valueQuantity and Observation.component.valueQuantity. + +#### Examples +The table below includes instances of the DkCoreBasicObservation used to represent observations used to evaluate the patient based on different procedures used in Denmark. + +> Note: The current FHIR validator (per Nowember 2023) validates Observation instances with LOINC-codes from the [international Vital Signs profile](http://hl7.org/fhir/R4/vitalsigns.html) against the requirements in this profile. This have influenced instances in DkCore by 1) removal of the LOINC-code `"2708-6 "Oxygen saturation in Arterial blood"` in [John's oxygen saturation measurement (Observation)](./Observation-ObservationOxySatObservation.html) which means it cannot be an instance of DkCoreBasicObservation but has to obey from DkCoreObservation, and 2) addition of effective timestamps in [ObservationOxySatBasicObservationOrg](./Observation-ObservationOxySatBasicObservationOrg.html) and [ObservationRespiratoryBasicObservation](./Observation-ObservationRespiratoryBasicObservation.html). + +Example | Description +----------------- | ------------------------ +[Glasgow Coma Scale (GCS)](./Observation-MaxGlasgowComaScale.html) | This example includes the relevant observations related to Glasgow Coma Scale. This scale is used to assess the level of consciousness in people with brain damage. +[TOKS (Danish: Tidlig opsporing af kritisk sygdom)](./Bundle-MaxTOKS.html) | TOKS is a scoring system used to determine if a patient is in a critical state at an early state. The example includes basic observations, such as heartrate, temperature and more, as well as a Glasgow Coma Scale. +[TOBS (Danish: Tidlig opsporing af begyndende sygdom)](./Bundle-ElsesTOBS.html) | TOBS is a scoring system used to determine if a citizen is in the early state of illnesses. The example includes basic observations, such as heartrate, temperature, TOBS score and more, as well as a reference to the performer of the observations. +[Vital signs panel](./Observation-MaxVitalSignsPanel.html) | An example of observations included in a vital signs panel. From the element Observation.hasMember, the panel observations are referenced. +[John's oxygen saturation measurement (Observation)](./Observation-ObservationOxySatObservation.html) | This example suggests a way to handle the oxygen saturation case, where the original measurement was reported in '%' by a device or typed in manually, and then 'translated' to the NPU system, which requires the value to be unitless. + diff --git a/input/pagecontent/StructureDefinition-dk-core-observation-intro.md b/input/pagecontent/StructureDefinition-dk-core-observation-intro.md index 5b354f4af..71f1aa76e 100644 --- a/input/pagecontent/StructureDefinition-dk-core-observation-intro.md +++ b/input/pagecontent/StructureDefinition-dk-core-observation-intro.md @@ -2,12 +2,14 @@ The Danish Core Observation profile is intended to represent observations for a variety of cases including: * laboratory data * results of using clinical assessment tools such as APGAR -* device measurements such as Pulse Oximetry data * observations obtained in clinical assesments such as abdominal tenderness * general health status such as pregnancy * social history and anamnesis (Please be aware, an Observation must only include more than one code, if each code is true for the observation that actually happened, and not several observation as a result of an investigation. In this case, the ClinicalImpression resource should be used.) +>Note: The profile [DkCoreBasicObservation](./StructureDefinition-dk-core-basic-observation.html) is made to ensure a common structure of measurable and often used observations, such as vital signs, height and weight. When sharing these basic observations, DkCoreBasicObservation profile is recommended to use. + + #### Codes In a Observation resource, codes from CodeSystems are used to describe what is observed in the elements Observation.code.coding and Observation.component.code.coding. In these elements, multiple CodeSystems are specified to ensure similar use of relevant CodeSystems in a Danish context. Some observations may need to be grouped together to document critical observations, e.g. systolic and diastolic bloodpressure, which can be supported by the element Observation.component. [Click here for more information about Observation Grouping](http://hl7.org/fhir/observation.html#obsgrouping). @@ -42,5 +44,7 @@ All NPU-codes include a unit internally in the observation-code. All the other c #### Observation derived from other Observation An Observation can refer to another, possibly contained Observation from which it is derived. This can be used in cases where the measuring Device provides the measured value in, for instance, another unit or precision than used in a particular exchange context. -An example is an oxygen saturation measured as a fraction in, say, the NPU code system. Exchanging the measurement as a vital signs Observation with oxygen saturation given as percent, the original NPU-based measurement can be contained and referenced using `Observation.derivedFrom`. The example can be found in [John's oxygen saturation measurement](./Observation-ObservationOxySatVitalSigns.html). +An example is an oxygen saturation measured as a fraction in, say, the NPU code system. Exchanging the measurement as a vital signs Observation with oxygen saturation given as percent, the original NPU-based measurement can be contained and referenced using `Observation.derivedFrom`. The example can be found in [John's oxygen saturation measurement](./Observation-ObservationOxySatBasicObservationOrg.html). + + \ No newline at end of file diff --git a/input/pagecontent/StructureDefinition-dk-core-observation-vitalsigns-intro.md b/input/pagecontent/StructureDefinition-dk-core-observation-vitalsigns-intro.md deleted file mode 100644 index c6e07b9fa..000000000 --- a/input/pagecontent/StructureDefinition-dk-core-observation-vitalsigns-intro.md +++ /dev/null @@ -1,12 +0,0 @@ -### Scope and usage -The Danish Core Vital Sign Observation profile is intended to represent observations of vital signs. - -The profile uses the same apporach as applied in FHIR [International Patient Access (IPA) Observation](https://build.fhir.org/ig/HL7/fhir-ipa/StructureDefinition-ipa-observation.html#profile-specific-implementation-rules-and-guidance) with regards to vital signs. - - - -#### Examples -Example | Description ------------------ | ------------------------ -[Poul's home blood pressure measurement](https://hl7.dk/fhir/core/Bundle-ContinuaBundleWithDevice.html) | This example demonstrates a DkCoreObservationVitalSigns and Continua-compliant Bundle containing a home blood pressure measurement uploaded to a Continua-compliant “FHIR Observation Reporting Server”. -[Poul's A&D weight scale](https://hl7.dk/fhir/core/Observation-Weight.Poul.230221.html) | Poul has been instructed to perform a daily weighing in the morning. This is his daily weighing from Feb. 21st 2023. \ No newline at end of file diff --git a/input/pagecontent/StructureDefinition-dk-core-patient-intro.md b/input/pagecontent/StructureDefinition-dk-core-patient-intro.md index f1e8135c5..e86e8a439 100644 --- a/input/pagecontent/StructureDefinition-dk-core-patient-intro.md +++ b/input/pagecontent/StructureDefinition-dk-core-patient-intro.md @@ -1,16 +1,24 @@ ### Scope and usage -The Danish Core Patient profile is intended to encapsulate the most common and basic data model of patients in Danish healthcare systems covering both primary sector, secondary sector (specialty doctors and hospitals) and municipality cases. As such the profile should be usable in most Danish contexts. Note that the profile is usable for those that recieve health and social care in muicipalities, even in contexts where they are more commonly known as citizens ([DA] borgere). +The Danish Core Patient profile is intended to encapsulate the most common and basic data model of patients in Danish healthcare systems covering both primary sector, secondary sector (specialty doctors and hospitals) and municipality cases. As such the profile should be usable in most Danish contexts. Note that the profile is usable for those that recieve health and social care in municipalities, even in contexts where they are more commonly known as citizens ([DA] borgere). -#### Patient identifiers -This patient profile currently only reflects the use of the established national danish patient identifiers called [CPR](https://cpr.dk/). More official identifiers are expected to be used and profiled in the future, eg: +### Patient identifiers +This patient profile currently only reflects the use of the established national danish patient identifiers called [CPR](https://cpr.dk/) and (for patients without or with unknown CPR number) the use of replacement CPR numbers ([DA] Erstatnings-CPR-numre eller eCPR). Both national [X-eCPR](https://sundhedsdatastyrelsen.dk/da/registre-og-services/ecpr) numbers issued by the Danish Health Data Authority ([DA] Sundhedsdatastyrelsen) and [D-eCPR](https://sundhedsdatastyrelsen.dk/da/rammer-og-retningslinjer/om-patientregistrering/patientregistrering-feallesindhold) numbers primarily issued locally by one of the five danish regions are supported by this profile. More official identifiers are expected to be used and profiled in the future, eg: * [eID](https://ec.europa.eu/digital-single-market/en/trust-services-and-eid) - * [Official replacement CPR numbers](https://cpr.dk/cpr-systemet/erstatningspersonnummer-i-eksterne-systemer/) * **catastrophe** CPR numbers. -#### DkCoreCprIdentifier +#### CPR-identifier + +The element identifier.type describes the specific purpose of an identifier. It is desired to use the code 'NNDNK' from the CodeSystem [IdentifierType](https://terminology.hl7.org/4.0.0/CodeSystem-v2-0203.html) as the type for [DkCoreCprIdentifier](https://hl7.dk/fhir/core/StructureDefinition-dk-core-cpr-identifier.html). However, it is currently not recommended to use this code, due to known problems with the validation tool when validating the code 'NNDNK'. + +#### eCPR-identifier + +The element Patient.identifier includes two slices to represent eCPR. Each slice includes an identifier with requirements for the specific eCPR: +* For X-eCPR, the [DkCoreXeCprIdentifier](./StructureDefinition-dk-core-x-ecpr-identifier.html) must be use, which includes an OID as system and an invariant describing the requirements for the structure of the identifier, [based on guidelines from Danish Health Data Authority](https://www.nspop.dk/pages/viewpage.action?pageId=226757583#eCPRFormater(XeCPRogDeCPR)-Formatetfornationaleerstatningspersonnumre-X-eCPR). An example of usage can be seen in [here](./Patient-ukendt-X-eCPR.html). +* For D-eCPR, the [DkCoreDeCprIdentifier](./StructureDefinition-dk-core-d-ecpr-identifier.html) must be used, which includes a ValueSet of OID's that may be used as system. The OIDs represent the D-eCPR in general and D-eCPR for each of the five regions. Further, the identifier includes an invariant describing the requirements for the structure of the identifier, [based on guidelines from Danish Health Data Authority](https://www.nspop.dk/pages/viewpage.action?pageId=226757583#eCPRFormater(XeCPRogDeCPR)-Formatetfordecentraleerstatningspersonnumre-D-eCPR). An example of usage can be seen in [here](./Patient-ukendt-D-eCPR.html). + +In case it is necessary to include an eCPR which is not an X-eCPR or a D-eCPR, it is recommended to add a new slice with the relevant other system and the eCPR identifier from that system. This may be necessary for small practices or due to legacy reasons. An example of this can be seen [here](./Patient-ukendt.html). -The element identifier.type describe the specific purpose of an identifier. It is desired to use the code 'NNDNK' from the CodeSystem [IdentifierType](https://terminology.hl7.org/4.0.0/CodeSystem-v2-0203.html) as the type for [DkCoreCprIdentifier](https://hl7.dk/fhir/core/StructureDefinition-dk-core-cpr-identifier.html). However, it is currently not recommended to use this code, due to known problems with the validation tool when validating the code 'NNDNK'. ### Use of security label on patients Danish citizens that have requested name and address protection ([Navne- og adressebeskyttelse](https://www.retsinformation.dk/eli/lta/2017/646#idee1fb7b6-c7e7-429d-a738-881c5e486fa6)) should be labeled with the security label as follows: @@ -28,4 +36,7 @@ The element identifier.type describe the specific purpose of an identifier. It i ``` - Use of this label should be interpreted according to the law, rouhgly meaning that only personnel using systems in public/official affairs are allowed to see name and address for the patient/citizen. \ No newline at end of file +Use of this label should be interpreted according to the law, rouhgly meaning that only personnel using systems in public/official affairs are allowed to see name and address for the patient/citizen. + +### Unknown values or Absent values +There may be scenarios where it is not possible to supply all values as required by this profile. For such cases it is possible to specify a Data Absent Reason ([DAR](https://hl7.org/fhir/R4/extension-data-absent-reason.html)) extension which enables data fields to be supplied where data is not available. An example of this can be seen [here](./Patient-ukendt.html). The use of DAR is not restricted to the patient profile. \ No newline at end of file diff --git a/input/pagecontent/index.md b/input/pagecontent/index.md index fda54f6af..7b9c50433 100644 --- a/input/pagecontent/index.md +++ b/input/pagecontent/index.md @@ -7,6 +7,8 @@ This document is a working specification that is expected to be implemented and **Note**: This implementation guide is not (yet) a FHIR API specification, this will be a goal for the next iteration. +For more information about the Danish HL7 affiliate (HL7-Denmark), please go to [hl7.dk](https://www.hl7.dk). Here can you also find procurement recommendation in regards to FHIR, and an overview of some FHIR implementations in Denmark. + ### Scope The target group of this specification is any party that wants to specify FHIR standards for use in the Danish Health Sector. As a core-specification, a party that wants to use the specification should inherit from dk-core and build use-case specific profiles on top. As such, dk-core does not provide profiles for specific use use cases out-of-the-box. diff --git a/publication-request.json b/publication-request.json index 5a1d15dde..ca1fa6a2b 100644 --- a/publication-request.json +++ b/publication-request.json @@ -1,14 +1,14 @@ { "package-id": "hl7.fhir.dk.core", - "version": "3.0.0", - "path": "http://hl7.dk/fhir/core/3.0.0", + "version": "3.1.0", + "path": "http://hl7.dk/fhir/core/3.1.0", "status": "release", "sequence": "Release", - "mode" : "milestone", + "mode" : "working", "title": "HL7 FHIR Implementation Guide: DK Core", "category": "National Core", "introduction": "A FHIR Implementation Guide for the Danish common needs across healthcare sectors", - "desc": "DK Core version 3.0.0", + "desc": "DK Core version 3.1.0", "descmd": "@release-notes.md", "first": false, "ci-build": "https://build.fhir.org/ig/hl7dk/dk-core" diff --git a/release-notes.md b/release-notes.md index 0ccae086b..bc501d448 100644 --- a/release-notes.md +++ b/release-notes.md @@ -1,13 +1,8 @@ -Dk-core version 3.0.0 has been approved by HL7 Denmark. This version is the result of external consultation of Dk-core v. 2.2.0. +Dk-core version 3.1.0 has been approved by HL7 Denmark. -The changes between 2.2.0 and 3.0.0 are: -* Update of the introduction of DkCoreCondition -* Addition of the DkCoreCondition instance JohnFracture which illustrates the use of SKS tillægskode. -* Update of the introduction of DkCoreObservation, including information about which CodeSystems are recommended in the standard catalogue from the Danish Health Data Agency. -* Update of the Observation.code.coding:SNOMEDCT and Observation.component.code.coding:SNOMEDCT to http://snomed.info/sct -* Update of the Observation.code.coding:MedCom and Observation.component.code.coding: MedCom to http://medcomfhir.dk/ig/terminology/CodeSystem/medcom-observation-codes -* Added context on extension ConditionLastAssertedDate and NotFollowedAnymore -* Bug update of invariants by changing constraint.requirements to requirements and removing of constraint.source where relevant. -* Bug update of invariants by removing the ‘value.’ and ‘Observation.’ where relevant -* Bug update of ValueSet TechniquesSCTCodes due to misspelling -* Update of DkCoreObservations instances with a LOINC code corresponding to the codes in the international VitalSigns profile, due to update of FHIR validator. Missing effective timestamp were included. \ No newline at end of file +The changes between 3.0.0 and 3.1.0 are: +* Addition of the profile DkCoreBasicObservation, associated documentation and examples. +* Update of Observation-instances to accommodate update in the FHIR Validator (https://chat.fhir.org/#narrow/stream/179177-conformance/topic/Vitalsigns.20Profiles) +* Addition of patient replacement identifiers (DK: erstatningsCPR) and inclusion in DkCorePatient. +* Added description of scenarios where Patient.name is unknown or absent. +* Addition of link to hl7.dk on the index-page. diff --git a/sushi-config.yaml b/sushi-config.yaml index dcf3fdcb5..771beb9a0 100644 --- a/sushi-config.yaml +++ b/sushi-config.yaml @@ -7,8 +7,8 @@ canonical: http://hl7.dk/fhir/core name: DKCore title: "HL7 FHIR Implementation Guide: DK Core" description: A FHIR Implementation Guide for the Danish common needs across healthcare sectors -status: active #draft -version: 3.0.0 +status: active +version: 3.1.0 fhirVersion: 4.0.1 copyrightYear: 2021+ license: CC0-1.0