[freeside-commits] branch FREESIDE_4_BRANCH updated. a21c042fccdbd38eaa73e4374d2fdf9c91789fb7

Christopher Burger burgerc at freeside.biz
Tue Jun 12 11:35:10 PDT 2018


The branch, FREESIDE_4_BRANCH has been updated
       via  a21c042fccdbd38eaa73e4374d2fdf9c91789fb7 (commit)
       via  3a9d703acf5e6bf849770b3a0d99cfd0926754f4 (commit)
       via  20662e6bb4ef329b4be8d53ed2a3968d2e35f4a1 (commit)
       via  91681d4c4832030a86e8565d7ec2c46c94eebc8d (commit)
      from  42b35cdaeb0643630eda0513556a8e668fbcb8e2 (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 a21c042fccdbd38eaa73e4374d2fdf9c91789fb7
Author: Christopher Burger <burgerc at freeside.biz>
Date:   Mon Sep 11 11:17:52 2017 -0400

    RT# 73964 - updated config description again to an even better description of the email-to-voice_domain configuration option

diff --git a/FS/FS/Conf.pm b/FS/FS/Conf.pm
index 139424696..36b330c91 100644
--- a/FS/FS/Conf.pm
+++ b/FS/FS/Conf.pm
@@ -931,7 +931,7 @@ my $validate_email = sub { $_[0] =~
   {
     'key'         => 'email-to-voice_domain',
     'section'     => 'email_to_voice_services',
-    'description' => 'The domain name used to send emails to a 3rd party email to voice service.  You will be able to select a phone number to append to this domain on the email customer page or when using the email to voice billing event action.',
+    'description' => 'The domain name that phone numbers will be attached to for sending email to voice emails via a 3rd party email to voice service.  You will get this domain from your email to voice service provider.  This is utilized on the email customer page or when using the email to voice billing event action.  There you will be able to select the phone number for the email to voice service.',
     'type'        => 'text',
     'per_agent'   => 1,
   },

commit 3a9d703acf5e6bf849770b3a0d99cfd0926754f4
Author: Christopher Burger <burgerc at freeside.biz>
Date:   Tue Aug 29 11:50:18 2017 -0400

    RT# 73964 - updated config description to better explain the email-to-voice_domain configuration option

diff --git a/FS/FS/Conf.pm b/FS/FS/Conf.pm
index 8dc74e9f9..139424696 100644
--- a/FS/FS/Conf.pm
+++ b/FS/FS/Conf.pm
@@ -931,7 +931,7 @@ my $validate_email = sub { $_[0] =~
   {
     'key'         => 'email-to-voice_domain',
     'section'     => 'email_to_voice_services',
-    'description' => 'The Domain to send email to voice to',
+    'description' => 'The domain name used to send emails to a 3rd party email to voice service.  You will be able to select a phone number to append to this domain on the email customer page or when using the email to voice billing event action.',
     'type'        => 'text',
     'per_agent'   => 1,
   },
diff --git a/FS/FS/part_event/Action/notice_to_emailtovoice.pm b/FS/FS/part_event/Action/notice_to_emailtovoice.pm
index a3a5e9824..3eaa73850 100644
--- a/FS/FS/part_event/Action/notice_to_emailtovoice.pm
+++ b/FS/FS/part_event/Action/notice_to_emailtovoice.pm
@@ -33,7 +33,7 @@ sub option_fields {
                                              'fax'     => 'Fax #',
                                              'daytime' => 'Day Time #',
                                            },
-                     'post_field_label' => "@", # . $to_domain ,
+                     'post_field_label' => ' <font color="red">Make sure you have setup your email-to-voice_domain config option in your Configuration settings.</font>',
                    },
 
     'msgnum'    => { 'label'    => 'Template',

commit 20662e6bb4ef329b4be8d53ed2a3968d2e35f4a1
Author: Christopher Burger <burgerc at freeside.biz>
Date:   Tue Aug 22 10:36:04 2017 -0400

    RT# 73964 - Changed global config send-to-domain to email-to-voice_domain

diff --git a/FS/FS/Conf.pm b/FS/FS/Conf.pm
index 604d0ca79..8dc74e9f9 100644
--- a/FS/FS/Conf.pm
+++ b/FS/FS/Conf.pm
@@ -929,7 +929,7 @@ my $validate_email = sub { $_[0] =~
   },
 
   {
-    'key'         => 'send-to-domain',
+    'key'         => 'email-to-voice_domain',
     'section'     => 'email_to_voice_services',
     'description' => 'The Domain to send email to voice to',
     'type'        => 'text',
diff --git a/FS/FS/cust_main_Mixin.pm b/FS/FS/cust_main_Mixin.pm
index 7eeb9c96a..8b6569a74 100644
--- a/FS/FS/cust_main_Mixin.pm
+++ b/FS/FS/cust_main_Mixin.pm
@@ -409,7 +409,7 @@ sub email_search_result {
   my($class, $param) = @_;
 
   my $conf = FS::Conf->new;
-  my $send_to_domain = $conf->config('send-to-domain');
+  my $send_to_domain = $conf->config('email-to-voice_domain');
 
   my $msgnum = $param->{msgnum};
   my $from = delete $param->{from};
diff --git a/FS/FS/part_event/Action/notice_to_emailtovoice.pm b/FS/FS/part_event/Action/notice_to_emailtovoice.pm
index ae766e81b..a3a5e9824 100644
--- a/FS/FS/part_event/Action/notice_to_emailtovoice.pm
+++ b/FS/FS/part_event/Action/notice_to_emailtovoice.pm
@@ -23,7 +23,7 @@ sub eventtable_hashref {
 sub option_fields {
 
   #my $conf = new FS::Conf;
-  #my $to_domain = $conf->config('send-to-domain');
+  #my $to_domain = $conf->config('email-to-voice_domain');
 
 (
     'to_name'   => { 'label'            => 'Address To',
@@ -33,7 +33,7 @@ sub option_fields {
                                              'fax'     => 'Fax #',
                                              'daytime' => 'Day Time #',
                                            },
-                     'post_field_label' => "@" , #. $to_domain ,
+                     'post_field_label' => "@", # . $to_domain ,
                    },
 
     'msgnum'    => { 'label'    => 'Template',
@@ -53,7 +53,7 @@ sub do_action {
   my( $self, $object ) = @_;
 
   my $conf = new FS::Conf;
-  my $to_domain = $conf->config('send-to-domain')
+  my $to_domain = $conf->config('email-to-voice_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);
diff --git a/httemplate/misc/email-customers.html b/httemplate/misc/email-customers.html
index 53229ae0b..445ede248 100644
--- a/httemplate/misc/email-customers.html
+++ b/httemplate/misc/email-customers.html
@@ -272,7 +272,7 @@ die "access denied"
 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 $send_to_domain = $conf->config('email-to-voice_domain');
 
 my $form_action = $opt{'form_action'} || 'email-customers.html';
 my $process_url = $opt{'process_url'} || 'process/email-customers.html';

commit 91681d4c4832030a86e8565d7ec2c46c94eebc8d
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 5c55d2e68..604d0ca79 100644
--- a/FS/FS/Conf.pm
+++ b/FS/FS/Conf.pm
@@ -929,6 +929,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 f8f117371..7eeb9c96a 100644
--- a/FS/FS/cust_main_Mixin.pm
+++ b/FS/FS/cust_main_Mixin.pm
@@ -408,14 +408,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";
   
@@ -476,10 +483,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 000000000..ae766e81b
--- /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 b95697463..5f09b128a 100644
--- a/httemplate/config/config-view.cgi
+++ b/httemplate/config/config-view.cgi
@@ -439,7 +439,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 000000000..94cd41322
--- /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 689566e36..100df94d0 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 000000000..cf88392b0
--- /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 f7a1eb4c1..53229ae0b 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';
@@ -343,12 +384,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,
@@ -369,14 +412,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);
+        }
       }
     }
   }
@@ -385,10 +436,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