X-Git-Url: http://git.freeside.biz/gitweb/?a=blobdiff_plain;f=FS%2FFS%2Fcust_bill.pm;h=c30ee144be4236a57b6830b9f4c619e311f1de4b;hb=ea4a250ff6d0ed40f10fb66c64a095e83ee7bd5d;hp=cf339a8c714f324780d4e7c1fa6d2cf6a8a1fc54;hpb=62bfeae993beb7f98d50d319360f1fece128982b;p=freeside.git diff --git a/FS/FS/cust_bill.pm b/FS/FS/cust_bill.pm index cf339a8c7..c30ee144b 100644 --- a/FS/FS/cust_bill.pm +++ b/FS/FS/cust_bill.pm @@ -37,7 +37,7 @@ use FS::payby; @ISA = qw( FS::cust_main_Mixin FS::Record ); -$DEBUG = 1; +$DEBUG = 0; $me = '[FS::cust_bill]'; #ask FS::UID to run this stuff for us later @@ -2465,21 +2465,36 @@ sub print_generic { 'subtotal' => $taxtotal, # adjusted below 'summarized' => $summarypage ? 'Y' : '', }; + my $tax_weight = _pkg_category($tax_section->{description}) + ? _pkg_category($tax_section->{description})->weight + : 0; + $tax_section->{'summarized'} = $summarypage && !$tax_weight ? 'Y' : ''; + $tax_section->{'sort_weight'} = $tax_weight; + my $adjusttotal = 0; my $adjust_section = { 'description' => 'Credits, Payments, and Adjustments', 'subtotal' => 0, # adjusted below 'summarized' => $summarypage ? 'Y' : '', }; + my $adjust_weight = _pkg_category($adjust_section->{description}) + ? _pkg_category($adjust_section->{description})->weight + : 0; + $adjust_section->{'summarized'} = $summarypage && !$adjust_weight ? 'Y' : ''; + $adjust_section->{'sort_weight'} = $adjust_weight; my $unsquelched = $params{unsquelch_cdr} || $cust_main->squelch_cdr ne 'Y'; my $multisection = $conf->exists('invoice_sections', $cust_main->agentnum); my $late_sections = []; + my $extra_sections = []; + my $extra_lines = (); if ( $multisection ) { - my ($extra_sections, $extra_lines) = + ($extra_sections, $extra_lines) = $self->_items_extra_usage_sections($escape_function, $format) if $conf->exists('usage_class_as_a_section', $cust_main->agentnum); + push @$extra_sections, $adjust_section if $adjust_section->{sort_weight}; + push @detail_items, @$extra_lines if $extra_lines; push @sections, $self->_items_sections( $late_sections, # this could stand a refactor @@ -2564,6 +2579,8 @@ sub print_generic { $options{'format_function'} = sub { () } unless $unsquelched; $options{'unsquelched'} = $unsquelched; $options{'summary_page'} = $summarypage; + $options{'skip_usage'} = + scalar(@$extra_sections) && !grep{$section == $_} @$extra_sections; foreach my $line_item ( $self->_items_pkg(%options) ) { my $detail = { @@ -2684,8 +2701,13 @@ sub print_generic { ) ); if ( $multisection ) { - $adjust_section->{'pretotal'} = 'New charges total '. $other_money_char. - sprintf('%.2f', $self->charged ); + if ( $adjust_section->{'sort_weight'} ) { + $adjust_section->{'posttotal'} = 'Balance Forward '. $other_money_char. + sprintf("%.2f", ($self->billing_balance || 0) ); + } else { + $adjust_section->{'pretotal'} = 'New charges total '. $other_money_char. + sprintf('%.2f', $self->charged ); + } }else{ push @total_items, $total; } @@ -2768,7 +2790,8 @@ sub print_generic { if ( $multisection ) { $adjust_section->{'subtotal'} = $other_money_char. sprintf('%.2f', $adjusttotal); - push @sections, $adjust_section; + push @sections, $adjust_section + unless $adjust_section->{sort_weight}; } { @@ -2782,7 +2805,7 @@ sub print_generic { : $self->owed + $pr_total ) ); - if ( $multisection ) { + if ( $multisection && !$adjust_section->{sort_weight} ) { $adjust_section->{'posttotal'} = $total->{'total_item'}. ' '. $total->{'total_amount'}; }else{ @@ -2795,6 +2818,18 @@ sub print_generic { } if ( $multisection ) { + if ($conf->exists('svc_phone_sections')) { + my $total; + $total->{'total_item'} = &$embolden_function($self->balance_due_msg); + $total->{'total_amount'} = + &$embolden_function( + $other_money_char. sprintf('%.2f', $self->owed + $pr_total) + ); + my $last_section = pop @sections; + $last_section->{'posttotal'} = $total->{'total_item'}. ' '. + $total->{'total_amount'}; + push @sections, $last_section; + } push @sections, @$late_sections if $unsquelched; } @@ -3176,7 +3211,8 @@ sub _items_sections { } if ($type && $type eq 'U') { - $late_subtotal{$section} += $usage; + $late_subtotal{$section} += $usage + unless scalar(@$extra_sections); } } else { @@ -3199,7 +3235,8 @@ sub _items_sections { } if ($type && $type eq 'U') { - $subtotal{$section} += $usage; + $subtotal{$section} += $usage + unless scalar(@$extra_sections); } } @@ -3213,8 +3250,11 @@ sub _items_sections { push @$late, map { { 'description' => &{$escape}($_), 'subtotal' => $late_subtotal{$_}, 'post_total' => 1, - 'sort_weight' => _pkg_category($_)->weight, - (_pkg_category($_)->condense + 'sort_weight' => ( _pkg_category($_) + ? _pkg_category($_)->weight + : 0 + ), + ((_pkg_category($_) && _pkg_category($_)->condense) ? $self->_condense_section($format) : () ), @@ -3233,8 +3273,11 @@ sub _items_sections { 'subtotal' => $subtotal{$_}, 'summarized' => $not_tax{$_} ? '' : 'Y', 'tax_section' => $not_tax{$_} ? '' : 'Y', - 'sort_weight' => _pkg_category($_)->weight, - (_pkg_category($_)->condense + 'sort_weight' => ( _pkg_category($_) + ? _pkg_category($_)->weight + : 0 + ), + ((_pkg_category($_) && _pkg_category($_)->condense) ? $self->_condense_section($format) : () ), @@ -3685,10 +3728,10 @@ sub _items_svc_phone_sections { my %sectionmap = (); my $simple = new FS::usage_class { format => 'simple' }; #bleh - my $minimal = new FS::usage_class { format => 'minimal' }; #bleh + my $usage_simple = new FS::usage_class { format => 'usage_simple' }; #bleh foreach ( keys %sections ) { my $summary = $sections{$_}{sort_weight} < 0 ? 1 : 0; - my $usage_class = $summary ? $simple : $minimal; + my $usage_class = $summary ? $simple : $usage_simple; my $ending = $summary ? ' usage charges' : ''; $sectionmap{$_} = { 'description' => &{$escape}($_. $ending), 'amount' => $sections{$_}{amount}, #subtotal @@ -3698,6 +3741,7 @@ sub _items_svc_phone_sections { 'tax_section' => '', 'phonenum' => $sections{$_}{phonenum}, 'sort_weight' => $sections{$_}{sort_weight}, + 'post_total' => $summary, #inspire pagebreak ( ( map { $_ => $usage_class->$_($format) } qw( description_generator @@ -3837,11 +3881,13 @@ sub _items_cust_bill_pkg { foreach my $cust_bill_pkg ( @$cust_bill_pkg ) { - foreach ( $s, $r, $u ) { + foreach ( $s, $r, ($opt{skip_usage} ? () : $u ) ) { if ( $_ && !$cust_bill_pkg->hidden ) { $_->{amount} = sprintf( "%.2f", $_->{amount} ), + $_->{amount} =~ s/^\-0\.00$/0.00/; $_->{unit_amount} = sprintf( "%.2f", $_->{unit_amount} ), - push @b, { %$_ }; + push @b, { %$_ } + unless $_->{amount} == 0; $_ = undef; } } @@ -4007,11 +4053,13 @@ sub _items_cust_bill_pkg { } - foreach ( $s, $r, $u ) { - if ( $_ ) { + foreach ( $s, $r, ($opt{skip_usage} ? () : $u ) ) { + if ( $_ ) { $_->{amount} = sprintf( "%.2f", $_->{amount} ), + $_->{amount} =~ s/^\-0\.00$/0.00/; $_->{unit_amount} = sprintf( "%.2f", $_->{unit_amount} ), - push @b, { %$_ }; + push @b, { %$_ } + unless $_->{amount} == 0; } } @@ -4175,7 +4223,7 @@ sub re_X { my $distinct = ''; my $orderby = 'ORDER BY cust_bill._date'; - my $extra_sql = ' WHERE '. FS::cust_bill->search_sql(\%param); + my $extra_sql = ' WHERE '. FS::cust_bill->search_sql_where(\%param); my $addl_from = 'LEFT JOIN cust_main USING ( custnum )'; @@ -4265,7 +4313,7 @@ sub credited_sql { WHERE cust_bill.invnum = cust_credit_bill.invnum )"; } -=item search_sql HASHREF +=item search_sql_where HASHREF Class method which returns an SQL WHERE fragment to search for parameters specified in HASHREF. Valid parameters are @@ -4308,10 +4356,10 @@ Note: validates all passed-in data; i.e. safe to use with unchecked CGI params. =cut -sub search_sql { +sub search_sql_where { my($class, $param) = @_; if ( $DEBUG ) { - warn "$me search_sql called with params: \n". + warn "$me search_sql_where called with params: \n". join("\n", map { " $_: ". $param->{$_} } keys %$param ). "\n"; }