CH EPR FHIR (R4)
4.0.1-ballot-2 - ballot Switzerland flag

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

Resource Profile: PpqmConsent - Mappings

Active as of 2024-11-19

Mappings for the PpqmConsent resource profile.

Mapping between PpqmConsent Resources and CH:PPQ Policy Sets

Transformation of PpqmConsent Resources into CH:PPQ Policy Sets

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

Transformation of CH:PPQ Policy Sets into PpqmConsent Resources

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:

  • The policy set contains an element /PolicySet/Target/Subjects with three sub-elements Subject → template 203.
  • The policy set contains an element /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.
  • The policy set contains an element /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.
  • The policy set contains an element /PolicySet/Target/Subjects/Subject/SubjectMatch/SubjectAttributeDesignator with @AttributeId equal to "urn:oasis:names:tc:xspa:1.0:subject:organization-id" → template 302.
  • The ID of the referenced policy set (value of the element <PolicySetIdReference>) contains the substring "delegation" → template 304.
  • Otherwise → template 301.

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

Mappings for CH:PPQ XACML 2.0 Policy Set (http://docs.oasis-open.org/xacml/2.0)

PpqmConsent
ConsentPolicySet
   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

Mappings for Workflow Pattern (http://hl7.org/fhir/workflow)

PpqmConsent
ConsentEvent
   identifierEvent.identifier
   identifier (policySetId)Event.identifier
   identifier (templateId)Event.identifier
   statusEvent.status
   categoryEvent.code
   patientEvent.subject

Mappings for HL7 v2 Mapping (http://hl7.org/v2)

PpqmConsent
ConsentCON
   identifier
      useN/A
      typeCX.5
      systemCX.4 / EI-2-4
      valueCX.1 / EI.1
      periodCX.7 + CX.8
      assignerCX.4 / (CX.4,CX.9,CX.10)
   identifier (policySetId)
      typeCX.5
         codingC*E.1-8, C*E.10-22
         textC*E.9. But note many systems use C*E.2 for this
      valueCX.1 / EI.1
   identifier (templateId)
      typeCX.5
         codingC*E.1-8, C*E.10-22
         textC*E.9. But note many systems use C*E.2 for this
      valueCX.1 / EI.1
   statusHL7 Table 0498 - Consent Status
   scope
      codingC*E.1-8, C*E.10-22
      textC*E.9. But note many systems use C*E.2 for this
   categoryHL7 Table 0497 - Consent Type
      codingC*E.1-8, C*E.10-22
      textC*E.9. But note many systems use C*E.2 for this
   patient
      identifierCX / EI (occasionally, more often EI maps to a resource id or a URL)
         systemCX.4 / EI-2-4
         valueCX.1 / EI.1
   policyRule
      codingC*E.1-8, C*E.10-22
         systemC*E.3
         codeC*E.1
         displayC*E.2 - but note this is not well followed
      textC*E.9. But note many systems use C*E.2 for this
   provision
      period
         startDR.1
         endDR.2
      actor
         role
            codingC*E.1-8, C*E.10-22
               systemC*E.3
               versionC*E.7
               codeC*E.1
               displayC*E.2 - but note this is not well followed
               userSelectedSometimes implied by being first
            textC*E.9. But note many systems use C*E.2 for this
         reference
            identifier
               typeCX.5
                  codingC*E.1-8, C*E.10-22
                     systemC*E.3
                     codeC*E.1
                     displayC*E.2 - but note this is not well followed
               systemCX.4 / EI-2-4
               valueCX.1 / EI.1
      purpose
         systemC*E.3
         versionC*E.7
         codeC*E.1
         displayC*E.2 - but note this is not well followed
         userSelectedSometimes implied by being first

Mappings for RIM Mapping (http://hl7.org/v3)

PpqmConsent
ConsentEntity. Role, or Act, FinancialConsent
   textAct.text?
   containedN/A
   extensionN/A
   modifierExtensionN/A
   identifier.id
      idn/a
      extensionn/a
      useRole.code or implied by context
      typeRole.code or implied by context
      systemII.root or Role.id.root
      valueII.extension or II.root if system indicates OID or GUID (Or Role.id.extension or root)
      periodRole.effectiveTime or implied by context
      assignerII.assigningAuthorityName but note that this is an improper use by the definition of the field. Also Role.scoper
   identifier (policySetId).id
      idn/a
      extensionn/a
      typeRole.code or implied by context
         idn/a
         extensionn/a
         codingunion(., ./translation)
         text./originalText[mediaType/code="text/plain"]/data
      valueII.extension or II.root if system indicates OID or GUID (Or Role.id.extension or root)
   identifier (templateId).id
      idn/a
      extensionn/a
      typeRole.code or implied by context
         idn/a
         extensionn/a
         codingunion(., ./translation)
         text./originalText[mediaType/code="text/plain"]/data
      valueII.extension or II.root if system indicates OID or GUID (Or Role.id.extension or root)
   status.statusCode
   scope
      idn/a
      extensionn/a
      codingunion(., ./translation)
      text./originalText[mediaType/code="text/plain"]/data
   categoryCNTRCT
      idn/a
      extensionn/a
      codingunion(., ./translation)
      text./originalText[mediaType/code="text/plain"]/data
   patientRole
      idn/a
      extensionn/a
      identifiern/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]
         idn/a
         extensionn/a
         systemII.root or Role.id.root
         valueII.extension or II.root if system indicates OID or GUID (Or Role.id.extension or root)
   policyRule
      idn/a
      extensionn/a
      codingunion(., ./translation)
         idn/a
         extensionn/a
         system./codeSystem
         code./code
         displayCV.displayName
      text./originalText[mediaType/code="text/plain"]/data
   provision
      idn/a
      extensionn/a
      modifierExtensionN/A
      period
         idn/a
         extensionn/a
         start./low
         end./high
      actor
         idn/a
         extensionn/a
         modifierExtensionN/A
         role
            idn/a
            extensionn/a
            codingunion(., ./translation)
               idn/a
               extensionn/a
               system./codeSystem
               version./codeSystemVersion
               code./code
               displayCV.displayName
               userSelectedCD.codingRationale
            text./originalText[mediaType/code="text/plain"]/data
         reference
            idn/a
            extensionn/a
            identifier.identifier
               idn/a
               extensionn/a
               typeRole.code or implied by context
                  idn/a
                  extensionn/a
                  codingunion(., ./translation)
                     idn/a
                     extensionn/a
                     system./codeSystem
                     code./code
                     displayCV.displayName
               systemII.root or Role.id.root
               valueII.extension or II.root if system indicates OID or GUID (Or Role.id.extension or root)
            displayN/A
      purpose
         idn/a
         extensionn/a
         system./codeSystem
         version./codeSystemVersion
         code./code
         displayCV.displayName
         userSelectedCD.codingRationale

Mappings for FiveWs Pattern Mapping (http://hl7.org/fhir/fivews)

PpqmConsent
Consent
   identifierFiveWs.identifier
   identifier (policySetId)FiveWs.identifier
   identifier (templateId)FiveWs.identifier
   statusFiveWs.status
   categoryFiveWs.class
   patientFiveWs.subject[x], FiveWs.subject