1 | RORUTL15 ;HCIOFO/BH,SG - PHARMACY DATA SEARCH (TOOLS) ; 12/21/05 11:11am
|
---|
2 | ;;1.5;CLINICAL CASE REGISTRIES;;Feb 17, 2006
|
---|
3 | ;
|
---|
4 | ; This routine uses the following IAs:
|
---|
5 | ;
|
---|
6 | ; #2400 OCL^PSOORRL and OEL^PSOORRL (controlled)
|
---|
7 | ; #4533 ARWS^PSS50 (supported)
|
---|
8 | ; #4543 IEN^PSN50P65 (supported)
|
---|
9 | ;
|
---|
10 | Q
|
---|
11 | ;
|
---|
12 | ;***** DOUBLE-CHECKS THE OUTPATIENT RX (ORDER, REFILLS AND PARTIALS)
|
---|
13 | ;
|
---|
14 | ; STDT Start Date (FileMan)
|
---|
15 | ; ENDT End Date (FileMan)
|
---|
16 | ;
|
---|
17 | ; [.NREF] Number of refills is returned via this parameter
|
---|
18 | ;
|
---|
19 | ; [.NPAR] Nubmer of partials is returned via this parameter
|
---|
20 | ;
|
---|
21 | ; The ^TMP("PS",$J) node must be populated by the OEL^PSOORRL
|
---|
22 | ; before calling this function.
|
---|
23 | ;
|
---|
24 | ; Return Values:
|
---|
25 | ; 0 Ok
|
---|
26 | ; 1 Skip the order
|
---|
27 | ;
|
---|
28 | DTCHECK(STDT,ENDT,NREF,NPAR) ;
|
---|
29 | N IRP,RXDT,SKIP
|
---|
30 | S RXDT=+$P($G(^TMP("PS",$J,"RXN",0)),U,6),(NREF,NPAR)=0
|
---|
31 | S SKIP=(RXDT<STDT)!(RXDT'<ENDT)
|
---|
32 | ;--- Refills
|
---|
33 | S IRP=0
|
---|
34 | F S IRP=$O(^TMP("PS",$J,"REF",IRP)) Q:IRP'>0 D
|
---|
35 | . S RXDT=+$P($G(^TMP("PS",$J,"REF",IRP,0)),U)
|
---|
36 | . I RXDT'<STDT,RXDT<ENDT S SKIP=0,NREF=NREF+1 Q
|
---|
37 | . K ^TMP("PS",$J,"REF",IRP)
|
---|
38 | ;--- Partials
|
---|
39 | S IRP=0
|
---|
40 | F S IRP=$O(^TMP("PS",$J,"PAR",IRP)) Q:IRP'>0 D
|
---|
41 | . S RXDT=+$P($G(^TMP("PS",$J,"PAR",IRP,0)),U)
|
---|
42 | . I RXDT'<STDT,RXDT<ENDT S SKIP=0,NPAR=NPAR+1 Q
|
---|
43 | . K ^TMP("PS",$J,"PAR",IRP)
|
---|
44 | ;---
|
---|
45 | Q SKIP
|
---|
46 | ;
|
---|
47 | ;***** PROCESSES THE LIST OF PRESELECTED PHARMACY ORDERS
|
---|
48 | ;
|
---|
49 | ; PTIEN IEN of the patient (DFN)
|
---|
50 | ;
|
---|
51 | ; RORFLAGS Flags to control processing
|
---|
52 | ;
|
---|
53 | ; ROR8LST Closed root of the list of preselected orders
|
---|
54 | ;
|
---|
55 | ; Return Values:
|
---|
56 | ; <0 Error code
|
---|
57 | ; 0 No orders have been found
|
---|
58 | ; >0 Number of orders
|
---|
59 | ;
|
---|
60 | PROCESS(PTIEN,RORFLAGS,ROR8LST) ;
|
---|
61 | N DRUGIEN,IRX,IVM,LOADEXT,ORDDATE,ORDER,ORDIEN,ORDFLG,RC,ROR8SET,RORLST,RORTMP,RORTS,RORXCNT,TMP
|
---|
62 | S LOADEXT=(RORFLAGS["E")
|
---|
63 | S (RC,RORXCNT)=0
|
---|
64 | S RORTMP=$$ALLOC^RORTMP(.RORTS)
|
---|
65 | ;
|
---|
66 | ;=== Determine the storage method (default or callback)
|
---|
67 | I $G(ROR8DST("RORCB"))?2"$"1.8UN1"^"1.8UN D
|
---|
68 | . S ROR8SET="S RC="_ROR8DST("RORCB")_"(.ROR8DST,ORDER"
|
---|
69 | . S ROR8SET=ROR8SET_",ORDFLG,DRUGIEN_U_DRUGNAME,ORDDATE)"
|
---|
70 | . ;---
|
---|
71 | . S ROR8DST("RORDFN")=PTIEN
|
---|
72 | . S ROR8DST("ROREDT")=ROREDT
|
---|
73 | . S ROR8DST("RORFLAGS")=RORFLAGS
|
---|
74 | . S ROR8DST("RORSDT")=RORSDT
|
---|
75 | E S ROR8SET="" K @ROR8DST
|
---|
76 | ;
|
---|
77 | ;=== Process the list of preselected orders
|
---|
78 | S (IRX,RC)=0
|
---|
79 | F S IRX=$O(@ROR8LST@(IRX)) Q:'IRX D Q:RC
|
---|
80 | . S ORDFLG=$P(@ROR8LST@(IRX),U)
|
---|
81 | . S TMP=@ROR8LST@(IRX,0)
|
---|
82 | . S ORDER=$P(TMP,U),ORDDATE=$P(TMP,U,15)
|
---|
83 | . ;--- Get the order details
|
---|
84 | . K ^TMP("PS",$J)
|
---|
85 | . D OEL^PSOORRL(PTIEN,ORDER)
|
---|
86 | . Q:$D(^TMP("PS",$J))<10
|
---|
87 | . ;=== Inpatient and Outpatient Medications
|
---|
88 | . I ORDFLG'["V" D Q
|
---|
89 | . . ;--- Double-check the dates for outpatient orders
|
---|
90 | . . I ORDFLG["O" Q:$$DTCHECK(RORSDT,ROREDT)
|
---|
91 | . . ;--- Get the drug IEN in the DRUG file (#50)
|
---|
92 | . . S TMP=$G(^TMP("PS",$J,"DD",1,0)),DRUGIEN=+$P(TMP,U,3)
|
---|
93 | . . I DRUGIEN'>0 S DRUGIEN=+$P(TMP,U) Q:DRUGIEN'>0
|
---|
94 | . . ;--- Process the order
|
---|
95 | . . S RC=$$PROCMED(ORDER,ORDFLG,DRUGIEN,ORDDATE)
|
---|
96 | . . S:'RC RORXCNT=RORXCNT+1
|
---|
97 | . . S:RC=1 RC=0
|
---|
98 | . ;=== IV Medications
|
---|
99 | . S RORLST=$$ALLOC^RORTMP(.TMP),ORDIEN=+ORDER
|
---|
100 | . D
|
---|
101 | . . N IEN,ORDER ; Workaround for the bug in the API
|
---|
102 | . . D PSS436^PSS55(PTIEN,ORDIEN,TMP)
|
---|
103 | . I $G(@RORLST@(0))'>0 D FREE^RORTMP(RORLST) Q
|
---|
104 | . ;--- Process the additives
|
---|
105 | . S IVM=0
|
---|
106 | . F S IVM=$O(@RORLST@(ORDIEN,"ADD",IVM)) Q:IVM'>0 D Q:RC
|
---|
107 | . . ;--- IEN in the IV ADDITIVES file (#52.6)
|
---|
108 | . . S DRUGIEN=+$P($G(@RORLST@(ORDIEN,"ADD",IVM,.01)),U)
|
---|
109 | . . Q:DRUGIEN'>0
|
---|
110 | . . ;--- IEN in the DRUG file (#50)
|
---|
111 | . . D ZERO^PSS52P6(DRUGIEN,,,RORTS)
|
---|
112 | . . Q:$G(@RORTMP@(0))'>0
|
---|
113 | . . S DRUGIEN=+$P($G(@RORTMP@(DRUGIEN,1)),U)
|
---|
114 | . . Q:DRUGIEN'>0
|
---|
115 | . . ;--- Process the medication
|
---|
116 | . . S RC=$$PROCMED(ORDER,ORDFLG,DRUGIEN,ORDDATE)
|
---|
117 | . . S:'RC RORXCNT=RORXCNT+1
|
---|
118 | . . S:RC=1 RC=0
|
---|
119 | . ;---
|
---|
120 | . D FREE^RORTMP(RORLST)
|
---|
121 | ;
|
---|
122 | ;===
|
---|
123 | D FREE^RORTMP(RORTMP)
|
---|
124 | Q $S(RC<0:RC,1:RORXCNT)
|
---|
125 | ;
|
---|
126 | ;***** PROCESS THE MEDICATION (internal)
|
---|
127 | ;
|
---|
128 | ; DRUGIEN IEN of the medication in the DRUG file (#50)
|
---|
129 | ;
|
---|
130 | ; The ROR8DST, ROR8RXS, ROR8SET, RORTMP, and RORTS variables
|
---|
131 | ; must be defined before calling this function.
|
---|
132 | ;
|
---|
133 | ; Return Values:
|
---|
134 | ; <0 Error code
|
---|
135 | ; 0 Ok
|
---|
136 | ; 1 Skip this medication
|
---|
137 | ; 2 Skip this and all remaining medications
|
---|
138 | ;
|
---|
139 | PROCMED(ORDER,ORDFLG,DRUGIEN,ORDDATE) ;
|
---|
140 | N DRUGNAME,RC,ROR8BUF,SKIP,TMP
|
---|
141 | S RC=0
|
---|
142 | ;=== Load some drug data
|
---|
143 | D ARWS^PSS50(DRUGIEN,,RORTS) K ROR8BUF
|
---|
144 | F TMP=2,20,25 S ROR8BUF(TMP)=$G(@RORTMP@(DRUGIEN,TMP))
|
---|
145 | S DRUGNAME=$G(@RORTMP@(DRUGIEN,.01))
|
---|
146 | S:DRUGNAME="" DRUGNAME="Unknown (IEN="_DRUGIEN_")"
|
---|
147 | K @RORTMP
|
---|
148 | ;--- Generic Drug
|
---|
149 | S ROR8DST("RORXGEN")=ROR8BUF(20)
|
---|
150 | I $P(ROR8BUF(20),U,2)="" D S $P(ROR8DST("RORXGEN"),U,2)=TMP
|
---|
151 | . S TMP="Unknown ("_(+ROR8BUF(20))_")"
|
---|
152 | ;--- VA Drug Class
|
---|
153 | S ROR8DST("RORXVCL")=""
|
---|
154 | D:ROR8BUF(2)'=""
|
---|
155 | . ;--- If the "national" drug class is the same, use its IEN
|
---|
156 | . I $P(ROR8BUF(25),U,2)=ROR8BUF(2) D Q
|
---|
157 | . . S ROR8DST("RORXVCL")=$P(ROR8BUF(25),U,1,2)
|
---|
158 | . ;--- Get the Drug Class IEN
|
---|
159 | . D IEN^PSN50P65(,ROR8BUF(2),RORTS)
|
---|
160 | . S TMP=+$G(@RORTMP@(0))
|
---|
161 | . S:TMP=1 ROR8DST("RORXVCL")=+$O(@RORTMP@(0))_U_ROR8BUF(2)
|
---|
162 | . K @RORTMP
|
---|
163 | ;
|
---|
164 | ;=== Check if the drug should be skipped
|
---|
165 | I ROR8RXS'="*" S SKIP=0 D Q:SKIP 1
|
---|
166 | . Q:$D(@ROR8RXS@(DRUGIEN))
|
---|
167 | . I $D(@ROR8RXS@("C"))>1 Q:$D(@ROR8RXS@("C",+ROR8DST("RORXVCL")))
|
---|
168 | . I $D(@ROR8RXS@("G"))>1 Q:$D(@ROR8RXS@("G",+ROR8DST("RORXGEN")))
|
---|
169 | . S SKIP=1
|
---|
170 | ;
|
---|
171 | ;--- Load additional drug data
|
---|
172 | ;D:LOADEXT
|
---|
173 | ;.
|
---|
174 | ;
|
---|
175 | ;=== Default output
|
---|
176 | I ROR8SET="" D Q 0
|
---|
177 | . S RORXCNT=RORXCNT+1
|
---|
178 | . M @ROR8DST@(RORXCNT)=^TMP("PS",$J)
|
---|
179 | . S TMP=ORDER_U_ORDFLG_U_ROR8DST("RORXGEN")
|
---|
180 | . S $P(TMP,U,5,6)=ROR8DST("RORXVCL")
|
---|
181 | . S @ROR8DST@(RORXCNT)=TMP
|
---|
182 | ;=== Callback function
|
---|
183 | X ROR8SET ; (.ROR8DST,ORDER,ORDFLG,DRUGIEN_U_DRUGNAME,ORDDATE)
|
---|
184 | Q RC
|
---|
185 | ;
|
---|
186 | ;***** LOADS AND PRESELECTS PHARMACY ORDERS
|
---|
187 | ;
|
---|
188 | ; PTIEN IEN of the patient (DFN)
|
---|
189 | ;
|
---|
190 | ; FLAGS Flags to control processing
|
---|
191 | ;
|
---|
192 | ; STDT Start date (FileMan)
|
---|
193 | ; ENDT End date (FileMan)
|
---|
194 | ;
|
---|
195 | ; ROR8LST Closed root for the list of preselected orders
|
---|
196 | ;
|
---|
197 | ; @ROR8LST@(
|
---|
198 | ; Seq#, Flags that describe the order (I,O,P, etc.)
|
---|
199 | ; 0) Content of the ^TMP("PS",$J,i,0) node
|
---|
200 | ; returned by the OCL^PSOORRL (see the DBIA
|
---|
201 | ; #2400 for details).
|
---|
202 | ;
|
---|
203 | ; Return Values:
|
---|
204 | ; <0 Error code
|
---|
205 | ; 0 No orders have been found
|
---|
206 | ; >0 Number of orders
|
---|
207 | ;
|
---|
208 | QUERY(PTIEN,FLAGS,STDT,ENDT,ROR8LST) ;
|
---|
209 | N IEN,IRX,ORDER,RXCNT,TMP,TYPE
|
---|
210 | K ^TMP("PS",$J),@ROR8LST
|
---|
211 | ;
|
---|
212 | ;--- Prepare the flags
|
---|
213 | I FLAGS["I" D S TYPE("U;I")="I"
|
---|
214 | . S:FLAGS["P" TYPE("P;I")="IP"
|
---|
215 | . S:FLAGS["V" TYPE("V;I")="IV"
|
---|
216 | I FLAGS["O" D S TYPE("R;O")="O"
|
---|
217 | . S:FLAGS["P" TYPE("P;O")="OP"
|
---|
218 | ;
|
---|
219 | ;--- Load the list of pharmacy orders
|
---|
220 | D OCL^PSOORRL(PTIEN,STDT,ENDT)
|
---|
221 | Q:$D(^TMP("PS",$J))<10 0
|
---|
222 | ;
|
---|
223 | ;--- Preselect the orders
|
---|
224 | S (IRX,RXCNT)=0
|
---|
225 | F S IRX=$O(^TMP("PS",$J,IRX)) Q:'IRX D
|
---|
226 | . S ORDER=$P($G(^TMP("PS",$J,IRX,0)),U) Q:ORDER'>0
|
---|
227 | . ;--- Check the type of order
|
---|
228 | . S TMP=$L(ORDER),TYPE=$E(ORDER,TMP-2,TMP)
|
---|
229 | . S TYPE=$G(TYPE(TYPE)) Q:TYPE=""
|
---|
230 | . ;--- Double-check the dates
|
---|
231 | . I TYPE["I" D Q:(TMP<STDT)!(TMP'<ENDT)
|
---|
232 | . . S TMP=+$P($G(^TMP("PS",$J,IRX,0)),U,15)
|
---|
233 | . I TYPE["O" D Q:TMP<STDT
|
---|
234 | . . S TMP=+$P($G(^TMP("PS",$J,IRX,0)),U,10)
|
---|
235 | . ;--- Select the order
|
---|
236 | . S RXCNT=RXCNT+1,@ROR8LST@(RXCNT)=TYPE
|
---|
237 | . S @ROR8LST@(RXCNT,0)=^TMP("PS",$J,IRX,0)
|
---|
238 | ;
|
---|
239 | ;--- Cleanup
|
---|
240 | K ^TMP("PS",$J)
|
---|
241 | Q RXCNT
|
---|