View | Details | Raw Unified | Return to bug 30168
Collapse All | Expand All

(-)a/C4/Circulation.pm (-19 / +10 lines)
Lines 2982-2988 sub CanBookBeRenewed { Link Here
2982
    }
2982
    }
2983
2983
2984
    return ( 0, $auto_renew, { soonest_renew_date => $soonest } ) if $auto_renew =~ 'too_soon';#$auto_renew ne "no" && $auto_renew ne "ok";
2984
    return ( 0, $auto_renew, { soonest_renew_date => $soonest } ) if $auto_renew =~ 'too_soon';#$auto_renew ne "no" && $auto_renew ne "ok";
2985
    $soonest = GetSoonestRenewDate($borrowernumber, $itemnumber);
2985
    $soonest = GetSoonestRenewDate($issue);
2986
    if ( $soonest > dt_from_string() ){
2986
    if ( $soonest > dt_from_string() ){
2987
        return (0, "too_soon", { soonest_renew_date => $soonest } ) unless $override_limit;
2987
        return (0, "too_soon", { soonest_renew_date => $soonest } ) unless $override_limit;
2988
    }
2988
    }
Lines 3272-3285 sub GetRenewCount { Link Here
3272
3272
3273
=head2 GetSoonestRenewDate
3273
=head2 GetSoonestRenewDate
3274
3274
3275
  $NoRenewalBeforeThisDate = &GetSoonestRenewDate($borrowernumber, $itemnumber);
3275
  $NoRenewalBeforeThisDate = &GetSoonestRenewDate($issue);
3276
3276
3277
Find out the soonest possible renew date of a borrowed item.
3277
Find out the soonest possible renew date of a borrowed item.
3278
3278
3279
C<$borrowernumber> is the borrower number of the patron who currently
3279
C<$checkout> is the checkout object to renew.
3280
has the item on loan.
3281
3282
C<$itemnumber> is the number of the item to renew.
3283
3280
3284
C<$GetSoonestRenewDate> returns the DateTime of the soonest possible
3281
C<$GetSoonestRenewDate> returns the DateTime of the soonest possible
3285
renew date, based on the value "No renewal before" of the applicable
3282
renew date, based on the value "No renewal before" of the applicable
Lines 3290-3305 cannot be found. Link Here
3290
=cut
3287
=cut
3291
3288
3292
sub GetSoonestRenewDate {
3289
sub GetSoonestRenewDate {
3293
    my ( $borrowernumber, $itemnumber ) = @_;
3290
    my ( $checkout ) = @_;
3294
3291
3295
    my $dbh = C4::Context->dbh;
3292
    my $item   = $checkout->item or return;
3296
3293
    my $patron = $checkout->patron or return;
3297
    my $item      = Koha::Items->find($itemnumber)      or return;
3298
    my $itemissue = $item->checkout or return;
3299
3300
    $borrowernumber ||= $itemissue->borrowernumber;
3301
    my $patron = Koha::Patrons->find( $borrowernumber )
3302
      or return;
3303
3294
3304
    my $branchcode = _GetCircControlBranch( $item->unblessed, $patron->unblessed );
3295
    my $branchcode = _GetCircControlBranch( $item->unblessed, $patron->unblessed );
3305
    my $issuing_rule = Koha::CirculationRules->get_effective_rules(
3296
    my $issuing_rule = Koha::CirculationRules->get_effective_rules(
Lines 3319-3325 sub GetSoonestRenewDate { Link Here
3319
        and $issuing_rule->{norenewalbefore} ne "" )
3310
        and $issuing_rule->{norenewalbefore} ne "" )
3320
    {
3311
    {
3321
        my $soonestrenewal =
3312
        my $soonestrenewal =
3322
          dt_from_string( $itemissue->date_due )->subtract(
3313
          dt_from_string( $checkout->date_due )->subtract(
3323
            $issuing_rule->{lengthunit} => $issuing_rule->{norenewalbefore} );
3314
            $issuing_rule->{lengthunit} => $issuing_rule->{norenewalbefore} );
3324
3315
3325
        if ( C4::Context->preference('NoRenewalBeforePrecision') eq 'date'
3316
        if ( C4::Context->preference('NoRenewalBeforePrecision') eq 'date'
Lines 3328-3336 sub GetSoonestRenewDate { Link Here
3328
            $soonestrenewal->truncate( to => 'day' );
3319
            $soonestrenewal->truncate( to => 'day' );
3329
        }
3320
        }
3330
        return $soonestrenewal if $now < $soonestrenewal;
3321
        return $soonestrenewal if $now < $soonestrenewal;
3331
    } elsif ( $itemissue->auto_renew && $patron->autorenew_checkouts ) {
3322
    } elsif ( $checkout->auto_renew && $patron->autorenew_checkouts ) {
3332
        # Checkouts with auto-renewing fall back to due date
3323
        # Checkouts with auto-renewing fall back to due date
3333
        my $soonestrenewal = dt_from_string( $itemissue->date_due );
3324
        my $soonestrenewal = dt_from_string( $checkout->date_due );
3334
        if ( C4::Context->preference('NoRenewalBeforePrecision') eq 'date'
3325
        if ( C4::Context->preference('NoRenewalBeforePrecision') eq 'date'
3335
            and $issuing_rule->{lengthunit} eq 'days' )
3326
            and $issuing_rule->{lengthunit} eq 'days' )
3336
        {
3327
        {
Lines 4423-4429 sub _CanBookBeAutoRenewed { Link Here
4423
        }
4414
        }
4424
    }
4415
    }
4425
4416
4426
    my $soonest = GetSoonestRenewDate($patron->id, $item->id);
4417
    my $soonest = GetSoonestRenewDate($issue);
4427
    if ( $soonest > dt_from_string() )
4418
    if ( $soonest > dt_from_string() )
4428
    {
4419
    {
4429
        return ( "auto_too_soon", $soonest );
4420
        return ( "auto_too_soon", $soonest );
(-)a/t/db_dependent/Circulation.t (-6 / +5 lines)
Lines 5694-5700 subtest "GetSoonestRenewDate tests" => sub { Link Here
5694
    # Test 'exact time' setting for syspref NoRenewalBeforePrecision
5694
    # Test 'exact time' setting for syspref NoRenewalBeforePrecision
5695
    t::lib::Mocks::mock_preference( 'NoRenewalBeforePrecision', 'exact_time' );
5695
    t::lib::Mocks::mock_preference( 'NoRenewalBeforePrecision', 'exact_time' );
5696
    is(
5696
    is(
5697
        GetSoonestRenewDate( $patron->id, $item->itemnumber ),
5697
        GetSoonestRenewDate( $issue ),
5698
        $datedue->clone->add( days => -7 ),
5698
        $datedue->clone->add( days => -7 ),
5699
        'Bug 14395: Renewals permitted 7 days before due date, as expected'
5699
        'Bug 14395: Renewals permitted 7 days before due date, as expected'
5700
    );
5700
    );
Lines 5703-5709 subtest "GetSoonestRenewDate tests" => sub { Link Here
5703
    # Test 'date' setting for syspref NoRenewalBeforePrecision
5703
    # Test 'date' setting for syspref NoRenewalBeforePrecision
5704
    t::lib::Mocks::mock_preference( 'NoRenewalBeforePrecision', 'date' );
5704
    t::lib::Mocks::mock_preference( 'NoRenewalBeforePrecision', 'date' );
5705
    is(
5705
    is(
5706
        GetSoonestRenewDate( $patron->id, $item->itemnumber ),
5706
        GetSoonestRenewDate( $issue ),
5707
        $datedue->clone->add( days => -7 )->truncate( to => 'day' ),
5707
        $datedue->clone->add( days => -7 )->truncate( to => 'day' ),
5708
        'Bug 14395: Renewals permitted 7 days before due date, as expected'
5708
        'Bug 14395: Renewals permitted 7 days before due date, as expected'
5709
    );
5709
    );
Lines 5720-5726 subtest "GetSoonestRenewDate tests" => sub { Link Here
5720
    );
5720
    );
5721
5721
5722
    is(
5722
    is(
5723
        GetSoonestRenewDate( $patron->id, $item->itemnumber ),
5723
        GetSoonestRenewDate( $issue ),
5724
        dt_from_string,
5724
        dt_from_string,
5725
        'Checkouts without auto-renewal can be renewed immediately if no norenewalbefore'
5725
        'Checkouts without auto-renewal can be renewed immediately if no norenewalbefore'
5726
    );
5726
    );
Lines 5728-5740 subtest "GetSoonestRenewDate tests" => sub { Link Here
5728
    t::lib::Mocks::mock_preference( 'NoRenewalBeforePrecision', 'date' );
5728
    t::lib::Mocks::mock_preference( 'NoRenewalBeforePrecision', 'date' );
5729
    $issue->auto_renew(1)->store;
5729
    $issue->auto_renew(1)->store;
5730
    is(
5730
    is(
5731
        GetSoonestRenewDate( $patron->id, $item->itemnumber ),
5731
        GetSoonestRenewDate( $issue ),
5732
        $datedue->clone->truncate( to => 'day' ),
5732
        $datedue->clone->truncate( to => 'day' ),
5733
        'Checkouts with auto-renewal can be renewed earliest on due date if no renewalbefore'
5733
        'Checkouts with auto-renewal can be renewed earliest on due date if no renewalbefore'
5734
    );
5734
    );
5735
    t::lib::Mocks::mock_preference( 'NoRenewalBeforePrecision', 'exact' );
5735
    t::lib::Mocks::mock_preference( 'NoRenewalBeforePrecision', 'exact' );
5736
    is(
5736
    is(
5737
        GetSoonestRenewDate( $patron->id, $item->itemnumber ),
5737
        GetSoonestRenewDate( $issue ),
5738
        $datedue,
5738
        $datedue,
5739
        'Checkouts with auto-renewal can be renewed earliest on due date if no renewalbefore'
5739
        'Checkouts with auto-renewal can be renewed earliest on due date if no renewalbefore'
5740
    );
5740
    );
5741
- 

Return to bug 30168