793 lines
31 KiB
Plaintext
793 lines
31 KiB
Plaintext
maintenance:
|
|
|
|
title: Advanced Duplicate Order Checking;;
|
|
mlmname: STD_DUPLICATE;;
|
|
arden: version 2.5;;
|
|
version: 18.4;;
|
|
institution: Allscripts, Standard MLM;;
|
|
author: Allscripts Healthcare Solutions, Inc.;;
|
|
specialist: ;;
|
|
date: 2018-10-26;;
|
|
validation: testing;;
|
|
|
|
/* P r o p r i e t a r y N o t i c e */
|
|
/* Unpublished (c) 2013 - 2018 Allscripts Healthcare, LLC. and/or its affiliates. All Rights Reserved.
|
|
|
|
P r o p r i e t a r y N o t i c e: This software has been provided pursuant to a License Agreement, with
|
|
Allscripts Healthcare, LLC. and/or its affiliates, containing restrictions on its use. This software contains
|
|
valuable trade secrets and proprietary information of Allscripts Healthcare, LLC. and/or its affiliates and is
|
|
protected by trade secret and copyright law. This software may not be copied or distributed in any form or medium,
|
|
disclosed to any third parties, or used in any manner not provided for in said License Agreement except with prior
|
|
written authorization from Allscripts Healthcare, LLC. and/or its affiliates. Notice to U.S. Government Users:
|
|
This software is {{{SINGLE-QUOTE}}}Commercial Computer Software{{{SINGLE-QUOTE}}}.
|
|
|
|
All product names are the trademarks or registered trademarks of Allscripts Healthcare, LLC. and/or its affiliates.
|
|
*/
|
|
/* P r o p r i e t a r y N o t i c e */
|
|
|
|
library:
|
|
purpose: Provide Advanced Duplicate-Order Checking and Actions on Alerts.
|
|
The checking will include:
|
|
1. Orders of the same name or type within a pre-defined date range,
|
|
which will be varied by patient location.
|
|
2. Active orders of the same type/class.
|
|
3. IV-additives.
|
|
4. Resulted orders of community results of the same name within a pre-defined date range.
|
|
;;
|
|
explanation: An Evoking-Order is considered a duplicate of Other-Orders when all of
|
|
the criteria listed below are met:
|
|
a. The evoking-order is one of the following events: new order or outpatient order, released from hold,
|
|
activated from a conditional order, unsuspended, verified, or an order or outpatient order that
|
|
has been modified.
|
|
b. If the evoking object is a modified order or outpatient order, only an order with changes to the
|
|
SignificantDtm or the StopDtm will be checked for duplicate orders.
|
|
c. The evoking-order has an order status level number between 0-50 (AWPA-AUA10),
|
|
excluding 15 = HOLD.
|
|
d. The evoking-order is not excluded from duplicate checking
|
|
(over-all or by patient location).
|
|
e. The orders have identical Item Names, or the other-order matches the Item or
|
|
Class-Name & Value listed in the evoking-order{{{SINGLE-QUOTE}}}s item-catalog
|
|
duplicate-checking panel.
|
|
f. The other-orders are within the scoping rules for the patient location listed
|
|
in the evoking-order{{{SINGLE-QUOTE}}}s Duplicate Policy. The patient{{{SINGLE-QUOTE}}}s location is based on
|
|
the location-business-rules established by the facility for other parts of
|
|
Sunrise Clinical Manager.
|
|
g. The IsConditional status match between the evoking-order and the other-order.
|
|
h. Neither the evoking-order or the other-order are suspended.
|
|
i. Neither the evoking-order or the other-order are Master Repeat Orders.
|
|
j. The evoking-order conflicts with another current/active order,
|
|
or resources could be wasted if both orders are completed.
|
|
The radio-buttons in the item-catalog--duplicate panel determine
|
|
which situation may be occurring.
|
|
* CONFLICTING ORDER: If the radio-button for
|
|
"Based on Start and Stop Date (like medication orders)"
|
|
is selected, then only "current" orders with over-lapping
|
|
start (significant) & stop-times are considered conflicting orders.
|
|
Current orders have an order status level number
|
|
between 0-50, excluding HOLD, CANC, CANP, CAND, CANT, COMPA,
|
|
HISE, HISI, DISC, DISCD and DISCT.
|
|
These orders can be unsubmitted orders or orders already in the database.
|
|
* WASTING RESOURCES: If the radio-button for
|
|
"Based on Significant Date and Time (like diagnostic orders)"
|
|
is selected, then other "current, scheduled, or completed" orders within
|
|
the pre-defined time ranges are potential duplicates that could
|
|
waste resources. These other-orders will have an order status level
|
|
number between 0-100, excluding HOLD, CANC, CANP, CAND, CANT, COMPA,
|
|
HISE, HISI, DISC, DISCD and DISCT.
|
|
They can be unsubmitted orders or orders already in the database
|
|
or resulted orders from community
|
|
k. The evoking-order conflicts with existing orders belonging to the session
|
|
types as defined in the following list variables (e.g.
|
|
at_discharge_session_list, at_in_house_session_list,
|
|
at_historical_session_list, or at_outpatient_session_list).
|
|
The list variable corresponding to the session type of the entered order is used.
|
|
l. The facility can set MLM flag to allow the site to determine whether they want to
|
|
see Duplicate alerts for resulted orders from Community Results upon an order being
|
|
entered or modified. Set the flag to True to turn on Community Results checking.
|
|
The default = False;
|
|
|
|
enable_community_data_results_alerts := False;
|
|
|
|
m. The facility can set MLM flag to allow the site to match the resulted
|
|
order of community results using the order name if the resulted order cannot
|
|
be mapped to an item catalog item.
|
|
The default = False;
|
|
|
|
enable_Diagnostic_Duplicate_Check_by_Community_Order_Name := False;
|
|
|
|
n. The facility can set MLM flag to allow the site to control the "text" that is displayed in
|
|
the alert message for Community Results workflows versus Sunrise Orders.
|
|
The default = "Community". The alert text is configurable.
|
|
|
|
community_resultedOrder_alert_text := "Community";
|
|
|
|
Once a duplicate-order has been identified, selection of the appropriate message
|
|
is based on: (1) the defined MESSAGE TYPE in the item-catalog, (2) if appropriate,
|
|
the time period of the significant date (performed, exact, or scheduled), and
|
|
(3)if the message type is "exact" and the time period is "performed" or "scheduled,"
|
|
then a third criteria of "order without specific stop-date" will be added to
|
|
select the correct message.
|
|
|
|
The SEND_ALERT variable indicates whether to send the message or not.
|
|
The values are:
|
|
"", or blank = use the {{{SINGLE-QUOTE}}}Send with order{{{SINGLE-QUOTE}}} flag set in the AlertTypes dictionary
|
|
(NOTE that default setting of flag is unchecked. If the flag is
|
|
checked and this variable is left blank or "" all of the alerts
|
|
for this MLM will be sent with the order.)
|
|
"DoNotSend" = do not send the alert regardless of the AlertTypes dictionary
|
|
setting for the {{{SINGLE-QUOTE}}}Send with order{{{SINGLE-QUOTE}}} flag
|
|
"Send" = send the alert regardless of the AlertTypes dictionary setting
|
|
for the {{{SINGLE-QUOTE}}}Send with order{{{SINGLE-QUOTE}}} flag
|
|
|
|
|
|
The GENERATE_ACTIONS_ON_ALERTS variable indicates whether to generate
|
|
Actions on Alerts. The values are:
|
|
* TRUE = Generate Actions on Alerts
|
|
* FALSE = Do NOT generate Actions on Alerts
|
|
|
|
The ORDER STATUS LEVEL FLAGS determine what order statuses are retrieved
|
|
from the database and the unsubmitted orders. A facility may wish to
|
|
increase/decrease the order status numbers to retrieve more/less
|
|
order statuses that should be checked for duplicates.
|
|
However, increasing the "highest_status_level_for_meds" beyond 50
|
|
for MEDS may slow performance since large numbers of orders are returned
|
|
and are eventually discarded because their start and stop dates do not overlap.
|
|
Examples of setting are:
|
|
* 0-100 includes all order statuses
|
|
* 0-50 includes all "active/current" orders
|
|
* 40-50 includes orders from Pending to Active (excludes Pending Verification)
|
|
|
|
|
|
Complex and Multiple Frequencies Orders:
|
|
When retrieving unsubmitted and existing database orders, this MLM will consider
|
|
whether the order is:
|
|
- that have a start and stop time (like medication orders)
|
|
- that have a Significant date and time like (diagnositic orders)
|
|
This configuration is set in the Item Catalog Duplicate Checking option
|
|
|
|
Orders that have a start and stop time (like medication orders) will check
|
|
not check child orders (ComplexOrderType of 2,4,6)that exist in the database
|
|
or in the unsubmitted orders list.
|
|
|
|
Orders that have a Significant date and time like (diagnositic orders) will not
|
|
check Master orders (ComplexOrderType of 1,3,5) that exist in the database.
|
|
|
|
The following ComplexOrderType values define the type of order:
|
|
0 or NULL - regular order
|
|
1 - Sequential Complex Dose Master
|
|
2 - Sequential Complex Dose Child Order
|
|
3 - Concurrent Complex Dose Master
|
|
4 - Concurrent Complex Dose Child Order
|
|
5 - Multiple Frequencies Master
|
|
6 - Multiple Frequencies Child Order
|
|
|
|
|
|
;;
|
|
keywords: Duplicate Order;
|
|
;;
|
|
citations:
|
|
{{+B}}Development{{-B}}: Allscripts Healthcare Solutions, Inc. Clinical Information can be customized and configured by local facility.
|
|
{{+B}}Funding{{-B}}: None specific to the development of this alert
|
|
{{+B}}Release{{-B}}: None
|
|
{{+B}}Revision Date{{-B}}: 2012-11-07
|
|
|
|
{{+B}}Citations{{-B}}: None
|
|
;;
|
|
knowledge:
|
|
type: data-driven;;
|
|
data:
|
|
/***************Make Changes To Spelling And Flags In This Section***************/
|
|
/* Set to true if logging is needed.*/
|
|
log_execution_info := false;
|
|
|
|
/* Set the text for the variable below to indicate whether to send the message or not. */
|
|
send_alert := "DoNotSend";
|
|
|
|
/* Set a flag indicating whether or not Actions on Alerts should be generated */
|
|
generate_actions_on_alerts := TRUE;
|
|
|
|
alert_if_initial_error:= FALSE;
|
|
|
|
/* Set the ORDER STATUS LEVEL FLAGS to a different Order Status Level */
|
|
/* if more or fewer order statuses should be included */
|
|
lowest_status_level_for_diagnostics:= 0;
|
|
highest_status_level_for_diagnostics:= 100;
|
|
lowest_status_level_for_meds:= 0;
|
|
highest_status_level_for_meds:= 50;
|
|
|
|
// The duplicate checking flag for community results is as follows:
|
|
// Set this flag to TRUE to include resulted orders from community results in the evaluation.
|
|
// Set this flag to FALSE to exclude resulted orders from community results in the evaluation
|
|
enable_community_data_results_alerts := false;
|
|
|
|
// Set this flag to TRUE to match resulted orders from community results to
|
|
// the order name if the diagnostic order cannot be mapped to a catalog item.
|
|
// Set this flag to FALSE to match resulted orders from commmunity results only
|
|
// if the diagnostic order is mapped to a catalog item. (default)
|
|
enable_Diagnostic_Duplicate_Check_by_Community_Order_Name := false;
|
|
|
|
// Enter the text to differentiate resulted orders from community results in duplicate alerts:
|
|
// Set this flag to "Community" to include with the resulted order from community results
|
|
// data for MLM shown in brackets after the community data.
|
|
community_resultedOrder_alert_text := "Community";
|
|
|
|
/* Change the message within the quotes if a different short-message is needed.*/
|
|
duplicate_order_alert:= destination { Alert: warning,
|
|
"Duplicate Order", low, chart,
|
|
"HVC Duplicate", 1005, send_alert };
|
|
|
|
/* Change the spelling within the quotes to match the order item-catalog.*/
|
|
any_new_order:= event {OrderEnter User Order:
|
|
WHERE OrderStatusLevelNum >= 0
|
|
AND OrderStatusLevelNum <= 50
|
|
AND OrderStatusCode <> "HOLD"
|
|
AND IsSuspended = FALSE };
|
|
|
|
any_new_patient_group_order:= event {OrderEnter Batch Order:
|
|
WHERE OrderStatusLevelNum >= 0
|
|
AND OrderStatusLevelNum <= 50
|
|
AND OrderStatusCode <> "HOLD"
|
|
AND IsSuspended = FALSE
|
|
AND IsCreatedFromPatientGroupOrderTemplate = TRUE};
|
|
|
|
any_modified_order:= event {OrderModify User Order:
|
|
WHERE OrderStatusLevelNum >= 0
|
|
AND OrderStatusLevelNum <= 50
|
|
AND OrderStatusCode <> "HOLD"
|
|
AND IsSuspended = FALSE };
|
|
|
|
any_released_order:= event {OrderRelease User Order:
|
|
WHERE OrderStatusLevelNum >= 0
|
|
AND OrderStatusLevelNum <= 50
|
|
AND OrderStatusCode <> "HOLD"
|
|
AND IsSuspended = FALSE };
|
|
|
|
any_unsuspended_order:= event {OrderUnsuspend User Order:
|
|
WHERE OrderStatusLevelNum >= 0
|
|
AND OrderStatusLevelNum <= 50
|
|
AND OrderStatusCode <> "HOLD"
|
|
AND IsSuspended = FALSE };
|
|
|
|
any_verified_order:= event {OrderVerify User Order:
|
|
WHERE OrderStatusLevelNum >= 0
|
|
AND OrderStatusLevelNum <= 50
|
|
AND OrderStatusCode <> "HOLD"
|
|
AND IsSuspended = FALSE };
|
|
|
|
// --------------------------------------------------
|
|
// Outpatient Prescription and Home Medication Orders
|
|
//---------------------------------------------------
|
|
// Comment out below triggers to exclude checking all Outpatient Orders
|
|
// To include Home Medications remove the code {{{SINGLE-QUOTE}}}AND OrderAddtionalInfo.IsScript <> FALSE{{{SINGLE-QUOTE}}}
|
|
outpatient_order_entry_trigger := event {OutpatientOrderEnterNoIVAdditive User Order:
|
|
WHERE OrderAdditionalInfo.IsScript <> FALSE};
|
|
|
|
outpatient_order_modify_trigger := event {OutpatientOrderModify User Order:
|
|
WHERE OrderAdditionalInfo.IsScript <> FALSE};
|
|
|
|
/* Pharmacy Trigger Events */
|
|
|
|
any_OrderEnterPharmacyPerfect:= event {OrderEnterPharmacyPerfect Any Order:
|
|
WHERE OrderStatusLevelNum >= 0
|
|
AND OrderStatusLevelNum <= 50
|
|
AND OrderStatusCode <> "HOLD"
|
|
AND IsSuspended = FALSE };
|
|
|
|
any_OrderModifyPharmacyPerfect:= event {OrderModifyPharmacyPerfect Any Order:
|
|
WHERE OrderStatusLevelNum >= 0
|
|
AND OrderStatusLevelNum <= 50
|
|
AND OrderStatusCode <> "HOLD"
|
|
AND IsSuspended = FALSE };
|
|
|
|
any_OrderModifyPharmacy:= event {OrderModifyPharmacy Any Order:
|
|
WHERE OrderStatusLevelNum >= 0
|
|
AND OrderStatusLevelNum <= 50
|
|
AND OrderStatusCode <> "HOLD"
|
|
AND IsSuspended = FALSE };
|
|
|
|
/* Uncomment this section if you would like historical session type orders
|
|
to evoke this MLM, otherwise keep it commented out and this MLM will
|
|
ignore historical session type orders. If you uncomment this section make
|
|
sure to also uncomment the equivalent in the evoke clause.
|
|
|
|
order_alternate_enter_IV:= event{OrderAlternateEnterWithIVAdditive User Order:
|
|
where AlternateOrderType = 1};
|
|
|
|
order_alternate_enter_NOIV:= event{OrderAlternateEnterNoIVAdditive User Order:
|
|
where AlternateOrderType = 1};
|
|
|
|
order_alternate_modify:= event{OrderAlternateModify User Order:
|
|
where AlternateOrderType = 1
|
|
AND OrderStatusCode <> "HISE"
|
|
AND OrderStatusCode <> "HISI"}; */
|
|
|
|
|
|
// Set the list variables with the session types of existing orders against which
|
|
// the current order will be checked. The possible values for these variables are
|
|
// one or more types from the following list ("Discharge", "Inhouse", "Outpatient Rx", "Outpatient Hx", "Historical").
|
|
//
|
|
// The default setting is to check for duplicates between
|
|
// - current order entered during a discharge session type and existing discharge orders
|
|
// - current order entered during an in-house session type and existing in-house orders
|
|
// - current order entered during historical session type and existing historical orders
|
|
// - current outpatient orders entered and existing outpatient orders
|
|
|
|
at_discharge_session_list := ("Discharge");
|
|
at_in_house_session_list := ("Inhouse");
|
|
at_historical_session_list := ("Historical");
|
|
at_outpatient_session_list := ("Outpatient Rx", "Outpatient Hx");
|
|
|
|
/********************************************************************************/
|
|
|
|
/* Executes only when this MLM is called by the editor */
|
|
if called_by_editor then
|
|
/* Get current selected client visit in MLM Editor. */
|
|
(client_visit_guid,
|
|
current_visit) := read last {ClientVisit: GUID, This };
|
|
|
|
/* Search for example order in the current visit. */
|
|
EvokingObject:= read last
|
|
{Order: This
|
|
WHERE Name = "CBC" AND OrderStatusLevelNum > 40 };
|
|
endif;
|
|
|
|
/* Declares MLMs which can be called */
|
|
func_dup_message:= MLM {{{SINGLE-QUOTE}}}std_func_dup_messages{{{SINGLE-QUOTE}}};
|
|
func_check_for_duplicates:= MLM {{{SINGLE-QUOTE}}}std_func_dup_rules{{{SINGLE-QUOTE}}};
|
|
func_dup_actions := MLM {{{SINGLE-QUOTE}}}Std_Func_Dup_Actions{{{SINGLE-QUOTE}}};
|
|
|
|
/* Initialize variable */
|
|
continue_checking_order := true;
|
|
|
|
/* Set the order type to check */
|
|
complex_child_order_type := (2,4,6);
|
|
complex_master_order_type := (1,3,5);
|
|
regular_order_type := (NULL, 0);
|
|
|
|
/* Gets the Client GUID */
|
|
client_guid := read last {ClientInfo: GUID};
|
|
|
|
/* Gets information from the evoking Order */
|
|
(main_order_name,
|
|
evoking_object_guid,
|
|
order_status_code,
|
|
order_level_num,
|
|
order_summary_line,
|
|
main_item_catalog_guid,
|
|
order_catalog_master_item_obj,
|
|
chart_guid,
|
|
client_visit_guid,
|
|
order_significant_date,
|
|
order_requested_date,
|
|
order_entered_date,
|
|
order_stop_date,
|
|
order_is_conditional,
|
|
order_component_obj,
|
|
order_complex_type,
|
|
order_variable_component_obj,
|
|
order_is_for_discharge,
|
|
order_alternate_order_type,
|
|
evoking_order_additional_info,
|
|
back_up_obj) := read last
|
|
{Order: Name, GUID, OrderStatusCode, OrderStatusLevelNum, SummaryLine,
|
|
OrderCatalogMasterItemGUID, OrderCatalogMasterItem, ChartGUID,
|
|
ClientVisitGUID, SignificantDtm, RequestedDtm, Entered, StopDtm, IsConditional, OrderComponent,
|
|
ComplexOrderType, OrderVariableComponent, IsForDischarge, AlternateOrderType, OrderAdditionalInfo,
|
|
Backup REFERENCING EvokingObject};
|
|
|
|
(evoking_order_is_script) := read last {OrderAdditionalInfo: IsScript REFERENCING evoking_order_additional_info};
|
|
|
|
if exists EvokingObject
|
|
and (order_significant_date is null)
|
|
then
|
|
alert_if_initial_error := TRUE;
|
|
endif;
|
|
|
|
order_without_specific_stop_date := false;
|
|
|
|
if (order_alternate_order_type <> 2) //if not an outpatient order
|
|
then
|
|
// Get information about ongoing diagnostic order vs medication order
|
|
(order_without_specific_stop_date) := read last
|
|
{OrderCatalogMasterItem: IsOngoingOrder REFERENCING order_catalog_master_item_obj};
|
|
endif;
|
|
|
|
// This is a diagnostic like order
|
|
if order_without_specific_stop_date
|
|
then
|
|
/* Check to see if this is a master order and if so whether children exist */
|
|
if exists order_complex_type
|
|
and order_complex_type IS IN complex_master_order_type
|
|
then
|
|
/* Gets information from the order variable components */
|
|
(component_child_order_guid_list) := read
|
|
{OrderVariableComponent: ChildOrderGUID
|
|
REFERENCING order_variable_component_obj};
|
|
|
|
/* Check to see if children exist */
|
|
if exists component_child_order_guid_list
|
|
then
|
|
child_orders_generated := true;
|
|
|
|
/* If children exist, this MLM should not run on Master order on modify or unsuspend */
|
|
If EvokingEventType = any_modified_order.type
|
|
OR EvokingEventType = any_unsuspended_order.type
|
|
then
|
|
continue_checking_order := false;
|
|
endif; //If EvokingEventType = any_modified_order.type
|
|
|
|
/* This is a master order without children*/
|
|
else
|
|
continue_checking_order := true;
|
|
endif; //if exists component_child_order_guid_list
|
|
|
|
|
|
/* This is a child diagnositic order event continue check for modify, unsuspend... */
|
|
else
|
|
continue_checking_order := true;
|
|
endif; //if exists order_complex_type
|
|
|
|
else
|
|
/* This is a medication like order */
|
|
/* Check to see if this is a child order and if so stop processing as */
|
|
/* data will be alerted on at master order update */
|
|
if exists order_complex_type
|
|
and order_complex_type IS IN complex_child_order_type
|
|
then
|
|
continue_checking_order := false;
|
|
endif; //if exists order_complex_type
|
|
|
|
endif; //if order_without_specific_stop_date
|
|
|
|
|
|
// Determines if a modified order should be checked for duplicates
|
|
if EvokingEventType = any_modified_order.type
|
|
or EvokingEventType = any_OrderModifyPharmacy.type
|
|
or EvokingEventType = order_alternate_modify.type
|
|
or EvokingEventType = outpatient_order_modify_trigger.type
|
|
and continue_checking_order
|
|
then
|
|
if exist back_up_obj
|
|
then
|
|
(back_up_obj_signif_date,
|
|
back_up_obj_stop_date) := read last
|
|
{Order: SignificantDtm, StopDtm REFERENCING back_up_obj};
|
|
|
|
if (back_up_obj_signif_date <> order_significant_date)
|
|
OR (back_up_obj_stop_date <> order_stop_date)
|
|
OR (back_up_obj_stop_date is null and order_stop_date is time)
|
|
OR (back_up_obj_stop_date is time and order_stop_date is null)
|
|
then
|
|
continue_checking_order := true;
|
|
else
|
|
continue_checking_order := false;
|
|
endif;
|
|
else
|
|
continue_checking_order := false;
|
|
endif;
|
|
endif;
|
|
|
|
|
|
if continue_checking_order
|
|
then
|
|
/* Places the main-order on the lists to process */
|
|
order_list:= ,main_order_name;
|
|
cat_item_guid_list:= ,main_item_catalog_guid;
|
|
|
|
/* Only retrieves data if the Order has IV additives */
|
|
If exist order_component_obj
|
|
then
|
|
/* Gets the catalog item from the order component object */
|
|
(additive_cat_item_guid_list,
|
|
additive_name_list) := read
|
|
{ OrderComponent: OrderCatalogMasterItemGUID, Name
|
|
REFERENCING order_component_obj
|
|
where (Dosage AS Number) > 0 };
|
|
|
|
/* Places the additive information on the lists to process */
|
|
order_list:= order_list, additive_name_list;
|
|
cat_item_guid_list:= cat_item_guid_list, additive_cat_item_guid_list;
|
|
endif;
|
|
|
|
/* Gets the patient{{{SINGLE-QUOTE}}}s location group */
|
|
If called_by_editor
|
|
Then
|
|
/* Get visit information from the current selected visit in MLM Editor. */
|
|
patient_loc_group:= read last
|
|
{ ClientVisit: BusinessRuleLocationGUID
|
|
REFERENCING current_visit};
|
|
Else
|
|
patient_loc_group:= read last
|
|
{ ClientVisit: BusinessRuleLocationGUID };
|
|
Endif;
|
|
|
|
|
|
endif; /* continue_checking_order */
|
|
|
|
;;
|
|
evoke:
|
|
/* Uncomment this section if you would like historical session type orders
|
|
to evoke this mlm,otherwise keep it commented out.
|
|
If you uncomment this section please make sure to also uncomment the
|
|
equivalent event clauses
|
|
|
|
order_alternate_enter_IV OR
|
|
order_alternate_enter_NOIV OR
|
|
order_alternate_modify OR */
|
|
|
|
any_new_order;
|
|
any_new_patient_group_order;
|
|
any_modified_order;
|
|
any_released_order;
|
|
any_unsuspended_order;
|
|
any_verified_order;
|
|
outpatient_order_entry_trigger;
|
|
outpatient_order_modify_trigger;
|
|
any_OrderEnterPharmacyPerfect;
|
|
any_OrderModifyPharmacyPerfect;
|
|
any_OrderModifyPharmacy;
|
|
;;
|
|
logic:
|
|
If EvokingObject is NULL
|
|
then conclude false;
|
|
endif;
|
|
|
|
if alert_if_initial_error
|
|
then conclude true; /* generate an alert */
|
|
endif;
|
|
|
|
If NOT continue_checking_order
|
|
then conclude false;
|
|
endif;
|
|
|
|
|
|
/* Initialize variables */
|
|
indent:= " ";
|
|
dash_line:= "-----";
|
|
printable_alert_msg:= "";
|
|
index_list:= 1 SEQTO count(order_list);
|
|
|
|
/* Process the main order or the IV-additives */
|
|
for J in index_list do
|
|
order_name:= last(first J from order_list);
|
|
item_catalog_guid:= last(first J from cat_item_guid_list);
|
|
|
|
(exact_msg,
|
|
performed_msg,
|
|
scheduled_msg,
|
|
exact_type,
|
|
subset_type,
|
|
superset_type,
|
|
same_order_type,
|
|
partial_match_type,
|
|
conflict_type,
|
|
possible_conflict_type,
|
|
no_std_message_type,
|
|
order_without_specific_stop_date,
|
|
matching_name_list,
|
|
matching_order_guid_list,
|
|
matching_significant_date_list,
|
|
matching_requested_date_list,
|
|
matching_entered_date_list,
|
|
matching_stop_date_list,
|
|
matching_msg_type_list,
|
|
matching_msg_text_list,
|
|
matching_time_msg_list,
|
|
matching_class_list,
|
|
matching_summary_list,
|
|
matching_order_status_code_list,
|
|
matching_order_type_code_list,
|
|
matching_alternate_order_type_list,
|
|
matching_is_script_list,
|
|
matching_aoa_action_item_status_list,
|
|
matching_aoa_order_guid_list,
|
|
matching_aoa_order_name_list,
|
|
matching_aoa_master_guid_list ) := call func_check_for_duplicates with
|
|
(order_name,
|
|
evoking_object_guid,
|
|
order_status_code,
|
|
order_level_num,
|
|
order_summary_line,
|
|
item_catalog_guid,
|
|
chart_guid,
|
|
client_visit_guid,
|
|
order_significant_date,
|
|
order_requested_date,
|
|
order_entered_date,
|
|
order_stop_date,
|
|
order_is_conditional,
|
|
patient_loc_group,
|
|
lowest_status_level_for_diagnostics,
|
|
highest_status_level_for_diagnostics,
|
|
lowest_status_level_for_meds,
|
|
highest_status_level_for_meds,
|
|
complex_master_order_type,
|
|
complex_child_order_type,
|
|
order_is_for_discharge,
|
|
order_alternate_order_type,
|
|
evoking_order_is_script,
|
|
at_in_house_session_list,
|
|
at_discharge_session_list,
|
|
at_historical_session_list,
|
|
at_outpatient_session_list,
|
|
enable_community_data_results_alerts,
|
|
enable_Diagnostic_Duplicate_Check_by_Community_Order_Name,
|
|
EvokingObject,
|
|
EvokingEventType);
|
|
|
|
/*--------------------------------------------------------------*/
|
|
/* Calls an MLM to select the appropriate message and format it */
|
|
/*--------------------------------------------------------------*/
|
|
If exist matching_name_list
|
|
then
|
|
(order_status_msg,
|
|
alert_msg,
|
|
matching_short_message_list):= call func_dup_message with
|
|
(order_name,
|
|
order_status_code,
|
|
order_without_specific_stop_date,
|
|
exact_msg,
|
|
performed_msg,
|
|
scheduled_msg,
|
|
exact_type,
|
|
subset_type,
|
|
superset_type,
|
|
same_order_type,
|
|
partial_match_type,
|
|
conflict_type,
|
|
possible_conflict_type,
|
|
no_std_message_type,
|
|
matching_name_list,
|
|
matching_significant_date_list,
|
|
matching_requested_date_list,
|
|
matching_entered_date_list,
|
|
matching_stop_date_list,
|
|
matching_msg_type_list,
|
|
matching_msg_text_list,
|
|
matching_time_msg_list,
|
|
matching_class_list,
|
|
matching_summary_list,
|
|
matching_order_status_code_list,
|
|
matching_order_type_code_list,
|
|
matching_alternate_order_type_list,
|
|
matching_is_script_list,
|
|
community_resultedOrder_alert_text);
|
|
|
|
/* Format date, removing milliseconds */
|
|
order_significant_date_formatted := order_significant_date formatted with "%.4t";
|
|
|
|
/* Create one long message to print */
|
|
printable_alert_msg:= printable_alert_msg || alert_msg;
|
|
|
|
endif; /* If exist matching_name_list */
|
|
enddo; /* for J */
|
|
|
|
|
|
/* Create a printable list of additives */
|
|
if exist additive_name_list
|
|
then
|
|
if count(additive_name_list) = 1
|
|
then additive_message:= indent || "IV-Additives: " || first (additive_name_list)|| "\n";
|
|
else additive_message:= indent || "IV-Additives: " || additive_name_list || "\n";
|
|
endif; /* if count */
|
|
else additive_message:= "";
|
|
endif; /* if exist additive_name_list */
|
|
|
|
/* Set the printable text for the order summary line */
|
|
if exist order_summary_line
|
|
then
|
|
summary_line:= dash_line || order_summary_line;
|
|
else
|
|
summary_line:= "";
|
|
endif; /* if exist order_summary_line */
|
|
|
|
|
|
/*-------------------------------*/
|
|
/* Create the Actions On Alerts */
|
|
/*-------------------------------*/
|
|
// Only create actions for alerts when the flag, generate_actions_on_alerts, is TRUE
|
|
// and the evoking object is a new order.
|
|
// Since the MLM Editor does NOT have an evoking trigger,
|
|
// Check that the EvokingEventType is a new order or the MLM is running the the MLM Editor
|
|
|
|
if generate_actions_on_alerts
|
|
AND exist alert_msg
|
|
AND (EvokingEventType = any_new_order.type or EvokingEventType = any_new_patient_group_order.type or Called_By_Editor)
|
|
then
|
|
// Correct the sort sequence of the SHORT MESSAGES.
|
|
// The MLM that created the messages places them in the wrong sequence.
|
|
/* Initialize */
|
|
matching_aoa_short_message_list := ();
|
|
position_list := 1 SEQTO count (matching_aoa_order_guid_list);
|
|
|
|
// Use the matching_aoa_order_guid_list to place them in the right sequence
|
|
for GG in position_list do
|
|
//Get the OrderGUID and the Duplicate{{{SINGLE-QUOTE}}}s Name (order name or additive name)
|
|
aoa_order_guid := matching_aoa_order_guid_list[GG];
|
|
aoa_order_name := matching_aoa_order_name_list[GG];
|
|
|
|
//Use the GUID and the NAME to find a matching position for a regular order
|
|
found_match := (matching_order_guid_list = aoa_order_guid
|
|
and matching_name_list = aoa_order_name);
|
|
|
|
//Use just the GUID to find a matching position for orders with IV Additives
|
|
If NOT ANY found_match
|
|
then found_match := matching_order_guid_list = aoa_order_guid;
|
|
endif;
|
|
|
|
//Match the position to get the short message
|
|
temp_message := first (matching_short_message_list where found_match);
|
|
|
|
//Put the short message in its correct order in the list
|
|
matching_aoa_short_message_list := matching_aoa_short_message_list, temp_message;
|
|
enddo; //for GG
|
|
|
|
|
|
// Call the MLM that Generates the Actions
|
|
alert_action_object_list := call func_dup_actions WITH
|
|
evoking_object_guid,
|
|
matching_aoa_action_item_status_list,
|
|
matching_aoa_order_guid_list,
|
|
matching_aoa_order_name_list,
|
|
matching_aoa_master_guid_list,
|
|
matching_aoa_short_message_list ;
|
|
|
|
// Set a flag to attach the alert to the destination when there are alert actions
|
|
if exist alert_action_object_list
|
|
then continue_action := True;
|
|
else continue_action := False;
|
|
endif; // if exist
|
|
endif; //if generate_actions_on_alerts
|
|
|
|
/*---------------*/
|
|
/* Clinical Rule */
|
|
/*---------------*/
|
|
If exist alert_msg
|
|
then conclude true;
|
|
endif;
|
|
;;
|
|
action:
|
|
|
|
current_order_alert_msg := "The current ";
|
|
if (order_alternate_order_type = 2)
|
|
then
|
|
if (evoking_order_is_script)
|
|
then
|
|
current_order_alert_msg := current_order_alert_msg || "prescription: \n";
|
|
order_status_msg := order_status_msg || " Prescription";
|
|
else
|
|
current_order_alert_msg := current_order_alert_msg || "home medication: \n";
|
|
order_status_msg := order_status_msg || " Home Medication";
|
|
endif;
|
|
else
|
|
current_order_alert_msg := current_order_alert_msg || "order: \n";
|
|
order_status_msg := order_status_msg || " Order";
|
|
endif;
|
|
|
|
if alert_if_initial_error
|
|
then
|
|
write "Your order for {{+B}}{{+C}}" || main_order_name
|
|
|| "{{-B}}{{-C}} was{{+B}}{{+R}} not checked for possible duplicates {{-B}}{{-R}}"
|
|
|| "with other patient medications."
|
|
|| " Please use an alternate plan to do the check."
|
|
|| " \n\nThis drug was not checked because it does not have a start date or a stop date."
|
|
at duplicate_order_alert;
|
|
else
|
|
write current_order_alert_msg
|
|
|| indent || main_order_name || summary_line || "\n"
|
|
|| indent || "Date: " || order_significant_date_formatted ||"\n"
|
|
|| indent || "Status: " || order_status_msg || "\n"
|
|
|| additive_message
|
|
|| "\n"
|
|
|| "May be duplicate with: \n\n"
|
|
|| printable_alert_msg
|
|
at duplicate_order_alert;
|
|
|
|
if continue_action
|
|
then attach alert_action_object_list to duplicate_order_alert;
|
|
endif;
|
|
endif;
|
|
;;
|
|
Urgency: 50;;
|
|
end:
|