CH EPR FHIR (R4)
4.0.1-ballot-2 - ballot
CH EPR FHIR (R4), published by eHealth Suisse. This guide is not an authorized publication; it is the continuous build for version 4.0.1-ballot-2 built by the FHIR (HL7® FHIR® Standard) CI Build. This version is based on the current content of https://github.com/ehealthsuisse/ch-epr-fhir/ and changes regularly. See the Directory of published versions
Active as of 2024-11-19 |
Mappings for the PpqmConsent resource profile.
Each PpqmConsent resource contains an element identifier with
type.coding.code
equal to "templateId". In this element, the attribute value contains the ID of the official
Policy Stack template. For example:
{
"type": {
"coding": [{
"system": "http://fhir.ch/ig/ch-epr-fhir/CodeSystem/PpqmConsentIdentifierType",
"code": "templateId"
}]
},
"value": "201"
}
The PPQ-conformant XACML 2.0 Policy Set SHALL be created according to this template. Thereby, the value placeholders SHALL be filled according to the table below:
Placeholder | PpqmConsent attribute |
---|---|
Policy Set ID | identifier.value where identifier.type.coding.code equals to "policySetId" |
EPR-SPID | patient.identifier.value |
GLN | provision.actor.reference.identifier.value |
Group OID | provision.actor.reference.identifier.value |
Representative ID | provision.actor.reference.identifier.value |
PolicySetIDReference | policyRule.coding.code |
Start date | provision.period.start |
End date | provision.period.end |
Table 1: Mapping of PpqmConsent attributes onto CH:PPQ policy set template placeholders
Each patient-related CH:PPQ policy set is generated from a template provided in the official Policy Stack, but does not hold a direct reference to this template. Therefore, the first step is to determine the template ID. For that, the following heuristics SHALL be used:
/PolicySet/Target/Subjects
with three sub-elements Subject → template 203./PolicySet/Target/Subjects/Subject/SubjectMatch/AttributeValue/CodedValue
with
@codeSystem
equal to "2.16.756.5.30.1.127.3.10.6" and:
@code
equal to "PAT" → template 201.@code
equal to "REP" → template 303./PolicySet/Target/Subjects/Subject/SubjectMatch/AttributeValue/CodedValue
with
@codeSystem
equal to "2.16.756.5.30.1.127.3.10.5" and @code
equal to "EMER" → template 202./PolicySet/Target/Subjects/Subject/SubjectMatch/SubjectAttributeDesignator
with
@AttributeId
equal to "urn:oasis:names:tc:xspa:1.0:subject:organization-id" → template 302.<PolicySetIdReference>
) contains the substring
"delegation" → template 304.The PpqmConsent resource attributes SHALL be populated according to the rules defined for each template in the table below:
PpqmConsent attribute | Template 201 (full access for the patient) |
Template 202 (confidentiality level for emergency read access) |
Template 203 (minimal confidentiality level for upload) |
Template 301 (individual read access permissions) |
Template 302 (group read access permissions) |
Template 303 (full access for the patient's representative) |
Template 304 (individual read access permissions with delegation) |
identifier.value (1) |
value of /PolicySet/@PolicySetId |
||||||
identifier.type (1) |
fixed value: code "http://fhir.ch/ig/ch-epr-fhir/CodeSystem/PpqmConsentIdentifierType|policySetId" | ||||||
identifier.value (2) |
fixed value: "201" | fixed value: "202" | fixed value: "203" | fixed value: "301" | fixed value: "302" | fixed value: "303" | fixed value: "304" |
identifier.type (2) |
fixed value: code "http://fhir.ch/ig/ch-epr-fhir/CodeSystem/PpqmConsentIdentifierType|templateId" | ||||||
status |
fixed value: code "active" | ||||||
scope |
fixed value: code "http://terminology.hl7.org/CodeSystem/consentscope|patient-privacy" | ||||||
category |
fixed value: code "http://terminology.hl7.org/CodeSystem/v3-ActCode|INFA" | ||||||
patient.identifier.system |
fixed value: "urn:oid:2.16.756.5.30.1.127.3.10.3" | ||||||
patient.identifier.value |
EPR-SPID of the patient | ||||||
policyRule.coding.code |
value of /PolicySet/PolicySetIdReference |
||||||
provision.period.start |
not populated | not populated | not populated | allowed only if the end date is provided | optional | not populated | optional |
provision.period.end |
not populated | not populated | not populated | optional | required | not populated | required |
provision.actor.role.coding.code |
fixed value: "PAT" | fixed value: "HCP" | fixed value: "HCP" | fixed value: "HCP" | fixed value: "HCP" | fixed value: "REP" | fixed value: "HCP" |
provision.actor.role.coding.system |
fixed value: "urn:oid:2.16.756.5.30.1.127.3.10.6" | ||||||
provision.actor.reference.identifier.type.coding.code |
fixed value: "urn:e-health-suisse:2015:epr-spid" | not populated | not populated | fixed value: "urn:gs1:gln" | fixed value: "urn:oasis: names:tc:xspa: 1.0:subject:organization-id" | fixed value: "urn:e-health-suisse:representative-id" | fixed value: "urn:gs1:gln" |
provision.actor.reference.identifier.value |
EPR‑SPID of the patient | not populated | not populated | GLN of the healthcare professional | OID of the HCP group, in URN format | ID of the patient's representative | GLN of the healthcare professional |
provision.actor.reference.identifier.system |
fixed value: "urn:oid:2.16.756.5.30.1.127.3.10.3" | not populated | not populated | fixed value: "urn:oid:2.51.1.3" | not populated | not populated | fixed value: "urn:oid:2.51.1.3" |
provision.actor.reference.display |
not populated | fixed value: "all" | fixed value: "all" | not populated | not populated | not populated | not populated |
provision.purpose.code |
not populated | fixed value: "EMER" | fixed values: "NORM", "AUTO", "DICOM_AUTO" (each in its own repetition of provision.purpose ) |
fixed value: "NORM" | fixed value: "NORM" | not populated | fixed value: "NORM" |
provision.purpose.system |
fixed value: "urn:oid:2.16.756.5.30.1.127.3.10.5" if provision.purpose.code is provided; otherwise not present |
Table 2: Mapping of CH:PPQ policy set elements onto PpqmConsent attributes
PpqmConsent | ||
Consent | PolicySet | |
identifier | ||
value | /PolicySet/@PolicySetId | |
patient | ||
identifier | ||
system | /PolicySet/Target/Resources/Resource/ResourceMatch/AttributeValue/InstanceIdentifier/@root | |
value | /PolicySet/Target/Resources/Resource/ResourceMatch/AttributeValue/InstanceIdentifier/@extension | |
policyRule | ||
coding | ||
code | /PolicySet/PolicySetIdReference | |
provision | ||
period | ||
start | /PolicySet/Target/Environments/Environment/EnvironmentMatch[@MatchId='urn:oasis:names:tc:xacml:1.0:function:date-less-than-or-equal']/AtributeValue | |
end | /PolicySet/Target/Environments/Environment/EnvironmentMatch[@MatchId='urn:oasis:names:tc:xacml:1.0:function:date-greater-than-or-equal']/AtributeValue | |
actor | ||
role | ||
coding | ||
system | /PolicySet/Target/Subjects/Subject/SubjectMatch[SubjectAttributeDesignator/@AttributeId='urn:oasis:names:tc:xacml:2.0:subject:role']/AttributeValue/CodedValue/@codeSystem | |
code | /PolicySet/Target/Subjects/Subject/SubjectMatch[SubjectAttributeDesignator/@AttributeId='urn:oasis:names:tc:xacml:2.0:subject:role']/AttributeValue/CodedValue/@code | |
reference | ||
identifier | ||
type | ||
coding | ||
code | /PolicySet/Target/Subjects/Subject/SubjectMatch[SubjectAttributeDesignator/@AttributeId='urn:oasis:names:tc:xacml:1.0:subject:subject-id-qualifier']/AttributeValue | if NOT equal to 'urn:oasis:names:tc:xspa:1.0:subject:organization-id' |
value | /PolicySet/Target/Subjects/Subject/SubjectMatch[SubjectAttributeDesignator/@AttributeId='urn:oasis:names:tc:xacml:1.0:subject:subject-id']/AttributeValue, /PolicySet/Target/Subjects/Subject/SubjectMatch[SubjectAttributeDesignator/@AttributeId='urn:oasis:names:tc:xspa:1.0:subject:organization-id']/AttributeValue | if identifier.type is NOT equal to 'urn:oasis:names:tc:xspa:1.0:subject:organization-id' ,if identifier.type is equal to 'urn:oasis:names:tc:xspa:1.0:subject:organization-id' |
purpose | ||
system | /PolicySet/Target/Subjects/Subject/SubjectMatch[SubjectAttributeDesignator/@AttributeId='urn:oasis:names:tc:xspa:1.0:subject:purposeofuse']/AttributeValue/CodedValue/@codeSystem | |
code | /PolicySet/Target/Subjects/Subject/SubjectMatch[SubjectAttributeDesignator/@AttributeId='urn:oasis:names:tc:xspa:1.0:subject:purposeofuse']/AttributeValue/CodedValue/@code |
PpqmConsent | ||
Consent | Event | |
identifier | Event.identifier | |
identifier (policySetId) | Event.identifier | |
identifier (templateId) | Event.identifier | |
status | Event.status | |
category | Event.code | |
patient | Event.subject |
PpqmConsent | ||
Consent | CON | |
identifier | ||
use | N/A | |
type | CX.5 | |
system | CX.4 / EI-2-4 | |
value | CX.1 / EI.1 | |
period | CX.7 + CX.8 | |
assigner | CX.4 / (CX.4,CX.9,CX.10) | |
identifier (policySetId) | ||
type | CX.5 | |
coding | C*E.1-8, C*E.10-22 | |
text | C*E.9. But note many systems use C*E.2 for this | |
value | CX.1 / EI.1 | |
identifier (templateId) | ||
type | CX.5 | |
coding | C*E.1-8, C*E.10-22 | |
text | C*E.9. But note many systems use C*E.2 for this | |
value | CX.1 / EI.1 | |
status | HL7 Table 0498 - Consent Status | |
scope | ||
coding | C*E.1-8, C*E.10-22 | |
text | C*E.9. But note many systems use C*E.2 for this | |
category | HL7 Table 0497 - Consent Type | |
coding | C*E.1-8, C*E.10-22 | |
text | C*E.9. But note many systems use C*E.2 for this | |
patient | ||
identifier | CX / EI (occasionally, more often EI maps to a resource id or a URL) | |
system | CX.4 / EI-2-4 | |
value | CX.1 / EI.1 | |
policyRule | ||
coding | C*E.1-8, C*E.10-22 | |
system | C*E.3 | |
code | C*E.1 | |
display | C*E.2 - but note this is not well followed | |
text | C*E.9. But note many systems use C*E.2 for this | |
provision | ||
period | ||
start | DR.1 | |
end | DR.2 | |
actor | ||
role | ||
coding | C*E.1-8, C*E.10-22 | |
system | C*E.3 | |
version | C*E.7 | |
code | C*E.1 | |
display | C*E.2 - but note this is not well followed | |
userSelected | Sometimes implied by being first | |
text | C*E.9. But note many systems use C*E.2 for this | |
reference | ||
identifier | ||
type | CX.5 | |
coding | C*E.1-8, C*E.10-22 | |
system | C*E.3 | |
code | C*E.1 | |
display | C*E.2 - but note this is not well followed | |
system | CX.4 / EI-2-4 | |
value | CX.1 / EI.1 | |
purpose | ||
system | C*E.3 | |
version | C*E.7 | |
code | C*E.1 | |
display | C*E.2 - but note this is not well followed | |
userSelected | Sometimes implied by being first |
PpqmConsent | ||
Consent | Entity. Role, or Act, FinancialConsent | |
text | Act.text? | |
contained | N/A | |
extension | N/A | |
modifierExtension | N/A | |
identifier | .id | |
id | n/a | |
extension | n/a | |
use | Role.code or implied by context | |
type | Role.code or implied by context | |
system | II.root or Role.id.root | |
value | II.extension or II.root if system indicates OID or GUID (Or Role.id.extension or root) | |
period | Role.effectiveTime or implied by context | |
assigner | II.assigningAuthorityName but note that this is an improper use by the definition of the field. Also Role.scoper | |
identifier (policySetId) | .id | |
id | n/a | |
extension | n/a | |
type | Role.code or implied by context | |
id | n/a | |
extension | n/a | |
coding | union(., ./translation) | |
text | ./originalText[mediaType/code="text/plain"]/data | |
value | II.extension or II.root if system indicates OID or GUID (Or Role.id.extension or root) | |
identifier (templateId) | .id | |
id | n/a | |
extension | n/a | |
type | Role.code or implied by context | |
id | n/a | |
extension | n/a | |
coding | union(., ./translation) | |
text | ./originalText[mediaType/code="text/plain"]/data | |
value | II.extension or II.root if system indicates OID or GUID (Or Role.id.extension or root) | |
status | .statusCode | |
scope | ||
id | n/a | |
extension | n/a | |
coding | union(., ./translation) | |
text | ./originalText[mediaType/code="text/plain"]/data | |
category | CNTRCT | |
id | n/a | |
extension | n/a | |
coding | union(., ./translation) | |
text | ./originalText[mediaType/code="text/plain"]/data | |
patient | Role | |
id | n/a | |
extension | n/a | |
identifier | n/a, II - The Identifier class is a little looser than the v3 type II because it allows URIs as well as registered OIDs or GUIDs. Also maps to Role[classCode=IDENT] | |
id | n/a | |
extension | n/a | |
system | II.root or Role.id.root | |
value | II.extension or II.root if system indicates OID or GUID (Or Role.id.extension or root) | |
policyRule | ||
id | n/a | |
extension | n/a | |
coding | union(., ./translation) | |
id | n/a | |
extension | n/a | |
system | ./codeSystem | |
code | ./code | |
display | CV.displayName | |
text | ./originalText[mediaType/code="text/plain"]/data | |
provision | ||
id | n/a | |
extension | n/a | |
modifierExtension | N/A | |
period | ||
id | n/a | |
extension | n/a | |
start | ./low | |
end | ./high | |
actor | ||
id | n/a | |
extension | n/a | |
modifierExtension | N/A | |
role | ||
id | n/a | |
extension | n/a | |
coding | union(., ./translation) | |
id | n/a | |
extension | n/a | |
system | ./codeSystem | |
version | ./codeSystemVersion | |
code | ./code | |
display | CV.displayName | |
userSelected | CD.codingRationale | |
text | ./originalText[mediaType/code="text/plain"]/data | |
reference | ||
id | n/a | |
extension | n/a | |
identifier | .identifier | |
id | n/a | |
extension | n/a | |
type | Role.code or implied by context | |
id | n/a | |
extension | n/a | |
coding | union(., ./translation) | |
id | n/a | |
extension | n/a | |
system | ./codeSystem | |
code | ./code | |
display | CV.displayName | |
system | II.root or Role.id.root | |
value | II.extension or II.root if system indicates OID or GUID (Or Role.id.extension or root) | |
display | N/A | |
purpose | ||
id | n/a | |
extension | n/a | |
system | ./codeSystem | |
version | ./codeSystemVersion | |
code | ./code | |
display | CV.displayName | |
userSelected | CD.codingRationale |
PpqmConsent | ||
Consent | ||
identifier | FiveWs.identifier | |
identifier (policySetId) | FiveWs.identifier | |
identifier (templateId) | FiveWs.identifier | |
status | FiveWs.status | |
category | FiveWs.class | |
patient | FiveWs.subject[x], FiveWs.subject |