| 1 | ORB3SPEC ; slc/CLA - Support routine for ORB3 ;4/4/02  14:40
 | 
|---|
| 2 |  ;;3.0;ORDER ENTRY/RESULTS REPORTING;**139,220,215**;Dec 17, 1997
 | 
|---|
| 3 | SPECIAL(ORN,ORBASPEC,ORBU,ORBUI,ORNUM,ORDFN,ORDATA,ORBSMSG,ORBMSG,ORBSDEV,ORBPRIM,ORBATTD) ;
 | 
|---|
| 4 |  ;process special notifs to get recips (users,teams,devices)
 | 
|---|
| 5 |  ; ORN: notif ien
 | 
|---|
| 6 |  ; ORBASPEC: recip DUZ array
 | 
|---|
| 7 |  ; ORBU: recip debug array
 | 
|---|
| 8 |  ; ORBUI: ORBU cntr
 | 
|---|
| 9 |  ; ORNUM: order no
 | 
|---|
| 10 |  ; ORDFN: pt id
 | 
|---|
| 11 |  ; ORDATA: pkg data
 | 
|---|
| 12 |  ; ORBSMSG: special notif msg rtn by SPECIAL
 | 
|---|
| 13 |  ; ORBMSG: original notif msg
 | 
|---|
| 14 |  ; ORBSDEV: array of recip devices
 | 
|---|
| 15 |  ; ORBPRIM: pt's inpt primary care provider
 | 
|---|
| 16 |  ; ORBATTD: pt's attending physician
 | 
|---|
| 17 |  ;
 | 
|---|
| 18 |  N ORPAR,ORPTLOC
 | 
|---|
| 19 |  S ORPTLOC=$S($L($G(^DPT(ORDFN,.1))):"I",1:"O")  ;DBIA #10035
 | 
|---|
| 20 |  ;
 | 
|---|
| 21 |  I ORPTLOC="I" D  ;inpt flagged OI notifs
 | 
|---|
| 22 |  .I ORN=32 S ORPAR="ORB OI RESULTS - INPT" D OI
 | 
|---|
| 23 |  .I ORN=41 S ORPAR="ORB OI ORDERED - INPT" D OI
 | 
|---|
| 24 |  .I ORN=64 S ORPAR="ORB OI EXPIRING - INPT" D OI
 | 
|---|
| 25 |  ;
 | 
|---|
| 26 |  I ORPTLOC="O" D  ;outpt flagged OI notifs
 | 
|---|
| 27 |  .I ORN=60 S ORPAR="ORB OI RESULTS - OUTPT" D OI
 | 
|---|
| 28 |  .I ORN=61 S ORPAR="ORB OI ORDERED - OUTPT" D OI
 | 
|---|
| 29 |  .I ORN=65 S ORPAR="ORB OI EXPIRING - OUTPT" D OI
 | 
|---|
| 30 |  ;
 | 
|---|
| 31 |  I ORN=3!(ORN=14)!(ORN=44)!(ORN=57) D  ;lab results notifs
 | 
|---|
| 32 |  .D LRALRTS(ORN,ORDFN,ORDATA,.ORBSMSG,ORBMSG)
 | 
|---|
| 33 |  ;
 | 
|---|
| 34 |  I ORN=33 D  ;requested results notif
 | 
|---|
| 35 |  .I $D(ORBU) D
 | 
|---|
| 36 |  ..S ORBU(ORBUI)=" ",ORBUI=ORBUI+1
 | 
|---|
| 37 |  ..S ORBU(ORBUI)="Potential Orderer-flagged Results recipient: ",ORBUI=ORBUI+1
 | 
|---|
| 38 |  .N RECIP
 | 
|---|
| 39 |  .S RECIP=$$RSLTFLG^ORQOR2(ORNUM)
 | 
|---|
| 40 |  .I +$G(RECIP)>0 D
 | 
|---|
| 41 |  ..S ORBASPEC(+$G(RECIP))=""
 | 
|---|
| 42 |  ..I $D(ORBU) N NODE S NODE=$G(^VA(200,+$G(RECIP),0)) I $L(NODE) D
 | 
