From f9a89c91cab9e85a7ca8dd67782919f8a85c2ebb Mon Sep 17 00:00:00 2001 From: ivan Date: Tue, 13 Jul 2010 11:09:38 +0000 Subject: [PATCH] notices, RT#8324 --- FS/FS/Mason.pm | 1 + FS/FS/Schema.pm | 1 + FS/FS/msg_template.pm | 121 ++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 123 insertions(+) diff --git a/FS/FS/Mason.pm b/FS/FS/Mason.pm index aec6342b0..20748dc1d 100644 --- a/FS/FS/Mason.pm +++ b/FS/FS/Mason.pm @@ -484,6 +484,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/Schema.pm b/FS/FS/Schema.pm index 7c30b4331..1bfce613c 100644 --- a/FS/FS/Schema.pm +++ b/FS/FS/Schema.pm @@ -2911,6 +2911,7 @@ sub tables_hashref { 'msgnum', 'serial', '', '', '', '', 'msgname', 'varchar', '', $char_d, '', '', 'agentnum', 'int', 'NULL', '', '', '', + 'subject', 'varchar', 'NULL', 512, '', '', 'mime_type', 'varchar', '', $char_d, '', '', 'body', 'blob', 'NULL', '', '', '', 'disabled', 'char', 'NULL', 1, '', '', 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 -- 2.11.0