From a051e2d680b0ca2d5e336cf7b6b2c7fd6a012c98 Mon Sep 17 00:00:00 2001 From: Nick Clemens Date: Wed, 23 Feb 2022 16:25:21 +0000 Subject: [PATCH] Bug 30168: Use checkout object in GetSoonestRenewDate --- C4/Circulation.pm | 29 ++++++++++------------------- t/db_dependent/Circulation.t | 10 +++++----- 2 files changed, 15 insertions(+), 24 deletions(-) diff --git a/C4/Circulation.pm b/C4/Circulation.pm index e809e3d873..20cf147956 100644 --- a/C4/Circulation.pm +++ b/C4/Circulation.pm @@ -3002,7 +3002,7 @@ sub CanBookBeRenewed { return ( 0, "on_reserve" ) if $resfound; # '' when no hold was found return ( 0, $auto_renew, { soonest_renew_date => $soonest } ) if $auto_renew =~ 'too_soon';#$auto_renew ne "no" && $auto_renew ne "ok"; - $soonest = GetSoonestRenewDate($borrowernumber, $itemnumber); + $soonest = GetSoonestRenewDate($issue); if ( $soonest > dt_from_string() ){ return (0, "too_soon", { soonest_renew_date => $soonest } ) unless $override_limit; } @@ -3282,14 +3282,11 @@ sub GetRenewCount { =head2 GetSoonestRenewDate - $NoRenewalBeforeThisDate = &GetSoonestRenewDate($borrowernumber, $itemnumber); + $NoRenewalBeforeThisDate = &GetSoonestRenewDate($issue); Find out the soonest possible renew date of a borrowed item. -C<$borrowernumber> is the borrower number of the patron who currently -has the item on loan. - -C<$itemnumber> is the number of the item to renew. +C<$checkout> is the checkout object to renew. C<$GetSoonestRenewDate> returns the DateTime of the soonest possible renew date, based on the value "No renewal before" of the applicable @@ -3300,16 +3297,10 @@ cannot be found. =cut sub GetSoonestRenewDate { - my ( $borrowernumber, $itemnumber ) = @_; + my ( $checkout ) = @_; - my $dbh = C4::Context->dbh; - - my $item = Koha::Items->find($itemnumber) or return; - my $itemissue = $item->checkout or return; - - $borrowernumber ||= $itemissue->borrowernumber; - my $patron = Koha::Patrons->find( $borrowernumber ) - or return; + my $item = $checkout->item or return; + my $patron = $checkout->patron or return; my $branchcode = _GetCircControlBranch( $item->unblessed, $patron->unblessed ); my $issuing_rule = Koha::CirculationRules->get_effective_rules( @@ -3329,7 +3320,7 @@ sub GetSoonestRenewDate { and $issuing_rule->{norenewalbefore} ne "" ) { my $soonestrenewal = - dt_from_string( $itemissue->date_due )->subtract( + dt_from_string( $checkout->date_due )->subtract( $issuing_rule->{lengthunit} => $issuing_rule->{norenewalbefore} ); if ( C4::Context->preference('NoRenewalBeforePrecision') eq 'date' @@ -3338,9 +3329,9 @@ sub GetSoonestRenewDate { $soonestrenewal->truncate( to => 'day' ); } return $soonestrenewal if $now < $soonestrenewal; - } elsif ( $itemissue->auto_renew && $patron->autorenew_checkouts ) { + } elsif ( $checkout->auto_renew && $patron->autorenew_checkouts ) { # Checkouts with auto-renewing fall back to due date - my $soonestrenewal = dt_from_string( $itemissue->date_due ); + my $soonestrenewal = dt_from_string( $checkout->date_due ); if ( C4::Context->preference('NoRenewalBeforePrecision') eq 'date' and $issuing_rule->{lengthunit} eq 'days' ) { @@ -4462,7 +4453,7 @@ sub _CanBookBeAutoRenewed { } } - my $soonest = GetSoonestRenewDate($patron->id, $item->id); + my $soonest = GetSoonestRenewDate($issue); if ( $soonest > dt_from_string() ) { return ( "auto_too_soon", $soonest ); diff --git a/t/db_dependent/Circulation.t b/t/db_dependent/Circulation.t index 74ce1ca53c..2c33445660 100755 --- a/t/db_dependent/Circulation.t +++ b/t/db_dependent/Circulation.t @@ -5383,7 +5383,7 @@ subtest "GetSoonestRenewDate tests" => sub { # Test 'exact time' setting for syspref NoRenewalBeforePrecision t::lib::Mocks::mock_preference( 'NoRenewalBeforePrecision', 'exact_time' ); is( - GetSoonestRenewDate( $patron->id, $item->itemnumber ), + GetSoonestRenewDate( $issue ), $datedue->clone->add( days => -7 ), 'Bug 14395: Renewals permitted 7 days before due date, as expected' ); @@ -5392,7 +5392,7 @@ subtest "GetSoonestRenewDate tests" => sub { # Test 'date' setting for syspref NoRenewalBeforePrecision t::lib::Mocks::mock_preference( 'NoRenewalBeforePrecision', 'date' ); is( - GetSoonestRenewDate( $patron->id, $item->itemnumber ), + GetSoonestRenewDate( $issue ), $datedue->clone->add( days => -7 )->truncate( to => 'day' ), 'Bug 14395: Renewals permitted 7 days before due date, as expected' ); @@ -5409,7 +5409,7 @@ subtest "GetSoonestRenewDate tests" => sub { ); is( - GetSoonestRenewDate( $patron->id, $item->itemnumber ), + GetSoonestRenewDate( $issue ), dt_from_string, 'Checkouts without auto-renewal can be renewed immediately if no norenewalbefore' ); @@ -5417,13 +5417,13 @@ subtest "GetSoonestRenewDate tests" => sub { t::lib::Mocks::mock_preference( 'NoRenewalBeforePrecision', 'date' ); $issue->auto_renew(1)->store; is( - GetSoonestRenewDate( $patron->id, $item->itemnumber ), + GetSoonestRenewDate( $issue ), $datedue->clone->truncate( to => 'day' ), 'Checkouts with auto-renewal can be renewed earliest on due date if no renewalbefore' ); t::lib::Mocks::mock_preference( 'NoRenewalBeforePrecision', 'exact' ); is( - GetSoonestRenewDate( $patron->id, $item->itemnumber ), + GetSoonestRenewDate( $issue ), $datedue, 'Checkouts with auto-renewal can be renewed earliest on due date if no renewalbefore' ); -- 2.30.2