X-Git-Url: http://git.freeside.biz/gitweb/?p=freeside.git;a=blobdiff_plain;f=FS%2FFS%2Fcust_main%2FBilling.pm;h=eb5bd0ba0a95c9380a4108fcf6b349d20910beff;hp=20986b0c8e96ae3e33c701639d79448b96ecf225;hb=d492bb51af64fc85678cd73e8dfe6dd2cdcf8748;hpb=6fd2fa88c4376e5382cb8bc55248f35b08f4f9e6 diff --git a/FS/FS/cust_main/Billing.pm b/FS/FS/cust_main/Billing.pm index 20986b0c8..eb5bd0ba0 100644 --- a/FS/FS/cust_main/Billing.pm +++ b/FS/FS/cust_main/Billing.pm @@ -7,6 +7,7 @@ use Data::Dumper; use List::Util qw( min ); use FS::UID qw( dbh ); use FS::Record qw( qsearch qsearchs dbdef ); +use FS::Misc::DateTime qw( day_end ); use FS::cust_bill; use FS::cust_bill_pkg; use FS::cust_bill_pkg_display; @@ -20,7 +21,6 @@ use FS::cust_bill_pkg_tax_rate_location; use FS::part_event; use FS::part_event_condition; use FS::pkg_category; -use POSIX; # 1 is mostly method/subroutine entry and options # 2 traces progress of some operations @@ -113,7 +113,7 @@ sub bill_and_collect { my $job = $options{'job'}; $job->update_statustext('0,cleaning expired packages') if $job; - $error = $self->cancel_expired_pkgs( $self->day_end( $options{actual_time} ) ); + $error = $self->cancel_expired_pkgs( day_end( $options{actual_time} ) ); if ( $error ) { $error = "Error expiring custnum ". $self->custnum. ": $error"; if ( $options{fatal} && $options{fatal} eq 'return' ) { return $error; } @@ -121,7 +121,7 @@ sub bill_and_collect { else { warn $error; } } - $error = $self->suspend_adjourned_pkgs( $self->day_end( $options{actual_time} ) ); + $error = $self->suspend_adjourned_pkgs( day_end( $options{actual_time} ) ); if ( $error ) { $error = "Error adjourning custnum ". $self->custnum. ": $error"; if ( $options{fatal} && $options{fatal} eq 'return' ) { return $error; } @@ -165,19 +165,6 @@ sub bill_and_collect { } -sub day_end { - # XXX: sometimes "incorrect" if crossing DST boundaries? - - my $self = shift; - my $time = shift; - - return $time unless $conf->exists('next-bill-ignore-time'); - - my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = - localtime($time); - mktime(59,59,23,$mday,$mon,$year,$wday,$yday,$isdst); -} - sub cancel_expired_pkgs { my ( $self, $time, %options ) = @_; @@ -266,7 +253,8 @@ charges, etc. =item freq_override If set, then override the normal frequency and look for a part_pkg_discount -to take at that frequency. +to take at that frequency. This will exclude any packages that aren't billed +on a monthly cycle. =item time @@ -859,13 +847,18 @@ sub _make_lines { my $time = $params{'time'} or die "no time specified"; my (%options) = %{$params{options}}; + if ( $part_pkg->freq ne '1' and ($options{'freq_override'} || 0) > 0 ) { + # this should never happen + die 'freq_override billing attempted on non-monthly package '. + $cust_pkg->pkgnum; + } + my $dbh = dbh; my $real_pkgpart = $params{real_pkgpart}; my %hash = $cust_pkg->hash; my $old_cust_pkg = new FS::cust_pkg \%hash; my @details = (); - my @discounts = (); my $lineitems = 0; $cust_pkg->pkgpart($part_pkg->pkgpart); @@ -876,13 +869,14 @@ sub _make_lines { my $setup = 0; my $unitsetup = 0; - my %setup_param = (); + my @setup_discounts = (); + my %setup_param = ( 'discounts' => \@setup_discounts ); if ( ! $options{recurring_only} and ! $options{cancel} and ( $options{'resetup'} || ( ! $cust_pkg->setup && ( ! $cust_pkg->start_date - || $cust_pkg->start_date <= $self->day_end($time) + || $cust_pkg->start_date <= day_end($time) ) && ( ! $conf->exists('disable_setup_suspended_pkgs') || ( $conf->exists('disable_setup_suspended_pkgs') && @@ -923,11 +917,12 @@ sub _make_lines { #XXX unit stuff here too my $recur = 0; my $unitrecur = 0; + my @recur_discounts = (); my $sdate; if ( ! $cust_pkg->start_date and ( ! $cust_pkg->susp || $part_pkg->option('suspend_bill', 1) ) and - ( $part_pkg->freq ne '0' && ( $cust_pkg->bill || 0 ) <= $self->day_end($time) ) + ( $part_pkg->freq ne '0' && ( $cust_pkg->bill || 0 ) <= day_end($time) ) || ( $part_pkg->plan eq 'voip_cdr' && $part_pkg->option('bill_every_call') ) @@ -951,16 +946,16 @@ sub _make_lines { #over two params! lets at least switch to a hashref for the rest... my $increment_next_bill = ( $part_pkg->freq ne '0' - && ( $cust_pkg->getfield('bill') || 0 ) <= $self->day_end($time) + && ( $cust_pkg->getfield('bill') || 0 ) <= day_end($time) && !$options{cancel} ); - my %param = ( 'precommit_hooks' => $precommit_hooks, + my %param = ( %setup_param, + 'precommit_hooks' => $precommit_hooks, 'increment_next_bill' => $increment_next_bill, - 'discounts' => \@discounts, + 'discounts' => \@recur_discounts, 'real_pkgpart' => $real_pkgpart, 'freq_override' => $options{freq_override} || '', 'setup_fee' => 0, - %setup_param, ); my $method = $options{cancel} ? 'calc_cancel' : 'calc_recur'; @@ -1046,8 +1041,10 @@ sub _make_lines { return "negative recur $recur for pkgnum ". $cust_pkg->pkgnum; } - my $discount_show_always = ($recur == 0 && scalar(@discounts) - && $conf->exists('discount-show-always')); + my $discount_show_always = $conf->exists('discount-show-always') + && ( ($setup == 0 && scalar(@setup_discounts)) + || ($recur == 0 && scalar(@recur_discounts)) + ); if ( $setup != 0 || $recur != 0 @@ -1076,7 +1073,7 @@ sub _make_lines { 'unitrecur' => $unitrecur, 'quantity' => $cust_pkg->quantity, 'details' => \@details, - 'discounts' => \@discounts, + 'discounts' => [ @setup_discounts, @recur_discounts ], 'hidden' => $part_pkg->hidden, 'freq' => $part_pkg->freq, };