X-Git-Url: http://git.freeside.biz/gitweb/?a=blobdiff_plain;f=FS%2FFS%2Fpart_pkg%2Fprorate_Mixin.pm;h=63b63d760480f5f7c4fbf0f99771709d5d6fd166;hb=74a0da5d0fed1d8d27056a299d79c16ad42aafcb;hp=75dbe5cf8fa9db6e08e8018bbe3ba70cbf8d5638;hpb=90dfd05877a331fb13ba50389e3d8a3105465bc7;p=freeside.git diff --git a/FS/FS/part_pkg/prorate_Mixin.pm b/FS/FS/part_pkg/prorate_Mixin.pm index 75dbe5cf8..63b63d760 100644 --- a/FS/FS/part_pkg/prorate_Mixin.pm +++ b/FS/FS/part_pkg/prorate_Mixin.pm @@ -1,10 +1,9 @@ package FS::part_pkg::prorate_Mixin; use strict; -use vars qw(@ISA %info); -use Time::Local qw(timelocal); +use vars qw( %info ); +use Time::Local qw( timelocal ); -@ISA = qw(FS::part_pkg); %info = ( 'disabled' => 1, # define all fields that are referenced in this code @@ -76,38 +75,47 @@ sub calc_prorate { my $charge = $self->base_recur($cust_pkg, $sdate) || 0; - my $mnow = $$sdate; - - # if this is the first bill but the bill date has been set - # (by prorate_defer_bill), calculate from the setup date, - # and append the setup fee to @$details. - if ( $self->option('prorate_defer_bill',1) - and ! $cust_pkg->getfield('last_bill') - and $cust_pkg->setup ) { - #warn "[calc_prorate] #".$cust_pkg->pkgnum.": running deferred setup\n"; - $param->{'setup_fee'} = $self->calc_setup($cust_pkg, $$sdate, $details); - $mnow = $cust_pkg->setup; - } + my $add_period = $self->option('add_full_period',1); + + my $mnow = $$sdate; + + # if this is the first bill but the bill date has been set + # (by prorate_defer_bill), calculate from the setup date, + # append the setup fee to @$details, and make sure to bill for + # a full period after the bill date. + if ( $self->option('prorate_defer_bill',1) + && ! $cust_pkg->getfield('last_bill') + && $cust_pkg->setup + ) + { + #warn "[calc_prorate] #".$cust_pkg->pkgnum.": running deferred setup\n"; + $param->{'setup_fee'} = $self->calc_setup($cust_pkg, $$sdate, $details); + $mnow = $cust_pkg->setup; + $add_period = 1; + } - my ($mend, $mstart); - ($mnow, $mend, $mstart) = $self->_endpoints($mnow, $cutoff_day); + my ($mend, $mstart); + ($mnow, $mend, $mstart) = $self->_endpoints($mnow, $cutoff_day); - # next bill date will be figured as $$sdate + one period - $$sdate = $mstart; + # next bill date will be figured as $$sdate + one period + $$sdate = $mstart; - my $permonth = $charge / $self->freq; - my $months = ( ( $self->freq - 1 ) + ($mend-$mnow) / ($mend-$mstart) ); + my $permonth = $charge / $self->freq; + my $months = ( ( $self->freq - 1 ) + ($mend-$mnow) / ($mend-$mstart) ); - # add a full period if currently billing for a partial period - if ( ( $self->option('add_full_period',1) - or $self->option('prorate_defer_bill',1) ) # necessary - and $months < $self->freq ) { - $months += $self->freq; - $$sdate = $self->add_freq($mstart); - } + # add a full period if currently billing for a partial period + # or periods up to freq_override if billing for an override interval + if ( ($param->{'freq_override'} || 0) > 1 ) { + $months += $param->{'freq_override'} - 1; + } + elsif ( $add_period && $months < $self->freq) { + $months += $self->freq; + $$sdate = $self->add_freq($mstart); + } - $param->{'months'} = $months; - $charge = sprintf('%.2f', $permonth * $months); + $param->{'months'} = $months; + #so 1.005 rounds to 1.01 + $charge = sprintf('%.2f', $permonth * $months + 0.00000001 ); return $charge; } @@ -128,10 +136,12 @@ sub prorate_setup { and $cutoff_day ) { my ($mnow, $mend, $mstart) = $self->_endpoints($sdate, $cutoff_day); - # if today is the cutoff day, set the next bill to right now instead - # of waiting a month. + # If today is the cutoff day, set the next bill and setup both to + # midnight today, so that the customer will be billed normally for a + # month starting today. if ( $mnow - $mstart < 86400 ) { - $cust_pkg->bill($mnow); + $cust_pkg->setup($mstart); + $cust_pkg->bill($mstart); } else { $cust_pkg->bill($mend);