From 47b1794352d074a7b0291e28ea3fcb22e53d0c7f Mon Sep 17 00:00:00 2001 From: Jonathan Druart Date: Mon, 13 Aug 2018 12:40:22 -0300 Subject: [PATCH] Bug 21196: Use replacement cost from the item type if not set at item level 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 --- C4/Overdues.pm | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/C4/Overdues.pm b/C4/Overdues.pm index 6b75e3898a..0f8f02ae8d 100644 --- a/C4/Overdues.pm +++ b/C4/Overdues.pm @@ -245,6 +245,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'; @@ -262,7 +264,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. -- 2.11.0