forgotten space in typeset invoice credit lines
[freeside.git] / FS / FS / cust_bill.pm
index 367e1bc..b249533 100644 (file)
@@ -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 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 );
 use FS::UID qw( datasrc );
 use FS::Record qw( qsearch qsearchs );
 use FS::Misc qw( send_email );
@@ -316,7 +317,7 @@ sub owed {
   $balance;
 }
 
   $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>.
 
 Sends this invoice to the destinations configured for this customer: send
 emails or print.  See L<FS::cust_main_invoice>.
@@ -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.
 
 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 : '';
 =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;
 
   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
   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(
 
     my $error = send_email(
-      'from'    => $conf->config('invoice_from'),
+      'from'    => $invoice_from,
       'to'      => [ grep { $_ ne 'POST' } @invoicing_list ],
       'subject' => 'Invoice',
       'body'    => \@print_text,
       'to'      => [ grep { $_ ne 'POST' } @invoicing_list ],
       'subject' => 'Invoice',
       'body'    => \@print_text,
@@ -664,13 +671,26 @@ sub batch_card {
 
 sub _agent_template {
   my $self = shift;
 
 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',
 
   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'
     },
     '',
     'ORDER BY seconds LIMIT 1'
@@ -678,10 +698,10 @@ sub _agent_template {
 
   return '' unless $cust_bill_event;
 
 
   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 {
     return $1;
   } else {
-    warn "can't parse eventcode for agent-specific invoice template";
+    warn "can't parse plandata for $1";
     return '';
   }
 
     return '';
   }
 
@@ -1108,17 +1128,17 @@ sub print_latex {
     $var;
   }
 
     $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;
 
 }
 
 
 }
 
@@ -1138,13 +1158,19 @@ sub print_ps {
 
   my $file = $self->print_latex(@_);
 
 
   my $file = $self->print_latex(@_);
 
-  #error checking!!
-  system('pslatex', "$file.tex");
-  system('pslatex', "$file.tex");
-  system('dvips', '-q', '-t', 'letter', "$file.dvi", '-o', "$file.ps" );
+  my $dir = $FS::UID::conf_dir. "cache.". $FS::UID::datasrc;
+  chdir($dir);
+
+  system("pslatex $file.tex >/dev/null 2>&1") == 0
+    or die "pslatex $file.tex failed: $!";
+  system("pslatex $file.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 "dvips failed: $!";
 
   open(POSTSCRIPT, "<$file.ps")
 
   open(POSTSCRIPT, "<$file.ps")
-    or die "can't open $file.ps (probable error in LaTeX template): $!\n";
+    or die "can't open $file.ps: $! (error in LaTeX template?)\n";
 
   unlink("$file.dvi", "$file.log", "$file.aux", "$file.ps", "$file.tex");
 
 
   unlink("$file.dvi", "$file.log", "$file.aux", "$file.ps", "$file.tex");
 
@@ -1175,19 +1201,28 @@ sub print_pdf {
 
   my $file = $self->print_latex(@_);
 
 
   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('pdflatex', "$file.tex");
   #system('pdflatex', "$file.tex");
   #! LaTeX Error: Unknown graphics extension: .eps.
 
-  #error checking!!
-  system('pslatex', "$file.tex");
-  system('pslatex', "$file.tex");
+  system("pslatex $file.tex >/dev/null 2>&1") == 0
+    or die "pslatex $file.tex failed: $!";
+  system("pslatex $file.tex >/dev/null 2>&1") == 0
+    or die "pslatex $file.tex failed: $!";
 
   #system('dvipdf', "$file.dvi", "$file.pdf" );
 
   #system('dvipdf', "$file.dvi", "$file.pdf" );
-  system("dvips -q -t letter -f $file.dvi | gs -q -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -sOutputFile=$file.pdf -c save pop -");
+  system(
+    "dvips -q -t letter -f $file.dvi ".
+    "| gs -q -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -sOutputFile=$file.pdf ".
+    "     -c save pop -"
+  ) == 0
+    or die "dvips | gs failed: $!";
 
   open(PDF, "<$file.pdf")
 
   open(PDF, "<$file.pdf")
-    or die "can't open $file.pdf (probably error in LaTeX tempalte: $!\n";
+    or die "can't open $file.pdf: $! (error in LaTeX template?)\n";
 
   unlink("$file.dvi", "$file.log", "$file.aux", "$file.pdf", "$file.tex");
 
 
   unlink("$file.dvi", "$file.log", "$file.aux", "$file.pdf", "$file.tex");
 
@@ -1387,7 +1422,7 @@ sub _items_credits {
       #'description' => 'Credit ref\#'. $_->crednum.
       #                 " (". time2str("%x",$_->cust_credit->_date) .")".
       #                 $reason,
       #'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),
     };
                        time2str("%x",$_->cust_credit->_date). $reason,
       'amount'      => sprintf("%10.2f",$_->amount),
     };