| 1 | IBARXMC ;LL/ELZ-PHARMACY COPAY CAP FUNCTIONS ;26-APR-2001
 | 
|---|
| 2 |  ;;2.0;INTEGRATED BILLING;**156,186,237**;21-MAR-94
 | 
|---|
| 3 |  ;;Per VHA Directive 10-93-142, this routine should not be modified.
 | 
|---|
| 4 |  ;
 | 
|---|
| 5 | NEW(IBQ,IBC,IBD,IBB,IBN) ; used to compute new bills amount above cap
 | 
|---|
| 6 |  ; DFN is assumed
 | 
|---|
| 7 |  ; IBQ = quantity
 | 
|---|
| 8 |  ; IBC = charge per item
 | 
|---|
| 9 |  ; IBD = effective date
 | 
|---|
| 10 |  ;   Return:
 | 
|---|
| 11 |  ; IBB = Amount to bill
 | 
|---|
| 12 |  ; IBN = Amount NOT to bill
 | 
|---|
| 13 |  ;
 | 
|---|
| 14 |  N IBA,IBA,IBZ,IBP,IBE,IBY,IBFD,IBTD
 | 
|---|
| 15 |  ;
 | 
|---|
| 16 |  S IBP=$$PRIORITY^IBARXMU(DFN)
 | 
|---|
| 17 |  D CAP(IBD,IBP,.IBZ,.IBY,.IBFD,.IBTD)
 | 
|---|
| 18 |  S IBA=$$BILLED(DFN,IBD,IBFD,IBTD),IBE=$P(IBA,"^",2)
 | 
|---|
| 19 |  S IBB=IBQ*IBC
 | 
|---|
| 20 |  S IBB=$S('IBZ:IBB,IBB+IBA>IBZ:$S(IBZ-IBA>0:IBZ-IBA,1:0),1:IBB) ; monthly
 | 
|---|
| 21 |  I IBB,IBY S IBB=$S(IBB+IBE>IBY:$S(IBY-IBE>0:IBY-IBE,1:0),1:IBB) ; yearly
 | 
|---|
| 22 |  S IBN=$S(IBQ*IBC=IBB:0,1:IBQ*IBC-IBB)
 | 
|---|
| 23 |  ;
 | 
|---|
| 24 |  Q
 | 
|---|
| 25 |  ;
 | 
|---|
| 26 | BILLED(DFN,IBD,IBFD,IBTD) ; returns about billed, format:  month^year
 | 
|---|
| 27 |  ; IBD = transaction date, IBFD = from date, IBTD = to date
 | 
|---|
| 28 |  N IBFY,IBX,IBM,IBY,IBZ
 | 
|---|
| 29 |  F IBX="IBD","IBFD","IBTD" S @IBX=$E(@IBX,1,5)_"00"
 | 
|---|
| 30 |  S IBX=+$O(^IBAM(354.7,DFN,1,"B",IBD,0))
 | 
|---|
| 31 |  S IBM=+$P($G(^IBAM(354.7,DFN,1,IBX,0)),"^",2)
 | 
|---|
| 32 |  S IBY=0,IBZ=IBFD-1 F  S IBZ=$O(^IBAM(354.7,DFN,1,"B",IBZ)) Q:IBZ<1!(IBZ>IBTD)  S IBX=$O(^IBAM(354.7,DFN,1,"B",IBZ,0)) I IBX S IBY=IBY+$P($G(^IBAM(354.7,DFN,1,IBX,0)),"^",2)
 | 
|---|
| 33 |  Q IBM_"^"_IBY
 | 
|---|
| 34 |  ;
 | 
|---|
| 35 | CAP(IBD,IBP,IBM,IBY,IBF,IBT) ; returns the cap amount and dates
 | 
|---|
| 36 |  ; IBD = date of transaction
 | 
|---|
| 37 |  ; IBP = priority level of patient
 | 
|---|
| 38 |  ;    return (by reference):
 | 
|---|
| 39 |  ; IBM = monthly cap amount
 | 
|---|
| 40 |  ; IBY = yearly cap amount
 | 
|---|
| 41 |  ; IBF = from date for yearly cap determination
 | 
|---|
| 42 |  ; IBT = to date for yearly cap determination
 | 
|---|
| 43 |  N IBX,IBDT
 | 
|---|
| 44 |  I $D(^IBAM(354.75,"AC",IBP,IBD)) S IBX=+$O(^(IBD,0)) G CAPC
 | 
|---|
| 45 |  S IBDT=+$O(^IBAM(354.75,"AC",IBP,IBD),-1),IBX=+$O(^(IBDT,0))
 | 
|---|
| 46 | CAPC ;
 | 
|---|
| 47 |  S IBX=$G(^IBAM(354.75,IBX,0))
 | 
|---|
| 48 |  I 'IBX!($P(IBX,"^",5)&(IBD>$P(IBX,"^",5))) S (IBM,IBY,IBF,IBT)=0 Q
 | 
|---|
| 49 |  S IBM=$P(IBX,"^",3),IBY=$P(IBX,"^",4)
 | 
|---|
| 50 |  S IBDT=$P($$FYCY^IBCU8(IBD),"^",$S($P(IBX,"^",6)="C":1,1:3),$S($P(IBX,"^",6)="C":2,1:4))
 | 
|---|
| 51 |  S IBF=$S($P(IBDT,"^")>IBX:$P(IBDT,"^"),1:+IBX)
 | 
|---|
| 52 |  S IBT=$S('$P(IBX,"^",5):$P(IBDT,"^",2),$P(IBDT,"^",2)<$P(IBX,"^",5):$P(IBDT,"^",2),1:$P(IBX,"^",5))
 | 
|---|
| 53 |  ;
 | 
|---|
| 54 |  Q
 | 
|---|
| 55 |  ;
 | 
|---|
| 56 | FLAG(DFN,IBD) ; flag account if at or above cap
 | 
|---|
| 57 |  ; IBD = date of transaction (mo/year fm format)
 | 
|---|
| 58 |  ; flag in account is set to:  2 = cap exceeded, some copays not billed
 | 
|---|
| 59 |  ;                             1 = cap reached
 | 
|---|
| 60 |  ;                             0 = below cap
 | 
|---|
| 61 |  ;
 | 
|---|
| 62 |  N IBC,IBB,IBZ,IBF,IBX,DIE,DR,DA,X,Y,IBFD,IBTD,IBY
 | 
|---|
| 63 |  S IBX=+$O(^IBAM(354.7,DFN,1,"B",IBD,0)) Q:'IBX
 | 
|---|
| 64 |  S IBZ=$G(^IBAM(354.7,DFN,1,IBX,0))
 | 
|---|
| 65 |  D CAP(IBD+1,+$$PRIORITY^IBARXMU(DFN),.IBC,.IBY,.IBFD,.IBTD)
 | 
|---|
| 66 |  S IBB=$$BILLED(DFN,IBD,IBFD,IBTD)
 | 
|---|
| 67 |  S IBF=$S('IBC&('IBY):0,$P(IBZ,"^",4):2,IBC=+IBB:1,IBY=$P(IBB,"^",2):1,1:0)
 | 
|---|
| 68 |  I IBF'=$P(IBZ,"^",3) S DIE="^IBAM(354.7,"_DFN_",1,",DA=IBX,DR=".03///^S X=IBF",DA(1)=DFN L +^IBAM(354.7,DFN):10 I $T D ^DIE L -^IBAM(354.7,DFN)
 | 
|---|
| 69 |  Q
 | 
|---|
| 70 |  ;
 | 
|---|
| 71 | PARENT(X) ; returns the parent entry in 354.71 for a transaction
 | 
|---|
| 72 |  Q +$P($G(^IBAM(354.71,X,0)),"^",10)
 | 
|---|
| 73 |  ;
 | 
|---|
| 74 | NET(X) ; returns net amount billed for a parent and its children
 | 
|---|
| 75 |  ; X = ien from 354.71 (parent or child) output: billed ^ un-billed
 | 
|---|
| 76 |  ;
 | 
|---|
| 77 |  N Y,Z,B,N,P S P=$$PARENT(X),(Y,B,N)=0 F  S Y=$O(^IBAM(354.71,"AF",P,Y)) Q:Y<1  S Z=^IBAM(354.71,Y,0),B=B+$P(Z,"^",11),N=N+$P(Z,"^",12)
 | 
|---|
| 78 |  Q B_"^"_N
 | 
|---|
| 79 |  ;
 | 
|---|
| 80 | CANCEL(DFN,IBDT) ; receives notification of a cancellation and determines
 | 
|---|
| 81 |  ; if more need to be billed.  IBDT should be in fm format date to check
 | 
|---|
| 82 |  ;
 | 
|---|
| 83 |  N IBT,IBTFL,IBX,IBD,IBFD,IBTD,IBDTQ,IBBIL,IBS1,IBS2
 | 
|---|
| 84 |  ;
 | 
|---|
| 85 |  ; first determine if cap reached or quit
 | 
|---|
| 86 |  ;Q:'$P($G(^IBAM(354.7,DFN,1,+$O(^IBAM(354.7,DFN,1,"B",IBDT,0)),0)),"^",3)
 | 
|---|
| 87 |  ;
 | 
|---|
| 88 | C1 ; get starting values
 | 
|---|
| 89 |  S IBS=+$$SITE^IBARXMU
 | 
|---|
| 90 |  S IBP=+$$PRIORITY^IBARXMU(DFN)
 | 
|---|
| 91 |  D CAP(IBDT+1,IBP,.IBZ,.IBY,.IBFD,.IBTD)
 | 
|---|
| 92 |  I ('IBY&('IBZ))!('IBFD)!('IBTD) Q
 | 
