| [613] | 1 | ORB3TIM1 ; slc/CLA - Routine to trigger time-related notifications ;6/28/00 12:00 [ 04/02/97  11:12 AM ] | 
|---|
|  | 2 | ;;3.0;ORDER ENTRY/RESULTS REPORTING;**31,64,74,88,102,143,179**;Dec 17, 1997 | 
|---|
|  | 3 | TNOTIFS ;process time-driven notifications - called by ORMTIM01 | 
|---|
|  | 4 | ; | 
|---|
|  | 5 | ;Do not process DIV for param - ORMTIM01 is initiated by postmaster: | 
|---|
|  | 6 | Q:$$GET^XPAR("SYS^PKG","ORB SYSTEM ENABLE/DISABLE",1,"I")="D" | 
|---|
|  | 7 | N ORLASTQ,ORNOW,ORERR | 
|---|
|  | 8 | S ORNOW=$$NOW^XLFDT | 
|---|
|  | 9 | S ORLASTQ=$$GET^XPAR("SYS","ORB LAST QUEUE DATE",1,"I") | 
|---|
|  | 10 | ; | 
|---|
|  | 11 | D NPO | 
|---|
|  | 12 | D UNVER | 
|---|
|  | 13 | D UVMED | 
|---|
|  | 14 | D EXPIR^ORB3TIM2 | 
|---|
|  | 15 | D PUT^XPAR("SYS","ORB LAST QUEUE DATE",1,ORNOW,.ORERR) | 
|---|
|  | 16 | Q | 
|---|
|  | 17 | NPO ;trigger NPO diet > 72 hours notifications | 
|---|
|  | 18 | N ORNPO,ORPT,INVDT,ORDG,ORNUM,ORBDT,OREDT | 
|---|
|  | 19 | N OIFILE,ORBY,ORBI,ORST,ORSDT | 
|---|
|  | 20 | ; | 
|---|
|  | 21 | S ^XTMP("ORBNPO",0)=$$FMADD^XLFDT(ORNOW,1,"","","")_"^"_ORNOW | 
|---|
|  | 22 | ; | 
|---|
|  | 23 | ;get NPO OIs: | 
|---|
|  | 24 | S OIFILE=$$TERMLKUP^ORB31(.ORBY,"NPO") | 
|---|
|  | 25 | ; | 
|---|
|  | 26 | Q:'$D(ORBY)  ;quit if no link between NPO and local OI | 
|---|
|  | 27 | S:'$G(ORLASTQ) ORLASTQ=$$FMADD^XLFDT(ORNOW,"","-96","","") | 
|---|
|  | 28 | S ORBDT=$$FMADD^XLFDT(ORLASTQ,"","-72","","") | 
|---|
|  | 29 | S OREDT=$$FMADD^XLFDT(ORNOW,"","-72","","") | 
|---|
|  | 30 | F  S ORBDT=$O(^OR(100,"AF",ORBDT)) Q:(ORBDT="")!(ORBDT>OREDT)  D | 
|---|
|  | 31 | .S ORNUM="" F  S ORNUM=$O(^OR(100,"AF",ORBDT,ORNUM)) Q:ORNUM=""  D | 
|---|
|  | 32 | ..Q:$D(^XTMP("ORBNPO",ORNUM)) | 
|---|
|  | 33 | ..; determine if NPO order: | 
|---|
|  | 34 | ..I +$G(OIFILE)=101.43 F ORBI=1:1:ORBY D | 
|---|
|  | 35 | ...S ORNPO=$P(ORBY(ORBI),U) I ORNPO=$$OI^ORQOR2(ORNUM) D | 
|---|
|  | 36 | ....S ORSDT=$P($G(^OR(100,ORNUM,0)),U,8) | 
|---|
|  | 37 | ....S ^XTMP("ORBNPO",ORNUM)=$S($L(ORSDT):ORSDT,1:ORBDT)_U_0 | 
|---|
|  | 38 | ; | 
|---|
|  | 39 | ;loop thru XTMP looking for NPO orders with start d/t > 72 | 
|---|
|  | 40 | S ORNUM=0 F  S ORNUM=$O(^XTMP("ORBNPO",ORNUM)) Q:+$G(ORNUM)<1  D | 
|---|
|  | 41 | .S ORSDT=$P(^XTMP("ORBNPO",ORNUM),U) | 
|---|
|  | 42 | .I $P(^XTMP("ORBNPO",ORNUM),U,2)=0 D  ;if alert not already triggered | 
|---|
|  | 43 | ..Q:ORSDT>OREDT  ;quit if start date more recent than 72 hours ago | 
|---|
|  | 44 | ..S ORPT=$P($G(^OR(100,ORNUM,0)),U,2) I ORPT]"" D | 
|---|
|  | 45 | ...S ORST=$P($$STATUS^ORQOR2(ORNUM),U,2) | 
|---|
|  | 46 | ...I ORST'="DISCONTINUED",ORST'="COMPLETE",ORST'="EXPIRED",ORST'="UNRELEASED",ORST'="CHANGED",ORST'="CANCELLED",ORST'="LAPSED",ORST'="SCHEDULED" D | 
|---|
|  | 47 | ....D EN^ORB3(31,+ORPT,ORNUM,"","",ORNUM_"@") ;trigger NPO>72 notif | 
|---|
|  | 48 | ....S $P(^XTMP("ORBNPO",ORNUM),U,2)=1  ;alert triggered | 
|---|
|  | 49 | .; | 
|---|
|  | 50 | .I $G(ORSDT)<$$FMADD^XLFDT(ORNOW,"-7","","","") D | 
|---|
|  | 51 | ..K ^XTMP("ORBNPO",ORNUM) ;kill XTMP if order start d/t > 7 days | 
|---|
|  | 52 | Q | 
|---|
|  | 53 | UNVER ;trigger unverified order (by nurse) notif | 
|---|
|  | 54 | N ORPT,INVDT,ORDG,ORNUM,ORBDT,OREDT,ORST,ORX,ORACT,ORDELAY | 
|---|
|  | 55 | ; | 
|---|
|  | 56 | ;if not queued via ORMTIM01 recently, look for past 48 hours: | 
|---|
|  | 57 | S:'$G(ORLASTQ) ORLASTQ=$$FMADD^XLFDT(ORNOW,"","-48","","") | 
|---|
|  | 58 | ; | 
|---|
|  | 59 | ;get number of hours delay before trigger: | 
|---|
|  | 60 | S ORDELAY=$$GET^XPAR("ALL","ORB UNVERIFIED ORDER",1,"I") | 
|---|
|  | 61 | ; | 
|---|
|  | 62 | ;look for orders unverified after <parameter value> hours: | 
|---|
|  | 63 | S ORBDT=$$FMADD^XLFDT(ORLASTQ,"",-ORDELAY,"","") | 
|---|
|  | 64 | S OREDT=$$FMADD^XLFDT(ORNOW,"",-ORDELAY,"","") | 
|---|
|  | 65 | ; | 
|---|
|  | 66 | F  S ORBDT=$O(^OR(100,"AF",ORBDT)) Q:(ORBDT="")!(ORBDT>OREDT)  D | 
|---|
|  | 67 | .S ORNUM="" F  S ORNUM=$O(^OR(100,"AF",ORBDT,ORNUM)) Q:ORNUM=""  D | 
|---|
|  | 68 | ..S ORPT=$P($G(^OR(100,ORNUM,0)),U,2) I ORPT]"" D | 
|---|
|  | 69 | ...;The following filters match those in UVN1^ORQ11 so notif triggers | 
|---|
|  | 70 | ...;and orders displayed via alert follow-up action are in sync: | 
|---|
|  | 71 | ...S ORX=$G(^OR(100,ORNUM,0)) | 
|---|
|  | 72 | ...Q:'$L(ORX) | 
|---|
|  | 73 | ...Q:$P(ORX,U,12)="O"  ;quit if outpatient order | 
|---|
|  | 74 | ...Q:$L($P(ORX,U,17))  ;quit if someone has released order | 
|---|
|  | 75 | ...S ORST=$P($$STATUS^ORQOR2(ORNUM),U,2) | 
|---|
|  | 76 | ...I ORST'="DISCONTINUED",ORST'="COMPLETE",ORST'="EXPIRED",ORST'="UNRELEASED",ORST'="CHANGED",ORST'="CANCELLED",ORST'="LAPSED" D | 
|---|
|  | 77 | ....Q:'$D(^OR(100,ORNUM,8)) | 
|---|
|  | 78 | ....Q:$P(^OR(100,ORNUM,8,$P(^OR(100,ORNUM,8,0),U,3),0),U,8)  ;quit if someone has verified order | 
|---|
|  | 79 | ....D EN^ORB3(59,+ORPT,ORNUM,"","",ORNUM_"@") | 
|---|
|  | 80 | Q | 
|---|
|  | 81 | UVMED ;trigger unverified med (by nurse) notif | 
|---|
|  | 82 | N DG,ORGRP,ORPT,INVDT,ORNUM,ORBDT,OREDT,ORST,ORX,ORACT,ORDELAY | 
|---|
|  | 83 | ; | 
|---|
|  | 84 | ;if not queued via ORMTIM01 recently, look for past 48 hours: | 
|---|
|  | 85 | S:'$G(ORLASTQ) ORLASTQ=$$FMADD^XLFDT(ORNOW,"","-48","","") | 
|---|
|  | 86 | ; | 
|---|
|  | 87 | ;get number of hours delay before trigger: | 
|---|
|  | 88 | S ORDELAY=$$GET^XPAR("ALL","ORB UNVERIFIED MED ORDER",1,"I") | 
|---|
|  | 89 | ; | 
|---|
|  | 90 | ;look for meds unverified after <parameter value> hours: | 
|---|
|  | 91 | S ORBDT=$$FMADD^XLFDT(ORLASTQ,"",-ORDELAY,"","") | 
|---|
|  | 92 | S OREDT=$$FMADD^XLFDT(ORNOW,"",-ORDELAY,"","") | 
|---|
|  | 93 | ; | 
|---|
|  | 94 | F  S ORBDT=$O(^OR(100,"AF",ORBDT)) Q:(ORBDT="")!(ORBDT>OREDT)  D | 
|---|
|  | 95 | .S ORNUM="" F  S ORNUM=$O(^OR(100,"AF",ORBDT,ORNUM)) Q:ORNUM=""  D | 
|---|
|  | 96 | ..S ORPT=$P($G(^OR(100,ORNUM,0)),U,2) I ORPT]"" D | 
|---|
|  | 97 | ...;The following filters match those in UVN1^ORQ11 so notif triggers | 
|---|
|  | 98 | ...;and orders displayed via alert follow-up action are in sync: | 
|---|
|  | 99 | ...S ORX=$G(^OR(100,ORNUM,0)) | 
|---|
|  | 100 | ...Q:'$L(ORX) | 
|---|
|  | 101 | ...Q:'$L($$DGRX^ORQOR2(+ORNUM))  ;quit if not a pharmacy order | 
|---|
|  | 102 | ...Q:$P(ORX,U,12)="O"  ;quit if outpatient order | 
|---|
|  | 103 | ...Q:$L($P(ORX,U,17))  ;quit if someone has released order | 
|---|
|  | 104 | ...S ORST=$P($$STATUS^ORQOR2(ORNUM),U,2) | 
|---|
|  | 105 | ...I ORST'="DISCONTINUED",ORST'="COMPLETE",ORST'="EXPIRED",ORST'="UNRELEASED",ORST'="CHANGED",ORST'="CANCELLED",ORST'="LAPSED" D | 
|---|
|  | 106 | ....Q:'$D(^OR(100,ORNUM,8)) | 
|---|
|  | 107 | ....Q:$P(^OR(100,ORNUM,8,$P(^OR(100,ORNUM,8,0),U,3),0),U,8)  ;quit if someone has verified order | 
|---|
|  | 108 | ....D EN^ORB3(48,+ORPT,ORNUM,"","",ORNUM_"@") | 
|---|
|  | 109 | Q | 
|---|
|  | 110 | GRP(DG) ;Setup display groups | 
|---|
|  | 111 | ;DG=Display group to expand | 
|---|
|  | 112 | N STK,MEM,I | 
|---|
|  | 113 | S ORGRP(DG)="",STK=1,STK(STK)=DG_"^0",STK(0)=0,MEM=0 | 
|---|
|  | 114 | F I=0:0 S MEM=$O(^ORD(100.98,+STK(STK),1,MEM)) D @$S(+MEM'>0:"POP",1:"PROC") Q:STK<1 | 
|---|
|  | 115 | Q | 
|---|
|  | 116 | POP S STK=STK-1,MEM=$P(STK(STK),"^",2) Q | 
|---|
|  | 117 | PROC S $P(STK(STK),"^",2)=MEM,DG=$P(^ORD(100.98,+STK(STK),1,MEM,0),"^",1) | 
|---|
|  | 118 | S ORGRP(DG)="",STK=STK+1,STK(STK)=DG_"^0",MEM=0 | 
|---|
|  | 119 | Q | 
|---|