Bug 22200: Add credit when forgiving overdue
authorMartin Renvoize <martin.renvoize@ptfs-europe.com>
Thu, 18 Apr 2019 08:44:01 +0000 (09:44 +0100)
committerNick Clemens <nick@bywatersolutions.com>
Fri, 26 Apr 2019 10:28:48 +0000 (10:28 +0000)
Prior to this patch the exemptfine option for_FixOverduesOnReturn would
directly set the overdue amount to 0 rather than creating an appropriate
credit of the type forgiven and offseting it against the debt.

Test Plan:
1) Find a checkout that is overdue with fines
2) Check the item in with the forgive fines option checked
3) Note that the users account details now shows the overdue as forgiven
and a forgiven credit is added which matches the overdue amount (and is
applied against it, i.e. both overdue and forgiven lines have 0
amountoutstanding).

Signed-off-by: Martin Renvoize <martin.renvoize@ptfs-europe.com>

Signed-off-by: Kyle M Hall <kyle@bywatersolutions.com>
Signed-off-by: Tomas Cohen Arazi <tomascohen@theke.io>

Signed-off-by: Nick Clemens <nick@bywatersolutions.com>

C4/Circulation.pm

index dd913e6..51dde19 100644 (file)
@@ -2339,29 +2339,35 @@ sub _FixOverduesOnReturn {
     }
 
     # check for overdue fine
-    my $accountline = Koha::Account::Lines->search(
+    my $accountlines = Koha::Account::Lines->search(
         {
             borrowernumber => $borrowernumber,
             itemnumber     => $item,
             accounttype    => 'OVERDUE',
             status         => 'UNRETURNED'
         }
-    )->next();
-    return 0 unless $accountline;    # no warning, there's just nothing to fix
+    );
+    return 0 unless $accountlines->count; # no warning, there's just nothing to fix
 
+    my $accountline = $accountlines->next;
     if ($exemptfine) {
         my $amountoutstanding = $accountline->amountoutstanding;
 
-        $accountline->status('FORGIVEN');
-        $accountline->amountoutstanding(0);
-
-        Koha::Account::Offset->new(
+        my $account = Koha::Account->new({patron_id => $borrowernumber});
+        my $credit = $account->add_credit(
             {
-                debit_id => $accountline->id,
-                type => 'Forgiven',
-                amount => $amountoutstanding * -1,
+                amount     => $amountoutstanding,
+                user_id    => C4::Context->userenv ? C4::Context->userenv->{'number'} : undef,
+                library_id => C4::Context->userenv ? C4::Context->userenv->{'branch'} : undef,
+                interface  => C4::Context->interface,
+                type       => 'forgiven',
+                item_id    => $item
             }
-        )->store();
+        );
+
+        $credit->apply({ debits => $accountlines->reset, offset_type => 'Forgiven' });
+
+        $accountline->status('FORGIVEN');
 
         if (C4::Context->preference("FinesLog")) {
             &logaction("FINES", 'MODIFY',$borrowernumber,"Overdue forgiven: item $item");