|---|
| 43 |  ...S ORBU(ORBUI)="   "_$P(NODE,U)_" is a potential recipient.",ORBUI=ORBUI+1
 | 
|---|
| 44 |  Q
 | 
|---|
| 45 | OI ;get potential recips for OI-flagged notifs
 | 
|---|
| 46 |  N OROI,ORLST,ORERR,ORBX,ORBZ,ORBE,ORBDUZ,ORBDEV,ORBUF
 | 
|---|
| 47 |  S OROI=+$G(^OR(100,+$G(ORNUM),.1,1,0))  ;get oi
 | 
|---|
| 48 |  Q:+$G(OROI)<0
 | 
|---|
| 49 |  I $D(ORBU) D
 | 
|---|
| 50 |  .S ORBU(ORBUI)=" ",ORBUI=ORBUI+1
 | 
|---|
| 51 |  .S ORBU(ORBUI)="Special potential recipients from parameter: "_ORPAR,ORBUI=ORBUI+1
 | 
|---|
| 52 |  S ORBE=0,ORBX=0
 | 
|---|
| 53 |  ;
 | 
|---|
| 54 |  ;process special recip users, teams and devices:
 | 
|---|
| 55 |  D ENVAL^XPAR(.ORLST,ORPAR,"`"_OROI,.ORERR)
 | 
|---|
| 56 |  I 'ORERR,$G(ORLST)>0 D
 | 
|---|
| 57 |  .F ORBX=1:1:ORLST S ORBE=$O(ORLST(ORBE)),ORBZ=$P(ORBE,";",2),ORBUF=0 D
 | 
|---|
| 58 |  ..;
 | 
|---|
| 59 |  ..; process USERS:
 | 
|---|
| 60 |  ..I ORBZ="VA(200," S ORBDUZ=$P(ORBE,";") I $L(ORBDUZ) D
 | 
|---|
| 61 |  ...I ORLST(ORBE,OROI)=1 S ORBASPEC(ORBDUZ)="",ORBUF=1
 | 
|---|
| 62 |  ...I ORLST(ORBE,OROI)=0,$$PPLINK^ORQPTQ1(ORBDUZ,ORDFN) S ORBASPEC(ORBDUZ)="",ORBUF=1
 | 
|---|
| 63 |  ...I $D(ORBU),ORBUF=1 N NODE S NODE=$G(^VA(200,ORBDUZ,0)) I $L(NODE) D
 | 
|---|
| 64 |  ....S ORBU(ORBUI)="   "_$P(NODE,U)_" is a potential recipient.",ORBUI=ORBUI+1
 | 
|---|
| 65 |  ..;
 | 
|---|
| 66 |  ..; process DEVICES:
 | 
|---|
| 67 |  ..I ORBZ="%ZIS(1," S ORBDEV=$P(ORBE,";") I $L(ORBDEV),$D(^%ZIS(1,ORBDEV))>0 D
 | 
|---|
| 68 |  ...S ORBDEV=$G(^%ZIS(1,ORBDEV,0)) I $D(ORBDEV) D
 | 
|---|
| 69 |  ....I ORLST(ORBE,OROI)=1 S ORBSDEV($P(ORBDEV,U))="",ORBUF=1
 | 
|---|
| 70 |  ....I ORLST(ORBE,OROI)=0,$$PDLINK^ORQPTQ1(ORBDEV,ORDFN) S ORBSDEV($P(ORBDEV,U))="",ORBUF=1
 | 
|---|
| 71 |  ....I $D(ORBU),ORBUF=1 D
 | 
|---|
| 72 |  .....S ORBU(ORBUI)="   "_$P(ORBDEV,U)_" is a device recipient.",ORBUI=ORBUI+1
 | 
|---|
| 73 |  ..;
 | 
|---|
| 74 |  ..; process TEAMS:
 | 
|---|
| 75 |  ..I ORBZ="OR(100.21," D SPECTEAM(ORBE)
 | 
|---|
| 76 |  D TITLE(OROI,ORPAR)
 | 
|---|
| 77 |  Q
 | 
|---|
| 78 | SPECTEAM(ORBE) ;get special team recips
 | 
|---|
| 79 |  N ORBLST,IJ,ORBTM
 | 
