diff options
Diffstat (limited to 'FS')
| -rw-r--r-- | FS/FS/Mason.pm | 1 | ||||
| -rw-r--r-- | FS/FS/cust_main.pm | 11 | ||||
| -rw-r--r-- | FS/FS/msg_template.pm | 121 | 
3 files changed, 133 insertions, 0 deletions
| diff --git a/FS/FS/Mason.pm b/FS/FS/Mason.pm index e7cae4994..00b955c9d 100644 --- a/FS/FS/Mason.pm +++ b/FS/FS/Mason.pm @@ -446,6 +446,7 @@ sub mason_interps {      escape_flags => { 'js_string' => sub {                          #${$_[0]} =~ s/(['\\\n])/'\\'.($1 eq "\n" ? 'n' : $1)/ge;                          ${$_[0]} =~ s/(['\\])/\\$1/g; +                        ${$_[0]} =~ s/\r/\\r/g;                          ${$_[0]} =~ s/\n/\\n/g;                          ${$_[0]} = "'". ${$_[0]}. "'";                        } diff --git a/FS/FS/cust_main.pm b/FS/FS/cust_main.pm index ad61d8c1b..bc1838ebe 100644 --- a/FS/FS/cust_main.pm +++ b/FS/FS/cust_main.pm @@ -2385,6 +2385,17 @@ sub agent {    qsearchs( 'agent', { 'agentnum' => $self->agentnum } );  } +=item agent_name + +Returns the agent name (see L<FS::agent>) for this customer. + +=cut + +sub agent_name { +  my $self = shift; +  $self->agent->agent; +} +  =item bill_and_collect   Cancels and suspends any packages due, generates bills, applies payments and diff --git a/FS/FS/msg_template.pm b/FS/FS/msg_template.pm index 7bf050441..83acde245 100644 --- a/FS/FS/msg_template.pm +++ b/FS/FS/msg_template.pm @@ -2,6 +2,9 @@ package FS::msg_template;  use strict;  use base qw( FS::Record ); +use Text::Template; +use FS::Misc qw( generate_email send_email ); +use FS::Conf;  use FS::Record qw( qsearch qsearchs );  =head1 NAME @@ -130,6 +133,124 @@ sub check {    $self->SUPER::check;  } +=item send OPTION => VALUE, ... + +Fills in the template and emails it to the customer. + +Options are passed as a list of name/value pairs: + +=over 4 + +=item cust_main + +Customer object (required). + +=item object + +Additional context object (currently, can be a cust_main object, cust_pkg +object, or cust_bill object). + +=back + +=cut + +sub send { +  my( $self, %opt ) = @_; + +  my $cust_main = $opt{'cust_main'}; +  my $object = $opt{'object'}; + +  ### +  # fill-in +  ### + +  my $subs = $self->substitutions; +   +  use Data::Dumper; +  warn Dumper($subs); + +  #XXX html escape this stuff +  my %hash = map { $_ => $cust_main->$_() } @{ $subs->{'cust_main'} }; +  unless ( ! $object || $object->table eq 'cust_main' ) { +    %hash = ( %hash, map { $_ => $object->$_() } @{ $subs->{$object->table} } ); +  } +  warn Dumper(\%hash); + +  my $subject_tmpl = new Text::Template ( +    TYPE   => 'STRING', +    SOURCE => $self->subject, +  ); +  my $subject = $subject_tmpl->fill_in( HASH => \%hash ); + +  my $body_tmpl = new Text::Template ( +    TYPE   => 'STRING', +    SOURCE => $self->body, +  ); +  my $body = $body_tmpl->fill_in( HASH => \%hash ); + +  ### +  # and email +  ### + +  my @to = $cust_main->invoicing_list_emailonly; +  #unless (@to) { #XXX do something } + +  my $conf = new FS::Conf; + +  send_email( +    generate_email( +       #XXX override from in event? +      'from' => scalar( $conf->config('invoice_from', $cust_main->agentnum) ), +      'to'   => \@to, +      'subject'   => $subject, +      'html_body' => $body, +      #XXX auto-make a text copy w/HTML::FormatText? +      #  alas, us luddite mutt/pine users just aren't that big a deal +    ) +  ); + +} + +#return contexts and fill-in values +sub substitutions { +  { 'cust_main' => [qw( +      display_custnum agentnum agent_name + +      last first company +      name name_short contact contact_firstlast +      address1 address2 city county state zip +      country +      daytime night fax + +      has_ship_address +      ship_last ship_first ship_company +      ship_name ship_name_short ship_contact ship_contact_firstlast +      ship_address1 ship_address2 ship_city ship_county ship_state ship_zip +      ship_country +      ship_daytime ship_night ship_fax + +      payby paymask payname paytype payip +      num_cancelled_pkgs num_ncancelled_pkgs num_pkgs +      classname categoryname +      balance +      invoicing_list_emailonly +      cust_status ucfirst_cust_status cust_statuscolor +    )], +    #XXX make these pretty: signupdate dundate paydate_monthyear usernum +    # next_bill_date + +    'cust_pkg'  => [qw( +    )], +    #XXX these are going to take more pretty-ing up + +    'cust_bill' => [qw( +      invnum +    )], +    #XXX not really thinking about cust_bill substitutions quite yet + +  }; +} +  =back  =head1 BUGS | 
