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

(-)a/C4/Circulation.pm (-14 / +10 lines)
Lines 2624-2646 sub MarkIssueReturned { Link Here
2624
            $item->last_returned_by( $patron->borrowernumber )->store;
2624
            $item->last_returned_by( $patron->borrowernumber )->store;
2625
        }
2625
        }
2626
2626
2627
        # The reason this is here, and not in Koha::Patron->has_overdues() is
2628
        # to make sure it will not cause any side effects elsewhere, since this
2629
        # is only relevant for removal of debarments.
2630
        my $has_overdue_ignore_unrestricted = C4::Context->preference('AutoRemoveOverduesRestrictions') eq 'when_no_overdue_causing_debarment';
2631
2632
        # Possibly remove any OVERDUES related debarment
2627
        # Possibly remove any OVERDUES related debarment
2633
        my $overdue_restrictions = $patron->restrictions->search({ type => 'OVERDUES' });
2628
        my $overdue_restrictions = $patron->restrictions->search({ type => 'OVERDUES' });
2634
        if ( C4::Context->preference('AutoRemoveOverduesRestrictions' ne 'no')
2629
        if (C4::Context->preference('AutoRemoveOverduesRestrictions') ne 'no' && $patron->is_debarred) {
2635
          && $patron->debarred
2630
            my $remove_restrictions =
2636
          && $overdue_restrictions->count
2631
                C4::Context->preference('AutoRemoveOverduesRestrictions') eq 'when_no_overdue_causing_debarment' ?
2637
          && !$patron->has_overdues({
2632
                    !$patron->has_debarring_overdues({ issue_branchcode => $issue_branchcode }) :
2638
              ignore_unrestricted => $has_overdue_ignore_unrestricted,
2633
                    !$patron->has_overdues;
2639
              issue_branch => $issue->{'branchcode'} })
2634
            if (
2640
        ) {
2635
                $remove_restrictions && $overdue_restrictions->count
2641
            DelUniqueDebarment({ borrowernumber => $borrowernumber, type => 'OVERDUES' });
2636
            ) {
2637
                DelUniqueDebarment({ borrowernumber => $borrowernumber, type => 'OVERDUES' });
2638
            }
2642
        }
2639
        }
2643
2644
    });
2640
    });
2645
2641
2646
    return $issue_id;
2642
    return $issue_id;
(-)a/Koha/Patron.pm (-9 / +43 lines)
Lines 1008-1031 Returns the number of patron's overdues Link Here
1008
=cut
1008
=cut
1009
1009
1010
sub has_overdues {
1010
sub has_overdues {
1011
    my ($self, $params) = @_;
1011
    my ($self) = @_;
1012
    my $date = dt_from_string();
1012
    my $date = dt_from_string();
1013
    my $dtf = Koha::Database->new->schema->storage->datetime_parser;
1014
    return $self->_result->issues->search({ date_due => { '<' => $dtf->format_datetime($date) } })->count;
1015
}
1016
1017
sub has_debarring_overdues {
1018
    my ($self, $params) = @_;
1019
    $params //= {};
1020
    my $date = dt_from_string()->truncate( to => 'day' );
1013
1021
1014
    # If ignoring unrestricted overdues, calculate which delay value for
1022
    # If ignoring unrestricted overdues, calculate which delay value for
1015
    # overdue messages is set with restrictions. Then only include overdue
1023
    # overdue messages is set with restrictions. Then only include overdue
1016
    # issues older than that date when counting.
1024
    # issues older than that date when counting.
1017
    if($params->{ignore_unrestricted}) {
1025
    #TODO: bail out/throw exception if $params->{issue_branchcode} not set?
1018
        my $branchcode = $params->{issue_branchcode};
1026
    my $debarred_delay = _get_overdue_debarred_delay($params->{issue_branchcode}, $self->categorycode());
1019
        my $date_offset = _get_overdue_restrict_delay($params->{issue_branchcode}, $self->categorycode());
1027
    return 0 unless defined $debarred_delay;
1020
        $date->subtract(days => $date_offset);
1028
1029
    # Emulate the conditions in overdue_notices.pl.
1030
    # The overdue_notices-script effectively truncates both issues.date_due and current date
1031
    # to days when selecting overdue issues.
1032
    # Hours and minutes for issues.date_due is usually set to 23 and 59 respectively, though can theoretically
1033
    # be set to any other value (truncated to minutes, except if CalcDateDue gets a $startdate)
1034
    #
1035
    # No matter what time of day date_due is set to, overdue_notices.pl will select all issues that are due
1036
    # the current date or later. We can emulate this query by instead of truncating both to days in the SQL-query,
1037
    # using the condition that date_due must be less then the current date truncated to days (time set to 00:00:00)
1038
    # offset by one day in the future.
1039
1040
    $date->add(days => 1);
1041
1042
    my $calendar;
1043
    if (C4::Context->preference('OverdueNoticeCalendar')) {
1044
        $calendar = Koha::Calendar->new( branchcode => $params->{issue_branchcode} );
1021
    }
1045
    }
1022
1046
1023
    my $dtf = Koha::Database->new->schema->storage->datetime_parser;
1047
    my $dtf = Koha::Database->new->schema->storage->datetime_parser;
1024
    return $self->_result->issues->search({ date_due => { '<' => $dtf->format_datetime( $date )} })->count;
1048
    my $issues = $self->_result->issues->search({ date_due => { '<' => $dtf->format_datetime($date) } });
1049
    my $now = dt_from_string();
1050
1051
    while (my $issue = $issues->next) {
1052
        my $days_between = C4::Context->preference('OverdueNoticeCalendar') ?
1053
            $calendar->days_between(dt_from_string($issue->date_due), $now)->in_units('days') :
1054
            $now->delta_days(dt_from_string($issue->date_due))->in_units('days');
1055
        if ($days_between >= $debarred_delay) {
1056
            return 1;
1057
        }
1058
    }
1059
    return 0;
1025
}
1060
}
1026
1061
1027
# Fetch first delayX value from overduerules where debarredX is set, or 0 for no delay
1062
# Fetch first delayX value from overduerules where debarredX is set, or 0 for no delay
1028
sub _get_overdue_restrict_delay {
1063
sub _get_overdue_debarred_delay {
1029
    my ($branchcode, $categorycode) = @_;
1064
    my ($branchcode, $categorycode) = @_;
1030
    my $dbh = C4::Context->dbh();
1065
    my $dbh = C4::Context->dbh();
1031
1066
Lines 1047-1054 sub _get_overdue_restrict_delay { Link Here
1047
        return $overdue_rules->{"delay2"} if($overdue_rules->{"debarred2"});
1082
        return $overdue_rules->{"delay2"} if($overdue_rules->{"debarred2"});
1048
        return $overdue_rules->{"delay3"} if($overdue_rules->{"debarred3"});
1083
        return $overdue_rules->{"delay3"} if($overdue_rules->{"debarred3"});
1049
    }
1084
    }
1050
1085
    return undef;
1051
    return 0;
1052
}
1086
}
1053
1087
1054
=head3 track_login
1088
=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, $item_1->barcode, $five_days_ago ); # overdue, but would not trigger debarment
205
    my $checkout_1 = AddIssue( $patron, $item_1->barcode, $nine_days_ago ); # overdue, but would not trigger debarment
206
    my $checkout_2 = AddIssue( $patron, $item_2->barcode, $five_days_ago ); # overdue, but would not trigger debarment
206
    my $checkout_2 = AddIssue( $patron, $item_2->barcode, $nine_days_ago ); # overdue, but would not trigger debarment
207
    my $checkout_3 = AddIssue( $patron, $item_3->barcode ); # not overdue
207
    my $checkout_3 = AddIssue( $patron, $item_3->barcode ); # not overdue
