@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
'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
$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 = {
)
);
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;
}
if ( $multisection ) {
$adjust_section->{'subtotal'} = $other_money_char.
sprintf('%.2f', $adjusttotal);
- push @sections, $adjust_section;
+ push @sections, $adjust_section
+ unless $adjust_section->{sort_weight};
}
{
: $self->owed + $pr_total
)
);
- if ( $multisection ) {
+ if ( $multisection && !$adjust_section->{sort_weight} ) {
$adjust_section->{'posttotal'} = $total->{'total_item'}. ' '.
$total->{'total_amount'};
}else{
}
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;
}
}
if ($type && $type eq 'U') {
- $late_subtotal{$section} += $usage;
+ $late_subtotal{$section} += $usage
+ unless scalar(@$extra_sections);
}
} else {
}
if ($type && $type eq 'U') {
- $subtotal{$section} += $usage;
+ $subtotal{$section} += $usage
+ unless scalar(@$extra_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)
: ()
),
'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)
: ()
),
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
'tax_section' => '',
'phonenum' => $sections{$_}{phonenum},
'sort_weight' => $sections{$_}{sort_weight},
+ 'post_total' => $summary, #inspire pagebreak
(
( map { $_ => $usage_class->$_($format) }
qw( description_generator
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;
}
}
}
- 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;
}
}
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 )';
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
=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";
}