freeside/FS/FS cust_bill.pm,1.112,1.113
ivan
ivan at pouncequick.420.am
Fri May 13 03:54:05 PDT 2005
Update of /home/cvs/cvsroot/freeside/FS/FS
In directory pouncequick:/tmp/cvs-serv13314
Modified Files:
cust_bill.pm
Log Message:
substitute a non-breaking space if there is no invoice_latexreturnaddress file
Index: cust_bill.pm
===================================================================
RCS file: /home/cvs/cvsroot/freeside/FS/FS/cust_bill.pm,v
retrieving revision 1.112
retrieving revision 1.113
diff -u -d -r1.112 -r1.113
--- cust_bill.pm 4 May 2005 01:06:18 -0000 1.112
+++ cust_bill.pm 13 May 2005 10:54:02 -0000 1.113
@@ -7,6 +7,7 @@
use Text::Template 1.20;
use File::Temp 0.14;
use String::ShellQuote;
+use HTML::Entities;
use FS::UID qw( datasrc );
use FS::Record qw( qsearch qsearchs );
use FS::Misc qw( send_email send_fax );
@@ -1083,7 +1084,6 @@
my( $self, $today, $template ) = @_;
$today ||= time;
-# my $invnum = $self->invnum;
my $cust_main = $self->cust_main;
$cust_main->payname( $cust_main->first. ' '. $cust_main->getfield('last') )
unless $cust_main->payname && $cust_main->payby !~ /^(CHEK|DCHK)$/;
@@ -1093,10 +1093,6 @@
#my $balance_due = $self->owed + $pr_total - $cr_total;
my $balance_due = $self->owed + $pr_total;
- #my @collect = ();
- #my($description,$amount);
- @buf = ();
-
#create the template
$template ||= $self->_agent_template;
my $templatefile = 'invoice_latex';
@@ -1123,6 +1119,16 @@
or die 'While compiling ' . $templatefile . ': ' . $Text::Template::ERROR;
}
+ my $returnaddress;
+ if ( $conf->exists('invoice_latexreturnaddress')
+ && length($conf->exists('invoice_latexreturnaddress'))
+ )
+ {
+ $returnaddress = join("\n", $conf->config('invoice_latexreturnaddress') );
+ } else {
+ $returnaddress = '~';
+ }
+
my %invoice_data = (
'invnum' => $self->invnum,
'date' => time2str('%b %o, %Y', $self->_date),
@@ -1137,7 +1143,7 @@
'country' => _latex_escape($cust_main->country),
'footer' => join("\n", $conf->config('invoice_latexfooter') ),
'smallfooter' => join("\n", $conf->config('invoice_latexsmallfooter') ),
- 'returnaddress' => join("\n", $conf->config('invoice_latexreturnaddress') ),
+ 'returnaddress' => $returnaddress,
'quantity' => 1,
'terms' => $conf->config('invoice_default_terms') || 'Payable upon receipt',
#'notes' => join("\n", $conf->config('invoice_latexnotes') ),
@@ -1207,12 +1213,13 @@
my $taxtotal = 0;
foreach my $tax ( $self->_items_tax ) {
$invoice_data{'total_item'} = _latex_escape($tax->{'description'});
- $taxtotal += ( $invoice_data{'total_amount'} = $tax->{'amount'} );
+ $taxtotal += $tax->{'amount'};
+ $invoice_data{'total_amount'} = '\dollar '. $tax->{'amount'};
push @total_fill,
map { my $b=$_; $b =~ s/\$(\w+)/$invoice_data{$1}/eg; $b }
@total_item;
}
-
+
if ( $taxtotal ) {
$invoice_data{'total_item'} = 'Sub-total';
$invoice_data{'total_amount'} =
@@ -1305,7 +1312,8 @@
foreach my $tax ( $self->_items_tax ) {
my $total = {};
$total->{'total_item'} = _latex_escape($tax->{'description'});
- $taxtotal += ( $invoice_data{'total_amount'} = $tax->{'amount'} );
+ $taxtotal += $tax->{'amount'};
+ $total->{'total_amount'} = '\dollar '. $tax->{'amount'};
push @total_items, $total;
}
@@ -1476,6 +1484,232 @@
}
+=item print_html [ TIME [ , TEMPLATE ] ]
+
+Returns an HTML invoice, as a scalar.
+
+TIME an optional value used to control the printing of overdue messages. The
+default is now. It isn't the date of the invoice; that's the `_date' field.
+It is specified as a UNIX timestamp; see L<perlfunc/"time">. Also see
+L<Time::Local> and L<Date::Parse> for conversion functions.
+
+=cut
+
+#sub print_html {
+# my $self = shift;
+#
+# my $file = $self->print_latex(@_);
+#
+# my $dir = $FS::UID::conf_dir. "cache.". $FS::UID::datasrc;
+# chdir($dir);
+#
+# my $sfile = shell_quote $file;
+#
+# system("htlatex $sfile.tex") == 0
+# or die "hlatex $file.tex failed; is hlatex installed, or see $file.log for details?\n";
+# #system("ltoh $sfile.tex") == 0
+# # or die "ltoh $file.tex failed; is hlatex installed, or see $file.log for details?\n";
+#
+# open(HTML, "<$file.html")
+# or die "can't open $file.html: $! (error in LaTeX template?)\n";
+#
+# #unlink("$file.dvi", "$file.log", "$file.aux", "$file.html", "$file.tex");
+#
+# my $html = '';
+# while (<HTML>) {
+#
+# s/<link\s+rel="stylesheet"\s+type="text\/css"\s+href="invoice\.(\d+)\.(\w+)\.css">/<link rel="stylesheet" type="text\/css" href="cust_bill.html?$1.$2.css">/;
+## s/<link\s+//;
+# $html .= $_;
+# }
+#
+# close HTML;
+#
+# return $html;
+#
+#}
+#
+##inefficient proof-of-concept for now
+#sub print_html_css {
+# my $self = shift;
+#
+# my $file = $self->print_latex(@_);
+#
+# my $dir = $FS::UID::conf_dir. "cache.". $FS::UID::datasrc;
+# chdir($dir);
+#
+# my $sfile = shell_quote $file;
+#
+# system("htlatex $sfile.tex") == 0
+# or die "hlatex $file.tex failed; is hlatex installed, or see $file.log for details?\n";
+# #system("ltoh $sfile.tex") == 0
+# # or die "ltoh $file.tex failed; is hlatex installed, or see $file.log for details?\n";
+#
+# open(CSS, "<$file.css")
+# or die "can't open $file.html: $! (error in LaTeX template?)\n";
+#
+# unlink("$file.dvi", "$file.log", "$file.aux", "$file.html", "$file.tex");
+#
+# my $css = '';
+# while (<CSS>) {
+# $css .= $_;
+# }
+#
+# close CSS;
+#
+# return $css;
+#
+#}
+
+sub print_html {
+ my( $self, $today, $template ) = @_;
+ $today ||= time;
+
+ my $cust_main = $self->cust_main;
+ $cust_main->payname( $cust_main->first. ' '. $cust_main->getfield('last') )
+ unless $cust_main->payname && $cust_main->payby !~ /^(CHEK|DCHK)$/;
+
+ $template ||= $self->_agent_template;
+ my $templatefile = 'invoice_html';
+ my $suffix = length($template) ? "_$template" : '';
+ $templatefile .= $suffix;
+ my @html_template = map "$_\n", $conf->config($templatefile)
+ or die "cannot load config file $templatefile";
+
+ my $html_template = new Text::Template(
+ TYPE => 'ARRAY',
+ SOURCE => \@html_template,
+ DELIMITERS => [ '<%=', '%>' ],
+ );
+
+ $html_template->compile()
+ or die 'While compiling ' . $templatefile . ': ' . $Text::Template::ERROR;
+
+ my $returnaddress = $conf->exists('invoice_htmlreturnaddress')
+ ? join("\n", $conf->config('invoice_htmlreturnaddress') )
+ : join("\n", map { s/~/ /g; s/\\\\\*?\s*$/<BR>/; }
+ $conf->config('invoice_latexreturnaddress')
+ );
+ warn $conf->config('invoice_latexreturnaddress');
+ warn $returnaddress;
+
+ my %invoice_data = (
+ 'invnum' => $self->invnum,
+ 'date' => time2str('%b %o, %Y', $self->_date),
+ 'agent' => encode_entities($cust_main->agent->agent),
+ 'payname' => encode_entities($cust_main->payname),
+ 'company' => encode_entities($cust_main->company),
+ 'address1' => encode_entities($cust_main->address1),
+ 'address2' => encode_entities($cust_main->address2),
+ 'city' => encode_entities($cust_main->city),
+ 'state' => encode_entities($cust_main->state),
+ 'zip' => encode_entities($cust_main->zip),
+ 'country' => encode_entities($cust_main->country),
+# 'footer' => join("\n", $conf->config('invoice_latexfooter') ),
+# 'smallfooter' => join("\n", $conf->config('invoice_latexsmallfooter') ),
+ 'returnaddress' => $returnaddress,
+ 'terms' => $conf->config('invoice_default_terms')
+ || 'Payable upon receipt',
+ #'notes' => join("\n", $conf->config('invoice_latexnotes') ),
+# 'conf_dir' => "$FS::UID::conf_dir/conf.$FS::UID::datasrc",
+ );
+
+ my $countrydefault = $conf->config('countrydefault') || 'US';
+ $invoice_data{'country'} = '' if $invoice_data{'country'} eq $countrydefault;
+
+# #do variable substitutions in notes
+# $invoice_data{'notes'} =
+# join("\n",
+# map { my $b=$_; $b =~ s/\$(\w+)/$invoice_data{$1}/eg; $b }
+# $conf->config_orbase('invoice_latexnotes', $suffix)
+# );
+#
+# $invoice_data{'footer'} =~ s/\n+$//;
+# $invoice_data{'smallfooter'} =~ s/\n+$//;
+# $invoice_data{'notes'} =~ s/\n+$//;
+#
+ $invoice_data{'po_line'} =
+ ( $cust_main->payby eq 'BILL' && $cust_main->payinfo )
+ ? encode_entities("Purchase Order #". $cust_main->payinfo)
+ : '';
+
+ my $money_char = $conf->config('money_char') || '$';
+
+ foreach my $line_item ( $self->_items ) {
+ my $detail = {
+ ext_description => [],
+ };
+ $detail->{'ref'} = $line_item->{'pkgnum'};
+ $detail->{'description'} = encode_entities($line_item->{'description'});
+ if ( exists $line_item->{'ext_description'} ) {
+ @{$detail->{'ext_description'}} = map {
+ encode_entities($_);
+ } @{$line_item->{'ext_description'}};
+ }
+ $detail->{'amount'} = $money_char. $line_item->{'amount'};
+ $detail->{'product_code'} = $line_item->{'pkgpart'} || 'N/A';
+
+ push @{$invoice_data{'detail_items'}}, $detail;
+ }
+
+
+ my $taxtotal = 0;
+ foreach my $tax ( $self->_items_tax ) {
+ my $total = {};
+ $total->{'total_item'} = encode_entities($tax->{'description'});
+ $taxtotal += $tax->{'amount'};
+ $total->{'total_amount'} = $money_char. $tax->{'amount'};
+ push @{$invoice_data{'total_items'}}, $total;
+ }
+
+ if ( $taxtotal ) {
+ my $total = {};
+ $total->{'total_item'} = 'Sub-total';
+ $total->{'total_amount'} =
+ $money_char. sprintf('%.2f', $self->charged - $taxtotal );
+ unshift @{$invoice_data{'total_items'}}, $total;
+ }
+
+ my( $pr_total, @pr_cust_bill ) = $self->previous; #previous balance
+ {
+ my $total = {};
+ $total->{'total_item'} = '<b>Total</b>';
+ $total->{'total_amount'} =
+ "<b>$money_char". sprintf('%.2f', $self->charged + $pr_total ). '</b>';
+ push @{$invoice_data{'total_items'}}, $total;
+ }
+
+ #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'} = encode_entities($credit->{'description'});
+ #$credittotal
+ $total->{'total_amount'} = "-$money_char". $credit->{'amount'};
+ push @{$invoice_data{'total_items'}}, $total;
+ }
+
+ # payments
+ foreach my $payment ( $self->_items_payments ) {
+ my $total = {};
+ $total->{'total_item'} = encode_entities($payment->{'description'});
+ #$paymenttotal
+ $total->{'total_amount'} = "-$money_char". $payment->{'amount'};
+ push @{$invoice_data{'total_items'}}, $total;
+ }
+
+ {
+ my $total;
+ $total->{'total_item'} = '<b>'. $self->balance_due_msg. '</b>';
+ $total->{'total_amount'} =
+ "<b>$money_char". sprintf('%.2f', $self->owed + $pr_total ). '</b>';
+ push @{$invoice_data{'total_items'}}, $total;
+ }
+
+ $html_template->fill_in( HASH => \%invoice_data);
+}
+
# quick subroutine for print_latex
#
# There are ten characters that LaTeX treats as special characters, which
@@ -1531,7 +1765,7 @@
' ('. time2str('%x',$_->_date). ')',
#'pkgpart' => 'N/A',
'pkgnum' => 'N/A',
- 'amount' => sprintf("%10.2f", $_->owed),
+ 'amount' => sprintf("%.2f", $_->owed),
};
}
@b;
@@ -1584,7 +1818,7 @@
description => $description,
#pkgpart => $part_pkg->pkgpart,
pkgnum => $cust_pkg->pkgnum,
- amount => sprintf("%10.2f", $cust_bill_pkg->setup),
+ amount => sprintf("%.2f", $cust_bill_pkg->setup),
ext_description => \@d,
};
}
@@ -1596,7 +1830,7 @@
time2str('%x', $cust_bill_pkg->edate). ')',
#pkgpart => $part_pkg->pkgpart,
pkgnum => $cust_pkg->pkgnum,
- amount => sprintf("%10.2f", $cust_bill_pkg->recur),
+ amount => sprintf("%.2f", $cust_bill_pkg->recur),
ext_description => [ $cust_pkg->h_labels_short($cust_bill_pkg->edate,
$cust_bill_pkg->sdate),
$cust_bill_pkg->details,
@@ -1612,7 +1846,7 @@
if ( $cust_bill_pkg->setup != 0 ) {
push @b, {
'description' => $itemdesc,
- 'amount' => sprintf("%10.2f", $cust_bill_pkg->setup),
+ 'amount' => sprintf("%.2f", $cust_bill_pkg->setup),
};
}
if ( $cust_bill_pkg->recur != 0 ) {
@@ -1620,7 +1854,7 @@
'description' => "$itemdesc (".
time2str("%x", $cust_bill_pkg->sdate). ' - '.
time2str("%x", $cust_bill_pkg->edate). ')',
- 'amount' => sprintf("%10.2f", $cust_bill_pkg->recur),
+ 'amount' => sprintf("%.2f", $cust_bill_pkg->recur),
};
}
@@ -1651,7 +1885,7 @@
# $reason,
'description' => 'Credit applied '.
time2str("%x",$_->cust_credit->_date). $reason,
- 'amount' => sprintf("%10.2f",$_->amount),
+ 'amount' => sprintf("%.2f",$_->amount),
};
}
#foreach ( @cr_cust_credit ) {
@@ -1677,7 +1911,7 @@
push @b, {
'description' => "Payment received ".
time2str("%x",$_->cust_pay->_date ),
- 'amount' => sprintf("%10.2f", $_->amount )
+ 'amount' => sprintf("%.2f", $_->amount )
};
}
More information about the freeside-commits
mailing list