| Library Name |
Name |
| UseofHighRiskMedicationsintheElderlyFHIR |
More than One Antipsychotic Order |
|
define "More than One Antipsychotic Order":
exists ( "More Than One Order"([MedicationRequest: "Antipsychotic"]) )
|
| Library Name |
Name |
| UseofHighRiskMedicationsintheElderlyFHIR |
Antipsychotic Index Prescription Start Date |
|
define "Antipsychotic Index Prescription Start Date":
First((Status."Active or Completed Medication Request"([MedicationRequest: "Antipsychotic"])) AntipsychoticMedication
where AntipsychoticMedication.authoredOn during "Measurement Period"
return AntipsychoticMedication.authoredOn
sort asc
)
|
| Library Name |
Name |
| UseofHighRiskMedicationsintheElderlyFHIR |
More than One Benzodiazepine Order |
|
define "More than One Benzodiazepine Order":
exists ( "More Than One Order"([MedicationRequest: "Benzodiazepine"]) )
|
| Library Name |
Name |
| UseofHighRiskMedicationsintheElderlyFHIR |
Benzodiazepine Index Prescription Start Date |
|
define "Benzodiazepine Index Prescription Start Date":
First((Status."Active or Completed Medication Request"([MedicationRequest: "Benzodiazepine"])) BenzodiazepineMedication
where BenzodiazepineMedication.authoredOn during "Measurement Period"
return BenzodiazepineMedication.authoredOn
sort asc
)
|
| Library Name |
Name |
| UseofHighRiskMedicationsintheElderlyFHIR |
Numerator 2 |
|
define "Numerator 2":
( "More than One Antipsychotic Order"
and ( not exists ( ( [Condition: "Schizophrenia"]
union [Condition: "Bipolar Disorder"] ) AntipsychoticTreatedDiagnoses
where QICoreCommon."ToPrevalenceInterval" ( AntipsychoticTreatedDiagnoses ) overlaps Interval[start of "Measurement Period" - 1 year, "Antipsychotic Index Prescription Start Date"]
)
)
)
or ( "More than One Benzodiazepine Order"
and ( not exists ( ( [Condition: "Seizure Disorder"]
union [Condition: "REM Sleep Behavior Disorder"]
union [Condition: "Benzodiazepine Withdrawal"]
union [Condition: "Alcohol Withdrawal"]
union [Condition: "Generalized Anxiety Disorder"] ) BenzodiazepineTreatedDiagnoses
where QICoreCommon."ToPrevalenceInterval" ( BenzodiazepineTreatedDiagnoses ) overlaps Interval[start of "Measurement Period" - 1 year, "Benzodiazepine Index Prescription Start Date"]
)
)
)
|
| Library Name |
Name |
| UseofHighRiskMedicationsintheElderlyFHIR |
Same High Risk Medications Ordered on Different Days |
|
define "Same High Risk Medications Ordered on Different Days":
"More Than One Order"(["MedicationRequest": "Anticholinergics, first generation antihistamines"])
union "More Than One Order"(["MedicationRequest": "Anticholinergics, anti Parkinson agents"])
union "More Than One Order"(["MedicationRequest": "Antispasmodics"])
union "More Than One Order"(["MedicationRequest": "Antithrombotic"])
union "More Than One Order"(["MedicationRequest": "Cardiovascular, alpha agonists, central"])
union "More Than One Order"(["MedicationRequest": "Cardiovascular, other"])
union "More Than One Order"(["MedicationRequest": "Central nervous system, antidepressants"])
union "More Than One Order"(["MedicationRequest": "Central nervous system, barbiturates"])
union "More Than One Order"(["MedicationRequest": "Central nervous system, vasodilators"])
union "More Than One Order"(["MedicationRequest": "Central nervous system, other"])
union "More Than One Order"(["MedicationRequest": "Endocrine system, estrogens with or without progestins"])
union "More Than One Order"(["MedicationRequest": "Endocrine system, sulfonylureas, long duration"])
union "More Than One Order"(["MedicationRequest": "Endocrine system, other"])
union "More Than One Order"(["MedicationRequest": "Nonbenzodiazepine hypnotics"])
union "More Than One Order"(["MedicationRequest": "Pain medications, skeletal muscle relaxants"])
union "More Than One Order"(["MedicationRequest": "Pain medications, other"])
|
| Library Name |
Name |
| UseofHighRiskMedicationsintheElderlyFHIR |
Two High Risk Medications with Prolonged Duration |
|
define "Two High Risk Medications with Prolonged Duration":
Sum(("More Than One Order"([MedicationRequest: "Anti Infectives, other"])) AntiInfectives
let DaysSupply: AntiInfectives.MedicationRequestPeriodInDays()
return all DaysSupply
) > 90
|
| Library Name |
Name |
| UseofHighRiskMedicationsintheElderlyFHIR |
High Risk Medications with Average Daily Dose Criteria |
|
define "High Risk Medications with Average Daily Dose Criteria":
exists ( "More Than One Order"([MedicationRequest: "Reserpine"] ReserpineOrdered
where "Average Daily Dose"(ReserpineOrdered) > 0.1 'mg/d'
)
)
or exists ( "More Than One Order"([MedicationRequest: "Digoxin"] DigoxinOrdered
where "Average Daily Dose"(DigoxinOrdered) > 0.125 'mg/d'
)
)
or exists ( "More Than One Order"([MedicationRequest: "Doxepin"] DoxepinOrdered
where "Average Daily Dose"(DoxepinOrdered) > 6 'mg/d'
)
)
|
| Library Name |
Name |
| UseofHighRiskMedicationsintheElderlyFHIR |
Numerator 1 |
|
define "Numerator 1":
exists ( "Same High Risk Medications Ordered on Different Days" )
or ( "Two High Risk Medications with Prolonged Duration" )
or ( "High Risk Medications with Average Daily Dose Criteria" )
|
| Library Name |
Name |
| UseofHighRiskMedicationsintheElderlyFHIR |
Numerator 3 |
|
define "Numerator 3":
"Numerator 2"
or ( "Numerator 1"
and not "Numerator 2"
)
|
| Library Name |
Name |
| UseofHighRiskMedicationsintheElderlyFHIR |
Qualifying Encounters |
|
define "Qualifying Encounters":
( ["Encounter": "Office Visit"]
union ["Encounter": "Ophthalmologic Services"]
union ["Encounter": "Preventive Care Services Established Office Visit, 18 and Up"]
union ["Encounter": "Discharge Services Nursing Facility"]
union ["Encounter": "Nursing Facility Visit"]
union ["Encounter": "Care Services in Long Term Residential Facility"]
union ["Encounter": "Preventive Care Services Initial Office Visit, 18 and Up"]
union ["Encounter": "Annual Wellness Visit"]
union ["Encounter": "Home Healthcare Services"]
union ["Encounter": "Telephone Visits"]
union ["Encounter": "Online Assessments"]
union ( [Encounter] E
where exists ( ( E.type ) T
where T ~ "Office or other outpatient visit for the evaluation and management of an established patient, that may not require the presence of a physician or other qualified health care professional. Usually, the presenting problem(s) are minimal."
)
) ) ValidEncounters
where ValidEncounters.period during "Measurement Period"
|
| Library Name |
Name |
| UseofHighRiskMedicationsintheElderlyFHIR |
Initial Population |
|
define "Initial Population":
AgeInYearsAt(date from
end of "Measurement Period"
) >= 65
and exists ( "Qualifying Encounters" )
|
| Library Name |
Name |
| UseofHighRiskMedicationsintheElderlyFHIR |
Denominator |
|
define "Denominator":
"Initial Population"
|
| Library Name |
Name |
| Hospice |
Has Hospice Services |
|
define "Has Hospice Services":
exists ((([Encounter: "Encounter Inpatient"]).isEncounterPerformed()) InpatientEncounter
where (InpatientEncounter.hospitalization.dischargeDisposition ~ "Discharge to home for hospice care (procedure)"
or InpatientEncounter.hospitalization.dischargeDisposition ~ "Discharge to healthcare facility for hospice care (procedure)"
)
and InpatientEncounter.period.toInterval() ends during day of "Measurement Period"
)
or exists ((([Encounter: "Hospice Encounter"]).isEncounterPerformed()) HospiceEncounter
where HospiceEncounter.period.toInterval() overlaps day of "Measurement Period"
)
or exists ((([Observation: "Hospice care [Minimum Data Set]"]).isAssessmentPerformed()) HospiceAssessment
where HospiceAssessment.value ~ "Yes (qualifier value)"
and HospiceAssessment.effective.toInterval() overlaps day of "Measurement Period"
)
or exists ((([ServiceRequest: "Hospice Care Ambulatory"]).isInterventionOrder()) HospiceOrder
where HospiceOrder.authoredOn.toInterval() during day of "Measurement Period"
)
or exists ((([Procedure: "Hospice Care Ambulatory"]).isInterventionPerformed()) HospicePerformed
where HospicePerformed.performed.toInterval() overlaps day of "Measurement Period"
)
or exists (([Condition: "Hospice Diagnosis"]) HospiceCareDiagnosis
where HospiceCareDiagnosis.prevalenceInterval() overlaps day of "Measurement Period"
)
|
| Library Name |
Name |
| PalliativeCare |
Has Palliative Care in the Measurement Period |
|
define "Has Palliative Care in the Measurement Period":
exists ((([Observation: "Functional Assessment of Chronic Illness Therapy - Palliative Care Questionnaire (FACIT-Pal)"]).isAssessmentPerformed()) PalliativeAssessment
where PalliativeAssessment.effective.toInterval() overlaps day of "Measurement Period"
)
or exists ([Condition: "Palliative Care Diagnosis"] PalliativeDiagnosis
where PalliativeDiagnosis.prevalenceInterval() overlaps day of "Measurement Period"
)
or exists ((([Encounter: "Palliative Care Encounter"]).isEncounterPerformed()) PalliativeEncounter
where PalliativeEncounter.period.toInterval() overlaps day of "Measurement Period"
)
or exists ((([Procedure: "Palliative Care Intervention"]).isInterventionPerformed()) PalliativeIntervention
where PalliativeIntervention.performed.toInterval() overlaps day of "Measurement Period"
)
|
| Library Name |
Name |
| UseofHighRiskMedicationsintheElderlyFHIR |
Denominator Exclusions |
|
define "Denominator Exclusions":
Hospice."Has Hospice Services"
or PalliativeCare."Has Palliative Care in the Measurement Period"
|
| Library Name |
Name |
| UseofHighRiskMedicationsintheElderlyFHIR |
More Than One Order |
|
//Functions
define function "More Than One Order"(Medication List<"MedicationRequest">):
( Status."Active or Completed Medication Request" ( "Medication" ) ) OrderMedication1
with ( Status."Active or Completed Medication Request" ( "Medication" ) ) OrderMedication2
such that ( OrderMedication1.authoredOn during "Measurement Period"
and OrderMedication1.dispenseRequest.numberOfRepeatsAllowed >= 1
)
or ( date from OrderMedication1.authoredOn !~ date from OrderMedication2.authoredOn
and OrderMedication1.authoredOn during "Measurement Period"
and OrderMedication2.authoredOn during "Measurement Period"
)
or ( date from OrderMedication1.authoredOn ~ date from OrderMedication2.authoredOn
and OrderMedication1.authoredOn during "Measurement Period"
and date from start of CMD."MedicationRequestPeriod" ( OrderMedication1 ) !~ date from start of CMD."MedicationRequestPeriod" ( OrderMedication2 )
and start of CMD."MedicationRequestPeriod" ( OrderMedication1 ) during "Measurement Period"
and start of CMD."MedicationRequestPeriod" ( OrderMedication2 ) during "Measurement Period"
)
return OrderMedication1
|
| Library Name |
Name |
| Status |
Active or Completed Medication Request |
|
//Medication, Order: active and completed only
define function "Active or Completed Medication Request"(MedicationRequest List<MedicationRequest>):
MedicationRequest M
where M.status in { 'active', 'completed' }
and M.intent = 'order'
|
| Library Name |
Name |
| CumulativeMedicationDuration |
MedicationRequestPeriod |
|
/*
Now that we have a ToDaily function, we can approach calculation of the
duration of medication for an order. First, consider the definitions
for each element:
* 1 and only 1 dosageInstruction
* 1 and only 1 doseAndRate
* 1 timing with 1 repeat
* frequency, frequencyMax, defaulting to 1
* period, periodUnit, defaulting to 1 'd'
* doseQuantity or doseRange
* timeOfDay
* authoredOn: The date the prescription was written
* dispenseRequest.validityPeriod: Time period supply is authorized for
* dispenseRequest.quantity: amount of medication supplied per dispense
* dispenseRequest.numberOfRepeatsAllowed: number of refills authorized
* dispenseRequest.expectedSupplyDuration: number of days supply per dispense
* dosageInstruction.timing.repeat.boundsDuration: total duration of the repeat
* dosageInstruction.timing.repeat.boundsRange: range of durations of the repeat
* dosageInstruction.timing.repeat.boundsPeriod: period bounds of the repeat
* dosageInstruction.timing.repeat.count: number of times to repeat
* dosageInstruction.timing.repeat.countMax: maximum number of times to repeat
* dosageInstruction.timing.repeat.frequency: event occurs frequency times per period
* dosageInstruction.timing.repeat.frequencyMax: event occurs up to frequencyMax times per period
* dosageInstruction.timing.repeat.period: event occurs frequency times per period
* dosageInstruction.timing.repeat.periodMax: upper limit of period
* dosageInstruction.timing.repeat.periodUnit: period duration (s | min | h | d | wk | mo | a)
* dosageInstruction.timing.repeat.timeOfDay: time of day for the event (0..*)
* dosageInstruction.timing.repeat.when: event timing (HS | WAKE | C | CM | CD | CV | AC | ACM...)
* dosageInstruction.timing.code: BID | TID | QID | AM | PM | QD | QOD...
* dosageInstruction.asNeeded
* dosageInstruction.doseAndRate.doseQuantity
* dosageInstruction.doseAndRate.doseRange
If expectedSupplyDuration is present, then the duration is
expectedSupplyDuration * (1 + numberOfRepeatsAllowed)
If expectedSupplyDuration is not present, then it must be calculated based on the quantity, dosage, and frequency:
(quantity / (dosage * frequency)) * (1 + numberOfRepeatsAllowed)
dosage: Coalesce(end of doseAndRate.doseRange, doseAndRate.doseQuantity)
frequency: Coalesce(frequencyMax, frequency)
period: Quantity(period, periodUnit)
If expectedSupplyDuration is not present and cannot be calculated, and the boundsPeriod is present (and completely specified), we can use that directly
dosage.timing.repeat.boundsPeriod
This calculation results in a number of days, which can then be turned into a period by anchoring that to the
start of the validityPeriod or the authoredOn:
Interval[earliestDispensable, earliestDispensable + expectedSupplyDuration - 1]
earliestDispensable: Coalesce(start of validityPeriod, authoredOn)
The following function illustrates this completely:
*/
/*
Calculates the Medication Period for a single MedicationRequest.
MedicationRequest instances provided to this function are expected
to conform to the [MMEMedicationRequest](http://build.fhir.org/ig/cqframework/opioid-mme-r4/StructureDefinition-mmemedicationrequest.html)
profile, which expects:
* 1 and only 1 dosageInstruction, multiple dosageInstruction elements will result in an error
* 1 and only 1 doseAndRate, multiple doseAndRate elements will result in an error
* 1 timing with 1 repeat, missing timing or repeat elements will result in a null
* frequency, frequencyMax, defaulting to 1
* period, periodUnit, defaulting to 1 'd'
* timeOfDay
* doseQuantity or doseRange, missing doseQuantity and doseRange will result in a null
Note that MedicationRequest status is not considered by this calculation, as the
list of MedicationRequest instances provided to this function should already have
considered appropriate statuses, depending on the use case, typically `completed`.
*/
define function MedicationRequestPeriod(Request "MedicationRequest"):
Request R
let
dosage: singleton from R.dosageInstruction,
doseAndRate: singleton from dosage.doseAndRate,
timing: dosage.timing,
frequency: Coalesce(timing.repeat.frequencyMax, timing.repeat.frequency),
period: Quantity(timing.repeat.period, timing.repeat.periodUnit),
doseRange: doseAndRate.dose,
doseQuantity: doseAndRate.dose,
dose: Coalesce(end of doseRange, doseQuantity),
dosesPerDay: Coalesce(ToDaily(frequency, period), Count(timing.repeat.timeOfDay), 1.0),
boundsPeriod: timing.repeat.bounds as Interval<DateTime>,
daysSupply: (convert R.dispenseRequest.expectedSupplyDuration to days).value,
quantity: R.dispenseRequest.quantity,
refills: Coalesce(R.dispenseRequest.numberOfRepeatsAllowed, 0),
startDate:
Coalesce(
date from start of boundsPeriod,
date from R.authoredOn,
date from start of R.dispenseRequest.validityPeriod
),
totalDaysSupplied: Coalesce(daysSupply, quantity.value / (dose.value * dosesPerDay)) * (1 + refills)
return
if startDate is not null and totalDaysSupplied is not null then
Interval[startDate, startDate + Quantity(totalDaysSupplied - 1, 'day') ]
else if startDate is not null and boundsPeriod."high" is not null then
Interval[startDate, date from end of boundsPeriod]
else
null
|
| Library Name |
Name |
| CumulativeMedicationDuration |
Quantity |
|
/**********************************************************************/
/* Functions in this region are copied from opioid-mme-r4 */
/**********************************************************************/
define function Quantity(value Decimal, unit String):
if value is not null then
System.Quantity { value: value, unit: unit }
else
null
|
| Library Name |
Name |
| CumulativeMedicationDuration |
ToDaily |
|
/*
Goal is to get to number of days
Two broad approaches to the calculation:
1) Based on supply and frequency, calculate the number of expected days the medication will cover/has covered
2) Based on relevant period, determine a covered interval and calculate the length of that interval in days
This topic covers several use cases and illustrates how to calculate Cumulative
Medication Duration for each type of medication resource using the supply and
frequency approach.
*/
/*
For the first approach, we need to get from frequency to a frequency/day
So we define ToDaily
*/
/*
Calculates daily frequency given frequency within a period
*/
define function ToDaily(frequency System.Integer, period System.Quantity):
case period.unit
when 'h' then frequency * (24.0 / period.value)
when 'min' then frequency * (24.0 / period.value) * 60
when 's' then frequency * (24.0 / period.value) * 60 * 60
when 'd' then frequency * (24.0 / period.value) / 24
when 'wk' then frequency * (24.0 / period.value) / (24 * 7)
when 'mo' then frequency * (24.0 / period.value) / (24 * 30) /* assuming 30 days in month */
when 'a' then frequency * (24.0 / period.value) / (24 * 365) /* assuming 365 days in year */
when 'hour' then frequency * (24.0 / period.value)
when 'minute' then frequency * (24.0 / period.value) * 60
when 'second' then frequency * (24.0 / period.value) * 60 * 60
when 'day' then frequency * (24.0 / period.value) / 24
when 'week' then frequency * (24.0 / period.value) / (24 * 7)
when 'month' then frequency * (24.0 / period.value) / (24 * 30) /* assuming 30 days in month */
when 'year' then frequency * (24.0 / period.value) / (24 * 365) /* assuming 365 days in year */
when 'hours' then frequency * (24.0 / period.value)
when 'minutes' then frequency * (24.0 / period.value) * 60
when 'seconds' then frequency * (24.0 / period.value) * 60 * 60
when 'days' then frequency * (24.0 / period.value) / 24
when 'weeks' then frequency * (24.0 / period.value) / (24 * 7)
when 'months' then frequency * (24.0 / period.value) / (24 * 30) /* assuming 30 days in month */
when 'years' then frequency * (24.0 / period.value) / (24 * 365) /* assuming 365 days in year */
else Message(null, true, 'CMDLogic.ToDaily.UnknownUnit', ErrorLevel, 'Unknown unit ' & period.unit)
end
|
| Library Name |
Name |
| QICoreCommon |
ToPrevalenceInterval |
|
/*
@description: Returns an interval representing the normalized prevalence period of a given Condition.
@comment: Uses the ToInterval and ToAbatementInterval functions to determine the widest potential interval from
onset to abatement as specified in the given Condition. If the condition is active, the resulting interval will have
a closed ending boundary. If the condition is not active, the resulting interval will have an open ending boundary.
@deprecated: This function is deprecated. Use the `prevalenceInterval()` fluent function instead
*/
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))
|
| Library Name |
Name |
| UseofHighRiskMedicationsintheElderlyFHIR |
MedicationRequestPeriodInDays |
|
define fluent function MedicationRequestPeriodInDays(Request "MedicationRequest"):
Request R
let dosage: singleton from R.dosageInstruction,
doseAndRate: singleton from dosage.doseAndRate,
timing: dosage.timing,
frequency: Coalesce(timing.repeat.frequencyMax, timing.repeat.frequency),
period: CMD."Quantity" ( timing.repeat.period, timing.repeat.periodUnit ),
doseRange: doseAndRate.dose,
doseQuantity: doseAndRate.dose,
dose: Coalesce(
end of doseRange, doseQuantity
),
dosesPerDay: Coalesce((CMD."ToDaily"(frequency, period)), Count(timing.repeat.timeOfDay), 1.0),
boundsPeriod: timing.repeat.bounds as Interval<DateTime>,
daysSupply: ( convert R.dispenseRequest.expectedSupplyDuration to days ).value,
quantity: R.dispenseRequest.quantity,
refills: Coalesce(R.dispenseRequest.numberOfRepeatsAllowed, 0),
startDate: Coalesce(date from start of boundsPeriod, date from R.authoredOn, date from start of R.dispenseRequest.validityPeriod),
totalDaysSupplied: Coalesce(daysSupply, quantity.value /(dose.value * dosesPerDay)) * ( 1 + refills )
return totalDaysSupplied
|
| Library Name |
Name |
| UseofHighRiskMedicationsintheElderlyFHIR |
Average Daily Dose |
|
define function "Average Daily Dose"(MedicationRequest "MedicationRequest"):
MedicationRequest Order
let MedicationStrength: Order.getMedicationCode ( ).MedicationStrengthPerUnit ( ),
DaysSupplied: Order.MedicationRequestPeriodInDays ( )
return if DaysSupplied is not null
and ( MedicationStrength.unit = 'mg'
or ( MedicationStrength.unit = 'mg/mL'
and Order.dispenseRequest.quantity.unit = 'mL'
)
) then ( ( Order.dispenseRequest.quantity * MedicationStrength ) / Quantity { value: DaysSupplied, unit: 'd' } )
else null
|
| Library Name |
Name |
| UseofHighRiskMedicationsintheElderlyFHIR |
MedicationStrengthPerUnit |
|
define fluent function MedicationStrengthPerUnit(Strength Concept):
case
when Strength ~ "reserpine 0.1 MG Oral Tablet" then 0.1 'mg'
when Strength ~ "reserpine 0.25 MG Oral Tablet" then 0.25 'mg'
when Strength ~ "digoxin 0.05 MG/ML Oral Solution" then 0.05 'mg/mL'
when Strength ~ "digoxin 0.0625 MG Oral Tablet" then 0.0625 'mg'
when Strength ~ "1 ML digoxin 0.1 MG/ML Injection" then 0.1 'mg/mL'
when Strength ~ "digoxin 0.125 MG Oral Tablet" then 0.125 'mg'
when Strength ~ "digoxin 0.1875 MG Oral Tablet" then 0.1875 'mg'
when Strength ~ "digoxin 0.25 MG Oral Tablet" then 0.25 'mg'
when Strength ~ "2 ML digoxin 0.25 MG/ML Injection" then 0.25 'mg/mL'
when Strength ~ "doxepin 3 MG Oral Tablet" then 3 'mg'
when Strength ~ "doxepin 6 MG Oral Tablet" then 6 'mg'
when Strength ~ "doxepin hydrochloride 10 MG Oral Capsule" then 10 'mg'
when Strength ~ "doxepin hydrochloride 10 MG/ML Oral Solution" then 10 'mg/mL'
when Strength ~ "doxepin hydrochloride 25 MG Oral Capsule" then 25 'mg'
when Strength ~ "doxepin hydrochloride 50 MG Oral Capsule" then 50 'mg'
when Strength ~ "doxepin hydrochloride 75 MG Oral Capsule" then 75 'mg'
when Strength ~ "doxepin hydrochloride 100 MG Oral Capsule" then 100 'mg'
when Strength ~ "doxepin hydrochloride 150 MG Oral Capsule" then 150 'mg'
else null end
|
| Library Name |
Name |
| CQMCommon |
getMedicationCode |
|
/*
@description: Returns the medication code for the given MedicationRequest
*/
define fluent function getMedicationCode(request MedicationRequest ):
if request.medication is Concept then
request.medication as Concept
else
(singleton from ([Medication] M where M.id = (request.medication as Reference).reference.getId())).code
|
| Library Name |
Name |
| FHIRHelpers |
ToConcept |
|
/*
@description: Converts the given FHIR [CodeableConcept](https://hl7.org/fhir/datatypes.html#CodeableConcept) value to a CQL Concept.
*/
define function ToConcept(concept FHIR.CodeableConcept):
if concept is null then
null
else
System.Concept {
codes: concept.coding C return ToCode(C),
display: concept.text.value
}
|
| Library Name |
Name |
| Status |
isEncounterPerformed |
|
define fluent function isEncounterPerformed(Enc List<Encounter>):
Enc E
where E.status in {'finished', 'arrived', 'triaged', 'in-progress', 'onleave'}
|
| Library Name |
Name |
| QICoreCommon |
toInterval |
|
/*
@description: Normalizes a value that is a choice of timing-valued types to an equivalent interval
@comment: Normalizes a choice type of DateTime, Quanitty, Interval<DateTime>, or Interval<Quantity> 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 QICore, allowing this function to be used across any resource.
The input can be provided as a DateTime, Quantity, Interval<DateTime> or Interval<Quantity>.
The intent of this function is to provide a clear and concise mechanism to treat single
elements that have multiple possible representations as intervals so that logic doesn't have to account
for the variability. More complex calculations (such as medication request period or dispense period
calculation) need specific guidance and consideration. That guidance may make use of this function, but
the focus of this function is on single element calculations where the semantics are unambiguous.
If the input is a DateTime, the result a DateTime Interval beginning and ending on that DateTime.
If the input is a Quantity, the quantity is expected to be a calendar-duration interpreted as an Age,
and the result is a DateTime Interval beginning on the Date the patient turned that age and ending immediately before one year later.
If the input is a DateTime Interval, the result is the input.
If the input is a Quantity Interval, the quantities are expected to be calendar-durations interpreted as an Age, and the result
is a DateTime Interval beginning on the date the patient turned the age given as the start of the quantity interval, and ending
immediately before one year later than the date the patient turned the age given as the end of the quantity interval.
Any other input will reslt in a null DateTime Interval
*/
define fluent function toInterval(choice Choice<DateTime, Quantity, Interval<DateTime>, Interval<Quantity>>):
case
when choice is DateTime then
Interval[choice as DateTime, choice as DateTime]
when choice is Interval<DateTime> then
choice as Interval<DateTime>
when choice is Quantity then
Interval[Patient.birthDate + (choice as Quantity),
Patient.birthDate + (choice as Quantity) + 1 year)
when choice is Interval<Quantity> then
Interval[Patient.birthDate + (choice.low as Quantity),
Patient.birthDate + (choice.high as Quantity) + 1 year)
else
null as Interval<DateTime>
end
|
| Library Name |
Name |
| Status |
isAssessmentPerformed |
|
//Similar but different from QICoreCommon.isSurvey, which does not have status constraints
define fluent function isAssessmentPerformed(Obs List<Observation>):
Obs O
where O.status in { 'final', 'amended', 'corrected' }
and exists ( O.category ObservationCategory
where ( ObservationCategory ) ~ "survey"
)
|
| Library Name |
Name |
| Status |
isInterventionOrder |
|
define fluent function isInterventionOrder(ServiceRequest List<ServiceRequest>):
ServiceRequest S
where S.status in { 'active', 'completed' }
and S.intent = 'order'
|
| Library Name |
Name |
| Status |
isInterventionPerformed |
|
define fluent function isInterventionPerformed(Proc List<Procedure>):
Proc P
where P.status ~ 'completed'
|
| Library Name |
Name |
| QICoreCommon |
prevalenceInterval |
|
/*
@description: Returns an interval representing the normalized prevalence period of a given Condition.
@comment: Uses the ToInterval and ToAbatementInterval functions to determine the widest potential interval from
onset to abatement as specified in the given Condition. If the condition is active, the resulting interval will have
a closed ending boundary. If the condition is not active, the resulting interval will have an open ending boundary.
*/
define fluent function prevalenceInterval(condition Condition):
if condition.clinicalStatus ~ "active"
or condition.clinicalStatus ~ "recurrence"
or condition.clinicalStatus ~ "relapse" then
Interval[start of condition.onset.toInterval(), end of condition.abatementInterval()]
else
Interval[start of condition.onset.toInterval(), end of condition.abatementInterval())
|