Files
St.Clair/MLMStripper/bin/Debug/FORM/FORM_SET_VTE_PROPHYLAXIS.mlm

715 lines
38 KiB
Plaintext

maintenance:
title: VTE Prothylaxis;;
mlmname: FORM_Set_VTE_Prophylaxis;;
arden: version 2;;
version: 4.50;;
institution: St Clairs;;
author: Teresa Spicuzza, Eclipsys Corp ext 7448;;
specialist: Don Warnick, Eclipsys Corp Ext 7463;;
date: 2009-08-05;;
validation: testing;;
library:
purpose: Used for medication grids that holds heparin and performs other in VTE Prothylaxis order set
;;
explanation: This MLM is called from the VTE Prothylaxis order set
Change history
08.05.2009 DW Copied from FORM_Set_Heparin_SQ
08.02.2010 TMS Added Renal, CMP, and BMP panels to creatinine search
09.27.2010 TMS Added routine for Hold session date handling
06.02.2011 TMS Added logic to auto select IPC if contranindication to anticoagulants
exists. Uncheck daily lab orders when anticoagulant orders are unchecked.
If patient risk score is >=3, stops user from leaving order set without
addressing either an order for anticoagulants or a contraindication to
anticoagulants.
03.28.2012 JML Added call to functional MLM that will perform a check for existing or unsubmitted
anticoagulant orders and whether they conflict with the current anticoagulant selection.
04.23.2012 TMS Changed {{{SINGLE-QUOTE}}}elseif{{{SINGLE-QUOTE}}} for form close to {{{SINGLE-QUOTE}}}if{{{SINGLE-QUOTE}}} to eliminate baseline orders not being checked.
05.16.2012 JML Changed Heparin duplicate medication alert to soft stop.
08.14.2012 TMS Optimized SQL for VTE risk Assessment(for FP1 CUR vs ARC)
04.02.2013 JML CSR #31182: Autocheck the IPC order if: a) risk score is 1 or 2; b) contraindications exist;
stop user from leaving order set without addressing either an order for anticoagulants or a
contraindication to anticoagulants if risk score is >= 3 (previously >= 2)
06.06.2014 STH CSR #: 31893: Added logic so a physician can override the VTE score that is pulled from the A/I flowsheet.
I also updated sections of the code to use the new "override" score when approriate and still follow all
support VTE CDS already added to this MLM. The new logic will provide physicians with an Objects Plus
window to override the score. Once the physician overrides the score the information will be populated on hidden fields
on the order set and mapped back to the VTE Drug Therapy Evalution order item for future reference.
If there is an override then an MLM added to the A/I flowsheet will prompt any nurse that they need to re-evalute the score
based on the override. Last there is a physician override observation added to the A/I Flowsheet VTE section to allow
the override details to be automatically pulled from the physician override field added to the VTE Drug Therapy Evaluation order item.
07.08.2014 STH Trackit Ticket #: 166658 Issue was identified where ED physicians are unable to order the IPC order on the order set when no VTE score has
been created. Per Teresa and Peggy it is OK for the ED physicians to order the IPC outright through this order set with no offical VTE
socre on the patient. Updated logic to allow the IPC order to be entered through this orderset when there is no VTE score.
12.03.2015 STH Update to allow deselecting the IPC order {Go-Live 12/15/2015}
04.26.2016 TMS Add call on form Close to Medication Order Management MLM CSR 33465
04.03.2019 JML 18.4 Upgrade Issue - columns added to CV3ClientDocumentCUR/ARC tables were causing "FormOpen" query to fail.
;;
keywords: Called MLMs, VTE Prothylaxis
;;
knowledge:
type: data-driven;;
data:
// This MLM is passed three arguments, of types
// communication_type, form_type and client info object respectively.
(this_communication, // Communication object
this_form, // Form object
client_info_obj //Arden ClientInfo object
) := argument;
/*******************Make Changes To Spelling And Flags In This Section*******************/
/* Set to true if a decision.log is needed.*/
log_execution_info := FALSE;
standard_libs := mlm {{{SINGLE-QUOTE}}}std_include_libs{{{SINGLE-QUOTE}}};
include standard_libs;
using "ObjectsPlusXA.SCM.Forms";
using namespace "ObjectsPlusXA.SunriseClinicalManager.Forms";
/***************************************************************************************/
// Use String parse
str_parse := mlm {{{SINGLE-QUOTE}}}UTIL_STRING_PARSE{{{SINGLE-QUOTE}}};
// Anticoagulant Conflict Check MLM
anticoagulant_conflict := MLM {{{SINGLE-QUOTE}}}FORM_FUNC_ANTICOAGULANT_CONFLICT_CHECK{{{SINGLE-QUOTE}}};
// Initialize error message
error_message:="";
// Assigns fields passed in the Form object to the Field object
field_list:= this_form.fields;
user_guid := this_communication.UserGUID;
client_guid := this_communication.ClientGUID;
visit_guid := this_communication.ClientVisitGUID;
chart_guid := this_communication.ChartGuid;
occcode := read last {" select OccupationCode from CV3USER U "
|| " where guid = " || sql(user_guid) };
CallingEvent := this_communication.CallingEvent;
CallingField := this_communication.CallingFieldName;
local_session := cds_session.local;
test123 := "test";
Guidelines := last of (field_list where field_list.DataItemName = "MultiOrderInline" and field_List.Control_MultiFieldOccNum = 1);
Guidelines_List := Guidelines.Value;
DrugTherapyEval := last of (field_list where field_list.DataItemName = "MultiOrderGrid" and field_List.Control_MultiFieldOccNum = 5);
DrugTherapyEval_List := DrugTherapyEval.Value;
DrugOrders := last of (field_list where field_list.DataItemName = "MultiOrderGrid" and field_List.Control_MultiFieldOccNum = 7);
DrugOrders_List := DrugOrders.Value;
Found_Hep_Inj1:= first of (DrugOrders_List where DrugOrders_List.Name = "Heparin Inj");
Found_Hep_Inj2:= last of (DrugOrders_List where DrugOrders_List.Name = "Heparin Inj");
Found_Eno_Inj1:= first of (DrugOrders_List where DrugOrders_List.Name = "Enoxaparin Inj");
Found_Eno_Inj2:= last of (DrugOrders_List where DrugOrders_List.Name = "Enoxaparin Inj");
IPC := last of (field_list where field_list.DataItemName = "MultiOrderGrid" and field_List.Control_MultiFieldOccNum = 4);
IPC_List := IPC.Value;
vtescore := last of (field_list where field_list.DataItemName = "VTE Prophylaxis Risk Factor Score" and field_List.Control_MultiFieldOccNum = 1);
//added by STH
vteoverrideobj := last of (field_list where field_list.DataItemName = "Obj_Plus_Lab" and field_List.Control_MultiFieldOccNum = 1);
vteoverridescore := last of (field_list where field_list.DataItemName = "VTE Prophylaxis Risk Factor Score" and field_List.Control_MultiFieldOccNum = 2);
vteoverridereason := last of (field_list where field_list.DataItemName = "OS_Information1"and field_List.Control_MultiFieldOccNum = 2);
vtescoreby := last of (field_list where field_list.DataItemName = "VTE Risk Assessed By");
vtescoredate:= last of (field_list where field_list.DataItemName = "VTE Risk Assessed Date");
physicianoverridedetails := last of (field_list where field_list.DataItemName = "OS_Information1" and field_List.Control_MultiFieldOccNum = 1);
vtescoredetails := last of (field_list where field_list.DataItemName = "OS_Information2");
StopOrderBox := last of (field_list where field_list.DataItemName = "MLM Generic Free Text" and field_List.Control_MultiFieldOccNum = 1);
StopOrderBoxValue:= StopOrderBox.value;
Hardstop := "";
ReasonMessage := "This patient has a Risk Factor Score of 3 or greater. Please choose an anticoagulant order or identify why VTE prophylaxis is not indicated or why anticoagulants are contraindicated. ";
Labs_fld := last of (field_list where field_list.DataItemName = "MultiOrderCheckBox" and field_List.Control_MultiFieldOccNum = 1);
Labs_List := Labs_fld.Value;
Found_Base_CBC:= first of (Labs_list where Labs_list.Name = "CBC No Diff (Hemogram Only)");
Found_Base_Creatinine:= first of (Labs_list where Labs_list.Name = "Creatinine");
CheckCBC:=False;
CheckCreatinine:=False;
Lab_Daily := last of (field_list where field_list.DataItemName = "MultiOrderGrid" and field_List.Control_MultiFieldOccNum = 2);
Lab_Daily_List := Lab_Daily.Value;
primreqdate:= last of (field_list where field_list.DataItemName = "RequestedDate" and field_List.Control_MultiFieldOccNum = 1);
secreqdate:= last of (field_list where field_list.DataItemName = "RequestedDate" and field_List.Control_MultiFieldOccNum = 2);
thirdreqdate:= last of (field_list where field_list.DataItemName = "RequestedDate" and field_List.Control_MultiFieldOccNum = 3);
fourthreqdate:= last of (field_list where field_list.DataItemName = "RequestedDate" and field_List.Control_MultiFieldOccNum = 4);
fifthreqdate:= last of (field_list where field_list.DataItemName = "RequestedDate" and field_List.Control_MultiFieldOccNum = 5);
ED_Loc:= last of (field_list where field_list.DataItemName = "ED Location");
//////////////
Lab_Rem := last of (field_list where field_list.DataItemName = "MultiOrderGrid" and field_List.Control_MultiFieldOccNum = 3);
Lab_Rem_List := Lab_Rem.Value;
Fnd_Daily := first of (Lab_Rem_List where Lab_Rem_List.Name = "Daily Orders:");
///////////////////////
Heps_Grid := last of (field_list where field_list.DataItemName = "MultiOrderGrid" and field_List.Control_MultiFieldOccNum = 1);
Heps_List :=Heps_Grid.Value;
Fnd_Hep_Inj:= first of (Heps_List where Heps_List.Name = "Heparin Inj");
/////////////
prx_comment := last of (field_list where field_list.DataItemName = "PRX_NOTECOMMENT0");
////////////
Order_From := last of (field_list where field_list.DataItemName = "NUR_DateField");
Order_To := last of (field_list where field_list.DataItemName = "NUR_ToDate");
fromordersetmlm := "true";
if CallingEvent = "FormOpen" then
flowsheet_score_details := read last { " SELECT cdc.GUID, cdc.AuthoredDtm, cdc.ArcType, cdc.ClientGUID, cdc.DocumentName, cdc.Active"
|| " INTO #tmp_clientdocument"
|| " FROM CV3ClientDocumentCUR cdc WITH (NOLOCK)"
|| " WHERE cdc.ClientGUID = " || SQL(client_guid)
|| " AND cdc.ClientVisitGUID = " || SQL(visit_guid)
|| " AND cdc.ChartGUID = " || SQL(chart_guid)
|| " AND (cdc.DocumentName LIKE {{{SINGLE-QUOTE}}}%Adult Assessment/Intervention%{{{SINGLE-QUOTE}}}"
|| " OR cdc.DocumentName LIKE {{{SINGLE-QUOTE}}}%ED Adult Assessment Intervention flowsheet%{{{SINGLE-QUOTE}}}"
|| " OR cdc.documentname LIKE {{{SINGLE-QUOTE}}}%OB Assessment Intervention flowsheet%{{{SINGLE-QUOTE}}})"
|| " UNION"
|| " SELECT cda.GUID, cda.AuthoredDtm, cda.ArcType, cda.ClientGUID, cda.DocumentName, cda.Active"
|| " FROM CV3ClientDocumentARC cda WITH (NOLOCK)"
|| " WHERE cda.ClientGUID = " || SQL(client_guid)
|| " AND cda.ClientVisitGUID = " || SQL(visit_guid)
|| " AND cda.ChartGUID = " || SQL(chart_guid)
|| " AND (cda.DocumentName LIKE {{{SINGLE-QUOTE}}}%Adult Assessment/Intervention%{{{SINGLE-QUOTE}}}"
|| " OR cda.DocumentName LIKE {{{SINGLE-QUOTE}}}%ED Adult Assessment Intervention flowsheet%{{{SINGLE-QUOTE}}}"
|| " OR cda.documentname LIKE {{{SINGLE-QUOTE}}}%OB Assessment Intervention flowsheet%{{{SINGLE-QUOTE}}})"
|| ""
|| " SELECT odc.ObsMasterItemGUID, odc.displaysequence, odc.ObservationDocumentguid, odc.OwnerGUID, odc.Arctype"
|| " ,odc.ObservationGUID, odc.ParameterGUID, odc.Active"
|| " INTO #tmp_obsdocument"
|| " FROM CV3ObservationDocumentcur odc WITH (NOLOCK) JOIN #tmp_clientdocument tcd"
|| " ON odc.OwnerGUID = tcd.GUID"
|| " UNION"
|| " SELECT oda.ObsMasterItemGUID , oda.displaysequence, oda.ObservationDocumentguid, oda.OwnerGUID"
|| " ,oda.Arctype, oda.ObservationGUID, oda.ParameterGUID, oda.Active"
|| " FROM CV3ObservationDocumentarc oda WITH (NOLOCK) JOIN #tmp_clientdocument tcd"
|| " ON oda.OwnerGUID = tcd.GUID"
|| ""
|| " SELECT DISTINCT OCMI.Name, CD.AuthoredDtm"
|| " ,COALESCE( Obs.valuetext, ( dbo.sxaGetFSListValsFn( OD.ObservationDocumentguid, CD.clientGuid ) ) ) AS {{{SINGLE-QUOTE}}}obs_value{{{SINGLE-QUOTE}}}"
|| " ,OCMI.LeftJustifiedLabel, OCMI.RightJustifiedLabel, CD.DocumentName, OD.DisplaySequence, OXI.InValue"
|| " ,OXI.OutValue, OXI.IOSubtype, Obs.SHIFTDAILYHOURLYTOTAL"
|| " INTO #tmp_obsvalues"
|| " FROM #tmp_clientdocument CD JOIN #tmp_obsdocument OD"
|| " ON OD.OwnerGUID = CD.GUID"
|| " AND OD.Arctype = CD.Arctype"
|| " JOIN CV3Observation Obs WITH (NOLOCK)"
|| " ON OD.ObservationGUID = Obs.GUID"
|| " AND OD.Arctype = Obs.Arctype"
|| " LEFT JOIN CV3ObservationXInfo OXI WITH (NOLOCK)"
|| " ON obs.GUID = OXI.observationXInfoGUID"
|| " AND obs.Arctype = OXI.Arctype"
|| " LEFT JOIN CV3ObservationEntryItem OEI WITH (NOLOCK)"
|| " ON OEI.GUID = OD.ParameterGUID"
|| " JOIN CV3ObsCatalogMasterItem OCMI WITH (NOLOCK)"
|| " ON OCMI.GUID = OD.ObsMasterItemGUID"
|| " WHERE OCMI.Name LIKE {{{SINGLE-QUOTE}}}%vte%{{{SINGLE-QUOTE}}}"
|| " AND OD.Active = 1"
|| " AND CD.Active = 1"
|| " AND CD.AuthoredDtm > {{{SINGLE-QUOTE}}}2013-05-01{{{SINGLE-QUOTE}}}"
|| ""
|| " DECLARE @maxauthdtm AS DATETIME"
|| " SET @maxauthdtm = ( SELECT MAX(AuthoredDtm) FROM #tmp_obsvalues )"
|| " SELECT TOP 1 {{{SINGLE-QUOTE}}}Most Recent {{{SINGLE-QUOTE}}} +"
|| " ( SELECT ( RightJustifiedLabel + {{{SINGLE-QUOTE}}}: {{{SINGLE-QUOTE}}} + obs_value + {{{SINGLE-QUOTE}}}. {{{SINGLE-QUOTE}}} ) AS {{{SINGLE-QUOTE}}}data(){{{SINGLE-QUOTE}}}"
|| " FROM #tmp_obsvalues"
|| " WHERE AuthoredDtm = @maxauthdtm"
|| " AND obs_value NOT LIKE {{{SINGLE-QUOTE}}}%(0)%{{{SINGLE-QUOTE}}}"
|| " AND Name = {{{SINGLE-QUOTE}}}AS SC vte score CAL{{{SINGLE-QUOTE}}}"
|| " AND Name <> {{{SINGLE-QUOTE}}}AS SC vte physician override{{{SINGLE-QUOTE}}} for xml path({{{SINGLE-QUOTE}}}{{{SINGLE-QUOTE}}}) )"
|| " + {{{SINGLE-QUOTE}}}The score was determined by: {{{SINGLE-QUOTE}}}"
|| " + replace( replace( replace( replace( replace( replace( replace("
|| " ( SELECT ( RightJustifiedLabel + {{{SINGLE-QUOTE}}}: {{{SINGLE-QUOTE}}} + obs_value + {{{SINGLE-QUOTE}}} {{{SINGLE-QUOTE}}} ) AS {{{SINGLE-QUOTE}}}data(){{{SINGLE-QUOTE}}}"
|| " FROM #tmp_obsvalues"
|| " WHERE AuthoredDtm = @maxauthdtm"
|| " AND obs_value NOT LIKE {{{SINGLE-QUOTE}}}%(0)%{{{SINGLE-QUOTE}}}"
|| " AND Name <> {{{SINGLE-QUOTE}}}AS SC vte score CAL{{{SINGLE-QUOTE}}}"
|| " AND Name <> {{{SINGLE-QUOTE}}}AS SC vte physician override{{{SINGLE-QUOTE}}} for xml path({{{SINGLE-QUOTE}}}{{{SINGLE-QUOTE}}}) )"
|| " ,{{{SINGLE-QUOTE}}}&lt;{{{SINGLE-QUOTE}}},{{{SINGLE-QUOTE}}}<{{{SINGLE-QUOTE}}} )"
|| " ,{{{SINGLE-QUOTE}}}&gt;{{{SINGLE-QUOTE}}},{{{SINGLE-QUOTE}}}>{{{SINGLE-QUOTE}}} )"
|| " ,{{{SINGLE-QUOTE}}}(1){{{SINGLE-QUOTE}}},{{{SINGLE-QUOTE}}}= 1 point(s){{{SINGLE-QUOTE}}} )"
|| " ,{{{SINGLE-QUOTE}}}(2){{{SINGLE-QUOTE}}},{{{SINGLE-QUOTE}}}= 2 point(s){{{SINGLE-QUOTE}}} )"
|| " ,{{{SINGLE-QUOTE}}}(3){{{SINGLE-QUOTE}}},{{{SINGLE-QUOTE}}}= 3 point(s){{{SINGLE-QUOTE}}} )"
|| " ,{{{SINGLE-QUOTE}}}(5){{{SINGLE-QUOTE}}},{{{SINGLE-QUOTE}}}= 5 point(s){{{SINGLE-QUOTE}}} )"
|| " ,{{{SINGLE-QUOTE}}}; {{{SINGLE-QUOTE}}},{{{SINGLE-QUOTE}}} {{{SINGLE-QUOTE}}} )"
|| " FROM #tmp_obsvalues"
|| " WHERE AuthoredDtm = @maxauthdtm"
|| ""
|| " DROP TABLE #tmp_obsvalues, #tmp_obsdocument, #tmp_clientdocument" };
vtescoredetails.value := flowsheet_score_details;
//determine if the physician override field should be available to the user or not.
if occcode in ("MD","DO","DMD","DPM","CRNP","PA","PA-C","IT") then
vteoverridereason.Control_Visible := TRUE;
vteoverridescore.Control_Visible := TRUE;
vteoverrideobj.Control_Visible := TRUE;
else
vteoverridereason.Control_Visible := FALSE;
vteoverridescore.Control_Visible := FALSE;
vteoverrideobj.Control_Visible := FALSE;
endif;
Guidelines_List.IsReadOnly := (True,True);
Lab_Daily_List.IsReadOnly := (True,True,True,True,True);
local_session.SessionVTEScore := "none entered";
local_session.SessionVTEContraindication := "none entered";
local_session.SessionVTENotIndicated := "none entered";
local_session.SessionVTENotOrdered := "none entered";
tstlocalsession := local_session.SessionVTENotOrdered;
//Hold Session - Date handling. Instead of date (T is found) or(T+(#) is found)
PlusLocation := FIND "+" IN STRING primreqdate.value;
TLocation := FIND "T" IN STRING primreqdate.value;
If TLocation = 1 and PlusLocation = 0 then
primreqdate.value := (now as time);
endif;
If PlusLocation > 0 then
PlusDays := SUBSTRING 1 CHARACTERS STARTING AT LENGTH OF primreqdate.value FROM primreqdate.value ;
primreqdate.value := (now as time) +(PlusDays as number) day;
endif;
startdate:= primreqdate.value;
Order_From.value := primreqdate.value;
secreqdate.value := startdate + 2 days;
thirdreqdate.value := startdate + 4 days;
fourthreqdate.value := startdate + 6 days;
fifthreqdate.value := startdate + 8 days;
Order_To.value := fifthreqdate.value;
prx_comment.value:= primreqdate.value || "," || secreqdate.value || "," || thirdreqdate.value || "," ||
fourthreqdate.value || "," || fifthreqdate.value;
(vtescorefound, vtescorebyfound) := read last
{" set concat_null_yields_null off "
|| " Select top 1 o.ValueText, "
|| " u.DisplayName + {{{SINGLE-QUOTE}}} {{{SINGLE-QUOTE}}} + u.OccupationCode + {{{SINGLE-QUOTE}}} ({{{SINGLE-QUOTE}}} + convert(char(8), cd.authoreddtm,1) + {{{SINGLE-QUOTE}}} {{{SINGLE-QUOTE}}} + convert(char(5), cd.authoreddtm,14) + {{{SINGLE-QUOTE}}}){{{SINGLE-QUOTE}}} "
|| " from CV3ClientDocumentCUR cd "
|| " join CV3ClientDocDetailCUR cdd (nolock) "
|| " on (cdd.ClientDocumentGUID = cd.GUID "
|| " AND cdd.ClientGUID = " || SQL(client_guid) || ")"
|| " join CV3ObservationDocumentCUR od (nolock) "
|| " on cdd.CLientDocumentGUID = od.OwnerGUID "
|| " AND od.active = 1 "
|| " join CV3ObsCatalogMasterItem (nolock) "
|| " on od.ObsMasterItemGUID = CV3ObsCatalogMasterItem.GUID "
|| " join CV3ObservationCUR o (nolock) "
|| " on o.GUID = od.ObservationGUID "
|| " LEFT OUTER JOIN CV3User u (nolock) "
|| " ON o.UserGUID = u.GUID "
|| " join cv3obscatalogitem oci (nolock) "
|| " on oci.guid = o.obsitemguid "
|| " AND oci.name = {{{SINGLE-QUOTE}}}as sc vte score cal{{{SINGLE-QUOTE}}} "
|| " where cd.clientguid = " || SQL(client_guid)
|| " and cd.chartguid = " || SQL(chart_guid)
|| " order by cd.authoreddtm desc "};
vtescore.value:= vtescorefound;
vtescoreby.value:= vtescorebyfound;
if vtescore.value <> "none entered" then
local_session.SessionVTEScore := vtescore.value;
//JML CSR #31182: Auto check IPC if user enters vte risk score of 1 or 2
if ((vtescore.value = "1" OR vtescore.value = "2") and (local_session.SessionVTENotOrdered = "none entered")) then
IPC_List.IsSelected := true;
endif;
endif;
endif; //added by tms
//If CallingEvent = "FieldChange" Then
If ((CallingEvent in ("FieldChange", "FormClose")) and (CallingField <> "MultiOrderGrid|4")) Then
// check for the session object value for the contraindiation field and if filled, grey out Rx orders
//added by sth for physician manual override of VTE score.
if (vteoverridescore.Value is not null and vteoverridescore.value <> "") then
if vtescore.value is null or vtescore.value <> vteoverridescore.Value then
manualscore := vteoverridescore.Value;
vteoverridereason.control_mandatory := TRUE;
ELSE
manualscore := local_session.SessionVTEScore;
vteoverridereason.value := "";
vteoverridereason.control_mandatory := FALSE;
endif;
else
vteoverridereason.value := "";
vteoverridereason.control_mandatory := FALSE;
endif;
//manualscore := local_session.SessionVTEScore; --removed by STH 12-17-2013
contrasessionobject.value:= local_session.SessionVTEContraindication;
notindicatedobject.value := local_session.SessionVTENotIndicated;
if local_session.SessionVTEContraindication = "none entered"
and local_session.SessionVTENotIndicated = "none entered" then
DrugOrders_List.IsReadOnly := (False,False,False,False) ;
endif;
if local_session.SessionVTENotIndicated <> "none entered"
or local_session.SessionVTEContraindication <> "none entered" then
DrugOrders_List.IsReadOnly := (True,True,True,True);
tstdrugorders := "set drugorders_list readonly";
DrugOrders_List.IsSelected := (False,False,False,False);
Lab_Daily_List.IsSelected := (False,False,False,False,False);
Fnd_Daily.IsSelected := False;
if (local_session.SessionVTENotOrdered = "none entered") then
if vtescore.value >= 3 or local_session.SessionVTEScore >= 3 or (manualscore.value as number) >= 3 then
IPC_List.IsSelected := False;
else
IPC_List.IsSelected := TRUE;
endif;
endif;
endif;
if local_session.SessionVTENotOrdered <> "none entered" then
IPC_List.IsSelected := False;
IPC_List.IsReadOnly := true;
else
IPC_List.IsReadOnly := false;
endif;
/*
if local_session.SessionVTEContraindication <> "none entered" then
DrugOrders_List.IsReadOnly := (True,True,True,True) ;
DrugOrders_List.IsSelected := (False,False,False,False);
Lab_Daily_List.IsSelected := (False,False,False,False,False);
Fnd_Daily.IsSelected := False;
if vtescore.value >= 3 or local_session.SessionVTEScore >= 3 or manualscore.value >= 3 then
IPC_List.IsSelected := True;
endif;
endif;
*/
//JML CSR #31182: Auto check IPC if user enters vte risk score of 1 or 2
//STH modified for IPC selecting for CSR #:
if (local_session.SessionVTENotOrdered = "none entered") then
if ((manualscore as number) in (1,2)) then
IPC_List.IsSelected := True;
elseif ((local_session.SessionVTEScore in (1,2) or vtescore.value in (1,2))
and ((manualscore is null) or (manualscore = ""))) then
IPC_List.IsSelected := True;
elseif (((manualscore as number) >= 3) and (local_session.SessionVTEContraindication <> "none entered" )) then
IPC_List.IsSelected := True;
elseif ((local_session.SessionVTEScore >= 3 or vtescore.value >= 3)
and ((manualscore is null) or (manualscore = ""))
and (local_session.SessionVTEContraindication <> "none entered" ))then
IPC_List.IsSelected := True;
// [STH 07.08.2014 - ALLOW IPC ORDER WHEN NO VTE SCORE EXISTS
elseif (((local_session.SessionVTEScore is null) or (local_session.SessionVTEScore = "") or (local_session.SessionVTEScore = "none entered"))
and ((vtescore.value is null) or (vtescore.value = ""))
and ((manualscore is null) or (manualscore = ""))) then
IPC_List.IsSelected := IPC_List.IsSelected;
else
IPC_List.IsSelected := false;
endif;
endif;
If CallingField = "MultiOrderGrid|7" or CallingField = "MultiOrderGrid|5" or CallingField = "StopOrderBox|1" then
If (Found_Hep_Inj1.IsSelected = True) then
(stop, stop_message, severity) := call anticoagulant_conflict WITH (this_communication, this_form, client_info_obj, Found_Hep_Inj1.Name);
if (stop = true) then
if (severity = "high") then
dialogRes := call {{{SINGLE-QUOTE}}}MessageBox{{{SINGLE-QUOTE}}}.Show with stop_message, "Anticoagulant Order Conflict", "OK" as {{{SINGLE-QUOTE}}}MessageBoxButtons{{{SINGLE-QUOTE}}}, "Exclamation" as {{{SINGLE-QUOTE}}}MessageBoxIcon{{{SINGLE-QUOTE}}};
DrugOrders_List.IsSelected := (False, False, False, False);
DrugOrders_List.IsReadOnly := (False, False, False, False);
else
dialogRes := call {{{SINGLE-QUOTE}}}MessageBox{{{SINGLE-QUOTE}}}.Show with stop_message, "Anticoagulant Order Conflict", "YesNo" as {{{SINGLE-QUOTE}}}MessageBoxButtons{{{SINGLE-QUOTE}}}, "Question" as {{{SINGLE-QUOTE}}}MessageBoxIcon{{{SINGLE-QUOTE}}};
if ((dialogRes as String) = "No") then
DrugOrders_List.IsSelected := (False, False, False, False);
DrugOrders_List.IsReadOnly := (False, False, False, False);
else
DrugOrders_List.IsReadOnly := (False, True, True, True);
endif;
endif;
else
DrugOrders_List.IsReadOnly := (False,True,True,True);
endif;
elseIf (Found_Hep_Inj2.IsSelected = True) then
(stop, stop_message, severity) := call anticoagulant_conflict WITH (this_communication, this_form, client_info_obj, Found_Hep_Inj2.Name);
if (stop = true) then
if (severity = "high") then
dialogRes := call {{{SINGLE-QUOTE}}}MessageBox{{{SINGLE-QUOTE}}}.Show with stop_message, "Anticoagulant Order Conflict", "OK" as {{{SINGLE-QUOTE}}}MessageBoxButtons{{{SINGLE-QUOTE}}}, "Exclamation" as {{{SINGLE-QUOTE}}}MessageBoxIcon{{{SINGLE-QUOTE}}};
DrugOrders_List.IsSelected := (False, False, False, False);
DrugOrders_List.IsReadOnly := (False, False, False, False);
else
dialogRes := call {{{SINGLE-QUOTE}}}MessageBox{{{SINGLE-QUOTE}}}.Show with stop_message, "Anticoagulant Order Conflict", "YesNo" as {{{SINGLE-QUOTE}}}MessageBoxButtons{{{SINGLE-QUOTE}}}, "Question" as {{{SINGLE-QUOTE}}}MessageBoxIcon{{{SINGLE-QUOTE}}};
if ((dialogRes as String) = "No") then
DrugOrders_List.IsSelected := (False, False, False, False);
DrugOrders_List.IsReadOnly := (False, False, False, False);
else
DrugOrders_List.IsReadOnly := (True, False, True, True);
endif;
endif;
else
DrugOrders_List.IsReadOnly := (True,False,True,True);
endif;
elseIf (Found_Eno_Inj1.IsSelected = True) then
(stop, stop_message, severity) := call anticoagulant_conflict WITH (this_communication, this_form, client_info_obj, Found_Eno_Inj1.Name);
if (stop = true) then
if (severity = "high") then
dialogRes := call {{{SINGLE-QUOTE}}}MessageBox{{{SINGLE-QUOTE}}}.Show with stop_message, "Anticoagulant Order Conflict", "OK" as {{{SINGLE-QUOTE}}}MessageBoxButtons{{{SINGLE-QUOTE}}}, "Exclamation" as {{{SINGLE-QUOTE}}}MessageBoxIcon{{{SINGLE-QUOTE}}};
DrugOrders_List.IsSelected := (False, False, False, False);
DrugOrders_List.IsReadOnly := (False, False, False, False);
else
dialogRes := call {{{SINGLE-QUOTE}}}MessageBox{{{SINGLE-QUOTE}}}.Show with stop_message, "Anticoagulant Order Conflict", "YesNo" as {{{SINGLE-QUOTE}}}MessageBoxButtons{{{SINGLE-QUOTE}}}, "Question" as {{{SINGLE-QUOTE}}}MessageBoxIcon{{{SINGLE-QUOTE}}};
if ((dialogRes as string) = "No") then
DrugOrders_List.IsSelected := (False, False, False, False);
DrugOrders_List.IsReadOnly := (False, False, False, False);
else
DrugOrders_List.IsReadOnly := (True, True, False, True);
endif;
endif;
else
DrugOrders_List.IsReadOnly := (True,True,False,True);
endif;
elseIf (Found_Eno_Inj2.IsSelected = True) then
(stop, stop_message, severity) := call anticoagulant_conflict WITH (this_communication, this_form, client_info_obj, Found_Eno_Inj2.Name);
if (stop = true) then
if (severity = "high") then
dialogRes := call {{{SINGLE-QUOTE}}}MessageBox{{{SINGLE-QUOTE}}}.Show with stop_message, "Anticoagulant Order Conflict", "OK" as {{{SINGLE-QUOTE}}}MessageBoxButtons{{{SINGLE-QUOTE}}}, "Exclamation" as {{{SINGLE-QUOTE}}}MessageBoxIcon{{{SINGLE-QUOTE}}};
DrugOrders_List.IsSelected := (False, False, False, False);
DrugOrders_List.IsReadOnly := (False, False, False, False);
else
dialogRes := call {{{SINGLE-QUOTE}}}MessageBox{{{SINGLE-QUOTE}}}.Show with stop_message, "Anticoagulant Order Conflict", "YesNo" as {{{SINGLE-QUOTE}}}MessageBoxButtons{{{SINGLE-QUOTE}}}, "Question" as {{{SINGLE-QUOTE}}}MessageBoxIcon{{{SINGLE-QUOTE}}};
if ((dialogRes as string) = "No") then
DrugOrders_List.IsSelected := (False, False, False, False);
DrugOrders_List.IsReadOnly := (False, False, False, False);
else
DrugOrders_List.IsReadOnly := (True, True, True, False);
endif;
endif;
else
DrugOrders_List.IsReadOnly := (True,True,True,False);
endif;
else
DrugOrders_List.IsReadOnly := (False,False,False,False);
endif;
endif; // multiordergrid 7
If CallingField = "MultiOrderGrid|7" or CallingField = "MultiOrderGrid|5" or CallingField = "StopOrderBox|1" then
If (Found_Hep_Inj1.IsSelected = True or Found_Hep_Inj2.IsSelected = True or Found_Eno_Inj1.IsSelected = True or Found_Eno_Inj2.IsSelected = True) then
Lab_Daily_List.IsReadOnly := (True,True,True,True,True);
Lab_Daily_List.IsSelected := (True,True,True,True,True);
Fnd_Daily.IsReadOnly := True;
Fnd_Daily.IsSelected := True;
IPC_List.IsSelected := False;
else
Lab_Daily_List.IsSelected := (False,False,False,False,False);
Fnd_Daily.IsSelected := False;
endif;
ElseIf CallingField = "RequestedDate|1" then
//Set the four remaining order set date fields based on the starting date
yr := extract year now;
mn := extract month now; if mn < 10 then mn := "0" || mn; endif;
dd := extract day now; if dd < 10 then dd := "0" || dd; endif;
today:= yr || "-" || mn || "-" || dd || "T00:00:00";
tomorrow := (today as time) +1 day;
tom_list := call str_parse with tomorrow, " ";
tom_dte := first(tom_list);
lesstomorrow := primreqdate.value < tomorrow;
If lesstomorrow = true then
this_communication.DisplayForm := "Yes";
this_communication.Message := "You may not enter a date earlier than tomorrow (" || tom_dte || ")";
this_communication.MessageType := "Error";
primreqdate.value := tomorrow;
endif;
startdate:= primreqdate.value;
Order_From.value := primreqdate.value;
secreqdate.value := startdate + 2 days;
thirdreqdate.value := startdate + 4 days;
fourthreqdate.value := startdate + 6 days;
fifthreqdate.value := startdate + 8 days;
Order_To.value := fifthreqdate.value;
prx_comment.value:= primreqdate.value || "," || secreqdate.value || "," || thirdreqdate.value || "," ||
fourthreqdate.value || "," || fifthreqdate.value;
endif; // multiodergrid 7
endif;
// elseif CallingEvent = "FormClose" then
If CallingEvent = "FormClose" then
If (Found_Hep_Inj1.IsSelected = True or Found_Hep_Inj2.IsSelected = True or Found_Eno_Inj1.IsSelected = True
or Found_Eno_Inj2.IsSelected = True) then
If (Found_Base_CBC.IsSelected =false) then
CBC_Val := read last
{"Select top 1 o.Name"
|| " From cv3order as o with (nolock) "
|| " join cv3ordercatalogmasteritem as ocmi with (nolock) "
|| " on ocmi.guid = o.ordercatalogmasteritemguid "
|| " and ocmi.active = 1 "
|| " and ocmi.name in ({{{SINGLE-QUOTE}}}CBC (Includes Diff){{{SINGLE-QUOTE}}},{{{SINGLE-QUOTE}}}CBC No Diff (Hemogram Only){{{SINGLE-QUOTE}}},{{{SINGLE-QUOTE}}}CBC with Manual Diff{{{SINGLE-QUOTE}}}) "
|| " where o.clientguid = " || SQL(client_guid)
|| " and o.chartguid = " || SQL(chart_guid)
|| " and o.requesteddtm >= (DATEADD(hour, -24, getdate())) "
|| " and o.requesteddtm <= getdate() "
|| " and o.OrderStatusLevelNum > 15 "
|| " and o.OrderStatusLevelNum not in (69, 70) "
|| " order by o.requesteddtm desc "};
If exists CBC_Val then
CheckCBC:=False;
else
CheckCBC:=True;
Found_Base_CBC.ISSelected :=True;
endif;
endif;
endif;
If (Found_Eno_Inj1.IsSelected = True or Found_Eno_Inj2.IsSelected = True) then
If (Found_Base_Creatinine.IsSelected =false) then
Creatinine_Val := read last
{"Select top 1 o.Name"
|| " From cv3order as o with (nolock) "
|| " join cv3ordercatalogmasteritem as ocmi with (nolock) "
|| " on ocmi.guid = o.ordercatalogmasteritemguid "
|| " and ocmi.active = 1 "
|| " where o.clientguid = " || SQL(client_guid)
|| " and ocmi.name in ({{{SINGLE-QUOTE}}}Creatinine{{{SINGLE-QUOTE}}},{{{SINGLE-QUOTE}}}Comprehensive Metabolic Panel{{{SINGLE-QUOTE}}},{{{SINGLE-QUOTE}}}Basic Metabolic Panel{{{SINGLE-QUOTE}}}, "
|| " {{{SINGLE-QUOTE}}}Renal Panel{{{SINGLE-QUOTE}}},{{{SINGLE-QUOTE}}}Comprehensive Metabolic Panel Fasting{{{SINGLE-QUOTE}}}, "
|| " {{{SINGLE-QUOTE}}}Basic Metabolic Panel Fasting{{{SINGLE-QUOTE}}},{{{SINGLE-QUOTE}}}Renal Panel Fasting{{{SINGLE-QUOTE}}}) "
|| " and o.chartguid = " || SQL(chart_guid)
|| " and o.requesteddtm >= (DATEADD(hour, -24, getdate())) "
|| " and o.requesteddtm <= getdate() "
|| " and o.OrderStatusLevelNum > 15 "
|| " and o.OrderStatusLevelNum not in (69, 70) "
|| " order by o.requesteddtm desc "};
If exists Creatinine_Val then
CheckCreatinine:=False;
else
CheckCreatinine:=True;
Found_Base_Creatinine.ISSelected :=True;
endif;
endif;
//////////////////////
// Now find if there are already CBC{{{SINGLE-QUOTE}}}s ordered in the future...
// Reset the check boxes if they are.
formlist := call str_parse with prx_comment.value, ",";
end_date := fifthreqdate.value + 1 day;
CBC_daily_dates :=();
CBC_daily_dates := read
{"Select distinct top 20 "
|| " convert(char(6),o.requesteddtm,110) +convert(char(4), o.requesteddtm,20) + {{{SINGLE-QUOTE}}} 00:00:00{{{SINGLE-QUOTE}}}"
|| " From cv3order as o with (nolock) "
|| " join cv3ordercatalogmasteritem as ocmi with (nolock) "
|| " on ocmi.guid = o.ordercatalogmasteritemguid "
|| " and ocmi.active = 1 "
|| " and ocmi.name in ({{{SINGLE-QUOTE}}}CBC (Includes Diff){{{SINGLE-QUOTE}}},{{{SINGLE-QUOTE}}}CBC No Diff (Hemogram Only){{{SINGLE-QUOTE}}},{{{SINGLE-QUOTE}}}CBC with Manual Diff{{{SINGLE-QUOTE}}}) "
|| " where o.clientguid = " || SQL(client_guid)
|| " and o.chartguid = " || SQL(chart_guid)
|| " and o.requesteddtm >= " || SQL(primreqdate.value)
|| " and o.requesteddtm < " || SQL(end_date)
|| " and o.OrderStatusLevelNum > 15 "
|| " and o.OrderStatusLevelNum not in (69, 70) "
|| " and o.orderstatuscode <> {{{SINGLE-QUOTE}}}MASTR{{{SINGLE-QUOTE}}} "};
If exist(CBC_daily_dates) then
Reset_CBC_Grid:= ();
singledate := "";
index_list := 1 seqto (count formlist) ;
for J in index_list do
singledate := formlist[J];
Reset_CBC_Grid:= Reset_CBC_Grid, singledate not in CBC_daily_dates;
enddo;
Lab_Daily_List.IsSelected := (Reset_CBC_Grid);
endif; //If exist
endif; // 1 of 2 heparin boxes checked
endif;
// Stop from closing form if no anticoagulant has been ordered, contraindication or not indicated reason has been documented.
If CallingEvent = "FormClose" then
if (vteoverridereason.value is not null
and vteoverridereason.value <> ""
and vteoverridescore.Value is not null
and vteoverridescore.Value <> "") then
physicianoverridedetails.value := "Physician override score = " || vteoverridescore.Value || ". Reason = " || vteoverridereason.value || ".";
physicianoverridedetails.value := physicianoverridedetails.value || " Created By: " || this_communication.CareProviderDisplayName || " (" || OccCode || ")";
endif;
If (Found_Hep_Inj1.IsSelected = false and Found_Hep_Inj2.IsSelected = false and Found_Eno_Inj1.IsSelected = false
and Found_Eno_Inj2.IsSelected = false and local_session.SessionVTEContraindication = "none entered"
and local_session.SessionVTENotIndicated = "none entered"
and (((vtescore.value >= 3 or local_session.SessionVTEScore >= 3) and (manualscore is null or manualscore = ""))
or ((manualscore as number) >= 3))) then
hardstop := "yes";
else
hardstop := "no";
endif;
If exists StopOrderBox then
If hardstop = "yes" then
this_communication.DisplayForm := "yes";
this_communication.Message := ReasonMessage;
this_communication.MessageType := "Error";
StopOrderBoxValue.control_mandatory := TRUE;
else
StopOrderBoxValue.control_mandatory := FALSE;
endif;
endif;
Med_Order_Mgt := mlm {{{SINGLE-QUOTE}}}FORM_SET_Rx_Medication_Order_Mgt{{{SINGLE-QUOTE}}};
(this_communication, this_form) := call Med_Order_Mgt with this_communication, this_form, client_info_obj;
endif;
If ((CallingEvent = "FieldChange") and (CallingField = "MultiOrderGrid|4")) Then
if local_session.SessionVTENotOrdered <> "none entered" then
IPC_List.IsSelected := False;
IPC_List.IsReadOnly := true;
endif;
endif;
;;
evoke: // No evoke statement
;;
logic:
conclude true;
;;
action:
// This MLM returns two parameters, of types communication_type and form_type respectively.
return this_communication, this_form;
;;
end: