%doc> Allows emailing one or more customers, based on a search for customers. Search can be specified either through cust_main fields as cgi params, or through a base64 encoded frozen hash in the 'search' cgi param. Form allows selecting an existing msg_template, or creating a custom message, and shows a preview of the message before sending. If linked to as a popup, include the cgi parameter 'popup' for proper header handling. This may also be used as an element in other pages, enabling you to pass along additional substitution parameters to a message template, with the following options: form_action - the URL to submit the form to sub_param_process - subroutine to override cgi param values (such as msgnum) and parse/delete additional form fields from the cgi; should return a %sub_param hash to be passed along for message substitution alternate_form - an alternate form for template selection/message creation title - the title of the page %doc> % if ($popup) { <% include('/elements/header-popup.html', $title) %> % } else { <% include('/elements/header.html', $title) %> % }
% if ( $cgi->param('action') eq 'send' ) { % } <% include('/elements/footer.html') %> <%init> my %opt = @_; die "access denied" unless $FS::CurrentUser::CurrentUser->access_right('Bulk send customer notices'); my $conf = FS::Conf->new; my $form_action = $opt{'form_action'} || 'email-customers.html'; my %sub_param = $opt{'sub_param_process'} ? &{$opt{'sub_param_process'}}($conf) : (); my $alternate_form = $opt{'alternate_form'} ? &{$opt{'alternate_form'}}(%sub_param) : (); my $title = $opt{'title'} || 'Send customer notices'; my $table = $cgi->param('table') or die "'table' required"; my $agent_virt_agentnum = $cgi->param('agent_virt_agentnum') || ''; my $popup = $cgi->param('popup'); my $url = $cgi->param('url'); my $pdest = { 'message' => "Notice sent" }; $pdest->{'url'} = $cgi->param('url') if $url; my %search; if ( $cgi->param('search') ) { %search = %{ thaw(decode_base64($cgi->param('search'))) }; } else { %search = $cgi->Vars; delete $search{$_} for qw( action table from subject html_body text_body popup url sub_param ); # FS::$table->search is expected to know which parameters might be # multi-valued, and to accept scalar values for them also. No good # solution to this since CGI can't tell whether a parameter _might_ # have had multiple values, only whether it does. @search{keys %search} = map { /\0/ ? [ split /\0/, $_ ] : $_ } values %search; } my $num_cust; my $from = ''; if ( $cgi->param('from') ) { $from = $cgi->param('from'); } elsif ( $cgi->param('from_name') ) { $from = ($cgi->param('from_name') . ' <' . $cgi->param('from_addr') . '>'); } elsif ( $cgi->param('from_addr') ) { $from = $cgi->param('from_addr'); } my $subject = $cgi->param('subject') || ''; my $html_body = $cgi->param('html_body') || ''; my $msg_template = ''; if ( $cgi->param('action') eq 'preview' ) { 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]; if ( $cgi->param('msgnum') ) { $msg_template = qsearchs('msg_template', { msgnum => $cgi->param('msgnum') } ) or die "template not found: ".$cgi->param('msgnum'); $sql_query->{'extra_sql'} .= ' LIMIT 1'; $sql_query->{'select'} = "$table.*"; $sql_query->{'order_by'} = ''; my $object = qsearchs($sql_query); my $cust = $object->cust_main; my %msgopts = ( 'cust_main' => $cust, 'object' => $object, ); $msgopts{'sub_param'} = \%sub_param if %sub_param; my %message = $msg_template->prepare(%msgopts); ($from, $subject, $html_body) = @message{'from', 'subject', 'html_body'}; } } %init>