| 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
 | 
|---|