use vars qw( $invoice_lines @buf ); #yuck
use Date::Format;
use Text::Template;
+use File::Temp 0.14;
+use String::ShellQuote;
use FS::UID qw( datasrc );
use FS::Record qw( qsearch qsearchs );
use FS::Misc qw( send_email );
$balance;
}
-=item send [ TEMPLATENAME [ , AGENTNUM ] ]
+=item send [ TEMPLATENAME [ , AGENTNUM [ , INVOICE_FROM ] ] ]
Sends this invoice to the destinations configured for this customer: send
emails or print. See L<FS::cust_main_invoice>.
AGENTNUM, if specified, means that this invoice will only be sent for customers
of the specified agent.
+INVOICE_FROM, if specified, overrides the default email invoice From: address.
+
=cut
sub send {
my $self = shift;
my $template = scalar(@_) ? shift : '';
- return '' if scalar(@_) && $_[0] && $self->cust_main->agentnum ne shift;
+ return 'N/A' if scalar(@_) && $_[0] && $self->cust_main->agentnum != shift;
+ my $invoice_from =
+ scalar(@_)
+ ? shift
+ : ( $self->_agent_invoice_from || $conf->config('invoice_from') );
my @print_text = $self->print_text('', $template);
my @invoicing_list = $self->cust_main->invoicing_list;
if ( grep { $_ ne 'POST' } @invoicing_list or !@invoicing_list ) { #email
#better to notify this person than silence
- @invoicing_list = ($conf->config('invoice_from')) unless @invoicing_list;
+ @invoicing_list = ($invoice_from) unless @invoicing_list;
my $error = send_email(
- 'from' => $conf->config('invoice_from'),
+ 'from' => $invoice_from,
'to' => [ grep { $_ ne 'POST' } @invoicing_list ],
'subject' => 'Invoice',
'body' => \@print_text,
sub _agent_template {
my $self = shift;
+ $self->_agent_plandata('agent_templatename');
+}
+
+sub _agent_invoice_from {
+ my $self = shift;
+ $self->_agent_plandata('agent_invoice_from');
+}
- my $cust_bill_event = qsearchs( 'part_bill_event',
+sub _agent_plandata {
+ my( $self, $option ) = @_;
+
+ my $part_bill_event = qsearchs( 'part_bill_event',
{
'payby' => $self->cust_main->payby,
'plan' => 'send_agent',
- 'eventcode' => { 'op' => 'LIKE',
- 'value' => '_%, '. $self->cust_main->agentnum. ');' },
+ 'plandata' => { 'op' => '~',
+ 'value' => "(^|\n)agentnum ".
+ $self->cust_main->agentnum.
+ "(\n|\$)",
+ },
},
'',
'ORDER BY seconds LIMIT 1'
);
- return '' unless $cust_bill_event;
+ return '' unless $part_bill_event;
- if ( $cust_bill_event->eventcode =~ /\(\s*'(.*)'\s*,\s*(\d+)\s*\)\;$/ ) {
+ if ( $part_bill_event->plandata =~ /^$option (.*)$/m ) {
return $1;
} else {
- warn "can't parse eventcode for agent-specific invoice template";
+ warn "can't parse part_bill_event eventpart#". $part_bill_event->eventpart.
+ " plandata for $option";
return '';
}
=cut
+#still some false laziness w/print_text
sub print_text {
my( $self, $today, $template ) = @_;
$today ||= time;
+
# my $invnum = $self->invnum;
- my $cust_main = qsearchs('cust_main', { 'custnum', $self->custnum } );
+ my $cust_main = $self->cust_main;
$cust_main->payname( $cust_main->first. ' '. $cust_main->getfield('last') )
- unless $cust_main->payname && $cust_main->payby ne 'CHEK';
+ unless $cust_main->payname && $cust_main->payby !~ /^(CHEK|DCHK)$/;
my( $pr_total, @pr_cust_bill ) = $self->previous; #previous balance
# my( $cr_total, @cr_cust_credit ) = $self->cust_credit; #credits
# 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 ne 'CHEK';
+ unless $cust_main->payname && $cust_main->payby !~ /^(CHEK|DCHK)$/;
my( $pr_total, @pr_cust_bill ) = $self->previous; #previous balance
# my( $cr_total, @cr_cust_credit ) = $self->cust_credit; #credits
$var;
}
- my $dir = '/tmp'; #! /usr/local/etc/freeside/invoices.datasrc/
- my $unique = int(rand(2**31)); #UGH... use File::Temp or something
-
- chdir($dir);
- my $file = $self->invnum. ".$unique";
-
- open(TEX,">$file.tex") or die "can't open $file.tex: $!\n";
- print TEX join("\n", @filled_in ), "\n";
- close TEX;
+ my $dir = $FS::UID::conf_dir. "cache.". $FS::UID::datasrc;
+ my $fh = new File::Temp( TEMPLATE => 'invoice.'. $self->invnum. '.XXXXXXXX',
+ DIR => $dir,
+ SUFFIX => '.tex',
+ UNLINK => 0,
+ ) or die "can't open temp file: $!\n";
+ print $fh join("\n", @filled_in ), "\n";
+ close $fh;
- return $file;
+ $fh->filename =~ /^(.*).tex$/ or die "unparsable filename: ". $fh->filename;
+ return $1;
}
my $file = $self->print_latex(@_);
- system("pslatex $file.tex >/dev/null 2>&1") == 0
- or die "pslatex failed: $!";
- system("pslatex $file.tex >/dev/null 2>&1") == 0
- or die "pslatex failed: $!";
+ my $dir = $FS::UID::conf_dir. "cache.". $FS::UID::datasrc;
+ chdir($dir);
+
+ my $sfile = shell_quote $file;
+
+ system("pslatex $sfile.tex >/dev/null 2>&1") == 0
+ or die "pslatex $file.tex failed: $!";
+ system("pslatex $sfile.tex >/dev/null 2>&1") == 0
+ or die "pslatex $file.tex failed: $!";
system('dvips', '-q', '-t', 'letter', "$file.dvi", '-o', "$file.ps" ) == 0
- or die "dbips failed: $!";
+ or die "dvips failed: $!";
open(POSTSCRIPT, "<$file.ps")
or die "can't open $file.ps: $! (error in LaTeX template?)\n";
my $file = $self->print_latex(@_);
+ 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.
- system("pslatex $file.tex >/dev/null 2>&1") == 0
- or die "pslatex failed: $!";
- system("pslatex $file.tex >/dev/null 2>&1") == 0
- or die "pslatex failed: $!";
+ my $sfile = shell_quote $file;
+
+ system("pslatex $sfile.tex >/dev/null 2>&1") == 0
+ or die "pslatex $file.tex failed: $!";
+ system("pslatex $sfile.tex >/dev/null 2>&1") == 0
+ or die "pslatex $file.tex failed: $!";
#system('dvipdf', "$file.dvi", "$file.pdf" );
system(
- "dvips -q -t letter -f $file.dvi ".
- "| gs -q -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -sOutputFile=$file.pdf ".
+ "dvips -q -t letter -f $sfile.dvi ".
+ "| gs -q -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -sOutputFile=$sfile.pdf ".
" -c save pop -"
) == 0
- or die "dvips failed: $!";
+ or die "dvips | gs failed: $!";
open(PDF, "<$file.pdf")
or die "can't open $file.pdf: $! (error in LaTeX template?)\n";
#'description' => 'Credit ref\#'. $_->crednum.
# " (". time2str("%x",$_->cust_credit->_date) .")".
# $reason,
- 'description' => 'Credit applied'.
+ 'description' => 'Credit applied '.
time2str("%x",$_->cust_credit->_date). $reason,
'amount' => sprintf("%10.2f",$_->amount),
};