Canonical Resource Management Infrastructure Implementation Guide
1.0.0 - STU1

Publication Build: This will be filled in by the publication tooling

## Library: FHIR Common (Shareable Example)

Official URL: http://hl7.org/fhir/uv/crmi/Library/shareable-example | Version: 1.0.0
Active as of 2022-11-16 | Computable Name: FHIRCommonShareable
Other Identifiers: OID:2.16.840.1.113883.4.642.40.38.28.9

This library defines terminologies and functions commonly used in FHIR-based CQL artifacts.

## Related Artifacts

depends-on | FHIR model information | `http://fhir.org/guides/cqf/common/Library/FHIR-ModelInfo|4.0.1`
depends-on | Library FHIRHelpers | `http://ecqi.healthit.gov/ecqms/Library/FHIRHelpers|4.1.000`
depends-on | Code system LOINC | Logical Observation Identifiers, Names and Codes (LOINC)
depends-on | Code system SNOMEDCT | SNOMED CT (all versions)
depends-on | Code system RoleCode | RoleCode
depends-on | Code system Diagnosis Role | Diagnosis Role
depends-on | Code system RequestIntent | `http://terminology.hl7.org/CodeSystem/request-intent`
depends-on | Code system MedicationRequestCategory | MedicationRequest Category Codes
depends-on | Code system ConditionClinicalStatusCodes | Condition Clinical Status Codes
depends-on | Code system ConditionVerificationStatusCodes | ConditionVerificationStatus
depends-on | Code system AllergyIntoleranceClinicalStatusCodes | AllergyIntolerance Clinical Status Codes
depends-on | Code system AllergyIntoleranceVerificationStatusCodes | AllergyIntolerance Verification Status

## Parameters

Patient | out | 0 | 1 | Patient

## Data Requirements

Type: Patient (Patient)

## Contents

