Added support for FAX invoice destinations using a HylaFAX server.
[freeside.git] / FS / FS / cust_bill.pm
index 93c179a..10b4928 100644 (file)
@@ -9,7 +9,7 @@ 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 );
+use FS::Misc qw( send_email send_fax );
 use FS::cust_main;
 use FS::cust_bill_pkg;
 use FS::cust_credit;
@@ -318,6 +318,80 @@ sub owed {
   $balance;
 }
 
+
+=item generate_email PARAMHASH
+
+PARAMHASH can contain the following:
+
+=over 4
+
+=item from       => sender address, required
+
+=item tempate    => alternate template name, optional
+
+=item print_text => text attachment arrayref, optional
+
+=item subject    => email subject, optional
+
+=back
+
+Returns an argument list to be passed to L<FS::Misc::send_email>.
+
+=cut
+
+sub generate_email {
+
+  my $self = shift;
+  my %args = @_;
+
+  my $mimeparts;
+  if ($conf->exists('invoice_email_pdf')) {
+    #warn "[FS::cust_bill::send] creating PDF attachment";
+    #mime parts arguments a la MIME::Entity->build().
+    $mimeparts = [
+      {
+        'Type'        => 'application/pdf',
+        'Encoding'    => 'base64',
+        'Data'        => [ $self->print_pdf('', $args{'template'}) ],
+        'Disposition' => 'attachment',
+        'Filename'    => 'invoice.pdf',
+      },
+    ];
+  }
+
+  my $email_text;
+  if ($conf->exists('invoice_email_pdf')
+      and scalar($conf->config('invoice_email_pdf_note'))) {
+
+    #warn "[FS::cust_bill::send] using 'invoice_email_pdf_note'";
+    $email_text = [ map { $_ . "\n" } $conf->config('invoice_email_pdf_note') ];
+  } else {
+    #warn "[FS::cust_bill::send] not using 'invoice_email_pdf_note'";
+    if (ref($args{'print_text'}) eq 'ARRAY') {
+      $email_text = $args{'print_text'};
+    } else {
+      $email_text = [ $self->print_text('', $args{'template'}) ];
+    }
+  }
+
+  my @invoicing_list;
+  if (ref($args{'to'} eq 'ARRAY')) {
+    @invoicing_list = @{$args{'to'}};
+  } else {
+    @invoicing_list = grep { $_ !~ /^(POST|FAX)$/ } $self->cust_main->invoicing_list;
+  }
+
+  return (
+    'from'      => $args{'from'},
+    'to'        => [ @invoicing_list ],
+    'subject'   => (($args{'subject'}) ? $args{'subject'} : 'Invoice'),
+    'body'      => $email_text,
+    'mimeparts' => $mimeparts,
+  );
+
+
+}
+
 =item send [ TEMPLATENAME [ , AGENTNUM [ , INVOICE_FROM ] ] ]
 
 Sends this invoice to the destinations configured for this customer: send
@@ -344,32 +418,51 @@ sub send {
   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
+  if ( grep { $_ !~ /^(POST|FAX)$/ } @invoicing_list or !@invoicing_list  ) { #email
 
     #better to notify this person than silence
     @invoicing_list = ($invoice_from) unless @invoicing_list;
 
     my $error = send_email(
-      'from'    => $invoice_from,
-      'to'      => [ grep { $_ ne 'POST' } @invoicing_list ],
-      'subject' => 'Invoice',
-      'body'    => \@print_text,
+      $self->generate_email(
+        'from'   => $invoice_from,
+        'to'     => [ grep { $_ !~ /^(POST|FAX)$/ } @invoicing_list ],
+       'print_text' => [ @print_text ],
+      )
     );
     die "can't email invoice: $error\n" if $error;
     #die "$error\n" if $error;
 
   }
 
-  if ( grep { $_ eq 'POST' } @invoicing_list ) { #postal
-    @print_text = $self->print_ps('', $template)
-      if $conf->config('invoice_latex');
-    my $lpr = $conf->config('lpr');
-    open(LPR, "|$lpr")
-      or die "Can't open pipe to $lpr: $!\n";
-    print LPR @print_text;
-    close LPR
-      or die $! ? "Error closing $lpr: $!\n"
-                : "Exit status $? from $lpr\n";
+  if ( grep { $_ =~ /^(POST|FAX)$/ } @invoicing_list ) {
+    my $lpr_data;
+    if ($conf->config('invoice_latex')) {
+      $lpr_data = [ $self->print_ps('', $template) ];
+    } else {
+      $lpr_data = \@print_text;
+    }
+
+    if ( grep { $_ eq 'POST' } @invoicing_list ) { #postal
+      my $lpr = $conf->config('lpr');
+      open(LPR, "|$lpr")
+        or die "Can't open pipe to $lpr: $!\n";
+      print LPR @{$lpr_data};
+      close LPR
+        or die $! ? "Error closing $lpr: $!\n"
+                  : "Exit status $? from $lpr\n";
+    }
+
+    if ( grep { $_ eq 'FAX' } @invoicing_list ) { #fax
+      unless ($conf->exists('invoice_latex')) {
+       die 'FAX invoice destination not supported with plain text invoices.'
+      }
+      my $dialstring = $self->cust_main->getfield('fax');
+      #Check $dialstring?
+      my $error = send_fax(docdata => $lpr_data, dialstring => $dialstring);
+      die $error if $error;
+    }
+
   }
 
   '';
@@ -681,7 +774,7 @@ sub batch_card {
     'state'    => $cust_main->getfield('state'),
     'zip'      => $cust_main->getfield('zip'),
     'country'  => $cust_main->getfield('country'),
-    'cardnum'  => $cust_main->getfield('payinfo'),
+    'cardnum'  => $cust_main->payinfo,
     'exp'      => $cust_main->getfield('paydate'),
     'payname'  => $cust_main->getfield('payname'),
     'amount'   => $self->owed,
@@ -1192,12 +1285,12 @@ sub print_ps {
   my $sfile = shell_quote $file;
 
   system("pslatex $sfile.tex >/dev/null 2>&1") == 0
-    or die "pslatex $file.tex failed: $!";
+    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: $!";
+    or die "pslatex $file.tex failed; see $file.log for details?\n";
 
   system('dvips', '-q', '-t', 'letter', "$file.dvi", '-o', "$file.ps" ) == 0
-    or die "dvips failed: $!";
+    or die "dvips failed";
 
   open(POSTSCRIPT, "<$file.ps")
     or die "can't open $file.ps: $! (error in LaTeX template?)\n";