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

(-)a/C4/Circulation.pm (-11 / +13 lines)
Lines 1455-1461 sub AddIssue { Link Here
1455
                    )
1455
                    )
1456
                  )
1456
                  )
1457
                {
1457
                {
1458
                    _FixAccountForLostAndReturned( $item_object->itemnumber, undef,
1458
                    _FixAccountForLostAndFound( $item_object->itemnumber, undef,
1459
                        $item_object->barcode );
1459
                        $item_object->barcode );
1460
                }
1460
                }
1461
            }
1461
            }
Lines 2037-2043 sub AddReturn { Link Here
2037
                )
2037
                )
2038
              )
2038
              )
2039
            {
2039
            {
2040
                _FixAccountForLostAndReturned( $item->itemnumber,
2040
                _FixAccountForLostAndFound( $item->itemnumber,
2041
                    $borrowernumber, $barcode );
2041
                    $borrowernumber, $barcode );
2042
                $messages->{'LostItemFeeRefunded'} = 1;
2042
                $messages->{'LostItemFeeRefunded'} = 1;
2043
            }
2043
            }
Lines 2443-2451 sub _FixOverduesOnReturn { Link Here
2443
    return $result;
2443
    return $result;
2444
}
2444
}
2445
2445
2446
=head2 _FixAccountForLostAndReturned
2446
=head2 _FixAccountForLostAndFound
2447
2447
2448
  &_FixAccountForLostAndReturned($itemnumber, [$borrowernumber, $barcode]);
2448
  &_FixAccountForLostAndFound($itemnumber, [$borrowernumber, $barcode]);
