# 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;
+ }
}
'date' => time,
'reasonnum' => $reason->reasonnum,
'apply' => 1,
+ 'set_source' => 1,
);
'';
"cust_pkg.cancel IS NOT NULL AND cust_pkg.cancel != 0";
}
+=item ncancelled_recurring_sql
+
+Returns an SQL expression identifying un-cancelled, recurring packages.
+
+=cut
+
+sub ncancelled_recurring_sql {
+ $_[0]->recurring_sql().
+ " AND ( cust_pkg.cancel IS NULL OR cust_pkg.cancel = 0 ) ";
+}
+
=item status_sql
Returns an SQL expression to give the package status as a string.