| 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
 | 
|---|