X-Git-Url: http://git.freeside.biz/gitweb/?a=blobdiff_plain;f=FS%2FFS%2FTemplate_Mixin.pm;h=db3885443e131d2cb2cb29183916034e9810f4fd;hb=b5d22578f60ba105934c92c031799671bf6c0f29;hp=b5dbd343acf6a43eb16fd65c11e09d9c66fc7d69;hpb=55753aaf5b1189c06a99fe5e0791fc33316df06f;p=freeside.git diff --git a/FS/FS/Template_Mixin.pm b/FS/FS/Template_Mixin.pm index b5dbd343a..db3885443 100644 --- a/FS/FS/Template_Mixin.pm +++ b/FS/FS/Template_Mixin.pm @@ -763,19 +763,6 @@ sub print_generic { warn "$me generating sections\n" if $DEBUG > 1; - # Previous Charges section - # subtotal is the first return value from $self->previous - my $previous_section = { 'description' => $self->mt('Previous Charges'), - 'subtotal' => $other_money_char. - sprintf('%.2f', $pr_total), - 'summarized' => '', #why? $summarypage ? 'Y' : '', - }; - $previous_section->{posttotal} = '0 / 30 / 60 / 90 days overdue '. - join(' / ', map { $cust_main->balance_date_range(@$_) } - $self->_prior_month30s - ) - if $conf->exists('invoice_include_aging'); - my $taxtotal = 0; my $tax_section = { 'description' => $self->mt('Taxes, Surcharges, and Fees'), 'subtotal' => $taxtotal, # adjusted below @@ -786,7 +773,6 @@ sub print_generic { $tax_section->{'summarized'} = ''; #why? $summarypage && !$tax_weight ? 'Y' : ''; $tax_section->{'sort_weight'} = $tax_weight; - my $adjusttotal = 0; my $adjust_section = { 'description' => $self->mt('Credits, Payments, and Adjustments'), @@ -807,11 +793,38 @@ sub print_generic { my $extra_sections = []; my $extra_lines = (); + # default section ('Charges') my $default_section = { 'description' => '', 'subtotal' => '', 'no_subtotal' => 1, }; + # Previous Charges section + # subtotal is the first return value from $self->previous + my $previous_section; + # if the invoice has major sections, or if we're summarizing previous + # charges with a single line, or if we've been specifically told to put them + # in a section, create a section for previous charges: + if ( $multisection or + $conf->exists('previous_balance-summary_only') or + $conf->exists('previous_balance-section') ) { + + $previous_section = { 'description' => $self->mt('Previous Charges'), + 'subtotal' => $other_money_char. + sprintf('%.2f', $pr_total), + 'summarized' => '', #why? $summarypage ? 'Y' : '', + }; + $previous_section->{posttotal} = '0 / 30 / 60 / 90 days overdue '. + join(' / ', map { $cust_main->balance_date_range(@$_) } + $self->_prior_month30s + ) + if $conf->exists('invoice_include_aging'); + + } else { + # otherwise put them in the main section + $previous_section = $default_section; + } + if ( $multisection ) { ($extra_sections, $extra_lines) = $self->_items_extra_usage_sections($escape_function_nonbsp, $format) @@ -864,24 +877,29 @@ sub print_generic { # make a default section push @sections, $default_section; # and calculate the finance charge total, since it won't get done otherwise. - # XXX possibly other totals? + # and the default section total # XXX possibly finance_pkgclass should not be used in this manner? - if ( $conf->exists('finance_pkgclass') ) { - my @finance_charges; - foreach my $cust_bill_pkg ( $self->cust_bill_pkg ) { - if ( grep { $_->section eq $invoice_data{finance_section} } - $cust_bill_pkg->cust_bill_pkg_display ) { - # I think these are always setup fees, but just to be sure... - push @finance_charges, $cust_bill_pkg->recur + $cust_bill_pkg->setup; - } + my @finance_charges; + my @charges; + foreach my $cust_bill_pkg ( $self->cust_bill_pkg ) { + if ( $invoice_data{finance_section} and + grep { $_->section eq $invoice_data{finance_section} } + $cust_bill_pkg->cust_bill_pkg_display ) { + # I think these are always setup fees, but just to be sure... + push @finance_charges, $cust_bill_pkg->recur + $cust_bill_pkg->setup; + } else { + push @charges, $cust_bill_pkg->recur + $cust_bill_pkg->setup; } - $invoice_data{finance_amount} = - sprintf('%.2f', sum( @finance_charges ) || 0); } + $invoice_data{finance_amount} = + sprintf('%.2f', sum( @finance_charges ) || 0); + $default_section->{subtotal} = $other_money_char. + sprintf('%.2f', sum( @charges ) || 0); } # previous invoice balances in the Previous Charges section if there # is one, otherwise in the main detail section + # (except if summary_only is enabled, don't show them at all) if ( $self->can('_items_previous') && $self->enable_previous && ! $conf->exists('previous_balance-summary_only') ) { @@ -892,22 +910,18 @@ sub print_generic { foreach my $line_item ( $self->_items_previous ) { my $detail = { - ext_description => [], + ref => $line_item->{'pkgnum'}, + pkgpart => $line_item->{'pkgpart'}, + quantity => 1, + section => $previous_section, # which might be $default_section + description => &$escape_function($line_item->{'description'}), + ext_description => [ map { &$escape_function($_) } + @{ $line_item->{'ext_description'} || [] } + ], + amount => ( $old_latex ? '' : $money_char). + $line_item->{'amount'}, + product_code => $line_item->{'pkgpart'} || 'N/A', }; - $detail->{'ref'} = $line_item->{'pkgnum'}; - $detail->{'pkgpart'} = $line_item->{'pkgpart'}; - $detail->{'quantity'} = 1; - $detail->{'section'} = $multisection ? $previous_section - : $default_section; - $detail->{'description'} = &$escape_function($line_item->{'description'}); - if ( exists $line_item->{'ext_description'} ) { - @{$detail->{'ext_description'}} = map { - &$escape_function($_); - } @{$line_item->{'ext_description'}}; - } - $detail->{'amount'} = ( $old_latex ? '' : $money_char). - $line_item->{'amount'}; - $detail->{'product_code'} = $line_item->{'pkgpart'} || 'N/A'; push @detail_items, $detail; push @buf, [ $detail->{'description'}, @@ -1034,12 +1048,9 @@ sub print_generic { $invoice_data{current_less_finance} = sprintf('%.2f', $self->charged - $invoice_data{finance_amount} ); - # create a major section for previous balance if we have major sections, - # or if previous_section is in summary form - if ( ( $multisection && $self->enable_previous ) - || $conf->exists('previous_balance-summary_only') ) - { - unshift @sections, $previous_section if $pr_total; + # if there's anything in the Previous Charges section, prepend it to the list + if ( $pr_total and $previous_section ne $default_section ) { + unshift @sections, $previous_section; } warn "$me adding taxes\n" @@ -1327,6 +1338,25 @@ sub print_generic { } } @discounts_avail; } + my @summary_subtotals; + # the templates say "$_->{tax_section} || !$_->{summarized}" + # except 'summarized' is only true when tax_section is true, so this + # is always true, so what's the deal? + foreach my $s (@sections) { + # not to include in the "summary of new charges" block: + # finance charges, adjustments, previous charges, + # and itemized phone usage sections + if ( $s eq $adjust_section or + ($s eq $previous_section and $s ne $default_section) or + ($invoice_data{'finance_section'} and + $invoice_data{'finance_section'} eq $s->{description}) or + $s->{'description'} =~ /^\d+ $/ ) { + next; + } + push @summary_subtotals, $s; + } + $invoice_data{summary_subtotals} = \@summary_subtotals; + # debugging hook: call this with 'diag' => 1 to just get a hash of # the invoice variables return \%invoice_data if ( $params{'diag'} ); @@ -2512,8 +2542,10 @@ sub _items_cust_bill_pkg { if $DEBUG > 1; my $is_summary = $display->summary; - my $description = ($is_summary && $type && $type eq 'U') - ? "Usage charges" : $desc; + my $description = $desc; + if ( $type eq 'U' and ($is_summary or $cust_bill_pkg->hidden) ) { + $description = $self->mt('Usage charges'); + } my $part_pkg = $cust_pkg->part_pkg; @@ -2571,7 +2603,7 @@ sub _items_cust_bill_pkg { if $DEBUG > 1; my @svc_labels = map &{$escape_function}($_), - $cust_pkg->h_labels_short($self->_date, undef, 'I'); + $cust_pkg->h_labels_short(@dates, 'I'); push @d, @svc_labels unless $cust_bill_pkg->pkgpart_override; #don't redisplay services $svc_label = $svc_labels[0]; @@ -2671,11 +2703,15 @@ sub _items_cust_bill_pkg { warn "$me _items_cust_bill_pkg adding usage\n" if $DEBUG > 1; - if ( $cust_bill_pkg->hidden ) { + if ( $cust_bill_pkg->hidden and defined($u) ) { + # if this is a hidden package and there's already a usage + # line for the bundle, add this package's total amount and + # usage details to it $u->{amount} += $amount; $u->{unit_amount} += $unit_amount, push @{ $u->{ext_description} }, @d; - } else { + } elsif ( $amount ) { + # create a new usage line $u = { description => $description, pkgpart => $pkgpart, @@ -2687,7 +2723,7 @@ sub _items_cust_bill_pkg { %item_dates, ext_description => \@d, }; - } + } # else this has no usage, so don't create a usage section } } # recurring or usage with recurring charge