Bug 11561: restore previous behavior of generation of hold print notices
authorOlli-Antti Kivilahti <olli-antti.kivilahti@jns.fi>
Wed, 15 Jan 2014 14:25:17 +0000 (16:25 +0200)
committerGalen Charlton <gmc@esilibrary.com>
Fri, 2 May 2014 20:29:19 +0000 (20:29 +0000)
This patch prevents duplicate hold available print notices from being
sent and enforces making a print notice if no other transports can be
used.

-------------------------
- REPLICATING THE ISSUE -
-------------------------

1. Set a Patrons "Hold filled"-messaging preference to SMS + Email
2. Remove the SMS number (sms notification number) and all email
   addresses.
3. Make a reservation for this Patron.
4. Check-in the reserved Item.
5. message_queue-table has two generated print notices for the
   Hold_filled event.
   One for both failed message transport types, email and sms.

1. Set a Patrons "Hold filled"-messaging preference to empty, remove all
   checks from boxes.
2. Make a reservation for this Patron
3. Check-in the reserved Item.
4. message_queue-table has no message for the Hold-filled event. This is
   problematic because a Patron should get some kind of a notification
   for a filled Hold.

-----------------------------
- AFTER APPLYING THIS PATCH -
-----------------------------

If all message transport types for "Hold filled" fail, a print notice is
queued in the message_queue table. Only one print message is queued even
if many transports attempts fail.

Signed-off-by: Galen Charlton <gmc@esilibrary.com>
C4/Reserves.pm

index 339621b..ad866af 100644 (file)
@@ -1921,12 +1921,9 @@ sub _koha_notify_reserve {
         substitute => { today => C4::Dates->new()->output() },
     );
 
-    my $print_sent = 0;
-    while ( my ( $mtt, $letter_code ) = each %{ $messagingprefs->{transports} } ) {
-        if ( ($mtt eq 'email' and not $to_address) or ($mtt eq 'sms' and not $borrower->{smsalertnumber}) ) {
-            # email or sms is requested but not exist, do a print.
-            $mtt = 'print';
-        }
+    my $notification_sent = 0; #Keeping track if a Hold_filled message is sent. If no message can be sent, then default to a print message.
+    my $send_notification = sub {
+        my ( $mtt, $letter_code ) = (@_);
         $letter_params{letter_code} = $letter_code;
         $letter_params{message_transport_type} = $mtt;
         my $letter =  C4::Letters::GetPreparedLetter ( %letter_params )
@@ -1938,7 +1935,21 @@ sub _koha_notify_reserve {
             from_address => $admin_email_address,
             message_transport_type => $mtt,
         } );
+    };
+    
+    while ( my ( $mtt, $letter_code ) = each %{ $messagingprefs->{transports} } ) {
+        if ( ($mtt eq 'email' and not $to_address) or ($mtt eq 'sms' and not $borrower->{smsalertnumber}) ) {
+            # email or sms is requested but not exist
+            next;
+        }
+        &$send_notification($mtt, $letter_code);
+        $notification_sent++;
     }
+    #Making sure that a print notification is sent if no other transport types can be utilized.
+    if (! $notification_sent) {
+        &$send_notification('print', 'HOLD');
+    }
+    
 }
 
 =head2 _ShiftPriorityByDateAndPriority