X-Git-Url: http://git.freeside.biz/gitweb/?a=blobdiff_plain;f=FS%2FFS%2Fpart_pkg%2Fflat.pm;h=0bc3860a322a56028f2eaf453b3975bd2f338327;hb=babcdb7e84d1d9ee1537b47e16c4e182f426f07b;hp=504def0cf9bf58ab19e3e0badaca3238ad96337c;hpb=6eec422e339e7a7209cac18da71ba598ee18d7d2;p=freeside.git diff --git a/FS/FS/part_pkg/flat.pm b/FS/FS/part_pkg/flat.pm index 504def0cf..0bc3860a3 100644 --- a/FS/FS/part_pkg/flat.pm +++ b/FS/FS/part_pkg/flat.pm @@ -15,6 +15,7 @@ use Tie::IxHash; use List::Util qw( min ); use FS::UI::bytecount; use FS::Conf; +use Time::Local 'timelocal'; #ask FS::UID to run this stuff for us later FS::UID->install_callback( sub { @@ -117,22 +118,27 @@ sub calc_setup { return 0 if $self->prorate_setup($cust_pkg, $sdate); - my $i = 0; - my $count = $self->option( 'additional_count', 'quiet' ) || 0; - while ($i < $count) { - push @$details, $self->option( 'additional_info' . $i++ ); - } + if (!$cust_pkg->waive_setup) { + my $i = 0; + my $count = $self->option( 'additional_count', 'quiet' ) || 0; + while ($i < $count) { + push @$details, $self->option( 'additional_info' . $i++ ); + } - my $charge = $self->base_setup($cust_pkg, $sdate, $details); + my $charge = $self->base_setup($cust_pkg, $sdate, $details); - my $discount = 0; - if ( $charge > 0 ) { + my $discount = 0; + if ( $charge > 0 ) { $param->{'setup_charge'} = $charge; $discount = $self->calc_discount($cust_pkg, $sdate, $details, $param); delete $param->{'setup_charge'}; + } + + return sprintf( '%.2f', ($cust_pkg->quantity || 1) * ($charge - $discount) ); } - sprintf( '%.2f', ($cust_pkg->quantity || 1) * ($charge - $discount) ); + return; + } sub base_setup { @@ -182,13 +188,27 @@ sub cutoff_day { if ( $self->option('sync_bill_date',1) ) { my $next_bill = $cust_pkg->cust_main->next_bill_date; if ( $next_bill ) { - # careful here. if the prorate calculation is going to round to - # the nearest day, this needs to always return the same result - if ( $self->option('prorate_round_day', 1) ) { - my $hour = (localtime($next_bill))[2]; - $next_bill += 64800 if $hour >= 12; - } return (localtime($next_bill))[3]; + } else { + # This is the customer's only active package and hasn't been billed + # yet, so set the cutoff day to either today or tomorrow, whichever + # would result in a full period after rounding. + my $setup = $cust_pkg->setup; # because it's "now" + my $rounding_mode = $self->option('prorate_round_day',1); + return () if !$setup or !$rounding_mode; + my ($sec, $min, $hour, $mday, $mon, $year) = localtime($setup); + + if ( ( $rounding_mode == 1 and $hour >= 12 ) + or ( $rounding_mode == 3 and ( $sec > 0 or $min > 0 or $hour > 0 )) + ) { + # then the prorate period will be rounded down to start from + # midnight tomorrow, so the cutoff day should be the current day + + # 1. + $setup = timelocal(59,59,23,$mday,$mon,$year) + 1; + $mday = (localtime($setup))[3]; + } + # otherwise, it will be rounded up, so leave the cutoff day at today. + return $mday; } } return ();