2b58f4d89c
Calendars can be configured in a way that all days are closed. The simplest way to do that is to configure a repeatable holiday for every day of the week. With such calendars, searching for an open day will literally take forever. This patch sets a hard limit on how many iterations are allowed before giving up. This limit is set to the arbitrary value of 5000, which should be large enough to be able to consider there is no open days if we haven't found any with that many iterations, and small enough to allow the loop to end quickly Test plan: 1. Set system preference 'useDaysMode' to 'Use the calendar to push the due date to the next open day' ('Datedue'). Make sure the existing circulation rules do not conflict with that setting. 2. Browse to Tools » Calendar 3. Set every day of the week to "Holiday repeated every same day of the week" 4. Issue an item to a patron 5. Check the box and select 'Renew selected items' 6. The renewal should fail pretty quickly Signed-off-by: Sam Lau <samalau@gmail.com> Signed-off-by: David Nind <david@davidnind.com> Signed-off-by: Katrin Fischer <katrin.fischer.83@web.de> Signed-off-by: Tomas Cohen Arazi <tomascohen@theke.io>
98 lines
3 KiB
Perl
Executable file
98 lines
3 KiB
Perl
Executable file
#!/usr/bin/perl
|
|
|
|
# Copyright 2014 ByWater Solutions
|
|
#
|
|
# This file is part of Koha.
|
|
#
|
|
# Koha is free software; you can redistribute it and/or modify it
|
|
# under the terms of the GNU General Public License as published by
|
|
# the Free Software Foundation; either version 3 of the License, or
|
|
# (at your option) any later version.
|
|
#
|
|
# Koha is distributed in the hope that it will be useful, but
|
|
# WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
# GNU General Public License for more details.
|
|
#
|
|
# You should have received a copy of the GNU General Public License
|
|
# along with Koha; if not, see <http://www.gnu.org/licenses>.
|
|
|
|
use Modern::Perl;
|
|
|
|
use CGI;
|
|
use JSON qw(to_json);
|
|
use Try::Tiny;
|
|
|
|
use C4::Circulation qw( AddRenewal CanBookBeRenewed );
|
|
use C4::Context;
|
|
use C4::Auth qw(check_cookie_auth);
|
|
|
|
use Koha::DateUtils qw(output_pref dt_from_string);
|
|
|
|
my $input = CGI->new;
|
|
|
|
my ( $auth_status ) =
|
|
check_cookie_auth( $input->cookie('CGISESSID'),
|
|
{ circulate => 'circulate_remaining_permissions' } );
|
|
|
|
if ( $auth_status ne "ok" ) {
|
|
exit 0;
|
|
}
|
|
|
|
binmode STDOUT, ":encoding(UTF-8)";
|
|
print $input->header( -type => 'text/plain', -charset => 'UTF-8' );
|
|
|
|
my $itemnumber = $input->param('itemnumber');
|
|
my $borrowernumber = $input->param('borrowernumber');
|
|
my $override_limit = $input->param('override_limit');
|
|
my $branchcode = $input->param('branchcode')
|
|
|| C4::Context->userenv->{'branch'};
|
|
my $seen = $input->param('seen');
|
|
my $date_due;
|
|
if ( $input->param('date_due') ) {
|
|
$date_due = dt_from_string( scalar $input->param('date_due') );
|
|
}
|
|
|
|
my $data;
|
|
$data->{itemnumber} = $itemnumber;
|
|
$data->{borrowernumber} = $borrowernumber;
|
|
$data->{branchcode} = $branchcode;
|
|
|
|
my $patron = Koha::Patrons->find($borrowernumber);
|
|
my $item = Koha::Items->find($itemnumber);
|
|
|
|
( $data->{renew_okay}, $data->{error} ) =
|
|
CanBookBeRenewed( $patron, $item->checkout, $override_limit );
|
|
|
|
# If we're allowing reserved items to be renewed...
|
|
if ( $data->{error} && $data->{error} eq 'on_reserve' && C4::Context->preference('AllowRenewalOnHoldOverride')) {
|
|
$data->{renew_okay} = 1;
|
|
$data->{error} = undef;
|
|
}
|
|
|
|
if ( $data->{renew_okay} || ( $seen && $data->{error} eq 'too_unseen') ) {
|
|
try{
|
|
$date_due = AddRenewal(
|
|
{
|
|
borrowernumber => $borrowernumber,
|
|
itemnumber => $itemnumber,
|
|
branch => $branchcode,
|
|
datedue => $date_due,
|
|
seen => $seen
|
|
}
|
|
);
|
|
$data->{date_due} = output_pref( { dt => $date_due, as_due_date => 1 } );
|
|
$data->{renew_okay} = 1;
|
|
$data->{error} = undef;
|
|
} catch {
|
|
if ( ref($_) eq 'Koha::Exceptions::Checkout::FailedRenewal' ) {
|
|
$data->{error} = 'renewal_failed';
|
|
} elsif ( ref($_) eq 'Koha::Exceptions::Calendar::NoOpenDays' ) {
|
|
$data->{error} = 'no_open_days';
|
|
} else {
|
|
$_->rethrow;
|
|
}
|
|
};
|
|
}
|
|
|
|
print to_json($data);
|