From 7bab9a9fae4b88014262f7154e54874adcf3d947 Mon Sep 17 00:00:00 2001 From: ivan Date: Tue, 13 Jul 2010 11:09:55 +0000 Subject: [PATCH] notices, RT#8324 --- FS/FS/Mason.pm | 1 + FS/FS/cust_main.pm | 11 ++++ FS/FS/msg_template.pm | 121 +++++++++++++++++++++++++++++++++++++ httemplate/edit/elements/edit.html | 5 ++ httemplate/edit/msg_template.html | 8 ++- httemplate/elements/htmlarea.html | 3 + 6 files changed, 148 insertions(+), 1 deletion(-) 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) 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 diff --git a/httemplate/edit/elements/edit.html b/httemplate/edit/elements/edit.html index 45556efa7..f44dc949b 100644 --- a/httemplate/edit/elements/edit.html +++ b/httemplate/edit/elements/edit.html @@ -304,6 +304,11 @@ Example: % $include_common{$_} = $f->{$_} % foreach grep exists($f->{$_}), qw( hashref agent_virt agent_null_right ); % +% #htmlarea +% $include_common{$_} = $f->{$_} +% foreach grep exists($f->{$_}), qw( width height ); +% +% % if ( $type eq 'tablebreak-tr-title' ) { % $include_common{'table_id'} = 'TableNumber'. $tablenum++; % } diff --git a/httemplate/edit/msg_template.html b/httemplate/edit/msg_template.html index 6632d027a..68725e243 100644 --- a/httemplate/edit/msg_template.html +++ b/httemplate/edit/msg_template.html @@ -3,8 +3,14 @@ 'table' => 'msg_template', 'viewall_dir' => 'browse', 'fields' => [ 'msgname', - { field=>'body', type=>'htmlarea' }, + 'subject', + { field=>'body', type=>'htmlarea', width=>763 }, ], + 'labels' => { 'msgnum' => 'Template', + 'msgname' => 'Template name', + 'subject' => 'Message subject', + 'body' => 'Message template', + }, ) %> <%init> diff --git a/httemplate/elements/htmlarea.html b/httemplate/elements/htmlarea.html index dca4328ab..f00c77360 100644 --- a/httemplate/elements/htmlarea.html +++ b/httemplate/elements/htmlarea.html @@ -22,6 +22,9 @@ Example: oFCKeditor.BasePath = '<% $p %>elements/fckeditor/'; oFCKeditor.Config['SkinPath'] = '<% $p %>elements/fckeditor/editor/skins/silver/'; +% if ( $opt{'width'} ) { + oFCKeditor.Width = '<% $opt{'width'} %>'; +% } oFCKeditor.Height = '<% $opt{'height'} || 420 %>'; oFCKeditor.Config['StartupFocus'] = true; oFCKeditor.Config['EnterMode'] = 'br'; -- 2.11.0