allow sending email to specific contact classes, #33316
[freeside.git] / FS / FS / msg_template.pm
index bc21e65..50a9b3f 100644 (file)
@@ -383,12 +383,26 @@ sub prepare {
 
   my @to;
   if ( exists($opt{'to'}) ) {
+
     @to = split(/\s*,\s*/, $opt{'to'});
+
+  } elsif ( $cust_main ) {
+
+    my @classes;
+    if ( $opt{'to_contact_classnum'} ) {
+      my $classnum = $opt{'to_contact_classnum'};
+      @classes = ref($classnum) ? @$classnum : split(',', $classnum);
+    }
+    if (!@classes) {
+      @classes = ( 'invoice' );
+    }
+    @to = $cust_main->contact_list_email(@classes);
+
+  } else {
+
+    die 'no To: address or cust_main object specified';
+
   }
-  else {
-    @to = $cust_main->invoicing_list_emailonly;
-  }
-  # no warning when preparing with no destination
 
   my $from_addr = $self->from_addr;
 
@@ -397,8 +411,7 @@ sub prepare {
       $from_addr = scalar( $conf->config($opt{'from_config'}, 
                                          $cust_main->agentnum) );
     }
-    $from_addr ||= scalar( $conf->config('invoice_from',
-                                         $cust_main->agentnum) );
+    $from_addr ||= $conf->invoice_from_full($cust_main->agentnum);
   }
 #  my @cust_msg = ();
 #  if ( $conf->exists('log_sent_mail') and !$opt{'preview'} ) {
@@ -423,7 +436,7 @@ sub prepare {
     'bcc'  => $self->bcc_addr || undef,
     'subject'   => $subject,
     'html_body' => $body,
-    'text_body' => $text_body
+    'text_body' => $text_body,
   );
 
 }
@@ -431,7 +444,8 @@ sub prepare {
 =item send OPTION => VALUE
 
 Fills in the template and sends it to the customer.  Options are as for 
-'prepare'.
+'prepare', plus 'attach', a L<MIME::Entity> (or arrayref of them) to attach
+to the message.
 
 =cut
 
@@ -439,7 +453,20 @@ Fills in the template and sends it to the customer.  Options are as for
 # preview it, etc.
 sub send {
   my $self = shift;
-  send_email(generate_email($self->prepare(@_)));
+  my %opt = @_;
+
+  my %email = generate_email($self->prepare(%opt));
+  if ( $opt{'attach'} ) {
+    my @attach;
+    if (ref($opt{'attach'}) eq 'ARRAY') {
+      @attach = @{ $opt{'attach'} };
+    } else {
+      @attach = $opt{'attach'};
+    }
+    push @{ $email{mimeparts} }, @attach;
+  }
+
+  send_email(%email);
 }
 
 =item render OPTION => VALUE ...
@@ -463,9 +490,11 @@ sub render {
 
   # Graphics/stylesheets should probably go in /var/www on the Freeside 
   # machine.
+  my $script_path = `/usr/bin/which freeside-wkhtmltopdf`;
+  chomp $script_path;
   my $kit = PDF::WebKit->new(\$html); #%options
   # hack to use our wrapper script
-  $kit->configure(sub { shift->wkhtmltopdf('freeside-wkhtmltopdf') });
+  $kit->configure(sub { shift->wkhtmltopdf($script_path) });
 
   $kit->to_pdf;
 }
@@ -507,6 +536,17 @@ my $usage_warning = sub {
 # If you add anything, be sure to add a description in 
 # httemplate/edit/msg_template.html.
 sub substitutions {
+  my $payinfo_sub = sub { 
+    my $obj = shift;
+    ($obj->payby eq 'CARD' || $obj->payby eq 'CHEK')
+    ? $obj->paymask 
+    : $obj->decrypt($obj->payinfo)
+  };
+  my $payinfo_end = sub {
+    my $obj = shift;
+    my $payinfo = &$payinfo_sub($obj);
+    substr($payinfo, -4);
+  };
   { 'cust_main' => [qw(
       display_custnum agentnum agent_name
 
@@ -597,7 +637,9 @@ sub substitutions {
       _date
       _date_pretty
       due_date
-    )],
+    ),
+      [ due_date2str      => sub { shift->due_date2str('short') } ],
+    ],
     #XXX not really thinking about cust_bill substitutions quite yet
     
     # for welcome and limit warning messages
@@ -651,11 +693,17 @@ sub substitutions {
       # overrides the one in cust_main in cases where a cust_pay is passed
       [ payby             => sub { FS::payby->shortname(shift->payby) } ],
       [ date              => sub { time2str("%a %B %o, %Y", shift->_date) } ],
-      [ payinfo           => sub { 
-          my $cust_pay = shift;
-          ($cust_pay->payby eq 'CARD' || $cust_pay->payby eq 'CHEK') ?
-            $cust_pay->paymask : $cust_pay->decrypt($cust_pay->payinfo)
-        } ],
+      [ 'payinfo' => $payinfo_sub ],
+      [ 'payinfo_end' => $payinfo_end ],
+    ],
+    # for refund receipts
+    'cust_refund' => [
+      'refundnum',
+      [ refund            => sub { sprintf("%.2f", shift->refund) } ],
+      [ payby             => sub { FS::payby->shortname(shift->payby) } ],
+      [ date              => sub { time2str("%a %B %o, %Y", shift->_date) } ],
+      [ 'payinfo' => $payinfo_sub ],
+      [ 'payinfo_end' => $payinfo_end ],
     ],
     # for payment decline messages
     # try to support all cust_pay fields
@@ -667,11 +715,8 @@ sub substitutions {
       [ paid              => sub { sprintf("%.2f", shift->paid) } ],
       [ payby             => sub { FS::payby->shortname(shift->payby) } ],
       [ date              => sub { time2str("%a %B %o, %Y", shift->_date) } ],
-      [ payinfo           => sub {
-          my $pending = shift;
-          ($pending->payby eq 'CARD' || $pending->payby eq 'CHEK') ?
-            $pending->paymask : $pending->decrypt($pending->payinfo)
-        } ],
+      [ 'payinfo' => $payinfo_sub ],
+      [ 'payinfo_end' => $payinfo_end ],
     ],
   };
 }