+ t::lib::Mocks::mock_preference( 'MaxFine', 0 );
+
+ # Ensure CalcFine calculations work correctly for floats (bug #27079)
+ # 1.800000 (amount from database) != 1.8~ (CalcFine of 0.15cents * 12units) (😢)
+ my $amount = 0.15 * 12;
+ UpdateFine(
+ {
+ issue_id => $checkout_2->issue_id,
+ itemnumber => $item_2->itemnumber,
+ borrowernumber => $patron_1->borrowernumber,
+ amount => $amount,
+ due => $checkout_2->date_due
+ }
+ );
+ $fine = Koha::Account::Lines->search({ issue_id => $checkout_2->issue_id })->single;
+ ok( $fine, 'Fine added for checkout 2');
+ is( $fine->amount, "1.800000", "Fine amount is 1.800000 as expected");
+
+ $fine->amountoutstanding(0)->store;
+ $fine->discard_changes;
+ is( $fine->amountoutstanding + 0, 0, "Fine was paid off");
+ UpdateFine(
+ {
+ issue_id => $checkout_2->issue_id,
+ itemnumber => $item_2->itemnumber,
+ borrowernumber => $patron_1->borrowernumber,
+ amount => $amount,
+ due => $checkout_2->date_due
+ }
+ );
+ my $refunds = Koha::Account::Lines->search({ itemnumber => $item_2->itemnumber, credit_type_code => 'OVERPAYMENT' });
+ is( $refunds->count, 0, "Overpayment refund not added when the amounts are equal" );
+
+ # Adding an OVERDUE fine not linked with a checkout (possible with historical OVERDUE fines)
+ $builder->build_object(
+ {
+ class => "Koha::Account::Lines",
+ value => {
+ borrowernumber => $patron_1->borrowernumber,
+ issue_id => undef,
+ debit_type_code => 'OVERDUE',
+ }
+ }
+ );
+ $fine->issue_id(undef)->store;
+ warnings_are {
+ UpdateFine(
+ {
+ issue_id => $checkout_2->issue_id,
+ itemnumber => $item_2->itemnumber,
+ borrowernumber => $patron_1->borrowernumber,
+ amount => $amount,
+ due => $checkout_2->date_due
+ }
+ );
+ } [], 'No warning generated if fine is not linked with a checkout';