if ($recur) {
$recur -= $cust_bill_pkg->credited('', '', setuprecur => 'recur') || 0;
}
+ # Skip line items that have been completely credited.
+ next if ($setup + $recur) == 0;
my $setup_ratio = $setup / ($setup + $recur);
- # Calculate the fraction of tax to credit: it's the fraction of this charge
- # (either setup or recur) that's being credited.
+ # Calculate the fraction of tax to credit: it's the fraction of this
+ # charge (either setup or recur) that's being credited.
my $charged = ($setuprecur eq 'setup') ? $setup : $recur;
next if $charged == 0; # shouldn't happen, but still...
my $invnum = $cust_bill_pkg->invnum;
$need_to_unapply -= $cust_bill_pkg->owed($setuprecur);
- next if $need_to_unapply < 0.005;
+ return if $need_to_unapply < 0.005;
my $error;
# then unapply payments one at a time (partially if need be) until the
# the cancellation date (can happen with advance billing). in that
# case, use the entire recurring charge:
my $amount = $cust_bill_pkg->recur - $cust_bill_pkg->usage;
+ my $max_credit = $amount
+ - $cust_bill_pkg->credited('', '', setuprecur => 'recur') || 0;
# but if the cancellation happens during the interval, prorate it:
# (XXX obey prorate_round_day here?)
($edate - $time) / ($edate - $cust_bill_pkg->sdate);
}
+ # if there are existing credits, don't let the sum of credits exceed
+ # the recurring charge
+ $amount = $max_credit if $amount > $max_credit;
+
$amount = sprintf('%.2f', $amount);
- push @billpkgnums, $cust_bill_pkg->billpkgnum;
- push @amounts, $amount;
- push @setuprecurs, 'recur';
+ # if no time has been used and/or there are existing line item
+ # credits, we may end up not needing to credit anything.
+ if ( $amount > 0 ) {
- warn "Crediting for $amount on package ".$remain_pkg->pkgnum."\n"
- if $DEBUG;
+ push @billpkgnums, $cust_bill_pkg->billpkgnum;
+ push @amounts, $amount;
+ push @setuprecurs, 'recur';
+
+ warn "Crediting for $amount on package ".$remain_pkg->pkgnum."\n"
+ if $DEBUG;
+ }
}