208
208
209
    Koha::Patron::Debarments::AddUniqueDebarment(
209
    Koha::Patron::Debarments::AddUniqueDebarment(
Lines 227-236 subtest 'AutoRemoveOverduesRestrictions' => sub { Link Here
227
227
228
    t::lib::Mocks::mock_preference('AutoRemoveOverduesRestrictions', 'when_no_overdue_causing_debarment');
228
    t::lib::Mocks::mock_preference('AutoRemoveOverduesRestrictions', 'when_no_overdue_causing_debarment');
229
229
230
    my $eleven_days_ago = dt_from_string->subtract( days => 11 );
230
    my $ten_days_ago = dt_from_string->subtract( days => 10 );
231
232
    $checkout_1 = AddIssue( $patron->unblessed, $item_1->barcode, $ten_days_ago ); # overdue and would trigger debarment
233
    $checkout_2 = AddIssue( $patron->unblessed, $item_2->barcode, $nine_days_ago ); # overdue, but would not trigger debarment
231
234
232
    $checkout_1 = AddIssue( $patron->unblessed, $item_1->barcode, $eleven_days_ago ); # overdue and would trigger debarment
235
    print STDERR "DUEDATE: " . $nine_days_ago->stringify . "\n";
233
    $checkout_2 = AddIssue( $patron->unblessed, $item_2->barcode, $five_days_ago ); # overdue, but would not trigger debarment
234
236
235
    Koha::Patron::Debarments::AddUniqueDebarment(
237
    Koha::Patron::Debarments::AddUniqueDebarment(
236
        {
238
        {
Lines 245-251 subtest 'AutoRemoveOverduesRestrictions' => sub { Link Here
245
    $debarments = Koha::Patron::Debarments::GetDebarments({ borrowernumber => $patron->borrowernumber });
247
    $debarments = Koha::Patron::Debarments::GetDebarments({ borrowernumber => $patron->borrowernumber });
246
    is( scalar @$debarments, 0, 'OVERDUES debarment is removed if remaning items would not result in patron debarment' );
248
    is( scalar @$debarments, 0, 'OVERDUES debarment is removed if remaning items would not result in patron debarment' );
247
249
248
    $checkout_1 = AddIssue( $patron->unblessed, $item_1->barcode, $eleven_days_ago ); # overdue and would trigger debarment
250
    $checkout_1 = AddIssue( $patron->unblessed, $item_1->barcode, $ten_days_ago ); # overdue and would trigger debarment
249
251
250
    Koha::Patron::Debarments::AddUniqueDebarment(
252
    Koha::Patron::Debarments::AddUniqueDebarment(
251
        {
253
        {
Lines 260-271 subtest 'AutoRemoveOverduesRestrictions' => sub { Link Here
260
    $debarments = Koha::Patron::Debarments::GetDebarments({ borrowernumber => $patron->borrowernumber });
262
    $debarments = Koha::Patron::Debarments::GetDebarments({ borrowernumber => $patron->borrowernumber });
261
    is( $debarments->[0]->{type}, 'OVERDUES', 'OVERDUES debarment is not removed if patron still has overdues that would trigger debarment' );
263
    is( $debarments->[0]->{type}, 'OVERDUES', 'OVERDUES debarment is not removed if patron still has overdues that would trigger debarment' );
262
264
263
    my $thirteen_days_ago = dt_from_string->subtract( days => 13 );
265
    my $eleven_days_ago = dt_from_string->subtract( days => 11 );
264
266
265
    # overdue and would trigger debarment
267
    # overdue and would trigger debarment
266
    $checkout_2 = AddIssue( $patron->unblessed, $item_2->barcode, $thirteen_days_ago );
268
    $checkout_2 = AddIssue( $patron->unblessed, $item_2->barcode, $eleven_days_ago );
267
269
268
    # $chechout_1 should now not trigger debarment with this new rule for specific branchcode
270
    # $checkout_1 should now not trigger debarment with this new rule for specific branchcode
269
    $dbh->do(qq{
271
    $dbh->do(qq{
270
        INSERT INTO `overduerules` (
272
        INSERT INTO `overduerules` (
271
            `branchcode`,
273
            `branchcode`,
Lines 277-283 subtest 'AutoRemoveOverduesRestrictions' => sub { Link Here
277
            `letter2`,
279
            `letter2`,
278
            `debarred2`
280
            `debarred2`
279
        )
281
        )
280
        VALUES ('$branchcode', '$categorycode', 6, 'ODUE', 0, 12, 'ODUE2', 1)
282
        VALUES ('$branchcode', '$categorycode', 6, 'ODUE', 0, 11, 'ODUE2', 1)
281
    });
283
    });
282
284
283
    C4::Circulation::MarkIssueReturned( $patron->borrowernumber, $item_2->itemnumber );
285
    C4::Circulation::MarkIssueReturned( $patron->borrowernumber, $item_2->itemnumber );
284
- 

Return to bug 29145