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

(-)a/C4/Circulation.pm (-16 / +11 lines)
Lines 2528-2551 sub MarkIssueReturned { Link Here
2528
            $item->last_returned_by( $patron );
2528
            $item->last_returned_by( $patron );
2529
        }
2529
        }
2530
2530
2531
        # The reason this is here, and not in Koha::Patron->has_overdues() is
2532
        # to make sure it will not cause any side effects elsewhere, since this
2533
        # is only relevant for removal of debarments.
2534
        my $has_overdue_ignore_unrestricted = C4::Context->preference('AutoRemoveOverduesRestrictions') eq 'when_no_overdue_causing_debarment';
2535
2536
        # Possibly remove any OVERDUES related debarment
2531
        # Possibly remove any OVERDUES related debarment
2537
        if (
2532
        if (C4::Context->preference('AutoRemoveOverduesRestrictions') ne 'no' && $patron->is_debarred) {
2538
            C4::Context->preference('AutoRemoveOverduesRestrictions') ne 'no'
2533
            my $remove_restrictions =
2539
            && $patron->debarred
2534
                C4::Context->preference('AutoRemoveOverduesRestrictions') eq 'when_no_overdue_causing_debarment' ?
2540
            && !$patron->has_overdues({
2535
                    !$patron->has_debarring_overdues({ issue_branchcode => $issue_branchcode }) :
2541
                    ignore_unrestricted => $has_overdue_ignore_unrestricted,
2536
                    !$patron->has_overdues;
2542
                    issue_branchcode => $issue_branchcode
2537
            if (
2543
                })
2538
                $remove_restrictions &&
2544
            && @{ GetDebarments({ borrowernumber => $borrowernumber, type => 'OVERDUES' }) }
2539
                @{ GetDebarments({ borrowernumber => $borrowernumber, type => 'OVERDUES' }) }
2545
        ) {
2540
            ) {
2546
            DelUniqueDebarment({ borrowernumber => $borrowernumber, type => 'OVERDUES' });
2541
                DelUniqueDebarment({ borrowernumber => $borrowernumber, type => 'OVERDUES' });
2542
            }
2547
        }
2543
        }
2548
2549
    });
2544
    });
2550
2545
2551
    return $issue_id;
2546
    return $issue_id;
