X-Git-Url: http://koha-dev.rot13.org:8081/gitweb/?a=blobdiff_plain;f=C4%2FOverdues.pm;h=ac66c365b95a972218a5bdaceb99c8d85e6466a8;hb=d03c8443a4c5a4549a3ee37df201f031b40b2f41;hp=c7430c99a7aa861031b0f85ae7569f6566ff5d56;hpb=66350848b68e64af64bc0778b8ea0ac5ef115381;p=koha_fer diff --git a/C4/Overdues.pm b/C4/Overdues.pm index c7430c99a7..ac66c365b9 100644 --- a/C4/Overdues.pm +++ b/C4/Overdues.pm @@ -33,7 +33,7 @@ use vars qw($VERSION @ISA @EXPORT); BEGIN { # set the version for version checking - $VERSION = 3.01; + $VERSION = 3.07.00.049; require Exporter; @ISA = qw(Exporter); # subs to rename (and maybe merge some...) @@ -241,8 +241,8 @@ C<$amount> is the fine owed by the patron (see above). C<$chargename> is the chargename field from the applicable record in the categoryitem table, whatever that is. -C<$daycount> is the number of days between start and end dates, Calendar adjusted (where needed), -minus any applicable grace period. +C<$unitcount> is the number of chargeable units (days between start and end dates, Calendar adjusted where needed, +minus any applicable grace period, or hours) FIXME - What is chargename supposed to be ? @@ -263,15 +263,14 @@ sub CalcFine { my $chargeable_units = _get_chargeable_units($fine_unit, $start_date, $end_date, $branchcode); my $units_minus_grace = $chargeable_units - $data->{firstremind}; my $amount = 0; - if ($data->{'chargeperiod'} && $units_minus_grace ) { + if ($data->{'chargeperiod'} && ($units_minus_grace > 0) ) { $amount = int($chargeable_units / $data->{'chargeperiod'}) * $data->{'fine'};# TODO fine calc should be in cents } else { - # a zero (or null) chargeperiod means no charge. + # a zero (or null) chargeperiod or negative units_minus_grace value means no charge. } - if(C4::Context->preference('maxFine') && ( $amount > C4::Context->preference('maxFine'))) { - $amount = C4::Context->preference('maxFine'); - } - return ($amount, $data->{chargename}, $units_minus_grace); + $amount = $data->{overduefinescap} if $data->{overduefinescap} && $amount > $data->{overduefinescap}; + $debug and warn sprintf("CalcFine returning (%s, %s, %s, %s)", $amount, $data->{'chargename'}, $units_minus_grace, $chargeable_units); + return ($amount, $data->{'chargename'}, $units_minus_grace, $chargeable_units); # FIXME: chargename is NEVER populated anywhere. } @@ -521,14 +520,39 @@ sub UpdateFine { # "REF" is Cash Refund my $sth = $dbh->prepare( "SELECT * FROM accountlines - WHERE itemnumber=? - AND borrowernumber=? - AND accounttype IN ('FU','O','F','M') - AND description like ? " + WHERE borrowernumber=? + AND accounttype IN ('FU','O','F','M')" ); - $sth->execute( $itemnum, $borrowernumber, "%$due%" ); + $sth->execute( $borrowernumber ); + my $data; + my $total_amount_other = 0.00; + my $due_qr = qr/$due/; + # Cycle through the fines and + # - find line that relates to the requested $itemnum + # - accumulate fines for other items + # so we can update $itemnum fine taking in account fine caps + while (my $rec = $sth->fetchrow_hashref) { + if ($rec->{itemnumber} == $itemnum && $rec->{description} =~ /$due_qr/) { + if ($data) { + warn "Not a unique accountlines record for item $itemnum borrower $borrowernumber"; + } else { + $data = $rec; + next; + } + } + $total_amount_other += $rec->{'amount'}; + } + if (my $maxfine = C4::Context->preference('MaxFine')) { + if ($total_amount_other + $amount > $maxfine) { + my $new_amount = $maxfine - $total_amount_other; + warn "Reducing fine for item $itemnum borrower $borrowernumber from $amount to $new_amount - MaxFine reached"; + return if $new_amount <= 0.00; + + $amount = $new_amount; + } + } - if ( my $data = $sth->fetchrow_hashref ) { + if ( $data ) { # we're updating an existing fine. Only modify if amount changed # Note that in the current implementation, you cannot pay against an accruing fine