2449
2449
2450
Finds the most recent lost item charge for this item and refunds the borrower
2450
Finds the most recent lost item charge for this item and refunds the borrower
2451
appropriatly, taking into account any payments or writeoffs already applied
2451
appropriatly, taking into account any payments or writeoffs already applied
Lines 2455-2461 Internal function, not exported, called only by AddReturn. Link Here
2455
2455
2456
=cut
2456
=cut
2457
2457
2458
sub _FixAccountForLostAndReturned {
2458
sub _FixAccountForLostAndFound {
2459
    my $itemnumber     = shift or return;
2459
    my $itemnumber     = shift or return;
2460
    my $borrowernumber = @_ ? shift : undef;
2460
    my $borrowernumber = @_ ? shift : undef;
2461
    my $item_id        = @_ ? shift : $itemnumber;  # Send the barcode if you want that logged in the description
2461
    my $item_id        = @_ ? shift : $itemnumber;  # Send the barcode if you want that logged in the description
Lines 2467-2473 sub _FixAccountForLostAndReturned { Link Here
2467
        {
2467
        {
2468
            itemnumber      => $itemnumber,
2468
            itemnumber      => $itemnumber,
2469
            debit_type_code => 'LOST',
2469
            debit_type_code => 'LOST',
2470
            status          => [ undef, { '<>' => 'RETURNED' } ]
2470
            status          => [ undef, { '<>' => 'FOUND' } ]
2471
        },
2471
        },
2472
        {
2472
        {
2473
            order_by => { -desc => [ 'date', 'accountlines_id' ] }
2473
            order_by => { -desc => [ 'date', 'accountlines_id' ] }
Lines 2506-2516 sub _FixAccountForLostAndReturned { Link Here
2506
    if ( $credit_total > 0 ) {
2506
    if ( $credit_total > 0 ) {
2507
        my $branchcode = C4::Context->userenv ? C4::Context->userenv->{'branch'} : undef;
2507
        my $branchcode = C4::Context->userenv ? C4::Context->userenv->{'branch'} : undef;
2508
        $credit = $account->add_credit(
2508
        $credit = $account->add_credit(
2509
            {   amount      => $credit_total,
2509
            {
2510
                description => 'Item Returned ' . $item_id,
2510
                amount      => $credit_total,
2511
                type        => 'LOST_RETURN',
2511
                description => 'Item found ' . $item_id,
2512
                type        => 'LOST_FOUND',
2512
                interface   => C4::Context->interface,
2513
                interface   => C4::Context->interface,
2513
                library_id  => $branchcode
2514
                library_id  => $branchcode,
2515
                item_id     => $itemnumber
2514
            }
2516
            }
2515
        );
2517
        );
2516
2518
Lines 2518-2524 sub _FixAccountForLostAndReturned { Link Here
2518
    }
2520
    }
2519
2521
2520
    # Update the account status
2522
    # Update the account status
2521
    $accountline->discard_changes->status('RETURNED');
2523
    $accountline->discard_changes->status('FOUND');
2522
    $accountline->store;
2524
    $accountline->store;
2523
2525
2524
    if ( defined $account and C4::Context->preference('AccountAutoReconcile') ) {
2526
    if ( defined $account and C4::Context->preference('AccountAutoReconcile') ) {
(-)a/Koha/Account.pm (-2 / +2 lines)
Lines 326-332 $credit_type can be any of: Link Here
326
  - 'CREDIT'
326
  - 'CREDIT'
327
  - 'PAYMENT'
327
  - 'PAYMENT'
328
  - 'FORGIVEN'
328
  - 'FORGIVEN'
329
  - 'LOST_RETURN'
329
  - 'LOST_FOUND'
330
  - 'WRITEOFF'
330
  - 'WRITEOFF'
331
331
332
=cut
332
=cut
Lines 741-747 sub reconcile_balance { Link Here
741
our $offset_type = {
741
our $offset_type = {
742
    'CREDIT'           => 'Manual Credit',
742
    'CREDIT'           => 'Manual Credit',
743
    'FORGIVEN'         => 'Writeoff',
743
    'FORGIVEN'         => 'Writeoff',
744
    'LOST_RETURN'      => 'Lost Item',
744
    'LOST_FOUND'       => 'Lost Item Found',
745
    'PAYMENT'          => 'Payment',
745
    'PAYMENT'          => 'Payment',
746
    'WRITEOFF'         => 'Writeoff',
746
    'WRITEOFF'         => 'Writeoff',
747
    'ACCOUNT'          => 'Account Fee',
747
    'ACCOUNT'          => 'Account Fee',
(-)a/api/v1/swagger/definitions/patron_account_credit.json (-1 / +1 lines)
Lines 3-9 Link Here
3
  "properties": {
3
  "properties": {
4
    "credit_type": {
4
    "credit_type": {
5
      "type": "string",
5
      "type": "string",
6
      "description": "Type of credit ('CREDIT', 'FORGIVEN', 'LOST_RETURN', 'PAYMENT', 'WRITEOFF' )"
6
      "description": "Type of credit ('CREDIT', 'FORGIVEN', 'LOST_FOUND', 'PAYMENT', 'WRITEOFF' )"
7
    },
7
    },
8
    "amount": {
8
    "amount": {
9
      "type": "number",
9
      "type": "number",
(-)a/koha-tmpl/intranet-tmpl/prog/en/includes/accounts.inc (-1 / +1 lines)
Lines 6-12 Link Here
6
            [%- CASE 'WRITEOFF'         -%]Writeoff
6
            [%- CASE 'WRITEOFF'         -%]Writeoff
7
            [%- CASE 'FORGIVEN'         -%]Forgiven
7
            [%- CASE 'FORGIVEN'         -%]Forgiven
8
            [%- CASE 'CREDIT'           -%]Credit
8
            [%- CASE 'CREDIT'           -%]Credit
9
            [%- CASE 'LOST_RETURN'      -%]Lost item fee refund
9
            [%- CASE 'LOST_FOUND'       -%]Lost item fee refund
10
            [%- CASE 'Refund'           -%]Refund
10
            [%- CASE 'Refund'           -%]Refund
11
            [%- CASE                    -%][% account.credit_type.description | html %]
11
            [%- CASE                    -%][% account.credit_type.description | html %]
12
        [%- END -%]
12
        [%- END -%]
(-)a/koha-tmpl/opac-tmpl/bootstrap/en/includes/account-table.inc (-1 / +1 lines)
Lines 175-181 Link Here
175
            [%- CASE 'WRITEOFF'         -%]Writeoff
175
            [%- CASE 'WRITEOFF'         -%]Writeoff
176
            [%- CASE 'FORGIVEN'         -%]Forgiven
176
            [%- CASE 'FORGIVEN'         -%]Forgiven
177
            [%- CASE 'CREDIT'           -%]Credit
177
            [%- CASE 'CREDIT'           -%]Credit
178
            [%- CASE 'LOST_RETURN'      -%]Lost item fee refund
178
            [%- CASE 'LOST_FOUND'       -%]Lost item fee refund
179
            [%- CASE                    -%][% account.credit_type.description | html %]
179
            [%- CASE                    -%][% account.credit_type.description | html %]
180
        [%- END -%]
180
        [%- END -%]
181
    [%- ELSIF account.debit_type_code -%]
181
    [%- ELSIF account.debit_type_code -%]
(-)a/t/db_dependent/Circulation.t (-26 / +25 lines)
Lines 2409-2415 subtest 'AddReturn | is_overdue' => sub { Link Here
2409
      }
2409
      }
2410
};
2410
};
2411
2411
2412
subtest '_FixAccountForLostAndReturned' => sub {
2412
subtest '_FixAccountForLostAndFound' => sub {
2413
2413
2414
    plan tests => 5;
2414
    plan tests => 5;
2415
2415
Lines 2487-2500 subtest '_FixAccountForLostAndReturned' => sub { Link Here
2487
        );
2487
        );
2488
        $credit->apply( { debits => [ $debts->as_list ], offset_type => 'Writeoff' } );
2488
        $credit->apply( { debits => [ $debts->as_list ], offset_type => 'Writeoff' } );
2489
2489
2490
        my $credit_return_id = C4::Circulation::_FixAccountForLostAndReturned( $item->itemnumber, $patron->id );
2490
        my $credit_return_id = C4::Circulation::_FixAccountForLostAndFound( $item->itemnumber, $patron->id );
2491
        is( $credit_return_id, undef, 'No LOST_RETURN account line added' );
2491
        is( $credit_return_id, undef, 'No LOST_FOUND account line added' );
2492
2492
2493
        $lost_fee_line->discard_changes; # reload from DB
2493
        $lost_fee_line->discard_changes; # reload from DB
2494
        is( $lost_fee_line->amountoutstanding + 0, 0, 'Lost fee has no outstanding amount' );
2494
        is( $lost_fee_line->amountoutstanding + 0, 0, 'Lost fee has no outstanding amount' );
2495
        is( $lost_fee_line->debit_type_code,
2495
        is( $lost_fee_line->debit_type_code,
2496
            'LOST', 'Lost fee now still has account type of LOST' );
2496
            'LOST', 'Lost fee now still has account type of LOST' );
2497
        is( $lost_fee_line->status, 'RETURNED', "Lost fee now has account status of RETURNED");
2497
        is( $lost_fee_line->status, 'FOUND', "Lost fee now has account status of FOUND");
2498
2498
2499
        is( $patron->account->balance, -0, 'The patron balance is 0, everything was written off' );
2499
        is( $patron->account->balance, -0, 'The patron balance is 0, everything was written off' );
2500
    };
2500
    };
Lines 2549-2568 subtest '_FixAccountForLostAndReturned' => sub { Link Here
2549
        );
2549
        );
2550
        $credit->apply( { debits => [ $debts->as_list ], offset_type => 'Payment' } );
2550
        $credit->apply( { debits => [ $debts->as_list ], offset_type => 'Payment' } );
2551
2551
2552
        my $credit_return_id = C4::Circulation::_FixAccountForLostAndReturned( $item->itemnumber, $patron->id );
2552
        my $credit_return_id = C4::Circulation::_FixAccountForLostAndFound( $item->itemnumber, $patron->id );
2553
        my $credit_return = Koha::Account::Lines->find($credit_return_id);
2553
        my $credit_return = Koha::Account::Lines->find($credit_return_id);
2554
2554
2555
        is( $credit_return->credit_type_code, 'LOST_RETURN', 'An account line of type LOST_RETURN is added' );
2555
        is( $credit_return->credit_type_code, 'LOST_FOUND', 'An account line of type LOST_FOUND is added' );
2556
        is( $credit_return->amount + 0,
2556
        is( $credit_return->amount + 0,
2557
            -99.00, 'The account line of type LOST_RETURN has an amount of -99' );
2557
            -99.00, 'The account line of type LOST_FOUND has an amount of -99' );
2558
        is( $credit_return->amountoutstanding + 0,
2558
        is( $credit_return->amountoutstanding + 0,
2559
            -99.00, 'The account line of type LOST_RETURN has an amountoutstanding of -99' );
2559
            -99.00, 'The account line of type LOST_FOUND has an amountoutstanding of -99' );
2560
2560
2561
        $lost_fee_line->discard_changes;
2561
        $lost_fee_line->discard_changes;
2562
        is( $lost_fee_line->amountoutstanding + 0, 0, 'Lost fee has no outstanding amount' );
2562
        is( $lost_fee_line->amountoutstanding + 0, 0, 'Lost fee has no outstanding amount' );
2563
        is( $lost_fee_line->debit_type_code,
2563
        is( $lost_fee_line->debit_type_code,
2564
            'LOST', 'Lost fee now still has account type of LOST' );
2564
            'LOST', 'Lost fee now still has account type of LOST' );
2565
        is( $lost_fee_line->status, 'RETURNED', "Lost fee now has account status of RETURNED");
2565
        is( $lost_fee_line->status, 'FOUND', "Lost fee now has account status of FOUND");
2566
2566
2567
        is( $patron->account->balance,
2567
        is( $patron->account->balance,
2568
            -99, 'The patron balance is -99, a credit that equals the lost fee payment' );
2568
            -99, 'The patron balance is -99, a credit that equals the lost fee payment' );
Lines 2607-2624 subtest '_FixAccountForLostAndReturned' => sub { Link Here
2607
        is( $lost_fee_line->amountoutstanding + 0,
2607
        is( $lost_fee_line->amountoutstanding + 0,
2608
            $replacement_amount, 'The right LOST amountountstanding is generated' );
2608
            $replacement_amount, 'The right LOST amountountstanding is generated' );
2609
2609
2610
        my $credit_return_id = C4::Circulation::_FixAccountForLostAndReturned( $item->itemnumber, $patron->id );
2610
        my $credit_return_id = C4::Circulation::_FixAccountForLostAndFound( $item->itemnumber, $patron->id );
2611
        my $credit_return = Koha::Account::Lines->find($credit_return_id);
2611
        my $credit_return = Koha::Account::Lines->find($credit_return_id);
2612
2612
2613
        is( $credit_return->credit_type_code, 'LOST_RETURN', 'An account line of type LOST_RETURN is added' );
2613
        is( $credit_return->credit_type_code, 'LOST_FOUND', 'An account line of type LOST_FOUND is added' );
2614
        is( $credit_return->amount + 0, -99.00, 'The account line of type LOST_RETURN has an amount of -99' );
2614
        is( $credit_return->amount + 0, -99.00, 'The account line of type LOST_FOUND has an amount of -99' );
2615
        is( $credit_return->amountoutstanding + 0, 0, 'The account line of type LOST_RETURN has an amountoutstanding of 0' );
2615
        is( $credit_return->amountoutstanding + 0, 0, 'The account line of type LOST_FOUND has an amountoutstanding of 0' );
2616
2616
2617
        $lost_fee_line->discard_changes;
2617
        $lost_fee_line->discard_changes;
2618
        is( $lost_fee_line->amountoutstanding + 0, 0, 'Lost fee has no outstanding amount' );
2618
        is( $lost_fee_line->amountoutstanding + 0, 0, 'Lost fee has no outstanding amount' );
2619
        is( $lost_fee_line->debit_type_code,
2619
        is( $lost_fee_line->debit_type_code,
2620
            'LOST', 'Lost fee now still has account type of LOST' );
2620
            'LOST', 'Lost fee now still has account type of LOST' );
2621
        is( $lost_fee_line->status, 'RETURNED', "Lost fee now has account status of RETURNED");
2621
        is( $lost_fee_line->status, 'FOUND', "Lost fee now has account status of FOUND");
2622
2622
2623
        is( $patron->account->balance, 20, 'The patron balance is 20, still owes the processing fee' );
2623
        is( $patron->account->balance, 20, 'The patron balance is 20, still owes the processing fee' );
2624
    };
2624
    };
Lines 2693-2717 subtest '_FixAccountForLostAndReturned' => sub { Link Here
2693
        $lost_fee_line->discard_changes;
2693
        $lost_fee_line->discard_changes;
2694
        my $outstanding = $lost_fee_line->amountoutstanding;
2694
        my $outstanding = $lost_fee_line->amountoutstanding;
2695
2695
2696
        my $credit_return_id = C4::Circulation::_FixAccountForLostAndReturned( $item->itemnumber, $patron->id );
2696
        my $credit_return_id = C4::Circulation::_FixAccountForLostAndFound( $item->itemnumber, $patron->id );
2697
        my $credit_return = Koha::Account::Lines->find($credit_return_id);
2697
        my $credit_return = Koha::Account::Lines->find($credit_return_id);
2698
2698
2699
        is( $account->balance, $processfee_amount - $payment_amount, 'Balance is PROCESSING - PAYMENT (LOST_RETURN)' );
2699
        is( $account->balance, $processfee_amount - $payment_amount, 'Balance is PROCESSING - PAYMENT (LOST_FOUND)' );
2700
2700
2701
        $lost_fee_line->discard_changes;
2701
        $lost_fee_line->discard_changes;
2702
        is( $lost_fee_line->amountoutstanding + 0, 0, 'Lost fee has no outstanding amount' );
2702
        is( $lost_fee_line->amountoutstanding + 0, 0, 'Lost fee has no outstanding amount' );
2703
        is( $lost_fee_line->debit_type_code,
2703
        is( $lost_fee_line->debit_type_code,
2704
            'LOST', 'Lost fee now still has account type of LOST' );
2704
            'LOST', 'Lost fee now still has account type of LOST' );
2705
        is( $lost_fee_line->status, 'RETURNED', "Lost fee now has account status of RETURNED");
2705
        is( $lost_fee_line->status, 'FOUND', "Lost fee now has account status of FOUND");
2706
2706
2707
        is( $credit_return->credit_type_code, 'LOST_RETURN', 'An account line of type LOST_RETURN is added' );
2707
        is( $credit_return->credit_type_code, 'LOST_FOUND', 'An account line of type LOST_FOUND is added' );
2708
        is( $credit_return->amount + 0,
2708
        is( $credit_return->amount + 0,
2709
            ($payment_amount + $outstanding ) * -1,
2709
            ($payment_amount + $outstanding ) * -1,
2710
            'The account line of type LOST_RETURN has an amount equal to the payment + outstanding'
2710
            'The account line of type LOST_FOUND has an amount equal to the payment + outstanding'
2711
        );
2711
        );
2712
        is( $credit_return->amountoutstanding + 0,
2712
        is( $credit_return->amountoutstanding + 0,
2713
            $payment_amount * -1,
2713
            $payment_amount * -1,
2714
            'The account line of type LOST_RETURN has an amountoutstanding equal to the payment'
2714
            'The account line of type LOST_FOUND has an amountoutstanding equal to the payment'
2715
        );
2715
        );
2716
2716
2717
        is( $account->balance,
2717
        is( $account->balance,
Lines 2789-2798 subtest '_FixAccountForLostAndReturned' => sub { Link Here
2789
2789
2790
        t::lib::Mocks::mock_preference( 'AccountAutoReconcile', 1 );
2790
        t::lib::Mocks::mock_preference( 'AccountAutoReconcile', 1 );
2791
2791
2792
        my $credit_return_id = C4::Circulation::_FixAccountForLostAndReturned( $item_id, $patron->id );
2792
        my $credit_return_id = C4::Circulation::_FixAccountForLostAndFound( $item_id, $patron->id );
2793
        my $credit_return = Koha::Account::Lines->find($credit_return_id);
2793
        my $credit_return = Koha::Account::Lines->find($credit_return_id);
2794
2794
2795
        is( $account->balance, $manual_debit_amount - $payment_amount, 'Balance is PROCESSING - payment (LOST_RETURN)' );
2795
        is( $account->balance, $manual_debit_amount - $payment_amount, 'Balance is PROCESSING - payment (LOST_FOUND)' );
2796
2796
2797
        my $manual_debit = Koha::Account::Lines->search({ borrowernumber => $patron->id, debit_type_code => 'OVERDUE', status => 'UNRETURNED' })->next;
2797
        my $manual_debit = Koha::Account::Lines->search({ borrowernumber => $patron->id, debit_type_code => 'OVERDUE', status => 'UNRETURNED' })->next;
2798
        is( $manual_debit->amountoutstanding + 0, $manual_debit_amount - $payment_amount, 'reconcile_balance was called' );
2798
        is( $manual_debit->amountoutstanding + 0, $manual_debit_amount - $payment_amount, 'reconcile_balance was called' );
Lines 2866-2872 subtest '_FixOverduesOnReturn' => sub { Link Here
2866
    is( $credit->amountoutstanding + 0, 0, "Credit amountoutstanding is correctly set to 0" );
2866
    is( $credit->amountoutstanding + 0, 0, "Credit amountoutstanding is correctly set to 0" );
2867
};
2867
};
2868
2868
2869
subtest '_FixAccountForLostAndReturned returns undef if patron is deleted' => sub {
2869
subtest '_FixAccountForLostAndFound returns undef if patron is deleted' => sub {
2870
    plan tests => 1;
2870
    plan tests => 1;
2871
2871
2872
    my $manager = $builder->build_object({ class => "Koha::Patrons" });
2872
    my $manager = $builder->build_object({ class => "Koha::Patrons" });
Lines 2902-2910 subtest '_FixAccountForLostAndReturned returns undef if patron is deleted' => su Link Here
2902
2902
2903
    $patron->delete();
2903
    $patron->delete();
2904
2904
2905
    my $return_value = C4::Circulation::_FixAccountForLostAndReturned( $patron->id, $item->itemnumber );
2905
    my $return_value = C4::Circulation::_FixAccountForLostAndFound( $patron->id, $item->itemnumber );
2906
2906
2907
    is( $return_value, undef, "_FixAccountForLostAndReturned returns undef if patron is deleted" );
2907
    is( $return_value, undef, "_FixAccountForLostAndFound returns undef if patron is deleted" );
2908
2908
2909
};
2909
};
2910
2910
2911
- 

Return to bug 24592