library ConversionFactors version '3.0.0'
using FHIR version '4.0.1'
include FHIRHelpers version '4.0.1'
codesystem "Usage Context Type": 'http://terminology.hl7.org/CodeSystem/usage-context-type'
codesystem "CDC MME Usage Context Codes": 'http://fhir.org/guides/cdc/opioid-mme-r4/CodeSystem/CDCMMEUsageContextCodes'
code "Task Usage Context": 'task' from "Usage Context Type"
code "MME Calculation": 'mme-calculation' from "CDC MME Usage Context Codes"
parameter ErrorLevel String default 'Trace'
parameter ConversionFactorSupplementName String
context Patient
define function GetConversionFactor(ingredientCode System.Code, dailyDose System.Quantity, doseFormCode System.Code, dosesPerDay System.Decimal):
Coalesce(
LookupConversionFactor(ingredientCode, dailyDose, doseFormCode, dosesPerDay),
case ToInteger(ingredientCode.code)
when 2670 then 0.15
when 4337 then (
case
when ToInteger(doseFormCode.code) = 316987 then (0.33333333 / dosesPerDay) * 7200
else Message(null, true, 'OMTKLogic.GetConversionFactor.UnknownDoseForm', ErrorLevel, 'Unknown dose form code ' & doseFormCode.code)
end
)
when 5489 then 1
when 3423 then 4
when 6813 then (
case
when dailyDose.value between 1 and 20 then 4
when dailyDose.value between 21 and 40 then 8
when dailyDose.value between 41 and 60 then 10
when dailyDose.value >= 61 then 12
when dailyDose is null or dailyDose.value is null then
Message(null, true, 'OMTKLogic.GetConversionFactor.DailyDoseNull', ErrorLevel, 'Daily dose is required to determine methadone conversion factor')
else Message(null, dailyDose.value < 1, 'OMTKLogic.GetConversionFactor.DailyDoseLessThanOne', ErrorLevel, 'Daily dose less than 1')
end
)
when 7052 then 1
when 7804 then 1.5
when 7814 then 3
else Message(null, true, 'OMTKLogic.GetConversionFactor.UnknownIngredientCode', ErrorLevel, 'Unknown ingredient code: ' & ingredientCode.code)
end
)
define ConversionFactorSupplement:
singleton from (
[CodeSystem] C
where C.supplements.value = 'http://www.nlm.nih.gov/research/umls/rxnorm'
and (
C.name.value = ConversionFactorSupplementName
or exists (
C.useContext UC
where UC.code ~ "Task Usage Context"
and UC.value ~ "MME Calculation"
)
)
)
define function ToRangeValue(value System.String):
if value = '*' then null else ToDecimal(value)
define function ToDoseRange(propertyValue FHIR.string):
({ : }) X
let rangeValues: Split(Split(propertyValue.value, ':')[0], '-')
return Interval[ToRangeValue(rangeValues[0]), ToRangeValue(rangeValues[1])]
define function ToDoseRangeConversionFactor(propertyValue FHIR.string):
ToDecimal(Split(propertyValue.value, ':')[1])
define function ToDoseForm(propertyValue FHIR.string):
Split(propertyValue.value, ':')[0]
define function ToDoseFormConversionFactor(propertyValue FHIR.string, dosesPerDay System.Decimal):
if PositionOf('@', propertyValue.value) > 0 then
ToDoseFormDosesPerDayConversionFactor(propertyValue, dosesPerDay)
else
ToDecimal(Split(propertyValue.value, ':')[1])
define function ToDoseFormDosesPerDayConversionFactor(propertyValue FHIR.string, dosesPerDay System.Decimal):
propertyValue P
let components: Split(P.value, '@')
return (ToDecimal(components[1]) / dosesPerDay) * ToDecimal(Split(components[0], ':')[1])
define function ToConversionFactor(propertyValue FHIR.decimal):
propertyValue.value
define function LookupConversionFactor(ingredientCode System.Code, dailyDose System.Quantity, doseFormCode System.Code, dosesPerDay System.Decimal):
ConversionFactorSupplement CFS
let
ingredientConcept: singleton from (CFS."concept" C where C.code.value = ingredientCode.code),
conversionFactor: singleton from (ingredientConcept.property P where P.code.value = 'conversion-factor'),
doseFormConversionFactors: (ingredientConcept.property P where P.code.value = 'dose-form-conversion-factor'),
doseRangeConversionFactors: (ingredientConcept.property P where P.code.value = 'dose-range-conversion-factor')
return
Coalesce
(
case
when exists (doseRangeConversionFactors) then
singleton from (
doseRangeConversionFactors DRCF
where dailyDose.value in ToDoseRange(DRCF.value)
return ToDoseRangeConversionFactor(DRCF.value)
)
when exists (doseFormConversionFactors) then
singleton from (
doseFormConversionFactors DFCF
where doseFormCode.code = ToDoseForm(DFCF.value)
return ToDoseFormConversionFactor(DFCF.value, dosesPerDay)
)
else null
end,
ToConversionFactor(conversionFactor.value)
)
|