[613] | 1 | IBNCPDPU ;OAK/ELZ - UTILITIES FOR NCPCP ;24-JUN-2003
|
---|
| 2 | ;;2.0;INTEGRATED BILLING;**223,276,347**;21-MAR-94;Build 24
|
---|
| 3 | ;;Per VHA Directive 2004-038, this routine should not be modified.
|
---|
| 4 | ;
|
---|
| 5 | ;NCPDP PHASE III
|
---|
| 6 | Q
|
---|
| 7 | ;IA 4702
|
---|
| 8 | ;
|
---|
| 9 | ;
|
---|
| 10 | CT(DFN,IBRXN,IBFIL,IBADT,IBRMARK) ; files in claims tracking
|
---|
| 11 | ; Input:
|
---|
| 12 | ; DFN - Patient IEN
|
---|
| 13 | ; IBRXN - Rx IEN
|
---|
| 14 | ; IBFIL - Fill#
|
---|
| 15 | ; IBADT - Fill Date
|
---|
| 16 | ; IBRMARK - Non-billable Reason (.01 from 356.8)
|
---|
| 17 | ;
|
---|
| 18 | N DIE,DR,DA,IBRXTYP,IBEABD
|
---|
| 19 | I IBTRKRN D:$D(IBRMARK) Q
|
---|
| 20 | . S DIE="^IBT(356,",DA=IBTRKRN,DR=".19///"_IBRMARK D ^DIE
|
---|
| 21 | ; event type pointer for rx billing
|
---|
| 22 | S IBRXTYP=$O(^IBE(356.6,"AC",4,0))
|
---|
| 23 | ; earliest auto-billing date
|
---|
| 24 | S IBEABD=$$EABD^IBTUTL(IBRXTYP,$$FMADD^XLFDT(IBADT,60))
|
---|
| 25 | ; space out earliest auto bill date
|
---|
| 26 | D REFILL^IBTUTL1(DFN,IBRXTYP,IBADT,IBRXN,IBFIL,$G(IBRMARK),IBEABD)
|
---|
| 27 | Q
|
---|
| 28 | ;
|
---|
| 29 | NDC(X) ; Massage the NDC as it is stored in Pharmacy
|
---|
| 30 | ; Input: X -- The NDC as it is stored in Pharmacy
|
---|
| 31 | ; Output: X -- The NDC in the format 5N 1"-" 4N 1"-" 2N
|
---|
| 32 | ;
|
---|
| 33 | I $G(X)="" S X="" G NDCQ
|
---|
| 34 | ;
|
---|
| 35 | N LEN,PCE,Y,Z
|
---|
| 36 | ;
|
---|
| 37 | S Z(1)=5,Z(2)=4,Z(3)=2
|
---|
| 38 | S PCE=0 F S PCE=$O(Z(PCE)) Q:'PCE S LEN=Z(PCE) D
|
---|
| 39 | .S Y=$P(X,"-",PCE)
|
---|
| 40 | .I $L(Y)>LEN S Y=$E(Y,2,LEN+1)
|
---|
| 41 | .I $L(+Y)<LEN S Y=$$FILL(Y,LEN)
|
---|
| 42 | .S $P(X,"-",PCE)=Y
|
---|
| 43 | ;
|
---|
| 44 | NDCQ Q X
|
---|
| 45 | ;
|
---|
| 46 | FILL(X,LEN) ; Zero-fill, right justified.
|
---|
| 47 | N Y
|
---|
| 48 | S:'$G(LEN) LEN=1
|
---|
| 49 | S Y=$E($G(X),1,LEN)
|
---|
| 50 | F Q:$L(Y)>(LEN-1) S Y="0"_Y
|
---|
| 51 | Q Y
|
---|
| 52 | ;
|
---|
| 53 | PLANN(DFN,IBX,IBADT) ; returns the ien in the insurance multiple for the given plan
|
---|
| 54 | ; /patient privided.
|
---|
| 55 | ; ien in multiple^insurance co ien
|
---|
| 56 | N IBPOL,IBY,IBR
|
---|
| 57 | S IBR=""
|
---|
| 58 | D ALL^IBCNS1(DFN,"IBPOL",3,IBADT)
|
---|
| 59 | S IBY=0 F S IBY=$O(IBPOL(IBY)) Q:IBY<1!(IBR) I $P(IBPOL(IBY,0),"^",18)=IBX S IBR=$P(IBPOL(IBY,0),"^")_"^"_IBY
|
---|
| 60 | Q IBR
|
---|
| 61 | ;
|
---|
| 62 | RT(DFN,IBINS,IBN) ; returns rate type to use for bill
|
---|
| 63 | ; pass in insurance by ref and which insurance entry to use
|
---|
| 64 | ; if '$d(ibn) then it loops through to find the first one
|
---|
| 65 | ; format is RT (ien) ^ Rate Type (Tort or Awp or Cost)
|
---|
| 66 | N VAEL,VAERR,IBPT,IBRT,IBX
|
---|
| 67 | D ELIG^VADPT
|
---|
| 68 | ;
|
---|
| 69 | ; if primary elig is vet type, use reimbursable
|
---|
| 70 | S IBPT=$P($G(^DIC(8,+VAEL(1),0)),"^",5) ; = N:NON-VETERAN;Y:VETERAN
|
---|
| 71 | I IBPT="Y" S IBRT=$O(^DGCR(399.3,"B","REIMBURSABLE INS.",0)) Q $S(IBRT:IBRT,1:8)_"^T"
|
---|
| 72 | ;
|
---|
| 73 | ;**** temp for initial testing only, we are not doing Tricare or Champva
|
---|
| 74 | Q $S($D(IBRT):IBRT,1:"0^unable to determine rate type")
|
---|
| 75 | ;
|
---|
| 76 | ; if primary elig is TRICARE/CHAMPUS use one of the champus', depending
|
---|
| 77 | ; on insurance coverage
|
---|
| 78 | I $P($G(^DIC(8.1,+$P($G(^DIC(8,+VAEL(3),0)),"^",9),0)),"^")="TRICARE/CHAMPUS" S IBRT=$$UINS("CHAMPUS",.IBINS,.IBN)
|
---|
| 79 | ;
|
---|
| 80 | ; if primary elig is CHAMPVA use one of the champva's, depending
|
---|
| 81 | ; on insurance coverage
|
---|
| 82 | I $P($G(^DIC(8.1,+$P($G(^DIC(8,+VAEL(3),0)),"^",9),0)),"^")="CHAMPVA" S IBRT=$$UINS("CHAMPVA",.IBINS,.IBN)
|
---|
| 83 | ;
|
---|
| 84 | Q $S($D(IBRT):IBRT,1:"0^unable to determine rate type")
|
---|
| 85 | ;
|
---|
| 86 | ;
|
---|
| 87 | UINS(IBT,IBINS,IBN) ; in the case of tricare or champva you may have to use
|
---|
| 88 | ; insurance different rate types insted of the actual tricare or champva
|
---|
| 89 | N IBRT
|
---|
| 90 | S IBN=+$G(IBN,$O(IBINS("S",+$O(IBINS("S",0)),0)))
|
---|
| 91 | I $P($G(^IBE(355.1,+$P($G(IBINS(IBN,355.3)),"^",9),0)),"^")=IBT S IBRT=$O(^DGCR(399.3,"B",IBT,0)),IBRT=$S(IBRT:IBRT_"^"_$S(IBT="CHAMPUS":"A",1:"C"),1:"0^"_IBT_" Rate type not found")
|
---|
| 92 | I '$D(IBRT) S IBRT=$O(^DGCR(399.3,"B",IBT_" REIMB. INS.",0)),IBRT=$S(IBRT:IBRT_"^"_$S(IBT="CHAMPUS":"A",1:"C"),1:"0^"_IBT_" REIMB. INS. Rate type not found")
|
---|
| 93 | Q IBRT
|
---|
| 94 | ;
|
---|
| 95 | BS() ; returns the mccr utility to use
|
---|
| 96 | N IBX
|
---|
| 97 | S IBX=0 F S IBX=$O(^DGCR(399.1,"B","PRESCRIPTION",IBX)) Q:IBX<1 I $P($G(^DGCR(399.1,+$G(IBX),0)),U,5) Q
|
---|
| 98 | Q IBX
|
---|
| 99 | ;
|
---|
| 100 | ; Match IB Bill by the 7-digit ECME number
|
---|
| 101 | RXBIL(IBINP,IBERR) ; Matching NCPDP payments
|
---|
| 102 | ;Input:
|
---|
| 103 | ; IBINP("ECME") - the 7-digit ECME number (Reference Number)
|
---|
| 104 | ; IBINP("FILLDT") - the Rx fill date, YYYYMMDD or FileMan format
|
---|
| 105 | ; IBINP("PNM") (optional) - the patient's last name
|
---|
| 106 | ;Returns:
|
---|
| 107 | ; IBERR (by ref) - the error code, or null string if found
|
---|
| 108 | ; $$RXBIL - IB Bill IEN, or 0 if not matched
|
---|
| 109 | N IBKEY,IBECME,BILLDA,IBFOUND,IBMATCH,IBDAT,IBPNAME
|
---|
| 110 | S IBERR=""
|
---|
| 111 | S IBECME=$G(IBINP("ECME"))
|
---|
| 112 | I IBECME'?1.7N S IBERR="Invalid ECME number" Q 0
|
---|
| 113 | S IBDAT=$G(IBINP("FILLDT")) ; Rx fill date
|
---|
| 114 | I IBDAT?8N S IBDAT=($E(IBDAT,1,4)-1700)_$E(IBDAT,5,8) ; conv date to FM format
|
---|
| 115 | I IBDAT'?7N Q $$RXBILND(IBECME) ; date is not correct or null
|
---|
| 116 | S IBPNAME=$G(IBINP("PNM")) ; patient's name (optional)
|
---|
| 117 | S IBKEY=+IBECME_";"_IBDAT ; The ECME Number (BC ID)
|
---|
| 118 | S BILLDA="",IBFOUND=0,IBMATCH=0
|
---|
| 119 | ; Search backward
|
---|
| 120 | F S BILLDA=$O(^DGCR(399,"AG",IBKEY,BILLDA),-1) Q:BILLDA="" D Q:IBFOUND
|
---|
| 121 | . I 'BILLDA Q ; IEN must be numeric
|
---|
| 122 | . I '$D(^DGCR(399,BILLDA,0)) Q ; Corrupted index
|
---|
| 123 | . S IBMATCH=1
|
---|
| 124 | . I IBPNAME'="" I '$$TXMATCH($P(IBPNAME,","),$P($G(^DPT(+$P(^DGCR(399,BILLDA,0),U,2),0)),","),8) Q ; Patient name doesn't match
|
---|
| 125 | . S IBFOUND=1
|
---|
| 126 | I 'BILLDA S IBERR=$S(IBMATCH:"Patient's name does not match",1:"Matching bill not found") ; not matched
|
---|
| 127 | Q +BILLDA
|
---|
| 128 | ;
|
---|
| 129 | RXBILND(IBECME) ;Match the bill with no date
|
---|
| 130 | N IBKEY,IBBC,BILLDA,IBY,IBCUT
|
---|
| 131 | S IBKEY=+IBECME_";"
|
---|
| 132 | S IBCUT=$$FMADD^XLFDT(DT,-180) ; only 180 days in the past
|
---|
| 133 | S BILLDA=0
|
---|
| 134 | ; Search PRNT/TX forward
|
---|
| 135 | S IBBC=IBKEY_IBCUT
|
---|
| 136 | F S IBBC=$O(^DGCR(399,"AG",IBBC)) Q:IBBC'[IBKEY D Q:BILLDA
|
---|
| 137 | . S IBY="" F S IBY=$O(^DGCR(399,"AG",IBBC,IBY)) Q:'IBY D Q:BILLDA
|
---|
| 138 | .. I $P($G(^DGCR(399,+IBY,0)),U,13)'=4 Q ; not PRNT/TX
|
---|
| 139 | .. S BILLDA=+IBY
|
---|
| 140 | I BILLDA Q BILLDA
|
---|
| 141 | ; Search ANY backward
|
---|
| 142 | S IBBC=IBKEY_"8000000"
|
---|
| 143 | F S IBBC=$O(^DGCR(399,"AG",IBBC),-1) Q:IBBC'[IBKEY Q:$P(IBBC,";",2)<IBCUT D Q:BILLDA
|
---|
| 144 | . S IBY="" F S IBY=$O(^DGCR(399,"AG",IBBC,IBY),-1) Q:IBY="" D Q:BILLDA
|
---|
| 145 | .. ;I $P($G(^DGCR(399,+IBY,0)),U,13)'=7 Q ; not CANCELLED
|
---|
| 146 | .. S BILLDA=+IBY
|
---|
| 147 | Q BILLDA
|
---|
| 148 | ;
|
---|
| 149 | ;Check matching of two strings - case insensitive, no spaces etc.
|
---|
| 150 | TXMATCH(IBTXT1,IBTXT2,IBMAX) ;
|
---|
| 151 | N IBTR1,IBTR2,IBT1,IBT2
|
---|
| 152 | ;Checking only first IBMAX characters (long names may be trancated
|
---|
| 153 | S IBTR1="ABCDEFGHIJKLMNOPQRSTUVWXYZ:;"",'._()<>/\|@#$%&*-=!`~ "
|
---|
| 154 | S IBTR2="abcdefghijklmnopqrstuvwxyz"
|
---|
| 155 | S IBT1=$E($TR(IBTXT1,IBTR1,IBTR2),1,IBMAX)
|
---|
| 156 | S IBT2=$E($TR(IBTXT2,IBTR1,IBTR2),1,IBMAX)
|
---|
| 157 | Q IBT1=IBT2
|
---|
| 158 | ;
|
---|
| 159 | ECMEBIL(DFN,IBADT) ; Is the pat ECME Billable (pharmacy coverage only)
|
---|
| 160 | ; DFN - ptr to the patient
|
---|
| 161 | ; IBADT - the date
|
---|
| 162 | N IBANY,IBERMSG,IBX,IBINS,IBT,IBZ,IBRES,IBCAT,IBCOV,IBPCOV
|
---|
| 163 | S IBRES=0 ; Not ECME Billable by default
|
---|
| 164 | S (IBCOV,IBPCOV)=0
|
---|
| 165 | ; -- look up ins with Rx
|
---|
| 166 | D ALL^IBCNS1(DFN,"IBINS",1,IBADT,1)
|
---|
| 167 | S IBERMSG="" ; Error message
|
---|
| 168 | S IBCAT=$O(^IBE(355.31,"B","PHARMACY",0))
|
---|
| 169 | S IBX=0 F S IBX=$O(IBINS("S",IBX)) Q:'IBX D Q:IBRES
|
---|
| 170 | . S IBT=0 F S IBT=$O(IBINS("S",IBX,IBT)) Q:'IBT D Q:IBRES
|
---|
| 171 | . . N IBZ,IBPIEN,IBY,IBPL
|
---|
| 172 | . . S IBZ=$G(IBINS(IBT,0))
|
---|
| 173 | . . S IBPL=+$P(IBZ,U,18) Q:'IBPL
|
---|
| 174 | . . S IBCOV=1 ; covered
|
---|
| 175 | . . I '$$PLCOV^IBCNSU3(IBPL,IBADT,IBCAT) Q
|
---|
| 176 | . . S IBPCOV=1
|
---|
| 177 | . . S IBPIEN=+$G(^IBA(355.3,IBPL,6))
|
---|
| 178 | . . I 'IBPIEN S IBERMSG="Plan not linked to the Payer" Q ; Not linked
|
---|
| 179 | . . D STCHK^IBCNRU1(IBPIEN,.IBY)
|
---|
| 180 | . . I $E($G(IBY(1)))'="A" S:IBERMSG="" IBERMSG=$$ERMSG^IBNCPDP1($P($G(IBY(6)),",")) Q
|
---|
| 181 | . . S IBRES=1
|
---|
| 182 | I 'IBCOV Q "0^Not Insured"
|
---|
| 183 | I 'IBPCOV Q "0^No Pharmacy Coverage"
|
---|
| 184 | I 'IBRES,IBERMSG'="" Q "0^"_IBERMSG
|
---|
| 185 | I 'IBRES Q "0^No Insurance ECME billable"
|
---|
| 186 | ;
|
---|
| 187 | Q IBRES
|
---|
| 188 | ;
|
---|
| 189 | SUBMIT(IBRX,IBFIL) ; Submit the Rx claim through ECME
|
---|
| 190 | ; IBRX - RX ien in file #52
|
---|
| 191 | ; IBFIL - Fill No (0 for orig fill)
|
---|
| 192 | N IBDT,IBNDC,IBX
|
---|
| 193 | I '$G(IBRX)!('$D(IBFIL)) Q "0^Invalid parameters."
|
---|
| 194 | S IBDT=$S('IBFIL:$$FILE^IBRXUTL(IBRX,22),1:$$SUBFILE^IBRXUTL(IBRX,IBFIL,52,.01))
|
---|
| 195 | S IBX=$$EN^BPSNCPDP(+IBRX,+IBFIL,IBDT,"BB")
|
---|
| 196 | I +IBX=0 D ECMEACT^PSOBPSU1(+IBRX,+IBFIL,"Claim submitted to 3rd party payer: IB BACK BILLING")
|
---|
| 197 | Q IBX
|
---|
| 198 | ;
|
---|
| 199 | REASON(IBX,EXACT) ; Close Claim Reasons
|
---|
| 200 | Q $P($G(^IBE(356.8,+IBX,0)),U) ; non-billable reason
|
---|
| 201 | ;
|
---|
| 202 | NABP(IBIFN) ;NABP Number
|
---|
| 203 | N IBY,IBTRKN,IBRX,IBFIL,IBZ,IBNABP
|
---|
| 204 | S IBY=+$O(^IBT(356.399,"C",IBIFN,0)) I 'IBY Q ""
|
---|
| 205 | S IBTRKN=$P($G(^IBT(356.399,IBY,0)),U) I 'IBTRKN Q ""
|
---|
| 206 | S IBZ=$G(^IBT(356,IBTRKN,0)) I IBZ="" Q ""
|
---|
| 207 | S IBRX=$P(IBZ,U,8)
|
---|
| 208 | S IBFIL=$P(IBZ,U,10)
|
---|
| 209 | S IBNABP=$$NABP^BPSBUTL(IBRX,IBFIL)
|
---|
| 210 | Q $S(IBNABP=0:"",1:IBNABP)
|
---|
| 211 | ;
|
---|
| 212 | ; Get the K-bill# from CT
|
---|
| 213 | BILL(IBRX,IBFIL) ;
|
---|
| 214 | N IBTRKN,IBIFN
|
---|
| 215 | S IBTRKN=+$O(^IBT(356,"ARXFL",+$G(IBRX),+$G(IBFIL),""))
|
---|
| 216 | S IBIFN=+$P($G(^IBT(356,IBTRKN,0)),U,11)
|
---|
| 217 | Q $P($G(^DGCR(399,IBIFN,0)),U)
|
---|
| 218 | ;
|
---|
| 219 | REJECT(IBECME,IBDATE) ; Is the e-claim rejected?
|
---|
| 220 | N IBINP,IBTRKRN,IBY
|
---|
| 221 | I IBECME'?1.7N Q 0
|
---|
| 222 | ;S IBINP("ECME")=IBECME
|
---|
| 223 | ;S IBINP("FILLDT")=IBDATE
|
---|
| 224 | ;I $$RXBIL(.IBINP) Q 0 ; bill exists
|
---|
| 225 | S IBTRKRN=+$O(^IBT(356,"AE",IBECME,0)) I 'IBTRKRN Q 0
|
---|
| 226 | S IBY=$G(^IBT(356,IBTRKRN,1))
|
---|
| 227 | I $P(IBY,U,11)>0 Q 1 ; Rejected or closed
|
---|
| 228 | Q 0
|
---|
| 229 | ;
|
---|
| 230 | ;
|
---|
| 231 | ;IBNCPDPU
|
---|