Lines 2349-2355
subtest 'CanBookBeIssued + AutoReturnCheckedOutItems' => sub {
Link Here
|
2349 |
|
2349 |
|
2350 |
|
2350 |
|
2351 |
subtest 'AddReturn | is_overdue' => sub { |
2351 |
subtest 'AddReturn | is_overdue' => sub { |
2352 |
plan tests => 6; |
2352 |
plan tests => 7; |
2353 |
|
2353 |
|
2354 |
t::lib::Mocks::mock_preference('MarkLostItemsAsReturned', 'batchmod|moredetail|cronjob|additem|pendingreserves|onpayment'); |
2354 |
t::lib::Mocks::mock_preference('MarkLostItemsAsReturned', 'batchmod|moredetail|cronjob|additem|pendingreserves|onpayment'); |
2355 |
t::lib::Mocks::mock_preference('CalculateFinesOnReturn', 1); |
2355 |
t::lib::Mocks::mock_preference('CalculateFinesOnReturn', 1); |
Lines 2385-2390
subtest 'AddReturn | is_overdue' => sub {
Link Here
|
2385 |
|
2385 |
|
2386 |
my $now = dt_from_string; |
2386 |
my $now = dt_from_string; |
2387 |
my $one_day_ago = $now->clone->subtract( days => 1 ); |
2387 |
my $one_day_ago = $now->clone->subtract( days => 1 ); |
|
|
2388 |
my $two_days_ago = $now->clone->subtract( days => 2 ); |
2388 |
my $five_days_ago = $now->clone->subtract( days => 5 ); |
2389 |
my $five_days_ago = $now->clone->subtract( days => 5 ); |
2389 |
my $ten_days_ago = $now->clone->subtract( days => 10 ); |
2390 |
my $ten_days_ago = $now->clone->subtract( days => 10 ); |
2390 |
$patron = Koha::Patrons->find( $patron->{borrowernumber} ); |
2391 |
$patron = Koha::Patrons->find( $patron->{borrowernumber} ); |
Lines 2449-2457
subtest 'AddReturn | is_overdue' => sub {
Link Here
|
2449 |
Koha::Account::Lines->search({ borrowernumber => $patron->borrowernumber })->delete; |
2450 |
Koha::Account::Lines->search({ borrowernumber => $patron->borrowernumber })->delete; |
2450 |
}; |
2451 |
}; |
2451 |
|
2452 |
|
2452 |
subtest 'bug 25417 | backdated return + exemptfine' => sub { |
2453 |
subtest 'bug 8338 | backdated return resulting in zero amount fine' => sub { |
2453 |
|
2454 |
|
2454 |
plan tests => 6; |
2455 |
plan tests => 17; |
2455 |
|
2456 |
|
2456 |
t::lib::Mocks::mock_preference('CalculateFinesOnBackdate', 1); |
2457 |
t::lib::Mocks::mock_preference('CalculateFinesOnBackdate', 1); |
2457 |
|
2458 |
|
Lines 2473-2492
subtest 'AddReturn | is_overdue' => sub {
Link Here
|
2473 |
is( int( $patron->account->balance() ), |
2474 |
is( int( $patron->account->balance() ), |
2474 |
1, "Overdue fine of 1 day overdue" ); |
2475 |
1, "Overdue fine of 1 day overdue" ); |
2475 |
|
2476 |
|
2476 |
# Backdated return (dropbox mode example - charge should exist but be zero) |
2477 |
# Backdated return (dropbox mode example - charge should be removed) |
2477 |
AddReturn( $item->{barcode}, $library->{branchcode}, 1, $one_day_ago ); |
2478 |
AddReturn( $item->{barcode}, $library->{branchcode}, 1, $one_day_ago ); |
2478 |
is( int( $patron->account->balance() ), |
2479 |
is( int( $patron->account->balance() ), |
2479 |
0, "Overdue fine should be annulled" ); |
2480 |
0, "Overdue fine should be annulled" ); |
2480 |
my $lines = Koha::Account::Lines->search({ borrowernumber => $patron->borrowernumber }); |
2481 |
my $lines = Koha::Account::Lines->search({ borrowernumber => $patron->borrowernumber }); |
2481 |
is( $lines->count, 1, "Overdue fine accountlines still exists"); |
2482 |
is( $lines->count, 0, "Overdue fine accountline has been removed"); |
|
|
2483 |
|
2484 |
$issue = AddIssue( $patron->unblessed, $item->{barcode}, $two_days_ago ); # date due was 2d ago |
2485 |
|
2486 |
# Fake fines cronjob on this checkout |
2487 |
($fine) = |
2488 |
CalcFine( $item, $patron->categorycode, $library->{branchcode}, |
2489 |
$two_days_ago, $now ); |
2490 |
UpdateFine( |
2491 |
{ |
2492 |
issue_id => $issue->issue_id, |
2493 |
itemnumber => $item->{itemnumber}, |
2494 |
borrowernumber => $patron->borrowernumber, |
2495 |
amount => $fine, |
2496 |
due => output_pref($one_day_ago) |
2497 |
} |
2498 |
); |
2499 |
is( int( $patron->account->balance() ), |
2500 |
2, "Overdue fine of 2 days overdue" ); |
2501 |
|
2502 |
# Payment made against fine |
2503 |
$lines = Koha::Account::Lines->search({ borrowernumber => $patron->borrowernumber }); |
2504 |
my $debit = $lines->next; |
2505 |
my $credit = $patron->account->add_credit( |
2506 |
{ |
2507 |
amount => 2, |
2508 |
type => 'PAYMENT', |
2509 |
interface => 'test', |
2510 |
} |
2511 |
); |
2512 |
$credit->apply( |
2513 |
{ debits => [ $debit ], offset_type => 'Payment' } ); |
2514 |
|
2515 |
is( int( $patron->account->balance() ), |
2516 |
0, "Overdue fine should be paid off" ); |
2517 |
$lines = Koha::Account::Lines->search({ borrowernumber => $patron->borrowernumber }); |
2518 |
is ( $lines->count, 2, "Overdue (debit) and Payment (credit) present"); |
2482 |
my $line = $lines->next; |
2519 |
my $line = $lines->next; |
2483 |
is($line->amount+0,0, "Overdue fine amount has been reduced to 0"); |
2520 |
is( $line->amount+0, 2, "Overdue fine amount remains as 2 days"); |
2484 |
is($line->amountoutstanding+0,0, "Overdue fine amount outstanding has been reduced to 0"); |
2521 |
is( $line->amountoutstanding+0, 0, "Overdue fine amountoutstanding reduced to 0"); |
2485 |
is($line->status,'RETURNED', "Overdue fine was fixed"); |
2522 |
|
|
|
2523 |
# Backdated return (dropbox mode example - charge should be removed) |
2524 |
AddReturn( $item->{barcode}, $library->{branchcode}, undef, $one_day_ago ); |
2525 |
is( int( $patron->account->balance() ), |
2526 |
-1, "Refund credit has been applied" ); |
2527 |
$lines = Koha::Account::Lines->search({ borrowernumber => $patron->borrowernumber }, { order_by => { '-asc' => 'accountlines_id' }}); |
2528 |
is( $lines->count, 3, "Overdue (debit), Payment (credit) and Refund (credit) are all present"); |
2529 |
|
2530 |
$line = $lines->next; |
2531 |
is($line->amount+0,1, "Overdue fine amount has been reduced to 1"); |
2532 |
is($line->amountoutstanding+0,0, "Overdue fine amount outstanding remains at 0"); |
2533 |
is($line->status,'RETURNED', "Overdue fine is fixed"); |
2534 |
$line = $lines->next; |
2535 |
is($line->amount+0,-2, "Original payment amount remains as 2"); |
2536 |
is($line->amountoutstanding+0,0, "Original payment remains applied"); |
2537 |
$line = $lines->next; |
2538 |
is($line->amount+0,-1, "Refund amount correctly set to 1"); |
2539 |
is($line->amountoutstanding+0,-1, "Refund amount outstanding unspent"); |
2486 |
|
2540 |
|
2487 |
# Cleanup |
2541 |
# Cleanup |
2488 |
Koha::Account::Lines->search({ borrowernumber => $patron->borrowernumber })->delete; |
2542 |
Koha::Account::Lines->search({ borrowernumber => $patron->borrowernumber })->delete; |
2489 |
}; |
2543 |
}; |
|
|
2544 |
|
2545 |
subtest 'bug 25417 | backdated return + exemptfine' => sub { |
2546 |
|
2547 |
plan tests => 2; |
2548 |
|
2549 |
t::lib::Mocks::mock_preference('CalculateFinesOnBackdate', 1); |
2550 |
|
2551 |
my $issue = AddIssue( $patron->unblessed, $item->{barcode}, $one_day_ago ); # date due was 1d ago |
2552 |
|
2553 |
# Fake fines cronjob on this checkout |
2554 |
my ($fine) = |
2555 |
CalcFine( $item, $patron->categorycode, $library->{branchcode}, |
2556 |
$one_day_ago, $now ); |
2557 |
UpdateFine( |
2558 |
{ |
2559 |
issue_id => $issue->issue_id, |
2560 |
itemnumber => $item->{itemnumber}, |
2561 |
borrowernumber => $patron->borrowernumber, |
2562 |
amount => $fine, |
2563 |
due => output_pref($one_day_ago) |
2564 |
} |
2565 |
); |
2566 |
is( int( $patron->account->balance() ), |
2567 |
1, "Overdue fine of 1 day overdue" ); |
2568 |
|
2569 |
# Backdated return (dropbox mode example - charge should no longer exist) |
2570 |
AddReturn( $item->{barcode}, $library->{branchcode}, 1, $one_day_ago ); |
2571 |
is( int( $patron->account->balance() ), |
2572 |
0, "Overdue fine should be annulled" ); |
2573 |
}; |
2490 |
}; |
2574 |
}; |
2491 |
|
2575 |
|
2492 |
subtest '_FixAccountForLostAndFound' => sub { |
2576 |
subtest '_FixAccountForLostAndFound' => sub { |
2493 |
- |
|
|