);
my $embolden_function = $embolden_functions{$format};
+ my %newline_tokens = ( 'latex' => '\\\\',
+ 'html' => '<br>',
+ 'template' => "\n",
+ );
+ my $newline_token = $newline_tokens{$format};
+
warn "$me generating template variables\n"
if $DEBUG > 1;
my $max_edate = 0;
foreach my $cust_bill_pkg ( $self->cust_bill_pkg ) {
next unless $cust_bill_pkg->pkgnum > 0;
- $min_sdate = $cust_bill_pkg->sdate if $cust_bill_pkg->sdate < $min_sdate;
- $max_edate = $cust_bill_pkg->edate if $cust_bill_pkg->edate > $max_edate;
+ $min_sdate = $cust_bill_pkg->sdate
+ if length($cust_bill_pkg->sdate) && $cust_bill_pkg->sdate < $min_sdate;
+ $max_edate = $cust_bill_pkg->edate
+ if length($cust_bill_pkg->edate) && $cust_bill_pkg->edate > $max_edate;
}
$invoice_data{'bill_period'} = '';
sprintf('%.2f', $pr_total),
'summarized' => $summarypage ? 'Y' : '',
};
- $previous_section->{posttotal} = '0 / 30 / 60/ 90 days overdue '.
+ $previous_section->{posttotal} = '0 / 30 / 60 / 90 days overdue '.
join(' / ', map { $cust_main->balance_date_range(@$_) }
$self->_prior_month30s
)
push @buf,[$self->balance_due_msg, $money_char.
sprintf("%10.2f", $balance_due ) ];
}
+
+ if ( $conf->exists('previous_balance-show_credit')
+ and $cust_main->balance < 0 ) {
+ my $credit_total = {
+ 'total_item' => &$embolden_function($self->credit_balance_msg),
+ 'total_amount' => &$embolden_function(
+ $other_money_char. sprintf('%.2f', -$cust_main->balance)
+ ),
+ };
+ if ( $multisection ) {
+ $adjust_section->{'posttotal'} .= $newline_token .
+ $credit_total->{'total_item'} . ' ' . $credit_total->{'total_amount'};
+ }
+ else {
+ push @total_items, $credit_total;
+ }
+ push @buf,['','-----------'];
+ push @buf,[$self->credit_balance_msg, $money_char.
+ sprintf("%10.2f", -$cust_main->balance ) ];
+ }
}
if ( $multisection ) {
$duedate;
}
+sub credit_balance_msg { 'Credit Balance Remaining' }
+
=item invnum_date_pretty
Returns a string with the invoice number and date, for example:
# this only works with Latex
my @newlines;
my @newsections;
+
+ # after this, we'll have only two sections per DID:
+ # Calls Summary and Calls Detail
foreach my $section ( @sections ) {
if($section->{'post_total'}) {
$section->{'description'} = 'Calls Summary: '.$section->{'phonenum'};
push @newsections, \%calls_detail;
}
}
+
+ # after this, each usage class is collapsed/summarized into a single
+ # line under the Calls Summary section
foreach my $newsection ( @newsections ) {
- if($newsection->{'post_total'}) {
+ if($newsection->{'post_total'}) { # this means Calls Summary
foreach my $section ( @sections ) {
next unless ($section->{'phonenum'} eq $newsection->{'phonenum'}
&& !$section->{'post_total'});
section => $newsection,
duration => $section->{'duration'},
description => $newdesc,
- amount => $section->{'amount'},
+ amount => sprintf("%.2f",$section->{'amount'}),
product_code => 'N/A',
};
push @newlines, $line;
}
}
}
+
+ # after this, Calls Details is populated with all CDRs
foreach my $newsection ( @newsections ) {
- if(!$newsection->{'post_total'}) {
+ if(!$newsection->{'post_total'}) { # this means Calls Details
foreach my $line ( @lines ) {
next unless (scalar(@{$line->{'ext_description'}}) &&
$line->{'section'}->{'phonenum'} eq $newsection->{'phonenum'}
);
my @extdesc = @{$line->{'ext_description'}};
- my $extdesc = $extdesc[0];
- $extdesc =~ s/scriptsize/normalsize/g if $format eq 'latex';
- $line->{'ext_description'} = [ $extdesc ];
+ my @newextdesc;
+ foreach my $extdesc ( @extdesc ) {
+ $extdesc =~ s/scriptsize/normalsize/g if $format eq 'latex';
+ push @newextdesc, $extdesc;
+ }
+ $line->{'ext_description'} = \@newextdesc;
$line->{'section'} = $newsection;
push @newlines, $line;
}
}
}
+
return(\@newsections, \@newlines);
}
}
- warn "$me _items_cust_bill_pkg adding details\n"
- if $DEBUG > 1;
+ unless ( $is_summary ) {
+ warn "$me _items_cust_bill_pkg adding details\n"
+ if $DEBUG > 1;
- push @d, $cust_bill_pkg->details(%details_opt)
- unless ($is_summary || $type && $type eq 'R');
+ #instead of omitting details entirely in this case (unwanted side
+ # effects), just omit CDRs
+ $details_opt{'format_function'} = sub { () }
+ if $type && $type eq 'R';
+
+ push @d, $cust_bill_pkg->details(%details_opt);
+ }
warn "$me _items_cust_bill_pkg calculating amount\n"
if $DEBUG > 1;
my $amount = 0;
if (!$type) {
$amount = $cust_bill_pkg->recur;
- }elsif($type eq 'R') {
+ } elsif ($type eq 'R') {
$amount = $cust_bill_pkg->recur - $cust_bill_pkg->usage;
- }elsif($type eq 'U') {
+ } elsif ($type eq 'U') {
$amount = $cust_bill_pkg->usage;
}