Changes in eHealth Infrastructure

Changes in eHealth Infrastructure

Describes changes in eHealth Infrastructure APIs, behavior and use of external systems possibly relevant for Telemedicine Solutions.

FUT-I Release 2026.2

Breaking Changes

Dead privileges

Among infrastructure service privileges mapped from eHealth Infrastructure system roles (see https://ehealth-dk.atlassian.net/wiki/x/QgBcnQ ), there are dead privileges not checked by any service.

The dead privileges have been removed as well as their mapping from system roles, and mentioning in the documentation on https://ehealth-dk.atlassian.net/wiki/x/QgBcnQ .

 

$$SSLFindOrCreateParty
$$SSLHasOpenOrder
$$fetch-ssl-orders
$$mark-all-resources-for-reindexing
$$transform-from-QRD-based-on-questionnaire
ActionGiudance.read
ActionGiudance.write
ActivityDefinition.delete
ActivityDefinition.patch
ActivityDefinition.write
Appointment.create
Appointment.delete
Appointment.patch
Appointment.search
Appointment.update
AppointmentResponse.create
AppointmentResponse.delete
AppointmentResponse.patch
AppointmentResponse.read
AppointmentResponse.search
AppointmentResponse.update
AppointmentResponse.write
Binary.create
Binary.delete
Binary.patch
Binary.search
Binary.update
Binary.write
CarePlan.create
CarePlan.delete
CarePlan.patch
CarePlan.write
CareTeam.create
CareTeam.delete
CareTeam.patch
CareTeam.update
ClinicalImpression.delete
ClinicalImpression.update
ClinicalImpression.write
CodeSystem.create
CodeSystem.delete
CodeSystem.patch
CodeSystem.read
CodeSystem.search
CodeSystem.update
Communication.delete
Communication.update
CommunicationRequest.patch
CommunicationRequest.write
Composition.patch
Composition.update
Composition.write
ConceptMap.create
ConceptMap.delete
ConceptMap.patch
ConceptMap.read
ConceptMap.search
ConceptMap.update
Condition.delete
Condition.search
Condition.update
Condition.write
Consent.delete
Consent.patch
Consent.write
Device.create
Device.delete
Device.patch
Device.search
Device.update
DeviceMetric.create
DeviceMetric.delete
DeviceMetric.patch
DeviceMetric.search
DeviceMetric.update
DeviceUseStatement.create
DeviceUseStatement.delete
DeviceUseStatement.patch
DeviceUseStatement.search
DeviceUseStatement.update
DocumentReference.write
EpisodeOfCare.create
EpisodeOfCare.delete
EpisodeOfCare.update
EpisodeOfCare.write
Library.delete
Library.patch
Library.write
Media.create
Media.delete
Media.write
NamingSystem.create
NamingSystem.delete
NamingSystem.patch
NamingSystem.read
NamingSystem.search
NamingSystem.update
Observation.create
Observation.delete
Observation.update
Observation.write
Organization.create
Organization.delete
Organization.search
Organization.update
Patient.create
Patient.delete
Patient.patch
Patient.search
Patient.update
Person.create
Person.delete
Person.patch
Person.search
Person.update
PlanDefinition.delete
PlanDefinition.patch
PlanDefinition.write
Practitioner.create
Practitioner.patch
Practitioner.update
PractitionerRole.patch
PractitionerRole.write
ProcedureRequest.create
ProcedureRequest.delete
ProcedureRequest.patch
ProcedureRequest.read
ProcedureRequest.search
ProcedureRequest.update
ProcedureRequest.write
Provenance.create
Provenance.delete
Provenance.patch
Provenance.update
Provenance.write
Questionnaire.patch
Questionnaire.write
QuestionnaireResponse.create
QuestionnaireResponse.delete
QuestionnaireResponse.update
QuestionnaireResponse.write
RelatedPerson.create
RelatedPerson.delete
RelatedPerson.patch
RelatedPerson.search
RelatedPerson.update
RestrictionCategory.create
RestrictionCategory.delete
RestrictionCategory.patch
RestrictionCategory.read
RestrictionCategory.search
RestrictionCategory.update
RestrictionCategory.write
SSLAnnotation.create
SSLAnnotation.delete
SSLAnnotation.patch
SSLAnnotation.read
SSLAnnotation.search
SSLAnnotation.update
SSLAnnotation.write
SSLBlackList.create
SSLBlackList.delete
SSLBlackList.patch
SSLBlackList.read
SSLBlackList.search
SSLBlackList.update
SSLBlackList.write
SSLCatalogue.create
SSLCatalogue.delete
SSLCatalogue.patch
SSLCatalogue.read
SSLCatalogue.search
SSLCatalogue.update
SSLCatalogue.write
SSLCatalogueItem.create
SSLCatalogueItem.delete
SSLCatalogueItem.patch
SSLCatalogueItem.read
SSLCatalogueItem.search
SSLCatalogueItem.update
SSLCatalogueItem.write
SSLContract.create
SSLContract.delete
SSLContract.patch
SSLContract.read
SSLContract.search
SSLContract.update
SSLContract.write
SSLOrder.create
SSLOrder.delete
SSLOrder.patch
SSLOrder.read
SSLOrder.search
SSLOrder.update
SSLOrder.write
SSLOrderLine.create
SSLOrderLine.delete
SSLOrderLine.patch
SSLOrderLine.read
SSLOrderLine.search
SSLOrderLine.update
SSLOrderLine.write
SSLPackage.create
SSLPackage.delete
SSLPackage.patch
SSLPackage.read
SSLPackage.search
SSLPackage.update
SSLPackage.write
SSLParty.create
SSLParty.delete
SSLParty.patch
SSLParty.read
SSLParty.search
SSLParty.update
SSLParty.write
SSLProblem.create
SSLProblem.delete
SSLProblem.patch
SSLProblem.read
SSLProblem.search
SSLProblem.update
SSLProblem.write
SSLTraceLine.create
SSLTraceLine.delete
SSLTraceLine.patch
SSLTraceLine.read
SSLTraceLine.search
SSLTraceLine.update
SSLTraceLine.write
SSLWhiteList.create
SSLWhiteList.delete
SSLWhiteList.patch
SSLWhiteList.read
SSLWhiteList.search
SSLWhiteList.update
SSLWhiteList.write
Task.delete
Task.update
Task.write
ValueSet.create
ValueSet.delete
ValueSet.patch
ValueSet.read
ValueSet.search
ValueSet.update

Migration of STS-ORG Identifiers

We will base ehealth-organization on the DkCoreOrganization profile, which has additional constraints on identifiers. In order to comply with these constraints, we have to migrate the identifiers for STS-ORG Organizations. The following changes are required:

  • Migration of identifier.system from https://www.kombit.dk/sts/organisation to https://kombit.dk/sts/organisation

  • Migration of identifier.value, prefix UUID with urn:uuid:

Support for patch operations are more strict according to specification (RFC6902)

The use of replace operation is now only allowed if the element exists. Previously, it was leniently handled as an add operation. Now the use of add operation is required if the element does not exist.

Patch operations in FHIR transactions using FHIRPath syntax are not working for extensions with sub-extensions

The FHIRPath patch encodes PATCH operations using a Parameters resource. The hapi-fhir implementation in 8.6.5 does not work for patching extensions with sub-extensions. Use JSONPatch syntax instead. To use JSONPatch in a FHIR transaction, the JSONPatch body must be wrapped in a Binary resource. See JSONPatch - transaction.

Response from document-transformation is changed so that bundles are valid according to the FHIR specification

Previously some resources were returned as inline resources using the contained element, now they are returned as proper entries in the bundle. All bundle entries have a fullUrl, and references can be resolved within the bundle. This is a breaking change, if you rely on locating specific resources as contained. The same resources are to be found as entries in the bundle.

Breaking change to regional subcodes (dk.core 3.5.0 → 3.6.0):

The system URI for the dk-core-RegionalSubDivisionCodes extension changed from the Danish-specific HL7 code system http://hl7.dk/fhir/core/CodeSystem/dk-core-regional-subdivision-codes to the standard ISO 3166-2 URN urn:iso:std:iso:3166:-2. Implementations populating this extension must update the system value on the coded value accordingly.

FUT-I Release 2025.3

Change in handling of Patch operations on FHIR resources

A number of microservices in the eHealth Infrastructure have now been upgraded to use version 8.0.0 of HAPI FHIR. As a consequence, additional input validation of PATCH operations is performed. The previous input validation was lenient towards certain input constructs that are now rejected with a somewhat confusing error message. Overall, the PATCH operation input is now required to be in accordance with the FHIR specification on JSON Patch (JSON Patch - RFC-6902: https://datatracker.ietf.org/doc/html/rfc6902 ).

In the table below, [base] refers to the base of the path, for instance https://organization.exttest.sundhed.dk/fhir. The PATCH construct in body could be for a PATCH operation for a specific EpisodeOfCare, for instance PATCH [base]/EpisodeOfCare/2812.

The table provides some examples on how certain constructs are no longer accepted and suggestions to how they can be made acceptable.

Situation

Previously accepted PATCH construct in body

Accepted PATCH construct in body

Situation

Previously accepted PATCH construct in body

Accepted PATCH construct in body

Adding a CareTeam to the EpisodeOfCare.team element

[

{"op":"add",

"path":"/team/-",

"value":[{"reference":[base]/CareTeam/87725}]

}]

This now leads to error HTTP 422 Unprocessable Entity: The property team must be an Array, not an Array (at EpisodeOfCare.team[1]).

[

{"op":"add",

"path":"/team/-",

"value":{"reference":[base]/CareTeam/87725}

}]

Note that the array for the value has been removed.

Removing a CareTeam reference from the EpisodeOfCare.team element

Remove all (two) references to CareTeam(s):

[{"op":"remove","path":"/team/1"}]

[{"op":"remove","path":"/team/0"}]

This now leads to HTTP 422 Unprocessable Entity: Array cannot be empty - the property should not be present if it has no values.

When removing the last CareTeam, the list element must be removed:

[{"op":"remove","path":"/team/1"}]

[{"op":"remove","path":"/team"}]

Replacing a CareTeam reference with multiple new ones in the EpisodeOfCare.team element

[{

"op": "replace",

"path": "/team/0",

"value": [{

                "reference": [base]/CareTeam/48924

            }, {

                "reference": [base]/CareTeam/23064

            }]

}]

This now leads to error HTTP 422 Unprocessable Entity: The property team must be an Array, not an Array (at EpisodeOfCare.team[0]).

[{

"op": "replace",

"path": "/team/0",

"value": {

              "reference":  [base]/CareTeam/48924

    }

},{

"op": "add",

"path": "/team/1",

"value": {

              "reference": [base]/CareTeam/23064

      }

}]

 

FUT-I Release 2024.3

Changes in the Administrative Domain:

  • Clinical Administrative Application (and plan service) now supports decision per activity in plan whether to offer activity as extra activity

  • Clinical Administrative Application now supports importing and exporting of plans (PlanDefinition and referenced resources)

  • FHIR Organization in the organization service now supports discerning between primary and non-primary specialties

 

Changes in the Clinical Domain:

  • $apply operation: Decision on extra activity (see above) is inherited to ServiceRequest and can be adjusted as needed

  • $get-patient-procedures operation: When extra argument is true, extra activity is included in output when ServiceRequest.includeAsExtra is true for ServiceRequest in scope

  • $search-measurements-bundle-limit operation: New operation which is a variant on $search-measurements. Returns at most input argument count number of time slots worth of measurements.

 

Changes in use of external systems:

  • Import of organizational data from the National Health Organization Registry (Danish: Sundhedsvæsenets Organisationsregister, SOR) observed primary specialty markup in SOR

  • Document registering to national XDS-based document sharing infrastructure now has a preference for primary organizational specialty