or die "msgnum $msgnum not found\n";
}
- $param->{'payby'} = [ split(/\0/, $param->{'payby'}) ]
- unless ref($param->{'payby'});
-
my $sql_query = $class->search($param->{'search'});
my $count_query = delete($sql_query->{'count_query'});
my( $num, $last, $min_sec ) = (0, time, 5); #progresbar foo
my @retry_jobs = ();
+ my $dups = 0;
my $success = 0;
+ my %sent_to = ();
#eventually order+limit magic to reduce memory use?
foreach my $obj ( qsearch($sql_query) ) {
if ( !$cust_main ) {
next; # unlinked object; nothing else we can do
}
+
+ if( $sent_to{$cust_main->custnum} ) {
+ # avoid duplicates
+ $dups++;
+ next;
+ }
+
+ $sent_to{$cust_main->custnum} = 1;
if ( $msg_template ) {
# XXX add support for other context objects?
+ # If we do that, handling of "duplicates" will
+ # have to be smarter. Currently we limit to
+ # one message per custnum because they'd all
+ # be identical.
@message = $msg_template->prepare( 'cust_main' => $cust_main );
}
else {
- my $to = $cust_main->invoicing_list_emailonly_scalar;
- next if !$to;
+ my @to = $cust_main->invoicing_list_emailonly;
+ next if !@to;
@message = (
'from' => $from,
- 'to' => $to,
+ 'to' => \@to,
'subject' => $subject,
'html_body' => $html_body,
'text_body' => $text_body,
+ 'custnum' => $cust_main->custnum,
);
} #if $msg_template
if(@retry_jobs) {
# fail the job, but with a status message that makes it clear
# something was sent.
- return "Sent $success, failed ".scalar(@retry_jobs).". Failed attempts placed in job queue.\n";
+ return "Sent $success, skipped $dups duplicate(s), failed ".scalar(@retry_jobs).". Failed attempts placed in job queue.\n";
}
return '';