(-)a/Koha/Patron.pm (-9 / +44 lines)
Lines 945-968 Returns the number of patron's overdues Link Here
945
=cut
945
=cut
946
946
947
sub has_overdues {
947
sub has_overdues {
948
    my ($self, $params) = @_;
948
    my ($self) = @_;
949
    my $date = dt_from_string();
949
    my $date = dt_from_string();
950
    my $dtf = Koha::Database->new->schema->storage->datetime_parser;
951
    return $self->_result->issues->search({ date_due => { '<' => $dtf->format_datetime($date) } })->count;
952
}
953
954
sub has_debarring_overdues {
955
    my ($self, $params) = @_;
956
    $params //= {};
957
    my $date = dt_from_string()->truncate( to => 'day' );
950
958
951
    # If ignoring unrestricted overdues, calculate which delay value for
959
    # If ignoring unrestricted overdues, calculate which delay value for
952
    # overdue messages is set with restrictions. Then only include overdue
960
    # overdue messages is set with restrictions. Then only include overdue
953
    # issues older than that date when counting.
961
    # issues older than that date when counting.
954
    if($params->{ignore_unrestricted}) {
962
    #TODO: bail out/throw exception if $params->{issue_branchcode} not set?
955
        my $branchcode = $params->{issue_branchcode};
963
    my $debarred_delay = _get_overdue_debarred_delay($params->{issue_branchcode}, $self->categorycode());
956
        my $date_offset = _get_overdue_restrict_delay($params->{issue_branchcode}, $self->categorycode());
964
    return 0 unless defined $debarred_delay;
957
        $date->subtract(days => $date_offset);
965
966
    # Emulate the conditions in overdue_notices.pl.
967
    # The overdue_notices-script effectively truncates both issues.date_due and current date
968
    # to days when selecting overdue issues.
969
    # Hours and minutes for issues.date_due is usually set to 23 and 59 respectively, though can theoretically
970
    # be set to any other value (truncated to minutes, except if CalcDateDue gets a $startdate)
971
    #
972
    # No matter what time of day date_due is set to, overdue_notices.pl will select all issues that are due
973
    # the current date or later. We can emulate this query by instead of truncating both to days in the SQL-query,
974
    # using the condition that date_due must be less then the current date truncated to days (time set to 00:00:00)
975
    # offset by one day in the future.
976
977
    #$date->subtract(days => $debarred_delay - 1);
978
    $date->add(days => 1);
979
980
    my $calendar;
981
    if (C4::Context->preference('OverdueNoticeCalendar')) {
982
        $calendar = Koha::Calendar->new( branchcode => $params->{issue_branchcode} );
958
    }
983
    }
959
984
960
    my $dtf = Koha::Database->new->schema->storage->datetime_parser;
985
    my $dtf = Koha::Database->new->schema->storage->datetime_parser;
961
    return $self->_result->issues->search({ date_due => { '<' => $dtf->format_datetime( $date )} })->count;
986
    my $issues = $self->_result->issues->search({ date_due => { '<' => $dtf->format_datetime($date) } });
987
    my $now = dt_from_string();
988
989
    while (my $issue = $issues->next) {
990
        my $days_between = C4::Context->preference('OverdueNoticeCalendar') ?
991
            $calendar->days_between(dt_from_string($issue->date_due), $now)->in_units('days') :
992
            $now->delta_days(dt_from_string($issue->date_due))->in_units('days');
993
        if ($days_between >= $debarred_delay) {
994
            return 1;
995
        }
996
    }
997
    return 0;
962
}
998
}
963
999
964
# Fetch first delayX value from overduerules where debarredX is set, or 0 for no delay
1000
# Fetch first delayX value from overduerules where debarredX is set, or 0 for no delay
965
sub _get_overdue_restrict_delay {
1001
sub _get_overdue_debarred_delay {
966
    my ($branchcode, $categorycode) = @_;
1002
    my ($branchcode, $categorycode) = @_;
967
    my $dbh = C4::Context->dbh();
1003
    my $dbh = C4::Context->dbh();
968
1004
Lines 984-991 sub _get_overdue_restrict_delay { Link Here
984
        return $overdue_rules->{"delay2"} if($overdue_rules->{"debarred2"});
1020
        return $overdue_rules->{"delay2"} if($overdue_rules->{"debarred2"});
985
        return $overdue_rules->{"delay3"} if($overdue_rules->{"debarred3"});
1021
        return $overdue_rules->{"delay3"} if($overdue_rules->{"debarred3"});
986
    }
1022
    }
987
1023
    return undef;
988
    return 0;
989
}
1024
}
990
1025
991
=head3 track_login
1026
=head3 track_login
(-)a/t/db_dependent/Circulation/MarkIssueReturned.t (-12 / +13 lines)
Lines 201-209 subtest 'AutoRemoveOverduesRestrictions' => sub { Link Here
201
    my $item_1 = $builder->build_sample_item;
201
    my $item_1 = $builder->build_sample_item;
202
    my $item_2 = $builder->build_sample_item;
202
    my $item_2 = $builder->build_sample_item;
203
    my $item_3 = $builder->build_sample_item;
203
    my $item_3 = $builder->build_sample_item;
204
    my $five_days_ago = dt_from_string->subtract( days => 5 );
204
    my $nine_days_ago = dt_from_string->subtract( days => 9 ); #->set_hour(23)->set_minute(59);
205
    my $checkout_1 = AddIssue( $patron->unblessed, $item_1->barcode, $five_days_ago ); # overdue, but would not trigger debarment
205
    my $checkout_1 = AddIssue( $patron->unblessed, $item_1->barcode, $nine_days_ago ); # overdue, but would not trigger debarment
206
    my $checkout_2 = AddIssue( $patron->unblessed, $item_2->barcode, $five_days_ago ); # overdue, but would not trigger debarment
206
    my $checkout_2 = AddIssue( $patron->unblessed, $item_2->barcode, $nine_days_ago ); # overdue, but would not trigger debarment
207
    my $checkout_3 = AddIssue( $patron->unblessed, $item_3->barcode ); # not overdue
207
    my $checkout_3 = AddIssue( $patron->unblessed, $item_3->barcode ); # not overdue
208
208
209
    Koha::Patron::Debarments::AddUniqueDebarment(
209
    Koha::Patron::Debarments::AddUniqueDebarment(
Lines 226-235 subtest 'AutoRemoveOverduesRestrictions' => sub { Link Here
226
226
227
    t::lib::Mocks::mock_preference('AutoRemoveOverduesRestrictions', 'when_no_overdue_causing_debarment');
227
    t::lib::Mocks::mock_preference('AutoRemoveOverduesRestrictions', 'when_no_overdue_causing_debarment');
228
228
229
    my $eleven_days_ago = dt_from_string->subtract( days => 11 );
229
    my $ten_days_ago = dt_from_string->subtract( days => 10 );
230
231
    $checkout_1 = AddIssue( $patron->unblessed, $item_1->barcode, $ten_days_ago ); # overdue and would trigger debarment
232
    $checkout_2 = AddIssue( $patron->unblessed, $item_2->barcode, $nine_days_ago ); # overdue, but would not trigger debarment
230
233
231
    $checkout_1 = AddIssue( $patron->unblessed, $item_1->barcode, $eleven_days_ago ); # overdue and would trigger debarment
234
    print STDERR "DUEDATE: " . $nine_days_ago->stringify . "\n";
232
    $checkout_2 = AddIssue( $patron->unblessed, $item_2->barcode, $five_days_ago ); # overdue, but would not trigger debarment
233
235
234
    Koha::Patron::Debarments::AddUniqueDebarment(
236
    Koha::Patron::Debarments::AddUniqueDebarment(
235
        {
237
        {
Lines 244-250 subtest 'AutoRemoveOverduesRestrictions' => sub { Link Here
244
    $debarments = Koha::Patron::Debarments::GetDebarments({ borrowernumber => $patron->borrowernumber });
246
    $debarments = Koha::Patron::Debarments::GetDebarments({ borrowernumber => $patron->borrowernumber });
245
    is( scalar @$debarments, 0, 'OVERDUES debarment is removed if remaning items would not result in patron debarment' );
247
    is( scalar @$debarments, 0, 'OVERDUES debarment is removed if remaning items would not result in patron debarment' );
246
248
247
    $checkout_1 = AddIssue( $patron->unblessed, $item_1->barcode, $eleven_days_ago ); # overdue and would trigger debarment
249
    $checkout_1 = AddIssue( $patron->unblessed, $item_1->barcode, $ten_days_ago ); # overdue and would trigger debarment
248
250
249
    Koha::Patron::Debarments::AddUniqueDebarment(
251
    Koha::Patron::Debarments::AddUniqueDebarment(
250
        {
252
        {
Lines 259-270 subtest 'AutoRemoveOverduesRestrictions' => sub { Link Here
259
    $debarments = Koha::Patron::Debarments::GetDebarments({ borrowernumber => $patron->borrowernumber });
261
    $debarments = Koha::Patron::Debarments::GetDebarments({ borrowernumber => $patron->borrowernumber });
260
    is( $debarments->[0]->{type}, 'OVERDUES', 'OVERDUES debarment is not removed if patron still has overdues that would trigger debarment' );
262
    is( $debarments->[0]->{type}, 'OVERDUES', 'OVERDUES debarment is not removed if patron still has overdues that would trigger debarment' );
261
263
262
    my $thirteen_days_ago = dt_from_string->subtract( days => 13 );
264
    my $eleven_days_ago = dt_from_string->subtract( days => 11 );
263
265
264
    # overdue and would trigger debarment
266
    # overdue and would trigger debarment
265
    $checkout_2 = AddIssue( $patron->unblessed, $item_2->barcode, $thirteen_days_ago );
267
    $checkout_2 = AddIssue( $patron->unblessed, $item_2->barcode, $eleven_days_ago );
266
268
267
    # $chechout_1 should now not trigger debarment with this new rule for specific branchcode
269
    # $checkout_1 should now not trigger debarment with this new rule for specific branchcode
268
    $dbh->do(qq{
270
    $dbh->do(qq{
269
        INSERT INTO `overduerules` (
271
        INSERT INTO `overduerules` (
270
            `branchcode`,
272
            `branchcode`,
Lines 276-282 subtest 'AutoRemoveOverduesRestrictions' => sub { Link Here
276
            `letter2`,
278
            `letter2`,
277
            `debarred2`
279
            `debarred2`
278
        )
280
        )
279
        VALUES ('$branchcode', '$categorycode', 6, 'ODUE', 0, 12, 'ODUE2', 1)
281
        VALUES ('$branchcode', '$categorycode', 6, 'ODUE', 0, 11, 'ODUE2', 1)
280
    });
282
    });
281
283
282
    C4::Circulation::MarkIssueReturned( $patron->borrowernumber, $item_2->itemnumber );
284
    C4::Circulation::MarkIssueReturned( $patron->borrowernumber, $item_2->itemnumber );
283
- 

Return to bug 29145