Bug 27265: Enable message queue cron to accept multiple codes and types
authorKyle M Hall <kyle@bywatersolutions.com>
Fri, 18 Dec 2020 13:45:06 +0000 (08:45 -0500)
committerLucas Gass <lucas@bywatersolutions.com>
Wed, 21 Dec 2022 20:57:44 +0000 (20:57 +0000)
It would be nice to be able to combine several types in a single run,
but exclude others, without having to have multiple cron lines

Test Plan:
1) Apply this patch
2) Run process_message_queue.pl with a single -c parameter
3) Note behavior is unchanged
4) Run process_message_queue.pl with multiple -c parameters
5) Note all the codes specified are processed
6) Repeat 2-5 with -t for type limits

Signed-off-by: Andrew Fuerste-Henry <andrewfh@dubcolib.org>
Signed-off-by: Marcel de Rooy <m.de.rooy@rijksmuseum.nl>
Signed-off-by: Tomas Cohen Arazi <tomascohen@theke.io>
(cherry picked from commit da7bcc2252666e31c64d7edaecc3fc59ead79a0d)

Signed-off-by: Lucas Gass <lucas@bywatersolutions.com>
C4/Letters.pm
misc/cronjobs/process_message_queue.pl

index 643ab94..e47c474 100644 (file)
@@ -1226,8 +1226,10 @@ sub _add_attachments {
   This function's parameter hash reference takes the following
   optional named parameters:
    message_transport_type: method of message sending (e.g. email, sms, etc.)
+                           Can be a single string, or an arrayref of strings
    borrowernumber        : who the message is to be sent
    letter_code           : type of message being sent (e.g. PASSWORD_RESET)
+                           Can be a single string, or an arrayref of strings
    message_id            : the message_id of the message. In that case the sub will return only 1 result
    limit                 : maximum number of messages to send
 
@@ -1258,12 +1260,20 @@ sub _get_unsent_messages {
             push @query_params, $params->{'borrowernumber'};
         }
         if ( $params->{'letter_code'} ) {
-            $statement .= ' AND mq.letter_code = ? ';
-            push @query_params, $params->{'letter_code'};
+            my @letter_codes = ref $params->{'letter_code'} eq "ARRAY" ? @{$params->{'letter_code'}} : $params->{'letter_code'};
+            if ( @letter_codes ) {
+                my $q = join( ",", ("?") x @letter_codes );
+                $statement .= " AND mq.letter_code IN ( $q ) ";
+                push @query_params, @letter_codes;
+            }
         }
         if ( $params->{'type'} ) {
-            $statement .= ' AND message_transport_type = ? ';
-            push @query_params, $params->{'type'};
+            my @types = ref $params->{'type'} eq "ARRAY" ? @{$params->{'type'}} : $params->{'type'};
+            if ( @types ) {
+                my $q = join( ",", ("?") x @types );
+                $statement .= " AND message_transport_type IN ( $q ) ";
+                push @query_params, @types;
+            }
         }
         if ( $params->{message_id} ) {
             $statement .= ' AND message_id = ?';
index b67b853..4750bc6 100755 (executable)
@@ -32,8 +32,8 @@ my $limit    = undef;
 my $method = 'LOGIN';
 my $help = 0;
 my $verbose = 0;
-my $type = q{};
-my $letter_code;
+my @type;
+my @letter_code;
 
 GetOptions(
     'u|username:s'      => \$username,
@@ -42,8 +42,8 @@ GetOptions(
     'm|method:s'        => \$method,
     'h|help|?'          => \$help,
     'v|verbose'         => \$verbose,
-    't|type:s'          => \$type,
-    'c|code:s'          => \$letter_code,
+    't|type:s'          => \@type,
+    'c|code:s'          => \@letter_code,
 );
 my $usage = << 'ENDUSAGE';
 
@@ -56,8 +56,8 @@ advance_notices.pl script.
 This script has the following parameters :
     -u --username: username of mail account
     -p --password: password of mail account
-    -t --type: If supplied, only processes this type of message ( email, sms )
-    -c --code: If supplied, only processes messages with this letter code
+    -t --type: If supplied, only processes this type of message ( email, sms ), repeatable
+    -c --code: If supplied, only processes messages with this letter code, repeatable
     -l --limit: The maximum number of messages to process for this run
     -m --method: authentication method required by SMTP server (See perldoc Sendmail.pm for supported authentication types.)
     -h --help: this message
@@ -93,8 +93,8 @@ if ( C4::Context->config("enable_plugins") ) {
                     {
                         verbose     => $verbose,
                         limit       => $limit,
-                        type        => $type,
-                        letter_code => $letter_code,
+                        type        => \@type,
+                        letter_code => @letter_code,
                     }
                 );
             }
@@ -112,8 +112,8 @@ C4::Letters::SendQueuedMessages(
         password    => $password,
         method      => $method,
         limit       => $limit,
-        type        => $type,
-        letter_code => $letter_code,
+        type        => \@type,
+        letter_code => \@letter_code,
     }
 );