[613] | 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
|
---|