| 1 | RCBDFST1 ;WISC/RFJ-patient statement utilities continued             ;1 Dec 00 | 
|---|
| 2 | ;;4.5;Accounts Receivable;**162**;Mar 20, 1995 | 
|---|
| 3 | ;;Per VHA Directive 10-93-142, this routine should not be modified. | 
|---|
| 4 | Q | 
|---|
| 5 | ; | 
|---|
| 6 | ; | 
|---|
| 7 | CHEKACCT(RCDEBTDA) ;  check to see if a debtor is in balance | 
|---|
| 8 | ;  returns null if in balance, or the calculated statement | 
|---|
| 9 | ;  if out of balance | 
|---|
| 10 | ;  returns rcbilbal,rcevent,rcnewact,rcstate,rclastev | 
|---|
| 11 | ;  returns ^tmp("rcbdfst1",$j ... (see NEWTRANS below) | 
|---|
| 12 | ; | 
|---|
| 13 | N %,DATA1,OUTOFBAL | 
|---|
| 14 | ;  get the current balance of all active bills | 
|---|
| 15 | D BILLBAL(RCDEBTDA) | 
|---|
| 16 | ;  get the last statement, rclastev=ien file 341 ^ statement date | 
|---|
| 17 | S RCLASTEV=$$LASTEVNT(RCDEBTDA) | 
|---|
| 18 | I RCLASTEV L +^RC(341,+RCLASTEV) | 
|---|
| 19 | ;  get the last statement balance | 
|---|
| 20 | D EVENTBAL(+RCLASTEV) | 
|---|
| 21 | ;  get new activity after the statement date | 
|---|
| 22 | D NEWTRANS(RCDEBTDA,$P(RCLASTEV,"^",2),9999999) | 
|---|
| 23 | ;  test for out of balance | 
|---|
| 24 | ;  out of balance if the statement balance +/- new activity | 
|---|
| 25 | ;  does not equal the current bill balance | 
|---|
| 26 | S OUTOFBAL="" | 
|---|
| 27 | F %="PB","IN","AD","MF","CC" D | 
|---|
| 28 | .   ;  copy current statement to rcstate, rcstate used to track | 
|---|
| 29 | .   ;  what the statement balance should be | 
|---|
| 30 | .   S RCSTATE(%)=RCEVENT(%) | 
|---|
| 31 | .   I RCEVENT(%)+RCNEWACT(%)=RCBILBAL(%) Q | 
|---|
| 32 | .   S OUTOFBAL=1 | 
|---|
| 33 | .   S RCSTATE(%)=RCBILBAL(%)-RCNEWACT(%) | 
|---|
| 34 | ;  compute calculated statement total | 
|---|
| 35 | S RCSTATE=0 | 
|---|
| 36 | F %="PB","IN","AD","MF","CC" S RCSTATE=RCSTATE+RCSTATE(%) | 
|---|
| 37 | ; | 
|---|
| 38 | I OUTOFBAL S OUTOFBAL=RCSTATE("PB")_"^"_RCSTATE("IN")_"^"_RCSTATE("AD")_"^"_RCSTATE("CC")_"^"_RCSTATE("MF") | 
|---|
| 39 | ; | 
|---|
| 40 | L -^RC(341,+RCLASTEV) | 
|---|
| 41 | Q OUTOFBAL | 
|---|
| 42 | ; | 
|---|
| 43 | ; | 
|---|
| 44 | BILLBAL(DEBTDA) ;  get the bill balances for a debtor | 
|---|
| 45 | ;  returns array RCBILBAL("PB")=principal balance | 
|---|
| 46 | ;                RCBILBAL("IN")=interest balance | 
|---|
| 47 | ;                RCBILBAL("AD")=admin balance | 
|---|
| 48 | ;                RCBILBAL("MF")=marshal fee balance | 
|---|
| 49 | ;                RCBILBAL("CC")=court cost balance | 
|---|
| 50 | ;                RCBILBAL      =total balance | 
|---|
| 51 | N %,BILLDA,DATA7,STATUS | 
|---|
| 52 | ;  initialize | 
|---|
| 53 | S RCBILBAL=0 | 
|---|
| 54 | F %="PB","IN","AD","MF","CC" S RCBILBAL(%)=0 | 
|---|
| 55 | ; | 
|---|
| 56 | ;  for active, open, and refund review (for prepayments), | 
|---|
| 57 | ;  calc bill balance | 
|---|
| 58 | F STATUS=16,42,44 S BILLDA=0 F  S BILLDA=$O(^PRCA(430,"AS",DEBTDA,STATUS,BILLDA)) Q:'BILLDA  D | 
|---|
| 59 | .   S DATA7=$P($G(^PRCA(430,BILLDA,7)),"^",1,5) | 
|---|
| 60 | .   ;  if prepayment, subtract it from active bills principal balance | 
|---|
| 61 | .   I $P($G(^PRCA(430,BILLDA,0)),"^",2)=26 S RCBILBAL("PB")=RCBILBAL("PB")-$P(DATA7,"^") Q | 
|---|
| 62 | .   ;  add balances | 
|---|
| 63 | .   S RCBILBAL("PB")=RCBILBAL("PB")+$P(DATA7,"^")    ;principal | 
|---|
| 64 | .   S RCBILBAL("IN")=RCBILBAL("IN")+$P(DATA7,"^",2)  ;interest | 
|---|
| 65 | .   S RCBILBAL("AD")=RCBILBAL("AD")+$P(DATA7,"^",3)  ;admin | 
|---|
| 66 | .   S RCBILBAL("MF")=RCBILBAL("MF")+$P(DATA7,"^",4)  ;marshal fee | 
|---|
| 67 | .   S RCBILBAL("CC")=RCBILBAL("CC")+$P(DATA7,"^",5)  ;court cost | 
|---|
| 68 | ; | 
|---|
| 69 | ;  compute total | 
|---|
| 70 | F %="PB","IN","AD","MF","CC" S RCBILBAL=RCBILBAL+RCBILBAL(%) | 
|---|
| 71 | Q | 
|---|
| 72 | ; | 
|---|
| 73 | ; | 
|---|
| 74 | NEWTRANS(DEBTDA,BEGDATE,ENDDATE) ;  get new transaction activity between dates | 
|---|
| 75 | ;  returns global array | 
|---|
| 76 | ;    tmp("rcbdfst1",$j,account,transactiondate,bill,transaction)=value | 
|---|
| 77 | ;  where | 
|---|
| 78 | ;    value = ^ prin ^ int ^ admin ^ mf ^ cc | 
|---|
| 79 | ; | 
|---|
| 80 | N %,BILLDA,DATE,ORIGAMT,STATUS,TRANDA,VALUE | 
|---|
| 81 | ;  initialize | 
|---|
| 82 | S RCNEWACT=0 | 
|---|
| 83 | F %="PB","IN","AD","MF","CC" S RCNEWACT(%)=0 | 
|---|
| 84 | K ^TMP("RCBDFST1",$J,DEBTDA) | 
|---|
| 85 | ; | 
|---|
| 86 | ;  get new bills | 
|---|
| 87 | S DATE=BEGDATE F  S DATE=$O(^PRCA(430,"ATD",DEBTDA,DATE)) Q:'DATE!(DATE>ENDDATE)  D | 
|---|
| 88 | .   S BILLDA=0 F  S BILLDA=$O(^PRCA(430,"ATD",DEBTDA,DATE,BILLDA)) Q:'BILLDA  D | 
|---|
| 89 | .   .   S ORIGAMT=$P($G(^PRCA(430,BILLDA,0)),"^",3) | 
|---|
| 90 | .   .   S ^TMP("RCBDFST1",$J,DEBTDA,DATE,BILLDA,0)=ORIGAMT | 
|---|
| 91 | .   .   S RCNEWACT("PB")=RCNEWACT("PB")+ORIGAMT | 
|---|
| 92 | ; | 
|---|
| 93 | ;  get transactions | 
|---|
| 94 | S DATE=BEGDATE F  S DATE=$O(^PRCA(433,"ATD",DEBTDA,DATE)) Q:'DATE!(DATE>ENDDATE)  D | 
|---|
| 95 | .   S TRANDA=0 F  S TRANDA=$O(^PRCA(433,"ATD",DEBTDA,DATE,TRANDA)) Q:'TRANDA  D | 
|---|
| 96 | .   .   ;  if not a valid transaction, do not include it | 
|---|
| 97 | .   .   I '$$VALID^RCRJRCOT(TRANDA) Q | 
|---|
| 98 | .   .   S BILLDA=+$P(^PRCA(433,TRANDA,0),"^",2) | 
|---|
| 99 | .   .   ;  get the transaction value | 
|---|
| 100 | .   .   S VALUE=$$TRANVALU^RCDPBTLM(TRANDA) | 
|---|
| 101 | .   .   ;  transaction has no value | 
|---|
| 102 | .   .   I $TR(VALUE,"^0")="" Q | 
|---|
| 103 | .   .   ;  for patient statements, if the bill is a prepayment(26), | 
|---|
| 104 | .   .   ;  change the sign | 
|---|
| 105 | .   .   I $P($G(^PRCA(430,BILLDA,0)),"^",2)=26 F %=2:1:6 S $P(VALUE,"^",%)=-$P(VALUE,"^",%) | 
|---|
| 106 | .   .   S ^TMP("RCBDFST1",$J,DEBTDA,DATE,BILLDA,TRANDA)=VALUE | 
|---|
| 107 | .   .   S RCNEWACT("PB")=RCNEWACT("PB")+$P(VALUE,"^",2) | 
|---|
| 108 | .   .   S RCNEWACT("IN")=RCNEWACT("IN")+$P(VALUE,"^",3) | 
|---|
| 109 | .   .   S RCNEWACT("AD")=RCNEWACT("AD")+$P(VALUE,"^",4) | 
|---|
| 110 | .   .   S RCNEWACT("MF")=RCNEWACT("MF")+$P(VALUE,"^",5) | 
|---|
| 111 | .   .   S RCNEWACT("CC")=RCNEWACT("CC")+$P(VALUE,"^",6) | 
|---|
| 112 | ; | 
|---|
| 113 | ;  compute total | 
|---|
| 114 | F %="PB","IN","AD","MF","CC" S RCNEWACT=RCNEWACT+RCNEWACT(%) | 
|---|
| 115 | Q | 
|---|
| 116 | ; | 
|---|
| 117 | ; | 
|---|
| 118 | LASTEVNT(DEBTDA) ;  get last type of event for debtor patient statement (2) | 
|---|
| 119 | N EVENTDA,REVDATE,TYPEDA | 
|---|
| 120 | ;  find the inverse date of the last statement, return 0 if none | 
|---|
| 121 | S TYPEDA=+$O(^RC(341.1,"AC",2,0)) | 
|---|
| 122 | S REVDATE=+$O(^RC(341,"AD",DEBTDA,TYPEDA,0)) | 
|---|
| 123 | I 'REVDATE Q 0 | 
|---|
| 124 | ;  find the internal entry number of the statement | 
|---|
| 125 | S EVENTDA=+$O(^RC(341,"AD",DEBTDA,TYPEDA,REVDATE,0)) | 
|---|
| 126 | ;  return the internal entry number ^ last statement date | 
|---|
| 127 | Q EVENTDA_"^"_(9999999.999999-REVDATE) | 
|---|
| 128 | ; | 
|---|
| 129 | ; | 
|---|
| 130 | EVENTBAL(EVENTDA) ;  get the last statement balance | 
|---|
| 131 | ;  returns array RCEVENT("PB")=principal balance | 
|---|
| 132 | ;                RCEVENT("IN")=interest balance | 
|---|
| 133 | ;                RCEVENT("AD")=admin balance | 
|---|
| 134 | ;                RCEVENT("MF")=marshal fee balance | 
|---|
| 135 | ;                RCEVENT("CC")=court cost balance | 
|---|
| 136 | ;                RCEVENT      =total balance | 
|---|
| 137 | N %,DATA1 | 
|---|
| 138 | S DATA1=$G(^RC(341,EVENTDA,1)) | 
|---|
| 139 | S RCEVENT("PB")=$P(DATA1,"^",1)  ;principal | 
|---|
| 140 | S RCEVENT("IN")=$P(DATA1,"^",2)  ;interest | 
|---|
| 141 | S RCEVENT("AD")=$P(DATA1,"^",3)  ;admin | 
|---|
| 142 | S RCEVENT("CC")=$P(DATA1,"^",4)  ;court cost | 
|---|
| 143 | S RCEVENT("MF")=$P(DATA1,"^",5)  ;marshal fee | 
|---|
| 144 | ;  compute total | 
|---|
| 145 | S RCEVENT=0 | 
|---|
| 146 | F %="PB","IN","AD","MF","CC" S RCEVENT=RCEVENT+RCEVENT(%) | 
|---|
| 147 | Q | 
|---|