If a patron has a expiry date set to 9999-12-31 (for organizations for
instance), the checkouts are very slow.
It's caused by 2 different calls to DateTime in CanBookBeIssued:
1/
DateTime->new( year => 9999, month => 12, day => 31, time_zone => C4::Context->tz );
The time_zone should not be set (as it's done in Koha::DateUtils), set to UTC or floating tz.
2/
DateTime->compare($today, $expiry_dt)
The comparaison of 2 DT with 1 related to 9999 is very slow, as you can
imagine.
For 1/ we need to call Koha::DateUtils::dt_from_string (actually, we
should never call DateTime directly).
For 2/ we just need to test if the date is != 9999, no need to compare
it in this case.
Test plan:
Before this patch, confirm that the checkouts are slow if the patron has a
dateexpiry set to 9999-12-31.
update borrowers set dateexpiry="9999-12-31" where borrowernumber=42;
After this patch, you should not see any regression when checking out
items to an expired patron and to a valid patron.
Signed-off-by: Marcel de Rooy <m.de.rooy@rijksmuseum.nl>
Signed-off-by: Jonathan Druart <jonathan.druart@bugs.koha-community.org>
Signed-off-by: Kyle M Hall <kyle@bywatersolutions.com>
Signed-off-by: Tomas Cohen Arazi <tomascohen@unc.edu.ar>
(cherry picked from commit
8d58acc565c8500d4b9d55cacb3d6d21628a899b)
Signed-off-by: Chris Cormack <chrisc@catalyst.net.nz>
Signed-off-by: Liz Rea <wizzyrea@gmail.com>
if ( !defined $borrower->{dateexpiry} || $borrower->{'dateexpiry'} eq '0000-00-00') {
$issuingimpossible{EXPIRED} = 1;
} else {
- my ($y, $m, $d) = split /-/,$borrower->{'dateexpiry'};
- if ($y && $m && $d) { # are we really writing oinvalid dates to borrs
- my $expiry_dt = DateTime->new(
- year => $y,
- month => $m,
- day => $d,
- time_zone => C4::Context->tz,
- );
- $expiry_dt->truncate( to => 'day');
- my $today = $now->clone()->truncate(to => 'day');
- if (DateTime->compare($today, $expiry_dt) == 1) {
- $issuingimpossible{EXPIRED} = 1;
- }
- } else {
- carp("Invalid expity date in borr");
+ my $expiry_dt = dt_from_string( $borrower->{dateexpiry}, 'sql' );
+ $expiry_dt->truncate( to => 'day');
+ my $today = $now->clone()->truncate(to => 'day');
+
+ if ($expiry_dt->year < 9999 && DateTime->compare($today, $expiry_dt) == 1) {
$issuingimpossible{EXPIRED} = 1;
}
}
+
#
# BORROWER STATUS
#