| 1 | IBNCPNB ;OAK/ELZ - UTILITIES FOR NCPCP ;24-JUN-2003
 | 
|---|
| 2 |  ;;2.0;INTEGRATED BILLING;**276,342**;21-MAR-94;Build 18
 | 
|---|
| 3 |  ;;Per VHA Directive 10-93-142, this routine should not be modified.
 | 
|---|
| 4 |  ;
 | 
|---|
| 5 |  ;NCPDP PHASE III
 | 
|---|
| 6 |  Q
 | 
|---|
| 7 |  ;
 | 
|---|
| 8 |  ;
 | 
|---|
| 9 | NONBR(DFN,IBRX,IBFIL,IBADT,IBCR,IBPAP,IBRC,IBCC,IBUSER) ; Set non-billable reason to CT
 | 
|---|
| 10 |  ; input:
 | 
|---|
| 11 |  ;    DFN - Patient
 | 
|---|
| 12 |  ;    IBRX - Rx IEN
 | 
|---|
| 13 |  ;    IBFIL - fill#
 | 
|---|
| 14 |  ;    IBADT - fill date
 | 
|---|
| 15 |  ;    IBCR - Close Claim Reason (#356.8)
 | 
|---|
| 16 |  ;    IBPAP - Autobillable flag (billable (1) / non-billable (0) flag)
 | 
|---|
| 17 |  ;    IBRC - Release Copay (entered by OPECC)
 | 
|---|
| 18 |  ;    IBCC - Close Reason Comment (entered by OPECC)
 | 
|---|
| 19 |  ;    IBUSER - DUZ of user triggering the billing event
 | 
|---|
| 20 |  N IBTRKRN,DIE,IBRESN,DR,DA,IBRMARK,IBLOCK,IBEABD,IBEABD,IBACT,IBFDA
 | 
|---|
| 21 |  ; update claims tracking
 | 
|---|
| 22 |  S IBTRKRN=+$O(^IBT(356,"ARXFL",IBRX,IBFIL,0))
 | 
|---|
| 23 |  I 'IBTRKRN D  ; if it doesn't exist - create it
 | 
|---|
| 24 |  . N IBTRKR
 | 
|---|
| 25 |  . S IBTRKR=$G(^IBE(350.9,1,6)) ; claims tracking info
 | 
|---|
| 26 |  . ; date can't be before parameters
 | 
|---|
| 27 |  . S $P(IBTRKR,U)=$S('$P(IBTRKR,U,4):0,+IBTRKR&(IBADT<+IBTRKR):0,1:IBADT)
 | 
|---|
| 28 |  . I 'IBTRKR Q  ; CT Disabled
 | 
|---|
| 29 |  . D CT^IBNCPDPU(DFN,IBRX,IBFIL,IBADT,$G(IBCR))
 | 
|---|
| 30 |  . S IBTRKRN=+$O(^IBT(356,"ARXFL",IBRX,IBFIL,0))
 | 
|---|
| 31 |  I 'IBTRKRN Q  ; CT disabled
 | 
|---|
| 32 |  L +^IBT(356,IBTRKRN):10 S IBLOCK=$T
 | 
|---|
| 33 |  S DIE="^IBT(356,",DA=IBTRKRN
 | 
|---|
| 34 |  ;
 | 
|---|
| 35 |  ;
 | 
|---|
| 36 |  ; if Billable - set EABD+60
 | 
|---|
| 37 |  I '$G(IBCR) D  G NONBRQ
 | 
|---|
| 38 |  .Q:$$GET1^DIQ(356,IBTRKRN_",",.19,"I")  ;quit if non-billable
 | 
|---|
| 39 |  .S IBEABD=$$EABD^IBTUTL($O(^IBE(356.6,"AC",4,0)),IBADT)
 | 
|---|
| 40 |  .I IBEABD S IBEABD=$$FMADD^XLFDT(IBEABD,60)
 | 
|---|
| 41 |  .S DR=".17////^S X=IBEABD" D ^DIE
 | 
|---|
| 42 |  ;
 | 
|---|
| 43 |  ; if still billable, set the EABD.
 | 
|---|
| 44 |  ; 
 | 
|---|
| 45 |  ; Don't check for the 2nd insurance in Phase 3 --
 | 
|---|
| 46 |  ; allow the claim to become non-billable, ECME has already warned
 | 
|---|
| 47 |  ; the user and provided information about the 2nd insurance
 | 
|---|
| 48 |  ; in the User Screen
 | 
|---|
| 49 |  ; I IBPAP!$$MOREINS(DFN,IBADT) D  G NONBRQ
 | 
|---|
| 50 |  ; 
 | 
|---|
| 51 |  I IBPAP D  G NONBRQ
 | 
|---|
| 52 |  . S IBEABD=$$EABD^IBTUTL($O(^IBE(356.6,"AC",4,0)),IBADT)
 | 
|---|
| 53 |  . I IBEABD<DT S IBEABD=DT
 | 
|---|
| 54 |  . S DR=".19///@" D ^DIE ; it re-sets .17 (trigger in #356)
 | 
|---|
| 55 |  . S DR=".17////^S X=IBEABD"
 | 
|---|
| 56 |  . S IBRMARK=$$REASON^IBNCPDPU(IBCR)
 | 
|---|
| 57 |  . I IBCC'="" S IBRMARK=IBRMARK_"; "_IBCC
 | 
|---|
| 58 |  . I $L($G(IBCC))>2 S DR=DR_";1.08////^S X=$E(IBRMARK,1,80)"
 | 
|---|
| 59 |  . D ^DIE
 | 
|---|
| 60 |  ;
 | 
|---|
| 61 |  ; set non-billable reason
 | 
|---|
| 62 |  S IBRMARK=$$REASON^IBNCPDPU(IBCR)
 | 
|---|
| 63 |  I IBRMARK="" S IBRMARK="OTHER" S IBCC="Unknown NBR '"_IBCR_"'. "_$G(IBCC)
 | 
|---|
| 64 |  S DR=".19///"_IBRMARK
 | 
|---|
| 65 |  I $L($G(IBCC))>2 S DR=DR_";1.08////^S X=$E(IBCC,1,80)"
 | 
|---|
| 66 |  D ^DIE
 | 
|---|
| 67 |  ;
 | 
|---|
| 68 | NONBRQ ;
 | 
|---|
| 69 |  I $G(IBRC) D  ; Release Copay
 | 
|---|
| 70 |  . S IBACT=+$$RELCOPAY(DFN,IBRX,IBFIL,1,IBADT,0) ; release copay charges off hold
 | 
|---|
| 71 |  . ;if 0 (not found on HOLD) we will have one more attempt, it was scheduled inside RELCOPAY
 | 
|---|
| 72 |  . ; so doesn't make sense to send "NOT RELEASED" e-mail
 | 
|---|
| 73 |  . ; if the 2nd attempt fails then e-mail will be send from RCTASK
 | 
|---|
| 74 |  . ;we send e-mail only if -1 i.e. if charge was found on hold but 
 | 
|---|
| 75 |  . ; ^IBR gave an error when we tried to release it
 | 
|---|
| 76 |  . I IBACT=-1 D RELBUL^IBNCPEB(DFN,IBRX,IBFIL,IBADT,IBACT,IBCR,$G(IBCC),0,1)
 | 
|---|
| 77 |  . ;if -2 (there is no copay) then do nothing
 | 
|---|
| 78 |  S IBFDA(356,IBTRKRN_",",1.03)=DT  ; date last edited
 | 
|---|
| 79 |  S IBFDA(356,IBTRKRN_",",1.04)=IBUSER   ; last edited by
 | 
|---|
| 80 |  D FILE^DIE("","IBFDA"),MSG^DIALOG()
 | 
|---|
| 81 |  I IBLOCK L -^IBT(356,IBTRKRN)
 | 
|---|
| 82 |  Q
 | 
|---|
| 83 |  ;
 | 
|---|
| 84 |  ;
 | 
|---|
| 85 | RELCOPAY(DFN,IBRX,IBFIL,IBRETRY,IBADT,IBIFN) ; Release copay charges on hold
 | 
|---|
| 86 |  ; Input:
 | 
|---|
| 87 |  ;    DFN - Patient IEN
 | 
|---|
| 88 |  ;    IBRX - Rx IEN
 | 
|---|
| 89 |  ;    IBFIL - fill/refill #
 | 
|---|
| 90 |  ;    IBRETRY - retry flag
 | 
|---|
| 91 |  ;    IBADT - fill date
 | 
|---|
| 92 |  ;    IBIFN - 3rd party bill IEN
 | 
|---|
| 93 |  ; output:
 | 
|---|
| 94 |  ;    -2  == there is no any copay
 | 
|---|
| 95 |  ;    -1^error code if unsuccessful  == if ^IBR error
 | 
|---|
| 96 |  ;    0   == charge was not found (and depends on IBRETRY another attempt can be scheduled)
 | 
|---|
| 97 |  ;    >0  == charge was released from HOLD
 | 
|---|
| 98 |  ; this procedure will be called if the Payer agreed to pay 0.00
 | 
|---|
| 99 |  ; or the claim was closed as non-billable by the OPECC.
 | 
|---|
| 100 |  ; if patient exempt from RX copay then there is nothing to release from HOLD - quit
 | 
|---|
| 101 |  I +$$RXEXMT^IBARXEU0(DFN,IBADT)=1 Q -2
 | 
|---|
| 102 |  N IBACT,IBZ,IBFOUND,IBX,IBSEQNO,IBNOS,Y,IBDUZ,RCDUZ
 | 
|---|
| 103 |  ; Schedule the task to speed up the whole process
 | 
|---|
| 104 |  I 'IBRETRY D RCTASK(DFN,IBRX,IBFIL,+IBRETRY,IBADT,IBIFN) Q 0
 | 
|---|
| 105 |  S IBFOUND=0
 | 
|---|
| 106 |  S IBACT="A" F  S IBACT=$O(^IB("AH",DFN,IBACT),-1) Q:'IBACT  D  Q:IBFOUND
 | 
|---|
| 107 |  . S IBZ=$G(^IB(IBACT,0)) Q:IBZ=""
 | 
|---|
| 108 |  . S IBX=$P(IBZ,U,4)
 | 
|---|
| 109 |  . I +IBX'=52 Q  ; not an Rx
 | 
|---|
| 110 |  . I +$P(IBX,":",2)'=IBRX Q  ; other Rx
 | 
|---|
| 111 |  . I +$P(IBX,":",3)'=IBFIL Q  ; other fill
 | 
|---|
| 112 |  . S IBFOUND=IBACT
 | 
|---|
| 113 |  I 'IBFOUND D RCTASK(DFN,IBRX,IBFIL,+$G(IBRETRY),IBADT,IBIFN) Q 0
 | 
|---|
| 114 |  S IBSEQNO=1,IBNOS=IBFOUND
 | 
|---|
| 115 |  S IBDUZ=$P($G(^IB(IBFOUND,1)),U) ; who entered the copay charge?
 | 
|---|
| 116 |  S RCDUZ=IBDUZ
 | 
|---|
| 117 |  D ^IBR I Y<0 Q Y
 | 
|---|
| 118 |  Q IBFOUND
 | 
|---|
| 119 |  ;
 | 
|---|
| 120 |  ;Called by TaskMan
 | 
|---|
| 121 | RELCRG ;
 | 
|---|
| 122 |  N IBACT
 | 
|---|
| 123 |  S IBACT=+$$RELCOPAY(DFN,IBRX,IBFIL,IBRETRY,IBADT,IBIFN)
 | 
|---|
| 124 |  ;if 0 (not found on HOLD) we will have another attempt
 | 
|---|
| 125 |  ;we send e-mail only if -1 (^IBR error)
 | 
|---|
| 126 |  I IBACT=-1 D RELBUL^IBNCPEB(DFN,IBRX,IBFIL,IBADT,IBACT,0,"",IBIFN,IBRETRY)
 | 
|---|
| 127 |  ;
 | 
|---|
| 128 |  Q
 | 
|---|
| 129 |  ;
 | 
|---|
| 130 |  ;Schedule Release Copay
 | 
|---|
| 131 | RCTASK(DFN,IBRX,IBFIL,IBRETRY,IBADT,IBIFN) ;
 | 
|---|
| 132 |  N I,ZTRTN,ZTSAVE,ZTDESC,ZTDTH,ZTIO
 | 
|---|
| 133 |  S IBRETRY=IBRETRY+1
 | 
|---|
| 134 |  I IBRETRY>2 D  Q  ; Only two extra attempts
 | 
|---|
| 135 |  . ;if all attempts were unsuccessful then send e-mail, set IBACT=0 since we do not have it
 | 
|---|
| 136 |  . D RELBUL^IBNCPEB(DFN,IBRX,IBFIL,IBADT,0,0,"",IBIFN,2)
 | 
|---|
| 137 |  S ZTRTN="RELCRG^IBNCPNB"
 | 
|---|
| 138 |  F I="DFN","IBRX","IBFIL","IBRETRY","IBADT","IBIFN" S ZTSAVE(I)=""
 | 
|---|
| 139 |  S ZTDESC="RELEASE COPAY RX IEN# "_IBRX
 | 
|---|
| 140 |  S ZTIO=""
 | 
|---|
| 141 |  S ZTDTH=$$HADD^XLFDT($H,0,0,0,$S(IBRETRY=1:10,1:600))
 | 
|---|
| 142 |  D ^%ZTLOAD
 | 
|---|
| 143 |  Q
 | 
|---|
| 144 |  ;
 | 
|---|
| 145 |  ;
 | 
|---|
| 146 |  ; does the pat have >1 billable insur with pharm coverage?
 | 
|---|
| 147 | MOREINS(DFN,IBADT) ;
 | 
|---|
| 148 |  ; DFN - ptr to the patient
 | 
|---|
| 149 |  ; IBADT - the effective date
 | 
|---|
| 150 |  N IBANY,IBX,IBINS,IBT,IBRES,IBCAT
 | 
|---|
| 151 |  S IBRES=0 ; No by default
 | 
|---|
| 152 |  S IBCAT=$O(^IBE(355.31,"B","PHARMACY",0))
 | 
|---|
| 153 |  ; -- look up insurance for patient
 | 
|---|
| 154 |  D ALL^IBCNS1(DFN,"IBINS",1,IBADT,1)
 | 
|---|
| 155 |  S IBX=0 F  S IBX=$O(IBINS("S",IBX)) Q:'IBX  D  Q:IBRES>1
 | 
|---|
| 156 |  . S IBT=0 F  S IBT=$O(IBINS("S",IBX,IBT)) Q:'IBT  D  Q:IBRES>1
 | 
|---|
| 157 |  . . N IBPL
 | 
|---|
| 158 |  . . S IBPL=+$P($G(IBINS(IBT,0)),U,18) Q:'IBPL
 | 
|---|
| 159 |  . . I '$$PLCOV^IBCNSU3(IBPL,IBADT,IBCAT) Q
 | 
|---|
| 160 |  . . S IBRES=IBRES+1
 | 
|---|
| 161 |  ;
 | 
|---|
| 162 |  Q (IBRES>1)
 | 
|---|
| 163 |  ;
 | 
|---|
| 164 |  ;IBNCPNB
 | 
|---|