From 4750e6fc0698c5ad18f75b405a588e2e48c7bca6 Mon Sep 17 00:00:00 2001 From: Jeff Godin Date: Thu, 8 Dec 2011 12:49:36 -0500 Subject: [PATCH] "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. Conflicts: Open-ILS/src/perlmods/lib/OpenILS/Application/Circ/CircCommon.pm Signed-off-by: Jason Stephenson --- .../lib/OpenILS/Application/Circ/CircCommon.pm | 92 +++++++++++++--------- 1 file changed, 54 insertions(+), 38 deletions(-) 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 5f266adc23..f7e5b0b88c 100644 --- a/Open-ILS/src/perlmods/lib/OpenILS/Application/Circ/CircCommon.pm +++ b/Open-ILS/src/perlmods/lib/OpenILS/Application/Circ/CircCommon.pm @@ -30,44 +30,8 @@ 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 @@ -332,4 +296,56 @@ sub can_close_circ { return $can_close; } +# ----------------------------------------------------------------- +# 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; -- 2.11.0