| [613] | 1 | IBRFN ;ALB/AAS - Supported functions for AR ;5-MAY-1992 | 
|---|
|  | 2 | ;;2.0;INTEGRATED BILLING;**52,130,183,223,309,276,347**;21-MAR-94;Build 24 | 
|---|
|  | 3 | ;;Per VHA Directive 2004-038, this routine should not be modified. | 
|---|
|  | 4 | ; | 
|---|
|  | 5 | ERR(Y) ; Input Y = -1^error code[;error code...]^literal message | 
|---|
|  | 6 | ; Output IBRERR = error message 1 | 
|---|
|  | 7 | ;        if more than one code then | 
|---|
|  | 8 | ;        IBRERR(n)=error code n | 
|---|
|  | 9 | N N,X,X1,X2 K IBRERR S IBRERR="" | 
|---|
|  | 10 | G:+Y>0 ERRQ | 
|---|
|  | 11 | S X2=$P(Y,U,2) F N=1:1 S X=$P(X2,";",N) Q:X=""  S X1=$P($G(^IBE(350.8,+$O(^IBE(350.8,"AC",X,0)),0)),U,2) D | 
|---|
|  | 12 | .I N=1 S IBRERR=X1 | 
|---|
|  | 13 | .I $P(Y,U,3)]""!($P(X2,";",2,99)]"") S IBRERR(N)=X1 | 
|---|
|  | 14 | I $P(Y,U,3)]"" S N=N+1,IBRERR(N)=$P(Y,U,3) | 
|---|
|  | 15 | ERRQ Q IBRERR | 
|---|
|  | 16 | ; | 
|---|
|  | 17 | MESS(Y) ;  -input y=error code - from file 350.8 (piece 3) | 
|---|
|  | 18 | ;   output error message | 
|---|
|  | 19 | Q $P($G(^IBE(350.8,+$O(^IBE(350.8,"AC",Y,0)),0)),U,2) | 
|---|
|  | 20 | ; | 
|---|
|  | 21 | SVDT(BN,VDT) ;returns service dates for a specific bill | 
|---|
|  | 22 | ;  Input:  BN bill number (external form) | 
|---|
|  | 23 | ;          VDT name of array to hold outpatient visit dates, pass by value (if needed) | 
|---|
|  | 24 | ; Output:  X function value, string, = 0 if bill not found | 
|---|
|  | 25 | ;          = 1 (Inpt) or 2 (Outpt)^event date^stmt from date^stmt to date^LOS (I)^Number of visit dates (O) | 
|---|
|  | 26 | ;          all are internal form, any piece may be null if not defined for the bill | 
|---|
|  | 27 | ;          array containing outpatient visit dates as subscripts/no data, if VDT passed by value | 
|---|
|  | 28 | N X,Y,IFN S X=0,BN=$G(BN) | 
|---|
|  | 29 | I BN'="" S IFN=+$O(^DGCR(399,"B",BN,0)),Y=$G(^DGCR(399,IFN,0)) I Y'="" D | 
|---|
|  | 30 | . S X=$S(+$P(Y,U,5)<1:"",+$P(Y,U,5)<3:1,+$P(Y,U,5)<5:2,1:"")_U_$P(Y,U,3),Y=$G(^DGCR(399,IFN,"U")) | 
|---|
|  | 31 | . S X=X_U_$P(Y,U,1)_U_$P(Y,U,2)_U_$P(Y,U,15)_U_$P($G(^DGCR(399,IFN,"OP",0)),U,4) | 
|---|
|  | 32 | . S Y=0 F  S Y=$O(^DGCR(399,IFN,"OP",Y)) Q:'Y  S VDT(Y)="" | 
|---|
|  | 33 | Q X | 
|---|
|  | 34 | ; | 
|---|
|  | 35 | ; | 
|---|
|  | 36 | REC(IBSTR,IBTYPE) ; Find the AR for an Authorization or Rx number | 
|---|
|  | 37 | ;   Input: IBSTR - FI Authorization Number or Rx Number | 
|---|
|  | 38 | ;  Output: IBAR  >0 => ptr to claim/AR in files 399/430 | 
|---|
|  | 39 | ;                -1 => No receivable found | 
|---|
|  | 40 | ;          IBTYPE (by ref) - how the IBSTR was recognized: 1-Auth,2-ECME,3-Rx#,0-Unknown | 
|---|
|  | 41 | ; | 
|---|
|  | 42 | N IBAR,IBARR,IBRX,IBKEY,IBKEYS,IBREF,IBPREF | 
|---|
|  | 43 | S IBTYPE=0 | 
|---|
|  | 44 | S IBAR=-1 | 
|---|
|  | 45 | I $G(IBSTR)="" G RECQ | 
|---|
|  | 46 | ; | 
|---|
|  | 47 | ; extended syntax to indicate the type: | 
|---|
|  | 48 | ; T.000000 for TRICARE, E.7000000 for ECME, R.50000000 for Rx | 
|---|
|  | 49 | I $L($P(IBSTR,"."))=1,$P(IBSTR,".",2)'="" D | 
|---|
|  | 50 | . S IBPREF=$TR($P(IBSTR,"."),"ter","TER") | 
|---|
|  | 51 | . S IBSTR=$P(IBSTR,".",2,255) | 
|---|
|  | 52 | . I $E(IBPREF)="T" S IBTYPE=1 ; TRICARE Auth# | 
|---|
|  | 53 | . I $E(IBPREF)="E" S IBTYPE=2 ; ECME # | 
|---|
|  | 54 | . I $E(IBPREF)="R" S IBTYPE=3 ; Rx # | 
|---|
|  | 55 | ; | 
|---|
|  | 56 | ; look for TRICARE number | 
|---|
|  | 57 | I (IBTYPE=0)!(IBTYPE=1) S IBAR=$$AREC(IBSTR) I IBAR>0 S IBTYPE=1 G RECQ | 
|---|
|  | 58 | ; | 
|---|
|  | 59 | ; - look for ecme number | 
|---|
|  | 60 | I (IBTYPE=0)!(IBTYPE=2) S IBAR=$$EREC(IBSTR) I IBAR>0 S IBTYPE=2 G RECQ | 
|---|
|  | 61 | ; | 
|---|
|  | 62 | I IBTYPE,IBTYPE'=3 G RECQ | 
|---|
|  | 63 | ; | 
|---|
|  | 64 | ; - treat as an rx number | 
|---|
|  | 65 | S IBAR=$$RXREC(IBSTR) I IBAR>0 S IBTYPE=3 | 
|---|
|  | 66 | ; | 
|---|
|  | 67 | RECQ Q IBAR | 
|---|
|  | 68 | ; | 
|---|
|  | 69 | RXREC(IBRXN) ; Search the Rx | 
|---|
|  | 70 | N IBR,IBX,IBARR,IBY,IBBIL,IBTRKN,IBFIL,IBRX | 
|---|
|  | 71 | I $L(IBRXN)<5,'$D(^IBA(362.4,"B",IBRXN)) Q -1 | 
|---|
|  | 72 | ; Scan 362.4 | 
|---|
|  | 73 | ; 1) check the exact match: | 
|---|
|  | 74 | S IBX=0 F  S IBX=$O(^IBA(362.4,"B",IBRXN,IBX)) Q:'IBX  D | 
|---|
|  | 75 | . S IBBIL=$P($G(^IBA(362.4,IBX,0)),U,2) Q:'IBBIL | 
|---|
|  | 76 | . I $P($G(^DGCR(399,IBBIL,0)),U,13)=7 Q  ; ignore cancld | 
|---|
|  | 77 | . S IBARR(IBBIL)="" | 
|---|
|  | 78 | ; 2) check Rx with postfixes like "A","B" etc | 
|---|
|  | 79 | S IBR=IBRXN_" " F  S IBR=$O(^IBA(362.4,"B",IBR)) Q:$E(IBR,1,$L(IBRXN))'=IBRXN  D | 
|---|
|  | 80 | . I $E(IBR,$L(IBRXN)+1)'?1A Q  ; only letters in postfx | 
|---|
|  | 81 | . S IBX=0 F  S IBX=$O(^IBA(362.4,"B",IBR,IBX)) Q:'IBX  D | 
|---|
|  | 82 | . . S IBBIL=$P($G(^IBA(362.4,IBX,0)),U,2) Q:'IBBIL | 
|---|
|  | 83 | . . I $P($G(^DGCR(399,IBBIL,0)),U,13)=7 Q  ; ignore cancld | 
|---|
|  | 84 | . . S IBARR(IBBIL)="" | 
|---|
|  | 85 | ; 3) Now scan CT (356): | 
|---|
|  | 86 | S DIC=52,DIC(0)="BO",X=IBSTR D DIC^PSODI(52,.DIC,X) S IBRX=+Y K DIC,X,Y | 
|---|
|  | 87 | I IBRX S IBFIL="" F  S IBFIL=$O(^IBT(356,"ARXFL",IBRX,IBFIL)) Q:IBFIL=""  D | 
|---|
|  | 88 | . S IBTRKN="" F  S IBTRKN=$O(^IBT(356,"ARXFL",IBRX,IBFIL,IBTRKN)) Q:IBTRKN=""  D | 
|---|
|  | 89 | .. S IBBIL=$P($G(^IBT(356,IBTRKN,0)),U,11) Q:'IBBIL | 
|---|
|  | 90 | .. I $P($G(^DGCR(399,IBBIL,0)),U,13)=7 Q  ; ignore cancld | 
|---|
|  | 91 | .. S IBARR(IBBIL)="" | 
|---|
|  | 92 | ; | 
|---|
|  | 93 | S IBY=$O(IBARR("")) I IBY'>0 Q -1  ;not found | 
|---|
|  | 94 | I '$O(IBARR(IBY)) D DTL(+IBY,"Rx#",IBRXN) Q +IBY  ;one only | 
|---|
|  | 95 | W !!,"More than one fill for Rx# ",IBSTR," has been billed." | 
|---|
|  | 96 | S IBY=$$SEL(.IBARR) | 
|---|
|  | 97 | D DTL(IBY,"Rx#",IBRXN) | 
|---|
|  | 98 | Q IBY | 
|---|
|  | 99 | ; | 
|---|
|  | 100 | AREC(AUTH) ; Find the Receivable for a TRICARE FI Authorization Number | 
|---|
|  | 101 | ;   Input: AUTH - Fiscal Intermediary Authorization Number | 
|---|
|  | 102 | ;  Output: IBIFN  >0 => ptr to claim/AR in files 399/430 | 
|---|
|  | 103 | ;                 -1 => No receivable found | 
|---|
|  | 104 | N IBIFN | 
|---|
|  | 105 | S IBIFN=-1 | 
|---|
|  | 106 | I $G(AUTH)="" G ARECQ | 
|---|
|  | 107 | S IBIFN=$P($G(^IBA(351.5,+$O(^IBA(351.5,"AUTH",AUTH,0)),0)),U,9) | 
|---|
|  | 108 | S:'IBIFN IBIFN=-1 | 
|---|
|  | 109 | ARECQ ; | 
|---|
|  | 110 | D DTL(IBIFN,"TRICARE#",AUTH) | 
|---|
|  | 111 | Q IBIFN | 
|---|
|  | 112 | ; | 
|---|
|  | 113 | ; | 
|---|
|  | 114 | EREC(AUTH) ; Find the Receivable for an ECME FI Number | 
|---|
|  | 115 | ;   Input: AUTH  - Fiscal Intermediary ECME Number | 
|---|
|  | 116 | ;  Output: IBIFN  >0 => ptr to claim/AR in files 399/430 | 
|---|
|  | 117 | ;                 -1 => No receivable found | 
|---|
|  | 118 | ; | 
|---|
|  | 119 | N IBIFN,IBC,IBX,IBA,IBE,IBES | 
|---|
|  | 120 | S IBIFN=-1,IBC=0 | 
|---|
|  | 121 | I $G(AUTH)="" G ARECQ | 
|---|
|  | 122 | S (IBE,IBES)=+AUTH_";" | 
|---|
|  | 123 | F  S IBE=$O(^DGCR(399,"AG",IBE)) Q:IBE'[IBES  D | 
|---|
|  | 124 | . S IBX=0 F  S IBX=$O(^DGCR(399,"AG",IBE,IBX)) Q:'IBX  D | 
|---|
|  | 125 | .. I $P($G(^DGCR(399,IBX,0)),U,13)=7 Q  ;exclude cancld | 
|---|
|  | 126 | .. S IBA(IBX)="",IBC=IBC+1 | 
|---|
|  | 127 | I IBC'>1 S IBIFN=$O(IBA(0)) G ERECQ  ; only one found | 
|---|
|  | 128 | W !!,"More than one fill for ECME# ",AUTH," has been billed." | 
|---|
|  | 129 | S IBIFN=$$SEL(.IBA) | 
|---|
|  | 130 | ERECQ S:'IBIFN IBIFN=-1 | 
|---|
|  | 131 | D DTL(IBIFN,"ECME#",AUTH) ;details | 
|---|
|  | 132 | Q IBIFN | 
|---|
|  | 133 | ; | 
|---|
|  | 134 | DTL(IBIFN,TYPE,AUTH) ;Details | 
|---|
|  | 135 | Q:IBIFN'>0  Q:AUTH="" | 
|---|
|  | 136 | N IBZ,IBBIL,IBPAT,IBPATN,IBRX,IB3624,IBDRUG,IBQTY,IBDAT,DIR | 
|---|
|  | 137 | S IBZ=$G(^DGCR(399,IBIFN,0)) | 
|---|
|  | 138 | S IBBIL=$P(IBZ,U),IBPAT=$P(IBZ,U,2),IBDAT=$P(IBZ,U,3) | 
|---|
|  | 139 | S IBPATN=$P($G(^DPT(+IBPAT,0)),U) | 
|---|
|  | 140 | S IB3624=$G(^IBA(362.4,+$O(^IBA(362.4,"C",IBIFN,"")),0)) | 
|---|
|  | 141 | D ZERO^IBRXUTL(+$P(IB3624,U,4)) | 
|---|
|  | 142 | S IBDRUG=$G(^TMP($J,"IBDRUG",+$P(IB3624,U,4),.01)) | 
|---|
|  | 143 | K ^TMP($J,"IBDRUG") | 
|---|
|  | 144 | S IBRX=$$FILE^IBRXUTL(+$P(IB3624,U,5),.01) | 
|---|
|  | 145 | S IBQTY=+$P(IB3624,U,7) | 
|---|
|  | 146 | W !!,"Found IB Bill ",IBBIL," matching to "_TYPE_" '",AUTH,"':" | 
|---|
|  | 147 | W !,"Rx#",IBRX," ",$$DAT3^IBOUTL(IBDAT),", ",IBPATN,", ",IBDRUG I IBQTY W " (",IBQTY,")" | 
|---|
|  | 148 | Q | 
|---|
|  | 149 | ; | 
|---|
|  | 150 | AUD(IBIFN) ; Does the Accounts Receivable need to be audited? | 
|---|
|  | 151 | ;   Input: IBIFN  - ptr to claim/AR in files 399/430 | 
|---|
|  | 152 | ;  Output: 0 => Claim does not have to be audited | 
|---|
|  | 153 | ;               (claim was set up automatically) | 
|---|
|  | 154 | ;          1 => Claim must be audited | 
|---|
|  | 155 | ;               (claim was established manually) | 
|---|
|  | 156 | ; | 
|---|
|  | 157 | AUDQ Q $O(^IBA(351.5,"ACL",+$G(IBIFN),0))'>0 | 
|---|
|  | 158 | ; | 
|---|
|  | 159 | ; | 
|---|
|  | 160 | TYP(IBIFN) ; Determine the bill type for an Accounts Receivable. | 
|---|
|  | 161 | ;  Input:  IBIFN - ptr to claim/AR in files 399/430 | 
|---|
|  | 162 | ; Output:  I => Inpatient bill | 
|---|
|  | 163 | ;          O => Outpatient bill | 
|---|
|  | 164 | ;          PH => Pharmacy bill | 
|---|
|  | 165 | ;          PR => Prosthetics bill | 
|---|
|  | 166 | ; | 
|---|
|  | 167 | ;          or -1 if the bill type can't be determined. | 
|---|
|  | 168 | ; | 
|---|
|  | 169 | N IBATYP,IBATYPN,IBBG,IBN,IBND,IBTYP,IBX | 
|---|
|  | 170 | S IBTYP=-1 | 
|---|
|  | 171 | I '$G(IBIFN) G TYPQ | 
|---|
|  | 172 | ; | 
|---|
|  | 173 | ; - see if AR originated from file #399 | 
|---|
|  | 174 | S IBX=$G(^DGCR(399,IBIFN,0)) | 
|---|
|  | 175 | I IBX]"" D  G TYPQ | 
|---|
|  | 176 | .S IBTYP=$$BTYP^IBCOIVM1(IBIFN,IBX) | 
|---|
|  | 177 | .S IBTYP=$S(IBTYP="":-1,IBTYP="P":"PR",IBTYP="R":"PH",1:IBTYP) | 
|---|
|  | 178 | ; | 
|---|
|  | 179 | ; - get the bill number | 
|---|
|  | 180 | S IBX=$P($G(^PRCA(430,IBIFN,0)),U) | 
|---|
|  | 181 | I IBX="" G TYPQ | 
|---|
|  | 182 | ; | 
|---|
|  | 183 | ; - AR must have originated from file #350 | 
|---|
|  | 184 | S IBN=$O(^IB("ABIL",IBX,0)) | 
|---|
|  | 185 | I 'IBN G TYPQ | 
|---|
|  | 186 | S IBND=$G(^IB(IBN,0)) | 
|---|
|  | 187 | I 'IBND G TYPQ | 
|---|
|  | 188 | S IBATYP=$G(^IBE(350.1,+$P(IBND,U,3),0)),IBBG=$P(IBATYP,U,11) | 
|---|
|  | 189 | ; | 
|---|
|  | 190 | ; - handle TRICARE charges first | 
|---|
|  | 191 | I IBBG=7 D  G TYPQ | 
|---|
|  | 192 | .S IBATYPN=$P(IBATYP,U) | 
|---|
|  | 193 | .S IBTYP=$S(IBATYPN["INPT":"I",IBATYPN["OPT":"O",1:"PH") | 
|---|
|  | 194 | ; | 
|---|
|  | 195 | S IBTYP=$S(IBBG=4:"O",IBBG=5:"PH",IBBG=8:"O",1:"I") | 
|---|
|  | 196 | TYPQ Q IBTYP | 
|---|
|  | 197 | ; | 
|---|
|  | 198 | RELBILL(IBIFN) ; given a Third Party Bill, find all related Third Party bills, | 
|---|
|  | 199 | ; then find all First Party bills related to any of the Third Party bills | 
|---|
|  | 200 | ; Input:  IBIFN = internal file number of a Third Party bill | 
|---|
|  | 201 | ; Output: Third Party Bills (#399) | 
|---|
|  | 202 | ;    ^TMP("IBRBT", $J, selected bill ifn) = PATIENT HAS ANY RX COVERAGE ON FROM DATE OF BILL? | 
|---|
|  | 203 | ;    ^TMP("IBRBT", $J, selected bill ifn, matching bill ifn) = | 
|---|
|  | 204 | ;                                        BILL FROM ^ BILL TO ^ CANCELLED? ^ AR BILL NUMBER ^ | 
|---|
|  | 205 | ;                                        PAYER SEQUENCE ^ PAYER IS MEDICARE SUPPLEMENTAL (0/1) ^ PAYER NAME | 
|---|
|  | 206 | ; Output:  First Party Bills (#350) | 
|---|
|  | 207 | ;    ^TMP("IBRBF", $J , selected bill ifn ) = "" | 
|---|
|  | 208 | ;    ^TMP("IBRBF", $J , selected bill ifn , charge ifn) = | 
|---|
|  | 209 | ;                                        BILL FROM ^ BILL TO ^ CANCELLED? ^ AR BILL NUMBER ^ | 
|---|
|  | 210 | ;                                        TOTAL CHARGE ^ ACTION TYPE (SHORT) ^ # DAYS ON HOLD | 
|---|
|  | 211 | ; | 
|---|
|  | 212 | N IBIFN1 I '$D(^DGCR(399,+$G(IBIFN),0)) Q | 
|---|
|  | 213 | D TPTP^IBEFUR(IBIFN) | 
|---|
|  | 214 | S IBIFN1=0 F  S IBIFN1=$O(^TMP("IBRBT",$J,IBIFN,IBIFN1)) Q:'IBIFN1  D TPFP^IBEFUR(IBIFN1) | 
|---|
|  | 215 | Q | 
|---|
|  | 216 | ; | 
|---|
|  | 217 | SEL(IBARR) ; Select an rx bill | 
|---|
|  | 218 | ;  Input: IBARR - Array of IBIFN | 
|---|
|  | 219 | ; Output: IBNUM - One of the bill iens, or -1 | 
|---|
|  | 220 | ; | 
|---|
|  | 221 | N DIR,IBIFN,IBRXN,IBDT,IBZ,IBY,IBC,IBBIL,IBLNK,DFN,IBPT,I | 
|---|
|  | 222 | ; | 
|---|
|  | 223 | S IBIFN=$O(IBARR("")) | 
|---|
|  | 224 | I 'IBIFN Q -1 | 
|---|
|  | 225 | I '$O(IBARR(IBIFN)) Q IBIFN  ; no choice | 
|---|
|  | 226 | ; | 
|---|
|  | 227 | W !!?4,"Select one of the following:",! | 
|---|
|  | 228 | W !?11,"BILL",?23,"RX",?33,"DATE",?46,"PATIENT" | 
|---|
|  | 229 | W !?6 F I=1:1:60 W "-" | 
|---|
|  | 230 | ; | 
|---|
|  | 231 | S (IBIFN,IBC)=0 | 
|---|
|  | 232 | F  S IBIFN=$O(IBARR(IBIFN)) Q:'IBIFN  D | 
|---|
|  | 233 | . S IBZ=$G(^DGCR(399,IBIFN,0)) Q:IBZ="" | 
|---|
|  | 234 | . S DFN=+$P(IBZ,U,2),IBPT=$P($G(^DPT(DFN,0)),U) | 
|---|
|  | 235 | . S IBBIL=$P(IBZ,U) | 
|---|
|  | 236 | . S IBDT=$P(IBZ,U,3) | 
|---|
|  | 237 | . S IBY=$G(^IBA(362.4,+$O(^IBA(362.4,"C",IBIFN,0)),0)) | 
|---|
|  | 238 | . S IBRXN=$P(IBY,U) | 
|---|
|  | 239 | . S IBC=IBC+1 | 
|---|
|  | 240 | . S IBLNK(IBC)=IBIFN | 
|---|
|  | 241 | . W !?6,IBC,?10,IBBIL," ",?20,IBRXN," ",?32,$$DAT1^IBOUTL(IBDT)," ",?45,IBPT | 
|---|
|  | 242 | ; | 
|---|
|  | 243 | ; | 
|---|
|  | 244 | F  R !!?4,"Select one of the bills by number: ",IBY:DTIME  Q:'$T  Q:"^"[IBY  Q:$D(IBLNK(+IBY))  W:(IBY'="")&(IBY'["?") "  ??"  D | 
|---|
|  | 245 | . W !!?8,"Enter numeric value from 1 to ",IBC | 
|---|
|  | 246 | ; | 
|---|
|  | 247 | S IBIFN=$G(IBLNK(+IBY),-1) | 
|---|
|  | 248 | Q IBIFN | 
|---|