Files
St.Clair/MLMStripper/bin/Debug/DOC/DOC_FUNC_FALL_HARM_RISK.mlm

345 lines
15 KiB
Plaintext

maintenance:
title: DOC_FUNC_FALL_HARM_RISK;;
mlmname: DOC_FUNC_FALL_HARM_RISK;;
arden: version 2.5;;
version: 5.50;;
institution: Allscripts;;
author: Juliet M. Law ;;
specialist: ;;
date: 2013-12-13;;
validation: testing;;
library:
purpose: Automatically check observations under the Fall Harm Risk section on the
Adult Assessment / Intervention Flowsheet..
;;
explanation: On the Adult Assessment/Intervention Flowsheet, automatically check several observations
based on patient having a "History of Fall in Past 6 months" significant event.
Change History
12.13.2013 JML Created
03.17.2014 JML Modified MLM to optimize SQL queries to handle SCM flowsheet freezing issue;
saving observation values for UDDIs with textbox type in values.
11.19.2015 JML WO #1947083: Modified MLM to not include completed anticoagulant orders
when determining auto-checking of "therapeutic anticoag..." observation.
11.07.2018 JML CSR 37204: Removed code for observations that were inactivated on the flowsheet under
the Fall / Harm Risk Assessment category.
;;
keywords: fall, risk, flowsheet
;;
knowledge:
type: data-driven;;
data:
// RS ADD Message box
standard_libs := mlm {{{SINGLE-QUOTE}}}std_include_libs{{{SINGLE-QUOTE}}};
include standard_libs;
//Include ObjectsPlus Assemblies
using "ObjectsPlusXA.SCM.Forms";
using namespace "ObjectsPlusXA.SunriseClinicalManager.Forms";
(thisDocumentCommunication) := argument;
/**************Make Changes To Spelling And Flags In This Section**************/
//Set up variables; initialize
fire_on_param := "SCHCK_INV Universal INV";
//Document Type
FLOWSHEET := "FlowSheet";
//Event Types
CHARTOBSERVATION := "ChartObservation";
DOCUMENTCLOSING := "DocumentClosing";
/******************************************************************************/
// Create prototypes for the object types we{{{SINGLE-QUOTE}}}ll need to instantiate
ObservationType := OBJECT [ObservationGUID, ClientDocumentGUID, ParameterGUID, DataType, ValueObj];
FreeTextValueType := OBJECT [Value];
ListValueType := OBJECT [ListGuid, ListItemsList, SuggestedTextValue];
ListValueListItemType := OBJECT [ListItemGUID, Value, IsSelected];
//Set Flowsheet DocumentCommunication object model variables via Called MLM
(this_fs_doc) := thisDocumentCommunication.DocumentConfigurationObj;
(this_parameters) := this_fs_doc.ParametersList;
(this_currentObs) := thisDocumentCommunication.CurrentObservationObj;
(this_cols) := this_fs_doc.ColumnsList;
(this_curr_col) := this_fs_doc.CurrentColumn;
(this_chartedObs) := this_curr_col.ChartedObservationsList;
document_type := thisDocumentCommunication.DocumentType;
event_type := thisDocumentCommunication.EventType;
client_guid := thisDocumentCommunication.ClientGUID;
visit_guid := thisDocumentCommunication.ClientVisitGUID;
chart_guid := thisDocumentCommunication.ChartGUID;
anticoag_exists := false;
check_fall_history := read last {"SELECT 1"
|| " FROM CV3ClientEventDeclaration ced WITH (NOLOCK)"
|| " WHERE ced.ClientGUID = " || Sql(client_guid)
|| " AND ced.Active = 1"
|| " AND ced.Status = {{{SINGLE-QUOTE}}}Active{{{SINGLE-QUOTE}}}"
|| " AND ced.TypeCode IN ({{{SINGLE-QUOTE}}}Fall{{{SINGLE-QUOTE}}},{{{SINGLE-QUOTE}}}Fall History{{{SINGLE-QUOTE}}})"
|| " AND DATEDIFF(MONTH, ced.CreatedWhen, GetDate()) <= 6"};
patientAge := read last {"SELECT CASE"
|| " WHEN ((c.BirthMonthNum > MONTH(getdate())) "
|| " OR (c.BirthMonthNum = MONTH(getdate()) and c.BirthDayNum > DAY(getdate()))) then"
|| " Convert(char(3),(YEAR(getdate()) - c.BirthYearNum) - 1)"
|| " ELSE"
|| " Convert(char(3),(YEAR(GETDATE()) - c.BirthYearNum))"
|| " END"
|| " FROM CV3Client c WITH (NOLOCK) "
|| " WHERE c.GUID = " || Sql(client_guid)};
patientBMI := read last {"Select TOP 1 o.ValueText"
|| " from CV3ClientDocumentCUR cd WITH (NOLOCK) join CV3ClientDocDetailCUR cdd WITH (NOLOCK) "
|| " on cdd.ClientDocumentGUID = cd.GUID"
|| " join CV3ObservationDocumentCUR od WITH (NOLOCK) "
|| " on cdd.CLientDocumentGUID = od.OwnerGUID "
|| " join CV3ObsCatalogMasterItem ocmi WITH (NOLOCK) "
|| " on od.ObsMasterItemGUID = ocmi.GUID "
|| " join CV3ObservationCUR o WITH (NOLOCK) "
|| " on o.GUID = od.ObservationGUID "
|| " join cv3obscatalogitem oci WITH (NOLOCK) "
|| " on oci.guid = o.obsitemguid "
|| "where cd.clientguid = " || Sql(client_guid)
|| " and cd.ClientVisitGUID = " || Sql(visit_guid)
|| " and cd.chartguid = " || Sql(chart_guid)
|| " and o.ValueText is not null "
|| " and od.active = 1"
|| " and oci.name = {{{SINGLE-QUOTE}}}SCH_vs_BMI{{{SINGLE-QUOTE}}}"
|| "order by cd.authoreddtm desc "};
check_platelet_count := read last {"SELECT TOP 1 bo.Value"
|| " 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 CV3BasicObservation bo WITH (NOLOCK)"
|| " ON o.GUID = bo.OrderGUID"
|| " AND o.ClientGUID = bo.ClientGUID"
|| " AND o.ClientVisitGUID = bo.ClientVisitGUID"
|| " WHERE bo.ClientGUID = " || Sql(client_guid)
|| " AND bo.ClientVisitGUID = " || Sql(visit_guid)
|| " AND bo.ChartGUID = " || Sql(chart_guid)
|| " AND bo.ItemName IN ({{{SINGLE-QUOTE}}}Platelet Count{{{SINGLE-QUOTE}}},{{{SINGLE-QUOTE}}}Platelet Count.{{{SINGLE-QUOTE}}})"
|| " AND ((o.OrderStatusLevelNum > 15"
|| " AND o.OrderStatusLevelNum NOT IN ({{{SINGLE-QUOTE}}}69{{{SINGLE-QUOTE}}},{{{SINGLE-QUOTE}}}70{{{SINGLE-QUOTE}}}))"
|| " OR o.OrderStatusCode = {{{SINGLE-QUOTE}}}HOLD{{{SINGLE-QUOTE}}})"
|| " ORDER BY bo.CreatedWhen DESC"};
(check_anticoag_order,
anticoag_order_dose) := read last {"SELECT TOP 1 o.Name, ot.OrderDosageLow"
|| " FROM CV3ClientVisit cv WITH (NOLOCK) JOIN CV3Order o WITH (NOLOCK)"
|| " ON cv.GUID = o.ClientVisitGUID"
|| " AND cv.ClientGUID = o.ClientGUID"
|| " JOIN CV3OrderTask ot WITH (NOLOCK)"
|| " ON o.GUID = ot.OrderGUID"
|| " AND o.ClientGUID = ot.ClientGUID"
|| " AND o.ChartGUID = ot.ChartGUID"
|| " JOIN CV3OrderTaskOccurrence oto WITH (NOLOCK)"
|| " ON ot.GUID = oto.OrderTaskGUID"
|| " AND ot.ClientGUID = oto.ClientGUID"
|| " WHERE o.ClientGUID = " || Sql(client_guid)
|| " AND o.ClientVisitGUID = " || Sql(visit_guid)
|| " AND o.ChartGUID = " || Sql(chart_guid)
|| " AND o.TypeCode = {{{SINGLE-QUOTE}}}Medication{{{SINGLE-QUOTE}}}"
|| " AND o.Active = 1"
|| " AND"
|| " ( o.Name LIKE {{{SINGLE-QUOTE}}}%Enoxaparin%{{{SINGLE-QUOTE}}}"
|| " OR o.Name LIKE {{{SINGLE-QUOTE}}}%Heparin%25,000%{{{SINGLE-QUOTE}}}"
|| " OR o.Name LIKE {{{SINGLE-QUOTE}}}%Heparin%Infusion%{{{SINGLE-QUOTE}}}"
|| " OR o.Name LIKE {{{SINGLE-QUOTE}}}%Heparin%Prisma%{{{SINGLE-QUOTE}}}"
|| " OR o.Name LIKE {{{SINGLE-QUOTE}}}%Warfarin%{{{SINGLE-QUOTE}}}"
|| " OR o.Name LIKE{{{SINGLE-QUOTE}}}%Dabigatran%{{{SINGLE-QUOTE}}} "
|| " OR o.Name LIKE {{{SINGLE-QUOTE}}}%Rivaroxaban%{{{SINGLE-QUOTE}}}"
|| " OR o.Name LIKE {{{SINGLE-QUOTE}}}%Fondaparinux%{{{SINGLE-QUOTE}}}"
|| " OR o.Name LIKE {{{SINGLE-QUOTE}}}%Argatroban%{{{SINGLE-QUOTE}}}"
|| " OR o.Name LIKE {{{SINGLE-QUOTE}}}%Apixaban%{{{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}}})"
|| " ORDER BY o.CreatedWhen DESC"};
if (document_type = FLOWSHEET AND event_type = CHARTOBSERVATION) then
//*************** UNIVERSAL INTERVENTIONS **************************
//Autocheck all values under "Universal Interventions" Observation
univIndParameter := first of (this_parameters WHERE this_parameters.Name = fire_on_param);
if (exists univIndParameter) then
//Define parameter ConfigurationObj to extract Suggested Text value
univIndListConfiguration := univIndParameter.ConfigurationObj;
univIndObs := first of ( this_chartedObs WHERE this_chartedObs.ParameterGUID = univIndParameter.ParameterGUID);
this_currentObj := NEW ObservationType;
this_currentObj.ClientDocumentGUID := this_fs_doc.ClientDocumentGUID;
this_currentObj.ParameterGUID := univIndParameter.ParameterGUID;
this_currentObj.DataType := "ListValue";
this_currentObj.ValueObj := NEW ListValueType;
this_currentObj.ValueObj.ListGUID := univIndParameter.ConfigurationObj.ListGUID;
//Determine if ListValue parameter allows for text type in in addition to list values
if ( univIndListConfiguration.AllowsSuggestedText = true ) then
//Determine if user typed something in
if ( exists univIndObs.ValueObj.SuggestedTextValue ) then
//Save it to the ListValueType object (defined above)
this_currentObj.ValueObj.SuggestedTextValue := univIndObs.ValueObj.SuggestedTextValue;
endif;
endif;
listItems := ();
for item IN univIndParameter.ConfigurationObj.ListItemsList Do
selectedItem := NEW ListValueListItemType;
selectedItem.ListItemGUID := item.ListItemGUID;
selectedItem.Value := item.Value;
selectedItem.IsSelected := true;
listItems := (listItems, selectedItem);
enddo;
this_currentObj.ValueObj.ListItemsList := listItems;
this_fs_doc.CurrentColumn.ChartedObservationsList := (this_fs_doc.CurrentColumn.ChartedObservationsList, this_currentObj);
endif;
//*********** HIGH FALL RISK ASSESSMENT **************************
//Query for "Fall History" significant Event
fallRiskParam := first of (this_parameters WHERE this_parameters.Name = "SCHCK_AS High Fall Risk Assm");
if (exists fallRiskParam) then
(fallRiskObs) := first of (this_chartedObs WHERE this_chartedObs.ParameterGUID = fallRiskParam.ParameterGUID);
(fallRiskValues) := (fallRiskObs.ValueObj.ListItemsList.Value WHERE fallRiskObs.ValueObj.ListItemsList.IsSelected = true);
this_currentObj2 := NEW ObservationType;
this_currentObj2.ClientDocumentGUID := this_fs_doc.ClientDocumentGUID;
this_currentObj2.ParameterGUID := fallRiskParam.ParameterGUID;
this_currentObj2.DataType := "ListValue";
this_currentObj2.ValueObj := NEW ListValueType;
this_currentObj2.ValueObj.ListGUID := fallRiskParam.ConfigurationObj.ListGUID;
listItems := ();
for item IN fallRiskParam.ConfigurationObj.ListItemsList do
selectedItem := NEW ListValueListItemType;
selectedItem.ListItemGUID := item.ListItemGUID;
selectedItem.Value := item.Value;
if ((selectedItem.Value = "*History of Fall in Past 6 Months") AND (exists check_fall_history)) then
selectedItem.IsSelected := true;
elseif (( selectedItem.Value = "No Indicators Present") AND ( count fallRiskValues > 0 )) then
if ( ( count fallRiskValues = 1 ) AND ( "No Indicators Present" IN fallRiskValues ) ) then
selectedItem.IsSelected := true;
elseif ( ( count fallRiskValues > 1 ) AND ( "No Indicators Present" IN fallRiskValues ) ) then
selectedItem.IsSelected := false;
else
selectedItem.IsSelected := false;
endif;
elseif (selectedItem.Value IN fallRiskValues) then
selectedItem.IsSelected := true;
else
selectedItem.IsSelected := false;
endif;
listItems := (listItems, selectedItem);
enddo;
this_currentObj2.ValueObj.ListItemsList := listItems;
this_fs_doc.CurrentColumn.ChartedObservationsList := (this_fs_doc.CurrentColumn.ChartedObservationsList, this_currentObj2);
endif;
//*********************** HARM RISK ASSESSMENT *********************************
//Determine if obs need auto checked under the Harm Risk Assessment
//Retrieve the HARM Risk Assessment observation
harmRiskAssm := "SCHCK_AS Harm Risk Assm";
harmRiskAssmParam := first of (this_parameters WHERE this_parameters.Name = harmRiskAssm);
if (exists harmRiskAssmParam) then
(harmRiskAssmObs) := first of (this_chartedObs WHERE this_chartedObs.ParameterGUID = harmRiskAssmParam.ParameterGUID);
harmRiskAssmValues := (harmRiskAssmObs.ValueObj.ListItemsList.Value
WHERE harmRiskAssmObs.ValueObj.ListItemsList.IsSelected = true);
this_currentObj4 := NEW ObservationType;
this_currentObj4.ClientDocumentGUID := this_fs_doc.ClientDocumentGUID;
this_currentObj4.ParameterGUID := harmRiskAssmParam.ParameterGUID;
this_currentObj4.DataType := "ListValue";
this_currentObj4.ValueObj := NEW ListValueType;
this_currentObj4.ValueObj.ListGUID := harmRiskAssmParam.ConfigurationObj.ListGUID;
listItems := ();
for item IN harmRiskAssmParam.ConfigurationObj.ListItemsList do
selectedItem := NEW ListValueListItemType;
selectedItem.ListItemGUID := item.ListItemGUID;
selectedItem.Value := item.Value;
if ( ( ( patientAge as number ) >= 85 ) AND ( selectedItem.Value = "*Age 85 or Greater" ) ) then
selectedItem.IsSelected := true;
endif;
if ( ( ( patientBMI as number ) < 20 ) AND ( selectedItem.Value = "*BMI Less than 20, Frail" ) ) then
selectedItem.IsSelected := true;
endif;
if ( selectedItem.Value matches pattern "*Therapeutic Anticoag%" ) then
if ( exists check_anticoag_order ) then
if ( ( check_anticoag_order matches pattern "Enoxaparin%" ) AND ( ( anticoag_order_dose as number ) > 40 ) ) then
anticoag_exists := true;
selectedItem.IsSelected := true;
elseif ( ( check_anticoag_order matches pattern "Rivaroxaban%" ) AND ( ( anticoag_order_dose as number ) > 10 ) ) then
anticoag_exists := true;
selectedItem.IsSelected := true;
elseif ( ( NOT check_anticoag_order matches pattern "Enoxaparin%" ) AND ( NOT check_anticoag_order matches pattern "Rivaroxaban%" ) ) then
anticoag_exists := true;
selectedItem.IsSelected := true;
endif;
elseif ( ( exists check_platelet_count ) AND ( ( check_platelet_count as number ) <= 50 ) ) then
selectedItem.IsSelected := true;
endif;
endif;
if ( ( selectedItem.Value = "No Indicators Present" ) AND ( count harmRiskAssmValues > 0 ) ) then
if ( ( count harmRiskAssmValues = 1 ) AND ( "No Indicators Present" IN harmRiskAssmValues ) ) then
selectedItem.IsSelected := true;
elseif ( ( count harmRiskAssmValues > 1 ) AND ( "No Indicators Present" IN harmRiskAssmValues ) ) then
selectedItem.IsSelected := false;
endif;
elseif ( selectedItem.Value IN harmRiskAssmValues ) then
selectedItem.IsSelected := true;
endif;
listItems := (listItems, selectedItem);
enddo;
this_currentObj4.ValueObj.ListItemsList := listItems;
this_fs_doc.CurrentColumn.ChartedObservationsList := (this_fs_doc.CurrentColumn.ChartedObservationsList, this_currentObj4);
endif;
endif;
;;
priority: 50
;;
evoke:
;;
logic: conclude true;
;;
action:
return thisDocumentCommunication;
;;
Urgency: 50;;
end: