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: