254 lines
11 KiB
Plaintext
254 lines
11 KiB
Plaintext
maintenance:
|
|
|
|
title: SCH_CREATE_SODIUM_FROM_RESULT;;
|
|
mlmname: SCH_CREATE_SODIUM_FROM_RESULT;;
|
|
arden: version 2.5;;
|
|
version: 5.50;;
|
|
institution: Eclipsys, Test MLM;;
|
|
author: Dean Miklavic;;
|
|
specialist: Shawn Head;;
|
|
date: 2017-11-20;;
|
|
validation: testing;;
|
|
|
|
library:
|
|
purpose: This MLM will create a Sodium order when a low sodium level is received.
|
|
|
|
;;
|
|
explanation: This orders created by this MLM will by-pass the order entry worksheet
|
|
and will write directly to the database once the evoking object is saved.
|
|
|
|
|
|
Change history
|
|
|
|
11.20.2017 STH CSR#: 36015 created (copied from the SCH_CREATE_LACTIC_ACID_FROM_RESULT which is similar) {Go-Live 07/03/2018}
|
|
;;
|
|
keywords: ObjectsPlus, Orders
|
|
;;
|
|
knowledge:
|
|
type: data-driven;;
|
|
data:
|
|
|
|
standard_libs := MLM {{{SINGLE-QUOTE}}}std_include_libs{{{SINGLE-QUOTE}}};
|
|
include standard_libs;
|
|
|
|
error_occurred := false;
|
|
error_message := "";
|
|
log_execution_info := false;
|
|
|
|
|
|
////// Added on 01.08.2015 by DW for CSR#: 33901 //////
|
|
/*
|
|
create_ED_column := MLM {{{SINGLE-QUOTE}}}SCH_FUNC_CREATE_ENTERPRISE_DEFINED_COLUMN{{{SINGLE-QUOTE}}}; // MLM that creates the Enterprise Defined Column in the "Action" section of the MLM
|
|
EDCObj := OBJECT [column_name,column_value,client_guid,chart_guid,client_visit_guid]; // Create Enterprise Defined Column Obj
|
|
*/
|
|
////// Added on 01.08.2015 by DW for CSR#: 33901 //////
|
|
|
|
|
|
|
|
observation_enter_event := event { ObservationEnter Any Observation: where (itemname in ("Sodium from Blood Gas","Sodium Plasma/Serum","Sodium, ABG, POC","Sodium, VBG, POC") AND (IsHistory = FALSE AND Active = TRUE))};
|
|
|
|
// If called by the editor
|
|
|
|
If called_by_editor then EvokingObject := read last { Observation: This where (itemname in ("Sodium from Blood Gas","Sodium Plasma/Serum","Sodium, ABG, POC","Sodium, VBG, POC") AND (IsHistory = FALSE AND Active = TRUE)) }; endif;
|
|
//
|
|
|
|
// Gather data
|
|
|
|
( OrderGUID, resultValue ) := read last { Observation: OrderGUID, Value REFERENCING EvokingObject};
|
|
|
|
(ClientVisitGUID, ChartGUID, ClientGUID, ReqByGUID, CodedTime, location_guid, OrderName, currentlocation, visittype) := Read Last {" Select
|
|
a.ClientVisitGUID, a.ChartGUID, a.ClientGUID, a.CareProviderGUID, a.RequestedTime, b.CurrentLocationGUID, a.name, b.currentlocation, b.typecode
|
|
from CV3Order a with (nolock) Join CV3ClientVisit b with(nolock) on
|
|
a.ClientVisitGUID = b.GUID and a.ClientGUID = b.ClientGUID and a.ChartGUID = b.ChartGUID and a.GUID = " || SQL(OrderGUID) };
|
|
|
|
|
|
LowSodiumValueEntered := false;
|
|
if (resultValue = "<8") then
|
|
resultValueNumeric := 1; //sets the value less than 120 to trigger re-order when lower limit reached
|
|
else
|
|
resultValueNumeric := resultValue as number;
|
|
endif;
|
|
|
|
if(visittype in ("Inpatient","Emergency","Observation")) then
|
|
validpatient := true;
|
|
else
|
|
validpatient := false;
|
|
endif;
|
|
|
|
if ((resultValueNumeric < 120) and (validpatient)) then
|
|
PerformedDTTM := EVOKINGOBJECT.PerformedDtm;
|
|
PerformedDTTM_4hrsRound2wholehr := read last { " select dateadd(hour, 4 + datediff(hour, 0," || sql(PerformedDTTM) || " ), 0) " };
|
|
//check to see if the result trigger MLM is the same as the oldest result saved to the database with a value > 2.
|
|
if PerformedDTTM_4hrsRound2wholehr is not null then
|
|
|
|
//check to see if there is already an active order for lactic acid with a requested date in-side the 4 hour window of the significant date/time of the result that filed.
|
|
Chk4ValidOrder := Read Last {" select top 1 o.guid from CV3Order o with (nolock)
|
|
where o.clientguid = " || sql(ClientGUID) || "
|
|
and o.chartguid = " || sql(ChartGUID) || "
|
|
and o.clientvisitguid = " || sql(ClientVisitGUID) || "
|
|
and o.GUID <> " || sql(OrderGUID) || "
|
|
and o.name in ({{{SINGLE-QUOTE}}}Sodium Plasma/Serum{{{SINGLE-QUOTE}}},{{{SINGLE-QUOTE}}}Sodium from Blood Gas{{{SINGLE-QUOTE}}})
|
|
and o.Requesteddtm >= " || sql(PerformedDTTM) || "
|
|
and o.RequestedDtm <= " || sql(PerformedDTTM_4hrsRound2wholehr) || "
|
|
and o.orderstatuscode not like {{{SINGLE-QUOTE}}}can%{{{SINGLE-QUOTE}}} and o.OrderStatusLevelNum > 15 and o.OrderStatusLevelNum not in (69, 70) "};
|
|
|
|
if ((Chk4ValidOrder is null) and (PerformedDTTM_4hrsRound2wholehr > now)) then
|
|
|
|
reordername := "Sodium Plasma/Serum";
|
|
reorderpiority := "Scheduled Time";
|
|
reqdate := (extract year PerformedDTTM_4hrsRound2wholehr) || "-" || ((extract month PerformedDTTM_4hrsRound2wholehr) formatted with "%0.2d")
|
|
|| "-" || ((extract day PerformedDTTM_4hrsRound2wholehr) formatted with "%0.2d");
|
|
|
|
ReqTimeHR := (extract hour PerformedDTTM_4hrsRound2wholehr);
|
|
ReqTimeMin := ((extract minute PerformedDTTM_4hrsRound2wholehr) formatted with "%0.2d");
|
|
LowSodiumValueEntered := true;
|
|
endif;
|
|
endif;
|
|
|
|
//END OF RESULTVALUENUMERIC > 2 IF STATEMENT
|
|
endif;
|
|
|
|
|
|
|
|
|
|
// Order and Error Destinations
|
|
|
|
DiagnosticOrder_dest := destination { ObjectsPlus } with
|
|
[ alert_type := "Warning",
|
|
short_message := "Object created by MLM",
|
|
priority := "low",
|
|
scope := "chart",
|
|
rule_group := "Order Object",
|
|
rule_number := 2010 ];
|
|
|
|
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 := 1003,
|
|
Rule_subgroup := "",
|
|
Send_alert_with_order := "",
|
|
Alert_dialog_settings := "",
|
|
Display_alert := true ];
|
|
|
|
|
|
// Build some preliminary objects
|
|
if ((LowSodiumValueEntered = true) and (validpatient)) then
|
|
try
|
|
SessionType := "Standard";
|
|
SessionReason := "";
|
|
RequestedBySource := "Standing Order";
|
|
OrderCreationReason := "Automatically created by MLM";
|
|
RequestedBy_obj := call {{{SINGLE-QUOTE}}}CareProvider{{{SINGLE-QUOTE}}}.FindByPrimaryKey with ( ( ReqByGUID as number ) as {{{SINGLE-QUOTE}}}Int64{{{SINGLE-QUOTE}}} ); //Int64
|
|
Location_obj := call {{{SINGLE-QUOTE}}}Location{{{SINGLE-QUOTE}}}.FindByPrimaryKey with ((location_guid as number) as {{{SINGLE-QUOTE}}}Int64{{{SINGLE-QUOTE}}});
|
|
ClientVisit_obj := call {{{SINGLE-QUOTE}}}ClientVisit{{{SINGLE-QUOTE}}}.FindByPrimaryKey with ((ClientVisitGUID as number) as {{{SINGLE-QUOTE}}}Int64{{{SINGLE-QUOTE}}}) ;
|
|
endtry;
|
|
|
|
// Failed to build preliminary objects - Dispose
|
|
|
|
catch Exception ex
|
|
error_occurred:= true;
|
|
error_message := "{{+R}}Common Data:{{-R}}\n" || ex.Message || "\n\n";
|
|
|
|
if ( ClientVisit_obj is NOT NULL ) then void:= call ClientVisit_obj.Dispose; ClientVisit_obj:= null; endif;
|
|
if ( RequestedBy_obj is NOT NULL) then void:= call RequestedBy_obj.Dispose; RequestedBy_obj:= null; endif;
|
|
if ( Location_obj is NOT NULL ) then void:= call Location_obj.Dispose; Location_obj:= null; endif;
|
|
endcatch;
|
|
|
|
// Build the order object
|
|
|
|
try
|
|
//Catalog_Item_Name := "CPK Isoenzymes";
|
|
diagnostic_catalog_item := call {{{SINGLE-QUOTE}}}OrderCatalogMasterItem{{{SINGLE-QUOTE}}}.FindByName with reordername;
|
|
|
|
DiagnosticOrder_obj := call {{{SINGLE-QUOTE}}}DiagnosticOrder{{{SINGLE-QUOTE}}}.CreateDiagnosticOrder
|
|
with
|
|
ClientVisit_obj, // ClientVisit ObjectsPlus object
|
|
diagnostic_catalog_item, // OrderCatalogMasterItem ObjectsPlus object
|
|
OrderCreationReason, // CreateReason
|
|
RequestedBy_obj, // RequestedBy ObjectsPlus object
|
|
RequestedBySource, // string RequestedBySource (must be in dictionary)
|
|
SessionType, // string SessionType
|
|
SessionReason, // string SessionReason
|
|
Location_obj, // Location ReleaseLocGrpID
|
|
"Always" as {{{SINGLE-QUOTE}}}AvailabilityOverride{{{SINGLE-QUOTE}}}; // AvailabilityOverride eAvailabilityOverride
|
|
|
|
// Populate the Requested Time field
|
|
|
|
|
|
DiagnosticOrder_obj.RequestedDate := reqdate;
|
|
ReqTime_obj := new net_object {{{SINGLE-QUOTE}}}RequestedTime{{{SINGLE-QUOTE}}};
|
|
ReqTime_obj.CodedTime := reorderpiority;
|
|
time_obj := new net_object {{{SINGLE-QUOTE}}}Time{{{SINGLE-QUOTE}}} with (ReqTimeHR As Number) as {{{SINGLE-QUOTE}}}Int32{{{SINGLE-QUOTE}}}, (ReqTimeMin As Number) as {{{SINGLE-QUOTE}}}Int32{{{SINGLE-QUOTE}}};
|
|
ReqTime_obj.time := time_obj;
|
|
|
|
retval := call DiagnosticOrder_obj.{{{SINGLE-QUOTE}}}SetFormFieldVisible{{{SINGLE-QUOTE}}} with "RequestedTime",true;
|
|
retval := call DiagnosticOrder_obj.{{{SINGLE-QUOTE}}}SetFormFieldReadOnly{{{SINGLE-QUOTE}}} with "RequestedTime",false;
|
|
DiagnosticOrder_obj.RequestedTime := ReqTime_obj;
|
|
retval := call DiagnosticOrder_obj.{{{SINGLE-QUOTE}}}SetFormFieldReadOnly{{{SINGLE-QUOTE}}} with "LAB_Info Summary",false;
|
|
retval := call DiagnosticOrder_obj.{{{SINGLE-QUOTE}}}SetEnterpriseDefinedDataItemValue<String>{{{SINGLE-QUOTE}}} with
|
|
"LAB_Info Summary", "Repeat Per Sodium Protocol" ;
|
|
retval := call DiagnosticOrder_obj.{{{SINGLE-QUOTE}}}SetFormFieldReadOnly{{{SINGLE-QUOTE}}} with "LAB_Info Summary",true;
|
|
|
|
DiagnosticOrder_dest.ObjectsPlus := DiagnosticOrder_obj;
|
|
endtry;
|
|
|
|
// Failed to build the order object and make the order - Return error and dispose
|
|
|
|
catch Exception ex
|
|
error_occurred := true;
|
|
error_message := error_message || "{{+R}}New diagnostic order:{{-R}}\n" || ex.Message || "\n\n";
|
|
|
|
if ( diagnostic_catalog_item is NOT NULL ) then void:= call diagnostic_catalog_item.Dispose; diagnostic_catalog_item:= null; endif;
|
|
if ( DiagnosticOrder_obj is NOT NULL ) then void:= call DiagnosticOrder_obj.Dispose; DiagnosticOrder_obj:= null; endif;
|
|
DiagnosticOrder_dest := null;
|
|
endcatch;
|
|
|
|
// Dispose
|
|
|
|
if ( ClientVisit_obj is NOT NULL ) then void:= call ClientVisit_obj.Dispose; ClientVisit_obj:= null; endif;
|
|
if ( RequestedBy_obj is NOT NULL ) then void:= call RequestedBy_obj.Dispose; RequestedBy_obj:= null; endif;
|
|
if ( Location_obj is NOT NULL ) then void:= call Location_obj.Dispose; Location_obj:= null; endif;
|
|
endif;
|
|
|
|
;;
|
|
|
|
priority: 90
|
|
;;
|
|
evoke:
|
|
5 seconds after time of observation_enter_event;
|
|
;;
|
|
logic:
|
|
|
|
|
|
if(validpatient) then
|
|
|
|
conclude true;
|
|
else
|
|
conclude false;
|
|
endif;
|
|
|
|
;;
|
|
action:
|
|
|
|
if Error_occurred
|
|
then
|
|
write "An error has occured in the MLM {{+B}}SCH_CREATE_SODIUM_FROM_RESULT{{-B}} " ||
|
|
"Please notify your System Administrators that an error message has " ||
|
|
"occurred for this patient. They will review the following error " ||
|
|
"message: \n" at error_destination;
|
|
|
|
write "1. " || error_message at error_destination;
|
|
|
|
endif;
|
|
|
|
if EXISTS DiagnosticOrder_dest then
|
|
write true at DiagnosticOrder_dest;
|
|
endif;
|
|
|
|
;;
|
|
Urgency: 50;;
|
|
end:
|