Bug 7016 Followup: Add new GetItemnumberForBiblio subroutine
[koha_gimpoz] / C4 / Reserves.pm
index 87e2325..2b91567 100644 (file)
@@ -3,6 +3,7 @@ package C4::Reserves;
 # Copyright 2000-2002 Katipo Communications
 #           2006 SAN Ouest Provence
 #           2007-2010 BibLibre Paul POULAIN
+#           2011 Catalyst IT
 #
 # This file is part of Koha.
 #
@@ -26,7 +27,6 @@ use C4::Context;
 use C4::Biblio;
 use C4::Members;
 use C4::Items;
-use C4::Search;
 use C4::Circulation;
 use C4::Accounts;
 
@@ -86,7 +86,7 @@ This modules provides somes functions to deal with reservations.
 BEGIN {
     # set the version for version checking
     $VERSION = 3.01;
-       require Exporter;
+    require Exporter;
     @ISA = qw(Exporter);
     @EXPORT = qw(
         &AddReserve
@@ -121,6 +121,7 @@ BEGIN {
         &AlterPriority
         &ToggleLowestPriority
     );
+    @EXPORT_OK = qw( MergeHolds );
 }    
 
 =head2 AddReserve
@@ -382,9 +383,15 @@ sub GetReservesFromBorrowernumber {
 sub CanBookBeReserved{
     my ($borrowernumber, $biblionumber) = @_;
 
-    my @items = GetItemsInfo($biblionumber);
+    my @items = GetItemnumbersForBiblio($biblionumber);
+    #get items linked via host records
+    my @hostitems = get_hostitemnumbers_of($biblionumber);
+    if (@hostitems){
+       push (@items,@hostitems);
+    }
+
     foreach my $item (@items){
-        return 1 if CanItemBeReserved($borrowernumber, $item->{itemnumber});
+        return 1 if CanItemBeReserved($borrowernumber, $item);
     }
     return 0;
 }
@@ -760,17 +767,32 @@ sub CheckReserves {
     my ( $item, $barcode ) = @_;
     my $dbh = C4::Context->dbh;
     my $sth;
-    my $select = "
-    SELECT items.biblionumber,
+    my $select;
+    if (C4::Context->preference('item-level_itypes')){
+       $select = "
+           SELECT items.biblionumber,
            items.biblioitemnumber,
            itemtypes.notforloan,
            items.notforloan AS itemnotforloan,
            items.itemnumber
-    FROM   items
-    LEFT JOIN biblioitems ON items.biblioitemnumber = biblioitems.biblioitemnumber
-    LEFT JOIN itemtypes   ON biblioitems.itemtype   = itemtypes.itemtype
-    ";
-
+           FROM   items
+           LEFT JOIN biblioitems ON items.biblioitemnumber = biblioitems.biblioitemnumber
+           LEFT JOIN itemtypes   ON items.itype   = itemtypes.itemtype
+        ";
+    }
+    else {
+       $select = "
+           SELECT items.biblionumber,
+           items.biblioitemnumber,
+           itemtypes.notforloan,
+           items.notforloan AS itemnotforloan,
+           items.itemnumber
+           FROM   items
+           LEFT JOIN biblioitems ON items.biblioitemnumber = biblioitems.biblioitemnumber
+           LEFT JOIN itemtypes   ON biblioitems.itemtype   = itemtypes.itemtype
+        ";
+    }
+   
     if ($item) {
         $sth = $dbh->prepare("$select WHERE itemnumber = ?");
         $sth->execute($item);
@@ -1662,11 +1684,22 @@ sub _koha_notify_reserve {
 
     my $dbh = C4::Context->dbh;
     my $borrower = C4::Members::GetMember(borrowernumber => $borrowernumber);
+    
+    # Try to get the borrower's email address
+    my $to_address;
+    my $which_address = C4::Context->preference('AutoEmailPrimaryAddress');
+    # If the system preference is set to 'first valid' (value == OFF), look up email address
+    if ($which_address eq 'OFF') {
+        $to_address = C4::Members::GetFirstValidEmailAddress( $borrowernumber );
+    } else {
+        $to_address = $borrower->{$which_address};
+    }
+    
     my $letter_code;
     my $print_mode = 0;
     my $messagingprefs;
-    if ( $borrower->{'email'} || $borrower->{'smsalertnumber'} ) {
-        $messagingprefs = C4::Members::Messaging::GetMessagingPreferences( { borrowernumber => $borrowernumber, message_name => 'Hold Filled' } );
+    if ( $to_address || $borrower->{'smsalertnumber'} ) {
+        $messagingprefs = C4::Members::Messaging::GetMessagingPreferences( { borrowernumber => $borrowernumber, message_name => 'Hold_Filled' } );
 
         return if ( !defined( $messagingprefs->{'letter_code'} ) );
         $letter_code = $messagingprefs->{'letter_code'};
@@ -1783,6 +1816,51 @@ sub _ShiftPriorityByDateAndPriority {
     return $new_priority;  # so the caller knows what priority they wind up receiving
 }
 
+=head2 MergeHolds
+
+  MergeHolds($dbh,$to_biblio, $from_biblio);
+
+This shifts the holds from C<$from_biblio> to C<$to_biblio> and reorders them by the date they were placed
+
+=cut
+
+sub MergeHolds {
+    my ( $dbh, $to_biblio, $from_biblio ) = @_;
+    my $sth = $dbh->prepare(
+        "SELECT count(*) as reservenumber FROM reserves WHERE biblionumber = ?"
+    );
+    $sth->execute($from_biblio);
+    if ( my $data = $sth->fetchrow_hashref() ) {
+
+        # holds exist on old record, if not we don't need to do anything
+        $sth = $dbh->prepare(
+            "UPDATE reserves SET biblionumber = ? WHERE biblionumber = ?");
+        $sth->execute( $to_biblio, $from_biblio );
+
+        # Reorder by date
+        # don't reorder those already waiting
+
+        $sth = $dbh->prepare(
+"SELECT * FROM reserves WHERE biblionumber = ? AND (found <> ? AND found <> ? OR found is NULL) ORDER BY reservedate ASC"
+        );
+        my $upd_sth = $dbh->prepare(
+"UPDATE reserves SET priority = ? WHERE biblionumber = ? AND borrowernumber = ?
+        AND reservedate = ? AND constrainttype = ? AND (itemnumber = ? or itemnumber is NULL) "
+        );
+        $sth->execute( $to_biblio, 'W', 'T' );
+        my $priority = 1;
+        while ( my $reserve = $sth->fetchrow_hashref() ) {
+            $upd_sth->execute(
+                $priority,                    $to_biblio,
+                $reserve->{'borrowernumber'}, $reserve->{'reservedate'},
+                $reserve->{'constrainttype'}, $reserve->{'itemnumber'}
+            );
+            $priority++;
+        }
+    }
+}
+
+
 =head1 AUTHOR
 
 Koha Development Team <http://koha-community.org/>