[freeside-commits] freeside/FS/FS/part_pkg flat.pm,1.70,1.71
Mark Wells
mark at wavetail.420.am
Tue Feb 7 18:18:06 PST 2012
Update of /home/cvs/cvsroot/freeside/FS/FS/part_pkg
In directory wavetail.420.am:/tmp/cvs-serv9754/FS/FS/part_pkg
Modified Files:
flat.pm
Log Message:
correct unused-time credits for discounted packages, #16352
Index: flat.pm
===================================================================
RCS file: /home/cvs/cvsroot/freeside/FS/FS/part_pkg/flat.pm,v
retrieving revision 1.70
retrieving revision 1.71
diff -u -w -d -r1.70 -r1.71
--- flat.pm 24 Jan 2012 22:25:13 -0000 1.70
+++ flat.pm 8 Feb 2012 02:17:58 -0000 1.71
@@ -6,6 +6,7 @@
use strict;
use vars qw( %info %usage_recharge_fields @usage_recharge_fieldorder );
+use FS::Record qw( qsearch );
use Tie::IxHash;
use List::Util qw( min );
use FS::UI::bytecount;
@@ -189,6 +190,22 @@
sprintf('%.2f', $self->base_recur($cust_pkg) / $self->freq );
}
+sub calc_cancel {
+ my $self = shift;
+ my $conf = new FS::Conf;
+ if ( $self->recur_temporality eq 'preceding'
+ and $self->option('bill_recur_on_cancel', 1) ) {
+ # run another recurring cycle
+ return $self->calc_recur(@_);
+ }
+ elsif ( $conf->exists('bill_usage_on_cancel') # should be a package option?
+ and $self->can('calc_usage') ) {
+ # bill for outstanding usage
+ return $self->calc_usage(@_);
+ }
+ 0;
+}
+
sub calc_remain {
my ($self, $cust_pkg, %options) = @_;
@@ -205,19 +222,28 @@
|| ! $next_bill
|| $next_bill < $time;
- my %sec = (
- 'h' => 3600, # 60 * 60
- 'd' => 86400, # 60 * 60 * 24
- 'w' => 604800, # 60 * 60 * 24 * 7
- 'm' => 2629744, # 60 * 60 * 24 * 365.2422 / 12
- );
-
- $self->freq =~ /^(\d+)([hdwm]?)$/
- or die 'unparsable frequency: '. $self->freq;
- my $freq_sec = $1 * $sec{$2||'m'};
- return 0 unless $freq_sec;
-
- sprintf("%.2f", $self->base_recur($cust_pkg, \$time) * ( $next_bill - $time ) / $freq_sec );
+ # Use actual charge for this period, not base_recur (for discounts).
+ # Use sdate < $time and edate >= $time because when billing on
+ # cancellation, edate = $time.
+ my $credit = 0;
+ foreach my $item (
+ qsearch('cust_bill_pkg', {
+ pkgnum => $cust_pkg->pkgnum,
+ sdate => {op => '<' , value => $time},
+ edate => {op => '>=', value => $time},
+ recur => {op => '>' , value => 0},
+ })
+ ) {
+ # hack to deal with the weird behavior of edate on package cancellation
+ my $edate = $item->edate;
+ if ( $self->recur_temporality eq 'preceding' ) {
+ $edate = $self->add_freq($item->sdate);
+ }
+ $credit += ($item->recur - $item->usage) *
+ ($edate - $time) / ($edate - $item->sdate);
+ }
+ sprintf('%.2f', $credit);
+ #sprintf("%.2f", $self->base_recur($cust_pkg, \$time) * ( $next_bill - $time ) / $freq_sec );
}
More information about the freeside-commits
mailing list