`text/cql`

    library FHIRCommon version '4.1.000'

    using FHIR version '4.0.1'

    include FHIRHelpers version '4.1.000'

    codesystem "LOINC": 'http://loinc.org'
    codesystem "SNOMEDCT": 'http://snomed.info/sct'
    codesystem "RoleCode": 'http://terminology.hl7.org/CodeSystem/v3-RoleCode'
    codesystem "Diagnosis Role": 'http://terminology.hl7.org/CodeSystem/diagnosis-role'
    codesystem "RequestIntent": 'http://terminology.hl7.org/CodeSystem/request-intent'
    codesystem "MedicationRequestCategory": 'http://terminology.hl7.org/CodeSystem/medicationrequest-category'
    codesystem "ConditionClinicalStatusCodes": 'http://terminology.hl7.org/CodeSystem/condition-clinical'
    codesystem "ConditionVerificationStatusCodes": 'http://terminology.hl7.org/CodeSystem/condition-ver-status'
    codesystem "AllergyIntoleranceClinicalStatusCodes": 'http://terminology.hl7.org/CodeSystem/allergyintolerance-clinical'
    codesystem "AllergyIntoleranceVerificationStatusCodes": 'http://terminology.hl7.org/CodeSystem/allergyintolerance-verification'

    //Currently unresolveable in VSAC:
    //valueset "Active Condition": 'http://fhir.org/guides/cqf/common/ValueSet/active-condition'
    //valueset "Inactive Condition": 'http://fhir.org/guides/cqf/common/ValueSet/inactive-condition'

    code "Birthdate": '21112-8' from "LOINC" display 'Birth date'
    code "Dead": '419099009' from "SNOMEDCT" display 'Dead'
    code "ER": 'ER' from "RoleCode" display 'Emergency room'
    code "ICU": 'ICU' from "RoleCode" display 'Intensive care unit'
    code "Billing": 'billing' from "Diagnosis Role" display 'Billing'

    // Condition Clinical Status Codes - Consider value sets for these
    code "active": 'active' from "ConditionClinicalStatusCodes"
    code "recurrence": 'recurrence' from "ConditionClinicalStatusCodes"
    code "relapse": 'relapse' from "ConditionClinicalStatusCodes"
    code "inactive": 'inactive' from "ConditionClinicalStatusCodes"
    code "remission": 'remission' from "ConditionClinicalStatusCodes"
    code "resolved": 'resolved' from "ConditionClinicalStatusCodes"

    // Condition Verification Status Codes - Consider value sets for these
    code "unconfirmed": 'unconfirmed' from ConditionVerificationStatusCodes
    code "provisional": 'provisional' from ConditionVerificationStatusCodes
    code "differential": 'differential' from ConditionVerificationStatusCodes
    code "confirmed": 'confirmed' from ConditionVerificationStatusCodes
    code "refuted": 'refuted' from ConditionVerificationStatusCodes
    code "entered-in-error": 'entered-in-error' from ConditionVerificationStatusCodes

    code "allergy-active": 'active' from "AllergyIntoleranceClinicalStatusCodes"
    code "allergy-inactive": 'inactive' from "AllergyIntoleranceClinicalStatusCodes"
    code "allergy-resolved": 'resolved' from "AllergyIntoleranceClinicalStatusCodes"

    // Allergy/Intolerance Verification Status Codes - Consider value sets for these
    code "allergy-unconfirmed": 'unconfirmed' from AllergyIntoleranceVerificationStatusCodes
    code "allergy-confirmed": 'confirmed' from AllergyIntoleranceVerificationStatusCodes
    code "allergy-refuted": 'refuted' from AllergyIntoleranceVerificationStatusCodes

    // MedicationRequest Category Codes
    code "Community": 'community' from "MedicationRequestCategory" display 'Community'
    code "Discharge": 'discharge' from "MedicationRequestCategory" display 'Discharge'

    // Diagnosis Role Codes
    code "AD": 'AD' from "Diagnosis Role" display 'Admission diagnosis'
    code "DD": 'DD' from "Diagnosis Role" display 'Discharge diagnosis'
    code "CC": 'CC' from "Diagnosis Role" display 'Chief complaint'
    code "CM": 'CM' from "Diagnosis Role" display 'Comorbidity diagnosis'
    code "pre-op": 'pre-op' from "Diagnosis Role" display 'pre-op diagnosis'
    code "post-op": 'post-op' from "Diagnosis Role" display 'post-op diagnosis'
    code "billing": 'billing' from "Diagnosis Role" display 'billing diagnosis'

    context Patient

    /*
    @description: Normalizes a value that is a choice of timing-valued types to an equivalent interval
    @comment: Normalizes a choice type of FHIR.dateTime, FHIR.Period, FHIR.Timing, FHIR.instance, FHIR.string, FHIR.Age, or FHIR.Range types
    to an equivalent interval. This selection of choice types is a superset of the majority of choice types that are used as possible
    representations for timing-valued elements in FHIR, allowing this function to be used across any resource. NOTE: Due to the
    complexity of determining a single interval from a Timing or String type, this function will throw a run-time exception if it is used
    with a Timing or String.
    */
    define function ToInterval(choice Choice<FHIR.dateTime, FHIR.Period, FHIR.Timing, FHIR.instant, FHIR.string, FHIR.Age, FHIR.Range>):
      case
    	  when choice is FHIR.dateTime then
        	Interval[FHIRHelpers.ToDateTime(choice as FHIR.dateTime), FHIRHelpers.ToDateTime(choice as FHIR.dateTime)]
    		when choice is FHIR.Period then
      		FHIRHelpers.ToInterval(choice as FHIR.Period)
    		when choice is FHIR.instant then
    			Interval[FHIRHelpers.ToDateTime(choice as FHIR.instant), FHIRHelpers.ToDateTime(choice as FHIR.instant)]
    		when choice is FHIR.Age then
    		  Interval[FHIRHelpers.ToDate(Patient.birthDate) + FHIRHelpers.ToQuantity(choice as FHIR.Age),
    			  FHIRHelpers.ToDate(Patient.birthDate) + FHIRHelpers.ToQuantity(choice as FHIR.Age) + 1 year)
    		when choice is FHIR.Range then
    		  Interval[FHIRHelpers.ToDate(Patient.birthDate) + FHIRHelpers.ToQuantity((choice as FHIR.Range).low),
    			  FHIRHelpers.ToDate(Patient.birthDate) + FHIRHelpers.ToQuantity((choice as FHIR.Range).high) + 1 year)
    		when choice is FHIR.Timing then
    		  Message(null as Interval<DateTime>, true, '1', 'Error', 'Cannot compute a single interval from a Timing type')
        when choice is FHIR.string then
          Message(null as Interval<DateTime>, true, '1', 'Error', 'Cannot compute an interval from a String value')
    		else
    			null as Interval<DateTime>
    	end

    /*
    @description: Returns an interval representing the normalized Abatement of a given Condition resource.
    @comment: NOTE: Due to the complexity of determining an interval from a String, this function will throw
    a run-time exception if used with a Condition instance that has a String as the abatement value.
    */
    define function ToAbatementInterval(condition Condition):
    	if condition.abatement is FHIR.dateTime then
    	  Interval[FHIRHelpers.ToDateTime(condition.abatement as FHIR.dateTime), FHIRHelpers.ToDateTime(condition.abatement as FHIR.dateTime)]
    	else if condition.abatement is FHIR.Period then
    	  FHIRHelpers.ToInterval(condition.abatement as FHIR.Period)
    	else if condition.abatement is FHIR.string then
        Message(null as Interval<DateTime>, true, '1', 'Error', 'Cannot compute an interval from a String value')
    	else if condition.abatement is FHIR.Age then
    		Interval[FHIRHelpers.ToDate(Patient.birthDate) + FHIRHelpers.ToQuantity(condition.abatement as FHIR.Age),
    			FHIRHelpers.ToDate(Patient.birthDate) + FHIRHelpers.ToQuantity(condition.abatement as FHIR.Age) + 1 year)
    	else if condition.abatement is FHIR.Range then
    	  Interval[FHIRHelpers.ToDate(Patient.birthDate) + FHIRHelpers.ToQuantity((condition.abatement as FHIR.Range).low),
    		  FHIRHelpers.ToDate(Patient.birthDate) + FHIRHelpers.ToQuantity((condition.abatement as FHIR.Range).high) + 1 year)
    	else if condition.abatement is FHIR.boolean then
    	  Interval[end of ToInterval(condition.onset), condition.recordedDate)
    	else null

    /*
    @description: Returns an interval representing the normalized prevalence period of a given Condition resource.
    @comment: Uses the ToInterval and ToAbatementInterval functions to determine the widest potential interval from
    onset to abatement as specified in the given Condition.
    */
    define function ToPrevalenceInterval(condition Condition):
    if condition.clinicalStatus ~ "active"
      or condition.clinicalStatus ~ "recurrence"
      or condition.clinicalStatus ~ "relapse" then
      Interval[start of ToInterval(condition.onset), end of ToAbatementInterval(condition)]
    else
      Interval[start of ToInterval(condition.onset), end of ToAbatementInterval(condition))

    /*
    @description: Returns any extensions defined on the given resource with the specified url.
    @comment: NOTE: Extensions are not the preferred approach, but are used as a way to access
    content that is defined by extensions but not yet surfaced in the
    CQL model info.
    */
    define function Extensions(domainResource DomainResource, url String):
      domainResource.extension E
    	  where E.url = url
    		return E

    /*
    @description: Returns the single extension (if present) on the given resource with the specified url.
    @comment: This function uses singleton from to ensure that a run-time exception is thrown if there
    is more than one extension on the given resource with the specified url.
    */
    define function Extension(domainResource DomainResource, url String):
      singleton from "Extensions"(domainResource, url)

    /*
    @description: Returns any extensions defined on the given element with the specified url.
    @comment: NOTE: Extensions are not the preferred approach, but are used as a way to access
    content that is defined by extensions but not yet surfaced in the CQL model info.
    */
    define function Extensions(element Element, url String):
      element.extension E
    	  where E.url = url
    		return E

    /*
    @description: Returns the single extension (if present) on the given element with the specified url.
    @comment: This function uses singleton from to ensure that a run-time exception is thrown if there
    is more than one extension on the given resource with the specified url.
    */
    define function Extension(element Element, url String):
      singleton from Extensions(element, url)

    /*
    @description: Returns any modifier extensions defined on the given resource with the specified url.
    @comment: NOTE: Extensions are not the preferred approach, but are used as a way to access
    content that is defined by extensions but not yet surfaced in the
    CQL model info.
    */
    define function ModifierExtensions(domainResource DomainResource, url String):
      domainResource.modifierExtension E
    	  where E.url = url
    		return E

    /*
    @description: Returns the single modifier extension (if present) on the given resource with the specified url.
    @comment: This function uses singleton from to ensure that a run-time exception is thrown if there
    is more than one extension on the given resource with the specified url.
    */
    define function ModifierExtension(domainResource DomainResource, url String):
      singleton from ModifierExtensions(domainResource, url)

    /*
    @description: Returns any modifier extensions defined on the given element with the specified url.
    @comment: NOTE: Extensions are not the preferred approach, but are used as a way to access
    content that is defined by extensions but not yet surfaced in the CQL model info.
    */
    define function ModifierExtensions(element BackboneElement, url String):
      element.modifierExtension E
    	  where E.url = url
    		return E

    /*
    @description: Returns the single modifier extension (if present) on the given element with the specified url.
    @comment: This function uses singleton from to ensure that a run-time exception is thrown if there
    is more than one extension on the given resource with the specified url.
    */
    define function ModifierExtension(element BackboneElement, url String):
      singleton from ModifierExtensions(element, url)

    /*
    @description: Returns any base-FHIR extensions defined on the given resource with the specified id.
    @comment: NOTE: Extensions are not the preferred approach, but are used as a way to access
    content that is defined by extensions but not yet surfaced in the CQL model info.
    */
    define function BaseExtensions(domainResource DomainResource, id String):
      domainResource.extension E
    	  where E.url = ('http://hl7.org/fhir/StructureDefinition/' + id)
    		return E

    /*
    @description: Returns the single base-FHIR extension (if present) on the given resource with the specified id.
    @comment: This function uses singleton from to ensure that a run-time exception is thrown if there
    is more than one extension on the given resource with the specified url.
    */
    define function BaseExtension(domainResource DomainResource, id String):
      singleton from BaseExtensions(domainResource, id)

    /*
    @description: Returns any base-FHIR extensions defined on the given element with the specified id.
    @comment: NOTE: Extensions are not the preferred approach, but are used as a way to access
    content that is defined by extensions but not yet surfaced in the CQL model info.
    */
    define function BaseExtensions(element Element, id String):
      element.extension E
    	  where E.url = ('http://hl7.org/fhir/StructureDefinition/' + id)
    		return E

    /*
    @description: Returns the single base-FHIR extension (if present) on the given element with the specified id.
    @comment: This function uses singleton from to ensure that a run-time exception is thrown if there
    is more than one extension on the given resource with the specified url.
    */
    define function BaseExtension(element Element, id String):
      singleton from BaseExtensions(element, id)

    /*
    @description: Returns any base-FHIR modifier extensions defined on the given resource with the specified id.
    @comment: NOTE: Extensions are not the preferred approach, but are used as a way to access
    content that is defined by extensions but not yet surfaced in the CQL model info.
    */
    define function BaseModifierExtensions(domainResource DomainResource, id String):
      domainResource.modifierExtension E
    	  where E.url = ('http://hl7.org/fhir/StructureDefinition/' + id)
    		return E

    /*
    @description: Returns the single base-FHIR modifier extension (if present) on the given resource with the specified id.
    @comment: This function uses singleton from to ensure that a run-time exception is thrown if there
    is more than one extension on the given resource with the specified url.
    */
    define function BaseModifierExtension(domainResource DomainResource, id String):
      singleton from BaseModifierExtensions(domainResource, id)

    /*
    @description: Returns any base-FHIR modifier extensions defined on the given element with the specified id.
    @comment: NOTE: Extensions are not the preferred approach, but are used as a way to access
    content that is defined by extensions but not yet surfaced in the CQL model info.
    */
    define function BaseModifierExtensions(element BackboneElement, id String):
      element.modifierExtension E
    	  where E.url = ('http://hl7.org/fhir/StructureDefinition/' + id)
    		return E

    /*
    @description: Returns the single base-FHIR extension (if present) on the given element with the specified id.
    @comment: This function uses singleton from to ensure that a run-time exception is thrown if there
    is more than one extension on the given resource with the specified url.
    */
    define function BaseModifierExtension(element BackboneElement, id String):
      singleton from BaseModifierExtensions(element, id)

`Content not shown - (``application/elm+xml`, size = 212Kb )

`Content not shown - (``application/elm+json`, size = 404Kb )