From eb1796299a429ba5cd3b939a65bf5e95abf0086c Mon Sep 17 00:00:00 2001 From: Mark Wells Date: Tue, 3 May 2016 12:52:21 -0700 Subject: [PATCH] email to specific contact classes, 3.x adjustments --- FS/FS/Misc.pm | 7 +++++ FS/FS/cust_main.pm | 56 ++++++++++++++++++++++++------------ FS/FS/cust_main_Mixin.pm | 5 ++-- httemplate/misc/email-customers.html | 10 ++++--- 4 files changed, 52 insertions(+), 26 deletions(-) diff --git a/FS/FS/Misc.pm b/FS/FS/Misc.pm index e425c4a4b..eedc736ee 100644 --- a/FS/FS/Misc.pm +++ b/FS/FS/Misc.pm @@ -256,6 +256,13 @@ sub send_email { push @to, $options{bcc} if defined($options{bcc}); # make sure my @env_to = split(/\s*,\s*/, join(', ', @to)); + # strip display-name from envelope addresses + foreach (@env_to) { + s/^\s*//; + s/\s*$//; + s/^(.*)\s*<(.*@.*)>$/$2/; + } + local $@; # just in case eval { sendmail($message, { transport => $transport, from => $from, diff --git a/FS/FS/cust_main.pm b/FS/FS/cust_main.pm index ef3ab61a7..41b274320 100644 --- a/FS/FS/cust_main.pm +++ b/FS/FS/cust_main.pm @@ -3367,9 +3367,7 @@ sub invoicing_list_emailonly_scalar { Returns a list of contacts (L objects) for the customer. If a list of contact classnums is given, returns only contacts in those -classes. If the pseudo-classnum 'invoice' is given, returns contacts that -are marked as invoice destinations. If '0' is given, also returns contacts -with no class. +classes. If '0' is given, also returns contacts with no class. If no arguments are given, returns all contacts for the customer. @@ -3379,18 +3377,15 @@ sub contact_list { my $self = shift; my $search = { table => 'contact', - select => 'contact.*, cust_contact.invoice_dest', - addl_from => ' JOIN cust_contact USING (contactnum)', - extra_sql => ' WHERE cust_contact.custnum = '.$self->custnum, + select => 'contact.*', + extra_sql => ' WHERE contact.custnum = '.$self->custnum, }; my @orwhere; my @classnums; foreach (@_) { - if ( $_ eq 'invoice' ) { - push @orwhere, 'cust_contact.invoice_dest = \'Y\''; - } elsif ( $_ eq '0' ) { - push @orwhere, 'cust_contact.classnum is null'; + if ( $_ eq '0' ) { + push @orwhere, 'contact.classnum is null'; } elsif ( /^\d+$/ ) { push @classnums, $_; } else { @@ -3399,7 +3394,7 @@ sub contact_list { } if (@classnums) { - push @orwhere, 'cust_contact.classnum IN ('.join(',', @classnums).')'; + push @orwhere, 'contact.classnum IN ('.join(',', @classnums).')'; } if (@orwhere) { $search->{extra_sql} .= ' AND (' . @@ -3413,21 +3408,44 @@ sub contact_list { =item contact_list_email [ CLASSNUM, ... ] Same as L, but returns email destinations instead of contact -objects. +objects. Also accepts 'invoice' as an argument, in which case this will also +return the invoice email address if any. =cut sub contact_list_email { my $self = shift; - my @contacts = $self->contact_list(@_); - my @emails; - foreach my $contact (@contacts) { - foreach my $contact_email ($contact->contact_email) { - push @emails, - $contact->firstlast . ' <' . $contact_email->emailaddress . '>'; + my @classnums; + my $and_invoice; + foreach (@_) { + if (/^invoice$/) { + $and_invoice = 1; + } else { + push @classnums, $_; + } + } + my %emails; + # if the only argument passed was 'invoice' then no classnums are + # intended, so skip this. + if ( @classnums ) { + my @contacts = $self->contact_list(@classnums); + foreach my $contact (@contacts) { + foreach my $contact_email ($contact->contact_email) { + # unlike on 4.x, we have a separate list of invoice email + # destinations. + # make sure they're not redundant with contact emails + my $dest = $contact->firstlast . ' <' . $contact_email->emailaddress . '>'; + $emails{ $contact_email->emailaddress } = $dest; + } + } + } + if ( $and_invoice ) { + foreach my $email ($self->invoicing_list_emailonly) { + my $dest = $self->name_short . ' <' . $email . '>'; + $emails{ $email } ||= $dest; } } - @emails; + values %emails; } =item referral_custnum_cust_main diff --git a/FS/FS/cust_main_Mixin.pm b/FS/FS/cust_main_Mixin.pm index 94e6eaa29..dee9aa831 100644 --- a/FS/FS/cust_main_Mixin.pm +++ b/FS/FS/cust_main_Mixin.pm @@ -469,9 +469,8 @@ sub email_search_result { # 3.x: false laziness with msg_template.pm; on 4.x, all email notices # are generated from templates and this case goes away my @classes; - if ( $opt{'to_contact_classnum'} ) { - my $classnum = $opt{'to_contact_classnum'}; - @classes = ref($classnum) ? @$classnum : split(',', $classnum); + if ( $to_contact_classnum ) { + @classes = ref($to_contact_classnum) ? @$to_contact_classnum : split(',', $to_contact_classnum); } if (!@classes) { @classes = ( 'invoice' ); diff --git a/httemplate/misc/email-customers.html b/httemplate/misc/email-customers.html index 11ab050b6..c9a216c3a 100644 --- a/httemplate/misc/email-customers.html +++ b/httemplate/misc/email-customers.html @@ -46,10 +46,10 @@ should be used to set msgnum or from/subject/html_body cgi params - % if ( $cgi->param('action') eq 'send' ) { + Sending notice <& /elements/progress-init.html, @@ -62,6 +62,7 @@ should be used to set msgnum or from/subject/html_body cgi params % } elsif ( $cgi->param('action') eq 'preview' ) { + Preview notice % } @@ -149,7 +150,6 @@ Template: onchange => 'toggle(this)', &>
-% } % # select destination contact classes Send to contacts: <& /elements/checkboxes.html, @@ -306,8 +306,8 @@ if ( $cgi->param('action') eq 'preview' ) { ($from, $subject, $html_body) = @message{'from', 'subject', 'html_body'}; } - # contact_class_X params - foreach my $param ( $cgi->multi_param ) { + # contact_class_X params in preview + foreach my $param ( $cgi->param ) { if ( $param =~ /^contact_class_(\w+)$/ ) { push @contact_classnum, $1; if ( $1 eq 'invoice' ) { @@ -318,8 +318,10 @@ if ( $cgi->param('action') eq 'preview' ) { } } } + } +# and set up contact checkboxes for edit mode my @contact_checkboxes = ( [ 'invoice' => { label => 'Invoice recipients' } ] ); -- 2.11.0