|---|
| 80 |  S ORBTM=$P(ORBE,";")
 | 
|---|
| 81 |  D TEAMPROV^ORQPTQ1(.ORBLST,ORBTM)
 | 
|---|
| 82 |  I $D(ORBU) N TNODE S TNODE=$G(^OR(100.21,ORBTM,0)) I $L(TNODE) D
 | 
|---|
| 83 |  .S ORBU(ORBUI)="   Team potential recipients from team "_$P(TNODE,U)_":",ORBUI=ORBUI+1
 | 
|---|
| 84 |  I +$G(ORBLST(1))>0 S IJ="" F  S IJ=$O(ORBLST(IJ)) Q:IJ=""  D
 | 
|---|
| 85 |  .S ORBDUZ=$P(ORBLST(IJ),U),ORBUF=0 I $L(ORBDUZ) D
 | 
|---|
| 86 |  ..I ORLST(ORBE,OROI)=1 S ORBASPEC(ORBDUZ_U_ORBTM)="",ORBUF=1
 | 
|---|
| 87 |  ..I ORLST(ORBE,OROI)=0,$D(^OR(100.21,ORBTM,10,"B",ORDFN_";DPT(")) S ORBASPEC(ORBDUZ_U_ORBTM)="",ORBUF=1
 | 
|---|
| 88 |  ..I $D(ORBU),ORBUF=1 N NODE S NODE=$G(^VA(200,ORBDUZ,0)) I $L(NODE) D
 | 
|---|
| 89 |  ...S ORBU(ORBUI)="     "_$P(NODE,U),ORBUI=ORBUI+1
 | 
|---|
| 90 |  ;
 | 
|---|
| 91 |  S ORBTD=$P($$TMDEV^ORB31(ORBTM),U,2)  ;tm's device
 | 
|---|
| 92 |  I $L(ORBTD) D
 | 
|---|
| 93 |  .S ORBSDEV(ORBTD)=""
 | 
|---|
| 94 |  .I $D(ORBU) D
 | 
|---|
| 95 |  ..S ORBU(ORBUI)="   Team's Device "_ORBTD_" is a recipient",ORBUI=ORBUI+1
 | 
|---|
| 96 |  Q
 | 
|---|
| 97 | LRALRTS(ORN,ORDFN,ORDATA,ORBSMSG,ORBMSG) ;find & delete matching alerts and gather recips
 | 
|---|
| 98 |  ; ORN: notif ien
 | 
|---|
| 99 |  ; ORDFN: pt id
 | 
|---|
| 100 |  ; ORDATA: pkg data
 | 
|---|
| 101 |  ; ORBSMSG: special notif msg rtn by LRALRTS
 | 
|---|
| 102 |  ; ORBMSG: original notif msg
 | 
|---|
| 103 |  ;
 | 
|---|
| 104 |  Q:+$G(ORN)<1
 | 
|---|
| 105 |  Q:+$G(ORDFN)<1
 | 
|---|
| 106 |  Q:+$G(ORDATA)<1
 | 
|---|
| 107 |  N LRID,ORY,I,J,XQAID,XQ0,XQ1,ORNE,RECIP,ORDATAE,LRIDE,STDATE
 | 
|---|
| 108 |  N ORTST,ORBMSGE,ORBMSGX,TXQAID,XQF,ORBHX,ORX,ORBI
 | 
|---|
| 109 |  ;
 | 
|---|
| 110 |  S LRID=$P($P(ORDATA,"|",2),"@")  ;get lab unique results id (OE IDE)
 | 
|---|
| 111 |  Q:+$G(LRID)<1
 | 
|---|
| 112 |  ;
 | 
|---|
| 113 |  ;get pt's alerts within 24 hours:
 | 
|---|
| 114 |  S STDATE=$$FMADD^XLFDT($$NOW^XLFDT,"","-24","","")
 | 
|---|
| 115 |  D PATIENT^XQALERT("ORY",ORDFN,STDATE,"") ;get pt's alerts
 | 
|---|
| 116 |  ;
 | 
|---|
| 117 |  ;look for pt's alerts with same notif ien and unique lab results id:
 | 
|---|
| 118 |  F I=1:1:ORY D
 | 
|---|
| 119 |  .S XQAID=$P(ORY(I),U,2)
 | 
|---|
| 120 |  .S ORBMSGX=$P(ORY(I),U)
 | 
|---|
| 121 |  .S ORNE=$P($P(XQAID,";"),",",3)  ;get notif ien
 | 
|---|
| 122 |  .Q:ORNE'=ORN
 | 
|---|
| 123 |  .;
 | 
|---|
| 124 |  .;find matching alert:
 | 
|---|
| 125 |  .D AHISTORY^XQALBUTL(XQAID,"ORBHX")
 | 
|---|
| 126 |  .S ORDATAE=$G(ORBHX(2))
 | 
|---|
| 127 |  .Q:'$L(ORDATAE)
 | 
|---|
| 128 |  .S LRIDE=$P($P(ORDATAE,"|",2),"@")  ;get lab rslts id from existng alert
 | 
|---|
| 129 |  .Q:LRIDE'=LRID
 | 
|---|
| 130 |  .;
 | 
|---|
| 131 |  .S:ORBMSG["[" ORTST=$P($P(ORBMSG,"[",2),"]")
 | 
|---|
| 132 |  .I ORBMSG'["[" D
 | 
|---|
| 133 |  ..S:ORBMSG["labs: " ORTST=$P(ORBMSG,"labs: ",2)
 | 
|---|
| 134 |  ..S:ORBMSG["results: " ORTST=$P(ORBMSG,"results: ",2)
 | 
|---|
| 135 |  .;
 | 
|---|
| 136 |  .S ORBMSGE=$P(ORBMSGX,"): ",2)
 | 
|---|
| 137 |  .;
 | 
|---|
| 138 |  .S ORX=0
 | 
|---|
| 139 |  .;if alert has recips, get recips from existing alert:
 | 
|---|
| 140 |  .S:$L($G(ORBHX(20,0))) ORX=$P(ORBHX(20,0),U,4)
 | 
|---|
| 141 |  .F ORBI=1:1:ORX D
 | 
|---|
| 142 |  ..S RECIP=+ORBHX(20,ORBI,0)
 | 
|---|
| 143 |  ..S ORBASPEC(RECIP)=""  ;add recip to new alert recip list
 | 
|---|
| 144 |  .;
 | 
|---|
| 145 |  .;delete existing alert:
 | 
|---|
| 146 |  .S XQAKILL=0  ;delete for all recips
 | 
|---|
| 147 |  .D DELETE^XQALERT
 | 
|---|
| 148 |  .K XQAKILL,XQAID
 | 
|---|
| 149 |  ;
 | 
|---|
| 150 |  ;if NO prev alert msg for this pt, notif, lab unique id:
 | 
|---|
| 151 |  I '$L($G(ORBMSGE)) S ORBSMSG=ORBMSG
 | 
|---|
| 152 |  ;
 | 
|---|
| 153 |  ;if prev alert msg for this pt, notif, lab unique id:
 | 
|---|
| 154 |  I $L($G(ORBMSGE)) D
 | 
|---|
| 155 |  .S:ORBMSGE["[" ORBSMSG=$P(ORBMSGE,"]")_", "_ORTST_"]"
 | 
|---|
| 156 |  .S:ORBMSGE'["[" ORBSMSG=ORBMSGE_", "_ORTST
 | 
|---|
| 157 |  ;
 | 
|---|
| 158 |  Q
 | 
|---|
| 159 |  ;
 | 
|---|
| 160 | TITLE(OROI,ORPAR) ;get provider recips
 | 
|---|
| 161 |  N ORTIT
 | 
|---|
| 162 |  I $D(ORBU) D
 | 
|---|
| 163 |  .S ORBU(ORBUI)=" ",ORBUI=ORBUI+1
 | 
|---|
| 164 |  .S ORBU(ORBUI)="Special potential recipients from parameter: "_ORPAR_" PR",ORBUI=ORBUI+1
 | 
|---|
| 165 |  ;
 | 
|---|
| 166 |  ;process special recip users, teams and devices for Provider Recipients
 | 
|---|
| 167 |  S ORTIT=$$GET^XPAR("ALL",ORPAR_" PR","`"_OROI,"E")
 | 
|---|
| 168 |  Q:'$L(ORTIT)
 | 
|---|
| 169 |  I ORTIT["P" D PRIMARY
 | 
|---|
| 170 |  I ORTIT["A" D ATTEND
 | 
|---|
| 171 |  I ORTIT["T" D TEAMS
 | 
|---|
| 172 |  I ORTIT["O" D ORDERER
 | 
|---|
| 173 |  I ORTIT["E" D ENTERBY
 | 
|---|
| 174 |  I ORTIT["R" D PCMMPRIM
 | 
|---|
| 175 |  I ORTIT["S" D PCMMASSC
 | 
|---|
| 176 |  I ORTIT["M" D PCMMTEAM
 | 
|---|
| 177 |  Q
 | 
|---|
| 178 | PRIMARY ;
 | 
|---|
| 179 |  I $D(ORBU),+$G(ORBPRIM)>0 S ORBU(ORBUI)=" Flagged OI Inpt primary provider:",ORBUI=ORBUI+1
 | 
|---|
| 180 |  I $D(ORBU),+$G(ORBPRIM)<1 S ORBU(ORBUI)=" Flagged OI Inpt primary provider: option cannot determine without A/D/T event data.",ORBUI=ORBUI+1
 | 
|---|
| 181 |  I +$G(ORBPRIM)>0 S ORBASPEC(ORBPRIM)=""
 | 
|---|
| 182 |  Q
 | 
|---|
| 183 | ATTEND ;
 | 
|---|
| 184 |  I $D(ORBU),+$G(ORBATTD)>0 S ORBU(ORBUI)=" Flagged OI Attending physician:",ORBUI=ORBUI+1
 | 
|---|
| 185 |  I $D(ORBU),+$G(ORBATTD)<1 S ORBU(ORBUI)=" Flagged OI Attending physician: option cannot determine without A/D/T event data.",ORBUI=ORBUI+1
 | 
|---|
| 186 |  I +$G(ORBATTD)>0 S ORBASPEC(ORBATTD)=""
 | 
|---|
| 187 |  Q
 | 
|---|
| 188 | TEAMS ;
 | 
|---|
| 189 |  N ORBLST,ORBI,ORBJ,ORBTM,ORBTNAME,ORBTTYPE,ORBTD
 | 
|---|
| 190 |  I $D(ORBU) S ORBU(ORBUI)=" Flagged OI Teams/Personal Lists related to patient:",ORBUI=ORBUI+1
 | 
|---|
| 191 |  D TMSPT^ORQPTQ1(.ORBLST,ORDFN)
 | 
|---|
| 192 |  Q:+$G(ORBLST(1))<1
 | 
|---|
| 193 |  S ORBI="" F  S ORBI=$O(ORBLST(ORBI)) Q:ORBI=""  D
 | 
|---|
| 194 |  .S ORBTM=$P(ORBLST(ORBI),U),ORBTNAME=$P(ORBLST(ORBI),U,2)
 | 
|---|
| 195 |  .S ORBTTYPE=$P(ORBLST(ORBI),U,3)
 | 
|---|
| 196 |  .I $D(ORBU) D
 | 
|---|
| 197 |  ..S ORBU(ORBUI)="  Patient list "_ORBTNAME_" ["_ORBTTYPE_"]:",ORBUI=ORBUI+1
 | 
|---|
| 198 |  .N ORBLST2 D TEAMPROV^ORQPTQ1(.ORBLST2,ORBTM)
 | 
|---|
| 199 |  .Q:+$G(ORBLST2(1))<1
 | 
|---|
| 200 |  .S ORBJ="" F  S ORBJ=$O(ORBLST2(ORBJ)) Q:ORBJ=""  D
 | 
|---|
| 201 |  ..S ORBDUZ=$P(ORBLST2(ORBJ),U)_U_ORBTM I +$G(ORBDUZ)>0 S ORBASPEC(ORBDUZ)=""
 | 
|---|
| 202 |  .S ORBTD=$P($$TMDEV^ORB31(ORBTM),U,2)  ;tm's device
 | 
|---|
| 203 |  .I $L(ORBTD) D
 | 
|---|
| 204 |  ..S ORBSDEV(ORBTD)=""
 | 
|---|
| 205 |  ..I $D(ORBU) D
 | 
|---|
| 206 |  ...S ORBU(ORBUI)="   Team's Device "_ORBTD_" is a recipient",ORBUI=ORBUI+1
 | 
|---|
| 207 |  Q
 | 
|---|
| 208 | ORDERER ;
 | 
|---|
| 209 |  N ORBDUZ
 | 
|---|
| 210 |  I $D(ORBU) S ORBU(ORBUI)=" Flagged OI Ordering provider:",ORBUI=ORBUI+1
 | 
|---|
| 211 |  Q:+$G(ORNUM)<1
 | 
|---|
| 212 |  S ORBDUZ=$$ORDERER^ORQOR2(ORNUM)
 | 
|---|
| 213 |  I +$G(ORBDUZ)>0 D
 | 
|---|
| 214 |  .S ORBASPEC(ORBDUZ)=""
 | 
|---|
| 215 |  Q
 | 
|---|
| 216 | ENTERBY ;
 | 
|---|
| 217 |  N ORBDUZ
 | 
|---|
| 218 |  I $D(ORBU) S ORBU(ORBUI)=" Flagged OI User entering order's most recent activity:",ORBUI=ORBUI+1
 | 
|---|
| 219 |  Q:+$G(ORNUM)<1
 | 
|---|
| 220 |  I $D(^OR(100,ORNUM,8,0)) D
 | 
|---|
| 221 |  .S ORBDUZ=$P(^OR(100,ORNUM,8,$P(^OR(100,ORNUM,8,0),U,3),0),U,13)
 | 
|---|
| 222 |  I +$G(ORBDUZ)>0 S ORBASPEC(ORBDUZ)=""
 | 
|---|
| 223 |  Q
 | 
|---|
| 224 | PCMMPRIM ;
 | 
|---|
| 225 |  N ORBDUZ
 | 
|---|
| 226 |  I $D(ORBU) S ORBU(ORBUI)=" Flagged OI PCMM Primary Care Practitioner:",ORBUI=ORBUI+1
 | 
|---|
| 227 |  S ORBDUZ=+$$OUTPTPR^SDUTL3(ORDFN,$$NOW^XLFDT,1)  ;DBIA #1252
 | 
|---|
| 228 |  I +$G(ORBDUZ)>0 S ORBASPEC(ORBDUZ)=""
 | 
|---|
| 229 |  Q
 | 
|---|
| 230 | PCMMASSC ;
 | 
|---|
| 231 |  N ORBDUZ
 | 
|---|
| 232 |  I $D(ORBU) S ORBU(ORBUI)=" Flagged OI PCMM Associate Provider:",ORBUI=ORBUI+1
 | 
|---|
| 233 |  S ORBDUZ=+$$OUTPTAP^SDUTL3(ORDFN,$$NOW^XLFDT)  ;DBIA #1252
 | 
|---|
| 234 |  I +$G(ORBDUZ)>0 S ORBASPEC(ORBDUZ)=""
 | 
|---|
| 235 |  Q
 | 
|---|
| 236 | PCMMTEAM ;
 | 
|---|
| 237 |  N ORPCMM,ORPCMMDZ,ORBDUZ
 | 
|---|
| 238 |  I $D(ORBU) S ORBU(ORBUI)=" Flagged OI PCMM Team Position Assignments:",ORBUI=ORBUI+1
 | 
|---|
| 239 |  S ORPCMM=$$PRPT^SCAPMC(ORDFN,,,,,,"^TMP(""ORPCMM"",$J)",)  ;DBIA #1916
 | 
|---|
| 240 |  S ORPCMMDZ=0
 | 
|---|
| 241 |  F  S ORPCMMDZ=$O(^TMP("ORPCMM",$J,"SCPR",ORPCMMDZ)) Q:'ORPCMMDZ  D
 | 
|---|
| 242 |  .S ORBDUZ=ORPCMMDZ S ORBASPEC(ORBDUZ)=""
 | 
|---|
| 243 |  K ^TMP("ORPCMM",$J)
 | 
|---|
| 244 |  Q
 | 
|---|