|---|
| 93 |  S IBA=$$BILLED(DFN,IBDT+1,IBFD,IBTD),IBE=$P(IBA,"^",2)
 | 
|---|
| 94 |  ;
 | 
|---|
| 95 |  ; query (if any) other facilities to see what is there.
 | 
|---|
| 96 | C2 S IBT=$$TFL^IBARXMU(DFN,.IBTFL)
 | 
|---|
| 97 |  I IBT W:'$D(ZTQUEUED) !,"This patient is being seen at other VA treating facilities. I need to make",!,"sure there are no Rx fills that have not been billed elsewhere." S IBX=0 F  S IBX=$O(IBTFL(IBX)) Q:IBX<1  D
 | 
|---|
| 98 |  . I '$D(ZTQUEUED) U IO W !,"Now sending queries to ",$P(IBTFL(IBX),"^",2)," ..."
 | 
|---|
| 99 |  . S IBDTQ=IBFD F  D  S IBDTQ=$$NEXTMO(IBDTQ) Q:IBDTQ>IBTD
 | 
|---|
| 100 |  .. D UQUERY^IBARXMU(DFN,$E(IBDTQ,1,5)_"00",+IBTFL(IBX),.IBD)
 | 
|---|
| 101 |  .. I $P(IBD(0),"^")=-1!(-1=+IBD) K IBD Q
 | 
|---|
| 102 |  .. S X=1 F  S X=$O(IBD(X)) Q:X<1  S IBD=$$ADD^IBARXMN(DFN,IBD(X))
 | 
|---|
| 103 |  .. K IBD
 | 
|---|
| 104 |  I '$D(ZTQUEUED) U IO
 | 
|---|
| 105 |  ;
 | 
|---|
| 106 | C3 K ^TMP("IBD",$J)
 | 
|---|
| 107 |  ; now lets see if there are some unbilled that can be billed.
 | 
|---|
| 108 |  S IBDTQ=IBFD F  D  S IBDTQ=$$NEXTMO(IBDTQ) Q:IBDTQ>IBTD
 | 
|---|
| 109 |  . S IBX=0 F  S IBX=$O(^IBAM(354.71,"AD",DFN,$E(IBDTQ,1,5)_"00",IBX)) Q:IBX<1  D
 | 
|---|
| 110 |  .. N IBZ S IBZ=^IBAM(354.71,IBX,0)
 | 
|---|
| 111 |  .. ;
 | 
|---|
| 112 |  .. ; check, am I the parent and still have some unbilled
 | 
|---|
| 113 |  .. I $P(IBZ,"^",10)'=IBX!('$P($$NET(IBX),"^",2)) Q
 | 
|---|
| 114 |  .. ;
 | 
|---|
| 115 |  .. ; ^TMP("IBD",$J format(date of transaction,date/time entry added,ien)
 | 
|---|
| 116 |  .. S ^TMP("IBD",$J,$P(IBZ,"^",3),$P(IBZ,"^",15),IBX)=IBZ
 | 
|---|
| 117 |  ;
 | 
|---|
| 118 |  I '$D(^TMP("IBD",$J)) W:'$D(ZTQUEUED) !,"No un-billed transactions exist" Q
 | 
|---|
| 119 |  ;
 | 
|---|
| 120 |  ; how much more can we bill
 | 
|---|
| 121 | C4 S IBB=$S('IBZ&('IBY):9999999,IBZ&((IBZ-IBA)<(IBY-IBE)):IBZ-IBA,1:IBY-IBE)
 | 
|---|
| 122 |  ;
 | 
|---|
| 123 |  ; we now have to bill some of the unbilled ones
 | 
|---|
| 124 |  S IBS1=0 F  S IBS1=$O(^TMP("IBD",$J,IBS1)) Q:IBS1<1  S IBS2=0 F  S IBS2=$O(^TMP("IBD",$J,IBS1,IBS2)) Q:IBS2<1  S IBX=0 F  S IBX=$O(^TMP("IBD",$J,IBS1,IBS2,IBX)) Q:IBX<1  D
 | 
|---|
| 125 |  . S IBZ=^TMP("IBD",$J,IBS1,IBS2,IBX)
 | 
|---|
| 126 |  . ;
 | 
|---|
| 127 | C5 . ; determine how much to bill (if any)
 | 
|---|
| 128 |  . S IBA=$$NET(IBX)
 | 
|---|
| 129 |  . S IBBIL=$S(IBB>$P(IBA,"^",2):$P(IBA,"^",2),1:IBB)
 | 
|---|
| 130 |  . I 'IBBIL S IBS1=9999999999 Q
 | 
|---|
| 131 |  . S IBB=IBB-IBBIL
 | 
|---|
| 132 |  . ;
 | 
|---|
| 133 |  . D @($S(IBS=+IBZ:"BILL",1:"SEND")_"^IBARXMB($P(IBZ,""^""),IBBIL)")
 | 
|---|
| 134 |  K ^TMP("IBD",$J)
 | 
|---|
| 135 |  Q
 | 
|---|
| 136 |  ;
 | 
|---|
| 137 | NEXTMO(DATE) ; returns first date of next month
 | 
|---|
| 138 |  N X S X="",DATE=$G(DATE)\1 I DATE'?7N G NEXTMOQ
 | 
|---|
| 139 |  S X=$S($E(DATE,4,5)<12:$E(DATE,1,5)+1_"01",1:$E(DATE,1,3)+1_"0101")
 | 
|---|
| 140 | NEXTMOQ Q X
 | 
|---|
| 141 |  ;
 | 
|---|
| 142 | QCAN(DFN,IBCAP,IBSAVXMC) ; queue off job to look for back billing in the background
 | 
|---|
| 143 |  N ZTRTN,ZTDTH,ZTIO,ZTDESC,ZTSK,ZTSAVE,Y,IBTAG
 | 
|---|
| 144 |  ;
 | 
|---|
| 145 |  S ZTRTN="DQCAN^IBARXMC",ZTDESC="IB Back Billing of Rx Copay Charges"
 | 
|---|
| 146 |  S ZTDTH=$$FMTH^XLFDT($$FMADD^XLFDT($$NOW^XLFDT,"","",10))
 | 
|---|
| 147 |  S (ZTSAVE("DFN"),ZTSAVE("IBCAP("),ZTSAVE("IBSAVXMC("),ZTIO)="" D ^%ZTLOAD
 | 
|---|
| 148 |  ;
 | 
|---|
| 149 |  I ZTSK<1 S IBTAG=3,Y="^^Error when trying to queue back billing job." D BULL^IBAERR
 | 
|---|
| 150 |  ;
 | 
|---|
| 151 |  Q
 | 
|---|
| 152 |  ;
 | 
|---|
| 153 | DQCAN ; entry point for queued back billing job
 | 
|---|
| 154 |  N IBD,IBL,IBPAT,IBREF,IBSSN,IBTAG,Y
 | 
|---|
| 155 |  ;
 | 
|---|
| 156 |  ; try to get a lock
 | 
|---|
| 157 |  S IBL=0 F X=1:1:10 L +^IBAM(354.7,"APAT",DFN):10 H:'$T 600 I $T S IBL=1 Q
 | 
|---|
| 158 |  I 'IBL D  Q
 | 
|---|
| 159 |  .S IBTAG=3
 | 
|---|
| 160 |  .S IBPAT=$P($G(^DPT(DFN,0)),"^",1) I IBPAT="" S IBPAT=DFN
 | 
|---|
| 161 |  .S IBSSN=$P($G(^DPT(DFN,0)),"^",9) I IBSSN="" S IBSSN="????"
 | 
|---|
| 162 |  .S (X,IBREF)=""
 | 
|---|
| 163 |  .F  S X=$O(IBSAVXMC(X)) Q:X=""  D
 | 
|---|
| 164 |  ..I IBREF'="" S IBREF=IBREF_", "_$P(IBSAVXMC(X),"^",1)
 | 
|---|
| 165 |  ..I IBREF="" S IBREF=$P(IBSAVXMC(X),"^",1)
 | 
|---|
| 166 |  .S Y="^^Unable to lock the IB PATIENT COPAY ACCOUNT (#354.7) file for back billing job related to "_IBPAT_" ("_IBSSN_") and IB reference number(s): "_IBREF_"."
 | 
|---|
| 167 |  .D ^IBAERR Q
 | 
|---|
| 168 |  ;
 | 
|---|
| 169 |  ; do query/back billing
 | 
|---|
| 170 |  S IBD=0 F  S IBD=$O(IBCAP(IBD)) Q:IBD<1  D CANCEL(DFN,IBD)
 | 
|---|
| 171 |  ;
 | 
|---|
| 172 |  ; remove lock
 | 
|---|
| 173 |  L -^IBAM(354.7,"APAT",DFN)
 | 
|---|
| 174 |  ;
 | 
|---|
| 175 |  Q
 | 
|---|