1 | PXRMXX ; SLC/PJH - Extract Patient sample;07/29/2004
|
---|
2 | ;;2.0;CLINICAL REMINDERS;;Feb 04, 2005
|
---|
3 | ;
|
---|
4 | ;Update ^TMP - all patients with encounters
|
---|
5 | ;------------------------------------------
|
---|
6 | TMP S ^TMP(NODE,$J,"TEMP",DFN)="" Q
|
---|
7 | ;
|
---|
8 | ;Save individual encounter into FIND1
|
---|
9 | ;------------------------------------
|
---|
10 | SAV S FCNT=FCNT+1,FOUND=1 M FIND1(FCNT)=FIND(ENC) Q
|
---|
11 | ;
|
---|
12 | ;Check if finding is in date range
|
---|
13 | ;---------------------------------
|
---|
14 | DCHK(DNODE) ;
|
---|
15 | N DATE,LTERM,LTRAN,TNAM,SNUM,TERMNAM,TERMNAT
|
---|
16 | S DATE=$G(FIND(ENC,DNODE)) Q:DATE=""
|
---|
17 | ;
|
---|
18 | I (DATE<BD)!(DATE>ED) Q
|
---|
19 | ;Lab transforms
|
---|
20 | I REM(PXRMITEM)="VA-NATIONAL EPI LAB EXTRACT" D Q:LTRAN
|
---|
21 | .S LTRAN=0 D:$P(FIND(ENC,"FINDING"),";",2)="LAB(60," LTRAN
|
---|
22 | ;National DB term mapping
|
---|
23 | S TERMNAM=$P($G(FIND(ENC,"TERM")),U)
|
---|
24 | ;If term exists check if it needs re-mapping for this reminder
|
---|
25 | I TERMNAM]"" D
|
---|
26 | .;Get the alternate name from the REM array
|
---|
27 | .S TERMNAT=$G(REM(PXRMITEM,TERMNAM)) Q:TERMNAT=""
|
---|
28 | .;National database code
|
---|
29 | .S FIND(ENC,"ALTTRM")=TERMNAT
|
---|
30 | ;Set source number code
|
---|
31 | S SNUM=""
|
---|
32 | I $G(FIND(ENC,"FILE NUMBER"))=9000011 S SNUM=1
|
---|
33 | I $G(FIND(ENC,"FILE NUMBER"))=9000010.07 S SNUM=2
|
---|
34 | I $G(FIND(ENC,"FILE NUMBER"))=45 S SNUM=3
|
---|
35 | S FIND(ENC,"S/N")=SNUM
|
---|
36 | ;
|
---|
37 | ;Save encounter
|
---|
38 | D SAV
|
---|
39 | Q
|
---|
40 | ;
|
---|
41 | ;Check for findings
|
---|
42 | ;------------------
|
---|
43 | FCHEK(PXRMITEM) ;
|
---|
44 | N ECNT,EDATE,ENC,LDONE,FOUND
|
---|
45 | ;Get reminder name
|
---|
46 | S PXRMNAM=$P($G(^PXD(811.9,PXRMITEM,0)),U)
|
---|
47 | ;Check each encounter
|
---|
48 | S ENC=0,ECNT=0,FOUND=0,LDONE=0
|
---|
49 | F S ENC=$O(FIND(ENC)) Q:'ENC D
|
---|
50 | .;Ignore medications - these are loaded from pharmacy
|
---|
51 | .I $D(FIND(ENC,"DRUG")) Q
|
---|
52 | .;Check if finding is in date range
|
---|
53 | .I $D(FIND(ENC,"FINDING")) D DCHK("DATE")
|
---|
54 | ;
|
---|
55 | Q
|
---|
56 | ;
|
---|
57 | ;Update ^TMP - all patients with findings
|
---|
58 | ;----------------------------------------
|
---|
59 | FSAVE N CNT,FIEN,FCNT,FUNIQ,FREC
|
---|
60 | N VDATA,VDATE,VFOUND,VLAST,VIEN,VLTYP,VOK,VSERV,VTYP
|
---|
61 | ;Extract the visit date and type from visit record
|
---|
62 | S CNT=0,FUNIQ=0,VLAST=0,VFOUND=0,VLTYP=""
|
---|
63 | F S CNT=$O(FIND1(CNT)) Q:'CNT D
|
---|
64 | .S VOK=0
|
---|
65 | .I $D(FIND1(CNT,"VIEN")) D
|
---|
66 | ..S VIEN=$G(FIND1(CNT,"VIEN")) Q:'VIEN
|
---|
67 | ..S VDATA=$G(^AUPNVSIT(VIEN,0)) Q:VDATA=""
|
---|
68 | ..;Get visit date and service from visit record
|
---|
69 | ..S VDATE=$P(VDATA,U),VSERV=$P(VDATA,U,7),VFOUND=1,VOK=1,VTYP="O"
|
---|
70 | ..;Calculate visit type from sevice
|
---|
71 | ..I (VSERV="D")!(VSERV="H")!(VSERV="I") S VTYP="I"
|
---|
72 | .;If no visit info default to finding date
|
---|
73 | .I 'VOK S VDATE=$G(FIND1(CNT,"DATE")),VTYP="O" D
|
---|
74 | ..N VAIN,VAINDT S VAINDT=VDATE D INP^VADPT
|
---|
75 | ..I $G(VAIN(7))'="" S VTYP="I"
|
---|
76 | .;Save encounter/finding date and type
|
---|
77 | .S FIND1(CNT)=VDATE_U_VTYP
|
---|
78 | .;Save count by finding for report
|
---|
79 | .S FIEN=$G(FIND1(CNT,"FINDING")) I FIEN="" S FIEN="NO FINDING"
|
---|
80 | .S FREC=$G(PXRMFIEN(FIEN)),FCNT=$P(FREC,U),FUNIQ=$P(FREC,U,2)
|
---|
81 | .S FCNT=FCNT+1 I '$G(FUNIQ(FIEN)) S FUNIQ=FUNIQ+1
|
---|
82 | .S PXRMFIEN(FIEN)=FCNT_U_FUNIQ,FUNIQ(FIEN)=1
|
---|
83 | .;Save most recent
|
---|
84 | .I VDATE>VLAST S VLAST=VDATE,VLTYP=VTYP
|
---|
85 | ;
|
---|
86 | ;Save patient
|
---|
87 | S ^TMP(NODE,$J,DFN)=VLAST_U_VLTYP
|
---|
88 | ;Save findings
|
---|
89 | M ^TMP(NODE,$J,DFN,"FIND")=FIND1
|
---|
90 | ;
|
---|
91 | Q
|
---|
92 | ;
|
---|
93 | ;Check each patient for findings
|
---|
94 | ;-------------------------------
|
---|
95 | FIND N BD,DFN,ED,LAB,LABN,PXRMITEM,PXRMNAM,OR,REM,SAVE,SEARCH
|
---|
96 | ;
|
---|
97 | ;Build array of reminders and terms to be re-mapped
|
---|
98 | ;
|
---|
99 | ;This requires that LAB(69.51) is created to include a list of IEN's
|
---|
100 | ;
|
---|
101 | S PXRMITEM=0
|
---|
102 | F S PXRMITEM=$O(^LAB(69.51,"B",PXRMITEM)) Q:'PXRMITEM D
|
---|
103 | .S PXRMNAM=$P($G(^PXD(811.9,PXRMITEM,0)),U)
|
---|
104 | .I PXRMNAM'="VA-NATIONAL EPI RX EXTRACT" S REM(PXRMITEM)=PXRMNAM
|
---|
105 | .;Get finding list for these reminders and medication list
|
---|
106 | .D REM^PXRMXX1(PXRMITEM,.SEARCH,.LAB)
|
---|
107 | .;Hep A,B,C lab tests
|
---|
108 | .S LABN("HEP C VIRUS ANTIBODY POSITIVE")=""
|
---|
109 | .S LABN("HEP C VIRUS ANTIBODY NEGATIVE")=""
|
---|
110 | .S LABN("HAV Ab positive")=""
|
---|
111 | .S LABN("HAV IgM Ab positive")=""
|
---|
112 | .S LABN("HAV IgG positive")=""
|
---|
113 | .S LABN("HBs Ab positive")=""
|
---|
114 | .S LABN("HBs Ag positive")=""
|
---|
115 | .S LABN("HBc Ab IgM positive")=""
|
---|
116 | .S LABN("HBe Ag positive")=""
|
---|
117 | .;NDB Transformations
|
---|
118 | .I PXRMNAM="VA-HEP C RISK ASSESSMENT" D
|
---|
119 | ..S REM(PXRMITEM,"VA-DECLINED HEP C RISK ASSESSMENT")=1
|
---|
120 | ..S REM(PXRMITEM,"VA-NO RISK FACTORS FOR HEP C")=2
|
---|
121 | ..S REM(PXRMITEM,"VA-PREVIOUSLY ASSESSED HEP C RISK")=3
|
---|
122 | ..S REM(PXRMITEM,"VA-RISK FACTOR FOR HEPATITIS C")=4
|
---|
123 | ..S REM(PXRMITEM,"VA-HEP C VIRUS ANTIBODY POSITIVE")=5
|
---|
124 | ..S REM(PXRMITEM,"VA-HEP C VIRUS ANTIBODY NEGATIVE")=6
|
---|
125 | ..S REM(PXRMITEM,"VA-HEPATITIS C INFECTION")=7
|
---|
126 | ;
|
---|
127 | ;Build pharmacy codes list
|
---|
128 | F FTYPE="PSNDF(50.6,","PSDRUG(","PS(50.605," D
|
---|
129 | .S FIEN=""
|
---|
130 | .F S FIEN=$O(SEARCH(FTYPE,FIEN)) Q:'FIEN D
|
---|
131 | ..S OR(FIEN_";"_FTYPE)=""
|
---|
132 | ;
|
---|
133 | ;Search for pharmacy outpatients
|
---|
134 | I $O(OR(""))]"" D EN^PSOORAPI(PXRMBDT,PXRMEDT,.OR,"F","PXRMPSO"_NODE)
|
---|
135 | ;
|
---|
136 | ;Search for pharmacy inpatients
|
---|
137 | I $O(OR(""))]"" D EN^PSJORAPI(PXRMBDT,PXRMEDT,.OR,"","PXRMPSI"_NODE)
|
---|
138 | ;
|
---|
139 | ;Build Lab codes list
|
---|
140 | S FTYPE="LAB(60,",FIEN="" K OR
|
---|
141 | F S FIEN=$O(SEARCH(FTYPE,FIEN)) Q:'FIEN D
|
---|
142 | .S OR(FIEN)=""
|
---|
143 | ;
|
---|
144 | ;Search for lab patients
|
---|
145 | I $O(OR(""))]"" D LAB^PXRMXX2(PXRMBDT,PXRMEDT,.OR,NODE)
|
---|
146 | ;
|
---|
147 | ;Build Health Factors list
|
---|
148 | S FTYPE="AUTTHF(",FIEN="" K OR
|
---|
149 | F S FIEN=$O(SEARCH(FTYPE,FIEN)) Q:'FIEN D
|
---|
150 | .S OR(FIEN)=""
|
---|
151 | ;
|
---|
152 | ;Search for HF patients
|
---|
153 | I $O(OR(""))]"" D HF^PXRMXX2(PXRMBDT,PXRMEDT,.OR,NODE)
|
---|
154 | ;
|
---|
155 | ;Build Patient Education list
|
---|
156 | S FTYPE="AUTTEDT(",FIEN="" K OR
|
---|
157 | F S FIEN=$O(SEARCH(FTYPE,FIEN)) Q:'FIEN D
|
---|
158 | .S OR(FIEN)=""
|
---|
159 | ;
|
---|
160 | ;Search for PED patients
|
---|
161 | I $O(OR(""))]"" D PED^PXRMXX2(PXRMBDT,PXRMEDT,.OR,NODE)
|
---|
162 | ;
|
---|
163 | ;Build Examination list
|
---|
164 | S FTYPE="AUTTEXAM(",FIEN="" K OR
|
---|
165 | F S FIEN=$O(SEARCH(FTYPE,FIEN)) Q:'FIEN D
|
---|
166 | .S OR(FIEN)=""
|
---|
167 | ;
|
---|
168 | ;Search for Exam patients
|
---|
169 | I $O(OR(""))]"" D EXAM^PXRMXX2(PXRMBDT,PXRMEDT,.OR,NODE)
|
---|
170 | ;
|
---|
171 | ;Build POV codes list
|
---|
172 | S FTYPE="ICD9(",FIEN="" K OR
|
---|
173 | F S FIEN=$O(SEARCH(FTYPE,FIEN)) Q:'FIEN D
|
---|
174 | .S OR(FIEN)="",^TMP("PXRMPOV"_NODE,$J,FIEN)=""
|
---|
175 | ;
|
---|
176 | ;Search for POV patients
|
---|
177 | I $O(OR(""))]"" D POV^PXRMXX2(PXRMBDT,PXRMEDT,"PXRMPOV"_NODE,NODE)
|
---|
178 | ;
|
---|
179 | S BD=PXRMBDT-.0001,ED=PXRMEDT+.2359,DFN=""
|
---|
180 | F S DFN=$O(^TMP(NODE,$J,"TEMP",DFN)) Q:'DFN Q:TSTOP=1 D
|
---|
181 | .;Check if stop task requested
|
---|
182 | .I $$S^%ZTLOAD S TSTOP=1 Q
|
---|
183 | .;Update total patient count for report
|
---|
184 | .S PXRMCNT=PXRMCNT+1
|
---|
185 | .N FIND1,FCNT
|
---|
186 | .;Process reminders
|
---|
187 | .S PXRMITEM=0,FCNT=0
|
---|
188 | .F S PXRMITEM=$O(REM(PXRMITEM)) Q:'PXRMITEM D
|
---|
189 | ..;Check reminder exists
|
---|
190 | ..Q:'$D(^PXD(811.9,PXRMITEM,0))
|
---|
191 | ..;Evaluate reminder to obtain list of findings
|
---|
192 | ..N FIND
|
---|
193 | ..D FIDATA^PXRM(DFN,PXRMITEM,.FIND)
|
---|
194 | ..;Check if findings exist for the date range
|
---|
195 | ..D FCHEK(PXRMITEM)
|
---|
196 | .;Save in ^TMP
|
---|
197 | .I FCNT D FSAVE K FIND1 S PXRMFCNT=PXRMFCNT+1
|
---|
198 | ;
|
---|
199 | ;Merge in patients from Outpatient Pharmacy
|
---|
200 | D PSMERG^PXRMXX1("PXRMPSO",NODE,.SEARCH)
|
---|
201 | ;Merge in patients from Inpatient Pharmacy
|
---|
202 | D PSMERG^PXRMXX1("PXRMPSI",NODE,.SEARCH)
|
---|
203 | ;
|
---|
204 | Q
|
---|
205 | ;
|
---|
206 | ;Complex logic to handle lab/reminder mismatches
|
---|
207 | ;-----------------------------------------------
|
---|
208 | LTRAN S LTERM=$P($G(FIND(ENC,"TERM")),U) Q:LTERM=""
|
---|
209 | ;Skip terms not used in cohort logic
|
---|
210 | I $D(LAB(LTERM)) S LTRAN=1 Q
|
---|
211 | ;If one of selected list send the latest out of cohort entries instead
|
---|
212 | I $D(LABN(LTERM)) S LTRAN=1 Q:LDONE=1 D
|
---|
213 | .N ENC,TERM,DATE
|
---|
214 | .S ENC=0,LDONE=1
|
---|
215 | .F S ENC=$O(FIND(ENC)) Q:'ENC D
|
---|
216 | ..S TERM=$P($G(FIND(ENC,"TERM")),U) Q:TERM=""
|
---|
217 | ..;Check if the term is in the out of cohort list
|
---|
218 | ..I $D(LAB(TERM)) D
|
---|
219 | ...;Check if lab test is within date range or prior
|
---|
220 | ...S DATE=$G(FIND(ENC,"DATE")) Q:DATE="" Q:DATE>ED
|
---|
221 | ...D SAV
|
---|
222 | ;
|
---|
223 | Q
|
---|
224 | ;
|
---|
225 | ;
|
---|
226 | ;Entry point for API
|
---|
227 | ;-------------------
|
---|
228 | PATS(PXRMBDT,PXRMEDT,NODE) ;
|
---|
229 | ;
|
---|
230 | ; PXRMBDT - Start date in fileman format
|
---|
231 | ; PXRMEDT - End date in fileman format
|
---|
232 | ; NODE - Target name for ^TMP(NODE,$J)
|
---|
233 | ;
|
---|
234 | ;Task stopped
|
---|
235 | N TSTOP S TSTOP=0
|
---|
236 | ;
|
---|
237 | ;
|
---|
238 | ;Build temporary array of all wards
|
---|
239 | ;N PXRMLCHL,PXRMLOCN D LCHL^PXRMXAP(1,.PXRMLCHL)
|
---|
240 | ;
|
---|
241 | ;Patients, patients with findings, finding and term counts
|
---|
242 | N PXRMCNT,PXRMFCNT,PXRMFIEN,PXRMTIEN S PXRMCNT=0,PXRMFCNT=0
|
---|
243 | ;
|
---|
244 | ;Clear ^TMP
|
---|
245 | K ^TMP(NODE,$J)
|
---|
246 | ;Current inpatients
|
---|
247 | ;D INP
|
---|
248 | ;Inpatient admissions
|
---|
249 | ;D ADM
|
---|
250 | ;Outpatient visits
|
---|
251 | ;D VISITS Q:TSTOP=1
|
---|
252 | ;
|
---|
253 | ;Check for findings in the selected patients
|
---|
254 | D FIND Q:TSTOP=1
|
---|
255 | ;
|
---|
256 | ;Save report
|
---|
257 | D REPORT^PXRMXX1(NODE)
|
---|
258 | ;
|
---|
259 | ;Remove list of all patients with encounters
|
---|
260 | K ^TMP(NODE,$J,"TEMP")
|
---|
261 | ;Remove pharmacy outpatient list
|
---|
262 | K ^TMP("PXRMPSO"_NODE,$J)
|
---|
263 | ;Remove pharmacy inpatient list
|
---|
264 | K ^TMP("PXRMPSI"_NODE,$J)
|
---|
265 | ;Remove icd9 list
|
---|
266 | K ^TMP("PXRMPOV"_NODE,$J)
|
---|
267 | Q
|
---|
268 | ;
|
---|
269 | ;Build list of inpatients admissions
|
---|
270 | ;-----------------------------------
|
---|
271 | ADM N HLOCIEN,IC,DFN,BD,ED
|
---|
272 | ;Get admissions for each selected location
|
---|
273 | F IC=1:1 Q:'$D(PXRMLCHL(IC)) D
|
---|
274 | .S HLOCIEN=$P(PXRMLCHL(IC),U,2) Q:HLOCIEN=""
|
---|
275 | .; Get admissions from patient movements and return DFN's in PATS
|
---|
276 | .S BD=PXRMBDT-.0001
|
---|
277 | .S ED=PXRMEDT+.2359
|
---|
278 | .N PATS D ADM^PXRMXAP(HLOCIEN,.PATS,BD,ED)
|
---|
279 | .;Build ^TMP for selected patients
|
---|
280 | .S DFN=""
|
---|
281 | .F S DFN=$O(PATS(DFN)) Q:DFN="" D TMP
|
---|
282 | Q
|
---|
283 | ;
|
---|
284 | ;Build list of Current inpatients
|
---|
285 | ;--------------------------------
|
---|
286 | INP N HLOCIEN,IC,DFN
|
---|
287 | ;Get Current inpatients for each location
|
---|
288 | F IC=1:1 Q:'$D(PXRMLCHL(IC)) D
|
---|
289 | .S HLOCIEN=$P(PXRMLCHL(IC),U,2) Q:HLOCIEN=""
|
---|
290 | .;Get WARDIEN,WARDNAM and return DFN's in PATS
|
---|
291 | .N PATS D WARD^PXRMXAP(HLOCIEN,.PATS)
|
---|
292 | .;Build ^TMP for selected patients
|
---|
293 | .S DFN=""
|
---|
294 | .F S DFN=$O(PATS(DFN)) Q:DFN="" D TMP
|
---|
295 | Q
|
---|
296 | ;
|
---|
297 | ;Scan visit file to build list of patients
|
---|
298 | ;-----------------------------------------
|
---|
299 | VISITS N BD,DFN,ED,HLOCIEN,IC,VIEN,VISIT
|
---|
300 | ;
|
---|
301 | S BD=PXRMBDT-.0001
|
---|
302 | S ED=PXRMEDT+.2359
|
---|
303 | ;Get Date ; DBIA #2028
|
---|
304 | F S BD=$O(^AUPNVSIT("B",BD)) Q:BD>ED Q:BD="" Q:TSTOP=1 D
|
---|
305 | .S VIEN=0
|
---|
306 | .;Get individual visit
|
---|
307 | .F S VIEN=$O(^AUPNVSIT("B",BD,VIEN)) Q:VIEN="" Q:TSTOP=1 D
|
---|
308 | ..;Check if stop task requested
|
---|
309 | ..I $$S^%ZTLOAD S TSTOP=1 Q
|
---|
310 | ..;Screen Individual Visit
|
---|
311 | ..S VISIT=$G(^AUPNVSIT(VIEN,0)) Q:VISIT=""
|
---|
312 | ..;Patient IEN
|
---|
313 | ..S DFN=$P(VISIT,U,5) Q:'DFN
|
---|
314 | ..;Build patient list in ^TMP
|
---|
315 | ..D TMP
|
---|
316 | Q
|
---|