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