use HTML::Entities;
use Locale::Country;
use FS::UID qw( datasrc );
-use FS::Misc qw( send_email send_fax generate_ps do_print );
+use FS::Misc qw( send_email send_fax generate_ps generate_pdf do_print );
use FS::Record qw( qsearch qsearchs dbh );
use FS::cust_main_Mixin;
use FS::cust_main;
'footer' => sub { map "$_", @_ },
'smallfooter' => sub { map "$_", @_ },
'returnaddress' => sub { map "$_", @_ },
+ 'coupon' => sub { map "$_", @_ },
},
'html' => {
'notes' =>
$_;
} @_
},
+ 'coupon' => sub { "" },
},
'template' => {
'notes' =>
$_;
} @_
},
+ 'coupon' => sub { "" },
},
);
'state' => &$escape_function($cust_main->state),
'zip' => &$escape_function($cust_main->zip),
'returnaddress' => $returnaddress,
- 'quantity' => 1,
+ #'quantity' => 1,
'terms' => $self->terms,
'template' => $params{'template'},
#'notes' => join("\n", $conf->config('invoice_latexnotes') ),
push @address, ''
while (scalar(@address) < 5);
+ $invoice_data{'logo_file'} = $params{'logo_file'}
+ if $params{'logo_file'};
+
+ my( $pr_total, @pr_cust_bill ) = $self->previous; #previous balance
+# my( $cr_total, @cr_cust_credit ) = $self->cust_credit; #credits
+ #my $balance_due = $self->owed + $pr_total - $cr_total;
+ my $balance_due = $self->owed + $pr_total;
+ $invoice_data{'balance'} = $balance_due;
+
#do variable substitution in notes, footer, smallfooter
- foreach my $include (qw( notes footer smallfooter )) {
+ foreach my $include (qw( notes footer smallfooter coupon )) {
my $inc_file = $conf->key_orbase("invoice_${format}$include", $template);
my @inc_src;
? &$escape_function("Purchase Order #". $cust_main->payinfo)
: $nbsp;
- my( $pr_total, @pr_cust_bill ) = $self->previous; #previous balance
-# my( $cr_total, @cr_cust_credit ) = $self->cust_credit; #credits
- #my $balance_due = $self->owed + $pr_total - $cr_total;
- my $balance_due = $self->owed + $pr_total;
-
my %money_chars = ( 'latex' => '',
'html' => $conf->config('money_char') || '$',
'template' => '',
&$escape_function($_);
} @{$line_item->{'ext_description'}};
}
- {
- my $money = $old_latex ? '' : $money_char;
- $detail->{'amount'} = $money. $line_item->{'amount'};
- }
+ $detail->{'amount'} = ( $old_latex ? '' : $money_char).
+ $line_item->{'amount'};
$detail->{'product_code'} = $line_item->{'pkgpart'} || 'N/A';
push @detail_items, $detail;
my %options = ();
$options{'section'} = $section if $multisection;
$options{'format'} = $format;
+ $options{'escape_function'} = $escape_function;
foreach my $line_item ( $self->_items_pkg(%options) ) {
my $detail = {
ext_description => [],
};
$detail->{'ref'} = $line_item->{'pkgnum'};
- $detail->{'quantity'} = 1;
+ $detail->{'quantity'} = $line_item->{'quantity'};
$detail->{'section'} = $section;
$detail->{'description'} = &$escape_function($line_item->{'description'});
if ( exists $line_item->{'ext_description'} ) {
@{$detail->{'ext_description'}} = @{$line_item->{'ext_description'}};
}
- {
- my $money = $old_latex ? '' : $money_char;
- $detail->{'amount'} = $money. $line_item->{'amount'};
- }
+ $detail->{'amount'} = ( $old_latex ? '' : $money_char ).
+ $line_item->{'amount'};
+ $detail->{'unit_amount'} = ( $old_latex ? '' : $money_char ).
+ $line_item->{'unit_amount'};
$detail->{'product_code'} = $line_item->{'pkgpart'} || 'N/A';
push @detail_items, $detail;
}
}
- $invoice_data{'logo_file'} = $params{'logo_file'}
- if $params{'logo_file'};
-
$invoice_lines = 0;
my $wasfunc = 0;
foreach ( grep /invoice_lines\(\d*\)/, @invoice_template ) { #kludgy
my ($file, $lfile) = $self->print_latex(@_);
my $ps = generate_ps($file);
unlink($lfile);
- $ps;
+ $ps;
}
=item print_pdf [ TIME [ , TEMPLATE ] ]
my $self = shift;
my ($file, $lfile) = $self->print_latex(@_);
+ my $pdf = generate_pdf($file);
+ unlink($lfile);
- my $dir = $FS::UID::conf_dir. "/cache.". $FS::UID::datasrc;
- chdir($dir);
-
- #system('pdflatex', "$file.tex");
- #system('pdflatex', "$file.tex");
- #! LaTeX Error: Unknown graphics extension: .eps.
-
- my $sfile = shell_quote $file;
-
- system("pslatex $sfile.tex >/dev/null 2>&1") == 0
- or die "pslatex $file.tex failed; see $file.log for details?\n";
- system("pslatex $sfile.tex >/dev/null 2>&1") == 0
- or die "pslatex $file.tex failed; see $file.log for details?\n";
-
- #system('dvipdf', "$file.dvi", "$file.pdf" );
- system(
- "dvips -q -t letter -f $sfile.dvi ".
- "| gs -q -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -sOutputFile=$sfile.pdf ".
- " -c save pop -"
- ) == 0
- or die "dvips | gs failed: $!";
-
- open(PDF, "<$file.pdf")
- or die "can't open $file.pdf: $! (error in LaTeX template?)\n";
-
- unlink("$file.dvi", "$file.log", "$file.aux", "$file.pdf", "$file.tex");
- unlink("$lfile");
-
- my $pdf = '';
- while (<PDF>) {
- $pdf .= $_;
- }
-
- close PDF;
-
- return $pdf;
-
+ $pdf;
}
=item print_html [ TIME [ , TEMPLATE [ , CID ] ] ]
$msg;
}
+=item invnum_date_pretty
+
+Returns a string with the invoice number and date, for example:
+"Invoice #54 (3/20/2008)"
+
+=cut
+
+sub invnum_date_pretty {
+ my $self = shift;
+ 'Invoice #'. $self->invnum. ' ('. time2str('%x', $self->_date). ')';
+}
+
sub _items_sections {
my $self = shift;
sub _items {
my $self = shift;
- my @display = scalar(@_)
- ? @_
- : qw( _items_previous _items_pkg );
- #: qw( _items_pkg );
- #: qw( _items_previous _items_pkg _items_tax _items_credits _items_payments );
+
+ #my @display = scalar(@_)
+ # ? @_
+ # : qw( _items_previous _items_pkg );
+ # #: qw( _items_pkg );
+ # #: qw( _items_previous _items_pkg _items_tax _items_credits _items_payments );
+ my @display = qw( _items_previous _items_pkg );
+
my @b = ();
foreach my $display ( @display ) {
push @b, $self->$display(@_);
my $self = shift;
my $cust_bill_pkg = shift;
my %opt = @_;
+
my $format = $opt{format} || '';
my $escape_function = $opt{escape_function} || sub { shift };
my $desc = $cust_bill_pkg->desc;
+ my %details_opt = ( 'format' => $format,
+ 'escape_function' => $escape_function,
+ );
+
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_pkg->h_labels_short($self->_date);
- push @d, $cust_bill_pkg->details( 'format' => $format,
- 'escape_function' => $escape_function,
- )
+
+ my @d = map &{$escape_function}($_),
+ $cust_pkg->h_labels_short($self->_date);
+ push @d, $cust_bill_pkg->details(%details_opt)
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->setup),
+ unit_amount => sprintf("%.2f", $cust_bill_pkg->unitsetup),
+ quantity => $cust_bill_pkg->quantity,
ext_description => \@d,
};
}
if ( $cust_bill_pkg->recur != 0 ) {
+
+ my $description = $desc;
+ unless ( $conf->exists('disable_line_item_date_ranges') ) {
+ $desc .= " (" . time2str("%x", $cust_bill_pkg->sdate).
+ " - ". time2str("%x", $cust_bill_pkg->edate). ")";
+ }
+
+ #at least until cust_bill_pkg has "past" ranges in addition to
+ #the "future" sdate/edate ones... see #3032
+ my @d = map &{$escape_function}($_),
+ $cust_pkg->h_labels_short($self->_date);
+ #$cust_bill_pkg->edate,
+ #$cust_bill_pkg->sdate),
+ push @d, $cust_bill_pkg->details(%details_opt);
+
push @b, {
- description => $desc .
- ( $conf->exists('disable_line_item_date_ranges')
- ? ''
- : " (" .time2str("%x", $cust_bill_pkg->sdate).
- " - ".time2str("%x", $cust_bill_pkg->edate).")"
- ),
+ description => $description,
#pkgpart => $part_pkg->pkgpart,
pkgnum => $cust_bill_pkg->pkgnum,
amount => sprintf("%.2f", $cust_bill_pkg->recur),
- ext_description =>
- #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),
- ],
+ unit_amount => sprintf("%.2f", $cust_bill_pkg->unitrecur),
+ quantity => $cust_bill_pkg->quantity,
+ ext_description => \@d,
};
+
}
} else { #pkgnum tax or one-shot line item (??)