| Library Name | Name | sequence |
| OpioidCDSREC01 |
Acute Pain Opioid Analgesic with Ambulatory Misuse Potential Prescriptions |
0 |
define "Acute Pain Opioid Analgesic with Ambulatory Misuse Potential Prescriptions":
( Common."Is Opioid Analgesic with Ambulatory Misuse Potential?"( ContextPrescriptions ) ) AmbulatoryOpioidPrescription
where Routines."Is Acute Pain Prescription?"( AmbulatoryOpioidPrescription )
| Library Name | Name | sequence |
| OpioidCDSREC01 |
Patient Is Being Prescribed Opioid Analgesic with Ambulatory Misuse Potential |
1 |
define "Patient Is Being Prescribed Opioid Analgesic with Ambulatory Misuse Potential":
exists( "Acute Pain Opioid Analgesic with Ambulatory Misuse Potential Prescriptions" )
| Library Name | Name | sequence |
| OpioidCDSCommonConfig |
Age Less than 18 Years Is Enabled |
2 |
// CDC 2022 General Inclusion Criteria
define "Age Less than 18 Years Is Enabled":
true
| Library Name | Name | sequence |
| OpioidCDSRoutines |
Patient Age Less Than 18 |
3 |
define "Patient Age Less Than 18":
if (Config."Age Less than 18 Years Is Enabled") then
AgeInYearsAt(Today()) < 18
else false
| Library Name | Name | sequence |
| OpioidCDSCommonConfig |
Sickle Cell Check Enabled |
4 |
// Sickle Cell
define "Sickle Cell Check Enabled":
true
| Library Name | Name | sequence |
| OpioidCDSCommonConfig |
Sickle Cell Assumed Active |
5 |
define "Sickle Cell Assumed Active":
true
| Library Name | Name | sequence |
| OpioidCDSCommon |
US Core-Categorized Conditions |
6 |
// 3. Medications indicating end of life
/* or exists (
"Medications Indicating End of Life"
) */
define "US Core-Categorized Conditions":
[Condition: category in "Encounter Diagnosis Condition Category"]
union [Condition: category in "Problem List Condition Category"]
union [Condition: category in "US Core Health Concern Condition Category"]
| Library Name | Name | sequence |
| OpioidCDSCommon |
Positive Sickle Cell Condition |
7 |
define "Positive Sickle Cell Condition":
if Config."Sickle Cell Check Enabled" and not Config."Sickle Cell Assumed Active"
then (
"US Core-Categorized Conditions" C
where C.code in "Sickle Cell Diseases"
and C.clinicalStatus in "Active Condition"
) else if Config."Sickle Cell Check Enabled" and Config."Sickle Cell Assumed Active"
then (
"US Core-Categorized Conditions" C
where C.code in "Sickle Cell Diseases"
)
else null
| Library Name | Name | sequence |
| OpioidCDSRoutines |
Condition Positive for Sickle Cell |
8 |
define "Condition Positive for Sickle Cell":
if (Config."Sickle Cell Check Enabled") then
exists(
Common."Positive Sickle Cell Condition"
)
else false
| Library Name | Name | sequence |
| OpioidCDSCommonConfig |
Active Cancer Treatment Encounters Condition Is Enabled |
9 |
// Active Cancer Treatment
define "Active Cancer Treatment Encounters Condition Is Enabled":
true
| Library Name | Name | sequence |
| OpioidCDSRoutines |
Encounter Period |
10 |
// End of Opioid Naive Routine
/*
** Routine #3
** Active Cancer Treatment Routine
**
** Definition | Answer to Proceed | Details | Data (Terminology) Requirement
** ---------------------------------------------------------------------------------------------------------------------------------
** Two office visits within the | No | Look for a minimum of two distinct | Office Visit
** past 12 months | | encounters within 12 months of the date |
** | | of the current visit for which each of the |
** | | following is true: |
** | | - the encounter diagnosis (primary or |
** | | secondary or co-morbidity diagnosis) |
** | | is listed in the CDC Malignant Cancer |
** | | Conditions value set |
** ---------------------------------------------------------------------------------------------------------------------------------
** Office visits with an | No | The encounter is performed by an | Oncology specialty
** oncology specialist | | oncologist as defined in the oncology | designations (NUCC)
** present | | specialty designations using the |
** | | National Uniform Claim Committee |
** | | (NUCC) classifications |
** ---------------------------------------------------------------------------------------------------------------------------------
** Office visits including CDC | No | The encounter diagnosis (primary or | CDC malignant cancer
** malignant cancer | | secondary or co-morbidity diagnosis) | conditions
** condition | | is listed in the CDC Malignant Cancer |
** | | Conditions value set |
** ----------------------------------------------------------------------------------------------------------------------------------
**
*/
define "Encounter Period":
Interval[Today() - 12 months, Today())
| Library Name | Name | sequence |
| OpioidCDSCommon |
USCore Encounter Cancer Diagnoses |
11 |
define "USCore Encounter Cancer Diagnoses":
[Condition: category in "Encounter Diagnosis Condition Category"] CancerDiagnoses
where CancerDiagnoses.code in "CDC malignant cancer conditions"
| Library Name | Name | sequence |
| OpioidCDSRoutines |
Encounters with Cancer Diagnosis During Encounter Period |
12 |
// encounter-diagnosis, problem-list and health-concern Conditions
// define "US Core-Categorized Cancer Diagnoses":
// Common."US Core-Categorized Conditions" C
// where C.code in Common."CDC malignant cancer conditions"
// define "Encounters with Cancer Diagnosis During Encounter Period":
// [Encounter] Encounter
// with "US Core-Categorized Cancer Diagnoses" CancerDiagnosis
// such that date from Encounter.period."start".value in day of "Encounter Period"
// and EndsWith(CancerDiagnosis.encounter.reference, Encounter.id)
define "Encounters with Cancer Diagnosis During Encounter Period":
[Encounter] Encounters
where date from Encounters.period."start" in day of "Encounter Period"
and exists (
Common."USCore Encounter Cancer Diagnoses" CancerDiagnoses
where EndsWith(CancerDiagnoses.encounter.reference, Encounters.id)
)
| Library Name | Name | sequence |
| OpioidCDSRoutines |
Number of Encounters with Cancer Diagnosis During Encounter Period |
13 |
define "Number of Encounters with Cancer Diagnosis During Encounter Period":
Count ("Encounters with Cancer Diagnosis During Encounter Period")
| Library Name | Name | sequence |
| OpioidCDSRoutines |
Has Two or More Encounters with Cancer Diagnosis During Encounter Period |
14 |
define "Has Two or More Encounters with Cancer Diagnosis During Encounter Period":
"Number of Encounters with Cancer Diagnosis During Encounter Period" >= 2
| Library Name | Name | sequence |
| OpioidCDSCommon |
USCore Problem List Cancer Diagnoses |
15 |
define "USCore Problem List Cancer Diagnoses":
[Condition: category in "Problem List Condition Category"] CancerDiagnoses
where CancerDiagnoses.code in "CDC malignant cancer conditions"
| Library Name | Name | sequence |
| OpioidCDSRoutines |
Has Active Cancer Diagnosis on Problem List |
16 |
define "Has Active Cancer Diagnosis on Problem List":
exists (
Common."USCore Problem List Cancer Diagnoses" CancerDiagnoses
where CancerDiagnoses.category in Common."Problem List Condition Category"
and exists(
CancerDiagnoses.clinicalStatus.coding ClinicalStatus
where ClinicalStatus.code ~ 'active'
)
)
| Library Name | Name | sequence |
| OpioidCDSRoutines |
Is Active Cancer Treatment? |
17 |
define "Is Active Cancer Treatment?":
if (Config."Active Cancer Treatment Encounters Condition Is Enabled")
then "Has Two or More Encounters with Cancer Diagnosis During Encounter Period"
or "Has Active Cancer Diagnosis on Problem List"
else false
| Library Name | Name | sequence |
| OpioidCDSCommonConfig |
End-Stage Disease Criteria Enabled |
18 |
// CDC 2022 General Inclusion Criteria
define "End-Stage Disease Criteria Enabled":
true
| Library Name | Name | sequence |
| OpioidCDSRoutines |
Conditions Likely Terminal for Opioid Prescribing |
19 |
define "Conditions Likely Terminal for Opioid Prescribing":
if (Config."End-Stage Disease Criteria Enabled") then
exists (
Common."US Core-Categorized Conditions" EOLC
where EOLC.code in Common."Conditions likely terminal for opioid prescribing"
// and EOLC.clinicalStatus in Common."Active Condition"
)
else false
| Library Name | Name | sequence |
| OpioidCDSRoutines |
CDC 2022 Guideline General Inclusion Criteria |
20 |
define "CDC 2022 Guideline General Inclusion Criteria":
not "Patient Age Less Than 18"
and not "Condition Positive for Sickle Cell"
and not "Is Active Cancer Treatment?"
and not "Conditions Likely Terminal for Opioid Prescribing"
| Library Name | Name | sequence |
| OpioidCDSCommonConfig |
Opioid Naive Prescription Condition Is Enabled |
21 |
// Opioid Naive
define "Opioid Naive Prescription Condition Is Enabled":
true
| Library Name | Name | sequence |
| OpioidCDSCommonConfig |
Can the implementing EHR support queries for past medications by date range? |
22 |
// Subroutine 2 - Past Medications
define "Can the implementing EHR support queries for past medications by date range?":
true
| Library Name | Name | sequence |
| OpioidCDSCommon |
Active Ambulatory Opioid Rx |
23 |
define "Active Ambulatory Opioid Rx":
if Config."Can the implementing EHR support queries for past medications by date range?" then
(
"Get MedicationRequest Medication as Code"("Get Active Ambulatory Medication Requests"([MedicationRequest]))
) Rx
where date from Rx.authoredOn 2 years or less on or before Today()
and Rx.medication in "Opioid analgesics with ambulatory misuse potential"
else
List<FHIR.MedicationRequest>{}
| Library Name | Name | sequence |
| OpioidCDSRoutines |
Prescription/Dispense Inclusion Period |
24 |
// End of CDC 2022 General Inclusion Criteria Routine
/*
** Routine #2
** Opioid Naive Routine
**
** Definition | Answer to Proceed | Details | Data (Terminology) Requirement
** ----------------------------------------------------------------------------------------------------------------------------------------
** Opioid analgesics with | No | Look for an existing prescription (order) for | Opioid analgesics with
** ambulatory misuse potential | | opioid that is in the value set for opioid with | ambulatory misuse potential
** prescription in past 90 days | | ambulatory abuse potential authored |
** excluding the previous 24 | | within the past 90 days (excluding previous 24 |
** hours | | hours) |
** ----------------------------------------------------------------------------------------------------------------------------------------
** Opioid analgesics with | No | Look for evidence of active medication on | Opioid analgesics with
** ambulatory misuse potential | | the medication list that is in the value set | ambulatory misuse potential
** reported in past 90 days | | for opioid with ambulatory care abuse |
** excluding previous 24 hours* | | potential |
** ----------------------------------------------------------------------------------------------------------------------------------------
** Opioid analgesics with | No | Look for evidence of a dispensing event for | Opioid analgesics with
** ambulatory misuse potential | | medication that is in the value set for opioid | ambulatory misuse potential
** dispensing event in past 90 | | with ambulatory use potential occurring |
** days excluding previous 24 | | within the past 90 days (excluding previous 24 |
** hours | | hours) |
** ----------------------------------------------------------------------------------------------------------------------------------------
** *Future consideration: Current algorithm addresses only orders (prescriptions).
**
** Note – orders use RxNorm, but medication lists and dispensed medication will
** require an NDC value set and/or local mapping of NDC to RxNorm to enable this element
**
*/
define "Prescription/Dispense Inclusion Period":
Interval[Now() - 90 days, Now() - 24 hours]
| Library Name | Name | sequence |
| OpioidCDSRoutines |
Opioid RX with Ambulatory Abuse Potential In Past 90 Days |
25 |
define "Opioid RX with Ambulatory Abuse Potential In Past 90 Days":
Common."Active Ambulatory Opioid Rx" Rx
where Rx.authoredOn during day of "Prescription/Dispense Inclusion Period"
| Library Name | Name | sequence |
| OpioidCDSRoutines |
Has Opioid RX with Ambulatory Abuse Potential In Past 90 Days |
26 |
define "Has Opioid RX with Ambulatory Abuse Potential In Past 90 Days":
if (Config."Opioid Naive Prescription Condition Is Enabled") then
exists ("Opioid RX with Ambulatory Abuse Potential In Past 90 Days")
else false
| Library Name | Name | sequence |
| OpioidCDSRoutines |
Opioid Dispense with Ambulatory Abuse Potential In Past 90 Days |
27 |
// NOTE: 2020-02-05: Review direction of MedicationStatement resource (US-Core focusing on MedicationRequest i/o Statement)
// NOTE: 2020-04-21: MedicationStatement a) Shouldn't be use since guidance/direction from USCore is targeting MedicationUse in R5, and b) Breaks in the publisher
/* define "Reports of Opioid with Ambulatory Care Abuse Potential Reported in Past 90 Days":
[MedicationStatement: Common."Opioid analgesics with ambulatory misuse potential"] Statement
where Statement.status in {'active', 'completed'}
and Statement.effective during day of "Report Inclusion Period" */
/* define "Has Report of Opioid with Ambulatory Care Abuse Potential Reported in Past 90 Days":
Config."Opioid Naive Report Condition Is Enabled"
and exists ("Reports of Opioid with Ambulatory Care Abuse Potential Reported in Past 90 Days") */
define "Opioid Dispense with Ambulatory Abuse Potential In Past 90 Days":
[MedicationDispense: Common."Opioid analgesics with ambulatory misuse potential"] OpioidDispense
where OpioidDispense.whenHandedOver during day of "Prescription/Dispense Inclusion Period"
and OpioidDispense.status = 'completed'
| Library Name | Name | sequence |
| OpioidCDSRoutines |
Has Opioid Dispense with Ambulatory Abuse Potential In Past 90 Days |
28 |
define "Has Opioid Dispense with Ambulatory Abuse Potential In Past 90 Days":
if (Config."Opioid Naive Prescription Condition Is Enabled") then
exists ("Opioid Dispense with Ambulatory Abuse Potential In Past 90 Days")
else false
| Library Name | Name | sequence |
| OpioidCDSRoutines |
Is Opioid Naive? |
29 |
// NOTE: MedicationStatement-dependent logic comment out due to bug in Publisher not supporting MedicationStatement in AllTypes.
define "Is Opioid Naive?":
not ("Has Opioid RX with Ambulatory Abuse Potential In Past 90 Days")
/* and not ("Has Report of Opioid with Ambulatory Care Abuse Potential Reported in Past 90 Days") */
and not ("Has Opioid Dispense with Ambulatory Abuse Potential In Past 90 Days")
| Library Name | Name | sequence |
| OpioidCDSREC01 |
Inclusion Criteria |
30 |
define "Inclusion Criteria":
"Patient Is Being Prescribed Opioid Analgesic with Ambulatory Misuse Potential"
and Routines."CDC 2022 Guideline General Inclusion Criteria"
and Routines."Is Opioid Naive?"
| Library Name | Name | sequence |
| OpioidCDSREC01 |
Exclusion Criteria |
31 |
define "Exclusion Criteria":
false
| Library Name | Name | sequence |
| OpioidCDSREC01 |
Is Recommendation Applicable? |
32 |
define "Is Recommendation Applicable?":
"Inclusion Criteria"
and not "Exclusion Criteria"
| Library Name | Name | sequence |
| OpioidCDSCommon |
Is Opioid Analgesic with Ambulatory Misuse Potential? |
33 |
define function "Is Opioid Analgesic with Ambulatory Misuse Potential?"(value List<MedicationRequest>):
("Get MedicationRequest Medication as Code"(value)) Rx
where Rx.medication in "Opioid analgesics with ambulatory misuse potential"
and Rx.category in "Community"
| Library Name | Name | sequence |
| OpioidCDSCommon |
Get MedicationRequest Medication as Code |
34 |
define function "Get MedicationRequest Medication as Code"(value List<MedicationRequest>):
value Rx
let Med:
if Rx.medication is Reference then singleton from (
[Medication] M
where M.id = (Last(Split((Rx.medication as FHIR.Reference).reference, '/')))
) else null
return
MedicationRequest {
id: Rx.id,
status: Rx.status,
intent: Rx.intent,
category: Rx.category,
medication: if Rx.medication is Reference then Med.code else Rx.medication as CodeableConcept,
subject: Rx.subject,
authoredOn: Rx.authoredOn,
recorder: Rx.recorder,
dosageInstruction: Rx.dosageInstruction,
dispenseRequest: Rx.dispenseRequest
}
| Library Name | Name | sequence |
| FHIRHelpers |
ToString |
35 |
define function ToString(value string): value.value
| Library Name | Name | sequence |
| FHIRHelpers |
ToConcept |
36 |
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 | sequence |
| FHIRHelpers |
ToCode |
37 |
define function ToCode(coding FHIR.Coding):
if coding is null then
null
else
System.Code {
code: coding.code.value,
system: coding.system.value,
version: coding.version.value,
display: coding.display.value
}
| Library Name | Name | sequence |
| OpioidCDSRoutines |
Is Acute Pain Prescription? |
38 |
// End of For Subacute or Chronic Pain Routine
/*
** Routine #5
** For Acute Pain Routine
**
** Definition | Answer to Proceed | Details | Data (Terminology) Requirement
** -----------------------------------------------------------------------------------------------------------------------------------
** Order for opioid analgesics | Yes | Look for an existing prescription (order) for | Opioid analgesics with
** with ambulatory misuse | | opioid analgesics with ambulatory abuse | ambulatory misuse potential
** potential of duration < 28 | | potential of duration < 28 days |
** days | | |
** -----------------------------------------------------------------------------------------------------------------------------------
**
*/
// should allow DateTime precision, but not working in the Ruler specifically
define function "Is Acute Pain Prescription?"(prescription FHIR.MedicationRequest):
prescription.dispenseRequest is not null
and prescription.dispenseRequest.expectedSupplyDuration is not null
and Common.GetDurationInDays( prescription.dispenseRequest.expectedSupplyDuration ) < 28 days
| Library Name | Name | sequence |
| OpioidCDSCommon |
GetDurationInDays |
39 |
define function GetDurationInDays(value FHIR.Duration):
if value is null then null
else
case
when value.code.value ~ 'a' then System.Quantity{ value: value.value.value * 365.0, unit: 'days' }
when value.code.value ~ 'mo' then System.Quantity{ value: value.value.value * 30.0, unit: 'days' }
when value.code.value ~ 'wk' then System.Quantity{ value: value.value.value * 7.0, unit: 'days' }
when value.code.value ~ 'd' then System.Quantity{ value: value.value.value, unit: 'days' }
when value.code.value ~ 'h' then System.Quantity{ value: value.value.value / 24.0, unit: 'days' }
when value.code.value ~ 'min' then System.Quantity{ value: value.value.value / 60.0 / 24.0, unit: 'days' }
when value.code.value ~ 's' then System.Quantity{ value: value.value.value / 60.0 / 60.0 / 24.0, unit: 'days' }
when value.code.value ~ 'ms' then System.Quantity{ value: value.value.value / 60.0 / 60.0 / 24.0 / 1000.0, unit: 'days' }
when value.code.value is null then Message(1000, true, 'Undefined', 'Error', 'Duration unit code is null')
else Message(1000, true, 'Undefined', 'Error', 'Unsupported duration unit code: ' + value.code.value)
end
| Library Name | Name | sequence |
| FHIRHelpers |
ToDateTime |
40 |
define function ToDateTime(value dateTime): value.value
| Library Name | Name | sequence |
| OpioidCDSCommon |
Get Active Ambulatory Medication Requests |
41 |
define function "Get Active Ambulatory Medication Requests" (value List<MedicationRequest>) returns List<MedicationRequest>:
value Rx
where Rx.status.value = 'active'
and Rx.category in "Community"
| Library Name | Name | sequence |
| FHIRHelpers |
ToString |
42 |
define function ToString(value MedicationDispenseStatus): value.value
|