if ( $cust_bill_pkg->pkgnum ) {
($pkg, $setup, $recur, $sdate, $edate) = (
- $cust_bill_pkg->cust_pkg->part_pkg->pkg,
+ $cust_bill_pkg->part_pkg->pkg,
( $cust_bill_pkg->setup != 0
? sprintf("%.2f", $cust_bill_pkg->setup )
: '' ),
$cust_main->agentnum. ")";
my $agent = $agent_obj->agent;
my $pkgs = join(', ',
- map { $_->cust_pkg->part_pkg->pkg }
+ map { $_->part_pkg->pkg }
grep { $_->pkgnum } $self->cust_bill_pkg
);
$description = eval qq("$dtempl");
);
my $escape_function = $escape_functions{$format};
- my %date_formats = ( 'latex' => '%b, %o, %Y',
+ my %date_formats = ( 'latex' => '%b %o, %Y',
'html' => '%b %o, %Y',
'template' => '%s',
);
);
} elsif ( grep /\S/, $conf->config('company_address') ) {
- $returnaddress = join( "\n", $conf->config('company_address') );
-
- $returnaddress =
- join( '\\*'."\n", map s/( {2,})/'~' x length($1)/eg,
- $conf->config('company_address')
- )
- if $format eq 'latex';
+ my $convert_map = $convert_maps{$format}{'returnaddress'};
+ $returnaddress = join( "\n", &$convert_map(
+ map { s/( {2,})/'~' x length($1)/eg;
+ s/$/\\\\\*/;
+ $_
+ }
+ ( $conf->config('company_name'),
+ $conf->config('company_address'),
+ )
+ )
+ );
} else {
push @sections, { 'description' => '', 'subtotal' => '' };
}
- foreach my $line_item ( $self->_items_previous ) {
+ foreach my $line_item ( $conf->exists('disable_previous_balance')
+ ? ()
+ : $self->_items_previous
+ )
+ {
my $detail = {
ext_description => [],
};
];
}
- if (@pr_cust_bill) {
+ if ( @pr_cust_bill && !$conf->exists('disable_previous_balance') ) {
push @buf, ['','-----------'];
push @buf, [ 'Total Previous Balance',
$money_char. sprintf("%10.2f", $pr_total) ];
my %options = ();
$options{'section'} = $section if $multisection;
+ $options{'format'} = $format;
foreach my $line_item ( $self->_items_pkg(%options) ) {
my $detail = {
$detail->{'section'} = $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->{'ext_description'}} = @{$line_item->{'ext_description'}};
}
{
my $money = $old_latex ? '' : $money_char;
}
- if ( $multisection ) {
+ if ( $multisection && !$conf->exists('disable_previous_balance') ) {
unshift @sections, $previous_section;
}
}
push @buf,['','-----------'];
- push @buf,['Total New Charges',
+ push @buf,[( $conf->exists('disable_previous_balance')
+ ? 'Total Charges'
+ : 'Total New Charges'
+ ),
$money_char. sprintf("%10.2f",$self->charged) ];
push @buf,['',''];
my $total = {};
$total->{'total_item'} = &$embolden_function('Total');
$total->{'total_amount'} =
- $total->{'total_amount'} =
&$embolden_function(
- $other_money_char. sprintf('%.2f', $self->charged + $pr_total )
+ $other_money_char.
+ sprintf( '%.2f',
+ $self->charged + ( $conf->exists('disable_previous_balance')
+ ? 0
+ : $pr_total
+ )
+ )
);
push @total_items, $total;
push @buf,['','-----------'];
push @buf,['Total Charges',
- $money_char. sprintf("%10.2f",$self->charged + $pr_total) ];
+ $money_char.
+ sprintf( '%10.2f', $self->charged +
+ ( $conf->exists('disable_previous_balance')
+ ? 0
+ : $pr_total
+ )
+ )
+ ];
push @buf,['',''];
}
-
- #foreach my $thing ( sort { $a->_date <=> $b->_date } $self->_items_credits, $self->_items_payments
+ unless ( $conf->exists('disable_previous_balance') ) {
+ #foreach my $thing ( sort { $a->_date <=> $b->_date } $self->_items_credits, $self->_items_payments
- # credits
- foreach my $credit ( $self->_items_credits ) {
- my $total;
- $total->{'total_item'} = &$escape_function($credit->{'description'});
- #$credittotal
- $total->{'total_amount'} = '-'. $other_money_char. $credit->{'amount'};
- push @total_items, $total;
- }
+ # credits
+ foreach my $credit ( $self->_items_credits ) {
+ my $total;
+ $total->{'total_item'} = &$escape_function($credit->{'description'});
+ #$credittotal
+ $total->{'total_amount'} = '-'. $other_money_char. $credit->{'amount'};
+ push @total_items, $total;
+ }
- # credits (again)
- foreach ( $self->cust_credited ) {
-
- #something more elaborate if $_->amount ne $_->cust_credit->credited ?
-
- my $reason = substr($_->cust_credit->reason,0,32);
- $reason .= '...' if length($reason) < length($_->cust_credit->reason);
- $reason = " ($reason) " if $reason;
- push @buf,[
- "Credit #". $_->crednum. " (". time2str("%x",$_->cust_credit->_date) .")". $reason,
- $money_char. sprintf("%10.2f",$_->amount)
- ];
- }
+ # credits (again)
+ foreach ( $self->cust_credited ) {
+
+ #something more elaborate if $_->amount ne $_->cust_credit->credited ?
+
+ my $reason = substr($_->cust_credit->reason,0,32);
+ $reason .= '...' if length($reason) < length($_->cust_credit->reason);
+ $reason = " ($reason) " if $reason;
+ push @buf,[
+ "Credit #". $_->crednum. " (". time2str("%x",$_->cust_credit->_date) .")". $reason,
+ $money_char. sprintf("%10.2f",$_->amount)
+ ];
+ }
- # payments
- foreach my $payment ( $self->_items_payments ) {
- my $total = {};
- $total->{'total_item'} = &$escape_function($payment->{'description'});
- #$paymenttotal
- $total->{'total_amount'} = '-'. $other_money_char. $payment->{'amount'};
- push @total_items, $total;
- push @buf, [ $payment->{'description'},
- $money_char. sprintf("%10.2f", $payment->{'amount'}),
- ];
- }
+ # payments
+ foreach my $payment ( $self->_items_payments ) {
+ my $total = {};
+ $total->{'total_item'} = &$escape_function($payment->{'description'});
+ #$paymenttotal
+ $total->{'total_amount'} = '-'. $other_money_char. $payment->{'amount'};
+ push @total_items, $total;
+ push @buf, [ $payment->{'description'},
+ $money_char. sprintf("%10.2f", $payment->{'amount'}),
+ ];
+ }
- {
- 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 )
- );
- push @total_items, $total;
- push @buf,['','-----------'];
- push @buf,[$self->balance_due_msg, $money_char.
- sprintf("%10.2f", $balance_due ) ];
+ {
+ 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 )
+ );
+ push @total_items, $total;
+ push @buf,['','-----------'];
+ push @buf,[$self->balance_due_msg, $money_char.
+ sprintf("%10.2f", $balance_due ) ];
+ }
}
$invoice_data{'logo_file'} = $params{'logo_file'}
if ( $cust_bill_pkg->pkgnum > 0 ) {
- my $desc = $cust_bill_pkg->cust_pkg->part_pkg->classname;
+ my $desc = $cust_bill_pkg->part_pkg->classname;
$s{$desc} += $cust_bill_pkg->setup
if ( $cust_bill_pkg->setup != 0 );
my @cust_bill_pkg =
grep { $_->pkgnum &&
( defined($section)
- ? $_->cust_pkg->part_pkg->classname eq $section->{'description'}
+ ? $_->part_pkg->classname eq $section->{'description'}
: 1
)
} $self->cust_bill_pkg;
$self->_items_cust_bill_pkg(\@cust_bill_pkg, %options);
}
+sub _taxsort {
+ return 0 unless $a cmp $b;
+ return -1 if $b eq 'Tax';
+ return 1 if $a eq 'Tax';
+ return -1 if $b eq 'Other surcharges';
+ return 1 if $a eq 'Other surcharges';
+ $a cmp $b;
+}
+
sub _items_tax {
my $self = shift;
- my @cust_bill_pkg = grep { ! $_->pkgnum } $self->cust_bill_pkg;
+ my @cust_bill_pkg = sort _taxsort grep { ! $_->pkgnum } $self->cust_bill_pkg;
$self->_items_cust_bill_pkg(\@cust_bill_pkg, @_);
}
sub _items_cust_bill_pkg {
my $self = shift;
my $cust_bill_pkg = shift;
+ my %opt = @_;
+ my $format = $opt{format} || '';
+ my $escape_function = $opt{escape_function} || sub { shift };
my @b = ();
foreach my $cust_bill_pkg ( @$cust_bill_pkg ) {
+ my $cust_pkg = $cust_bill_pkg->cust_pkg;
+
my $desc = $cust_bill_pkg->desc;
if ( $cust_bill_pkg->pkgnum > 0 ) {
if ( $cust_bill_pkg->setup != 0 ) {
my $description = $desc;
$description .= ' Setup' if $cust_bill_pkg->recur != 0;
- my @d = $cust_bill_pkg->cust_pkg->h_labels_short($self->_date);
- push @d, $cust_bill_pkg->details if $cust_bill_pkg->recur == 0;
+ my @d = $cust_pkg->h_labels_short($self->_date);
+ push @d, $cust_bill_pkg->details( 'format' => $format,
+ 'escape_function' => $escape_function,
+ )
+ if $cust_bill_pkg->recur == 0;
push @b, {
description => $description,
#pkgpart => $part_pkg->pkgpart,
pkgnum => $cust_bill_pkg->pkgnum,
amount => sprintf("%.2f", $cust_bill_pkg->recur),
ext_description =>
- [ $cust_bill_pkg->cust_pkg->h_labels_short( $cust_bill_pkg->edate,
- $cust_bill_pkg->sdate),
- $cust_bill_pkg->details,
+ #at least until cust_bill_pkg has "past" ranges in addition to
+ #the "future" sdate/edate ones... see #3032
+ [ $cust_pkg->h_labels_short( $self->_date ),
+ #$cust_bill_pkg->edate,
+ #$cust_bill_pkg->sdate),
+ $cust_bill_pkg->details( 'format' => $format,
+ 'escape_function' => $escape_function),
],
};
}