maintenance: maintenance: title: Haloperidol IV Order on Monitored Bed Check;; mlmname: Form_Haloperidol_IV_Orders;; arden: version 2;; version: 5.50;; institution: St. Clair Hospital;; author: Teresa M. Spicuzza ;; specialist: Eclipsys Corporation;; date: 2012-05-23;; validation: testing;; library: purpose: Prohibit ordering of Haldol by IV Push or IVPB on a non-nmonitored unit unless being ordered for end of life care. . ;; explanation: This MLM will hard stop user from entering an order for Haldol by IV push or IVPB if patient is not on a monitored unit and not ordered for end of life care.. Change history 05.23.2012 TS Created CSR 30783 To Production on 9/25/2012 03.13.2015 TS Modified for new delirium protocol to enable ordering of IV Haldol if dose is less than 2mg. CSR 33144 03.18.2015 TS Modified alert messages to note "doses greater than 2 mg" CSR 33144 04.24.2015 TS Modified to inlcude monitoring admin message for IV administration of Haldol CSR 33144 05.07.2015 TS Modified to write monitoring admin message for IV administration of Haldol to a new data item to eliminate removing user typed instructions. Ticket 1730634 11.27.2018 TS CSR 37432 Modified for Post Anesthesia Orders - if haldol IV greater than 2mg is ordered alert user that the patient will need a monitored bed for 24 hours and create an order for Cardiac Monitor to be added to worksheet. ;; keywords: Haldol, Haloperidol, IV Push; ;; knowledge: type: data-driven;; data: // This MLM is passed three arguments, of types // communication_type, form_type and client info object respectively. standard_libs := mlm {{{SINGLE-QUOTE}}}std_include_libs{{{SINGLE-QUOTE}}}; include standard_libs; using "ObjectsPlusXA.SCM.Forms"; using namespace "ObjectsPlusXA.SunriseClinicalManager.Forms"; (this_communication, // Communication object this_form, // Form object client_info_obj // Arden ClientInfo object ) := argument; CallingEvent := this_communication.CallingEvent; CallingField :=this_communication.CallingFieldName; ClientGuid := this_communication.ClientGUID; ClientVisitGuid := this_communication.ClientVisitGUID; ChartGuid := this_communication.ChartGuid; Primary_object := this_communication.PrimaryObj; OrderSetName := Primary_Object.OrderSetName; // Assigns fields passed in the Form object to the Field object field_list:= this_form.fields; // Define fields for MLM use CR := 13 formatted with "%c"; LF := 10 formatted with "%c"; CRLF:= CR||LF; HaldolOrder := last of (field_list where field_list.DataItemName = "PRX_Generic_CB"); HaldolOrder_value := HaldolOrder.value; OrderRoute := last of (field_list where field_list.DataItemName = "OrderRouteCode"); OrderRoute_value := OrderRoute.value; Dose := last of (field_list where field_list.DataItemName = "DosageLow"); Dose_value := Dose.value; Indication := last of (field_list where field_list.DataItemName = "NUR_Nonchemical Restraint Ind"); Indication_value := Indication.value; AdminInst := last of (field_list where field_list.DataItemName = "PRX_NOTECOMMENT0"); CardMonInst := last of (field_list where field_list.DataItemName = "PRX_CardiacMonitorInst"); ReasonMessage := ""; CardMonMsg := "Follow Cardiac Monitoring Requirements for IV Haloperidol"; MonitoringMsg := "Cardiac Monitoring requirements for IV Haloperidol" || CRLF || "1. If Baseline QTc < 450 msec and the cumulative dose is < or = 2mg/24 hours then cardiac monitoring is NOT required." || CRLF || "2. If Baseline QTc < 450 msec and the cumulative dose exceeds 2 mg/24 hours then cardiac monitoring IS required." || CRLF || "3. If Baseline QTc is 450-499 msec then cardiac monitoring IS required." || CRLF || "4. If Baseline QTc is > = 500 msec then IV haloperidol should NOT be used." ; NoMsg := ""; CreateMonitorOrder := MLM {{{SINGLE-QUOTE}}}SCH_FUNC_CREATE_GENERAL_ORDER_ON_WORKSHEET{{{SINGLE-QUOTE}}}; If OrderSetName matches pattern "Anesthesia Post Op Orders%" then // Get Current worksheet info ***** START ***** // Get the currently logged on user Active_ClientVisitGUID := this_communication.ClientVisitGUID; Active_OrderGUID:= PrimaryObjdetail.GUID; Active_SignificiantDtm:= Now; location_guid := read last {"select CurrentLocationGUID from CV3ClientVisit where GUID=" || SQL(Active_ClientVisitGUID)}; //TRY try //----------------------------------------------------------- // Retrieve current order entry batch. // The companion order can be added only if the parent order // belongs to the order entry batch // object owned by the OrderEntryWorksheet. //----------------------------------------------------------- worksheetInfo := call {{{SINGLE-QUOTE}}}OrderEntryBatch{{{SINGLE-QUOTE}}}.GetCurrent; if worksheetInfo is NULL OR "OrderEntryWorksheet" <> (worksheetInfo.OrderBatchOwner as String) then z:=0; endif; //------------------------------------------------------------ // Get the .NET version of the Client Visit object. // Needed to create new ObjectsPlus object //------------------------------------------------------------ client_visit_obj := call {{{SINGLE-QUOTE}}}ClientVisit{{{SINGLE-QUOTE}}}.FindByPrimaryKey with ((Active_ClientVisitGUID as number) as {{{SINGLE-QUOTE}}}Int64{{{SINGLE-QUOTE}}}) ; //----------------------------------------------------------- // Check the order entry worksheet. If there are no entries // already on the worksheet set the initial values for // the worksheet. //----------------------------------------------------------- if worksheetInfo.UnsubmittedOrdersCount = 0 then // If there are no orders on the worksheet set // defaults that will be used to create the orders WSSessionType := "Standard"; WSSessionReason := "Orders created by MLM"; WSRequestedBySource := ""; // Set the session type and reason on the worksheet void := call worksheetInfo.SetSessionType with (WSSessionType, WSSessionReason); // Set the requesting source string worksheetInfo.RequestedBySource := WSRequestedBySource; //Get the current user as the default care provider WSRequestedBy_obj := call {{{SINGLE-QUOTE}}}CareProvider{{{SINGLE-QUOTE}}}.FindById with ( user_IDType, user_IDCode ); //Set the requesting provider worksheetInfo.RequestedBy := WSRequestedBy_obj; // Get the location that will be used for the orders. WSlocation_obj := call {{{SINGLE-QUOTE}}}Location{{{SINGLE-QUOTE}}}.FindByPrimaryKey with ((location_guid as number) as {{{SINGLE-QUOTE}}}Int64{{{SINGLE-QUOTE}}}); //Set the expected release location group worksheetInfo.ExpectedReleaseLocationGroup := WSlocation_obj; //Dispose RequestedBy CareProvider if( WSRequestedBy_obj is NOT NULL ) then void := call WSRequestedBy_obj.Dispose; WSRequestedBy_obj:= null; endif; //Dispose ExpectedReleaseLocationGroup if( WSlocation_obj is NOT NULL ) then void := call WSlocation_obj.Dispose; WSlocation_obj:= null; endif; else //If there are orders on the worksheet retrieve the default values // on the worksheet. // These values are not required for this sample MLM however they // contain useful information that can be used in the logic of an // MLM. WSSessionType := worksheetInfo.SessionType; WSSessionReason := worksheetInfo.SessionReason; WSRequestedBySource := worksheetInfo.RequestedBySource; WSRequestedBy_obj := worksheetInfo.RequestedBy; WSlocation_obj := worksheetInfo.ExpectedReleaseLocationGroup; endif; endtry; catch Exception ex error_occurred := true; error_message := "{{+R}}Common Data:{{-R}}\n" || ex.Message || "\n\n"; if( worksheetInfo is NOT NULL ) then void := call worksheetInfo.Dispose; worksheetInfo:= null; endif; if( client_visit_obj is NOT NULL ) then void := call client_visit_obj.Dispose; client_visit_obj:= null; endif; if( WSRequestedBy_obj is NOT NULL ) then void := call WSRequestedBy_obj.Dispose; WSRequestedBy_obj:= null; endif; if( WSlocation_obj is NOT NULL ) then void := call WSlocation_obj.Dispose; WSlocation_obj:= null; endif; // If unable to initialize starting data, do not continue // with the creation of any orders. // Still conclude true as the error message needs to // be displayed as an error. //conclude true; endcatch; Order_Creation_Reason := "Monitored Bed Required" ; order_type := "Other"; Order_Catalog_Item := "Monitor: Cardiac"; endif; If CallingEvent= "FieldChange" and CallingField = "DosageLow" and HaldolOrder_value = True and (OrderRoute_value = "IV Push" or OrderRoute_value = "IVPB") and OrderSetName matches pattern "Anesthesia Post Op Orders%" then If dose_value > 2 then dialogResult1 := call {{{SINGLE-QUOTE}}}MessageBox{{{SINGLE-QUOTE}}}.Show with "\n Haloperidol doses > 2 mg require continuous ECG monitoring" || "\n beyond the PACU, thus your patient will need to go to a " || "\n monitored bed for 24 hours." || " \n\n Do you wish to proceed with the haloperidol dose > 2 mg? ? ","Alert","YesNo" as {{{SINGLE-QUOTE}}}MessageBoxButtons{{{SINGLE-QUOTE}}}; if((dialogResult1 as string) = "Yes") then AdditionalInfo := "Haloperidol doses > 2 mg require continuous ECG monitoring " || "beyond the PACU. Patient will need to go to a " || "monitored bed for 24 hours." ; Obj_Error_occurred, Obj_error_message := Call CreateMonitorOrder with order_type, client_visit_obj, // ClientVisit ObjectsPlus object Order_catalog_item, // CatalogMasterItem ObjectsPlus object order_Creation_Reason, // string CreateReason worksheetInfo, AdditionalInfo, WSRequestedBy_obj, // RequestingProvider ObjectsPlus object WSRequestedBySource, // string requestingSource(must be in dict) WSSessionType, // string SessionType WSSessionReason, // string SessionReason WSLocation_obj; else dose.value := ""; endif; endif; endif; If HaldolOrder_value = True and (OrderRoute_value = "IV Push" or OrderRoute_value = "IVPB") and OrderSetName not in ("Anesthesia Post Op Orders", "Anesthesia Post Op Orders - Supplemental") then If Indication_value <> "End of Life Agitation" then AdminInst.value := CardMonMsg; CardMonInst.value := MonitoringMsg; else AdminInst.value :=NoMsg; CardMonInst.value := NoMsg; endif; else; AdminInst.value :=NoMsg; CardMonInst.value := NoMsg; endif; If HaldolOrder_value = True and (OrderRoute_value = "IV Push" or OrderRoute_value = "IVPB") and dose_value > 2 then /* Monitored Bed Accomodation Codes: 03 CCU 06 SP/Monitored 02 ICU 14 CVSU 04 IMC */ MonitoredBed := ("03 CCU","06 SP/Monitored","02 ICU","14 CVSU", "04 IMC"); // Get patient current accomodation CurrentAccom := read last {"Select ac.Code " ||" From CV3ClientVisitLocation cvl" ||" Join SXAAMAccommodation ac on ac.AccommodationID = cvl.AccommodationID " ||" Where ClientGuid = " || SQL(ClientGuid) ||" and ClientVisitGuid = " || SQL(ClientVisitGuid) ||" and cvl.Status = {{{SINGLE-QUOTE}}}CUR{{{SINGLE-QUOTE}}}" }; // Get patient current location CurrentLocation := read last {"Select CurrentLocation " ||" From cv3Clientvisit " ||" Where ClientGuid = " || SQL(ClientGuid) ||" and Guid = " || SQL(ClientVisitGuid) ||" and VisitStatus = {{{SINGLE-QUOTE}}}ADM{{{SINGLE-QUOTE}}}" }; If CurrentAccom in MonitoredBed or Indication_value = "End of Life Agitation" or CurrentLocation matches pattern "ER%" or dose_value <= 2 or OrderSetName matches pattern "Anesthesia Post Op Orders%" then continueorder := "true"; else reasonmessage := "Continuous ECG monitoring is required for Haloperidol greater than 2mg administered by IV Push, except for {{{SINGLE-QUOTE}}}End of Life{{{SINGLE-QUOTE}}} Care. You cannot proceed with this order."; alloworder := "no"; continueorder := "false"; endif; If continueorder = "true" and OrderRoute_value = "IV Push" then If dose_value <= 20 then If CurrentLocation matches pattern "ER-%" then alloworder := "warn"; reasonmessage := "Continuous ECG monitoring is required for Haloperidol greater than 2mg administered by IV Push"; else alloworder := "yes"; endif; else alloworder := "no"; reasonmessage := "Doses of 20mg or greater should be diluted in 50 ml of D5W and given as an infusion. You cannot proceed with this order."; endif; endif; endif; If alloworder = "no" then this_communication.DisplayForm := "yes"; this_communication.Message := ReasonMessage; this_communication.MessageType := "Error"; endif; If alloworder = "warn" then this_communication.DisplayForm := "yes"; this_communication.Message := ReasonMessage; this_communication.MessageType := "Informational"; endif; ;; evoke: ;; logic: Conclude true; ;; action: // This MLM returns two parameters, of types //communication_type and form_type respectively. return this_communication, this_form; ;; Urgency: 50;; end: