X-Git-Url: http://git.freeside.biz/gitweb/?p=freeside.git;a=blobdiff_plain;f=FS%2FFS%2Fpart_pkg%2Fflat.pm;h=cfee58465b3032f58cc2f0953d93f9cd651176ec;hp=f23717bc5649bb43e9f86d85d80450d27d487d6e;hb=d263897b2b9247340901f93c57f44c7f85d87d37;hpb=8f56a7435988ef9952c2b3f1f08450c63961becb diff --git a/FS/FS/part_pkg/flat.pm b/FS/FS/part_pkg/flat.pm index f23717bc5..cfee58465 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 { @@ -127,12 +128,13 @@ sub calc_setup { my $discount = 0; if ( $charge > 0 ) { - $param->{'setup_charge'} = $charge; - $discount = $self->calc_discount($cust_pkg, $sdate, $details, $param); - delete $param->{'setup_charge'}; + $param->{'setup_charge'} = $charge; + $discount = $self->calc_discount($cust_pkg, $sdate, $details, $param); + delete $param->{'setup_charge'}; } sprintf( '%.2f', ($cust_pkg->quantity || 1) * ($charge - $discount) ); + } sub base_setup { @@ -173,16 +175,36 @@ sub calc_recur { sub cutoff_day { my $self = shift; my $cust_pkg = shift; + my $cust_main = $cust_pkg->cust_main; + # force it to act like a prorate package, is what this means + # because we made a distinction once between prorate and flat packages + if ( $cust_main->force_prorate_day and $cust_main->prorate_day ) { + return ( $cust_main->prorate_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 (); @@ -225,6 +247,8 @@ sub calc_cancel { } } +# no longer used; see credit_remaining in FS::cust_pkg + sub calc_remain { my ($self, $cust_pkg, %options) = @_; @@ -235,8 +259,6 @@ sub calc_remain { $time = time; } - my $sources = $options{'cust_credit_source_bill_pkg'}; - my $next_bill = $cust_pkg->getfield('bill') || 0; return 0 if ! $self->base_recur($cust_pkg, \$time) @@ -272,30 +294,17 @@ sub calc_remain { $amount = $amount * ($edate - $time) / ($edate - $cust_bill_pkg->sdate); } - # calculate tax adjustment. we're not doing full credit_lineitems here - # (e.g. not applying the credit to the past billing of this package) - # so just include the adjustment in the source record with the rest - # of the credit - my %tax_adjust = FS::cust_credit->calculate_tax_adjustment( - 'custnum' => $cust_pkg->custnum, - 'billpkgnums' => [ $cust_bill_pkg->billpkgnum ], - 'setuprecurs' => [ 'recur' ], - 'amounts' => [ $amount ], - ); - $amount += $tax_adjust{taxtotal}; - - $amount = sprintf('%.2f', $amount); # ensure that amounts add up right $credit += $amount; - if ( $sources ) { - push @$sources, - FS::cust_credit_source_bill_pkg->new( { - 'billpkgnum' => $cust_bill_pkg->billpkgnum, - 'amount' => $amount, - 'currency' => $cust_bill_pkg->cust_bill->currency, - } ); - } - } # foreach $cust_bill_pkg + push @{ $options{'cust_credit_source_bill_pkg'} }, + new FS::cust_credit_source_bill_pkg { + 'billpkgnum' => $cust_bill_pkg->billpkgnum, + 'amount' => sprintf('%.2f', $amount), + 'currency' => $cust_bill_pkg->cust_bill->currency, + } + if $options{'cust_credit_source_bill_pkg'}; + + } sprintf('%.2f', $credit);