RT# 82094 - updated UI for bulk emailing from advanced customer reports
authorChristopher Burger <burgerc@freeside.biz>
Tue, 5 Feb 2019 17:09:46 +0000 (12:09 -0500)
committerChristopher Burger <burgerc@freeside.biz>
Tue, 5 Feb 2019 17:09:46 +0000 (12:09 -0500)
FS/FS/ConfDefaults.pm
FS/FS/UI/Web.pm
FS/FS/cust_main.pm
httemplate/misc/email-customers.html
httemplate/search/cust_main.html

index 2c24b13..bd58934 100644 (file)
@@ -56,6 +56,9 @@ sub cust_fields_avail { (
   'Cust# | Cust. Status | Name | Company' =>
     'custnum | Status | Last, First | Company',
 
   'Cust# | Cust. Status | Name | Company' =>
     'custnum | Status | Last, First | Company',
 
+  'Cust# | Cust. Status | Name | Company | Address 1 | Address 2 | City | State | Zip | Country | Day phone | Night phone | Mobile phone | Fax number | Contact email(s) | Invoices | Messages' =>
+    'custnum | Status | Last, First | Company | (address) | (all phones) | Contact email(s)',
+
   'Cust# | Cust. Status | Name | Company | Address 1 | Address 2 | City | State | Zip | Country | Day phone | Night phone | Mobile phone | Fax number | Invoicing email(s)' =>
     'custnum | Status | Last, First | Company | (address) | (all phones) | Invoicing email(s)',
 
   'Cust# | Cust. Status | Name | Company | Address 1 | Address 2 | City | State | Zip | Country | Day phone | Night phone | Mobile phone | Fax number | Invoicing email(s)' =>
     'custnum | Status | Last, First | Company | (address) | (all phones) | Invoicing email(s)',
 
index 5412868..8a1d502 100644 (file)
@@ -343,6 +343,9 @@ sub cust_header {
     '(service) Latitude'       => 'ship_latitude',
     '(service) Longitude'      => 'ship_longitude',
     'Invoicing email(s)'       => 'invoicing_list_emailonly_scalar',
     '(service) Latitude'       => 'ship_latitude',
     '(service) Longitude'      => 'ship_longitude',
     'Invoicing email(s)'       => 'invoicing_list_emailonly_scalar',
+    'Contact email(s)'         => 'contact_list_emailonly',
+    'Invoices'                 => 'contact_list_cust_invoice_only',
+    'Messages'                 => 'contact_list_cust_message_only',
 # FS::Upgrade::upgrade_config removes this from existing cust-fields settings
 #    'Payment Type'             => 'cust_payby',
     'Current Balance'          => 'current_balance',
 # FS::Upgrade::upgrade_config removes this from existing cust-fields settings
 #    'Payment Type'             => 'cust_payby',
     'Current Balance'          => 'current_balance',
index 061fd69..8647c82 100644 (file)
@@ -3150,6 +3150,101 @@ sub contact_list_email {
   @emails;
 }
 
   @emails;
 }
 
+=item contact_list_email_destinations
+
+Returns a list of emails and whether they receive invoices or messages destinations.
+{ emailaddress => 'email.com', invoice => 'Y', message => '', }
+
+=cut
+
+sub contact_list_email_destinations {
+  my $self = shift;
+  warn "$me contact_list_email_destinations"
+    if $DEBUG;
+  return () if !$self->custnum; # not yet inserted
+  return map { $_ }
+    qsearch({
+        table     => 'cust_contact',
+        select    => 'emailaddress, cust_contact.invoice_dest as invoice, cust_contact.message_dest as message',
+        addl_from => ' JOIN contact USING (contactnum) '.
+                     ' JOIN contact_email USING (contactnum)',
+        hashref   => { 'custnum' => $self->custnum, },
+        order_by  => 'ORDER BY custcontactnum DESC',
+        extra_sql => '',
+    });
+}
+
+=item contact_list_emailonly
+
+Returns an array of hashes containing the emails. Used for displaying contact email field in advanced customer reports.
+[ { data => 'email.com', }, ]
+
+=cut
+
+sub contact_list_emailonly {
+  my $self = shift;
+  warn "$me contact_list_emailonly called"
+    if $DEBUG;
+  my @emails;
+  foreach ($self->contact_list_email_destinations) {
+    my $data = [
+      {
+        'data'  => $_->emailaddress,
+      },
+    ];
+    push @emails, $data;
+  }
+  return \@emails;
+}
+
+=item contact_list_cust_invoice_only
+
+Returns an array of hashes containing cust_contact.invoice_dest.  Does this email receive invoices. Used for displaying email Invoice field in advanced customer reports.
+[ { data => 'Yes', }, ]
+
+=cut
+
+sub contact_list_cust_invoice_only {
+  my $self = shift;
+  warn "$me contact_list_cust_invoice_only called"
+    if $DEBUG;
+  my @emails;
+  foreach ($self->contact_list_email_destinations) {
+    my $invoice = $_->invoice ? 'Yes' : 'No';
+    my $data = [
+      {
+        'data'  => $invoice,
+      },
+    ];
+    push @emails, $data;
+  }
+  return \@emails;
+}
+
+=item contact_list_cust_message_only
+
+Returns an array of hashes containing cust_contact.message_dest.  Does this email receive message notifications. Used for displaying email Message field in advanced customer reports.
+[ { data => 'Yes', }, ]
+
+=cut
+
+sub contact_list_cust_message_only {
+  my $self = shift;
+  warn "$me contact_list_cust_message_only called"
+    if $DEBUG;
+  my @emails;
+  foreach ($self->contact_list_email_destinations) {
+    my $message = $_->message ? 'Yes' : 'No';
+    my $data = [
+      {
+        'data'  => $message,
+      },
+    ];
+    push @emails, $data;
+  }
+  return \@emails;
+}
+
 =item referral_custnum_cust_main
 
 Returns the customer who referred this customer (or the empty string, if
 =item referral_custnum_cust_main
 
 Returns the customer who referred this customer (or the empty string, if
index b631165..cf3ab1b 100644 (file)
@@ -372,6 +372,15 @@ if ( !$cgi->param('preview') ) {
     $body ||= $content->body;
   }
 
     $body ||= $content->body;
   }
 
+  my $sql_query = "FS::$table"->search(\%search);
+  my $count_query = delete($sql_query->{'count_query'});
+  my $count_sth = dbh->prepare($count_query)
+    or die "Error preparing $count_query: ". dbh->errstr;
+  $count_sth->execute
+    or die "Error executing $count_query: ". $count_sth->errstr;
+  my $count_arrayref = $count_sth->fetchrow_arrayref;
+  $num_cust = $count_arrayref->[0];
+
 } else {
 
   my @checked_email_dest;
 } else {
 
   my @checked_email_dest;
@@ -520,8 +529,8 @@ if ( my @in_classnums = $cgi->param('classnums') ) {
 $dest_ischecked{message} = 1 unless %dest_ischecked;
 
 my @optin_checkboxes = (
 $dest_ischecked{message} = 1 unless %dest_ischecked;
 
 my @optin_checkboxes = (
-  [ 'message' => { label => 'Message recipients' } ],
-  [ 'invoice' => { label => 'Invoice recipients' } ],
+  [ 'message' => { label => 'Message recipients', desc => 'send this notice to all message recipients for the '.$num_cust.' selected customers.' } ],
+  [ 'invoice' => { label => 'Invoice recipients', desc => 'send this notice to all invoice recipients for the '.$num_cust.' selected customers.' } ],
 );
 my @classnum_checkboxes = (
   [ '0' => { label => '(None)' }],
 );
 my @classnum_checkboxes = (
   [ '0' => { label => '(None)' }],
index f6c6c62..4c7fa14 100755 (executable)
@@ -155,9 +155,10 @@ if ( $FS::CurrentUser::CurrentUser->access_right('Bulk send customer notices') )
   $uri->query_form( \%query_hash );
   my $query = $uri->query;
 
   $uri->query_form( \%query_hash );
   my $query = $uri->query;
 
-  push @$menubar, emt('Email a notice to these customers') =>
-                    "${p}misc/email-customers.html?table=cust_main&$query",
-
+  push @$menubar, emt('Email a notice to these customers message recipients') =>
+                    "${p}misc/email-customers.html?table=cust_main&classnums=message&$query";
+  push @$menubar, emt('Email a notice to these customers invoice recipients') =>
+                    "${p}misc/email-customers.html?table=cust_main&classnums=invoice&$query";
 }
 
 </%init>
 }
 
 </%init>