1 | PSBVDLPB ;BIRMINGHAM/EFC-BCMA IV VIRTUAL DUE LIST ;Mar 2004
|
---|
2 | ;;3.0;BAR CODE MED ADMIN;**11,13,38,32**;Mar 2004;Build 32
|
---|
3 | ;Per VHA Directive 2004-038 (or future revisions regarding same), this routine should not be modified.
|
---|
4 | ;
|
---|
5 | ; Reference/IA
|
---|
6 | ; EN^PSJBCMA/2828
|
---|
7 | ; $$GET^XPAR/2263
|
---|
8 | ; File 200/10060
|
---|
9 | ;
|
---|
10 | EN(DFN,PSBDT) ; Default Order List Return for Today
|
---|
11 | ;
|
---|
12 | ; RPC: PSB GETORDERLIST
|
---|
13 | ;
|
---|
14 | ; Description:
|
---|
15 | ; Returns the current IV order set for today to display on the
|
---|
16 | ; client VDL
|
---|
17 | ;
|
---|
18 | ;
|
---|
19 | N PSBDATA,PSBTBOUT
|
---|
20 | S PSBTBOUT=0,PSBDOADD=0
|
---|
21 | S:PSBTAB="PBTAB" PSBDOADD=1
|
---|
22 | ;
|
---|
23 | ;This routine now re-uses the ^TMP("PSJ",$J global built in PSBVDLTB
|
---|
24 | ;
|
---|
25 | I $G(^TMP("PSJ",$J,1,0))=-1 Q ; No orders
|
---|
26 | ;
|
---|
27 | F PSBX=0:0 S PSBX=$O(^TMP("PSJ",$J,PSBX)) Q:('PSBX)!(PSBTBOUT) D
|
---|
28 | .D CLEAN^PSBVT,PSJ^PSBVT(PSBX)
|
---|
29 | .;
|
---|
30 | .; << Standard checks for ALL orders >>
|
---|
31 | .;
|
---|
32 | .Q:PSBONX["P" ; No Pending Orders
|
---|
33 | .Q:'$$IVPTAB^PSBVDLU3(PSBOTYP,PSBIVT,PSBISYR,PSBCHEMT,PSBIVPSH)
|
---|
34 | .Q:PSBOST>PSBWADM ; Order Start Date/Time > admin window
|
---|
35 | .Q:PSBOSP<PSBWBEG ; For all Order Stop Date/Time < vdl window
|
---|
36 | .Q:PSBOSTS["D" ; Is it DC'd
|
---|
37 | .Q:PSBNGF ; Is it marked DO NOT GIVE!
|
---|
38 | .; Non One-Times with stop date/time < now
|
---|
39 | .;
|
---|
40 | .D NOW^%DTC
|
---|
41 | .Q:PSBOSP<%
|
---|
42 | .;
|
---|
43 | .; include Active, Renewed, ReInstated and On Call
|
---|
44 | .; (Is it not one time)&(Is it not active or renewed or On Call)
|
---|
45 | .Q:PSBSCHT'="O"&((PSBOSTS'="A")&(PSBOSTS'="R")&(PSBOSTS'="RE")&(PSBOSTS'="O")&(PSBOSTS'="H"))
|
---|
46 | .;
|
---|
47 | .; Is One Time Given
|
---|
48 | .;
|
---|
49 | .I PSBSCHT="O" D Q:PSBGVN
|
---|
50 | ..S (PSBGVN,X,Y)=""
|
---|
51 | ..F S X=$O(^PSB(53.79,"AOIP",DFN,PSBOIT,X),-1) Q:'X D
|
---|
52 | ...F S Y=$O(^PSB(53.79,"AOIP",DFN,PSBOIT,X,Y),-1) Q:'Y S:($P(^PSB(53.79,Y,.1),U)=PSBONX)&($P(^PSB(53.79,Y,0),U,9)="G") PSBGVN=1,(X,Y)=0
|
---|
53 | .;
|
---|
54 | .; How long does One Time remain on VDL ?
|
---|
55 | .S PSBRMN=1
|
---|
56 | .I PSBSCHT="O",PSBOSP'=PSBOST,%>PSBOSP S PSBRMN=0
|
---|
57 | .Q:'PSBRMN
|
---|
58 | .;
|
---|
59 | .; Is On-Call Given, Can it be given more than once
|
---|
60 | .;
|
---|
61 | .I PSBSCHT="OC" D Q:PSBGVN&('$$GET^XPAR("DIV","PSB ADMIN MULTIPLE ONCALL"))
|
---|
62 | ..S (PSBGVN,X,Y)=""
|
---|
63 | ..F S X=$O(^PSB(53.79,"AOIP",DFN,PSBOIT,X),-1) Q:'X D
|
---|
64 | ...F S Y=$O(^PSB(53.79,"AOIP",DFN,PSBOIT,X,Y),-1) Q:'Y S:($P(^PSB(53.79,Y,.1),U)=PSBON)&($P(^PSB(53.79,Y,0),U,9)="G") PSBGVN=1,(X,Y)=0
|
---|
65 | .;
|
---|
66 | .S PSBSTRT=PSBOST ; Order Start Date/Time
|
---|
67 | .S PSBSTOP=PSBOSP ; Order Stop Date/Time
|
---|
68 | .;
|
---|
69 | .S PSBREC=""
|
---|
70 | .S $P(PSBREC,U,1)=DFN ; dfn
|
---|
71 | .S $P(PSBREC,U,2)=PSBONX ; Order
|
---|
72 | .S $P(PSBREC,U,3)=+PSBON ; order ien
|
---|
73 | .S $P(PSBREC,U,4)=PSBOTYP ; iv/ud/pending
|
---|
74 | .S $P(PSBREC,U,5)=PSBSCHT ; schedule type
|
---|
75 | .S $P(PSBREC,U,6)=PSBSCH ; schedule
|
---|
76 | .S Y=""
|
---|
77 | .S:PSBSM Y="SM"
|
---|
78 | .S:PSBHSM Y="HSM"
|
---|
79 | .S $P(PSBREC,U,7)=Y ; self med
|
---|
80 | .S $P(PSBREC,U,8)=PSBOITX ; drugname
|
---|
81 | .S $P(PSBREC,U,9)=PSBDOSE_" "_PSBIFR ; dosage
|
---|
82 | .S $P(PSBREC,U,10)=PSBMR ;med route
|
---|
83 | .; Last Given from the AOIP X-Ref - not given status not excepted
|
---|
84 | .S (YZ,PSBSTUS,PSBADMER)="" K PSBHSTA,PSBHSTAX
|
---|
85 | .F XZ=1:1:20 S YZ=$O(^PSB(53.79,"AOIP",DFN,PSBOIT,YZ),-1),(PSBCNT,PSBFLAG)=0 Q:YZ="" D
|
---|
86 | ..S:YZ>0 $P(PSBREC,U,11)=YZ
|
---|
87 | ..S X="" F S X=$O(^PSB(53.79,"AOIP",DFN,PSBOIT,YZ,X),-1) Q:X="" D
|
---|
88 | ...K PSBLCK L +^PSB(53.79,X):1 I L -^PSB(53.79,X) S PSBLCK=1
|
---|
89 | ...S PSBSTUS=$P(^PSB(53.79,X,0),U,9)
|
---|
90 | ...I $G(PSBSTUS)="" S:'$G(PSBLCK) PSBSTUS="X" I $G(PSBLCK) S PSBADMER=1 D
|
---|
91 | ....K PSBPARM3,PSBPARM5,PSBPARM6,PSBPARM7
|
---|
92 | ....S PSBPARM6=X,Y=$P(^PSB(53.79,X,.1),U,3) D DD^%DT S PSBPARM3=Y,Y=$P(^PSB(53.79,X,0),U,6) D DD^%DT S PSBPARM5=Y
|
---|
93 | ....S PSBPARM7=$P(^PSB(53.79,X,0),U,7) S PSBPARM7="( # "_PSBPARM7_" ) "_$$GET1^DIQ(200,PSBPARM7_",",.01)
|
---|
94 | ....K PSBXTMP S PSBXTMP=PSBONX
|
---|
95 | ....D CLEAN^PSBVT,PSJ1^PSBVT(DFN,$$GET1^DIQ(53.79,PSBPARM6_",",.11))
|
---|
96 | ....D ERROR^PSBMLU(PSBONX,PSBOITX,DFN,PSBPARM3_" admin's ACTION STATUS is ""UNKNOWN"".",PSBSCH,PSBPARM5,PSBPARM6,PSBPARM7) ; SEND AN E-MAIL
|
---|
97 | ....D CLEAN^PSBVT,PSJ1^PSBVT(DFN,PSBXTMP) ;Reset Variables
|
---|
98 | ....S X=PSBPARM6 K PSBPARM3,PSBPARM5,PSBPARM6,PSBPARM7
|
---|
99 | ...K PSBLCK S:(PSBSTUS']"") PSBSTUS="U" I PSBSTUS'="N",($G(PSBSTUS)'="X") S PSBFLAG=1,PSBHSTA(YZ,$G(PSBSTUS))="ORIG"_U_X
|
---|
100 | ...D:PSBSTUS="N"
|
---|
101 | ....S $P(PSBREC,U,11)=""
|
---|
102 | ....S Z="" F S Z=$O(^PSB(53.79,X,.9,Z),-1) Q:'Z Q:PSBFLAG=1 S PSBDATA=$G(^(Z,0)) D
|
---|
103 | .....I (PSBDATA["Set to 'NOT GIVEN'")!(PSBDATA["Set to 'GIVEN'")!(PSBDATA["Set to 'REFUSED'")!(PSBDATA["Set to 'HELD'")!(PSBDATA["Set to 'MISSING DOSE'")!(PSBDATA["Set to 'REMOVED'") S PSBCNT=PSBCNT+1
|
---|
104 | .....I (PSBDATA["STATUS 'HELD'")!(PSBDATA["STATUS 'GIVEN'")!(PSBDATA["STATUS 'REFUSED'")!(PSBDATA["STATUS 'MISSING DOSE'")!(PSBDATA["STATUS 'REMOVED'") S PSBCNT=PSBCNT+1
|
---|
105 | .....I PSBCNT#2=0,PSBDATA["'REFUSED'" S PSBSTUS="R" D LAST^PSBVDLU1
|
---|
106 | .....I PSBCNT#2=0,PSBDATA["'HELD'" S PSBSTUS="H" D LAST^PSBVDLU1
|
---|
107 | .....I PSBCNT#2=0,PSBDATA["'MISSING DOSE'" S PSBSTUS="M" D LAST^PSBVDLU1
|
---|
108 | .....I PSBCNT#2=0,PSBDATA["'REMOVED'" S PSBSTUS="RM" D LAST^PSBVDLU1
|
---|
109 | .....I PSBFLAG=1,'$D(PSBHSTA($P(PSBREC,U,11),$G(PSBSTUS))) S PSBHSTA($P(PSBREC,U,11),$G(PSBSTUS))=Z_U_X
|
---|
110 | .I $D(PSBHSTA) S $P(PSBREC,U,11)=$O(PSBHSTA(""),-1),PSBSTUS=$O(PSBHSTA($P(PSBREC,U,11),""),-1) M PSBHSTAX(PSBOIT)=PSBHSTA K PSBHSTA ;last action date/time
|
---|
111 | .S $P(PSBREC,U,12)="" ;med log ien inserted below for actual date
|
---|
112 | .S $P(PSBREC,U,13)="" ;med log status inserted below for actual date
|
---|
113 | .S $P(PSBREC,U,14)="" ;admin date inserted below
|
---|
114 | .S $P(PSBREC,U,15)=PSBOIT ; OI Pointer
|
---|
115 | .S $P(PSBREC,U,16)=PSBNJECT ;Set injectable med route flag
|
---|
116 | .; Variable dosage entered as ####-####?
|
---|
117 | .I $P(PSBREC,U,9)?1.4N1"-"1.4N.E S $P(PSBREC,U,17)=1
|
---|
118 | .E S $P(PSBREC,U,17)=0
|
---|
119 | .S $P(PSBREC,U,18)=PSBIVT ;IV TYPE - dosage form
|
---|
120 | .S $P(PSBREC,U,20)=$S((PSBSTUS="X")!(PSBSTUS="N"):"",1:PSBSTUS) ;last action status
|
---|
121 | .S $P(PSBREC,U,21)=PSBOST
|
---|
122 | .S $P(PSBREC,U,22)=PSBOSTS
|
---|
123 | .S $P(PSBREC,U,26)=PSBSTOP
|
---|
124 | .S $P(PSBREC,U,27)=$$LASTG^PSBCSUTL(DFN,PSBOIT)
|
---|
125 | .;
|
---|
126 | .; Gather Dispense Drugs
|
---|
127 | .D NOW^%DTC
|
---|
128 | .S (PSBDDS,PSBSOLS,PSBADDS)="0"
|
---|
129 | .F Y=0:0 S Y=$O(PSBDDA(Y)) Q:'Y D
|
---|
130 | ..Q:$P(PSBDDA(Y),U,4)&($P(PSBDDA(Y),U,4)<%) ; Inactive
|
---|
131 | ..S:$P(PSBDDA(Y),U,3)="" $P(PSBDDA(Y),U,3)=1
|
---|
132 | ..S PSBDDS=PSBDDS_U_$P(PSBDDA(Y),U,1,3)
|
---|
133 | ..S $P(PSBDDS,U,1)=PSBDDS+1
|
---|
134 | .; On-Call One Time PRN orders
|
---|
135 | .S PSBQRR=0
|
---|
136 | .I "^O^OC^P^"[(U_PSBSCHT_U) D Q
|
---|
137 | ..I 'PSBDOADD S PSBTBOUT=1,^TMP("PSB",$J,"PBTAB",0)=2,^TMP("PSB",$J,"PBTAB",1)=1,^TMP("PSB",$J,"PBTAB",2)=1 Q
|
---|
138 | ..D ADD^PSBVDLU1(PSBREC,PSBOTXT,PSBNOW\1,PSBDDS,PSBSOLS,PSBADDS,"PBTAB")
|
---|
139 | .;
|
---|
140 | .; IV's - don't worry about admin times if blank
|
---|
141 | .I PSBONX["V","PSC"'[PSBIVT,PSBADST="" D Q
|
---|
142 | ..I 'PSBDOADD S PSBTBOUT=1,^TMP("PSB",$J,"PBTAB",0)=2,^TMP("PSB",$J,"PBTAB",1)=1,^TMP("PSB",$J,"PBTAB",2)=1 Q
|
---|
143 | ..D ADD^PSBVDLU1(PSBREC,PSBOTXT,PSBNOW\1_".",PSBDDS,PSBSOLS,PSBADDS,"PBTAB")
|
---|
144 | .;
|
---|
145 | .; Now we deal with only continuous
|
---|
146 | .; process admintimes
|
---|
147 | .S (PSBYES,PSBODD,PSBYTF)=0
|
---|
148 | .S:$$PSBDCHK1^PSBVT1(PSBSCH) PSBYES=1
|
---|
149 | .I PSBYES,PSBADST="" D ERROR^PSBMLU(PSBONX,PSBOITX,DFN,"Admin times required",PSBSCH) Q
|
---|
150 | .F I=1:1 Q:$P(PSBSCH,"-",I)="" I $P(PSBSCH,"-",I)?2N!($P(PSBSCH,"-",I)?4N) S PSBYES=1,PSBYTF=1
|
---|
151 | .I PSBSCHT="C",PSBYTF="1",PSBADST="" D ERROR^PSBMLU(PSBONX,PSBOITX,DFN,"Admin times required",PSBSCH) Q
|
---|
152 | .S PSBFREQ=$$GETFREQ^PSBVDLU1(DFN,PSBONX)
|
---|
153 | .I PSBFREQ="O" S PSBFREQ=1440
|
---|
154 | .I PSBFREQ="D" S PSBFREQ=""
|
---|
155 | .I 'PSBYES,PSBFREQ<1 D ERROR^PSBMLU(PSBONX,PSBOITX,DFN,"Invalid frequency received from order",PSBSCH) Q
|
---|
156 | .S PSBADMIN=PSBADST
|
---|
157 | .I (PSBADMIN="")&(+PSBFREQ>0) D ODDSCH^PSBVDLU1("PBTAB") Q ;calculate admin times based on frequency
|
---|
158 | .; No admin times, MAYDAY MAYDAY!!
|
---|
159 | .I +PSBFREQ>0 I (PSBFREQ#1440'=0),(1440#PSBFREQ'=0) S PSBODD=1
|
---|
160 | .I PSBODD,PSBADST'="" D ERROR^PSBMLU(PSBONX,PSBOITX,DFN,"Administration Times on ODD SCHEDULE",PSBSCH) Q
|
---|
161 | .; process admin times against beginning and ending date
|
---|
162 | .; build all orders for both days.
|
---|
163 | .F PSBY=1:1 Q:$P(PSBADMIN,"-",PSBY)="" D
|
---|
164 | ..;For invalid admin times
|
---|
165 | ..I ($P(PSBADST,"-",PSBY)'?2N)&($P(PSBADST,"-",PSBY)'?4N) D ERROR^PSBMLU(PSBONX,PSBOITX,DFN,"Invalid Admin times",PSBSCH)
|
---|
166 | ..; apply this time to the beginning window date
|
---|
167 | ..S PSB=+(PSBWBEG\1_"."_$P(PSBADMIN,"-",PSBY))
|
---|
168 | ..D:(PSB'<PSBWBEG)&(PSB'>PSBWEND) ; Make sure it is in the window
|
---|
169 | ...D:(PSB'<PSBSTRT)&(PSB<PSBSTOP) ; Make sure this time is active
|
---|
170 | ....D:$$OKAY^PSBVDLU1(PSBSTRT,PSB,PSBSCH,PSBON,PSBOITX,PSBFREQ,PSBOSTS) ; Okay on this date?
|
---|
171 | .....I 'PSBDOADD S PSBTBOUT=1,^TMP("PSB",$J,"PBTAB",0)=2,^TMP("PSB",$J,"PBTAB",1)=1,^TMP("PSB",$J,"PBTAB",2)=1 Q
|
---|
172 | .....D ADD^PSBVDLU1(PSBREC,PSBOTXT,PSB,PSBDDS,PSBSOLS,PSBADDS,"PBTAB")
|
---|
173 | ..;
|
---|
174 | ..Q:(PSBWBEG\1)=(PSBWEND\1) ; Window only has one day rare but possible
|
---|
175 | ..;
|
---|
176 | ..; apply this time to the ending window date
|
---|
177 | ..S PSB=+(PSBWEND\1_"."_$P(PSBADMIN,"-",PSBY))
|
---|
178 | ..D:(PSB'<PSBWBEG)&(PSB'>PSBWEND) ; Make sure it is in the window
|
---|
179 | ...D:(PSB'<PSBSTRT)&(PSB<PSBSTOP) ; Make sure this time is active
|
---|
180 | ....D:$$OKAY^PSBVDLU1(PSBSTRT,PSB,PSBSCH,PSBON,PSBOITX,PSBFREQ,PSBOSTS) ; Okay on this date?
|
---|
181 | .....I 'PSBDOADD S PSBTBOUT=1,^TMP("PSB",$J,"PBTAB",0)=2,^TMP("PSB",$J,"PBTAB",1)=1,^TMP("PSB",$J,"PBTAB",2)=1 Q
|
---|
182 | .....D ADD^PSBVDLU1(PSBREC,PSBOTXT,PSB,PSBDDS,PSBSOLS,PSBADDS,"PBTAB")
|
---|
183 | ;
|
---|
184 | ;add initials of verifying pharmacist/verifying nurse
|
---|
185 | D:PSBDOADD VNURSE^PSBVDLU1("PBTAB")
|
---|
186 | Q
|
---|
187 | ;
|
---|