Bug 21196: Use replacement cost from the item type if not set at item level
authorJonathan Druart <jonathan.druart@bugs.koha-community.org>
Mon, 13 Aug 2018 15:40:22 +0000 (12:40 -0300)
committerNick Clemens <nick@bywatersolutions.com>
Wed, 26 Sep 2018 16:00:30 +0000 (16:00 +0000)
When circ rules are set to cap at item replacement cost, calcfine only
checks the price in the item record, not the default replacement cost by
item type.

Note: We do not take '0' into account, what if you do not want to set
a replacement cost for an item? It is how it is done in chargelostitem
so keeping the existing behaviour, but that may be considered as a bug (?)

Test plan:
- Set useDefaultReplacementCost to use
- Set a default replacement cost for a given item type
- Create an item of that type with a replacementcost=0
- Create a circ rule for that item type that accrues fines but caps at
replacement cost
- check the item out, forcing a due date in the past
- check that item in
=> Fines should have been generated

Signed-off-by: Caroline Cyr La rose <caroline.cyr-la-rose@inlibro.com>
Signed-off-by: Katrin Fischer <katrin.fischer.83@web.de>
Signed-off-by: Nick Clemens <nick@bywatersolutions.com>
C4/Overdues.pm

index f5c5132..1e67b7f 100644 (file)
@@ -240,6 +240,8 @@ sub CalcFine {
     my $itemtype = $item->{itemtype} || $item->{itype};
     my $issuing_rule = Koha::IssuingRules->get_effective_issuing_rule({ categorycode => $bortype, itemtype => $itemtype, branchcode => $branchcode });
 
+    $itemtype = Koha::ItemTypes->find($itemtype);
+
     return unless $issuing_rule; # If not rule exist, there is no fine
 
     my $fine_unit = $issuing_rule->lengthunit || 'days';
@@ -257,7 +259,15 @@ sub CalcFine {
     } # else { # a zero (or null) chargeperiod or negative units_minus_grace value means no charge. }
 
     $amount = $issuing_rule->overduefinescap if $issuing_rule->overduefinescap && $amount > $issuing_rule->overduefinescap;
+
+    # This must be moved to Koha::Item (see also similar code in C4::Accounts::chargelostitem
+    $item->{replacementprice} ||= $itemtype->defaultreplacecost
+      if $itemtype
+      && $item->{replacementprice} == 0
+      && C4::Context->preference("useDefaultReplacementCost");
+
     $amount = $item->{replacementprice} if ( $issuing_rule->cap_fine_to_replacement_price && $item->{replacementprice} && $amount > $item->{replacementprice} );
+
     $debug and warn sprintf("CalcFine returning (%s, %s, %s, %s)", $amount, $issuing_rule->chargename, $units_minus_grace, $chargeable_units);
     return ($amount, $issuing_rule->chargename, $units_minus_grace, $chargeable_units);
     # FIXME: chargename is NEVER populated anywhere.