Allow passing of 'allow_pkgpart' and 'import' flags up the chain to FS::cust_pkg...
[freeside.git] / FS / FS / msg_template.pm
index 011ce24..4e1f4da 100644 (file)
@@ -3,7 +3,7 @@ package FS::msg_template;
 use strict;
 use base qw( FS::Record );
 use Text::Template;
-use FS::Misc qw( generate_email send_email );
+use FS::Misc qw( generate_email send_email do_print );
 use FS::Conf;
 use FS::Record qw( qsearch qsearchs );
 use FS::UID qw( dbh );
@@ -16,6 +16,7 @@ use Date::Format qw( time2str );
 use HTML::Entities qw( decode_entities encode_entities ) ;
 use HTML::FormatText;
 use HTML::TreeBuilder;
+use Encode;
 
 use File::Temp;
 use IPC::Run qw(run);
@@ -410,6 +411,10 @@ sub prepare {
 #    @cust_msg = ('cust_msg' => $cust_msg);
 #  }
 
+  my $text_body = encode('UTF-8',
+                  HTML::FormatText->new(leftmargin => 0, rightmargin => 70)
+                      ->format( HTML::TreeBuilder->new_from_content($body) )
+                  );
   (
     'custnum' => $cust_main->custnum,
     'msgnum'  => $self->msgnum,
@@ -418,8 +423,7 @@ sub prepare {
     'bcc'  => $self->bcc_addr || undef,
     'subject'   => $subject,
     'html_body' => $body,
-    'text_body' => HTML::FormatText->new(leftmargin => 0, rightmargin => 70
-                    )->format( HTML::TreeBuilder->new_from_content($body) ),
+    'text_body' => $text_body
   );
 
 }
@@ -457,24 +461,13 @@ sub render {
   my %hash = $self->prepare(%opt);
   my $html = $hash{'html_body'};
 
-  my $tmp = 'msg'.$self->msgnum.'-'.time2str('%Y%m%d', time).'-XXXXXXXX';
-  my $dir = "$FS::UID::cache_dir/cache.$FS::UID::datasrc";
-
   # Graphics/stylesheets should probably go in /var/www on the Freeside 
   # machine.
   my $kit = PDF::WebKit->new(\$html); #%options
   # hack to use our wrapper script
   $kit->configure(sub { shift->wkhtmltopdf('freeside-wkhtmltopdf') });
-  my $fh = File::Temp->new(
-    TEMPLATE  => $tmp,
-    DIR       => $dir,
-    UNLINK    => 0,
-    SUFFIX    => '.pdf'
-  );
 
-  print $fh $kit->to_pdf;
-  close $fh;
-  return $fh->filename;
+  $kit->to_pdf;
 }
 
 =item print OPTIONS
@@ -485,12 +478,7 @@ Render a PDF and send it to the printer.  OPTIONS are as for 'render'.
 
 sub print {
   my( $self, %opt ) = @_;
-  my $file = $self->render(%opt);
-
-  my $lpr = $conf->config('lpr', $opt{'cust_main'}->agentnum );
-
-  run ( $lpr, '<', $file)
-    or die "lpr error:\n$?\n";
+  do_print( [ $self->render(%opt) ], agentnum=>$opt{cust_main}->agentnum );
 }
 
 # helper sub for package dates
@@ -744,6 +732,64 @@ sub _upgrade_data {
         $conf->delete($subject, $agentnum) if $subject;
       }
     }
+
+    if ( $conf->exists('alert_expiration', $agentnum) ) {
+      my $msgnum = $conf->exists('alerter_msgnum', $agentnum);
+      my $template = FS::msg_template->by_key($msgnum) if $msgnum;
+      if (!$template) {
+        warn "template for alerter_msgnum $msgnum not found\n";
+        next;
+      }
+      # this is now a set of billing events
+      foreach my $days (30, 15, 5) {
+        my $event = FS::part_event->new({
+            'agentnum'    => $agentnum,
+            'event'       => "Card expiration warning - $days days",
+            'eventtable'  => 'cust_main',
+            'check_freq'  => '1d',
+            'action'      => 'notice',
+            'disabled'    => 'Y', #initialize first
+        });
+        my $error = $event->insert( 'msgnum' => $msgnum );
+        if ($error) {
+          warn "error creating expiration alert event:\n$error\n\n";
+          next;
+        }
+        # make it work like before:
+        # only send each warning once before the card expires,
+        # only warn active customers,
+        # only warn customers with CARD/DCRD,
+        # only warn customers who get email invoices
+        my %conds = (
+          'once_every'          => { 'run_delay' => '30d' },
+          'cust_paydate_within' => { 'within' => $days.'d' },
+          'cust_status'         => { 'status' => { 'active' => 1 } },
+          'payby'               => { 'payby'  => { 'CARD' => 1,
+                                                   'DCRD' => 1, }
+                                   },
+          'message_email'       => {},
+        );
+        foreach (keys %conds) {
+          my $condition = FS::part_event_condition->new({
+              'conditionname' => $_,
+              'eventpart'     => $event->eventpart,
+          });
+          $error = $condition->insert( %{ $conds{$_} });
+          if ( $error ) {
+            warn "error creating expiration alert event:\n$error\n\n";
+            next;
+          }
+        }
+        $error = $event->initialize;
+        if ( $error ) {
+          warn "expiration alert event was created, but not initialized:\n$error\n\n";
+        }
+      } # foreach $days
+      $conf->delete('alerter_msgnum', $agentnum);
+      $conf->delete('alert_expiration', $agentnum);
+
+    } # if alerter_msgnum
+
   }
   foreach my $msg_template ( qsearch('msg_template', {}) ) {
     if ( $msg_template->subject || $msg_template->body ) {