maintenance: title: SCH_STATIN_MEDICATION_ALERTS;; mlmname: SCH_STATIN_MEDICATION_ALERTS;; arden: version 2.5;; version: 6.10;; institution: St Clair;; author: Juliet M. Johns, Allscripts Corp;; specialist: Juliet M. Johns;; date: 2015-03-09;; validation: testing;; library: purpose: Statin Medication Alerts ;; explanation: MLM will read user dictionary table and display alerts based on statin medication conflicts. Change history 03.09.2015 JML CSR 33124: Created. 12.10.2015 JML Moved to Production. 09.30.2019 TMS Updated alert to require reason when alert presented to user not in physician/physician extender group. CSR 37977 ;; keywords: Statin Medication Alert ;; knowledge: type: data-driven;; data: // Specify which .NET assemblies need to be loaded for ObjectsPlus standard_libs := MLM {{{SINGLE-QUOTE}}}std_include_libs{{{SINGLE-QUOTE}}}; include standard_libs; error_occurred := false; error_message := ""; str_parse := mlm {{{SINGLE-QUOTE}}}UTIL_STRING_PARSE{{{SINGLE-QUOTE}}}; log_execution_info := false; //Set the text for this variable to indicate whether to send the message or not send_alert := "DoNotSend"; //-------------------------------------------------------------------- if called_by_editor then EvokingObject := read last {Order: THIS where Name="Amlodipine 10mg Tab" }; endif; SP := " "; CR := 13 formatted with "%c"; LF := 10 formatted with "%c"; CRLF:= CR||LF; TAB := 9 formatted with "%c"; messageA := SP; messageB := SP; messageC := SP; ordered_statin := false; rule_matches := false; do_alert := false; found_unsubmitted_meds := false; msg_string := ""; alert_msg_lst := (); //Declare the MLM that creates action on alert object create_aoa_object := MLM {{{SINGLE-QUOTE}}}STD_Func_Create_Alert_Action_Object{{{SINGLE-QUOTE}}}; aoa_ActionItemStatus := ""; aoa_ActionItemID := ""; aoa_ActionItemName := ""; aoa_ActionEnterpriseItemID := ""; aa_lst := (); statin_conflict_list := ("A|simvastatin|80|mg|=|||||", "B|simvastatin|20|mg|>|amiodarone|mg||", "B|simvastatin|20|mg|>|amiodarone|ml/hr||", "B|simvastatin|20|mg|>|amlodipine|mg||", "B|simvastatin|20|mg|>|amlodipine/benazepril|cap||", "B|simvastatin|20|mg|>|ranolazine|mg||", "B|simvastatin|10|mg|>|verapamil|mg||", "B|simvastatin|10|mg|>|diltiazem|mg/hr||", "B|simvastatin|10|mg|>|diltiazem|mL||", "B|simvastatin|10|mg|>|diltiazem|mg||", "B|simvastatin|10|mg|>|dronedarone|mg||", "B|simvastatin|40|mg|>|ticagrelor|mg||", "B|simvastatin|40|mg|>|niaspan|mg|2000|>", "B|simvastatin|40|mg|>|niacin|mg|2000|>", "B|lovastatin|40|mg|>|amiodarone|mg|", "B|lovastatin|40|mg|>|amiodarone|ml/hr|", "B|lovastatin|40|mg|>|niaspan|mg|2000|>", "B|lovastatin|40|mg|>|niacin|mg|2000|>", "B|lovastatin|40|mg|>|ticagrelor|mg||", "B|lovastatin|20|mg|>|cyclosporine|mg||", "B|lovastatin|20|mg|>|diltiazem|ml/hr||", "B|lovastatin|20|mg|>|diltiazem|mL||", "B|lovastatin|20|mg|>|diltiazem|mg||", "B|lovastatin|20|mg|>|verapamil|mg||", "B|lovastatin|20|mg|>|gemfibrozil|mg||", "B|rosuvastatin|10|mg|>|gemfibrozil|mg||", "C|rosuvastatin|5|mg|>|cyclosporine|mg||", "C|fluvastatin|20|mg|>|cyclosporine|mg||", "C|pravastatin|20|mg|>|cyclosporine|mg||", "C|atorvastatin|20|mg|>|clarithromycin|mg||", "C|pravastatin|40|mg|>|clarithromycin|mg||"); statin_order_enter := event { OrderEnter User Order: where TypeCode = "Medication"}; /* Get the current user{{{SINGLE-QUOTE}}}s occupation*/ (user_id,userguid) :=read last {UserInfo: idcode, guid}; UserCode, OrderRole := read last {"Select occupationcode, orderroletype " ||" From cv3user with (nolock) " ||" Where Guid = " || SQL(userguid) }; fire_on_UserCPOE := ("MD","DO","DDS","DPM","PA","PA-C","CRNP","IT"); If usercode in fire_on_UserCPOE then alert_settings := ""; UDDD_dictionary_name := ""; UDDD_is_restricted := FALSE; else alert_settings := "Must Comment"; UDDD_dictionary_name := "AlertAckComment"; UDDD_is_restricted := TRUE; endif; statin_alert_dest := destination {alert} with [alert_type := "Warning", short_message := "Statin Medication Alert", priority := "Low", scope := "Chart", rule_group := "Statin Meds", rule_number := 4055, send_with_order := send_alert, alert_dialog_settings := alert_settings, ack_comment_UDDD := UDDD_dictionary_name, ack_comment_UDDD_is_restricted := UDDD_is_restricted, display_alert := true]; //Retrieve values from Evoking Object (ClientGUID, ChartGUID, VisitGUID, evoking_OrderName, evoking_OrderGUID, evoking_SignificantDtm, CatalogItemObj, orderedUOMValue, orderedDoseValue) := read last { Order : ClientGUID, ChartGUID, ClientVisitGUID, Name, GUID, SignificantDtm, OrderCatalogMasterItem, UOM, DosageLow REFERENCING EvokingObject }; (CatalogClassTypeValueObj, evoking_OrderCatalogMasterItemGUID) := read last {OrderCatalogMasterItem: CatalogClassTypeValue, GUID REFERENCING CatalogItemObj}; //Retrieve initial medications involve in the statin custom user list ClassTypeValue_code_list, ClassTypeValue_value_list := read {CatalogClassTypeValue: Code, Value REFERENCING CatalogClassTypeValueObj where code = "PRX_StatinMedications"}; //Parse the medications involved in the statin custom user list classvaluelist := call str_parse with ClassTypeValue_value_list[1],","; classvalue := classvaluelist[1]; //Does ordered medication exist in the medications user list if ( classvalue is not null ) then //Is ordered medication (i.e. classvalue) a statin? if ( classvalue matches pattern "%statin%" ) then //Set boolean that user is trying to order a statin med ordered_statin := true; //Handle special Simvastatin 80mg case here if ( classvalue = "simvastatin" AND orderedDoseValue = "80") then rule_matches := true; endif; //Get list of unsubmitted orders that conflict with statin med (unsub_med_list, unsub_med_dose, unsub_med_UOM, unsub_oGUID, unsub_oCatGUID) := READ { Unsubmitted Order : Name, DosageLow, UOM, GUID, OrderCatalogMasterItemGUID WHERE ( ( NAME matches pattern "Amiodarone%" AND (UOM = "mg" OR UOM = "ml/hr")) OR (NAME matches pattern "Amlodipine%" AND UOM = "mg") OR ( NAME matches pattern "Amlodipine%" AND UOM = "cap") OR (NAME matches pattern "Clarithromycin%" AND UOM = "mg") OR (NAME matches pattern "Cyclosporine%" AND UOM = "mg") OR (NAME matches pattern "Diltiazem%" AND UOM = "mg/hr") OR ( NAME matches pattern "Diltiazem%" AND UOM = "mL") OR ( NAME matches pattern "Diltiazem%" AND UOM = "mg") OR (NAME matches pattern "Dronedarone%" AND UOM = "mg") OR (NAME matches pattern "Gemfibrozil%" AND UOM = "mg") OR (NAME matches pattern "Niaspan%" AND UOM = "mg") OR (NAME matches pattern "Niacin%" AND UOM = "mg") OR (NAME matches pattern "Ranolazine%" AND UOM = "mg") OR (NAME matches pattern "Ticagrelor%" AND UOM = "mg") OR (NAME matches pattern "Verapamil%" AND UOM = "mg") )}; if ( exists unsub_med_list ) then found_unsubmitted_meds := true; rule_matches := true; else //Get a list of relevant existing medications that conflict with statin med (existing_meds_list, existing_meds_name, existing_meds_dose, existing_meds_UOM, existing_order_guid, existing_oCat_guid) := read {"SELECT LEFT(o.Name, (CHARINDEX({{{SINGLE-QUOTE}}} {{{SINGLE-QUOTE}}}, o.NAME, 1) - 1)), o.Name, ot.OrderDosageLow, ot.OrderUom, o.GUID, o.OrderCatalogMasterItemGUID" || " FROM CV3ClientVisit cv WITH (NOLOCK) JOIN CV3Order o WITH (NOLOCK)" || " ON cv.ClientGUID = o.ClientGUID" || " AND cv.GUID = o.ClientVisitGUID" || " AND cv.ChartGUID = o.ChartGUID" || " JOIN CV3OrderAddnlInfo oai WITH (NOLOCK)" || " ON o.GUID = oai.GUID" || " JOIN CV3OrderTask ot WITH (NOLOCK)" || " ON o.GUID = ot.OrderGUID" || " WHERE cv.ClientGUID = " || SQL(EvokingObject.ClientGUID) || " AND cv.GUID = " || SQL(EvokingObject.ClientVisitGUID) || " AND cv.ChartGUID = " || SQL(EvokingObject.ChartGUID) || " AND ((o.Name LIKE {{{SINGLE-QUOTE}}}Amiodarone%{{{SINGLE-QUOTE}}} AND (ot.OrderUOM = {{{SINGLE-QUOTE}}}mg{{{SINGLE-QUOTE}}} OR ot.OrderUom = {{{SINGLE-QUOTE}}}ml/hr{{{SINGLE-QUOTE}}}))" || " OR (o.Name like {{{SINGLE-QUOTE}}}amlodipine%{{{SINGLE-QUOTE}}} AND ot.OrderUom = {{{SINGLE-QUOTE}}}mg{{{SINGLE-QUOTE}}})" || " OR (o.Name LIKE {{{SINGLE-QUOTE}}}ranolazine%{{{SINGLE-QUOTE}}} AND ot.OrderUom = {{{SINGLE-QUOTE}}}mg{{{SINGLE-QUOTE}}})" || " OR (o.Name LIKE {{{SINGLE-QUOTE}}}verapamil%{{{SINGLE-QUOTE}}} AND ot.OrderUom = {{{SINGLE-QUOTE}}}mg{{{SINGLE-QUOTE}}})" || " OR (o.Name LIKE {{{SINGLE-QUOTE}}}diltiazem%{{{SINGLE-QUOTE}}} AND ot.OrderUom = {{{SINGLE-QUOTE}}}mg/hr{{{SINGLE-QUOTE}}})" || " OR (o.Name LIKE {{{SINGLE-QUOTE}}}diltiazem%{{{SINGLE-QUOTE}}} AND ot.OrderUom = {{{SINGLE-QUOTE}}}mL{{{SINGLE-QUOTE}}})" || " OR ( o.Name LIKE {{{SINGLE-QUOTE}}}diltiazem%{{{SINGLE-QUOTE}}} AND ot.OrderUOM = {{{SINGLE-QUOTE}}}mg{{{SINGLE-QUOTE}}})" || " OR (o.Name LIKE {{{SINGLE-QUOTE}}}dronedarone%{{{SINGLE-QUOTE}}} AND ot.OrderUom = {{{SINGLE-QUOTE}}}mg{{{SINGLE-QUOTE}}})" || " OR (o.Name LIKE {{{SINGLE-QUOTE}}}ticagrelor%{{{SINGLE-QUOTE}}} AND ot.OrderUom = {{{SINGLE-QUOTE}}}mg{{{SINGLE-QUOTE}}})" || " OR (o.Name LIKE {{{SINGLE-QUOTE}}}niaspan%{{{SINGLE-QUOTE}}} AND ot.OrderUom = {{{SINGLE-QUOTE}}}mg{{{SINGLE-QUOTE}}})" || " OR (o.Name LIKE {{{SINGLE-QUOTE}}}niacin%{{{SINGLE-QUOTE}}} AND ot.OrderUOM = {{{SINGLE-QUOTE}}}mg{{{SINGLE-QUOTE}}})" || " OR (o.Name LIKE {{{SINGLE-QUOTE}}}cyclosporine%{{{SINGLE-QUOTE}}} AND ot.OrderUom = {{{SINGLE-QUOTE}}}mg{{{SINGLE-QUOTE}}})" || " OR (o.Name LIKE {{{SINGLE-QUOTE}}}gemfibrozil%{{{SINGLE-QUOTE}}} AND ot.OrderUom = {{{SINGLE-QUOTE}}}mg{{{SINGLE-QUOTE}}})" || " OR (o.Name LIKE {{{SINGLE-QUOTE}}}clarithromycin%{{{SINGLE-QUOTE}}} AND ot.OrderUom = {{{SINGLE-QUOTE}}}mg{{{SINGLE-QUOTE}}}))" || " AND ((o.OrderStatusLevelNum > 15" || " AND o.OrderStatusLevelNum NOT IN ({{{SINGLE-QUOTE}}}69{{{SINGLE-QUOTE}}}, {{{SINGLE-QUOTE}}}70{{{SINGLE-QUOTE}}},{{{SINGLE-QUOTE}}}100{{{SINGLE-QUOTE}}}))" || " OR o.OrderStatusCode = {{{SINGLE-QUOTE}}}HOLD{{{SINGLE-QUOTE}}})"}; if ( exists existing_meds_list ) then rule_matches := true; endif; endif; else //Ordered med was not a statin med //Look for an unsubmitted order for a statin med (unsub_statin_list, unsub_statin_dose, unsub_statin_UOM, unsub_statin_oGUID, unsub_statin_oCatGUID) := READ { Unsubmitted Order : Name, DosageLow, UOM, GUID, OrderCatalogMasterItemGUID WHERE ( ( NAME matches pattern "Atorvastatin%" AND UOM = "mg") OR (NAME matches pattern "Fluvastatin%" AND UOM = "mg") OR (NAME matches pattern "Lovastatin%" AND UOM = "mg") OR (NAME matches pattern "Pravastatin%" AND UOM = "mg") OR (NAME matches pattern "Rosuvastatin%" AND UOM = "mg") OR (NAME matches pattern "Simvastatin%" AND UOM = "mg")) }; if ( exists unsub_statin_list ) then found_unsubmitted_meds := true; rule_matches := true; else //Look for an existing med order for a statin on patient{{{SINGLE-QUOTE}}}s chart (existing_statin_list, existing_statin_med, existing_statin_dose, existing_statin_UOM, existing_statin_oGUID, existing_statin_oCatGUID) := read {"SELECT LEFT(o.Name, (CHARINDEX({{{SINGLE-QUOTE}}} {{{SINGLE-QUOTE}}}, o.NAME, 1) - 1)), o.Name, ot.OrderDosageLow, ot.OrderUom, o.GUID, o.OrderCatalogMasterItemGUID" || " FROM CV3ClientVisit cv WITH (NOLOCK) JOIN CV3Order o WITH (NOLOCK)" || " ON cv.ClientGUID = o.ClientGUID" || " AND cv.GUID = o.ClientVisitGUID" || " AND cv.ChartGUID = o.ChartGUID" || " JOIN CV3OrderAddnlInfo oai WITH (NOLOCK)" || " ON o.GUID = oai.GUID" || " JOIN CV3OrderTask ot WITH (NOLOCK)" || " ON o.GUID = ot.OrderGUID" || " WHERE cv.ClientGUID = " || SQL(EvokingObject.ClientGUID) || " AND cv.GUID = " || SQL(EvokingObject.ClientVisitGUID) || " AND cv.ChartGUID = " || SQL(EvokingObject.ChartGUID) || " AND ((o.Name LIKE {{{SINGLE-QUOTE}}}simvastatin%{{{SINGLE-QUOTE}}} AND ot.OrderUOM = {{{SINGLE-QUOTE}}}mg{{{SINGLE-QUOTE}}})" || " OR (o.Name like {{{SINGLE-QUOTE}}}lovastatin%{{{SINGLE-QUOTE}}} AND ot.OrderUom = {{{SINGLE-QUOTE}}}mg{{{SINGLE-QUOTE}}})" || " OR (o.Name LIKE {{{SINGLE-QUOTE}}}rosuvastatin%{{{SINGLE-QUOTE}}} AND ot.OrderUom = {{{SINGLE-QUOTE}}}mg{{{SINGLE-QUOTE}}})" || " OR (o.Name LIKE {{{SINGLE-QUOTE}}}fluvastatin%{{{SINGLE-QUOTE}}} AND ot.OrderUom = {{{SINGLE-QUOTE}}}mg{{{SINGLE-QUOTE}}})" || " OR (o.Name LIKE {{{SINGLE-QUOTE}}}pravastatin%{{{SINGLE-QUOTE}}} AND ot.OrderUom = {{{SINGLE-QUOTE}}}mg{{{SINGLE-QUOTE}}})" || " OR (o.Name LIKE {{{SINGLE-QUOTE}}}atorvastatin%{{{SINGLE-QUOTE}}} AND ot.OrderUom = {{{SINGLE-QUOTE}}}mg{{{SINGLE-QUOTE}}}))" || " AND ((o.OrderStatusLevelNum > 15" || " AND o.OrderStatusLevelNum NOT IN ({{{SINGLE-QUOTE}}}69{{{SINGLE-QUOTE}}}, {{{SINGLE-QUOTE}}}70{{{SINGLE-QUOTE}}},{{{SINGLE-QUOTE}}}100{{{SINGLE-QUOTE}}}))" || " OR o.OrderStatusCode = {{{SINGLE-QUOTE}}}HOLD{{{SINGLE-QUOTE}}})"}; if ( exists existing_statin_list ) then rule_matches := true; endif; endif; //End unsubmitted order found endif; // End classvalue = statin med if ( rule_matches ) then //Loop through statin conflict rules list to determine if / where conflict exists for i in ( 1 seqto ( count statin_conflict_list ) ) do statin_rule := call str_parse with statin_conflict_list[i],"|"; rule_class_type := statin_rule[1]; //Class Type rule_med := statin_rule[2]; //Statin Medication rule_dose := statin_rule[3]; //Statin Dose rule_uom := statin_rule[4]; //Statin UOM rule_op := statin_rule[5]; //Operation for statin dose rule_conflict := statin_rule[6]; //Med that conflicts with statin rule_conflict_uom := statin_rule[7]; //Med UOM that conflicts with statin rule_conflict_dose := statin_rule[8]; //Med dose that conflicts with statin rule_conflict_op := statin_rule[9]; //Med operation that conflicts with statin //Did we order a statin med? if ( ordered_statin ) then //Does the ordered med = the appropriate rule? if ( rule_med = classvalue ) then if ( rule_op = ">" ) then //Does the ordered dose match the rule based on operator? rule_matches := ( (orderedDoseValue as number) > (rule_dose as number) ); rule_matches := ( rule_matches AND ( (orderedUOMValue as string) = (rule_uom as string) ) ); elseif ( rule_op = "=" ) then rule_matches := ( ( orderedDoseValue as number ) = ( rule_dose as number ) ); rule_matches := ( rule_matches AND ( ( orderedUOMValue as string ) = ( rule_uom as string ) ) ); else rule_matches := false; endif; //End rule_op check //Ordered statin med matches a rule if ( rule_matches ) then //Handling special case for Simvastatin 80mg if ( ( rule_conflict is null ) OR ( rule_conflict = "") )then do_alert := true; msg_string := "{{+B}}{{+R}}Simvastatin 80mg{{-R}}{{-B}} is limited to patients that have been taking this dose for " || "{{+B}}greater than 12 months{{-B}} without evidence of myopathy and are not currently taking or beginning" || " to take another drug that interacts with simvastatin."; alert_msg_lst := alert_msg_lst, msg_string; //Do we have unsubmitted meds? elseif ( found_unsubmitted_meds ) then //Conflict med in unsub list? for k in ( 1 seqto count unsub_med_list ) do //Check for compound drug check_for_hash := FIND "/" IN STRING unsub_med_list[k] STARTING AT 1; if ( ( check_for_hash as number ) <> 0 ) then fnd_space_1 := FIND " " IN STRING unsub_med_list[k] STARTING AT 1; compound_drug_1 := SUBSTRING (( fnd_space_1 as number ) - 1) CHARACTERS STARTING AT 1 FROM unsub_med_list[k]; //Amlodipine srch_drug_2 := SUBSTRING ( LENGTH unsub_med_list[k] - ( check_for_hash as number ) ) CHARACTERS STARTING AT ( ( check_for_hash as number ) + 1 ) FROM unsub_med_list[k]; fnd_space_2 := FIND " " IN STRING srch_drug_2 STARTING AT 1; compound_drug_2 := SUBSTRING ( ( fnd_space_2 AS number ) - 1 ) CHARACTERS STARTING AT 1 FROM srch_drug_2; compound_drug := compound_drug_1 || "/" || compound_drug_2; found := FIND LOWERCASE rule_conflict IN STRING LOWERCASE compound_drug STARTING AT 1; else found := FIND LOWERCASE rule_conflict IN STRING LOWERCASE unsub_med_list[k] STARTING AT 1; endif; if ( ( found as number ) <> 0 ) then if ( rule_conflict_uom = unsub_med_uom[k] ) then //Handling niaspan > 2000mg if ( rule_conflict_dose = "" ) then do_alert := true; else if ( rule_conflict_op = ">" ) then do_alert := ( (unsub_med_dose[k] as number) > (rule_conflict_dose as number) ); else do_alert := false; endif; endif; if ( do_alert ) then msg_string := "When using {{+B}}{{+R}}" || rule_med || "{{-R}}{{-B}} and {{+B}}{{+R}}" || rule_conflict || "{{-R}}{{-B}} together, "; if ( rule_class_type = "B" ) then msg_string := msg_string || "{{+B}}{{+R}}" || rule_med || "{{-B}}{{-R}} should not exceed {{+B}}{{+R}}" || rule_dose || rule_uom || "{{-R}}{{-B}} due to decreased metabolism and increased risk of toxicity."; elseif ( rule_class_type = "C" ) then msg_string := msg_string || " do not exceed {{+B}}{{+R}}" || rule_med || " " || rule_dose || rule_uom || "{{-R}}{{-B}}."; endif; alert_msg_lst := alert_msg_lst, msg_string; alert_action := call create_aoa_object WITH "CV3Order", "CV3Order"; alert_action.EvokingEnterpriseItemID := evoking_OrderCatalogMasterItemGUID; alert_action.EvokingObjectID := evoking_OrderGUID; alert_action.ObjectName := evoking_OrderName; alert_action.ActionItemStatus := "Unsubmitted"; alert_action.ActionEvent := "DC-Cancel"; alert_action.ActionItemID := unsub_oGUID[k]; alert_action.ActionItemName := unsub_med_list[k]; alert_action.ActionEnterpriseItemID := unsub_oCatGUID[k]; alert_action.MLMName := "SCH_STATIN_MEDICATION_ALERTS"; alert_action.ShortMessage := "This is the UNSUBMITTED Medication to DC-Cancel. This medication conflicts with the Statin medication you are trying to order."; aa_lst := aa_lst, alert_action; endif; endif; endif; enddo; else //Conflict med in existing meds list? if ( rule_conflict IN existing_meds_list AND rule_conflict_uom IN existing_meds_uom ) then for j in ( 1 seqto count existing_meds_list ) do if ( rule_conflict = existing_meds_list[j] ) then if ( rule_conflict_dose = "" ) then do_alert := true; else if ( rule_conflict_op = ">" ) then do_alert := ( ( existing_meds_dose[j] as number ) > ( rule_conflict_dose as number ) ); else do_alert := false; endif; endif; if ( do_alert ) then msg_string := "When using {{+B}}{{+R}}" || rule_med || "{{-R}}{{-B}} and {{+B}}{{+R}}" || rule_conflict || "{{-R}}{{-B}} together, "; if ( rule_class_type = "B" ) then msg_string := msg_string || "{{+B}}{{+R}}" || rule_med || "{{-B}}{{-R}} should not exceed {{+B}}{{+R}}" || rule_dose || rule_uom || "{{-R}}{{-B}} due to decreased metabolism and increased risk of toxicity."; elseif ( rule_class_type = "C" ) then msg_string := msg_string || " do not exceed {{+B}}{{+R}}" || rule_med || " " || rule_dose || rule_uom || "{{-R}}{{-B}}."; endif; alert_msg_lst := alert_msg_lst, msg_string; alert_action := call create_aoa_object WITH "CV3Order", "CV3Order"; alert_action.EvokingEnterpriseItemID := evoking_OrderCatalogMasterItemGUID; alert_action.EvokingObjectID := evoking_OrderGUID; alert_action.ObjectName := evoking_OrderName; alert_action.ActionItemStatus := "Existing"; alert_action.ActionEvent := "DC-Cancel"; alert_action.ActionItemID := existing_order_guid[j]; alert_action.ItemName := existing_meds_name[j]; alert_action.ActionEnterpriseItemID := existing_oCat_guid[j]; alert_action.MLMName := "SCH_STATIN_MEDICATION_ALERTS"; alert_action.ShortMessage := "This is the EXISTING Medication to DC-Cancel. This medication conflicts with the Statin medication you are trying to order."; aa_lst := aa_lst, alert_action; endif; endif; enddo; endif; endif; endif; endif; //End rule_med = classvalue //Ordered med not a statin, but a conflicting med else if ( rule_conflict = classvalue AND rule_conflict_uom = orderedUOMValue ) then if ( found_unsubmitted_meds ) then for m IN ( 1 seqto count unsub_statin_list ) do found := FIND LOWERCASE rule_med IN STRING LOWERCASE unsub_statin_list[m] STARTING AT 1; if ( ( found as number ) <> 0 ) then //Check our operator if ( rule_op = ">" ) then rule_matches := ( ( unsub_statin_dose[m] as number ) > ( rule_dose as number ) ); rule_matches := ( rule_matches AND ( ( unsub_statin_uom[m] as string ) = ( rule_uom as string ) ) ); else rule_matches := false; endif; if ( rule_matches ) then if ( rule_conflict_dose = "") then do_alert := true; else if ( rule_conflict_op = ">" ) then do_alert := ( ( orderedDoseValue as number ) > ( rule_conflict_dose as number ) ); else do_alert := false; endif; endif; if ( do_alert ) then msg_string := "When using {{+B}}{{+R}}" || rule_med || "{{-R}}{{-B}} and {{+B}}{{+R}}" || rule_conflict || "{{-R}}{{-B}} together, "; if ( rule_class_type = "B" ) then msg_string := msg_string || "{{+B}}{{+R}}" || rule_med || "{{-R}}{{-B}} should not exceed {{+B}}{{+R}}" || rule_dose || rule_uom || "{{-R}}{{-B}} due to decreased metabolism and increased risk of toxicity."; elseif ( rule_class_type = "C" ) then msg_string := msg_string || " do not exceed {{+B}}{{+R}}" || rule_med || " " || rule_dose || rule_uom || "{{-R}}{{-B}}."; endif; alert_msg_lst := alert_msg_lst, msg_string; alert_action := call create_aoa_object WITH "CV3Order", "CV3Order"; alert_action.EvokingEnterpriseItemID := evoking_OrderCatalogMasterItemGUID; alert_action.EvokingObjectID := evoking_OrderGUID; alert_action.ObjectName := evoking_OrderName; alert_action.ActionItemStatus := "Unsubmitted"; alert_action.ActionEvent := "DC-Cancel"; alert_action.ActionItemID := unsub_statin_oGUID[m]; alert_action.ActionItemName := unsub_statin_list[m]; alert_action.ActionEnterpriseItemID := unsub_statin_oCatGuid[m]; alert_action.MLMName := "SCH_STATIN_MEDICATION_ALERTS"; alert_action.ShortMessage := "This is the UNSUBMITTED statin medication to DC-Cancel. This statin medication conflicts with the medication that you are trying to order."; aa_lst := aa_lst, alert_action; endif; endif; endif; enddo; else if ( rule_med IN existing_statin_list ) then for l IN ( 1 seqto count existing_statin_list ) do //Check the operator if ( rule_op = ">" ) then rule_matches := ( ( existing_statin_dose[l] as number ) > ( rule_dose as number ) ); rule_matches := ( rule_matches AND ( ( existing_statin_uom[l] as string ) = ( rule_uom as string ) ) ); else rule_matches := false; endif; if ( rule_matches ) then if ( rule_conflict_dose = "" ) then do_alert := true; else if ( rule_conflict_op = ">" ) then do_alert := ( ( orderedDoseValue as number ) > ( rule_conflict_dose as number ) ); else do_alert := false; endif; endif; if ( do_alert )then msg_string := "When using {{+B}}{{+R}}" || rule_med || "{{-R}}{{-B}} and {{+B}}{{+R}}" || rule_conflict || "{{-R}}{{-B}} together, "; if ( rule_class_type = "B" ) then msg_string := msg_string || "{{+B}}{{+R}}" || rule_med || "{{-R}}{{-B}} should not exceed {{+B}}{{+R}}" || rule_dose || rule_uom || "{{-R}}{{-B}} due to decreased metabolism and increased risk of toxicity."; elseif ( rule_class_type = "C" ) then msg_string := msg_string || " do not exceed {{+B}}{{+R}}" || rule_med || " " || rule_dose || rule_uom || "{{-R}}{{-B}}."; endif; alert_msg_lst := alert_msg_lst, msg_string; alert_action := call create_aoa_object WITH "CV3Order", "CV3Order"; alert_action.EvokingEnterpriseItemID := evoking_OrderCatalogMasterItemGUID; alert_action.EvokingObjectID := evoking_OrderGUID; alert_action.EvokingObjectName := evoking_OrderName; alert_action.ActionItemStatus := "Existing"; alert_action.ActionEvent := "DC-Cancel"; alert_action.ActionItemID := existing_statin_oGUID[l]; alert_action.ActionItemName := existing_statin_med[l]; alert_action.ActionEnterpriseItemID := existing_statin_oCatGUID[l]; alert_action.MLMName := "SCH_STATIN_MEDICATION_ALERTS"; alert_action.ShortMessage := "This is the EXISTING statin medication to DC-Cancel. This statin medication conflicts with the medication that you are trying to order."; aa_lst := aa_lst, alert_action; endif; endif; enddo; endif; endif; endif; endif; //End ordered_statin enddo; endif; //End rule matches = true endif; // End classvalue is not null ;; priority: 50 ;; evoke: statin_order_enter; ;; logic: conclude do_alert; ;; action: if ( do_alert = true ) then final_msg := ""; for i IN ( 1 seqto count alert_msg_lst ) do if ( final_msg = "" ) then final_msg := alert_msg_lst[i]; else final_msg := final_msg || "\n\n" || alert_msg_lst[i]; endif; enddo; write final_msg at statin_alert_dest; attach aa_lst to statin_alert_dest; endif; ;; Urgency: 50;; end: