maintenance: title: SCH_OON_INSURANCE;; mlmname: SCH_OON_INSURANCE;; arden: version 2.50;; version: 5.50;; institution: St. Clair Hospital;; author: Shawn Head, Allscripts Corp;; specialist: Peggy Karish, Allscripts Corp;; date: 2016-05-26;; validation: testing;; library: purpose: Update an Enterprise Defined Patient List Column with UPMC Out of Network Coverage alert. ;; explanation: For patients that are currently on the UPCM Out Of Network coverage. The patient is covered in the ED; however if we admit them their plan will not cover any of the costs. The column will be updated and flash/display in a color that alerts the users that the patient is not covered for admission. Change history 05.25.2016 STH CSR #34119 - Created from a copy of SCH_MEDICARE_PLAN_B_COLUMN_UPDATE {Go-Live 7/12/2016} 10.15.2018 STH CSR#: 34119 & 37522/CA SERVICE DESK#: 3202435 - Issue identified post go-live of reg/sched where insurnace column was not consistently updating. Made changes to fire on Insurance enter/modify instead of visit enter/modify {Go-Live 11/7/2018} ;; keywords: ObjectsPlus/XA, Order ;; knowledge: type: data-driven;; data: // Specify which .NET assemblies need to be loaded for ObjectsPlus standard_libs := MLM {{{SINGLE-QUOTE}}}std_include_libs{{{SINGLE-QUOTE}}}; include standard_libs; //Error Handling vars for ObjectsPlus Method calls error_occurred := false; error_message := ""; log_execution_info := false; InsuranceColumn_dest := destination { ObjectsPlus } with [ alert_type := "Warning", short_message := "Object created by MLM", priority := "low", scope := "chart", rule_group := "EnterprisePatientListColumn Object", rule_number := 2025 ]; error_destination := destination { Alert } with [ alert_type := "Warning", short_message := "ObjectsPlus Error from MLM", priority := "low", scope := "chart", Rule_group := "ObjectsPlus Error from MLM", Rule_number := 1001, Rule_subgroup := "", Send_with_order := "", Alert_dialog_settings := "", Display_alert := true ]; send_alert := "DoNotSend"; alert_dialog := "Must Acknowledge"; alert_message := "{{+B}}Patient Primary Insurance is {{+R}}OUT OF NETWORK{{-R}}.{{-B}}"; alert_Priority := "High"; alert_dest := destination {alert} with [alert_type := warning, short_message := "Out Of Network Insurance", priority := alert_Priority, scope := Chart, rule_group := "Out Of Network Insurance", rule_number := 8000, send_with_alert := send_alert, alert_dialog_settings := alert_dialog, display_alert := true]; //-------------------------------------------------------------------- if called_by_editor then EvokingObject := read last {ClientVisit: THIS where TypeCode = "Emergency"}; endif; //Event Trigger //VisitEnter := Event { ClientVisitEnter Any ClientVisit : WHERE TypeCode = "Emergency" }; //VisitModify := Event { ClientVisitModify Any ClientVisit : WHERE TypeCode = "Emergency" }; InsuranceEnter := event{InsuranceEnter User ClientVisit}; InsuranceModify := event{InsuranceModify User ClientVisit}; OrdInit := EVENT {OrderInit User Order: where Name in ("Admit to Inpatient","Place In Observation") }; OrdSetInit:= event{OrderSetInit User OrderSet: WHERE OrderSetName matches pattern "Transition%" or OrderSetName matches pattern "Admission%" or OrderSetName matches pattern "Post Op%" }; InsUpdate := false; if(EvokingEventType = OrdInit.Type) then (ClientVisitGuid, ClientGuid) := read last {Order : ClientVisitGuid, ClientGuid REFERENCING EvokingObject}; VisitType := read last { " select typecode from cv3clientvisit with (nolock) where clientguid = " || sql(ClientGuid) || " and guid = " || sql(ClientVisitGuid) || " " }; elseif(EvokingEventType = OrdSetInit.Type) then (ClientVisitGuid, ClientGuid) := read last {OrderSet : ClientVisitGuid, ClientGuid REFERENCING EvokingObject}; VisitType := read last { " select typecode from cv3clientvisit with (nolock) where clientguid = " || sql(ClientGuid) || " and guid = " || sql(ClientVisitGuid) || " " }; //elseif ((EvokingEventType = VisitEnter.Type) or (EvokingEventType = VisitModify.type)) then // (ClientVisitGuid, ClientGuid, VisitType) := read last {ClientVisit : GUID, ClientGuid, TypeCode REFERENCING EvokingObject}; elseif((EvokingEventType = InsuranceEnter.Type) or (EvokingEventType = InsuranceModify.Type)) then ( FRP_Name, FRP_Code,Policy_Num, Subscriber_relationship,ClientVisitGuid, ClientGuid ) := read last { Insurance: FRPName,FRPCode, PolicyNum, RelationshipCode,ClientVisitGuid, ClientGuid REFERENCING EvokingObject }; VisitType := read last { " select typecode from cv3clientvisit with (nolock) where clientguid = " || sql(ClientGuid) || " and guid = " || sql(ClientVisitGuid) || " " }; InsuranceCarrierID := EVOKINGOBJECT.Insurer.InsuranceCarrierID; InsuranceSequence := EVOKINGOBJECT.SequenceNum; if(InsuranceSequence = 1) then ICfromObj := read last {" select ic.Name from SXAAMInsuranceCarrier ic with (nolock) where ic.InsuranceCarrierID = " || sql(InsuranceCarrierID) || " AND ((ic.Name like {{{SINGLE-QUOTE}}}%OUT OF NETWORK%{{{SINGLE-QUOTE}}}) OR (ic.name like {{{SINGLE-QUOTE}}}% OON %{{{SINGLE-QUOTE}}})) "}; endif; endif; if(trim(VisitType) = "Emergency") then if(EvokingEventType not in (InsuranceEnter.Type,InsuranceModify.Type)) then (UPMCOON_Val) := read {" SELECT ic.Name FROM CV3FRPContract fc with (nolock) JOIN CV3FRP f with (nolock) ON fc.FRPGUID = f.GUID JOIN SXAAMInsuranceCarrier ic with (nolock) ON f.InsuranceCarrierID = ic.InsuranceCarrierID WHERE fc.ClientGUID = " || Sql(ClientGuid) || " AND fc.ClientVisitGUID = " || Sql(ClientVisitGuid) || " AND FC.SequenceNum = 1 AND fc.Status = {{{SINGLE-QUOTE}}}Active{{{SINGLE-QUOTE}}} AND ((ic.Name like {{{SINGLE-QUOTE}}}%OUT OF NETWORK%{{{SINGLE-QUOTE}}}) OR (ic.name like {{{SINGLE-QUOTE}}}% OON %{{{SINGLE-QUOTE}}})) "}; endif; if ((exists UPMCOON_Val) or (ICfromObj <> "")) then InsuranceValue := "Yes"; else InsuranceValue := ""; endif; if((EvokingEventType in (OrdInit.Type,OrdSetInit.Type)) AND (InsuranceValue = "Yes")) then AlertFire := true; else AlertFire := false; endif; endif; ;; priority: 50 ;; evoke: //22 second after time of VisitEnter; //22 second after time of VisitModify; InsuranceEnter; InsuranceModify; OrdInit; OrdSetInit; ;; logic: //BEGIN OF VISIT ENTER/VISIT MODIFIY SECTION if (EvokingEventType in (/*VisitEnter.Type,VisitModify.Type,*/InsuranceEnter.Type,InsuranceModify.Type)) then if (EvokingObject is null) then conclude false; else //if (updateColumn = true) then try client_visit_obj := call {{{SINGLE-QUOTE}}}ClientVisit{{{SINGLE-QUOTE}}}.FindByPrimaryKey with ((ClientVisitGuid as number) as {{{SINGLE-QUOTE}}}Int64{{{SINGLE-QUOTE}}}); endtry; catch Exception ex error_occurred := true; error_message := "{{+R}}Retrieve client:{{-R}}\n" || ex.Message || "\n\n"; if (ex.InnerException is not null net_object) then error_message := error_message || "Inner Exception: " || ex.InnerException.Message || "\n\n"; endif; conclude true; endcatch; try eColumnValue := InsuranceValue; InsuranceDefinedColumn_Obj := call {{{SINGLE-QUOTE}}}EnterpriseDefinedColumn{{{SINGLE-QUOTE}}}.FindByName with (client_visit_obj, "Insurance OON"); colValue := InsuranceDefinedColumn_Obj.Value; if ((colValue <> eColumnValue) and (InsuranceSequence=1)) then //or (EvokingEventType in (VisitEnter.Type,VisitModify.Type))) then InsuranceDefinedColumn_Obj.Value := eColumnValue; //InsuranceColumn_dest.ObjectsPlus := InsuranceDefinedColumn_Obj; void := call InsuranceDefinedColumn_Obj.Save; void := call InsuranceDefinedColumn_Obj.Dispose; InsuranceDefinedColumn_Obj := null; endif; endtry; catch Exception ex error_occurred := true; error_message := error_message || "{{+R}}Enterprise Out Of Network Insurance column{{-R}}\n" || ex.Message || "\n\n"; if (ex.InnerException is not null net_object) then error_message := error_message || "Inner Exception: " || ex.InnerException.Message || "\n\n"; endif; if (InsuranceDefinedColumn_Obj is not null) then void := call InsuranceDefinedColumn_Obj.Dispose; InsuranceDefinedColumn_Obj := null; endif; InsuranceColumn_dest := null; endcatch; if (client_visit_obj is not null) then void := call client_visit_obj.Dispose; client_visit_obj := null; endif; conclude true; endif; elseif ((EvokingEventType in (OrdInit.Type,OrdSetInit.Type)) and (AlertFire)) then conclude true; else conclude false; endif; //END OF VISIT ENTER/VISIT MODIFIY SECTION ;; action: //BEGIN OF VISIT ENTER/VISIT MODIFIY SECTION if ((EvokingEventType in (InsuranceEnter.Type,InsuranceModify.Type))) then if (error_occurred) then write "An error occurred in the MLM {{+B}}SCH_OON_INSURANCE{{-B}}. " || " Please notify your system administrator that an error message has " || " occurred for this patient. They will review the following error " || " message:\n" at error_destination; write error_message at error_destination; endif; if (exists InsuranceColumn_dest) then write true at InsuranceColumn_dest; endif; ENDIF; if((EvokingEventType in (OrdInit.Type,OrdSetInit.Type)) and (AlertFire)) then write alert_message at alert_dest; endif; ;; Urgency: 50;; end: