eHealth Infrastructure
2021.3.0 - build

eHealth Infrastructure - Local Development build (v2021.3.0). See the Directory of published versions

Resource Profile: ehealth-patient

Defining URL:http://ehealth.sundhed.dk/fhir/StructureDefinition/ehealth-patient
Version:2021.3.0
Name:ehealth-patient
Status:Active as of 2021-11-25T09:32:14+00:00
Publisher:Systematic | Trifork
Source Resource:XML / JSON / Turtle

The official URL for this profile is:

http://ehealth.sundhed.dk/fhir/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://dawadocs.dataforsyningen.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

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

This structure is derived from DkCorePatient

 

Other representations of profile: CSV, Excel, Schematron

Terminology Bindings

PathConformanceValueSet / Code
Patient.languagepreferredCommonLanguages
Max Binding: AllLanguages
Patient.name:official.userequiredFixed Value: official
Patient.telecom:NemSMS.systemrequiredPattern: other
Patient.telecom:eBoks.systemrequiredPattern: other
Patient.genderrequiredAdministrativeGender
Patient.address.userequiredAddressUse
Patient.address.typerequiredAddressType
Patient.address:officialHomeAddress.userequiredFixed Value: home
Patient.address:officialHomeAddress.typerequiredAddressType
Patient.maritalStatusextensibleDK Marital Status Codes
Patient.contact.relationshipextensiblePatientContactRelationship
Patient.contact.address.userequiredAddressUse
Patient.contact.address.typerequiredAddressType
Patient.contact.genderrequiredAdministrativeGender
Patient.communication.languagepreferredCommonLanguages
Max Binding: AllLanguages
Patient.generalPractitioner:referencedSORUnit.typeextensibleResourceType
Patient.link.typerequiredLinkType

Constraints

