[Koha-patches] [PATCH] bug 2848 [1/2]: Send notifications to patrons when hold is received

Galen Charlton galen.charlton at liblime.com
Fri Dec 5 22:11:13 CET 2008


From: Jesse Weaver <jesse.weaver at liblime.com>

This adds notification code to Reserves.pm to send notifications through email
or SMS to patrons when their hold is filled. It does not send the letter
directly, but instead uses EnqueueLetter. Also, it relies on
EnhancedPatronMessaging being on and the hold notification being turned on for
the specific patron through the 'Messaging' tab.

Signed-off-by: Galen Charlton <galen.charlton at liblime.com>
---
 C4/Letters.pm                                      |   28 +++++---
 C4/Members/Messaging.pm                            |    1 +
 C4/Reserves.pm                                     |   76 ++++++++++++++++++++
 .../prog/en/modules/tools/letter.tmpl              |   10 +++
 tools/letter.pl                                    |   10 +++-
 5 files changed, 113 insertions(+), 12 deletions(-)

diff --git a/C4/Letters.pm b/C4/Letters.pm
index 35dc564..24f636c 100644
--- a/C4/Letters.pm
+++ b/C4/Letters.pm
@@ -467,27 +467,32 @@ sub SendAlerts {
 =cut
 
 sub parseletter {
-    my ( $letter, $table, $pk ) = @_;
+    my ( $letter, $table, $pk, $pk2 ) = @_;
 
     # 	warn "Parseletter : ($letter,$table,$pk)";
     my $dbh = C4::Context->dbh;
     my $sth;
     if ( $table eq 'biblio' ) {
         $sth = $dbh->prepare("select * from biblio where biblionumber=?");
-    }
-    elsif ( $table eq 'biblioitems' ) {
+    } elsif ( $table eq 'biblioitems' ) {
         $sth = $dbh->prepare("select * from biblioitems where biblionumber=?");
-    }
-    elsif ( $table eq 'borrowers' ) {
+    } elsif ( $table eq 'items' ) {
+        $sth = $dbh->prepare("select * from items where itemnumber=?");
+    } elsif ( $table eq 'reserves' ) {
+        $sth = $dbh->prepare("select * from reserves where borrowernumber = ? and biblionumber=?");
+    } elsif ( $table eq 'borrowers' ) {
         $sth = $dbh->prepare("select * from borrowers where borrowernumber=?");
-    }
-    elsif ( $table eq 'branches' ) {
+    } elsif ( $table eq 'branches' ) {
         $sth = $dbh->prepare("select * from branches where branchcode=?");
-    }
-    elsif ( $table eq 'aqbooksellers' ) {
+    } elsif ( $table eq 'aqbooksellers' ) {
         $sth = $dbh->prepare("select * from aqbooksellers where id=?");
     }
-    $sth->execute($pk);
+
+    if ( $pk2 ) {
+        $sth->execute($pk, $pk2);
+    } else {
+        $sth->execute($pk);
+    }
 
     # store the result in an hash
     my $values = $sth->fetchrow_hashref;
@@ -499,7 +504,6 @@ sub parseletter {
         my $replacefield = "<<$table.$field>>";
         my $replacedby   = $values->{$field};
 
-        # 		warn "REPLACE $replacefield by $replacedby";
         $letter->{title}   =~ s/$replacefield/$replacedby/g;
         $letter->{content} =~ s/$replacefield/$replacedby/g;
     }
@@ -749,6 +753,8 @@ sub _send_message_by_email {
     my $message = shift;
 
     my $member = C4::Members::GetMember( $message->{'borrowernumber'} );
+    return unless $message->{'to_address'} or $member->{'email'};
+
 	my $content = encode('utf8', $message->{'content'});
     my %sendmail_params = (
         To   => $message->{'to_address'}   || $member->{'email'},
diff --git a/C4/Members/Messaging.pm b/C4/Members/Messaging.pm
index 4ca03b5..cbcfdd1 100644
--- a/C4/Members/Messaging.pm
+++ b/C4/Members/Messaging.pm
@@ -91,6 +91,7 @@ END_SQL
         # warn( Data::Dumper->Dump( [ $row ], [ 'row' ] ) );
         $return->{'days_in_advance'} = $row->{'days_in_advance'} if defined $row->{'days_in_advance'};
         $return->{'wants_digest'}    = $row->{'wants_digest'}    if defined $row->{'wants_digest'};
+		$return->{'letter_code'}     = $row->{'letter_code'};
         $transports{$row->{'message_transport_type'}} = 1;
     }
     @{$return->{'transports'}} = keys %transports;
diff --git a/C4/Reserves.pm b/C4/Reserves.pm
index ec81bf4..58086fa 100644
--- a/C4/Reserves.pm
+++ b/C4/Reserves.pm
@@ -31,6 +31,13 @@ use C4::Search;
 use C4::Circulation;
 use C4::Accounts;
 
+# for _koha_notify_reserve
+use C4::Members::Messaging;
+use C4::Members qw( GetMember );
+use C4::Letters;
+use C4::Branch qw( GetBranchDetail );
+use List::MoreUtils qw( firstidx );
+
 use vars qw($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS);
 
 my $library_name = C4::Context->preference("LibraryName");
@@ -1010,6 +1017,9 @@ sub ModReserveAffect {
     $sth = $dbh->prepare($query);
     $sth->execute( $itemnumber, $borrowernumber,$biblionumber);
     $sth->finish;
+    
+    _koha_notify_reserve( $itemnumber, $borrowernumber, $biblionumber ) if ( !$transferToDo );
+
     return;
 }
 
@@ -1375,6 +1385,72 @@ sub _Findgroupreserve {
     return @results;
 }
 
+=item _koha_notify_reserve
+
+=over 4
+
+_koha_notify_reserve( $itemnumber, $borrowernumber, $biblionumber );
+
+=back
+
+Sends a notification to the patron that their hold has been filled (through
+ModReserveAffect, _not_ ModReserveFill)
+
+=cut
+
+sub _koha_notify_reserve {
+    my ($itemnumber, $borrowernumber, $biblionumber) = @_;
+
+    my $dbh = C4::Context->dbh;
+    my $messagingprefs = C4::Members::Messaging::GetMessagingPreferences( { borrowernumber => $borrowernumber, message_name => 'Hold Filled' } );
+
+    return if ( !defined( $messagingprefs->{'letter_code'} ) );
+
+    my $sth = $dbh->prepare("
+        SELECT *
+        FROM   reserves
+        WHERE  borrowernumber = ?
+            AND biblionumber = ?
+    ");
+    $sth->execute( $borrowernumber, $biblionumber );
+    my $reserve = $sth->fetchrow_hashref;
+    my $branch_details = GetBranchDetail( $reserve->{'branchcode'} );
+
+    my $admin_email_address = $branch_details->{'branchemail'} || C4::Context->preference('KohaAdminEmailAddress');
+
+    my $letter = getletter( 'reserves', $messagingprefs->{'letter_code'} );
+
+    C4::Letters::parseletter( $letter, 'branches', $reserve->{'branchcode'} );
+    C4::Letters::parseletter( $letter, 'borrowers', $reserve->{'borrowernumber'} );
+    C4::Letters::parseletter( $letter, 'biblio', $reserve->{'biblionumber'} );
+    C4::Letters::parseletter( $letter, 'reserves', $reserve->{'borrowernumber'}, $reserve->{'biblionumber'} );
+
+    if ( $reserve->{'itemnumber'} ) {
+        C4::Letters::parseletter( $letter, 'items', $reserve->{'itemnumber'} );
+    }
+    $letter->{'content'} =~ s/<<[a-z0-9_]+\.[a-z0-9]+>>//g; #remove any stragglers
+
+    if ( -1 !=  firstidx { $_ eq 'email' } @{$messagingprefs->{transports}} ) {
+        # aka, 'email' in ->{'transports'}
+        C4::Letters::EnqueueLetter(
+            {   letter                 => $letter,
+                borrowernumber         => $borrowernumber,
+                message_transport_type => 'email',
+                from_address           => $admin_email_address,
+            }
+        );
+    }
+
+    if ( -1 != firstidx { $_ eq 'sms' } @{$messagingprefs->{transports}} ) {
+        C4::Letters::EnqueueLetter(
+            {   letter                 => $letter,
+                borrowernumber         => $borrowernumber,
+                message_transport_type => 'sms',
+            }
+        );
+    }
+}
+
 =back
 
 =head1 AUTHOR
diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/tools/letter.tmpl b/koha-tmpl/intranet-tmpl/prog/en/modules/tools/letter.tmpl
index f288693..e2e0c90 100644
--- a/koha-tmpl/intranet-tmpl/prog/en/modules/tools/letter.tmpl
+++ b/koha-tmpl/intranet-tmpl/prog/en/modules/tools/letter.tmpl
@@ -209,6 +209,11 @@ $(document).ready(function() {
                                     <!--TMPL_ELSE-->
                                     <option value="members">Members</option>
                                     <!--/TMPL_IF-->
+                                    <!--TMPL_IF Name="reserves"-->
+                                    <option value="reserves" selected="selected">Holds</option>
+                                    <!--TMPL_ELSE-->
+                                    <option value="reserves">Holds</option>
+                                    <!--/TMPL_IF-->
 				</select>
 			</li>
 			<li>
@@ -250,6 +255,11 @@ $(document).ready(function() {
 						<!--TMPL_ELSE-->
 						<option value="members">Members</option>
 						<!--/TMPL_IF-->
+						<!--TMPL_IF Name="reserves"-->
+						<option value="reserves" selected="selected">Holds</option>
+						<!--TMPL_ELSE-->
+						<option value="reserves">Holds</option>
+						<!--/TMPL_IF-->
 				</select>
 			</li>
 			<li>
diff --git a/tools/letter.pl b/tools/letter.pl
index 98bc596..9c6a76e 100755
--- a/tools/letter.pl
+++ b/tools/letter.pl
@@ -54,10 +54,12 @@ sub StringSearch {
     return $sth->fetchall_arrayref({});
 }
 
+# FIXME untranslateable
 our %column_map = (
     aqbooksellers => 'BOOKSELLERS',
     aqorders => 'ORDERS',
     serial => 'SERIALS',
+    reserves => 'HOLDS',
 );
 
 sub column_picks ($) {
@@ -132,7 +134,13 @@ if ( $op eq 'add_form' ) {
     push @SQLfieldname, column_picks('branches');
 
     # add acquisition specific tables
-    if ( index( $module, "acquisition" ) > 0 ) {	# FIXME: imprecise comparison
+    if ( $module eq "reserves" ) {
+        push @SQLfieldname, column_picks('borrowers'),
+                            column_picks('reserves'),
+                            column_picks('biblio'),
+                            column_picks('items');
+    }
+    elsif ( index( $module, "acquisition" ) > 0 ) {	# FIXME: imprecise comparison
         push @SQLfieldname, column_picks('aqbooksellers'), column_picks('aqorders');
         # add issues specific tables
     }
-- 
1.5.5.GIT




More information about the Koha-patches mailing list