From: Jeff Godin Date: Thu, 8 Dec 2011 17:49:36 +0000 (-0500) Subject: "find outstanding bills for circ" gets its own sub X-Git-Url: https://old-git.evergreen-ils.org/?a=commitdiff_plain;h=a1596d2107031ed81d3ba6ac82e6f8223848c91b;p=evergreen%2Ftadl.git "find outstanding bills for circ" gets its own sub outstanding_bills_for_circ accepts an editor and a circ object, and will return a reference to an array of outstanding billing objects. this has been broken out of the forgive_overdues sub, as it will be useful elsewhere. --- diff --git a/Open-ILS/src/perlmods/lib/OpenILS/Application/Circ/CircCommon.pm b/Open-ILS/src/perlmods/lib/OpenILS/Application/Circ/CircCommon.pm index 64a23059d0..579b43d66e 100644 --- a/Open-ILS/src/perlmods/lib/OpenILS/Application/Circ/CircCommon.pm +++ b/Open-ILS/src/perlmods/lib/OpenILS/Application/Circ/CircCommon.pm @@ -30,45 +30,9 @@ sub forgive_overdues { $logger->info("attempting to forgive overdues on circ " . $circ->id . " with note " . $note); - # find all unvoided bills in order - my $bill_search = [ - { xact => $circ->id, voided=>'f' }, - { order_by => { mb => { billing_ts => { direction => 'asc' } } } }, - ]; - - # find all unvoided payments in order - my $payment_search = [ - { xact => $circ->id, voided=>'f' }, - { order_by => { mp => { payment_ts => { direction => 'asc' } } } }, - ]; - - my $bills = $e->search_money_billing($bill_search); - - my $payments = $e->search_money_payment($payment_search); - - # "Pay" the bills, removing fully paid bills and - # adjusting the amount for partially paid bills - map { - my $payment = $_; - my $paybal = $payment->amount; - - while ($paybal > 0) { - # get next billing - my $bill = shift @{$bills}; - my $newbal = (($paybal*100) - ($bill->amount*100))/100; - if ($newbal < 0) { - $newbal = 0; - my $new_bill_amount = (($bill->amount*100) - ($paybal*100))/100; - $bill->amount($new_bill_amount); - unshift(@{$bills}, $bill); # put the partially-paid bill back on top of the stack - } - - $paybal = $newbal; - - } - - } @$payments; - + # get outstanding bills for the circ in question + my $bills = outstanding_bills_for_circ($e, $circ); + # Sum any outstanding overdue billings, stopping at the first non-overdue billing my $outstanding_overdues = 0; @@ -199,4 +163,56 @@ sub create_bill { return undef; } +# ----------------------------------------------------------------- +# Given an editor and a circ, return a reference to an array of +# billing objects which are outstanding (unpaid, not voided). +# If a bill is partially paid, change the amount of the bill +# to reflect the unpaid amount, not the original amount. +# ----------------------------------------------------------------- +sub outstanding_bills_for_circ { + my ($class, $e, $circ) = @_; + + # find all unvoided bills in order + my $bill_search = [ + { xact => $circ->id, voided=>'f' }, + { order_by => { mb => { billing_ts => { direction => 'asc' } } } }, + ]; + + # find all unvoided payments in order + my $payment_search = [ + { xact => $circ->id, voided=>'f' }, + { order_by => { mp => { payment_ts => { direction => 'asc' } } } }, + ]; + + my $bills = $e->search_money_billing($bill_search); + + my $payments = $e->search_money_payment($payment_search); + + # "Pay" the bills, removing fully paid bills and + # adjusting the amount for partially paid bills + map { + my $payment = $_; + my $paybal = $payment->amount; + + while ($paybal > 0) { + # get next billing + my $bill = shift @{$bills}; + my $newbal = (($paybal*100) - ($bill->amount*100))/100; + if ($newbal < 0) { + $newbal = 0; + my $new_bill_amount = (($bill->amount*100) - ($paybal*100))/100; + $bill->amount($new_bill_amount); + unshift(@{$bills}, $bill); # put the partially-paid bill back on top of the stack + } + + $paybal = $newbal; + + } + + } @$payments; + + return $bills; + +} + 1;