maintenance:
title: Generate XML parameters to get dose range data;;
mlmname: STD_Func_Dosage_XML_Params;;
arden: version 2.5;;
version: 18.4;;
institution: Allscripts, Standard MLM;;
author: Allscripts Healthcare Solutions, Inc.;;
specialist: ;;
date: 2018-10-26;;
validation: testing;;
/* P r o p r i e t a r y N o t i c e */
/* Unpublished (c) 2013 - 2018 Allscripts Healthcare, LLC. and/or its affiliates. All Rights Reserved.
P r o p r i e t a r y N o t i c e: This software has been provided pursuant to a License Agreement, with
Allscripts Healthcare, LLC. and/or its affiliates, containing restrictions on its use. This software contains
valuable trade secrets and proprietary information of Allscripts Healthcare, LLC. and/or its affiliates and is
protected by trade secret and copyright law. This software may not be copied or distributed in any form or medium,
disclosed to any third parties, or used in any manner not provided for in said License Agreement except with prior
written authorization from Allscripts Healthcare, LLC. and/or its affiliates. Notice to U.S. Government Users:
This software is {{{SINGLE-QUOTE}}}Commercial Computer Software{{{SINGLE-QUOTE}}}.
All product names are the trademarks or registered trademarks of Allscripts Healthcare, LLC. and/or its affiliates.
*/
/* P r o p r i e t a r y N o t i c e */
library:
purpose: Generate XML input parameters for getting dose range data from
item-catalog or multum.
;;
explanation: This MLM assists the STD_Dosage MLM with dose-range checking.
It formats the input XML for the SCMGetItemCatDosageRangePr and
SCMMultumGrouperDosageRangePR.
;;
keywords: dosage range, multum, item catalog, order, prescription
;;
knowledge:
type: data-driven;;
data:
// Set to true if logging is needed.
log_execution_info := false;
(
// Common medication data
drc_grouper_id,
multum_dnum,
multum_mmdc,
order_med_route,
order_med_route_id,
is_generic_route,
order_med_significant_date,
order_med_units,
order_med_uom_id,
multum_freq_id,
med_order_type,
is_order,
// Patient data
patient_birthday_info_on_order,
has_valid_birthdate,
wt_kg,
BSA_number_rounded,
intl_patient_gender,
// Item Catalog only
for_item_catalog,
catalog_item_obj,
// Multum only
has_liver_disease_bit,
dialysis_type_str,
serum_creatinine,
// Flags and constants
alert_if_missing_flags,
patient_info,
core_uom_const
):= ARGUMENT;
Name_Value_Object := OBJECT [name, val];
// XML parameter
indent := " ";
indent1 := indent;
indent2 := indent || indent;
newline := "\n";
// Set the medication parameters
med_info_list := (
(new Name_Value_Object with "GrouperID", drc_grouper_id),
(new Name_Value_Object with "DNum", multum_dnum),
(new Name_Value_Object with "MMDC", multum_mmdc),
(new Name_Value_Object with "UOMID", order_med_uom_id),
(new Name_Value_Object with "RouteID", order_med_route_id),
(new Name_Value_Object with "FrequencyID", multum_freq_id)
);
if for_item_catalog and exists catalog_item_obj then
catalog_med_info_list := (
(new Name_Value_Object with "CatalogMasterItemGUID", catalog_item_obj.GUID),
(new Name_Value_Object with "UOM", order_med_units),
(new Name_Value_Object with "Route", order_med_route)
);
med_info_list := med_info_list, catalog_med_info_list;
endif;
med_params_xml :=
indent1 ||"" || newline;
// Patient Info
age_params_xml := "";
if has_valid_birthdate
then
age_unit_list := (
(new Name_Value_Object with core_uom_const.day_string, patient_birthday_info_on_order.age_day_value),
(new Name_Value_Object with core_uom_const.week_string, patient_birthday_info_on_order.age_week_value),
(new Name_Value_Object with core_uom_const.month_string, patient_birthday_info_on_order.age_month_value),
(new Name_Value_Object with core_uom_const.year_string, patient_birthday_info_on_order.age_year_value),
(new Name_Value_Object with core_uom_const.hour_string, patient_birthday_info_on_order.age_hour_value)
);
//[New born birth-time missing]: when new born < 4 days is missing birth time and >= 1 day, add AgeMin value to it
age_unit_min_list := ();
if patient_birthday_info_on_order.is_estimated_birthday = true and patient_birthday_info_on_order.age_day_value >= 1.0
then
age_unit_min_list := (
(new Name_Value_Object with core_uom_const.day_string, patient_birthday_info_on_order.age_day_min_value),
(new Name_Value_Object with core_uom_const.week_string, patient_birthday_info_on_order.age_week_min_value),
(new Name_Value_Object with core_uom_const.month_string, patient_birthday_info_on_order.age_month_min_value),
(new Name_Value_Object with core_uom_const.year_string, patient_birthday_info_on_order.age_year_min_value),
(new Name_Value_Object with core_uom_const.hour_string, patient_birthday_info_on_order.age_hour_min_value)
);
endif;
for unit_item_index in (1 seqto count age_unit_list)
do
// age_unit_list and the age_unit_min_list are in the same unit sequence
// day, week, month, year, hour
unit_item := age_unit_list[unit_item_index];
unit_min_item := age_unit_min_list[unit_item_index];
age_params_xml := age_params_xml ||
indent2 || "
age_params_xml := age_params_xml || "min_val={{{SINGLE-QUOTE}}}" || XMLEX(unit_min_item.val formatted with "%.16f") || "{{{SINGLE-QUOTE}}} ";
endif;
age_params_xml := age_params_xml || "/>" || newline;
enddo;
endif;
bsa_params_xml := "";
if BSA_number_rounded is number and BSA_number_rounded > 0
then
bsa_params_xml :=
indent2 || " " || newline;
endif;
weight_params_xml := "";
if wt_kg is number and wt_kg > 0
then
// Convert patient weight to grams
wt_gm:= wt_kg * 1000;
weight_lb_value := wt_gm/453.6; // pound
weight_ounce_value := wt_gm/28.35; // ounce
wt_unit_list:= (
(new Name_Value_Object with core_uom_const.gm_string, wt_gm),
(new Name_Value_Object with core_uom_const.ounce_string, weight_ounce_value),
(new Name_Value_Object with core_uom_const.lb_string, weight_lb_value),
(new Name_Value_Object with core_uom_const.kg_string, wt_kg)
);
for unit_item in wt_unit_list
do
weight_params_xml := weight_params_xml ||
indent2 || " " || newline;
enddo;
endif;
gender_params_xml := "";
if exists intl_patient_gender
then
gender_params_xml :=
indent1 || "" || newline;
endif;
//[New born birth-time missing]: add MissingBabyBirthTime
birth_time_missing_xml := "";
if patient_birthday_info_on_order.is_estimated_birthday = true
then
if patient_birthday_info_on_order.age_day_value >= 1.0
then
missing_baby_birthTime_value := 1;
else
missing_baby_birthTime_value := 2;
endif;
birth_time_missing_xml :=
indent1 || "" || newline;
endif;
liver_params_xml := "";
dialysis_params_xml := "";
creatinine_params_xml := "";
if not for_item_catalog
then
if exists has_liver_disease_bit
then
liver_params_xml :=
indent2 || "" || newline;
endif;
if exists dialysis_type_str
then
dialysis_params_xml :=
indent2 || "" || newline;
endif;
if exists serum_creatinine
then
creatinine_params_xml :=
indent2 || "" || newline;
endif;
endif;
patient_params_xml :=
indent1 ||"" || newline ||
age_params_xml ||
bsa_params_xml ||
weight_params_xml ||
gender_params_xml ||
birth_time_missing_xml ||
liver_params_xml ||
dialysis_params_xml ||
creatinine_params_xml ||
indent1 ||"" || newline;
get_dosage_for_missing_weight :=
( alert_if_missing_flags.patient_weight
and ( patient_info.Weight.is_missing or patient_info.Weight.not_current )
);
get_dosage_for_missing_BSA := get_dosage_for_missing_weight
or
( alert_if_missing_flags.patient_height
and ( patient_info.Height.is_missing or patient_info.Height.not_current )
);
is_gender_missing := Patient_info.Gender.is_missing or intl_patient_gender in ("U", "O");
get_dosage_for_missing_gender :=
( ( alert_if_missing_flags.patient_gender and is_gender_missing )
or ( alert_if_missing_flags.unmapped_gender and Patient_info.Gender.is_unmapped )
);
if (is_order)
then
missing_route := order_med_route is null;
missing_uom := order_med_units is null;
else
missing_route := order_med_route is null AND order_med_route_id is null;
missing_uom := order_med_units is null AND order_med_uom_id is null;
endif;
if (for_item_catalog)
then
// For item catalog, there is no "unmapped" concept
unmapped_route := false;
unmapped_uom := false;
else
unmapped_route := (not missing_route) and order_med_route_id is null;
unmapped_uom := (not missing_uom) and order_med_uom_id is null;
endif;
get_dosage_for_missing_route :=
( ( alert_if_missing_flags.route and missing_route )
or ( alert_if_missing_flags.unmapped_route and unmapped_route)
);
get_dosage_for_missing_uom :=
( ( alert_if_missing_flags.uom and missing_uom)
or ( alert_if_missing_flags.unmapped_uom and unmapped_uom )
);
get_dosage_for_missing_grouper :=
( alert_if_missing_flags.cannot_check_DNUM_Rx_to_Multum
and drc_grouper_id is null
and not is_order
and not for_item_catalog
);
// - Return other routes if the current route is unrecognized route
// and the cannot check unrecognized route flag is on
// - Return other routes if the current route is not an unrecognized route
// and the inapplicable route flag is on
get_dosage_for_route_match_not_found :=
( alert_if_missing_flags.cannot_check_generic_route
and is_generic_route
)
OR
( alert_if_missing_flags.inapplicable_route
and not is_generic_route
and not for_item_catalog
);
get_dosage_for_uom_conversion := alert_if_missing_flags.uom_conversion;
if for_item_catalog and not is_order
then
get_dosage_for_ic_dnum := alert_if_missing_flags.cannot_check_Rx_to_IC;
endif;
if not for_item_catalog and is_order
then
get_dosage_for_any_freq := (med_order_type = "Complex Order");
endif;
if for_item_catalog
then
get_dosage_for_missing_age := alert_if_missing_flags.patient_age and (not has_valid_birthdate);
endif;
missing_data_flags_list := (
(new Name_Value_Object with "ReturnDataForMissingWeight", get_dosage_for_missing_weight),
(new Name_Value_Object with "ReturnDataForMissingBSA", get_dosage_for_missing_BSA),
(new Name_Value_Object with "ReturnDataForMissingGender", get_dosage_for_missing_gender),
(new Name_Value_Object with "ReturnDataForMissingGrouperBasedOnDnum", get_dosage_for_missing_grouper),
(new Name_Value_Object with "ReturnDataForMissingRoute", get_dosage_for_missing_route),
(new Name_Value_Object with "ReturnDataForRouteMatchNotFound", get_dosage_for_route_match_not_found),
(new Name_Value_Object with "ReturnDataForMissingUOM", get_dosage_for_missing_uom),
(new Name_Value_Object with "ReturnDataForUomConversionIssue", get_dosage_for_uom_conversion),
(new Name_Value_Object with "ReturnDataByDnumWhenNoMatchFound", get_dosage_for_ic_dnum),
(new Name_Value_Object with "ReturnDailyDoseForAnyFreq", get_dosage_for_any_freq),
(new Name_Value_Object with "ReturnDataForMissingAge", get_dosage_for_missing_age)
);
missing_data_flag_name_val_xml := "";
for unit_item in missing_data_flags_list
do
if unit_item.val then bit_val := 1; else bit_val := 0; endif;
missing_data_flag_name_val_xml := missing_data_flag_name_val_xml ||
indent2 || unit_item.name || "={{{SINGLE-QUOTE}}}" || XMLEX(bit_val) || "{{{SINGLE-QUOTE}}}" || newline;
enddo;
missing_data_flags_xml :=
indent1 || "" || newline;
input_param_xml := "\n\n" ||
med_params_xml ||
patient_params_xml ||
missing_data_flags_xml ||
"" || newline;
debug_str_input_param_xml := SQL(input_param_xml);
;;
priority: 50
;;
evoke:
;;
logic:
/* Always conclude true to return variables to calling MLM */
CONCLUDE TRUE;
;;
action:
return (input_param_xml, missing_route, unmapped_route, missing_uom, unmapped_uom, uom_conversion_issue);
;;
Urgency: 50;;
end: