| 1 | RCBEPAYF ;WISC/RFJ-first party payment processing(called by rcbepay) ;1 Jun 00
 | 
|---|
| 2 |  ;;4.5;Accounts Receivable;**153**;Mar 20, 1995
 | 
|---|
| 3 |  ;;Per VHA Directive 10-93-142, this routine should not be modified.
 | 
|---|
| 4 |  Q
 | 
|---|
| 5 |  ;
 | 
|---|
| 6 |  ;
 | 
|---|
| 7 | FIRSTPTY() ;  apply payment to first party account
 | 
|---|
| 8 |  ;  called by rcbepay
 | 
|---|
| 9 |  N PAYMENT,RCBILBAL,RCBILLDA,RCDATE,RCDEBTDA,RCERROR,RCREPAMT,RCSTATUS,RCTRANDA,X
 | 
|---|
| 10 |  K ^TMP("RCBEPAY",$J)
 | 
|---|
| 11 |  ;
 | 
|---|
| 12 |  ;  look up account in debtor file
 | 
|---|
| 13 |  S RCDEBTDA=$$DEBT^RCEVUTL(RCACCT)
 | 
|---|
| 14 |  I RCDEBTDA<0 Q "1^Could not add Patient ("_RCACCT_") to debtor file"
 | 
|---|
| 15 |  ;
 | 
|---|
| 16 |  ;  lock the debtor account
 | 
|---|
| 17 |  L +^RCD(340,RCDEBTDA):20 I '$T Q "1^Another user is working with this patient account"
 | 
|---|
| 18 |  ;
 | 
|---|
| 19 |  ;  build list of active(16) and open(42) bills for patient
 | 
|---|
| 20 |  ;  sorted by date bill prepared
 | 
|---|
| 21 |  F RCSTATUS=16,42 S RCBILLDA=0 F  S RCBILLDA=$O(^PRCA(430,"AS",RCDEBTDA,RCSTATUS,RCBILLDA)) Q:'RCBILLDA  D
 | 
|---|
| 22 |  .   ;  check bill for prepayment
 | 
|---|
| 23 |  .   I $P(^PRCA(430,RCBILLDA,0),"^",2)=26 Q
 | 
|---|
| 24 |  .   ;  if this bill was entered for payment applied against it on
 | 
|---|
| 25 |  .   ;  the receipt, set the tmp global with the date prepared
 | 
|---|
| 26 |  .   ;  equal to zero so payment will be applied to it first
 | 
|---|
| 27 |  .   I $P(RCDATA,"^",3)["PRCA(430,",RCBILLDA=+$P(RCDATA,"^",3) S ^TMP("RCBEPAY",$J,0,RCBILLDA)="" Q
 | 
|---|
| 28 |  .   S ^TMP("RCBEPAY",$J,+$P(^PRCA(430,RCBILLDA,0),"^",10),RCBILLDA)=""
 | 
|---|
| 29 |  ;
 | 
|---|
| 30 |  ;  loop all the bills for a patients account and keep looping them
 | 
|---|
| 31 |  ;  until either there is no more bills or the money paid is zero.
 | 
|---|
| 32 |  ;  the bills are looped in case of repayments.  if there is money
 | 
|---|
| 33 |  ;  left over, this will apply more money to the repayment bills
 | 
|---|
| 34 |  ;  instead of creating a prepayment.  a prepayment should only be
 | 
|---|
| 35 |  ;  created if all bills for the account is collected/closed.
 | 
|---|
| 36 |  S RCERROR=0
 | 
|---|
| 37 |  ;  quit the loop if no money left to apply OR an error occurred OR
 | 
|---|
| 38 |  ;  no more bills left to apply payment to
 | 
|---|
| 39 |  F  D  I 'RCPAYAMT!(RCERROR)!($O(^TMP("RCBEPAY",$J,""))="") Q
 | 
|---|
| 40 |  .   ;  loop the bills by date prepared and apply the payment
 | 
|---|
| 41 |  .   ;  quit if no money left to apply OR and error occurred
 | 
|---|
| 42 |  .   S RCDATE="" F  S RCDATE=$O(^TMP("RCBEPAY",$J,RCDATE)) Q:RCDATE=""  D  I 'RCPAYAMT!(RCERROR) Q
 | 
|---|
| 43 |  .   .   S RCBILLDA=0 F  S RCBILLDA=$O(^TMP("RCBEPAY",$J,RCDATE,RCBILLDA)) Q:'RCBILLDA  D  I 'RCPAYAMT!(RCERROR) Q
 | 
|---|
| 44 |  .   .   .   L +^PRCA(430,RCBILLDA):10
 | 
|---|
| 45 |  .   .   .   I '$T S RCERROR="1^Another user is working will bill "_$P(^PRCA(430,RCBILLDA,0),"^") Q
 | 
|---|
| 46 |  .   .   .   ;
 | 
|---|
| 47 |  .   .   .   ;  exempt any interest/admin/penalty charges added on or after
 | 
|---|
| 48 |  .   .   .   ;  the payment date
 | 
|---|
| 49 |  .   .   .   D EXEMPT^RCBECHGE(RCBILLDA,RCPAYDAT)
 | 
|---|
| 50 |  .   .   .   ;
 | 
|---|
| 51 |  .   .   .   ;  get the repayment amount (if any)
 | 
|---|
| 52 |  .   .   .   S RCREPAMT=$P($G(^PRCA(430,RCBILLDA,4)),"^",3)
 | 
|---|
| 53 |  .   .   .   ;
 | 
|---|
| 54 |  .   .   .   ;  get the balance of the bill
 | 
|---|
| 55 |  .   .   .   S X=$G(^PRCA(430,RCBILLDA,7))
 | 
|---|
| 56 |  .   .   .   S RCBILBAL=$P(X,"^")+$P(X,"^",2)+$P(X,"^",3)+$P(X,"^",4)+$P(X,"^",5)
 | 
|---|
| 57 |  .   .   .   ;  if bill has no balance, chg status = collected/closed
 | 
|---|
| 58 |  .   .   .   I 'RCBILBAL D CHGSTAT^RCBEUBIL(RCBILLDA,22) L -^PRCA(430,RCBILLDA) K ^TMP("RCBEPAY",$J,RCDATE,RCBILLDA) Q
 | 
|---|
| 59 |  .   .   .   ;
 | 
|---|
| 60 |  .   .   .   ;  determine amount to pay
 | 
|---|
| 61 |  .   .   .   ;  if the payment is greater than billed amount, pay billed amount
 | 
|---|
| 62 |  .   .   .   ;  if there is a repayment amount, pay the repayment amount
 | 
|---|
| 63 |  .   .   .   ;  do not allow payment to exceed amount paid
 | 
|---|
| 64 |  .   .   .   S PAYMENT=RCPAYAMT
 | 
|---|
| 65 |  .   .   .   I PAYMENT>RCBILBAL S PAYMENT=RCBILBAL
 | 
|---|
| 66 |  .   .   .   I RCREPAMT S PAYMENT=RCREPAMT I PAYMENT>RCBILBAL S PAYMENT=RCBILBAL
 | 
|---|
| 67 |  .   .   .   I PAYMENT>RCPAYAMT S PAYMENT=RCPAYAMT
 | 
|---|
| 68 |  .   .   .   ;
 | 
|---|
| 69 |  .   .   .   ;  apply payment to bill
 | 
|---|
| 70 |  .   .   .   ;  return error if problem adding payment transaction
 | 
|---|
| 71 |  .   .   .   S RCTRANDA=$$PAYTRAN^RCBEPAY1(RCBILLDA,PAYMENT,RCRECTDA,RCPAYDA,RCPAYDAT)
 | 
|---|
| 72 |  .   .   .   I 'RCTRANDA L -^PRCA(430,RCBILLDA) S RCERROR="1^"_$P(RCTRANDA,"^",2) Q
 | 
|---|
| 73 |  .   .   .   ;
 | 
|---|
| 74 |  .   .   .   ;  payment applied to bill, subtract off the payment amount
 | 
|---|
| 75 |  .   .   .   S RCPAYAMT=RCPAYAMT-$P($G(^PRCA(433,RCTRANDA,1)),"^",5)
 | 
|---|
| 76 |  .   .   .   ;
 | 
|---|
| 77 |  .   .   .   ;  set the amount processed on the receipt payment
 | 
|---|
| 78 |  .   .   .   D SETAMT^RCBEPAY(RCRECTDA,RCPAYDA,$P($G(^PRCA(433,RCTRANDA,1)),"^",5))
 | 
|---|
| 79 |  .   .   .   ;
 | 
|---|
| 80 |  .   .   .   ;  get the new balance of the bill.  if it is zero
 | 
|---|
| 81 |  .   .   .   ;  remove it from the tmp global (this will stop the
 | 
|---|
| 82 |  .   .   .   ;  loop if dollars are left and no bills are active)
 | 
|---|
| 83 |  .   .   .   S X=$G(^PRCA(430,RCBILLDA,7))
 | 
|---|
| 84 |  .   .   .   S RCBILBAL=$P(X,"^")+$P(X,"^",2)+$P(X,"^",3)+$P(X,"^",4)+$P(X,"^",5)
 | 
|---|
| 85 |  .   .   .   I 'RCBILBAL K ^TMP("RCBEPAY",$J,RCDATE,RCBILLDA)
 | 
|---|
| 86 |  .   .   .   ;
 | 
|---|
| 87 |  .   .   .   L -^PRCA(430,RCBILLDA)
 | 
|---|
| 88 |  ;
 | 
|---|
| 89 |  K ^TMP("RCBEPAY",$J)
 | 
|---|
| 90 |  ;
 | 
|---|
| 91 |  ;  if an error occurred, quit
 | 
|---|
| 92 |  I RCERROR L -^RCD(340,RCDEBTDA) Q RCERROR
 | 
|---|
| 93 |  ;
 | 
|---|
| 94 |  ;  if no money left, quit
 | 
|---|
| 95 |  I 'RCPAYAMT L -^RCD(340,RCDEBTDA) Q 0
 | 
|---|
| 96 |  ;
 | 
|---|
| 97 |  ;  dollars remaining, create a prepayment
 | 
|---|
| 98 |  N %,%H,%I,%X,D,D0,DFN,DI,DIC,DICR,DIG,DIH,DIU,DIV,DIW,DQ,I,PRCA,RCREF,VA,VADM
 | 
|---|
| 99 |  D EN^PRCAPAY3(RCACCT,RCPAYAMT,RCPAYDAT,DUZ,$P(^RCY(344,RCRECTDA,0),"^"),"","",.RCERROR,"")
 | 
|---|
| 100 |  ;  no errors
 | 
|---|
| 101 |  I RCERROR=""!(RCERROR=0) D
 | 
|---|
| 102 |  .   S RCERROR=0
 | 
|---|
| 103 |  .   ;  set the amount processed on the receipt
 | 
|---|
| 104 |  .   D SETAMT^RCBEPAY(RCRECTDA,RCPAYDA,RCPAYAMT)
 | 
|---|
| 105 |  ;  error creating prepayment
 | 
|---|
| 106 |  I RCERROR'=0 S RCERROR="1^"_RCERROR
 | 
|---|
| 107 |  ;
 | 
|---|
| 108 |  L -^RCD(340,RCDEBTDA)
 | 
|---|
| 109 |  Q RCERROR
 | 
|---|