From c4c073f55e20ecd7ecf626821f13c0feeeef1837 Mon Sep 17 00:00:00 2001 From: tmsMedcom <88831880+tmsMedcom@users.noreply.github.com> Date: Fri, 6 Oct 2023 10:05:55 +0200 Subject: [PATCH 01/11] Updated Observation.coding.system #94 and #85 --- input/fsh/DkCoreObservation.fsh | 2 +- input/fsh/aliases.fsh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/input/fsh/DkCoreObservation.fsh b/input/fsh/DkCoreObservation.fsh index 825cb65f5..278dd4b05 100644 --- a/input/fsh/DkCoreObservation.fsh +++ b/input/fsh/DkCoreObservation.fsh @@ -22,7 +22,7 @@ Description: "HL7 Denmark core profile for observations" * code.coding[SNOMEDCT] * ^short = "SNOMED CT code for the observation" * system 1.. - * system = "https://www.snomed.org/" (exactly) + * system = "http://snomed.info/sct" (exactly) * code 1.. * code.coding[NPU] * ^short = "NPU code for the observation. NPU codes are administred by the Danish Health Data Authority." diff --git a/input/fsh/aliases.fsh b/input/fsh/aliases.fsh index 8d01b894b..56440b845 100644 --- a/input/fsh/aliases.fsh +++ b/input/fsh/aliases.fsh @@ -14,7 +14,7 @@ Alias: $sor-organization-type = http://hl7.dk/fhir/core/ValueSet/sor-organizatio Alias: $dk-marital-status_1 = http://hl7.dk/fhir/core/ValueSet/dk-marital-status Alias: $ucum = http://unitsofmeasure.org Alias: $NPU = urn:oid:1.2.208.176.2.1 -Alias: $Medcom = https://terminology.medcom.dk/fhir/observation-code +Alias: $Medcom = http://medcomfhir.dk/ig/terminology/CodeSystem/medcom-observation-codes Alias: $SKS = urn:oid:1.2.208.176.2.4 Alias: $LOINC = http://loinc.org Alias: $IEEEx73 = urn:iso:std:iso:11073:10101 From 7dff6be1c52d9e1fb3dc9e0ad1b3cd55c7369bb5 Mon Sep 17 00:00:00 2001 From: kirstinerosenbeck Date: Mon, 9 Oct 2023 18:14:59 +0200 Subject: [PATCH 02/11] =?UTF-8?q?Condition-instance=20with=20SKS=20Till?= =?UTF-8?q?=C3=A6gskode=20added=20#100?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- input/fsh/DkCoreCondition.fsh | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/input/fsh/DkCoreCondition.fsh b/input/fsh/DkCoreCondition.fsh index 52eebe2c8..5e77deb6b 100644 --- a/input/fsh/DkCoreCondition.fsh +++ b/input/fsh/DkCoreCondition.fsh @@ -84,6 +84,22 @@ Usage: #example * clinicalStatus = $condition-clinical#active * verificationStatus = $condition-ver-status#confirmed +Instance: JohnFracture +InstanceOf: DkCoreCondition +Title: "John fraktur" +Description: "Johns fraktur-diagnose, udskrivningsdiagnose fra hospitalet med tillægskode" +Usage: #example +* code.coding[SKS-D] = urn:oid:1.2.208.176.2.4.12#DS721+TUL1 "Pertrokantær femurfraktur, højresidig" +* subject.reference = "Patient/john" +* asserter.reference = "Practitioner/AbrahamLaege" +* recorder.reference = "Practitioner/AbrahamLaege" +* category = $condition-category#encounter-diagnosis +* onsetDateTime = "2022-04-26" +* recordedDate = "2022-04-27" +* clinicalStatus = $condition-clinical#active +* verificationStatus = $condition-ver-status#confirmed + + Instance: JohnMelanoma InstanceOf: DkCoreCondition Title: "John mistanke om Modermærkekræft" From 85f302210d33b930aa0c2cf4f57340598cc697e4 Mon Sep 17 00:00:00 2001 From: kirstinerosenbeck Date: Mon, 9 Oct 2023 19:36:09 +0200 Subject: [PATCH 03/11] fixing DkCoreCondition - handling of unconfirmed conditions #98 --- .../StructureDefinition-dk-core-condition-intro.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/input/pagecontent/StructureDefinition-dk-core-condition-intro.md b/input/pagecontent/StructureDefinition-dk-core-condition-intro.md index 600b7c671..ac15eef6d 100644 --- a/input/pagecontent/StructureDefinition-dk-core-condition-intro.md +++ b/input/pagecontent/StructureDefinition-dk-core-condition-intro.md @@ -17,4 +17,8 @@ Given that we have a condition, which is a problem-list-item, ending the conditi * The Condition.category looses its "problem-list-item" flag. The idea is to state that from a patient viewpoint the condition has not changed, but in this professional context it is no longer in focus. * The Condition.extension.NotFollowedAnymore is populated with the date that it lost focus in a specific professional context. -The Condition profile cover both primary sector, secondary sector (medical specialists ([DA] speciallæger) and hospitals) and municipality cases. As such the profile should be usable in most Danish contexts. +The status attributes controls the context of a condition. clinicalStatus should be populated with the value “active” if the patient has the condition, and inactive if the patient no longer have the condition. Condition.verificationStatus should be set to “confirmed” if the condition have been established as true by someone with authority (e.g. a diagnosis is confirmed by a doctor). A condition is “unconfirmed”, if the patient is suspected of having a condition, and "refuted" if it has been confirmed that the condition is not present. An example of an unconfirmed condition can be found here [John Melanoma](Condition-JohnMelanoma.html)https://hl7.dk/fhir/core/. + +Note that "unconfirmed" is not the same as a risk of developing a condition. The risk of developing a certain condition may be recorded in (at least) two ways in FHIR i.e. as a familyMemberHistory or by populating Condition.code with a code that expresses a risk e.g. the SNOMED CT code ´395112001 At increased risk for cardiovascular event (finding)´. The first would typically be used if recording a family history, the second, if you want to use an increased risk as the reason for starting a prophylactic treatment. + +Condition profile cover both primary sector, secondary sector (medical specialists ([DA] speciallæger) and hospitals) and municipality cases. As such the profile should be usable in most Danish contexts. From 1ef6444b2bd63f3ab9e5b489f80ff93479c97100 Mon Sep 17 00:00:00 2001 From: tmsMedcom <88831880+tmsMedcom@users.noreply.github.com> Date: Mon, 16 Oct 2023 13:10:57 +0200 Subject: [PATCH 04/11] Update DkCoreObservation.fsh #94 --- input/fsh/DkCoreObservation.fsh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/input/fsh/DkCoreObservation.fsh b/input/fsh/DkCoreObservation.fsh index 278dd4b05..c71bb8855 100644 --- a/input/fsh/DkCoreObservation.fsh +++ b/input/fsh/DkCoreObservation.fsh @@ -67,7 +67,7 @@ Description: "HL7 Denmark core profile for observations" * component.code.coding[SNOMEDCT] * ^short = "SNOMED CT code for the observation" * system 1.. - * system = "https://www.snomed.org/" (exactly) + * system = "http://snomed.info/sct" (exactly) * code 1.. * component.code.coding[NPU] * ^short = "NPU code for the observation. NPU codes are administred by the Danish Health Data Authority." From 9357c51fb8a1d460169681e2f5503917bd368364 Mon Sep 17 00:00:00 2001 From: tmsMedcom <88831880+tmsMedcom@users.noreply.github.com> Date: Tue, 17 Oct 2023 15:36:21 +0200 Subject: [PATCH 05/11] Update StructureDefinition-dk-core-observation-intro.md #95 and #96 are handled --- ...uctureDefinition-dk-core-observation-intro.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/input/pagecontent/StructureDefinition-dk-core-observation-intro.md b/input/pagecontent/StructureDefinition-dk-core-observation-intro.md index d3ddae51e..5b354f4af 100644 --- a/input/pagecontent/StructureDefinition-dk-core-observation-intro.md +++ b/input/pagecontent/StructureDefinition-dk-core-observation-intro.md @@ -4,9 +4,9 @@ The Danish Core Observation profile is intended to represent observations for a * 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 +* 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: HL7-Denmark are working on an Observation profile for vital signs. Expected release is in Q4 2023. #### 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). @@ -17,12 +17,12 @@ Two or more Observation.code.coding may be assigned in the same Observation.code If the codings and units does not represent the same meaning, one instance of an Observation can be derived from another, as described in section [Observation derived from other Observation](#observation-derived-from-other-observation). None of the specified CodeSystems are required since each use case may call for different codes to represent the observations. The specified CodeSystems are included based on the [standard catalogue from the Danish Health Data Agency](https://sundhedsdatastyrelsen.dk/da/rammer-og-retningslinjer/om-referencearkitektur-og-standarder/standardkatalog), and Danish practice. In the following, some overall recommendations about the use of the code systems are provided: -* NPU codes are the preferred first choice in official Danish health IT-systems. NPU mostly have laboratory codes. -* LOINC codes are generally not recommended, for clinical areas that NPU covers, because they are overlapping without being modelled in exactly the same way. For clinical areas not covered by NPU, LOINC can be used. LOINC is an international code system, and is the first choice for many FHIR-observations around the world. This also means that Observation standard-profiles often use LOINC codes, and that interoperability use cases using equipment/wearables intended for markets intentionally, very well may have build-in LOINC codes. -* IEEE codes are the internal codes of many devices see [https://www.iso.org/standard/37890.html](https://www.iso.org/standard/37890.html). If an original observation from a device is represented, HL7-DK recommends using its original layout including the IEEE codes. Read more in IHE Personal Connected Health [https://wiki.ihe.net/index.php/Personal_Connected_Health](https://wiki.ihe.net/index.php/Personal_Connected_Health). -* SKS does have a few observation codes in use, most are found in the 'R' Hierarchy - see e.g. [https://medinfo.dk/sks/brows.php](https://medinfo.dk/sks/brows.php). HL7-DK does not recommend the use of SKS codes from the 'ZZ' hierarchy as FHIR observation-codes as they are codes for procedures. -* MedCom codes are Danish codes, that are not part of SKS, but have been necessary in Danish interoperability projects through time. They are sometimes referred to as kiap-codes or MCS codes. They can be found here: [https://medcom.dk/standarder/koder/laboratorieomraadet/](https://medcom.dk/standarder/koder/laboratorieomraadet/) or here: [https://kiap.dk/kiap/praksis/services/koder/iupackoder.php](https://kiap.dk/kiap/praksis/services/koder/iupackoder.php) -* SNOMED CT codes are accepted in Denmark. SNOMED CT codes are relevant, for areas that NPU does not cover. Additionally, SNOMED CT is often used as a reference terminology, to give a common language of retrieval for data that have originally been defined or coded in some other way. If SNOMED CT is used as a reference terminology, it is often relevant to provide a SNOMED CT code, in addition to the original coding. This is also acceptable if the SNOMED CT concept is less granular than the original code, if each code is true for the observation that happened. +* NPU codes are the preferred first choice when communicating observations from the laboratory area. NPU contains few codes outside the laboratory area. NPU is recommended to use in the standard catalogue from the Danish Health Data Agency. +* LOINC codes are generally not recommended, for clinical areas that NPU covers, because they are overlapping without being modelled in exactly the same way. For clinical areas not covered by NPU, LOINC can be used. LOINC is an international code system, and is the first choice for many FHIR-observations around the world. This also means that Observation standard-profiles often use LOINC codes, and that interoperability use cases using equipment/wearables intended for markets intentionally, very well may have build-in LOINC codes. LOINC is not recommended to use by the Danish Health Data Agency, but is included to support interoperability across countries in projects such as European Helath Data Space (EHDS). +* IEEE codes are the internal codes of many devices see [https://www.iso.org/standard/37890.html](https://www.iso.org/standard/37890.html). If an original observation from a device is represented, HL7-DK recommends using its original layout including the IEEE codes. Read more in IHE Personal Connected Health [https://wiki.ihe.net/index.php/Personal_Connected_Health](https://wiki.ihe.net/index.php/Personal_Connected_Health). IEEE is recommended to use in the standard catalogue from the Danish Health Data Agency. +* SKS does have a few observation codes in use, most are found in the 'R' Hierarchy - see e.g. [https://medinfo.dk/sks/brows.php](https://medinfo.dk/sks/brows.php). HL7-DK does not recommend the use of SKS codes from the 'ZZ' hierarchy as FHIR observation-codes as they are codes for procedures. SKS is recommended to use in the standard catalogue from the Danish Health Data Agency. +* MedCom codes are Danish codes, that are not part of SKS, but have been necessary in Danish interoperability projects through time. They are sometimes referred to as kiap-codes or MCS codes. They can be found here: [https://medcom.dk/standarder/koder/laboratorieomraadet/](https://medcom.dk/standarder/koder/laboratorieomraadet/) or here: [https://kiap.dk/kiap/praksis/services/koder/iupackoder.php](https://kiap.dk/kiap/praksis/services/koder/iupackoder.php). MedCom codes are not recommended to use by the Danish Health Data Agency, but are included as they are often used in MedComs standards. +* SNOMED CT codes are accepted in Denmark. SNOMED CT codes are relevant, for areas that NPU does not cover. Additionally, SNOMED CT is often used as a reference terminology, to give a common language of retrieval for data that have originally been defined or coded in some other way. If SNOMED CT is used as a reference terminology, it is often relevant to provide a SNOMED CT code, in addition to the original coding. This is also acceptable if the SNOMED CT concept is less granular than the original code, if each code is true for the observation that happened. SNOMED CT is stated to be usefull in the standard catalogue from the Danish Health Data Agency. #### Subjects and performers The primary use of this profile is to describe an observation performed on a patient. The patient must be represented using the [DkCorePatient](StructureDefinition-dk-core-patient.html) profile. However, it is still possible to select Observation.subject to be a Group, Device or Location. This is chosen to enable different uses of the profile e.g. a device calibration result is an observation of the device, not of the person that usually uses the device. From 16c450aa10abbde8b395f64b09d0660943eaae48 Mon Sep 17 00:00:00 2001 From: kirstinerosenbeck Date: Mon, 6 Nov 2023 16:15:32 +0100 Subject: [PATCH 06/11] Solved warnings associated with extension, that could be used anywhere --- input/fsh/extensions.fsh | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/input/fsh/extensions.fsh b/input/fsh/extensions.fsh index c194ba6be..4d1d7be6f 100644 --- a/input/fsh/extensions.fsh +++ b/input/fsh/extensions.fsh @@ -2,10 +2,11 @@ Extension: ConditionLastAssertedDate Id: ConditionLastAssertedDate Title: "ConditionLastAssertedDate" Description: "Extension for the last date a Condition-instance was confirmed valid in its current state. E.g. with its current clinical- and verification status, stage and severity. Typically the last performed follow-up" - * . ^short = "ConditionLastAssertedDate" * ^definition = "Extension for the last date a Condition-instance was confirmed valid in its current state. E.g. with its current clinical- and verification status, stage and severity. Typically the last performed follow-up" * value[x] only dateTime +* ^context.type = http://hl7.org/fhir/extension-context-type#element +* ^context.expression = "Condition" Extension: NotFollowedAnymore Id: NotFollowedAnymore @@ -14,6 +15,8 @@ Description: "Extension for the date where a condition lost focus in a specific * . ^short = "NotFollowedAnymore" * ^definition = "Extension for the date where a condition lost focus in a specific clinical context" * value[x] only dateTime +* ^context.type = http://hl7.org/fhir/extension-context-type#element +* ^context.expression = "Condition" Extension: RegionalSubDivisionCodes Id: dk-core-RegionalSubDivisionCodes From cb4a964dac50fa11839020bcc04ed2ab4d87c7a4 Mon Sep 17 00:00:00 2001 From: tmsMedcom <88831880+tmsMedcom@users.noreply.github.com> Date: Tue, 7 Nov 2023 13:27:50 +0100 Subject: [PATCH 07/11] Update sushi-config.yaml --- sushi-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sushi-config.yaml b/sushi-config.yaml index 1f09a8bb3..953e20d8d 100644 --- a/sushi-config.yaml +++ b/sushi-config.yaml @@ -8,7 +8,7 @@ name: DKCore title: "HL7 FHIR Implementation Guide: DK Core" description: A FHIR Implementation Guide for the Danish common needs across healthcare sectors status: active -version: 2.2.0 +version: 3.0.0 fhirVersion: 4.0.1 copyrightYear: 2021+ license: CC0-1.0 From f9e7948f7c95be8ad603ee9e5c8a7e4a10894cf7 Mon Sep 17 00:00:00 2001 From: tmsMedcom <88831880+tmsMedcom@users.noreply.github.com> Date: Wed, 8 Nov 2023 16:47:43 +0100 Subject: [PATCH 08/11] Fixed QA-errors, updated template Invariant on Observation and ^constraint.requirement = "link" --- ig.ini | 4 ++-- input/fsh/AuthorizationIdentifier.fsh | 9 +++------ input/fsh/DkCoreCprIdentifier.fsh | 9 ++------- input/fsh/DkCoreObservation.fsh | 2 +- input/fsh/DkCorePatient.fsh | 11 +++-------- input/fsh/Lpr3Identifier.fsh | 13 +++++-------- input/fsh/SORIdentifier.fsh | 6 ++---- sushi-config.yaml | 4 ++-- 8 files changed, 20 insertions(+), 38 deletions(-) diff --git a/ig.ini b/ig.ini index 25c9a8803..82644d7d4 100644 --- a/ig.ini +++ b/ig.ini @@ -1,4 +1,4 @@ [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 +template = https://github.com/hl7dk/dk-ig-template +;template = fhir.base.template#current \ No newline at end of file diff --git a/input/fsh/AuthorizationIdentifier.fsh b/input/fsh/AuthorizationIdentifier.fsh index 6c904a030..5f59b7e21 100644 --- a/input/fsh/AuthorizationIdentifier.fsh +++ b/input/fsh/AuthorizationIdentifier.fsh @@ -8,11 +8,8 @@ Description: "Identifier holding the official [authorization identifier](https:/ * value 1.. * obeys authorization-id-format * ^maxLength = 5 -// WARNING: The constraint index in the following rule (e.g., constraint[0]) may be incorrect. -// Please compare with the constraint array in the original definition's snapshot and adjust as necessary. - * ^constraint.source = "https://stps.dk/da/autorisation/om-autorisationer/autorisations-id/" - + Invariant: authorization-id-format -Description: "Authorization ID consists of exactly 5 consonants and Y and or numbers in any order" +Description: "Authorization ID consists of exactly 5 consonants and Y and or numbers in any order. See https://stps.dk/da/autorisation/om-autorisationer/autorisations-id/" Severity: #error -Expression: "matches('^([b-df-hj-np-tv-zB-DF-HJ-NP-TV-Z0-9]){5}$')" \ No newline at end of file +Expression: "matches('^([b-df-hj-np-tv-zB-DF-HJ-NP-TV-Z0-9]){5}$')" diff --git a/input/fsh/DkCoreCprIdentifier.fsh b/input/fsh/DkCoreCprIdentifier.fsh index 5f9605cfb..54e15651a 100644 --- a/input/fsh/DkCoreCprIdentifier.fsh +++ b/input/fsh/DkCoreCprIdentifier.fsh @@ -9,15 +9,10 @@ Description: "This structure holds the danish [CPR](https://cpr.dk/) identifier" * value 1.. * obeys cpr * ^maxLength = 10 -// WARNING: The constraint index in the following rule (e.g., constraint[0]) may be incorrect. -// Please compare with the constraint array in the original definition's snapshot and adjust as necessary. - * ^constraint.source = "https://cpr.dk/cpr-systemet/opbygning-af-cpr-nummeret/#:~:text=5%20%2D%206%20position%20angiver%20personens,i%20personnummeret%20angiver%20personens%20k%C3%B8n." -// WARNING: The constraint index in the following rule (e.g., constraint[0]) may be incorrect. -// Please compare with the constraint array in the original definition's snapshot and adjust as necessary. - * ^constraint.requirements = "Requirement of danish civil registration numbers" * ^mustSupport = false Invariant: cpr -Description: "Requirement of danish civil registration numbers" +Description: "Requirement of danish civil registration numbers. See https://cpr.dk/cpr-systemet/opbygning-af-cpr-nummeret/#:~:text=5%20%2D%206%20position%20angiver%20personens,i%20personnummeret%20angiver%20personens%20k%C3%B8n." 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]{6})$')" +* requirements = "Requirement of danish civil registration numbers" diff --git a/input/fsh/DkCoreObservation.fsh b/input/fsh/DkCoreObservation.fsh index c71bb8855..b7dad79b4 100644 --- a/input/fsh/DkCoreObservation.fsh +++ b/input/fsh/DkCoreObservation.fsh @@ -102,7 +102,7 @@ Description: "HL7 Denmark core profile for observations" Invariant: dk-core-observation-mandatory-units Description: "If value is specified then unit and/or code must be specified" Severity: #error -Expression: "Observation.valueQuantity.value.exists() implies Observation.valueQuantity.unit.exists() or Observation.valueQuantity.code.exists()" +Expression: "Observation.value.ofType(Quantity).value.exists() implies Observation.value.ofType(Quantity).unit.exists() or Observation.value.ofType(Quantity).code.exists()" diff --git a/input/fsh/DkCorePatient.fsh b/input/fsh/DkCorePatient.fsh index 73c4f15a8..91f0fb6f9 100644 --- a/input/fsh/DkCorePatient.fsh +++ b/input/fsh/DkCorePatient.fsh @@ -4,12 +4,6 @@ Id: dk-core-patient Title: "Danish Core Patient Profile" Description: "HL7 Denmark core profile for a patient" * obeys marital-status-unknown-usage -// WARNING: The constraint index in the following rule (e.g., constraint[0]) may be incorrect. -// Please compare with the constraint array in the original definition's snapshot and adjust as necessary. -* . ^constraint.source = "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/" -// WARNING: The constraint index in the following rule (e.g., constraint[0]) may be incorrect. -// Please compare with the constraint array in the original definition's snapshot and adjust as necessary. - * ^constraint.requirements = "Marital status is legally unknown in Denmark" * identifier 1.. * ^slicing.discriminator.type = #value * ^slicing.discriminator.path = "system" @@ -151,6 +145,7 @@ Usage: #example * birthDate = "1983-06-07" Invariant: marital-status-unknown-usage -Description: "Status in maritalStatus is unknown in a danish context. Consider mapping the value to UNK" +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 -Expression: "maritalStatus.coding.where(code = 'P' and system = 'http://terminology.hl7.org/CodeSystem/v3-MaritalStatus').empty() or maritalStatus.coding.where(code = 'A' and system = 'http://terminology.hl7.org/CodeSystem/v3-MaritalStatus').empty()" \ No newline at end of file +Expression: "maritalStatus.coding.where(code = 'P' and system = 'http://terminology.hl7.org/CodeSystem/v3-MaritalStatus').empty() or maritalStatus.coding.where(code = 'A' and system = 'http://terminology.hl7.org/CodeSystem/v3-MaritalStatus').empty()" +* requirements = "Marital status is legally unknown in Denmark" \ No newline at end of file diff --git a/input/fsh/Lpr3Identifier.fsh b/input/fsh/Lpr3Identifier.fsh index 0210f8247..0f2c3e44e 100644 --- a/input/fsh/Lpr3Identifier.fsh +++ b/input/fsh/Lpr3Identifier.fsh @@ -1,4 +1,4 @@ -Profile: Lpr3Identifier +/* Profile: Lpr3Identifier Parent: Identifier Id: lpr3-Identifier Title: "LPR3 Identifier" @@ -7,14 +7,11 @@ Description: "Identifier holding a LPR3 identifier for an organization" * system = "https://www.esundhed.dk/Registre/Landspatientsregisteret" (exactly) * value 1.. * obeys uuidv5 -// WARNING: The constraint index in the following rule (e.g., constraint[0]) may be incorrect. -// Please compare with the constraint array in the original definition's snapshot and adjust as necessary. - * ^constraint.source = "https://scandihealth.github.io/lpr3-docs/" -// WARNING: The constraint index in the following rule (e.g., constraint[0]) may be incorrect. -// Please compare with the constraint array in the original definition's snapshot and adjust as necessary. - * ^constraint.requirements = "LPR3 episode of care identifiers must conform to a UUIDv5" Invariant: uuidv5 Description: "LPR3 episode of care identifiers must conform to a UUIDv5" Severity: #error -Expression: "value.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}')" \ No newline at end of file +Expression: "value.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/SORIdentifier.fsh b/input/fsh/SORIdentifier.fsh index e47fd2dd8..03a53fe77 100644 --- a/input/fsh/SORIdentifier.fsh +++ b/input/fsh/SORIdentifier.fsh @@ -8,11 +8,9 @@ Description: "Identifier holding the official SOR identifier for a danish health * system = "urn:oid:1.2.208.176.1.1" (exactly) * value 1.. * obeys min-digits-sor -// WARNING: The constraint index in the following rule (e.g., constraint[0]) may be incorrect. -// Please compare with the constraint array in the original definition's snapshot and adjust as necessary. - * ^constraint.requirements = "SOR Identifiers are at minimum 11 digits long" Invariant: min-digits-sor Description: "SOR Identifiers are at minimum 11 digits long. See https://sundhedsdatastyrelsen.dk/-/media/sds/filer/rammer-og-retningslinjer/organisationsregistrering/adgang-til-sor/info-om-opbygningen-af-sor-ider.pdf" Severity: #error -Expression: "matches('^([0-9]){11,}$')" \ No newline at end of file +Expression: "matches('^([0-9]){11,}$')" +* requirements = "SOR Identifiers are at minimum 11 digits long" \ No newline at end of file diff --git a/sushi-config.yaml b/sushi-config.yaml index 953e20d8d..94bbc9138 100644 --- a/sushi-config.yaml +++ b/sushi-config.yaml @@ -7,12 +7,12 @@ 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 +status: draft version: 3.0.0 fhirVersion: 4.0.1 copyrightYear: 2021+ license: CC0-1.0 -releaseLabel: release +releaseLabel: ci-build publisher: name: HL7 Denmark url: http://www.hl7.dk From 9c8bd0956116092da4febc5229aea29bdf935a46 Mon Sep 17 00:00:00 2001 From: tmsMedcom Date: Tue, 21 Nov 2023 13:00:41 +0100 Subject: [PATCH 09/11] Technical FHIRPath correction value. and Observation. #104 --- input/fsh/CVRIdentifier.fsh | 4 ++-- input/fsh/DkCoreCprIdentifier.fsh | 2 +- input/fsh/DkCoreObservation.fsh | 2 +- input/fsh/GLNIdentifier.fsh | 4 ++-- input/fsh/KombitOrgIdentifier.fsh | 2 +- input/fsh/Lpr3Identifier.fsh | 2 +- 6 files changed, 8 insertions(+), 8 deletions(-) diff --git a/input/fsh/CVRIdentifier.fsh b/input/fsh/CVRIdentifier.fsh index 547036e5a..3eaf5e1bf 100644 --- a/input/fsh/CVRIdentifier.fsh +++ b/input/fsh/CVRIdentifier.fsh @@ -12,9 +12,9 @@ Description: "Identifier holding a danish [CVR](https://datacvr.virk.dk/data/) n Invariant: CVR-length Description: "CVR must be exactly 8 numeric characters long" Severity: #error -Expression: "value.matches('^[0-9]{8}$')" +Expression: "matches('^[0-9]{8}$')" Invariant: CVR-modulus-11 Description: "CVR must pass the modulus 11 check" Severity: #error -Expression: "((\n (value.substring(0,1).toInteger()*2)+\n (value.substring(1,1).toInteger()*7)+\n (value.substring(2,1).toInteger()*6)+\n (value.substring(3,1).toInteger()*5)+\n (value.substring(4,1).toInteger()*4)+\n (value.substring(5,1).toInteger()*3)+\n (value.substring(6,1).toInteger()*2)+\n (value.substring(7,1).toInteger()*1)) mod(11)=0)" \ No newline at end of file +Expression: "((\n (substring(0,1).toInteger()*2)+\n (substring(1,1).toInteger()*7)+\n (substring(2,1).toInteger()*6)+\n (substring(3,1).toInteger()*5)+\n (substring(4,1).toInteger()*4)+\n (substring(5,1).toInteger()*3)+\n (substring(6,1).toInteger()*2)+\n (substring(7,1).toInteger()*1)) mod(11)=0)" \ No newline at end of file diff --git a/input/fsh/DkCoreCprIdentifier.fsh b/input/fsh/DkCoreCprIdentifier.fsh index 54e15651a..7cde1471b 100644 --- a/input/fsh/DkCoreCprIdentifier.fsh +++ b/input/fsh/DkCoreCprIdentifier.fsh @@ -14,5 +14,5 @@ Description: "This structure holds the danish [CPR](https://cpr.dk/) identifier" Invariant: cpr Description: "Requirement of danish civil registration numbers. See https://cpr.dk/cpr-systemet/opbygning-af-cpr-nummeret/#:~:text=5%20%2D%206%20position%20angiver%20personens,i%20personnummeret%20angiver%20personens%20k%C3%B8n." 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]{6})$')" +Expression: "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]{6})$')" * requirements = "Requirement of danish civil registration numbers" diff --git a/input/fsh/DkCoreObservation.fsh b/input/fsh/DkCoreObservation.fsh index b7dad79b4..de4bd8690 100644 --- a/input/fsh/DkCoreObservation.fsh +++ b/input/fsh/DkCoreObservation.fsh @@ -102,7 +102,7 @@ Description: "HL7 Denmark core profile for observations" Invariant: dk-core-observation-mandatory-units Description: "If value is specified then unit and/or code must be specified" Severity: #error -Expression: "Observation.value.ofType(Quantity).value.exists() implies Observation.value.ofType(Quantity).unit.exists() or Observation.value.ofType(Quantity).code.exists()" +Expression: "value.ofType(Quantity).value.exists() implies value.ofType(Quantity).unit.exists() or value.ofType(Quantity).code.exists()" diff --git a/input/fsh/GLNIdentifier.fsh b/input/fsh/GLNIdentifier.fsh index fcaf86303..14f24899e 100644 --- a/input/fsh/GLNIdentifier.fsh +++ b/input/fsh/GLNIdentifier.fsh @@ -12,9 +12,9 @@ Description: "Identifier holding a 13 digit GLN" Invariant: gln-length Description: "GLN must be exactly 13 characters long" Severity: #error -Expression: "value.matches('^[0-9]{13}$')" +Expression: "matches('^[0-9]{13}$')" Invariant: gln-modulus-10 Description: "GLN must pass the modulus 10 check - https://www.gs1.org/services/how-calculate-check-digit-manually" Severity: #error -Expression: "((\n(10-((value.substring(0,1).toInteger()*1)+\n(value.substring(1,1).toInteger()*3)+\n(value.substring(2,1).toInteger()*1)+\n(value.substring(3,1).toInteger()*3)+\n(value.substring(4,1).toInteger()*1)\n+(value.substring(5,1).toInteger()*3)\n+(value.substring(6,1).toInteger()*1)\n+(value.substring(7,1).toInteger()*3)\n+(value.substring(8,1).toInteger()*1)\n+(value.substring(9,1).toInteger()*3)\n+(value.substring(10,1).toInteger()*1)\n+(value.substring(11,1).toInteger()*3))mod(10))mod(10))=value.substring(12,1).toInteger())" \ No newline at end of file +Expression: "((\n(10-((substring(0,1).toInteger()*1)+\n(substring(1,1).toInteger()*3)+\n(substring(2,1).toInteger()*1)+\n(substring(3,1).toInteger()*3)+\n(substring(4,1).toInteger()*1)\n+(substring(5,1).toInteger()*3)\n+(substring(6,1).toInteger()*1)\n+(substring(7,1).toInteger()*3)\n+(substring(8,1).toInteger()*1)\n+(substring(9,1).toInteger()*3)\n+(substring(10,1).toInteger()*1)\n+(substring(11,1).toInteger()*3))mod(10))mod(10))=substring(12,1).toInteger())" \ No newline at end of file diff --git a/input/fsh/KombitOrgIdentifier.fsh b/input/fsh/KombitOrgIdentifier.fsh index 75fed7ac0..7e895f371 100644 --- a/input/fsh/KombitOrgIdentifier.fsh +++ b/input/fsh/KombitOrgIdentifier.fsh @@ -12,4 +12,4 @@ Description: "Identifier holding the organization code issued by KOMBIT" Invariant: uuid Description: "General UUID expression" Severity: #error -Expression: "value.matches('urn:uuid:[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}')" \ No newline at end of file +Expression: "matches('urn:uuid:[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}')" \ No newline at end of file diff --git a/input/fsh/Lpr3Identifier.fsh b/input/fsh/Lpr3Identifier.fsh index 0f2c3e44e..cb63f6f3c 100644 --- a/input/fsh/Lpr3Identifier.fsh +++ b/input/fsh/Lpr3Identifier.fsh @@ -11,7 +11,7 @@ Description: "Identifier holding a LPR3 identifier for an organization" Invariant: uuidv5 Description: "LPR3 episode of care identifiers must conform to a UUIDv5" Severity: #error -Expression: "value.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}')" +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 From b2c555802473063bffb5b70cd954a350adf29baa Mon Sep 17 00:00:00 2001 From: tmsMedcom Date: Tue, 21 Nov 2023 13:02:17 +0100 Subject: [PATCH 10/11] Updated Observation-instances due to publisher update --- input/fsh/DkCoreObservation.fsh | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/input/fsh/DkCoreObservation.fsh b/input/fsh/DkCoreObservation.fsh index de4bd8690..45439a641 100644 --- a/input/fsh/DkCoreObservation.fsh +++ b/input/fsh/DkCoreObservation.fsh @@ -166,13 +166,14 @@ Instance: ObservationRespiratoryVitalSigns InstanceOf: DkCoreObservation Title: "John's Respiratory rate measurement, Vital Signs" Usage: #example -* category = #vital-signs +* category = $observation-category#vital-signs * status = #final * code.coding[LOINC] = $LOINC#9279-1 "Respiratory rate" * valueQuantity.value = 50 -* valueQuantity.code = #{Breaths}/min +* valueQuantity.code = #/min * valueQuantity.system = $ucum * valueQuantity.unit = "Breaths / minute" +* effectiveDateTime = 2023-11-01T12:00:00+01:00 * subject = Reference(john) * performer = Reference(AbrahamLaege) @@ -183,8 +184,9 @@ Usage: #inline * status = #final * code.coding = $NPU#NPU03011 "Iltmætning" * valueQuantity.value = 0.97 -* valueQuantity.code = #{1} +* valueQuantity.code = #1 * valueQuantity.system = $ucum +* effectiveDateTime = 2023-11-01T12:00:00+01:00 * subject = Reference(john) * performer = Reference(AbrahamLaege) @@ -192,13 +194,14 @@ Instance: ObservationOxySatVitalSigns InstanceOf: DkCoreObservation Title: "John's oxygen saturation measurement, Vital Signs" Usage: #example -* category = #vital-signs +* 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 From 25fbf721b81b2f0b924f4d57cc8a5fb853a87dd6 Mon Sep 17 00:00:00 2001 From: tmsMedcom <88831880+tmsMedcom@users.noreply.github.com> Date: Fri, 24 Nov 2023 13:01:42 +0100 Subject: [PATCH 11/11] Update release-notes.md --- release-notes.md | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/release-notes.md b/release-notes.md index e27045bd3..f3723e209 100644 --- a/release-notes.md +++ b/release-notes.md @@ -1,8 +1,12 @@ -DK-core version 2.2.0 has been approved by HL7 Denmark. During spring, 2023, this version will go through the needed evaluations to be approved for the national catalogue. +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. -The changes between 2.1.0 and 2.2.0 is: - -* Addition of Observation profile with associated documentation and instances. -* Updated all CPR-identifiers of the Patient instances. -* Added experimental-status = false to all CodeSystems and ValueSets -* Removed draft-status from identifiers. \ No newline at end of file +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 +* 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.