| [613] | 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
 | 
|---|