From 804afa5ac4fd9fb34edc5d000c242783786ac02c Mon Sep 17 00:00:00 2001 From: Alex Buckley Date: Sun, 30 Sep 2018 12:20:54 +0000 Subject: [PATCH] Bug 8367: Altered expirationdate calc in Koha/Hold.pm and altered C4/Reserves/CancelExpiredReserves() Added check for holidays to expirationdate calculation in Koha/Hold.pm so the expirationdate respects holidays as the lastpickupdate does. Changed C4/Reserve/CancelExpiredReserves() to check the reserves.lastpickupdate rather than rserves.expirationdate. Therefore it will now automatically expire holds if they have not been picked up within the time period specified in the hold pickup delay defined in the issuing rules (which is added to reserves.waitingdate to calculate the reserves.lastpickupdate) AND the ExpireReservesMaxPickUpDelay syspref is enabled. Sponsored-By: Brimbank Library, Australia --- C4/Reserves.pm | 16 ++++++++-------- Koha/Hold.pm | 20 ++++++++++++++------ 2 files changed, 22 insertions(+), 14 deletions(-) diff --git a/C4/Reserves.pm b/C4/Reserves.pm index 716ef62214..bfecb16d4c 100644 --- a/C4/Reserves.pm +++ b/C4/Reserves.pm @@ -724,10 +724,6 @@ sub GetLastPickupDate { } elsif ( $controlbranch eq "PatronLibrary" ) { $branchcode = $borrower->branchcode; } - warn 'getlastpickup'; - warn $branchcode; - warn $borrower->{'categorycode'}; - warn $item->{itype}; my $issuingrule = Koha::IssuingRules->get_effective_issuing_rule({ branchcode => $branchcode, categorycode => $borrower->{'categorycode'}, @@ -740,6 +736,7 @@ sub GetLastPickupDate { } else { $reservebranch = $reserve->branchcode; } + if ( defined($issuingrule) && defined $issuingrule->holdspickupwait && $issuingrule->holdspickupwait > 0 ) { #If holdspickupwait is <= 0, it means this feature is disabled for this type of material. $date->add( days => $issuingrule->holdspickupwait ); my $calendar = Koha::Calendar->new( branchcode => $reservebranch ); @@ -748,6 +745,11 @@ sub GetLastPickupDate { $date->add( days => 1 ); $is_holiday = $calendar->is_holiday( $date ); } + + if ( C4::Context->preference("ExcludeHolidaysFromMaxPickUpDelay") ) { + $date = $calendar->days_forward( dt_from_string(), $issuingrule->holdspickupwait ); + } + $reserve->{lastpickupdate} = $date->ymd(); return $date; } @@ -920,7 +922,7 @@ sub CheckReserves { CancelExpiredReserves(); -Cancels all reserves with an expiration date from before today. +Cancels all reserves with a lastpickupdate value from before today. =cut @@ -928,14 +930,12 @@ sub CancelExpiredReserves { my $today = dt_from_string(); my $cancel_on_holidays = C4::Context->preference('ExpireReservesOnHolidays'); my $expireWaiting = C4::Context->preference('ExpireReservesMaxPickUpDelay'); - my $dtf = Koha::Database->new->schema->storage->datetime_parser; - my $params = { expirationdate => { '<', $dtf->format_date($today) } }; + my $params = { lastpickupdate => { '<', $dtf->format_date($today) } }; $params->{found} = [ { '!=', 'W' }, undef ] unless $expireWaiting; # FIXME To move to Koha::Holds->search_expired (?) my $holds = Koha::Holds->search( $params ); - while ( my $hold = $holds->next ) { my $calendar = Koha::Calendar->new( branchcode => $hold->branchcode ); diff --git a/Koha/Hold.pm b/Koha/Hold.pm index b509fbd431..c1010abdd0 100644 --- a/Koha/Hold.pm +++ b/Koha/Hold.pm @@ -186,7 +186,6 @@ sub set_waiting { my $patron = Koha::Patrons->find( {borrowernumber => $self->borrowernumber} ); my $item = Koha::Items->find( $self->itemnumber() ); my $hold = Koha::Holds->find( $self->reserve_id ); -# my $lastpickupdate = C4::Reserves->GetLastPickupDate( $hold, $item, $patron); # Get the controlbranch my $controlbranch = C4::Reserves->GetReservesControlBranch( $item, $patron ); @@ -198,9 +197,6 @@ sub set_waiting { $branchcode = $patron->branchcode; } - warn $branchcode; - warn $patron->categorycode; - warn $item->itype; my $issuingrule = Koha::IssuingRules->get_effective_issuing_rule({ branchcode => $branchcode, categorycode => $patron->categorycode, @@ -208,11 +204,23 @@ sub set_waiting { }); if ( defined $issuingrule->holdspickupwait && $issuingrule->holdspickupwait > 0) { - $expirationdate->add(days => $issuingrule->holdspickupwait); + if ( defined($issuingrule) && defined $issuingrule->holdspickupwait && $issuingrule->holdspickupwait > 0 ) { + #If holdspickupwait is <= 0, it means this feature is disabled for this type of material. + if ($cancel_on_holidays) { + $expirationdate->add(days => $issuingrule->holdspickupwait); + } else { + $expirationdate->add(days => $issuingrule->holdspickupwait); + my $is_holiday = $calendar->is_holiday( $expirationdate ); + while ( $is_holiday ) { + $expirationdate->add( days => 1 ); + $is_holiday = $calendar->is_holiday( $expirationdate ); + } + } + } } if ( C4::Context->preference("ExcludeHolidaysFromMaxPickUpDelay") ) { - $expirationdate = $calendar->days_forward( dt_from_string(), $issuingrule->{holdspickupwait} ); + $expirationdate = $calendar->days_forward( dt_from_string(), $issuingrule->holdspickupwait ); } # If patron's requested expiration date is prior to the -- 2.11.0