X-Git-Url: http://git.freeside.biz/gitweb/?p=freeside.git;a=blobdiff_plain;f=FS%2FFS%2Fcust_bill.pm;h=b2495338d96d05fcf9a530f78eef63c73f1d7c0a;hp=4cfc59d10c21334983cc2b207a59ecb17b816f76;hb=af723d02722d00c863ec4552627fe4ad77973d75;hpb=9c7e761f0c45bf2085a4486269e8d70b9f87cde2 diff --git a/FS/FS/cust_bill.pm b/FS/FS/cust_bill.pm index 4cfc59d10..b2495338d 100644 --- a/FS/FS/cust_bill.pm +++ b/FS/FS/cust_bill.pm @@ -5,6 +5,7 @@ use vars qw( @ISA $conf $money_char ); use vars qw( $invoice_lines @buf ); #yuck use Date::Format; use Text::Template; +use File::Temp 0.14; use FS::UID qw( datasrc ); use FS::Record qw( qsearch qsearchs ); use FS::Misc qw( send_email ); @@ -316,7 +317,7 @@ sub owed { $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. @@ -326,12 +327,18 @@ TEMPLATENAME, if specified, is the name of a suffix for alternate invoices. 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; @@ -339,10 +346,10 @@ sub send { 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, @@ -664,13 +671,26 @@ sub batch_card { sub _agent_template { my $self = shift; + $self->_agent_plandata('agent_templatename'); +} + +sub _agent_invoice_from { + my $self = shift; + $self->_agent_plandata('agent_invoice_from'); +} + +sub _agent_plandata { + my( $self, $option ) = @_; my $cust_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' @@ -678,10 +698,10 @@ sub _agent_template { return '' unless $cust_bill_event; - if ( $cust_bill_event->eventcode =~ /\(\s*'(.*)'\s*,\s*(\d+)\s*\)\;$/ ) { + if ( $cust_bill_event->plandata =~ /^$option (.*)$/m ) { return $1; } else { - warn "can't parse eventcode for agent-specific invoice template"; + warn "can't parse plandata for $1"; return ''; } @@ -1108,17 +1128,17 @@ sub print_latex { $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"; + 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; - open(TEX,">$file.tex") or die "can't open $file.tex: $!\n"; - print TEX join("\n", @filled_in ), "\n"; - close TEX; - - return $file; + $fh->filename =~ /^(.*).tex$/ or die "unparsable filename: ". $fh->filename; + return $1; } @@ -1138,13 +1158,16 @@ sub print_ps { my $file = $self->print_latex(@_); + my $dir = $FS::UID::conf_dir. "cache.". $FS::UID::datasrc; + chdir($dir); + system("pslatex $file.tex >/dev/null 2>&1") == 0 - or die "pslatex failed: $!"; + or die "pslatex $file.tex failed: $!"; system("pslatex $file.tex >/dev/null 2>&1") == 0 - or die "pslatex failed: $!"; + 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"; @@ -1178,14 +1201,17 @@ sub print_pdf { 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: $!"; + or die "pslatex $file.tex failed: $!"; system("pslatex $file.tex >/dev/null 2>&1") == 0 - or die "pslatex failed: $!"; + or die "pslatex $file.tex failed: $!"; #system('dvipdf', "$file.dvi", "$file.pdf" ); system( @@ -1193,7 +1219,7 @@ sub print_pdf { "| gs -q -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -sOutputFile=$file.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"; @@ -1396,7 +1422,7 @@ sub _items_credits { #'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), };