[freeside-commits] branch master updated. 7d80f005462758e0271215240cdf99a9336f03dd

Christopher Burger burgerc at 420.am
Wed Aug 16 07:56:59 PDT 2017


The branch, master has been updated
       via  7d80f005462758e0271215240cdf99a9336f03dd (commit)
      from  d7dd43d69c648433cd34f26a339465452082a097 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
commit 7d80f005462758e0271215240cdf99a9336f03dd
Author: Christopher Burger <burgerc at freeside.biz>
Date:   Wed Aug 16 10:55:56 2017 -0400

    RT# 73964 - Added biling event action to send an email to phone nunber, and updated email a notice to customer to allow emailing to phone number for email_to_voice service.

diff --git a/FS/FS/Conf.pm b/FS/FS/Conf.pm
index d41cc74..02e65f5 100644
--- a/FS/FS/Conf.pm
+++ b/FS/FS/Conf.pm
@@ -898,6 +898,14 @@ my $validate_email = sub { $_[0] =~
   },
 
   {
+    'key'         => 'send-to-domain',
+    'section'     => 'email_to_voice_services',
+    'description' => 'The Domain to send email to voice to',
+    'type'        => 'text',
+    'per_agent'   => 1,
+  },
+
+  {
     'key'         => 'next-bill-ignore-time',
     'section'     => 'billing',
     'description' => 'Ignore the time portion of next bill dates when billing, matching anything from 00:00:00 to 23:59:59 on the billing day.',
diff --git a/FS/FS/cust_main_Mixin.pm b/FS/FS/cust_main_Mixin.pm
index 1955746..5f9a3d6 100644
--- a/FS/FS/cust_main_Mixin.pm
+++ b/FS/FS/cust_main_Mixin.pm
@@ -397,14 +397,21 @@ use Digest::SHA qw(sha1); # for duplicate checking
 sub email_search_result {
   my($class, $param) = @_;
 
+  my $conf = FS::Conf->new;
+  my $send_to_domain = $conf->config('send-to-domain');
+
   my $msgnum = $param->{msgnum};
   my $from = delete $param->{from};
   my $subject = delete $param->{subject};
   my $html_body = delete $param->{html_body};
   my $text_body = delete $param->{text_body};
   my $to_contact_classnum = delete $param->{to_contact_classnum};
+  my $emailtovoice_name = delete $param->{emailtovoice_contact};
+
   my $error = '';
 
+  my $to = $emailtovoice_name . '@' . $send_to_domain unless !$emailtovoice_name;
+
   my $job = delete $param->{'job'}
     or die "email_search_result must run from the job queue.\n";
   
@@ -465,10 +472,14 @@ sub email_search_result {
       next; # unlinked object; nothing else we can do
     }
 
+my %to = {};
+if ($to) { $to{'to'} = $to; }
+
     my $cust_msg = $msg_template->prepare(
       'cust_main' => $cust_main,
       'object'    => $obj,
       'to_contact_classnum' => $to_contact_classnum,
+      %to,
     );
 
     # For non-cust_main searches, we avoid duplicates based on message
diff --git a/FS/FS/part_event/Action/notice_to_emailtovoice.pm b/FS/FS/part_event/Action/notice_to_emailtovoice.pm
new file mode 100644
index 0000000..ae766e8
--- /dev/null
+++ b/FS/FS/part_event/Action/notice_to_emailtovoice.pm
@@ -0,0 +1,84 @@
+package FS::part_event::Action::notice_to_emailtovoice;
+
+use strict;
+use base qw( FS::part_event::Action );
+use FS::Record qw( qsearchs );
+use FS::msg_template;
+use FS::Conf;
+
+sub description { 'Email a email to voice notice'; }
+
+sub eventtable_hashref {
+    {
+      'cust_main'      => 1,
+      'cust_bill'      => 1,
+      'cust_pkg'       => 1,
+      'cust_pay'       => 1,
+      'cust_pay_batch' => 1,
+      'cust_statement' => 1,
+      'svc_acct'       => 1,
+    };
+}
+
+sub option_fields {
+
+  #my $conf = new FS::Conf;
+  #my $to_domain = $conf->config('send-to-domain');
+
+(
+    'to_name'   => { 'label'            => 'Address To',
+                     'type'             => 'select',
+                     'options'          => [ 'mobile', 'fax', 'daytime' ],
+                     'option_labels'    => { 'mobile'  => 'Mobile Phone #',
+                                             'fax'     => 'Fax #',
+                                             'daytime' => 'Day Time #',
+                                           },
+                     'post_field_label' => "@" , #. $to_domain ,
+                   },
+
+    'msgnum'    => { 'label'    => 'Template',
+                     'type'     => 'select-table',
+                     'table'    => 'msg_template',
+                     'name_col' => 'msgname',
+                     'hashref'  => { disabled => '' },
+                     'disable_empty' => 1,
+                },
+  );
+
+}
+
+sub default_weight { 56; } #?
+
+sub do_action {
+  my( $self, $object ) = @_;
+
+  my $conf = new FS::Conf;
+  my $to_domain = $conf->config('send-to-domain')
+    or die "Can't send notice with out send-to-domain, being set in global config \n";
+
+  my $cust_main = $self->cust_main($object);
+
+  my $msgnum = $self->option('msgnum');
+  my $name = $self->option('to_name');
+
+  my $msg_template = qsearchs('msg_template', { 'msgnum' => $msgnum } )
+      or die "Template $msgnum not found";
+
+  my $to_name = $cust_main->$name
+    or die "Can't send notice with out " . $cust_main->$name . " number set";
+
+  ## remove - from phone number
+  $to_name =~ s/-//g;
+
+  #my $to = $to_name . '@' . $self->option('to_domain');
+  my $to = $to_name . '@' . $to_domain;
+  
+  $msg_template->send(
+    'to'        => $to,
+    'cust_main' => $cust_main,
+    'object'    => $object,
+  );
+
+}
+
+1;
diff --git a/httemplate/config/config-view.cgi b/httemplate/config/config-view.cgi
index edbda5c..b02ab1a 100644
--- a/httemplate/config/config-view.cgi
+++ b/httemplate/config/config-view.cgi
@@ -435,7 +435,7 @@ my @sections = (qw(
     important
     billing payments payment_batching credit_cards e-checks taxation
     packages suspension cancellation
-    printing print_services
+    printing print_services email_to_voice_services
       invoicing invoice_email invoice_balances invoice_templates quotations 
     notification UI addresses customer_number customer_fields reporting
     localization scalability backup
diff --git a/httemplate/elements/select-cust_phone.html b/httemplate/elements/select-cust_phone.html
new file mode 100644
index 0000000..94cd413
--- /dev/null
+++ b/httemplate/elements/select-cust_phone.html
@@ -0,0 +1,31 @@
+<SELECT NAME="<% $opt{'field_name'} %>" ID="<% $opt{'field_name'} %>">
+
+     <OPTION VALUE="" selected="selected">Select a phone number
+
+% foreach $p (@$phone_types) {
+	<OPTION VALUE="<% $phones_formatted{$p} %>"><% $p |h%> (<% $cust_phones->$p |h %>)		
+%}
+
+</SELECT>
+
+<%init>
+
+my %opt = @_;
+my $cust_num     = $opt{'cust_num'};
+my $phone_types  = $opt{'phone_types'};
+my $format 	  = $opt{'format'};
+
+my $cust_phones = qsearchs('cust_main', { 'custnum' => $cust_num })
+  or die 'unknown custnum' . $cust_num;
+
+my %phones_formatted = map {
+	$_ => format_phone_number($cust_phones->$_, $format)
+} @$phone_types;
+
+sub format_phone_number {
+	my ($n, $f) = @_;
+	if ($f eq 'xxxxxxxxxx') { $n =~ s/-//g; }	
+	return $n;
+}
+
+</%init>
\ No newline at end of file
diff --git a/httemplate/elements/select.html b/httemplate/elements/select.html
index 689566e..100df94 100644
--- a/httemplate/elements/select.html
+++ b/httemplate/elements/select.html
@@ -69,7 +69,7 @@
 %
 % }
 
-</SELECT>
+</SELECT> <% $opt{'post_field_label'} %>
 
 % }
 <%init>
diff --git a/httemplate/elements/tr-select-cust_phone.html b/httemplate/elements/tr-select-cust_phone.html
new file mode 100644
index 0000000..cf88392
--- /dev/null
+++ b/httemplate/elements/tr-select-cust_phone.html
@@ -0,0 +1,12 @@
+  <TR>
+    <TD ALIGN="right"><% $opt{'label'} || 'Customer Phones' %></TD>
+    <TD>
+      <% include( '/elements/select-cust_phone.html', %opt ) %>
+    </TD>
+  </TR>
+
+<%init>
+
+my %opt = @_;
+
+</%init>
diff --git a/httemplate/misc/email-customers.html b/httemplate/misc/email-customers.html
index 0ed5ef3..5083fcd 100644
--- a/httemplate/misc/email-customers.html
+++ b/httemplate/misc/email-customers.html
@@ -58,7 +58,7 @@ from/subject/body cgi params
     <FONT SIZE="+2">Preview notice</FONT>
     <& /elements/progress-init.html,
                  'OneTrueForm',
-                 [ qw( search table msgnum to_contact_classnum ) ],
+                 [ qw( search table msgnum to_contact_classnum emailtovoice_contact custnum ) ],
                  $process_url,
                  $pdest,
     &>
@@ -69,6 +69,8 @@ from/subject/body cgi params
 %   # of the template, but should be sticky during draft editing
     <INPUT TYPE="hidden" NAME="from_name" VALUE="<% scalar($cgi->param('from_name')) |h %>">
     <INPUT TYPE="hidden" NAME="from_addr" VALUE="<% scalar($cgi->param('from_addr')) |h %>">
+    <INPUT TYPE="hidden" NAME="emailtovoice_contact" VALUE="<% scalar($cgi->param('emailtovoice_contact')) |h %>">
+    <INPUT TYPE="hidden" NAME="custnum" VALUE="<% scalar($cgi->param('custnum')) |h %>">
 
 %   if ( !$msg_template->disabled ) {
       <& /elements/tr-td-label.html, 'label' => 'Template:' &>
@@ -164,7 +166,11 @@ Template:
     <BR>
 % }
 % # select destination contact classes
-Send to contacts:
+<TABLE CELLSPACING=0 id="send_to_contacts_table">
+<TR>
+ <TD>Send to contacts:</TD>
+ <TD>
+   <div id="contactclassesdiv">
   <& /elements/checkboxes.html,
     'style'               => 'display: inline; vertical-align: top',
     'disable_links'       => 1,
@@ -175,6 +181,24 @@ Send to contacts:
       $name eq 'invoice' #others default to unchecked
     },
   &>
+   </div>
+% if ($send_to_domain) {
+   <div>
+     <INPUT TYPE="checkbox" NAME="emailtovoice"  ID="emailtovoice" VALUE="ON" onclick="toggleDiv(this)">Email to voice
+   </div>
+   <div id="emailtovoicediv" style="display:none";>
+
+      <& /elements/select-cust_phone.html,
+               'cust_num'     => $cgi->param('custnum'),
+               'field_name'   => 'emailtovoice_contact',
+               'format'       => 'xxxxxxxxxx',
+               'phone_types'  => [ 'daytime', 'night', 'fax', 'mobile' ],
+      &>@<% $send_to_domain |h %>
+   </div>
+% }
+ </TD>
+</TR>
+</TABLE>
 <BR>
 % # if sending a one-off message, show a form to edit it
   <TABLE BGCOLOR="#cccccc" CELLSPACING=0 WIDTH="100%" id="table_no_template">
@@ -213,12 +237,25 @@ Send to contacts:
 
   </TABLE>
 
+  <INPUT TYPE="hidden" NAME="custnum" VALUE="<% scalar($cgi->param('custnum')) |h %>">
   <INPUT TYPE="submit" NAME="preview" VALUE="Preview notice">
 
 % } #end not action or alternate form
 
 </FORM>
 
+<SCRIPT TYPE="text/javascript">
+function toggleDiv(obj) {
+  var box_contactclasses = document.getElementById('contactclassesdiv');
+  var box_emailtovoice = document.getElementById('emailtovoicediv');
+
+  box_emailtovoice.style.display = (box_emailtovoice.style.display == 'none') ? 'block' : 'none';
+  document.getElementById('emailtovoice_contact').options[0].selected=true;
+
+  box_contactclasses.style.display = (box_contactclasses.style.display == 'none') ? 'block' : 'none';
+}
+</SCRIPT>
+
 <& /elements/footer.html &>
 
 <%init>
@@ -227,12 +264,16 @@ my %opt = @_;
 
 $opt{'acl'} ||= 'Bulk send customer notices';
 
+my $email_to;
+
 die "access denied"
   unless $FS::CurrentUser::CurrentUser->access_right($opt{'acl'});
 
 my $conf = FS::Conf->new;
 my @no_search_fields = qw( table from subject html_body text_body popup url );
 
+my $send_to_domain = $conf->config('send-to-domain');
+
 my $form_action = $opt{'form_action'} || 'email-customers.html';
 my $process_url = $opt{'process_url'} || 'process/email-customers.html';
 my $title = $opt{'title'} || 'Send customer notices';
@@ -341,12 +382,14 @@ if ( !$cgi->param('preview') ) {
   # unless creating the msg_template failed, we now have one, so construct a
   # preview message from the first customer/whatever in the search results
 
+  my $cust;
+
   if ( $msg_template ) { 
     $sql_query->{'extra_sql'} .= ' LIMIT 1';
     $sql_query->{'select'} = "$table.*";
     $sql_query->{'order_by'} = '';
     my $object = qsearchs($sql_query);
-    my $cust = $object->cust_main;
+    $cust = $object->cust_main;
     my %msgopts = (
       'cust_main' => $cust,
       'object' => $object,
@@ -367,14 +410,22 @@ if ( !$cgi->param('preview') ) {
   # contact_class_X params
   #we can't switch to multi_param until we're done supporting deb 7
   local($CGI::LIST_CONTEXT_WARN) = 0;
-  foreach my $param ( $cgi->param ) {
-    if ( $param =~ /^contact_class_(\w+)$/ ) {
-      push @contact_classnum, $1;
-      if ( $1 eq 'invoice' ) {
-        push @contact_classname, 'Invoice recipients';
-      } else {
-        my $contact_class = FS::contact_class->by_key($1);
-        push @contact_classname, encode_entities($contact_class->classname);
+
+  if ($cgi->param('emailtovoice_contact')) {
+    $email_to = $cgi->param('emailtovoice_contact') . '@' . $send_to_domain;
+    push @contact_classnum, 'emailtovoice';
+    push @contact_classname, $email_to;
+  }
+  else {
+    foreach my $param ( $cgi->param ) {
+      if ( $param =~ /^contact_class_(\w+)$/ ) {
+        push @contact_classnum, $1;
+        if ( $1 eq 'invoice' ) {
+          push @contact_classname, 'Invoice recipients';
+        } else {
+          my $contact_class = FS::contact_class->by_key($1);
+          push @contact_classname, encode_entities($contact_class->classname);
+        }
       }
     }
   }
@@ -383,10 +434,12 @@ if ( !$cgi->param('preview') ) {
 my @contact_checkboxes = (
   [ 'invoice' => { label => 'Invoice recipients' } ]
 );
+
 foreach my $class (qsearch('contact_class', { disabled => '' })) {
   push @contact_checkboxes, [
     $class->classnum,
     { label => $class->classname }
   ];
 }
+
 </%init>

-----------------------------------------------------------------------

Summary of changes:
 FS/FS/Conf.pm                                     |    8 ++
 FS/FS/cust_main_Mixin.pm                          |   11 +++
 FS/FS/part_event/Action/notice_to_emailtovoice.pm |   84 +++++++++++++++++++++
 httemplate/config/config-view.cgi                 |    2 +-
 httemplate/elements/select-cust_phone.html        |   31 ++++++++
 httemplate/elements/select.html                   |    2 +-
 httemplate/elements/tr-select-cust_phone.html     |   12 +++
 httemplate/misc/email-customers.html              |   75 +++++++++++++++---
 8 files changed, 212 insertions(+), 13 deletions(-)
 create mode 100644 FS/FS/part_event/Action/notice_to_emailtovoice.pm
 create mode 100644 httemplate/elements/select-cust_phone.html
 create mode 100644 httemplate/elements/tr-select-cust_phone.html




More information about the freeside-commits mailing list