IdPathDetailsRequirements
dom-2PatientIf the resource is contained in another resource, it SHALL NOT contain nested Resources
: contained.contained.empty()
dom-3PatientIf the resource is contained in another resource, it SHALL be referred to from elsewhere in the resource or SHALL refer to the containing resource
: contained.where((('#'+id in (%resource.descendants().reference | %resource.descendants().as(canonical) | %resource.descendants().as(uri) | %resource.descendants().as(url))) or descendants().where(reference = '#').exists() or descendants().where(as(canonical) = '#').exists() or descendants().where(as(canonical) = '#').exists()).not()).trace('unmatched', id).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-5PatientIf a resource is contained in another resource, it SHALL NOT have a security label
: contained.meta.security.empty()
dom-6PatientA resource should have narrative for robust management
: text.`div`.exists()
marital-status-unknown-usagePatientStatus in maritalStatus is unknown in a danish context. Consider mapping the value to UNK
: 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()
Marital status is legally unknown in Denmark
ele-1Patient.metaAll FHIR elements must have a @value or children
: hasValue() or (children().count() > id.count())
ele-1Patient.implicitRulesAll FHIR elements must have a @value or children
: hasValue() or (children().count() > id.count())
ele-1Patient.languageAll FHIR elements must have a @value or children
: hasValue() or (children().count() > id.count())
ele-1Patient.textAll FHIR elements must have a @value or children
: hasValue() or (children().count() > id.count())
ele-1Patient.extensionAll FHIR elements must have a @value or children
: hasValue() or (children().count() > id.count())
ext-1Patient.extensionMust have either extensions or value[x], not both
: extension.exists() != value.exists()
ele-1Patient.extension:itCompetenceLevelAll FHIR elements must have a @value or children
: hasValue() or (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() or (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() or (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() or (children().count() > id.count())
ext-1Patient.extension:nameAndAddressProtectionMust have either extensions or value[x], not both
: extension.exists() != value.exists()
ele-1Patient.modifierExtensionAll FHIR elements must have a @value or children
: hasValue() or (children().count() > id.count())
ext-1Patient.modifierExtensionMust have either extensions or value[x], not both
: extension.exists() != value.exists()
ele-1Patient.identifierAll FHIR elements must have a @value or children
: hasValue() or (children().count() > id.count())
ele-1Patient.identifier:cprAll FHIR elements must have a @value or children
: hasValue() or (children().count() > id.count())
ele-1Patient.activeAll FHIR elements must have a @value or children
: hasValue() or (children().count() > id.count())
ele-1Patient.nameAll FHIR elements must have a @value or children
: hasValue() or (children().count() > id.count())
ele-1Patient.name:officialAll FHIR elements must have a @value or children
: hasValue() or (children().count() > id.count())
ele-1Patient.name:official.extensionAll FHIR elements must have a @value or children
: hasValue() or (children().count() > id.count())
ext-1Patient.name:official.extensionMust have either extensions or value[x], not both
: extension.exists() != value.exists()
ele-1Patient.name:official.useAll FHIR elements must have a @value or children
: hasValue() or (children().count() > id.count())
ele-1Patient.name:official.textAll FHIR elements must have a @value or children
: hasValue() or (children().count() > id.count())
ele-1Patient.name:official.familyAll FHIR elements must have a @value or children
: hasValue() or (children().count() > id.count())
ele-1Patient.name:official.givenAll FHIR elements must have a @value or children
: hasValue() or (children().count() > id.count())
ele-1Patient.name:official.prefixAll FHIR elements must have a @value or children
: hasValue() or (children().count() > id.count())
ele-1Patient.name:official.suffixAll FHIR elements must have a @value or children
: hasValue() or (children().count() > id.count())
ele-1Patient.name:official.periodAll FHIR elements must have a @value or children
: hasValue() or (children().count() > id.count())
ele-1Patient.telecomAll FHIR elements must have a @value or children
: hasValue() or (children().count() > id.count())
ele-1Patient.telecom:NemSMSAll FHIR elements must have a @value or children
: hasValue() or (children().count() > id.count())
ele-1Patient.telecom:NemSMS.extensionAll FHIR elements must have a @value or children
: hasValue() or (children().count() > id.count())
ext-1Patient.telecom:NemSMS.extensionMust have either extensions or value[x], not both
: extension.exists() != value.exists()
ele-1Patient.telecom:NemSMS.systemAll FHIR elements must have a @value or children
: hasValue() or (children().count() > id.count())
ele-1Patient.telecom:NemSMS.valueAll FHIR elements must have a @value or children
: hasValue() or (children().count() > id.count())
ele-1Patient.telecom:NemSMS.periodAll FHIR elements must have a @value or children
: hasValue() or (children().count() > id.count())
ele-1Patient.telecom:eBoksAll FHIR elements must have a @value or children
: hasValue() or (children().count() > id.count())
ele-1Patient.telecom:eBoks.extensionAll FHIR elements must have a @value or children
: hasValue() or (children().count() > id.count())
ext-1Patient.telecom:eBoks.extensionMust have either extensions or value[x], not both
: extension.exists() != value.exists()
ele-1Patient.telecom:eBoks.systemAll FHIR elements must have a @value or children
: hasValue() or (children().count() > id.count())
ele-1Patient.telecom:eBoks.valueAll FHIR elements must have a @value or children
: hasValue() or (children().count() > id.count())
ele-1Patient.telecom:eBoks.periodAll FHIR elements must have a @value or children
: hasValue() or (children().count() > id.count())
ele-1Patient.genderAll FHIR elements must have a @value or children
: hasValue() or (children().count() > id.count())
ele-1Patient.birthDateAll FHIR elements must have a @value or children
: hasValue() or (children().count() > id.count())
ele-1Patient.deceased[x]All FHIR elements must have a @value or children
: hasValue() or (children().count() > id.count())
ele-1Patient.addressAll FHIR elements must have a @value or children
: hasValue() or (children().count() > id.count())
ele-1Patient.address.extensionAll FHIR elements must have a @value or children
: hasValue() or (children().count() > id.count())
ext-1Patient.address.extensionMust have either extensions or value[x], not both
: extension.exists() != value.exists()
ele-1Patient.address.extension:municipalityCodeAll FHIR elements must have a @value or children
: hasValue() or (children().count() > id.count())
ext-1Patient.address.extension:municipalityCodeMust have either extensions or value[x], not both
: extension.exists() != value.exists()
ele-1Patient.address.extension:regionalSubDivisionCodesAll FHIR elements must have a @value or children
: hasValue() or (children().count() > id.count())
ext-1Patient.address.extension:regionalSubDivisionCodesMust have either extensions or value[x], not both
: extension.exists() != value.exists()
ele-1Patient.address.useAll FHIR elements must have a @value or children
: hasValue() or (children().count() > id.count())
ele-1Patient.address.typeAll FHIR elements must have a @value or children
: hasValue() or (children().count() > id.count())
ele-1Patient.address.textAll FHIR elements must have a @value or children
: hasValue() or (children().count() > id.count())
ele-1Patient.address.lineAll FHIR elements must have a @value or children
: hasValue() or (children().count() > id.count())
ele-1Patient.address.cityAll FHIR elements must have a @value or children
: hasValue() or (children().count() > id.count())
ele-1Patient.address.districtAll FHIR elements must have a @value or children
: hasValue() or (children().count() > id.count())
ele-1Patient.address.stateAll FHIR elements must have a @value or children
: hasValue() or (children().count() > id.count())
ele-1Patient.address.postalCodeAll FHIR elements must have a @value or children
: hasValue() or (children().count() > id.count())
ele-1Patient.address.countryAll FHIR elements must have a @value or children
: hasValue() or (children().count() > id.count())
ele-1Patient.address.periodAll FHIR elements must have a @value or children
: hasValue() or (children().count() > id.count())
ele-1Patient.address:officialHomeAddressAll FHIR elements must have a @value or children
: hasValue() or (children().count() > id.count())
ele-1Patient.address:officialHomeAddress.extensionAll FHIR elements must have a @value or children
: hasValue() or (children().count() > id.count())
ext-1Patient.address:officialHomeAddress.extensionMust have either extensions or value[x], not both
: extension.exists() != value.exists()
ele-1Patient.address:officialHomeAddress.extension:municipalityCodeAll FHIR elements must have a @value or children
: hasValue() or (children().count() > id.count())
ext-1Patient.address:officialHomeAddress.extension:municipalityCodeMust have either extensions or value[x], not both
: extension.exists() != value.exists()
ele-1Patient.address:officialHomeAddress.extension:regionalSubDivisionCodesAll FHIR elements must have a @value or children
: hasValue() or (children().count() > id.count())
ext-1Patient.address:officialHomeAddress.extension:regionalSubDivisionCodesMust have either extensions or value[x], not both
: extension.exists() != value.exists()
ele-1Patient.address:officialHomeAddress.useAll FHIR elements must have a @value or children
: hasValue() or (children().count() > id.count())
ele-1Patient.address:officialHomeAddress.typeAll FHIR elements must have a @value or children
: hasValue() or (children().count() > id.count())
ele-1Patient.address:officialHomeAddress.textAll FHIR elements must have a @value or children
: hasValue() or (children().count() > id.count())
ele-1Patient.address:officialHomeAddress.lineAll FHIR elements must have a @value or children
: hasValue() or (children().count() > id.count())
ele-1Patient.address:officialHomeAddress.cityAll FHIR elements must have a @value or children
: hasValue() or (children().count() > id.count())
ele-1Patient.address:officialHomeAddress.districtAll FHIR elements must have a @value or children
: hasValue() or (children().count() > id.count())
ele-1Patient.address:officialHomeAddress.stateAll FHIR elements must have a @value or children
: hasValue() or (children().count() > id.count())
ele-1Patient.address:officialHomeAddress.postalCodeAll FHIR elements must have a @value or children
: hasValue() or (children().count() > id.count())
ele-1Patient.address:officialHomeAddress.countryAll FHIR elements must have a @value or children
: hasValue() or (children().count() > id.count())
ele-1Patient.address:officialHomeAddress.periodAll FHIR elements must have a @value or children
: hasValue() or (children().count() > id.count())
ele-1Patient.maritalStatusAll FHIR elements must have a @value or children
: hasValue() or (children().count() > id.count())
ele-1Patient.multipleBirth[x]All FHIR elements must have a @value or children
: hasValue() or (children().count() > id.count())
ele-1Patient.photoAll FHIR elements must have a @value or children
: hasValue() or (children().count() > id.count())
ele-1Patient.contactAll FHIR elements must have a @value or children
: hasValue() or (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.extensionAll FHIR elements must have a @value or children
: hasValue() or (children().count() > id.count())
ext-1Patient.contact.extensionMust have either extensions or value[x], not both
: extension.exists() != value.exists()
ele-1Patient.contact.extension:patientContactnoteAll FHIR elements must have a @value or children
: hasValue() or (children().count() > id.count())
ext-1Patient.contact.extension:patientContactnoteMust have either extensions or value[x], not both
: extension.exists() != value.exists()
ele-1Patient.contact.modifierExtensionAll FHIR elements must have a @value or children
: hasValue() or (children().count() > id.count())
ext-1Patient.contact.modifierExtensionMust have either extensions or value[x], not both
: extension.exists() != value.exists()
ele-1Patient.contact.relationshipAll FHIR elements must have a @value or children
: hasValue() or (children().count() > id.count())
ele-1Patient.contact.nameAll FHIR elements must have a @value or children
: hasValue() or (children().count() > id.count())
ele-1Patient.contact.telecomAll FHIR elements must have a @value or children
: hasValue() or (children().count() > id.count())
ele-1Patient.contact.addressAll FHIR elements must have a @value or children
: hasValue() or (children().count() > id.count())
ele-1Patient.contact.address.extensionAll FHIR elements must have a @value or children
: hasValue() or (children().count() > id.count())
ext-1Patient.contact.address.extensionMust have either extensions or value[x], not both
: extension.exists() != value.exists()
ele-1Patient.contact.address.extension:municipalityCodesAll FHIR elements must have a @value or children
: hasValue() or (children().count() > id.count())
ext-1Patient.contact.address.extension:municipalityCodesMust have either extensions or value[x], not both
: extension.exists() != value.exists()
ele-1Patient.contact.address.extension:regionalSubDivisionCodesAll FHIR elements must have a @value or children
: hasValue() or (children().count() > id.count())
ext-1Patient.contact.address.extension:regionalSubDivisionCodesMust have either extensions or value[x], not both
: extension.exists() != value.exists()
ele-1Patient.contact.address.useAll FHIR elements must have a @value or children
: hasValue() or (children().count() > id.count())
ele-1Patient.contact.address.typeAll FHIR elements must have a @value or children
: hasValue() or (children().count() > id.count())
ele-1Patient.contact.address.textAll FHIR elements must have a @value or children
: hasValue() or (children().count() > id.count())
ele-1Patient.contact.address.lineAll FHIR elements must have a @value or children
: hasValue() or (children().count() > id.count())
ele-1Patient.contact.address.cityAll FHIR elements must have a @value or children
: hasValue() or (children().count() > id.count())
ele-1Patient.contact.address.districtAll FHIR elements must have a @value or children
: hasValue() or (children().count() > id.count())
ele-1Patient.contact.address.stateAll FHIR elements must have a @value or children
: hasValue() or (children().count() > id.count())
ele-1Patient.contact.address.postalCodeAll FHIR elements must have a @value or children
: hasValue() or (children().count() > id.count())
ele-1Patient.contact.address.countryAll FHIR elements must have a @value or children
: hasValue() or (children().count() > id.count())
ele-1Patient.contact.address.periodAll FHIR elements must have a @value or children
: hasValue() or (children().count() > id.count())
ele-1Patient.contact.genderAll FHIR elements must have a @value or children
: hasValue() or (children().count() > id.count())
ele-1Patient.contact.organizationAll FHIR elements must have a @value or children
: hasValue() or (children().count() > id.count())
ele-1Patient.contact.periodAll FHIR elements must have a @value or children
: hasValue() or (children().count() > id.count())
ele-1Patient.communicationAll FHIR elements must have a @value or children
: hasValue() or (children().count() > id.count())
ele-1Patient.communication.extensionAll FHIR elements must have a @value or children
: hasValue() or (children().count() > id.count())
ext-1Patient.communication.extensionMust have either extensions or value[x], not both
: extension.exists() != value.exists()
ele-1Patient.communication.modifierExtensionAll FHIR elements must have a @value or children
: hasValue() or (children().count() > id.count())
ext-1Patient.communication.modifierExtensionMust have either extensions or value[x], not both
: extension.exists() != value.exists()
ele-1Patient.communication.languageAll FHIR elements must have a @value or children
: hasValue() or (children().count() > id.count())
ele-1Patient.communication.language.extensionAll FHIR elements must have a @value or children
: hasValue() or (children().count() > id.count())
ext-1Patient.communication.language.extensionMust have either extensions or value[x], not both
: extension.exists() != value.exists()
ele-1Patient.communication.language.codingAll FHIR elements must have a @value or children
: hasValue() or (children().count() > id.count())
ele-1Patient.communication.language.coding.extensionAll FHIR elements must have a @value or children
: hasValue() or (children().count() > id.count())
ext-1Patient.communication.language.coding.extensionMust have either extensions or value[x], not both
: extension.exists() != value.exists()
ele-1Patient.communication.language.coding.systemAll FHIR elements must have a @value or children
: hasValue() or (children().count() > id.count())
ele-1Patient.communication.language.coding.versionAll FHIR elements must have a @value or children
: hasValue() or (children().count() > id.count())
ele-1Patient.communication.language.coding.codeAll FHIR elements must have a @value or children
: hasValue() or (children().count() > id.count())
ele-1Patient.communication.language.coding.displayAll FHIR elements must have a @value or children
: hasValue() or (children().count() > id.count())
ele-1Patient.communication.language.coding.userSelectedAll FHIR elements must have a @value or children
: hasValue() or (children().count() > id.count())
ele-1Patient.communication.language.textAll FHIR elements must have a @value or children
: hasValue() or (children().count() > id.count())
ele-1Patient.communication.preferredAll FHIR elements must have a @value or children
: hasValue() or (children().count() > id.count())
ele-1Patient.generalPractitionerAll FHIR elements must have a @value or children
: hasValue() or (children().count() > id.count())
ele-1Patient.generalPractitioner:referencedSORUnitAll FHIR elements must have a @value or children
: hasValue() or (children().count() > id.count())
ele-1Patient.generalPractitioner:referencedSORUnit.extensionAll FHIR elements must have a @value or children
: hasValue() or (children().count() > id.count())
ext-1Patient.generalPractitioner:referencedSORUnit.extensionMust have either extensions or value[x], not both
: extension.exists() != value.exists()
ele-1Patient.generalPractitioner:referencedSORUnit.referenceAll FHIR elements must have a @value or children
: hasValue() or (children().count() > id.count())
ele-1Patient.generalPractitioner:referencedSORUnit.typeAll FHIR elements must have a @value or children
: hasValue() or (children().count() > id.count())
ele-1Patient.generalPractitioner:referencedSORUnit.identifierAll FHIR elements must have a @value or children
: hasValue() or (children().count() > id.count())
ele-1Patient.generalPractitioner:referencedSORUnit.displayAll FHIR elements must have a @value or children
: hasValue() or (children().count() > id.count())
ele-1Patient.managingOrganizationAll FHIR elements must have a @value or children
: hasValue() or (children().count() > id.count())
ele-1Patient.linkAll FHIR elements must have a @value or children
: hasValue() or (children().count() > id.count())
ele-1Patient.link.extensionAll FHIR elements must have a @value or children
: hasValue() or (children().count() > id.count())
ext-1Patient.link.extensionMust have either extensions or value[x], not both
: extension.exists() != value.exists()
ele-1Patient.link.modifierExtensionAll FHIR elements must have a @value or children
: hasValue() or (children().count() > id.count())
ext-1Patient.link.modifierExtensionMust have either extensions or value[x], not both
: extension.exists() != value.exists()
ele-1Patient.link.otherAll FHIR elements must have a @value or children
: hasValue() or (children().count() > id.count())
ele-1Patient.link.typeAll FHIR elements must have a @value or children
: hasValue() or (children().count() > id.count())