From 807be60181173fc6b35bdf99f2996f7f0d13a13c Mon Sep 17 00:00:00 2001
From: Kyle M Hall <kyle@bywatersolutions.com>
Date: Mon, 25 Feb 2013 13:18:07 -0500
Subject: [PATCH] Bug 8367: Skip to next open day if max pickup date is a
 holiday

Test plan:
1) Note your ReservesMaxPickUpDelay setting.
2) Create and trap a hold
3) View waitingreserves.pl, note the last pickup date, and the pickup
location
4) Edit the calendar for the given location, and make the pickup date a
holiday
4) View waitingreserves.pl, the last pickup date should now be the
increased by one day
---
 C4/Reserves.pm |   25 +++++++++++++++++++------
 1 file changed, 19 insertions(+), 6 deletions(-)

diff --git a/C4/Reserves.pm b/C4/Reserves.pm
index b91044e..12f80ba 100644
--- a/C4/Reserves.pm
+++ b/C4/Reserves.pm
@@ -30,6 +30,7 @@ use C4::Members;
 use C4::Items;
 use C4::Circulation;
 use C4::Accounts;
+use C4::Calendar;
 
 # for _koha_notify_reserve
 use C4::Members::Messaging;
@@ -174,7 +175,8 @@ sub AddReserve {
     my $maxpickupdate = GetMaxPickupDate({
         waitingdate => $waitingdate,
         itemnumber => $checkitem,
-        borrowernumber => $borrowernumber
+        borrowernumber => $borrowernumber.
+        branchcode => $branch,
     });
 
     #eval {
@@ -346,7 +348,7 @@ sub GetReservesFromItemnumber {
     my ( $itemnumber, $all_dates ) = @_;
     my $dbh   = C4::Context->dbh;
     my $query = "
-    SELECT reservedate,borrowernumber,branchcode
+    SELECT *
     FROM   reserves
     WHERE  itemnumber=?
     ";
@@ -355,8 +357,10 @@ sub GetReservesFromItemnumber {
     }
     my $sth_res = $dbh->prepare($query);
     $sth_res->execute($itemnumber);
-    my ( $reservedate, $borrowernumber,$branchcode ) = $sth_res->fetchrow_array;
-    return ( $reservedate, $borrowernumber, $branchcode );
+    
+    my $reserve = $sth_res->fetchrow_hashref();
+    
+    return ( $reserve->{'reservedate'}, $reserve->{'borrowernumber'}, $reserve->{'branchcode'}, $reserve );
 }
 
 =head2 GetReservesFromBorrowernumber
@@ -528,9 +532,10 @@ sub GetMaxPickupDate {
         $item = C4::Items::GetItem( $reserve->{itemnumber} );
     }
 
-    unless ( defined $reserve ) {
-        my $reserve = GetReservesFromItemnumber( $item->{itemnumber} );
+    unless ( defined $reserve && defined $reserve->{'branchcode'} ) {
+        ( undef, undef, undef, $reserve ) = GetReservesFromItemnumber( $item->{itemnumber} );
     }
+
     return unless $reserve->{waitingdate};
 
     my $borrower = C4::Members::GetMember( 'borrowernumber' => $reserve->{borrowernumber} );
@@ -551,6 +556,14 @@ sub GetMaxPickupDate {
 
     $date->add( days => $holdspickupdelay );
 
+    my $calendar = C4::Calendar->new( branchcode => $reserve->{'branchcode'} );
+    my $is_holiday = $calendar->isHoliday( $date->day(), $date->month(), $date->year() );
+
+    while ( $is_holiday ) {
+        $date->add( days => 1 );
+        $is_holiday = $calendar->isHoliday( $date->day(), $date->month(), $date->year() );
+    }
+                                
     return $date;
 }
 
-- 
1.7.10.4