maintenance: title: SCH_CHARTED_HALDOL_24HRS;; mlmname: SCH_CHARTED_HALDOL_24HRS;; arden: version 2.50;; version: 5.50;; institution: St. Clair Hospital;; author: Shawn Head, Allscripts Corp;; specialist: Dean Miklavic;; date: 2016-04-07;; validation: testing;; library: purpose: ;; explanation: Change history 04.07.2016 STH CSR #33207 Created to update the IV Haldol dosage given over the last 24 hours from last time IV Haldol was given. {Go-Live 6/1/2016} 06.02.2016 STH CSR #33207 CA service desk #: 2192254 - Correct issue so the MLM only updates the columns when IV haldol is being charted. There was logic that was still updating the columns even if the task that was give was for a route of PO. Added an qulaifying IF statement to look at route first, and only when the route being given contains IV will the MLM fire now. ;; keywords: ObjectsPlus/XA, Order ;; 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}}}; create_ED_column := MLM {{{SINGLE-QUOTE}}}SCH_FUNC_CREATE_ENTERPRISE_DEFINED_COLUMN{{{SINGLE-QUOTE}}}; include standard_libs; //Error Handling vars for ObjectsPlus Method calls error_occurred := false; error_message := ""; log_execution_info := false; /* //-------------------------------------------------------------------- if called_by_editor then EvokingObject := read last {OrderTaskOccurrence: THIS where TaskName Matches Pattern "%Haloperidol%" and orderguid = "9001409616300680"}; endif; */ //Event Triggers any_modified_task:= event {OrderTaskOccurrenceModify Any OrderTaskOccurrence: WHERE TaskName Matches Pattern "%Haloperidol%" }; userguid :=read last {UserInfo: guid}; CR := 13 formatted with "%c"; LF := 10 formatted with "%c"; TS := 9 FORMATTED WITH "%c"; CRLF:= CR||LF; //--------------------------------------------------------------- // Error destination //--------------------------------------------------------------- error_destination := destination { Alert } with [ alert_type := "Warning", short_message := "ObjectsPlus Error from MLM", priority := "low", scope := "chart", Rule_group := "ObjectsPlus Error from MLM", Rule_number := 1001, Rule_subgroup := "", Send_with_order := "", Alert_dialog_settings := "", Display_alert := true ]; //Retrieve Client Visit GUID TaskName,TaskDose, TaskStatusCode,orderguid ,significantdtm,taskoccuranceguid ,taskguid, routecode := read last {OrderTaskOccurrence: TaskName,TaskDose, TaskStatusCode,OrderGUID, SignificantDtm, guid, OrderTaskGUID, TaskRouteCode REFERENCING EvokingObject}; colUpdate := false; if(routecode matches pattern "%IV%") then (ClientVisitGUID, ClientGUID, ChartGUID, LocationGUID) := read last { " select cv.guid, cv.clientguid, cv.chartguid, cv.CurrentLocationGUID from cv3clientvisit cv with (nolock) inner join cv3order o with (nolock) on cv.ClientGUID = o.clientguid and cv.ChartGUID = o.chartguid and cv.guid = o.clientvisitguid where o.guid = " || SQL(orderguid)}; (ProviderGUID) := read last { " select ProviderGUID from CV3CareProviderVisitRole where clientguid = " || sql(ClientGUID) || " and ClientVisitGUID = " || sql(ClientVisitGUID) || " and rolecode = {{{SINGLE-QUOTE}}}Attending{{{SINGLE-QUOTE}}} and status = {{{SINGLE-QUOTE}}}active{{{SINGLE-QUOTE}}} " }; Unit := read last { " select name from cv3location where guid = " || sql(LocationGUID) }; Haldol_24hr_Dosage := read last { " select * into #tmp_orders from cv3order o with (nolock) where o.ClientGUID = " || sql(ClientGUID) || " and o.chartguid = " || sql(chartGUID) || " and o.clientvisitguid = " || sql(ClientVisitGUID) || " and o.name like {{{SINGLE-QUOTE}}}%Haloperidol%{{{SINGLE-QUOTE}}} select isnull(sum(cast(isnull(oto.taskdose,0) as float)),0) as {{{SINGLE-QUOTE}}}total_dosage_24hrs{{{SINGLE-QUOTE}}} from #tmp_orders o with (nolock) inner join CV3OrderTaskOccurrence oto with (nolock) on o.clientguid = oto.clientguid and o.guid = oto.OrderGUID where oto.TaskStatusCode = {{{SINGLE-QUOTE}}}Performed{{{SINGLE-QUOTE}}} and oto.TaskRouteCode like {{{SINGLE-QUOTE}}}%IV%{{{SINGLE-QUOTE}}} and oto.PerformedFromDtm >= DATEADD(hh,-24,GETDATE()) " }; try client_visit_obj := call {{{SINGLE-QUOTE}}}ClientVisit{{{SINGLE-QUOTE}}}.FindByPrimaryKey with ((ClientVisitGUID as number) as {{{SINGLE-QUOTE}}}Int64{{{SINGLE-QUOTE}}}) ; WSSessionType := "Standard"; WSSessionReason := ""; WSRequestedBySource := "Protocol Order"; EntDefinedColumn_obj := call {{{SINGLE-QUOTE}}}EnterpriseDefinedColumn{{{SINGLE-QUOTE}}}.FindByName with ( client_visit_obj, "Haldol Total"); WSRequestedBy_obj := call {{{SINGLE-QUOTE}}}CareProvider{{{SINGLE-QUOTE}}}.FindByPrimaryKey with ((ProviderGUID as number) as {{{SINGLE-QUOTE}}}Int64{{{SINGLE-QUOTE}}}); WSlocation_obj := call {{{SINGLE-QUOTE}}}Location{{{SINGLE-QUOTE}}}.FindByPrimaryKey with ((LocationGUID as number) as {{{SINGLE-QUOTE}}}Int64{{{SINGLE-QUOTE}}}); endtry; catch Exception ex error_occurred := true; error_message := "{{+R}}Common Data:{{-R}}\n" || ex.Message || "\n\n"; 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 ( EntDefinedColumn_obj is NOT NULL) then void := call EntDefinedColumn_obj.Dispose; EntDefinedColumn_obj := null; endif; endcatch; reset_taskdose := 0; if((Haldol_24hr_Dosage is null) or Haldol_24hr_Dosage = "" or Haldol_24hr_Dosage = 0) then if(taskstatuscode = "Performed") then abcxyz := "step1"; Haldol_24hr_Dosage := (taskdose as number); else abcxyz := "step2"; Haldol_24hr_Dosage := 0; endif; else if(taskstatuscode = "Performed") then abcxyz := "step3"; Haldol_24hr_Dosage := (Haldol_24hr_Dosage as number) + (taskdose as number); else abcxyz := "step4"; reset_taskdose := read last { " select taskdose from CV3OrderTaskOccurrence with (nolock) where clientguid = " || sql(ClientGUID) || " and orderguid = " || sql(orderguid) || " and OrderTaskGUID = " || sql(taskguid) || " and guid = " || sql(taskoccuranceguid) }; Haldol_24hr_Dosage := (Haldol_24hr_Dosage as number) - (reset_taskdose as number); endif; endif; Haldol_24hr_Dosage := Haldol_24hr_Dosage formatted with "%.2f"; ColUpdateValue := ""; colUpdate := false; createorders := (); CreateMonitorOrder := false; CreateTransferOrder := false; currentvalue := EntDefinedColumn_obj.Value; FindAstrick := find "*" in string currentvalue; testvale := read last { " select replace(" || sql(currentvalue) || ",char(9),{{{SINGLE-QUOTE}}}--{{{SINGLE-QUOTE}}}) " }; FindTS := find "--" in string testvale; if((Haldol_24hr_dosage as number) >= 0.00) then colUpdate := true; CurVal := Haldol_24hr_dosage; if((FindAstrick>0) and (taskstatuscode="Performed"))then ColUpdateValue := (CurVal as string) || "*"; elseif(FindTS>0) then ColUpdateValue := (CurVal as string) || TS; elseif(((Haldol_24hr_dosage as number) >= 2.00)) then ColUpdateValue := (CurVal as string) || "*"; else ColUpdateValue := (CurVal as string); endif; if((Haldol_24hr_dosage as number) >= 2.00) then (MonitorOrderGUID, TransferOrderGUID) := read last { " select (select guid from cv3order o with (nolock) where o.ClientGUID = " || sql(ClientGUID) || " and o.chartguid = " || sql(ChartGUID) || " and o.clientvisitguid = " || sql(ClientVisitGUID) || " and o.name = ({{{SINGLE-QUOTE}}}Monitor: Cardiac{{{SINGLE-QUOTE}}}) and o.orderstatuscode not in ({{{SINGLE-QUOTE}}}CANC{{{SINGLE-QUOTE}}},{{{SINGLE-QUOTE}}}CAND{{{SINGLE-QUOTE}}},{{{SINGLE-QUOTE}}}CANP{{{SINGLE-QUOTE}}},{{{SINGLE-QUOTE}}}CANT{{{SINGLE-QUOTE}}},{{{SINGLE-QUOTE}}}DISC{{{SINGLE-QUOTE}}},{{{SINGLE-QUOTE}}}DISCD{{{SINGLE-QUOTE}}},{{{SINGLE-QUOTE}}}DISCR{{{SINGLE-QUOTE}}},{{{SINGLE-QUOTE}}}DISCT{{{SINGLE-QUOTE}}},{{{SINGLE-QUOTE}}}HISDP{{{SINGLE-QUOTE}}})) , (select guid from cv3order o with (nolock) where o.ClientGUID = " || sql(ClientGUID) || " and o.chartguid = " || sql(ChartGUID) || " and o.clientvisitguid = " || sql(ClientVisitGUID) || " and o.name = ({{{SINGLE-QUOTE}}}Transfer-Monitored Bed{{{SINGLE-QUOTE}}}) and o.orderstatuscode not in ({{{SINGLE-QUOTE}}}CANC{{{SINGLE-QUOTE}}},{{{SINGLE-QUOTE}}}CAND{{{SINGLE-QUOTE}}},{{{SINGLE-QUOTE}}}CANP{{{SINGLE-QUOTE}}},{{{SINGLE-QUOTE}}}CANT{{{SINGLE-QUOTE}}},{{{SINGLE-QUOTE}}}DISC{{{SINGLE-QUOTE}}},{{{SINGLE-QUOTE}}}DISCD{{{SINGLE-QUOTE}}},{{{SINGLE-QUOTE}}}DISCR{{{SINGLE-QUOTE}}},{{{SINGLE-QUOTE}}}DISCT{{{SINGLE-QUOTE}}},{{{SINGLE-QUOTE}}}HISDP{{{SINGLE-QUOTE}}})) " }; if(MonitorOrderGUID is null) then createorders := createorders, "Monitor: Cardiac"; if(Unit in ("5F","5A","5G") and TransferOrderGUID is null) then //void := call create_order with (ClientVisitGUID,UserGuid,ClientGUID,"Standard","Protocol Order","Transfer-Monitored Bed","IV Haloperidol Protocol","Other"); createorders := createorders, "Transfer-Monitored Bed"; endif; endif; endif; endif; for x in (1 seqto(count(createorders))) do //order_Name := createorders[x]; order_Creation_Reason := "Protocol Order" ; WSRequestedBySource := "Protocol Order"; order_Name := createorders[x]; try Catalog_Item_Name := createorders[x]; order_type := "other"; modifier := ""; modversion := ""; order_catalog_item := call {{{SINGLE-QUOTE}}}OrderCatalogMasterItem{{{SINGLE-QUOTE}}}.FindByName with Catalog_Item_Name; GeneralOrder_Obj := call {{{SINGLE-QUOTE}}}GeneralOrder{{{SINGLE-QUOTE}}}.CreateGeneralOrder with client_visit_obj, order_catalog_item, order_Creation_Reason, WSRequestedBy_obj, WSRequestedBySource, WSSessionType, WSSessionReason, WSlocation_obj, "Always" as {{{SINGLE-QUOTE}}}AvailabilityOverride{{{SINGLE-QUOTE}}}; if (Order_catalog_item.Name in ("Monitor: Cardiac","Transfer-Monitored Bed")) then GeneralOrder_obj.SpecialInstructions := "IV Haldol Protocol"; GeneralOrder_obj.RequestedTime := "Now"; endif; if( GeneralOrder_obj is NOT NULL ) then void := call GeneralOrder_Obj.Save; void := call GeneralOrder_Obj.Dispose; endif; endtry; catch Exception ex error_occurred := true; error_message := "{{+R}}New General order:{{-R}}\n" || ex.Message || "\n\n"; endcatch; if ( Order_catalog_item is NOT NULL ) then void:= call Order_catalog_item.Dispose; Order_catalog_item:= null; endif; enddo; endif; ;; priority: 50 ;; evoke: any_modified_task; ;; logic: if (EvokingObject is null) then conclude false; endif; //Boolean to update TICU Status Board column true, continue with logic if (colUpdate = true) then try EntDefinedColumn_obj.Value := ColUpdateValue; void := call EntDefinedColumn_obj.Save; void := call EntDefinedColumn_obj.Dispose; EntDefinedColumn_obj := null; endtry; catch Exception ex error_occurred := true; error_message := error_message || "{{+R}}Enterprise Patient List Column{{-R}}\n" || ex.message || "\n\n"; if ex.InnerException is not null net_object then error_message := error_message || "Inner Exception: " || ex.InnerException.Message || "\n\n"; endif; if (EntDefinedColumn_obj is not null) then void := call EntDefinedColumn_obj.Dispose; EntDefinedColumn_obj := null; endif; EDColumn_Dest := null; endcatch; 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 ( EntDefinedColumn_obj is NOT NULL) then void := call EntDefinedColumn_obj.Dispose; EntDefinedColumn_obj := null; endif; endif; conclude true; ;; action: //Error Handling if error_occurred then write "An error occurred in the MLM {{+B}}SCH_CHARTED_HALDOL_24HRS{{-B}} " || " Please notify your system administrator that an error message has " || " occurred for this patient. They will review the following error " || "message:\n" at error_destination; write error_message at error_destination; endif; ;; Urgency: 50;; end: