| [613] | 1 | PSBVDLU1 ;BIRMINGHAM/EFC-VIRTUAL DUE LIST (VDL) UTILITIES ;Mar 2004
 | 
|---|
 | 2 |  ;;3.0;BAR CODE MED ADMIN;**13,32**;Mar 2004;Build 32
 | 
|---|
 | 3 |  ;
 | 
|---|
 | 4 |  ; Reference/IA
 | 
|---|
 | 5 |  ; EN^PSJBCMA1/2829
 | 
|---|
 | 6 |  ;
 | 
|---|
 | 7 | ODDSCH(PSBTABX) ;
 | 
|---|
 | 8 |  I (PSBOST'<PSBWBEG)&(PSBOST'>PSBWEND) D ADD(PSBREC,PSBOTXT,PSBOST,PSBDDS,PSBSOLS,PSBADDS,PSBTABX)  ;Include start date/time as admin
 | 
|---|
 | 9 |  S PSBQUIT=0,PSBCDT=PSBOST F  S PSBCDT=$$FMADD^XLFDT(PSBCDT,"","",PSBFREQ) Q:PSBQUIT=1  D
 | 
|---|
 | 10 |  .I $P(PSBCDT,".",2)="" S PSBCDT=PSBCDT-1_".24"
 | 
|---|
 | 11 |  .I PSBCDT>PSBWEND S PSBQUIT=1 Q
 | 
|---|
 | 12 |  .I PSBCDT'<PSBWBEG,PSBCDT<PSBOSP D ADD(PSBREC,PSBOTXT,PSBCDT,PSBDDS,PSBSOLS,PSBADDS,PSBTABX) Q
 | 
|---|
 | 13 |  Q
 | 
|---|
 | 14 | GETFREQ(PSBDFN,PSBORDN) ;
 | 
|---|
 | 15 |  K ^TMP("PSJ1",$J)
 | 
|---|
 | 16 |  D EN^PSJBCMA1(PSBDFN,PSBORDN,1)
 | 
|---|
 | 17 |  S PSBFREQ=$P(^TMP("PSJ1",$J,4),U,11)
 | 
|---|
 | 18 |  S PSBSCHBR=$P(^TMP("PSJ1",$J,2),"^",5)
 | 
|---|
 | 19 |  I $$PSBDCHK1^PSBVT1(PSBSCHBR) S PSBFREQ=""
 | 
|---|
 | 20 |  K ^TMP("PSJ1",$J)
 | 
|---|
 | 21 |  Q PSBFREQ
 | 
|---|
 | 22 |  ;
 | 
|---|
 | 23 | GETADMIN(PSBDFN,PSBORDN,PSBSTRT,PSBFREQ,PSBEVDT) ;
 | 
|---|
 | 24 |  ;Determine administration times of an odd schedule for today
 | 
|---|
 | 25 |  N PSBADMIN
 | 
|---|
 | 26 |  K ^TMP("PSB",$J,"GETADMIN")
 | 
|---|
 | 27 |  D EN^PSJBCMA1(PSBDFN,PSBORDN,1)
 | 
|---|
 | 28 |  S PSBADMIN=$P(^TMP("PSJ1",$J,4),U,9),PSBFREQ=$P(^TMP("PSJ1",$J,4),U,11),^TMP("PSB",$J,"GETADMIN",0)=PSBADMIN
 | 
|---|
 | 29 |  I $E(PSBFREQ)'?1N K ^TMP("PSJ1",$J) Q $G(^TMP("PSB",$J,"GETADMIN",0))
 | 
|---|
 | 30 |  I PSBFREQ=0 K ^TMP("PSJ1",$J) Q $G(^TMP("PSB",$J,"GETADMIN",0))
 | 
|---|
 | 31 |  I PSBSTRT'<PSBEVDT S PSBADMIN=$E($P(PSBSTRT,".",2)_"0000",1,4),^TMP("PSB",$J,"GETADMIN",0)=PSBADMIN
 | 
|---|
 | 32 |  S PSBCDT=PSBSTRT,(PSBADTMX,PSBQUIT)=0 F  S PSBCDT=$$FMADD^XLFDT(PSBCDT,"","",PSBFREQ) D  Q:PSBQUIT=1
 | 
|---|
 | 33 |  .I $P(PSBCDT,".",2)="" S PSBCDT=PSBCDT-1_".24"
 | 
|---|
 | 34 |  .I (PSBCDT\1)>(PSBEVDT\1) S PSBQUIT=1 Q
 | 
|---|
 | 35 |  .I (PSBCDT\1)=(PSBEVDT\1) S PSBADMIN=PSBADMIN_$S(PSBADMIN="":"",1:"-")_$E($P(PSBCDT,".",2)_"0000",1,4)
 | 
|---|
 | 36 |  .S ^TMP("PSB",$J,"GETADMIN",PSBADTMX)=PSBADMIN
 | 
|---|
 | 37 |  .S:($L(PSBADMIN)+5)>255 PSBADTMX=PSBADTMX+1,PSBADMIN=""
 | 
|---|
 | 38 |  K ^TMP("PSJ1",$J),PSBADTMX
 | 
|---|
 | 39 |  Q $G(^TMP("PSB",$J,"GETADMIN",0))
 | 
|---|
 | 40 |  ;
 | 
|---|
 | 41 | ADD(PSBREC,PSBSI,PSBDT,PSBDD,PSBSOL,PSBADD,PSBTAB) ;
 | 
|---|
 | 42 |  ;
 | 
|---|
 | 43 |  ; Description: Add order to ^TMP("PSB",$J,PSBTAB,...) for RPC Return RESULTS
 | 
|---|
 | 44 |  ;
 | 
|---|
 | 45 |  ; PSBREC=order hdr from above
 | 
|---|
 | 46 |  ; PSBSI=special instructions
 | 
|---|
 | 47 |  ; PSBDT=admin date/time
 | 
|---|
 | 48 |  ; PSBDD=Dispense Drugs
 | 
|---|
 | 49 |  ; PSBSOL=Solutions
 | 
|---|
 | 50 |  ; PSBADD=Additives
 | 
|---|
 | 51 |  ;
 | 
|---|
 | 52 |  N PSB
 | 
|---|
 | 53 |  S PSBDT=$E(PSBDT,1,12),PSBQR=0
 | 
|---|
 | 54 |  S PSB=$O(^TMP("PSB",$J,PSBTAB,""),-1) ; Get next node
 | 
|---|
 | 55 |  S $P(PSBREC,U,14)=PSBDT ; Admin Time sits in ^14
 | 
|---|
 | 56 |  I $P(PSBREC,U,5)'="O" S X=$O(^PSB(53.79,"AORD",DFN,PSBONX,PSBDT,0)) D:X
 | 
|---|
 | 57 |  .S $P(PSBREC,U,12)=X
 | 
|---|
 | 58 |  .K PSBLCK L +^PSB(53.79,X):1  I  L -^PSB(53.79,X) S PSBLCK=1
 | 
|---|
 | 59 |  .S PSBSTUS=$P(^PSB(53.79,X,0),U,9),$P(PSBREC,U,13)=$S(PSBSTUS="N":"",(PSBSTUS="")&$G(PSBLCK):"U",1:PSBSTUS),$P(PSBREC,U,23)=$P(^PSB(53.79,X,0),U,10),$P(PSBREC,U,24)=$P(^PSB(53.79,X,0),U,7)
 | 
|---|
 | 60 |  .I $D(^PSB(53.79,X)) I PSBDOSEF="PATCH",PSBSTUS="G",PSBDT=$P(^PSB(53.79,X,.1),U,3),PSBQRR=0 S PSBQR=1
 | 
|---|
 | 61 |  .I PSBSTUS="G",$G(PSBFLAG) D CHECK ;Get the correct dispense drug
 | 
|---|
 | 62 |  I ($P(PSBREC,U,5)="O") D
 | 
|---|
 | 63 |  .S X=$O(^PSB(53.79,"AORDX",DFN,PSBONX,"")) Q:X=""
 | 
|---|
 | 64 |  .S Y=$O(^PSB(53.79,"AORDX",DFN,PSBONX,X,"")) Q:Y=""  S $P(PSBREC,U,12)=Y
 | 
|---|
 | 65 |  .K PSBLCK L +^PSB(53.79,Y):1  I  L -^PSB(53.79,Y) S PSBLCK=1
 | 
|---|
 | 66 |  .S PSBSTUS=$P(^PSB(53.79,Y,0),U,9),$P(PSBREC,U,13)=$S(PSBSTUS="N":"",(PSBSTUS="")&$G(PSBLCK):"U",1:PSBSTUS),$P(PSBREC,U,24)=$P(^PSB(53.79,Y,0),U,7)
 | 
|---|
 | 67 |  .I $D(^PSB(53.79,Y)) I PSBDOSEF="PATCH",PSBSTUS="G",PSBDT=$P(^PSB(53.79,Y,.1),U,3),PSBQRR=0 S PSBQR=1
 | 
|---|
 | 68 |  .I PSBSTUS="G",$G(PSBFLAG) D CHECK
 | 
|---|
 | 69 |  Q:PSBQR=1
 | 
|---|
 | 70 |  S $P(PSBREC,U,25)=0 I $G(PSBTRFL),$P(PSBREC,U,11)]"",$P(PSBREC,U,11)'<$G(PSBNTDT),$P(PSBREC,U,11)'>$G(PSBTRDT) S $P(PSBREC,U,25)=1
 | 
|---|
 | 71 |  S PSB=PSB+1,^TMP("PSB",$J,PSBTAB,PSB)=PSBREC ; Order Hdr
 | 
|---|
 | 72 |  I $P(PSBREC,U,12)]"" S PSBONVDL($P(PSBREC,U,12))=""
 | 
|---|
 | 73 |  S PSB=PSB+1,^TMP("PSB",$J,PSBTAB,PSB)=PSBSI ; Special Instructions
 | 
|---|
 | 74 |  ; add dispense drugs
 | 
|---|
 | 75 |  I $D(PSBDDA) S X="" F  S X=$O(PSBDDA(X)) Q:X=""  S PSB=PSB+1,^TMP("PSB",$J,PSBTAB,PSB)=PSBDDA(X)
 | 
|---|
 | 76 |  S PSBCHDT=0
 | 
|---|
 | 77 |  I (PSBTAB'["CVRSHT"),(PSBONX["V"),(PSBOSTS="D"),($G(PSBFOR)="") D  Q  ;get infusing bag from DCed but not DEed orders
 | 
|---|
 | 78 |  .D PSJ^PSBVT(PSBX)
 | 
|---|
 | 79 |  .D INFUSING^PSBVDLU2 I PSBCOMP=0 Q
 | 
|---|
 | 80 |  .I $D(PSBSOLA) S X="" F  S X=$O(PSBSOLA(X)) Q:X=""  S PSB=PSB+1,^TMP("PSB",$J,PSBTAB,PSB)=PSBSOLA(X)
 | 
|---|
 | 81 |  .I $D(PSBADA) S X="" F  S X=$O(PSBADA(X)) Q:X=""  S PSB=PSB+1,^TMP("PSB",$J,PSBTAB,PSB)=PSBADA(X)
 | 
|---|
 | 82 |  .S X="" F  S X=$O(PSBPORA(PSBONX,X)) S PSBUID=$P(PSBPORA(PSBONX,X),U,1) Q:PSBUID]""  Q:X=""
 | 
|---|
 | 83 |  .I PSBUID["P" Q
 | 
|---|
 | 84 |  .I PSBUID["WS" D
 | 
|---|
 | 85 |  ..S PSBNODE=$O(^PSB(53.79,"AUID",DFN,X,PSBUID,""))
 | 
|---|
 | 86 |  ..S PSBUIDA(PSBUID)="ID"_U_PSBUID
 | 
|---|
 | 87 |  ..S X=0 F  S X=$O(^PSB(53.79,PSBNODE,.6,X)) Q:'X  S PSBUIDA(PSBUID)=PSBUIDA(PSBUID)_U_"ADD;"_$P(^PSB(53.79,PSBNODE,.6,X,0),U,1)
 | 
|---|
 | 88 |  ..S X=0 F  S X=$O(^PSB(53.79,PSBNODE,.7,X)) Q:'X  S PSBUIDA(PSBUID)=PSBUIDA(PSBUID)_U_"SOL;"_$P(^PSB(53.79,PSBNODE,.7,X,0),U,1)
 | 
|---|
 | 89 |  .S PSBSONX=PSBONX
 | 
|---|
 | 90 |  .I '$D(PSBUIDA(PSBUID)) S PSBCKOR="" F  S PSBCKOR=$O(PSBPORA(PSBSONX,PSBCKOR)) Q:PSBCKOR=""  D CLEAN^PSBVT,PSJ1^PSBVT(DFN,PSBCKOR) Q:$D(PSBUIDA(PSBUID))
 | 
|---|
 | 91 |  .S PSBONX=PSBSONX
 | 
|---|
 | 92 |  .S:$D(PSBUIDA(PSBUID)) PSB=PSB+2,^TMP("PSB",$J,PSBTAB,PSB-1)=PSBUIDA(PSBUID),^TMP("PSB",$J,PSBTAB,PSB)="END"
 | 
|---|
 | 93 |  .D CLEAN^PSBVT,PSJ1^PSBVT(DFN,$O(PSBPORA("")))
 | 
|---|
 | 94 |  ; add additives
 | 
|---|
 | 95 |  I $D(PSBADA) S X="" F  S X=$O(PSBADA(X)) Q:X=""  S PSB=PSB+1,^TMP("PSB",$J,PSBTAB,PSB)=PSBADA(X)
 | 
|---|
 | 96 |  ; add solutions
 | 
|---|
 | 97 |  I $D(PSBSOLA) S X="" F  S X=$O(PSBSOLA(X)) Q:X=""  S $P(PSBSOLA(X),U,5)="",PSB=PSB+1,^TMP("PSB",$J,PSBTAB,PSB)=PSBSOLA(X)
 | 
|---|
 | 98 |  I PSBONX["V" D EN^PSBPOIV(DFN,PSBONX)  ; get bags
 | 
|---|
 | 99 |  I $D(^TMP("PSBAR",$J)) S PSBUID=DFN_"V"_99999 F  S PSBUID=$O(^TMP("PSBAR",$J,PSBUID),-1) Q:PSBUID=""  D
 | 
|---|
 | 100 |  .S PSBUIDS=^TMP("PSBAR",$J,PSBUID)
 | 
|---|
 | 101 |  .I $P(PSBUIDS,U,1)="I",$P(PSBUIDS,U,2)'="I",$P(PSBUIDS,U,2)'="S" Q  ; bag has invalid IV parameter, is not infusing or stopped
 | 
|---|
 | 102 |  .I $P(PSBUIDS,U,2)'="I",$P(PSBUIDS,U,2)'="S",$P(PSBUIDS,U,8)'="" Q  ; label is no longer valid, bag is not infusing or stopped
 | 
|---|
 | 103 |  .I $P(PSBUIDS,U,2)="C" Q  ; bag is completed
 | 
|---|
 | 104 |  .I $P(PSBUIDS,U,2)="G" Q  ; bag is given (PBTAB)
 | 
|---|
 | 105 |  .S PSB=PSB+1,^TMP("PSB",$J,PSBTAB,PSB)=$P(PSBUIDS,U,10,999)
 | 
|---|
 | 106 |  K ^TMP("PSBAR",$J)
 | 
|---|
 | 107 |  S PSB=PSB+1,^TMP("PSB",$J,PSBTAB,PSB)="END"
 | 
|---|
 | 108 |  S ^TMP("PSB",$J,PSBTAB,0)=PSB
 | 
|---|
 | 109 |  Q
 | 
|---|
 | 110 |  ;
 | 
|---|
 | 111 | CHECK S FILE=53.795,PSBNODE=.5,PSBIENS=X_","
 | 
|---|
 | 112 |  F I=0:0 S I=$O(^PSB(53.79,X,PSBNODE,I)) Q:'I  S $P(PSBDDS,U,3,4)=$$GET1^DIQ(FILE,I_","_PSBIENS,.01,"I")_U_$$GET1^DIQ(FILE,I_","_PSBIENS,.01)
 | 
|---|
 | 113 |  Q
 | 
|---|
 | 114 |  ;
 | 
|---|
 | 115 | VNURSE(PSBTAB) ;add initials of verifying pharmacist/verifying nurse
 | 
|---|
 | 116 |  F PSBLP=1:1:$P(^TMP("PSB",$J,PSBTAB,0),U,1) S X=^TMP("PSB",$J,PSBTAB,PSBLP) I $P(X,U)=DFN D
 | 
|---|
 | 117 |  .K ^TMP("PSJ1",$J)
 | 
|---|
 | 118 |  .D PSJ1^PSBVT(DFN,$P(X,U,2))
 | 
|---|
 | 119 |  .S $P(^TMP("PSB",$J,PSBTAB,PSBLP),U,19)=$S(PSBVNI]"":PSBVNI,1:"***")
 | 
|---|
 | 120 |  K PSBLP,PSBTAB
 | 
|---|
 | 121 |  Q
 | 
|---|
 | 122 |  ;
 | 
|---|
 | 123 | OKAY(PSBSTRT,PSBADMIN,PSBSCH,PSBORDER,PSBDRUG,PSBFREQ,PSBOSTS) ;
 | 
|---|
 | 124 |  ;
 | 
|---|
 | 125 |  ; Description: Determines if an order schedule is valid for
 | 
|---|
 | 126 |  ;  the date in PSBADMIN (i.e. Q4D, is it valid today)
 | 
|---|
 | 127 |  ;
 | 
|---|
 | 128 |  ; PSBSTRT:  Start Date of order (Time ignored)
 | 
|---|
 | 129 |  ; PSBADMIN: Date of administration to check (Time ignored)
 | 
|---|
 | 130 |  ; PSBSCH:  Schedule (i.e. MO-WE-FR@0900 or Q48H...)
 | 
|---|
 | 131 |  ; PSBORDER: Order reference
 | 
|---|
 | 132 |  ; PSBDRUG:  Drug ordered (Orderable Item)
 | 
|---|
 | 133 |  ; PSBOSTS: The status of the order
 | 
|---|
 | 134 |  ;
 | 
|---|
 | 135 |  N PSBOKAY,PSBDAYS,PSBDOW
 | 
|---|
 | 136 |  S PSBOSTS=$G(PSBOSTS)
 | 
|---|
 | 137 |  ;
 | 
|---|
 | 138 |  S PSBOKAY=0  ; Default Flag
 | 
|---|
 | 139 |  I PSBFREQ'="",PSBFREQ'="D",PSBFREQ'>1440 Q 1
 | 
|---|
 | 140 |  ;PRN and ONE TIMES show everyday
 | 
|---|
 | 141 |  I (PSBSCHT="P")!(PSBSCHT="O") Q 1
 | 
|---|
 | 142 |  S PSBDAYS=$$DAYS(PSBSCH)
 | 
|---|
 | 143 |  ;
 | 
|---|
 | 144 |  I PSBDAYS=1 S PSBOKAY=1 Q PSBOKAY  ; Order is everyday
 | 
|---|
 | 145 |  ;
 | 
|---|
 | 146 |  ; find out if today is a good day for multi days
 | 
|---|
 | 147 |  S PSBOKAY=0,PSBRDTE=PSBSTRT
 | 
|---|
 | 148 |  S PSBADBR=PSBADMIN\1
 | 
|---|
 | 149 |  S PSBENR=(PSBADMIN\1)+1
 | 
|---|
 | 150 |  I PSBDAYS>1 D  Q PSBOKAY
 | 
|---|
 | 151 |  .I PSBADBR=(PSBSTRT\1) S PSBOKAY=1
 | 
|---|
 | 152 |  .F  S PSBRDTE=$$FMADD^XLFDT(PSBRDTE,"","",PSBFREQ) Q:PSBRDTE>PSBENR  D
 | 
|---|
 | 153 |  ..I $P(PSBRDTE,".",2)="" S PSBRDTE=PSBRDTE-1_".24"
 | 
|---|
 | 154 |  ..I PSBRDTE\1=PSBADBR S PSBOKAY=1
 | 
|---|
 | 155 |  ..I PSBOKAY="1" Q
 | 
|---|
 | 156 |  ;
 | 
|---|
 | 157 |  ; Try the MO-WE-FR@0800 thing as last resort
 | 
|---|
 | 158 |  S X=PSBADMIN D H^%DTC I %Y=-1 D  Q PSBOKAY  ; Error
 | 
|---|
 | 159 |  .S PSBOKAY=0
 | 
|---|
 | 160 |  .Q:PSBOSTS="E"
 | 
|---|
 | 161 |  .Q:$G(PSBMHND)="PSBOMH"
 | 
|---|
 | 162 |  .D ERROR^PSBMLU($G(PSBORDER,"UNKNOWN"),$G(PSBDRUG,""),DFN,"Unable to determine schedule "_PSBSCH,PSBSCH)
 | 
|---|
 | 163 |  S PSBDOW=$P("SU^MO^TU^WE^TH^FR^SA",U,%Y+1)
 | 
|---|
 | 164 |  I $F(PSBSCH,PSBDOW)>0 S PSBOKAY=1 Q PSBOKAY
 | 
|---|
 | 165 |  S PSBOKAY=0
 | 
|---|
 | 166 |  Q PSBOKAY
 | 
|---|
 | 167 |  ;
 | 
|---|
 | 168 | DAYS(PSB) ; Return days between doses (-1: error, 1:everyday 2: QOD...)
 | 
|---|
 | 169 |  ;
 | 
|---|
 | 170 |  ; Is it a PRN
 | 
|---|
 | 171 |  I PSB?.E1"PRN".E Q 1  ; Straight PRN - As Needed
 | 
|---|
 | 172 |  ;
 | 
|---|
 | 173 |  S PSB=$TR(PSB," ","")
 | 
|---|
 | 174 |  I PSB?2.4N.E Q 1
 | 
|---|
 | 175 |  S X=PSBFREQ/1440 Q X
 | 
|---|
 | 176 |  ;
 | 
|---|
 | 177 |  Q
 | 
|---|
 | 178 |  ;
 | 
|---|
 | 179 | LAST ;
 | 
|---|
 | 180 |  S PSBCC=0
 | 
|---|
 | 181 |  S ZZ="" F  S ZZ=$O(^PSB(53.79,X,.3,ZZ),-1) Q:'ZZ  Q:PSBFLAG=1  S PSBDATA2=$G(^(ZZ,0)) D
 | 
|---|
 | 182 |  .S PSBCC=PSBCC+1
 | 
|---|
 | 183 |  .I (PSBCC=2)!($P($P(PSBDATA2,U)," ")="Refused:")!($P($P(PSBDATA2,U)," ")="Held:") S $P(PSBREC,U,11)=$P(PSBDATA2,U,3),PSBFLAG=1
 | 
|---|
 | 184 |  Q
 | 
|---|
 | 185 |  ;
 | 
|---|