maintenance: title: Executes the stored procedure that retrieves Multum dosage ranges from the database;; mlmname: STD_FUNC_DOSAGE_MULTUM;; 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: Finds the appropriate dose-range from the multum grouper dose ranges and returns the information to the calling MLM. ;; explanation: The MLM assists the STD_Func_Dosage_Rules MLM to retrieve Multum dosage ranges from the database that may be out of range ;; keywords: single dose; average daily dose; total daily dose; dosage range ;; knowledge: type: data-driven;; data: // include common data structures std_dosage_includes := MLM {{{SINGLE-QUOTE}}}std_func_dosage_includes{{{SINGLE-QUOTE}}}; include std_dosage_includes; ( drc_grouper_id, drug_name, 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, order_med_frequency, multum_freq_id, med_order_type, patient_birthday_info_on_order, wt_kg, BSA_value, intl_patient_gender, has_liver_disease_bit, dialysis_type_str, serum_creatinine, intentionally_unmapped_frequency_list, alert_if_missing_flags, is_order, patient_info, core_uom_const ) := ARGUMENT; // Set to true if logging is needed. log_execution_info := false; // Declare the MLMs that can be called xml_params := MLM {{{SINGLE-QUOTE}}}STD_Func_Dosage_XML_Params{{{SINGLE-QUOTE}}}; // Change the internal patient gender to XML if (intl_patient_gender = "O") then patient_gender := "U"; else patient_gender := intl_patient_gender; endif; // Need User GUID for security purposes //user_GUID := read last { UserInfo: GUID }; // fails under specflow user_GUID := read last { StateInfo: UserGUID }; // XML parameter ( input_param_xml, missing_route, unmapped_route, missing_uom, unmapped_uom ) := call xml_params with ( // 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, true, //has_valid_birthdate, wt_kg, BSA_value, patient_gender, // Item Catalog only false, //for_item_catalog null, //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 ); debug_db_str:="EXEC SCMMultumGrouperDosageRangePR " || SQL(input_param_xml) || ", " || SQL(user_GUID); if (exists drc_grouper_id or alert_if_missing_flags.cannot_check_DNUM_Rx_to_Multum) then // Call the stored procedure ( found_matching_case_list, dosage_type_list, case_id_list, grouper_id_list, route_id_list, route_list, contraindication_list, recommendation_list, actual_lower_dose_list, actual_upper_dose_list, actual_uom_id_list, actual_dose_uom_list, conversion_factor_list, actual_dose_freq_list, is_PER_WT_list, is_PER_M2_list, age_criteria_list, weight_criteria_list, gender_criteria_list, renal_criteria_list, creatinine_criteria_list, liver_criteria_list, condition_criteria_list, uom_conversion_issue_list, route_conversion_issue_list, frequency_issue_list, is_default_list, hard_stop_high_list, hard_stop_low_list, crcl_within_range_list, estimated_age_used_list ) := read { "EXEC SCMMultumGrouperDosageRangePR " || SQL(input_param_xml) || ", " || SQL(user_GUID) }; endif; ;; evoke: ;; logic: multum_dosage_range_list := (); if exists found_matching_case_list then row_count := count found_matching_case_list; list_indices := 1 seqto row_count; // Step through the multum results and create the dosage range list for ind in list_indices do dosage_range_item := new Dosage_Range_Object; multum_dosage_range_list := multum_dosage_range_list, dosage_range_item; dosage_range_item.med_name := drug_name; if found_matching_case_list[ind] = 1 or found_matching_case_list[ind] = true then dosage_range_item.match_found := true; else dosage_range_item.match_found := false; endif; if ((dosage_type_list[ind] = "daily dose range checking (metric)" ) or (dosage_type_list[ind] = "daily dose range checking (formulation)" )) then dosage_range_item.dosage_type := "total"; dosage_range_item.is_range := true; elseif ((dosage_type_list[ind] = "single dose range checking (metric)" ) or (dosage_type_list[ind] = "single dose range checking (formulation)" )) then dosage_range_item.dosage_type := "single"; dosage_range_item.is_range := true; else dosage_range_item.dosage_type := "contraindication"; dosage_range_item.is_range := false; endif; dosage_range_item.contraindication_msg := contraindication_list[ind]; dosage_range_item.recommendation_msg := recommendation_list[ind]; dosage_range_item.lower_dose := actual_lower_dose_list[ind]; dosage_range_item.upper_dose := actual_upper_dose_list[ind]; dosage_range_item.unit_of_measure := actual_dose_uom_list[ind]; dosage_range_item.age_criteria := age_criteria_list[ind]; dosage_range_item.weight_criteria := weight_criteria_list[ind]; dosage_range_item.gender_criteria := gender_criteria_list[ind]; dosage_range_item.renal_criteria := renal_criteria_list[ind]; dosage_range_item.creatinine_criteria := creatinine_criteria_list[ind]; dosage_range_item.liver_criteria := liver_criteria_list[ind]; dosage_range_item.condition_criteria := condition_criteria_list[ind]; dosage_range_item.is_PER_WT := is_PER_WT_list[ind]; dosage_range_item.is_PER_M2 := is_PER_M2_list[ind]; dosage_range_item.conversion_factor := conversion_factor_list[ind]; dosage_range_item.uom_conversion_issue := uom_conversion_issue_list[ind] in (1, true); dosage_range_item.crcl_within_range := crcl_within_range_list[ind] in (1, true); route_conversion_issue := route_conversion_issue_list[ind] in (1, true); if is_generic_route then dosage_range_item.unrecognized_route_conversion_issue := route_conversion_issue; else dosage_range_item.inapplicable_route_conversion_issue := route_conversion_issue; endif; // Dose range frequency dosage_range_item.dose_frequency := actual_dose_freq_list[ind]; if multum_freq_id is null then if ( order_med_frequency not in (intentionally_unmapped_frequency_list, null) and alert_if_missing_flags.unmapped_frequency ) then dosage_range_item.frequency_issue := "unmapped"; endif; else if frequency_issue_list[ind] in (1, true) then dosage_range_item.frequency_issue := "too frequent"; endif; endif; // multum data will always be "Dose Reg", as the denominator will be multiplied dosage_range_item.dose_calc_method := "Dose Reg"; dosage_range_item.corrected_uom := actual_dose_uom_list[ind]; dosage_range_item.is_multum := true; dosage_range_item.grouper_id := grouper_id_list[ind]; dosage_range_item.case_id := case_id_list[ind]; dosage_range_item.route := route_list[ind]; dosage_range_item.route_id := route_id_list[ind]; dosage_range_item.med_route := order_med_route; dosage_range_item.med_route_id := order_med_route_id; is_default := false; if (is_default_list[ind] = 1) then is_default := true; endif; dosage_range_item.is_default := is_default; dosage_range_item.hard_stop_high := hard_stop_high_list[ind]; dosage_range_item.hard_stop_low := hard_stop_low_list[ind]; dosage_range_item.estimated_age_used := estimated_age_used_list[ind]; enddo; uom_conversion_issue := any (uom_conversion_issue_list = 1); endif; /* Always conclude true to return variables to calling MLM */ CONCLUDE TRUE; ;; action: return (multum_dosage_range_list, missing_route, unmapped_route, missing_uom, unmapped_uom, uom_conversion_issue); ;; end: