eHealth Infrastructure (v2020.8)

StructureDefinition: ehealth-patient

Introduction

An ehealth-patient is a central entity, which is referenced by many other entities in the FUT infrastructure.

Scope and Usage

In the eHealth Infrastructure the Patient resource is primarily used in conjunction with the following resources:

  • Communication
    • As sender or recipient of a message
  • Appointment
    • As participant on an ehealth-appointment
  • CarePlan
    • As the subject in question
  • ClinicalImpression
    • As the subject in question
  • EpisodeOfCare
    • As the focus of an episode of care
  • Observation
    • As the subject in question
  • RelatedPerson
    • As the patient who a person is related to

Update rules

Certain data on an ehealth-patient are automatically updated based on the CPR system. This includes official name, address, and of course the CPR number itself.

When adding/updating an address (non-home address), the service will by default “wash” the address using DAWA (Danmarks Adressers Web API).
See https://dawa.aws.dk/dok/api/adresse#datavask.
A client may overrule the default validation strategy by setting a request header x-address-validation-strategy with the value “STRICT”, “WASH” or “NONE”.
If “STRICT” is used the request will fail if the address does not match strictly an address in DAWA.
If “WASH” is used (the default strategy) the client may want to verify that the wash outcome was as expected.
If “NONE” is used no validation/modification is performed (the address is stored as is).

An ehealth-patient may be PATCH updated on paths complying with the regular expressions below.

Path Description
/implicitRules.*  
/language.*  
/contained.*  
/identifier.* CPR number may not be changed, but addition of other identifiers are allowed
/name.* The official name (use=official) may not be changed, as it is automatically synchronized with the CPR system
/address.* The home address may not be changed (use=home), as it is automatically synchronized with the CPR system
/maritalStatus.*  
/multipleBirth.*  
/photo.*  
/contact.*  
/telecom.*  
/communication.*  
/link.*  
/itcompetencelevel.*  
/interpreterRequired.*  
/generalHealthCondition.*  
/functionalCapacity.*  
/extension.*  

Name and Address Protection

Patients with name and address protection are marked with security label ‘restricted’ (R in http://hl7.org/fhir/v3/Confidentiality).

The period of the name and address protection is expressed in an extention with url: http://ehealth.sundhed.dk/fhir/StructureDefinition/ehealth-nameandaddressprotection”

Resolving general practitioner

When creating and updating a patient, the infrastructure gets information about the patients general practitioner. The information about the general practitioner origins from the provider registry (Yderregister: https://sundhedsdatastyrelsen.dk/da/registre-og-services/om-de-nationale-sundhedsregistre/personoplysninger-og-sundhedsfaglig-beskaeftigelse/yderregisteret) and results in a provider identifier. Under normal circumstances, the provider identifier identifies an organization in SOR registry (Sundhedsvæsenets Organisationsregister: https://sundhedsdatastyrelsen.dk/da/registre-og-services/om-sor) which resolves to an organization in the Organization service in the infrastructure. If the organization cannot be identified as an organization in the Organization service, the reference on the general practitioner remains as an logical reference (http://hl7.org/fhir/STU3/references.html#logical) containing the provider identifier.

Formal Views of Profile Content

The official URL for this profile is:

http://ehealth.sundhed.dk/fhir/StructureDefinition/ehealth-patient

This profile holds the patient information needed in the danish eHealth context. Patients models the concept of a real person in a careplan process.

Creating patients

Patients can only be created using the operation defined for the Patient resource (see the createPatient operation). The operation ensure that patients are created with the proper demographics data delivered by national registers. There can only be a single patient pr. actual person.

This profile builds on Patient.

This profile was published on Thu Jan 07 13:26:31 UTC 2021 as a draft by ehealth.sundhed.dk.

Description of Profiles, Differentials, Snapshots, and how the XML and JSON presentations work.

This structure is derived from Patient

Summary

Mandatory: 3 elements (4 nested mandatory elements)
Must-Support: 1 element
Fixed Value: 5 elements
Prohibited: 5 elements

Structures

This structure refers to these other structures:

Extensions

This structure refers to these extensions:

Slices

This structure defines the following Slices:

  • The element Patient.identifier is sliced based on the value of value:system
  • The element Patient.telecom is sliced based on the value of value:value
  • The element Patient.address is sliced based on the value of value:use

 

Terminology Bindings

PathConformanceValueSet / Code
Patient.languageextensibleCommon Languages
Max Binding: All Languages
Patient.telecom:NemSMS.systemrequiredFixed Value: other
Patient.telecom:eBoks.systemrequiredFixed Value: other
Patient.genderrequiredAdministrativeGender
Patient.maritalStatusextensibleMarital Status Codes
Patient.contact.relationshipextensiblev2 Contact Role
Patient.contact.genderrequiredAdministrativeGender
Patient.animal.speciesexampleAnimalSpecies
Patient.animal.breedexampleAnimalBreeds
Patient.animal.genderStatusexampleGenderStatus
Patient.communication.languageextensibleCommon Languages
Max Binding: All Languages
Patient.link.typerequiredLinkType

Constraints

IdPathDetailsRequirements
dom-2PatientIf the resource is contained in another resource, it SHALL NOT contain nested Resources
: contained.contained.empty()
dom-1PatientIf the resource is contained in another resource, it SHALL NOT contain any narrative
: contained.text.empty()
dom-4PatientIf a resource is contained in another resource, it SHALL NOT have a meta.versionId or a meta.lastUpdated
: contained.meta.versionId.empty() and contained.meta.lastUpdated.empty()
dom-3PatientIf the resource is contained in another resource, it SHALL be referred to from elsewhere in the resource
: contained.where(('#'+id in %resource.descendants().reference).not()).empty()
ele-1Patient.extension:itcompetencelevelAll FHIR elements must have a @value or children
: hasValue() | (children().count() > id.count())
ext-1Patient.extension:itcompetencelevelMust have either extensions or value[x], not both
: extension.exists() != value.exists()
ele-1Patient.extension:interpreterRequiredAll FHIR elements must have a @value or children
: hasValue() | (children().count() > id.count())
ext-1Patient.extension:interpreterRequiredMust have either extensions or value[x], not both
: extension.exists() != value.exists()
ele-1Patient.extension:generalHealthConditionAll FHIR elements must have a @value or children
: hasValue() | (children().count() > id.count())
ext-1Patient.extension:generalHealthConditionMust have either extensions or value[x], not both
: extension.exists() != value.exists()
ele-1Patient.extension:nameAndAddressProtectionAll FHIR elements must have a @value or children
: hasValue() | (children().count() > id.count())
ext-1Patient.extension:nameAndAddressProtectionMust have either extensions or value[x], not both
: extension.exists() != value.exists()
ele-1Patient.identifier:dk-civil-registration-numberAll FHIR elements must have a @value or children
: hasValue() | (children().count() > id.count())
ele-1Patient.address:officialHomeAddressAll FHIR elements must have a @value or children
: hasValue() | (children().count() > id.count())
ele-1Patient.contactAll FHIR elements must have a @value or children
: hasValue() | (children().count() > id.count())
pat-1Patient.contactSHALL at least contain a contact's details or a reference to an organization
: name.exists() or telecom.exists() or address.exists() or organization.exists()
ele-1Patient.contact.extension:contactNoteAll FHIR elements must have a @value or children
: hasValue() | (children().count() > id.count())
ext-1Patient.contact.extension:contactNoteMust have either extensions or value[x], not both
: extension.exists() != value.exists()
ele-1Patient.contact.addressAll FHIR elements must have a @value or children
: hasValue() | (children().count() > id.count())
ele-1Patient.communicationAll FHIR elements must have a @value or children
: hasValue() | (children().count() > id.count())
ele-1Patient.linkAll FHIR elements must have a @value or children
: hasValue() | (children().count() > id.count())
.