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

(-)a/C4/Circulation.pm (-16 / +11 lines)
Lines 2530-2553 sub MarkIssueReturned { Link Here
2530
            $item->last_returned_by( $patron );
2530
            $item->last_returned_by( $patron );
2531
        }
2531
        }
2532
2532
2533
        # The reason this is here, and not in Koha::Patron->has_overdues() is
2534
        # to make sure it will not cause any side effects elsewhere, since this
2535
        # is only relevant for removal of debarments.
2536
        my $has_overdue_ignore_unrestricted = C4::Context->preference('AutoRemoveOverduesRestrictions') eq 'when_no_overdue_causing_debarment';
2537
2538
        # Possibly remove any OVERDUES related debarment
2533
        # Possibly remove any OVERDUES related debarment
2539
        if (
2534
        if (C4::Context->preference('AutoRemoveOverduesRestrictions') ne 'no' && $patron->is_debarred) {
2540
            C4::Context->preference('AutoRemoveOverduesRestrictions') ne 'no'
2535
            my $remove_restrictions =
2541
            && $patron->debarred
2536
                C4::Context->preference('AutoRemoveOverduesRestrictions') eq 'when_no_overdue_causing_debarment' ?
2542
            && !$patron->has_overdues({
2537
                    !$patron->has_debarring_overdues({ issue_branchcode => $issue_branchcode }) :
2543
                    ignore_unrestricted => $has_overdue_ignore_unrestricted,
2538
                    !$patron->has_overdues;
2544
                    issue_branchcode => $issue_branchcode
2539
            if (
2545
                })
2540
                $remove_restrictions &&
2546
            && @{ GetDebarments({ borrowernumber => $borrowernumber, type => 'OVERDUES' }) }
2541
                @{ GetDebarments({ borrowernumber => $borrowernumber, type => 'OVERDUES' }) }
2547
        ) {
2542
            ) {
2548
            DelUniqueDebarment({ borrowernumber => $borrowernumber, type => 'OVERDUES' });
2543
                DelUniqueDebarment({ borrowernumber => $borrowernumber, type => 'OVERDUES' });
2544
            }
2549
        }
2545
        }
2550
2551
    });
2546
    });
2552
2547
2553
    return $issue_id;
2548
    return $issue_id;
(-)a/Koha/Patron.pm (-9 / +43 lines)
Lines 979-1002 Returns the number of patron's overdues Link Here
979
=cut
979
=cut
980
980
981
sub has_overdues {
981
sub has_overdues {
982
    my ($self, $params) = @_;
982
    my ($self) = @_;
983
    my $date = dt_from_string();
983
    my $date = dt_from_string();
984
    my $dtf = Koha::Database->new->schema->storage->datetime_parser;
985
    return $self->_result->issues->search({ date_due => { '<' => $dtf->format_datetime($date) } })->count;
986
}
987
988
sub has_debarring_overdues {
989
    my ($self, $params) = @_;
990
    $params //= {};
991
    my $date = dt_from_string()->truncate( to => 'day' );
984
992
985
    # If ignoring unrestricted overdues, calculate which delay value for
993
    # If ignoring unrestricted overdues, calculate which delay value for
986
    # overdue messages is set with restrictions. Then only include overdue
994
    # overdue messages is set with restrictions. Then only include overdue
987
    # issues older than that date when counting.
995
    # issues older than that date when counting.
988
    if($params->{ignore_unrestricted}) {
996
    #TODO: bail out/throw exception if $params->{issue_branchcode} not set?
989
        my $branchcode = $params->{issue_branchcode};
997
    my $debarred_delay = _get_overdue_debarred_delay($params->{issue_branchcode}, $self->categorycode());
990
        my $date_offset = _get_overdue_restrict_delay($params->{issue_branchcode}, $self->categorycode());
998
    return 0 unless defined $debarred_delay;
991
        $date->subtract(days => $date_offset);
999
1000
    # Emulate the conditions in overdue_notices.pl.
1001
    # The overdue_notices-script effectively truncates both issues.date_due and current date
1002
    # to days when selecting overdue issues.
1003
    # Hours and minutes for issues.date_due is usually set to 23 and 59 respectively, though can theoretically
1004
    # be set to any other value (truncated to minutes, except if CalcDateDue gets a $startdate)
1005
    #
1006
    # No matter what time of day date_due is set to, overdue_notices.pl will select all issues that are due
1007
    # the current date or later. We can emulate this query by instead of truncating both to days in the SQL-query,
1008
    # using the condition that date_due must be less then the current date truncated to days (time set to 00:00:00)
1009
    # offset by one day in the future.
1010
1011
    $date->add(days => 1);
1012
1013
    my $calendar;
1014
    if (C4::Context->preference('OverdueNoticeCalendar')) {
1015
        $calendar = Koha::Calendar->new( branchcode => $params->{issue_branchcode} );
992
    }
1016
    }
993
1017
994
    my $dtf = Koha::Database->new->schema->storage->datetime_parser;
1018
    my $dtf = Koha::Database->new->schema->storage->datetime_parser;
995
    return $self->_result->issues->search({ date_due => { '<' => $dtf->format_datetime( $date )} })->count;
1019
    my $issues = $self->_result->issues->search({ date_due => { '<' => $dtf->format_datetime($date) } });
1020
    my $now = dt_from_string();
1021
1022
    while (my $issue = $issues->next) {
1023
        my $days_between = C4::Context->preference('OverdueNoticeCalendar') ?
1024
            $calendar->days_between(dt_from_string($issue->date_due), $now)->in_units('days') :
1025
            $now->delta_days(dt_from_string($issue->date_due))->in_units('days');
1026
        if ($days_between >= $debarred_delay) {
1027
            return 1;
1028
        }
1029
    }
1030
    return 0;
996
}
1031
}
997
1032
998
# Fetch first delayX value from overduerules where debarredX is set, or 0 for no delay
1033
# Fetch first delayX value from overduerules where debarredX is set, or 0 for no delay
999
sub _get_overdue_restrict_delay {
1034
sub _get_overdue_debarred_delay {
1000
    my ($branchcode, $categorycode) = @_;
1035
    my ($branchcode, $categorycode) = @_;
1001
    my $dbh = C4::Context->dbh();
1036
    my $dbh = C4::Context->dbh();
1002
1037
Lines 1018-1025 sub _get_overdue_restrict_delay { Link Here
1018
        return $overdue_rules->{"delay2"} if($overdue_rules->{"debarred2"});
1053
        return $overdue_rules->{"delay2"} if($overdue_rules->{"debarred2"});
1019
        return $overdue_rules->{"delay3"} if($overdue_rules->{"debarred3"});
1054
        return $overdue_rules->{"delay3"} if($overdue_rules->{"debarred3"});
1020
    }
1055
    }
1021
1056
    return undef;
1022
    return 0;
1023
}
1057
}
1024
1058
1025
=head3 track_login
1059
=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