X-Git-Url: http://git.freeside.biz/gitweb/?a=blobdiff_plain;f=FS%2FFS%2Fcust_main%2FBilling.pm;h=aeb0c51d5b9b4e7fe43ee2a495c5a235072c7cd8;hb=9a42cc876677b9be8e55dce93d66f92e81d1416b;hp=4b727bb7c53bb8973cccbe035b43f7d79ea42003;hpb=aa93abfbe3967fdc6b6c01636c02b8340d261c40;p=freeside.git diff --git a/FS/FS/cust_main/Billing.pm b/FS/FS/cust_main/Billing.pm index 4b727bb7c..aeb0c51d5 100644 --- a/FS/FS/cust_main/Billing.pm +++ b/FS/FS/cust_main/Billing.pm @@ -547,7 +547,7 @@ sub bill { #create the new invoice my $cust_bill = new FS::cust_bill ( { 'custnum' => $self->custnum, - '_date' => ( $invoice_time ), + '_date' => $invoice_time, 'charged' => $charged, 'billing_balance' => $balance, 'previous_balance' => $previous_balance, @@ -584,17 +584,23 @@ sub _omit_zero_value_bundles { my @cust_bill_pkg = (); my @cust_bill_pkg_bundle = (); my $sum = 0; + my $discount_show_always = 0; foreach my $cust_bill_pkg ( @_ ) { + $discount_show_always = ($cust_bill_pkg->get('discounts') + && scalar(@{$cust_bill_pkg->get('discounts')}) + && $conf->exists('discount-show-always')); if (scalar(@cust_bill_pkg_bundle) && !$cust_bill_pkg->pkgpart_override) { - push @cust_bill_pkg, @cust_bill_pkg_bundle if $sum > 0; + push @cust_bill_pkg, @cust_bill_pkg_bundle + if ($sum > 0 || ($sum == 0 && $discount_show_always)); @cust_bill_pkg_bundle = (); $sum = 0; } $sum += $cust_bill_pkg->setup + $cust_bill_pkg->recur; push @cust_bill_pkg_bundle, $cust_bill_pkg; } - push @cust_bill_pkg, @cust_bill_pkg_bundle if $sum > 0; + push @cust_bill_pkg, @cust_bill_pkg_bundle + if ($sum > 0 || ($sum == 0 && $discount_show_always)); (@cust_bill_pkg); @@ -891,6 +897,7 @@ sub _make_lines { 'discounts' => \@discounts, 'real_pkgpart' => $real_pkgpart, 'freq_override' => $options{freq_override} || '', + 'setup_fee' => 0, ); my $method = $options{cancel} ? 'calc_cancel' : 'calc_recur'; @@ -920,6 +927,14 @@ sub _make_lines { } + if ( $param{'setup_fee'} ) { + # Add an additional setup fee at the billing stage. + # Used for prorate_defer_bill. + $setup += $param{'setup_fee'}; + $unitsetup += $param{'setup_fee'}; + $lineitems++; + } + } warn "\$setup is undefined" unless defined($setup); @@ -940,6 +955,7 @@ sub _make_lines { if $DEBUG >1; my $error = $cust_pkg->replace( $old_cust_pkg, + 'depend_jobnum'=>$options{depend_jobnum}, 'options' => { $cust_pkg->options }, ) unless $options{no_commit}; @@ -956,9 +972,13 @@ 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')); + if ( $setup != 0 || $recur != 0 || - !$part_pkg->hidden && $options{has_hidden} ) #include some $0 lines + (!$part_pkg->hidden && $options{has_hidden}) || #include some $0 lines + $discount_show_always ) { warn " charges (setup=$setup, recur=$recur); adding line items\n" @@ -1004,9 +1024,11 @@ sub _make_lines { # handle taxes ### - my $error = - $self->_handle_taxes($part_pkg, $taxlisthash, $cust_bill_pkg, $cust_pkg, $options{invoice_time}, $real_pkgpart, \%options); - return $error if $error; + unless ( $discount_show_always ) { + my $error = + $self->_handle_taxes($part_pkg, $taxlisthash, $cust_bill_pkg, $cust_pkg, $options{invoice_time}, $real_pkgpart, \%options); + return $error if $error; + } push @$cust_bill_pkgs, $cust_bill_pkg; @@ -2080,6 +2102,26 @@ sub apply_payments { =back +=head1 FLOW + + bill_and_collect + + cancel_expired_pkgs + suspend_adjourned_pkgs + + bill + (do_cust_event pre-bill) + _make_lines + _handle_taxes + (vendor-only) _gather_taxes + _omit_zero_value_bundles + calculate_taxes + + apply_payments_and_credits + collect + do_cust_event + due_cust_event + =head1 BUGS =head1 SEE ALSO