| 1 | BPSRPT6 ;BHAM ISC/BEE - ECME REPORTS ;14-FEB-05 | 
|---|
| 2 | ;;1.0;E CLAIMS MGMT ENGINE;**1,3,5**;JUN 2004;Build 45 | 
|---|
| 3 | ;;Per VHA Directive 2004-038, this routine should not be modified. | 
|---|
| 4 | ; | 
|---|
| 5 | Q | 
|---|
| 6 | ; | 
|---|
| 7 | ;Get the Insurance Company pointer and name | 
|---|
| 8 | ; | 
|---|
| 9 | ; Returned Value -> ptr^Insurance Company Name | 
|---|
| 10 | ; | 
|---|
| 11 | INSNAM(BP59) N BPIN,BPDOS,BPDFN,BPSZZ,BP36,BPX | 
|---|
| 12 | ; | 
|---|
| 13 | ;Reset Insurance | 
|---|
| 14 | S BP36="" | 
|---|
| 15 | ; | 
|---|
| 16 | ;First Pull From BPS Transactions | 
|---|
| 17 | S BPIN=+$P($G(^BPST(BP59,9)),U) | 
|---|
| 18 | I +BPIN S BP36=$P($G(^BPST(BP59,10,BPIN,0)),U,7) S:BP36]"" BP36="1^"_BP36 | 
|---|
| 19 | ; | 
|---|
| 20 | ;If Not Found, look up using API | 
|---|
| 21 | I BP36="" D | 
|---|
| 22 | .S BPDOS=+$P($G(^BPST(BP59,12)),U,2)\1 | 
|---|
| 23 | .I BPDOS=0 S BPDOS=+$P($G(^BPST(BP59,0)),U,8)\1 | 
|---|
| 24 | .S BPDFN=+$P($G(^BPST(BP59,0)),U,6) | 
|---|
| 25 | .S BPX=$$INSUR^IBBAPI(BPDFN,BPDOS,,.BPSZZ,"1") | 
|---|
| 26 | .S BP36=$G(BPSZZ("IBBAPI","INSUR",1,1)) | 
|---|
| 27 | ; | 
|---|
| 28 | ;If Not Found, put in MISSING INSURANCE | 
|---|
| 29 | I $TR(BP36,U)="" S BP36=" ^**MISSING INSURANCE**" | 
|---|
| 30 | ; | 
|---|
| 31 | Q BP36 | 
|---|
| 32 | ; | 
|---|
| 33 | ;Select an Insurance Company file entry (Fileman Lookup) | 
|---|
| 34 | ; | 
|---|
| 35 | ; Returned value -> Insurance Company Name | 
|---|
| 36 | ; | 
|---|
| 37 | SELINS() N INS | 
|---|
| 38 | S INS=$$SELINSUR^IBNCPDPI("Select Insurance","") | 
|---|
| 39 | I $P(INS,U)=-1 S INS="^" | 
|---|
| 40 | E  S INS=$P(INS,U,2) | 
|---|
| 41 | Q INS | 
|---|
| 42 | ; | 
|---|
| 43 | ;Get the drug name for display | 
|---|
| 44 | ; | 
|---|
| 45 | ; Input variable ->  BP50 - Lookup to DRUG (#50) | 
|---|
| 46 | ;                   BPLEN - Length of the display field | 
|---|
| 47 | ; Returned value -> Name of the drug | 
|---|
| 48 | ; | 
|---|
| 49 | DRGNAM(BP50,BPLEN) Q $E($$DRUGDIE^BPSUTIL1(+BP50,.01,"E"),1,BPLEN) | 
|---|
| 50 | ; | 
|---|
| 51 | ;Select a DRUG file entry (Fileman Lookup) | 
|---|
| 52 | ; | 
|---|
| 53 | ; Returned Variable -> Y | 
|---|
| 54 | ; | 
|---|
| 55 | SELDRG N DIC S DIC(0)="QEAM",DIC=50,DIC("A")="Select Drug: " | 
|---|
| 56 | D DRUGDIC^BPSUTIL1(.DIC) | 
|---|
| 57 | Q | 
|---|
| 58 | ; | 
|---|
| 59 | ;Get the drug class for display | 
|---|
| 60 | ; | 
|---|
| 61 | ; Input variable -> BP50605 - Lookup to VA DRUG CLASS (#50.605) | 
|---|
| 62 | ;                   BPLEN - Length of the display field | 
|---|
| 63 | ; Returned value -> Name of the drug class | 
|---|
| 64 | ; | 
|---|
| 65 | DRGCLNAM(BP50605,BPLEN) N IEN,Y | 
|---|
| 66 | K ^TMP($J,"BPSRPT6") | 
|---|
| 67 | S Y="" | 
|---|
| 68 | I BP50605]"" D | 
|---|
| 69 | .D C^PSN50P65(BP50605,"","BPSRPT6") | 
|---|
| 70 | .S IEN=$O(^TMP($J,"BPSRPT6",0)) | 
|---|
| 71 | .I IEN]"" S Y=$E($G(^TMP($J,"BPSRPT6",IEN,1)),1,BPLEN) | 
|---|
| 72 | K ^TMP($J,"BPSRPT6") | 
|---|
| 73 | Q Y | 
|---|
| 74 | ; | 
|---|
| 75 | ;Select a VA DRUG CLASS file entry (Fileman Lookup) | 
|---|
| 76 | ; | 
|---|
| 77 | SELDRGC N DIR,DIRUT,DTOUT,DUOUT,IEN,TOT,X | 
|---|
| 78 | K ^TMP($J,"BPSRPT6") | 
|---|
| 79 | ; | 
|---|
| 80 | F  D  Q:Y]"" | 
|---|
| 81 | .K ^TMP($J,"BPSRPT6"),^TMP($J,"BPSRPT6X") | 
|---|
| 82 | .S DIR(0)="FO^1:35" | 
|---|
| 83 | .S DIR("A")="Select Drug Class" | 
|---|
| 84 | .S DIR("?")="Answer with VA DRUG CLASS CODE, or CLASSIFICATION. TYPE '??' FOR A LIST" | 
|---|
| 85 | .S DIR("??")="^D DCLIST^BPSRPT6" | 
|---|
| 86 | .D ^DIR | 
|---|
| 87 | .I ($G(DUOUT)=1)!($G(DTOUT)=1)!($G(Y)="") S Y="^" Q | 
|---|
| 88 | .; | 
|---|
| 89 | .;Get list based on original user input | 
|---|
| 90 | .D C^PSN50P65("",Y,"BPSRPT6X") | 
|---|
| 91 | .; | 
|---|
| 92 | .;Get list based on uppercase input | 
|---|
| 93 | .S Y=$$UP^XLFSTR(Y) | 
|---|
| 94 | .D C^PSN50P65("",Y,"BPSRPT6") | 
|---|
| 95 | .; | 
|---|
| 96 | .;Merge lists together | 
|---|
| 97 | .M ^TMP($J,"BPSRPT6")=^TMP($J,"BPSRPT6X") | 
|---|
| 98 | .K ^TMP($J,"BPSRPT6X") | 
|---|
| 99 | .; | 
|---|
| 100 | .; Reset 0 node based on combined lists | 
|---|
| 101 | .S Y=0 F TOT=0:1 S Y=$O(^TMP($J,"BPSRPT6",Y)) Q:'+Y | 
|---|
| 102 | .S ^TMP($J,"BPSRPT6",0)=TOT | 
|---|
| 103 | .; | 
|---|
| 104 | .;Check for no entries found | 
|---|
| 105 | .I TOT<1 W "  ??" S Y="" Q | 
|---|
| 106 | .; | 
|---|
| 107 | .;Check for Unique Entry | 
|---|
| 108 | .I TOT=1 D  Q | 
|---|
| 109 | ..S Y="",IEN=$O(^TMP($J,"BPSRPT6",0)) | 
|---|
| 110 | ..I IEN]"" S Y=$G(^TMP($J,"BPSRPT6",IEN,1)) W $C(13),"Select Drug Class: ",Y | 
|---|
| 111 | .; | 
|---|
| 112 | .;Check for multiple entries - allow user to pick | 
|---|
| 113 | .I TOT>1 S Y=$$DCSEL(TOT) | 
|---|
| 114 | .I Y="^^" S Y="" | 
|---|
| 115 | .; | 
|---|
| 116 | Q | 
|---|
| 117 | ; | 
|---|
| 118 | ;List Entries in VA DRUG CLASS | 
|---|
| 119 | ; | 
|---|
| 120 | DCLIST N CL,DTOUT,IEN,Y | 
|---|
| 121 | K ^TMP($J,"BPSRPT6") | 
|---|
| 122 | D C^PSN50P65("","??","BPSRPT6") | 
|---|
| 123 | ; | 
|---|
| 124 | ;First create new index - sorted by CLASSIFICATION | 
|---|
| 125 | S IEN=0 F  S IEN=$O(^TMP($J,"BPSRPT6",IEN)) Q:'IEN  D | 
|---|
| 126 | .S CL=$G(^TMP($J,"BPSRPT6",IEN,1)) Q:CL="" | 
|---|
| 127 | .S ^TMP($J,"BPSRPT6","B",CL,IEN)=$G(^TMP($J,"BPSRPT6",IEN,".01")) | 
|---|
| 128 | ; | 
|---|
| 129 | ;Now loop through and display entries | 
|---|
| 130 | S $X=0,$Y=0 W !,?3,"Choose from: ",! | 
|---|
| 131 | S (Y,CL)="" F  S CL=$O(^TMP($J,"BPSRPT6","B",CL)) Q:CL=""  D  Q:Y]"" | 
|---|
| 132 | .S IEN="" F  S IEN=$O(^TMP($J,"BPSRPT6","B",CL,IEN)) Q:IEN=""  D  Q:Y]"" | 
|---|
| 133 | ..W ?3,$G(^TMP($J,"BPSRPT6","B",CL,IEN)),!,?3,CL,! | 
|---|
| 134 | ..I $Y>19!'$Y D | 
|---|
| 135 | ...W ?3 R "'^' TO STOP: ",Y:$G(DTIME,300) | 
|---|
| 136 | ...E  S DTOUT=1 | 
|---|
| 137 | ...W $C(13),$J("",17),$C(13) | 
|---|
| 138 | ...I ($G(DTOUT)=1)!($G(Y)="^") S Y="^" Q | 
|---|
| 139 | ...S $X=0,$Y=0 | 
|---|
| 140 | ; | 
|---|
| 141 | K ^TMP($J,"BPSRPT6") | 
|---|
| 142 | Q | 
|---|
| 143 | ; | 
|---|
| 144 | ;Allow user to pick VA DRUG CLASS entry based on initial input | 
|---|
| 145 | ; | 
|---|
| 146 | ; Input variable - TOT -> Total entries placed in ^TMP($J,"BPSRPT6") | 
|---|
| 147 | ; Returned value - VA DRUG CLASSIFICATION | 
|---|
| 148 | ; | 
|---|
| 149 | DCSEL(TOT) N CL,DTOUT,I,IEN,IX,Y | 
|---|
| 150 | ; | 
|---|
| 151 | ;First create new index | 
|---|
| 152 | F IX="B","N" K ^TMP($J,"BPSRPT6",IX) | 
|---|
| 153 | S Y="",IEN=0 F  S IEN=$O(^TMP($J,"BPSRPT6",IEN)) Q:'IEN  D | 
|---|
| 154 | .S CL=$G(^TMP($J,"BPSRPT6",IEN,1)) Q:CL="" | 
|---|
| 155 | .S ^TMP($J,"BPSRPT6","B",CL,IEN)=$G(^TMP($J,"BPSRPT6",IEN,".01")) | 
|---|
| 156 | ; | 
|---|
| 157 | ;Now loop through and allow one to be picked | 
|---|
| 158 | S (Y,CL)="" F  S CL=$O(^TMP($J,"BPSRPT6","B",CL)) Q:CL=""  D  Q:Y]"" | 
|---|
| 159 | .S IEN="" F  S IEN=$O(^TMP($J,"BPSRPT6","B",CL,IEN)) Q:IEN=""  D  Q:Y]"" | 
|---|
| 160 | ..S I=$G(I)+1 W !,?5,I,?9,$G(^TMP($J,"BPSRPT6","B",CL,IEN)),!,?3,CL | 
|---|
| 161 | ..S ^TMP($J,"BPSRPT6","N",I)=CL | 
|---|
| 162 | ..; | 
|---|
| 163 | ..;Stop after every 5 entries | 
|---|
| 164 | ..I I#5=0 I TOT>I D  Q:$G(Y)="^"!($G(Y)="^^") | 
|---|
| 165 | ...W !,"Press <RETURN> to see more, '^' to exit this list, OR" | 
|---|
| 166 | ...W !,"CHOOSE 1 - "_I R ": ",Y:DTIME S:'$T DTOUT=1 | 
|---|
| 167 | ...I ($G(DTOUT)=1)!(Y="^") S Y="^^" | 
|---|
| 168 | ..; | 
|---|
| 169 | ..;Stop after last entry | 
|---|
| 170 | ..I I=TOT D | 
|---|
| 171 | ...W !,"CHOOSE 1 - "_I R ": ",Y:DTIME S:'$T DTOUT=1 | 
|---|
| 172 | ..I ($G(DTOUT)=1)!(Y="^") S Y="^^" | 
|---|
| 173 | ..; | 
|---|
| 174 | ..;Check for valid entry | 
|---|
| 175 | ..I Y="^^" S Y="" | 
|---|
| 176 | ..I Y]"",'$D(^TMP($J,"BPSRPT6","N",Y)) W "  ??" S Y="" | 
|---|
| 177 | ..I Y]"",$D(^TMP($J,"BPSRPT6","N",Y)) S Y=$G(^TMP($J,"BPSRPT6","N",Y)) | 
|---|
| 178 | ; | 
|---|
| 179 | Q Y | 
|---|
| 180 | ; | 
|---|
| 181 | ;Get DRUG file pointer | 
|---|
| 182 | ; | 
|---|
| 183 | ; Return Value -> n = ptr to DRUG (#50) | 
|---|
| 184 | ;                 0 = Unknown | 
|---|
| 185 | ; | 
|---|
| 186 | GETDRUG(BPRX) Q +$$RXAPI1^BPSUTIL1(BPRX,6,"I") | 
|---|
| 187 | ; | 
|---|
| 188 | ;Get VA DRUG CLASS pointer | 
|---|
| 189 | ; | 
|---|
| 190 | ; Input Variables: BP50 - ptr to DRUG (#50) | 
|---|
| 191 | ; | 
|---|
| 192 | ; Return Value -> n = ptr to VA DRUG CLASS (#50.605) | 
|---|
| 193 | ;                 0 = Unknown | 
|---|
| 194 | ; | 
|---|
| 195 | GETDRGCL(BP50) Q $$DRUGDIE^BPSUTIL1(BP50,25) | 
|---|
| 196 | ; | 
|---|
| 197 | ;Determine whether claim was Mail, Window, or CMOP | 
|---|
| 198 | ; | 
|---|
| 199 | ; Input Variables: BPREF - refill # (0-No Refills,1-1st Refill, 2-2nd, ...) | 
|---|
| 200 | ; | 
|---|
| 201 | ; Return Value -> M = Mail | 
|---|
| 202 | ;                 W = Window | 
|---|
| 203 | ;                 C = CMOP | 
|---|
| 204 | ; | 
|---|
| 205 | MWC(BPRX,BPREF) Q $$MWC^PSOBPSU2(BPRX,BPREF) | 
|---|
| 206 | ; | 
|---|
| 207 | ;Get Patient Name | 
|---|
| 208 | ; | 
|---|
| 209 | ; Input variable -> BPDFN - ptr to PATIENT (#2) | 
|---|
| 210 | ; Returned value -> Patient Name (shortened) | 
|---|
| 211 | ; | 
|---|
| 212 | PATNAME(BPDFN) Q $E($P($G(^DPT(BPDFN,0)),U),1,25) | 
|---|
| 213 | ; | 
|---|
| 214 | ;Get Last 4 of SSN | 
|---|
| 215 | ; | 
|---|
| 216 | ; Input variable -> BPDFN - ptr to PATIENT (#2) | 
|---|
| 217 | ; Returned value -> Last 4 digits of patient's SSN | 
|---|
| 218 | ; | 
|---|
| 219 | SSN4(BPDFN) N X | 
|---|
| 220 | S X=$P($G(^DPT(BPDFN,0)),U,9) | 
|---|
| 221 | Q $E(X,$L(X)-3,$L(X)) | 
|---|
| 222 | ; | 
|---|
| 223 | ;Get RX# | 
|---|
| 224 | ; | 
|---|
| 225 | ; Returned value -> RX# | 
|---|
| 226 | ; | 
|---|
| 227 | RXNUM(BPRX) Q $$RXAPI1^BPSUTIL1(+BPRX,.01,"I") | 
|---|
| 228 | ; | 
|---|
| 229 | ;Determine $Collected | 
|---|
| 230 | ; | 
|---|
| 231 | ; Returned Value -> $Collected | 
|---|
| 232 | ; | 
|---|
| 233 | COLLECTD(BPRX,BPREF) N COL,RET | 
|---|
| 234 | S RET=$$BILLINFO^IBNCPDPI(BPRX,BPREF) | 
|---|
| 235 | S COL=$P(RET,U,5) I COL="0",($P(RET,U,3)=16)!($P(RET,U,3)=27) S COL="" | 
|---|
| 236 | I $P(RET,U,7)=1 S COL="N/A" | 
|---|
| 237 | Q COL | 
|---|
| 238 | ; | 
|---|
| 239 | ;Determine Bill # | 
|---|
| 240 | ; | 
|---|
| 241 | ; Returned Value -> Bill Number | 
|---|
| 242 | ; | 
|---|
| 243 | BILL(BPRX,BPREF) N BILL | 
|---|
| 244 | S BILL=$P($$BILLINFO^IBNCPDPI(BPRX,BPREF),U) | 
|---|
| 245 | Q BILL | 
|---|
| 246 | ; | 
|---|
| 247 | ;Get the Closed Claim Reason | 
|---|
| 248 | ; | 
|---|
| 249 | ; Input variable -> 0 for All Closed Claim Reasons or | 
|---|
| 250 | ;                   lookup to CLAIMS TRACKING NON-BILLABLE REASONS (#356.8) | 
|---|
| 251 | ; Returned value -> ALL or the selected Closed Claim Reason | 
|---|
| 252 | ; | 
|---|
| 253 | GETCLR(RSN) ; | 
|---|
| 254 | I RSN="0" S RSN="ALL" | 
|---|
| 255 | E  S RSN=$P($G(^IBE(356.8,+RSN,0)),U) | 
|---|
| 256 | Q RSN | 
|---|
| 257 | ; | 
|---|
| 258 | ;Get the Closed By Person | 
|---|
| 259 | ; | 
|---|
| 260 | ; Returned Value -> Closed By Name | 
|---|
| 261 | ; | 
|---|
| 262 | CLSBY(BP59) N BP02,CBY,Y | 
|---|
| 263 | S BP02=+$P($G(^BPST(BP59,0)),U,4) | 
|---|
| 264 | S CBY=+$P($G(^BPSC(BP02,900)),U,3) | 
|---|
| 265 | S Y=$$GET1^DIQ(200,CBY_",",".01") | 
|---|
| 266 | Q Y | 
|---|
| 267 | ; | 
|---|
| 268 | ;Get the Claim Status | 
|---|
| 269 | ; | 
|---|
| 270 | ; Input Variables: BPREF - refill # (0-No Refills,1-1st Refill, 2-2nd, ...) | 
|---|
| 271 | ; | 
|---|
| 272 | STATUS(BPRX,BPREF) Q $$STATUS^BPSOSRX(BPRX,BPREF,0) | 
|---|
| 273 | ; | 
|---|
| 274 | ;Elapsed Time | 
|---|
| 275 | ; | 
|---|
| 276 | ; Returned Value -> TIME - Elapsed Processing Time | 
|---|
| 277 | ; | 
|---|
| 278 | ELAPSE(BP59) Q $$TIMEDIFI^BPSOSUD($P($G(^BPST(BP59,0)),U,11),$P($G(^BPST(BP59,0)),U,8)) | 
|---|
| 279 | ; | 
|---|
| 280 | ;Get RX issue date | 
|---|
| 281 | ; | 
|---|
| 282 | RXISSDT(BPRX) Q +$$RXAPI1^BPSUTIL1(BPRX,1,"I") | 
|---|
| 283 | ; | 
|---|
| 284 | ; | 
|---|
| 285 | ;Get RX's fill date | 
|---|
| 286 | RXFILDT(BPRX) Q +$$RXAPI1^BPSUTIL1(BPRX,22,"I") | 
|---|
| 287 | ; | 
|---|
| 288 | ;Get Refill's issue date | 
|---|
| 289 | ; | 
|---|
| 290 | REFISSDT(BPRX,BPREF) Q $$REFDISDT(BPRX,BPREF) | 
|---|
| 291 | ; | 
|---|
| 292 | ;Get Refill's dispense date | 
|---|
| 293 | ; | 
|---|
| 294 | REFDISDT(BPRX,BPREF) Q +$$RXSUBF1^BPSUTIL1(BPRX,52,52.1,+BPREF,10.1,"I") | 
|---|
| 295 | ; | 
|---|
| 296 | ;Get Refill's refill date | 
|---|
| 297 | ; | 
|---|
| 298 | REFFILDT(BPRX,BPREF) Q +$$RXSUBF1^BPSUTIL1(BPRX,52,52.1,+BPREF,.01,"I") | 
|---|
| 299 | ; | 
|---|
| 300 | ;Get RX's release date | 
|---|
| 301 | ; | 
|---|
| 302 | RXRELDT(BPRX) Q +$$RXAPI1^BPSUTIL1(BPRX,31,"I") | 
|---|
| 303 | ; | 
|---|
| 304 | ;Get Refill's release date | 
|---|
| 305 | ; | 
|---|
| 306 | REFRELDT(BPRX,BPREF) Q +$$RXSUBF1^BPSUTIL1(BPRX,52,52.1,+BPREF,17,"I") | 
|---|
| 307 | ; | 
|---|
| 308 | ;See if refill exists | 
|---|
| 309 | ; | 
|---|
| 310 | IFREFILL(BPRX,BPREF) Q $S(+$$RXSUBF1^BPSUTIL1(BPRX,52,52.1,+BPREF,.01,"I"):1,1:0) | 
|---|
| 311 | ; | 
|---|
| 312 | ;Get RX status | 
|---|
| 313 | ; | 
|---|
| 314 | ; Input Variables -> BP59 = ptr to BPS TRANSACTIONS | 
|---|
| 315 | ; | 
|---|
| 316 | RXSTATUS(BP59) Q $$RXST^BPSSCRU2(BP59) | 
|---|
| 317 | ; | 
|---|
| 318 | ;Return RX Quantity (From BPS TRANSACTION) | 
|---|
| 319 | ; | 
|---|
| 320 | QTY(BP59) Q +$P($G(^BPST(BP59,5)),U,1) | 
|---|
| 321 | ; | 
|---|
| 322 | ;Return NDC Number | 
|---|
| 323 | GETNDC(BPRX,BPREF) Q $$GETNDC^PSONDCUT(BPRX,BPREF) | 
|---|
| 324 | ; | 
|---|
| 325 | ;Return Copay Status ($) | 
|---|
| 326 | COPAY(BPRX) Q $S(+$$RXAPI1^BPSUTIL1(BPRX,105,"I"):"$",1:"") | 
|---|