$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;
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;