fines management (bugfixes & minor improvement)
authorPaul POULAIN <paul@koha-fr.org>
Wed, 17 Oct 2007 20:20:37 +0000 (15:20 -0500)
committerJoshua Ferraro <jmf@liblime.com>
Thu, 18 Oct 2007 21:25:00 +0000 (16:25 -0500)
- pay.pl fixed, the librarian can see patron fines & mark them paid
- fines2.pl fixed, the script now calculate the fines correctly from the finerules :
  * itemtype / patron category if it exist
  * itemtype / default if needed
- renamed misc/fines.pl as fines-sanop.pl
- added 2 systempreferences:
  * MaxFine: the max amount a patron can be charged for an item
  * NoReturnSetLost: how many days of late before a non returned item is marked lost & the patron charged for the full cost of replacement
(those values where hardcoded in fines2.pl
- C4/Circulation/Fines.pm has been removed (unused duplicate of C4/Overdues)

Note that SANOP feature about notify levels have NOT been ported here. I think they are too specific now, and the code is poorly written
I've renammed fines.pl to fines-sanop.pl to point that it is specific.
Thus, all notify_id related features are not used by anything (and always 0)
Can be interesting to reintroduce them, but that will probably be a large work...

Signed-off-by: Chris Cormack <crc@liblime.com>
Signed-off-by: Joshua Ferraro <jmf@liblime.com>
C4/Circulation/Fines.pm [deleted file]
C4/Members.pm
C4/Overdues.pm
admin/systempreferences.pl
installer/data/en/mandatory/sysprefs.sql
installer/data/fr/1-Obligatoire/unimarc_standard_systemprefs.sql
members/boraccount.pl
members/pay.pl
misc/fines-sanop.pl [new file with mode: 0644]
misc/fines.pl [deleted file]
misc/fines2.pl

diff --git a/C4/Circulation/Fines.pm b/C4/Circulation/Fines.pm
deleted file mode 100644 (file)
index 1907c3d..0000000
+++ /dev/null
@@ -1,1088 +0,0 @@
-package C4::Circulation::Fines;
-
-# $Id$
-
-# Copyright 2000-2002 Katipo Communications
-#
-# This file is part of Koha.
-#
-# Koha is free software; you can redistribute it and/or modify it under the
-# terms of the GNU General Public License as published by the Free Software
-# Foundation; either version 2 of the License, or (at your option) any later
-# version.
-#
-# Koha is distributed in the hope that it will be useful, but WITHOUT ANY
-# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
-# A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License along with
-# Koha; if not, write to the Free Software Foundation, Inc., 59 Temple Place,
-# Suite 330, Boston, MA  02111-1307 USA
-
-use strict;
-require Exporter;
-use C4::Context;
-use Date::Calc qw/Today/;
-use vars qw($VERSION @ISA @EXPORT);
-use C4::Accounts;
-use Date::Manip qw/UnixDate/;
-use C4::Log; # logaction
-
-# set the version for version checking
-$VERSION = do { my @v = '$Revision$' =~ /\d+/g; 
-shift(@v) . "." . join("_", map {sprintf "%03d", $_ } @v); };
-
-=head1 NAME
-
-C4::Circulation::Fines - Koha module dealing with fines
-
-=head1 SYNOPSIS
-
-  use C4::Overdues;
-
-=head1 DESCRIPTION
-
-This module contains several functions for dealing with fines for
-overdue items. It is primarily used by the 'misc/fines2.pl' script.
-
-=head1 FUNCTIONS
-
-=over 2
-
-=cut
-
-@ISA    = qw(Exporter);
-# subs to rename (and maybe merge some...)
-push @EXPORT, qw(
-        &CalcFine
-        &Getoverdues
-        &CheckAccountLineLevelInfo
-        &CheckAccountLineItemInfo
-        &CheckExistantNotifyid
-        &GetNextIdNotify
-        &GetNotifyId
-        &NumberNotifyId
-        &AmountNotify
-        &UpdateAccountLines
-        &UpdateFine
-        &GetOverdueDelays
-        &GetOverduerules
-        &GetFine
-        &CreateItemAccountLine
-        &ReplacementCost2
-);
-# subs to remove
-push @EXPORT, qw(
-        &BorType
-);
-
-#
-# All subs to move : check that an equivalent don't exist already before moving
-#
-
-# subs to move to Circulation.pm
-push @EXPORT, qw(
-        &GetIssuingRules
-        &GetIssuesIteminfo
-);
-# subs to move to Members.pm
-push @EXPORT, qw(
-        &CheckBorrowerDebarred
-        &UpdateBorrowerDebarred
-);
-# subs to move to Biblio.pm
-push @EXPORT, qw(
-        &GetItems
-        &ReplacementCost
-);
-
-=item Getoverdues
-
-  ($count, $overdues) = &Getoverdues();
-
-Returns the list of all overdue books.
-
-C<$count> is the number of elements in C<@{$overdues}>.
-
-C<$overdues> is a reference-to-array. Each element is a
-reference-to-hash whose keys are the fields of the issues table in the
-Koha database.
-
-=cut
-
-#'
-sub Getoverdues {
-    my $dbh = C4::Context->dbh;
-    my $sth = $dbh->prepare(
-        "Select * from issues where date_due < now() and returndate is
-  NULL order by borrowernumber "
-    );
-    $sth->execute;
-
-    # FIXME - Use push @results
-    my $i = 0;
-    my @results;
-    while ( my $data = $sth->fetchrow_hashref ) {
-        $results[$i] = $data;
-        $i++;
-    }
-    $sth->finish;
-
-    #  print @results;
-    # FIXME - Bogus API.
-    return ( $i, \@results );
-}
-
-=item CalcFine
-
-  ($amount, $chargename, $message) =
-    &CalcFine($itemnumber, $borrowercode, $days_overdue);
-
-Calculates the fine for a book.
-
-The issuingrules table in the Koha database is a fine matrix, listing
-the penalties for each type of patron for each type of item and each branch (e.g., the
-standard fine for books might be $0.50, but $1.50 for DVDs, or staff
-members might get a longer grace period between the first and second
-reminders that a book is overdue).
-
-The fine is calculated as follows: if it is time for the first
-reminder, the fine is the value listed for the given (branch, item type,
-borrower code) combination. If it is time for the second reminder, the
-fine is doubled. Finally, if it is time to send the account to a
-collection agency, the fine is set to 5 local monetary units (a really
-good deal for the patron if the library is in Italy). Otherwise, the
-fine is 0.
-
-Note that the way this function is currently implemented, it only
-returns a nonzero value on the notable days listed above. That is, if
-the categoryitems entry says to send a first reminder 7 days after the
-book is due, then if you call C<&CalcFine> 7 days after the book is
-due, it will give a nonzero fine. If you call C<&CalcFine> the next
-day, however, it will say that the fine is 0.
-
-C<$itemnumber> is the book's item number.
-
-C<$borrowercode> is the borrower code of the patron who currently has
-the book.
-
-C<$days_overdue> is the number of days elapsed since the book's due
-date.
-
-C<&CalcFine> returns a list of three values:
-
-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<$message> is a text message, either "First Notice", "Second Notice",
-or "Final Notice".
-
-=cut
-
-#'
-sub CalcFine {
-    my ( $itemnumber, $bortype, $difference , $dues  ) = @_;
-    my $dbh = C4::Context->dbh;
-    my $data = GetIssuingRules($itemnumber,$bortype);
-    my $amount = 0;
-    my $printout;
-    my $countspecialday=&GetSpecialHolidays($dues,$itemnumber);
-    my $countrepeatableday=&GetRepeatableHolidays($dues,$itemnumber,$difference);    
-    my $countalldayclosed = $countspecialday + $countrepeatableday;
-    my $daycount = $difference - $countalldayclosed;    
-    my $daycounttotal = $daycount - $data->{'firstremind'};
-        if ($data->{'firstremind'} < $daycount)
-    {
-    $amount   = $daycounttotal*$data->{'fine'};
-    }
- return ( $amount, $data->{'chargename'}, $printout ,$daycounttotal ,$daycount );
-}
-
-
-=item GetSpecialHolidays
-
-&GetSpecialHolidays($date_dues,$itemnumber);
-
-return number of special days  between date of the day and date due
-
-C<$date_dues> is the envisaged date of book return.
-
-C<$itemnumber> is the book's item number.
-
-=cut
-
-sub GetSpecialHolidays {
-my ($date_dues,$itemnumber) = @_;
-# calcul the today date
-my $today = join "-", &Today();
-
-# return the holdingbranch
-my $iteminfo=GetIssuesIteminfo($itemnumber);
-# use sql request to find all date between date_due and today
-my $dbh = C4::Context->dbh;
-my $query=qq|SELECT DATE_FORMAT(concat(year,'-',month,'-',day),'%Y-%m-%d')as date 
-FROM `special_holidays`
-WHERE DATE_FORMAT(concat(year,'-',month,'-',day),'%Y-%m-%d') >= ?
-AND   DATE_FORMAT(concat(year,'-',month,'-',day),'%Y-%m-%d') <= ?
-AND branchcode=?
-|;
-my @result=GetWdayFromItemnumber($itemnumber);
-my @result_date;
-my $wday;
-my $dateinsec;
-my $sth = $dbh->prepare($query);
-$sth->execute($date_dues,$today,$iteminfo->{'branchcode'});
-
-while ( my $special_date=$sth->fetchrow_hashref){
-    push (@result_date,$special_date);
-}
-
-my $specialdaycount=scalar(@result_date);
-
-    for (my $i=0;$i<scalar(@result_date);$i++){
-        $dateinsec=UnixDate($result_date[$i]->{'date'},"%o");
-        (undef,undef,undef,undef,undef,undef,$wday,undef,undef) =localtime($dateinsec);
-        for (my $j=0;$j<scalar(@result);$j++){
-            if ($wday == ($result[$j]->{'weekday'})){
-            $specialdaycount --;
-            }
-        }
-    }
-
-return $specialdaycount;
-}
-
-=item GetRepeatableHolidays
-
-&GetRepeatableHolidays($date_dues, $itemnumber, $difference,);
-
-return number of day closed between date of the day and date due
-
-C<$date_dues> is the envisaged date of book return.
-
-C<$itemnumber> is item number.
-
-C<$difference> numbers of between day date of the day and date due
-
-=cut
-
-sub GetRepeatableHolidays{
-my ($date_dues,$itemnumber,$difference) = @_;
-my $dateinsec=UnixDate($date_dues,"%o");
-my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) =localtime($dateinsec);
-my @result=GetWdayFromItemnumber($itemnumber);
-my @dayclosedcount;
-my $j;
-
-for (my $i=0;$i<scalar(@result);$i++){
-    my $k=$wday;
-
-        for ( $j=0;$j<$difference;$j++){
-            if ($result[$i]->{'weekday'} == $k)
-                    {
-                    push ( @dayclosedcount ,$k);
-            }
-        $k++;
-        ($k=0) if($k eq 7);
-        }
-    }
-return scalar(@dayclosedcount);
-}
-
-
-=item GetWayFromItemnumber
-
-&Getwdayfromitemnumber($itemnumber);
-
-return the different week day from repeatable_holidays table
-
-C<$itemnumber> is  item number.
-
-=cut
-
-sub GetWdayFromItemnumber{
-my($itemnumber)=@_;
-my $iteminfo=GetIssuesIteminfo($itemnumber);
-my @result;
-my $dbh = C4::Context->dbh;
-my $query = qq|SELECT weekday  
-    FROM repeatable_holidays
-    WHERE branchcode=?
-|;
-my $sth = $dbh->prepare($query);
-    #  print $query;
-
-$sth->execute($iteminfo->{'branchcode'});
-while ( my $weekday=$sth->fetchrow_hashref){
-    push (@result,$weekday);
-    }
-return @result;
-}
-
-
-=item GetIssuesIteminfo
-
-&GetIssuesIteminfo($itemnumber);
-
-return all data from issues about item
-
-C<$itemnumber> is  item number.
-
-=cut
-
-sub GetIssuesIteminfo{
-my($itemnumber)=@_;
-my $dbh = C4::Context->dbh;
-my $query = qq|SELECT *  
-    FROM issues
-    WHERE itemnumber=?
-    AND returndate IS NULL|;
-my $sth = $dbh->prepare($query);
-$sth->execute($itemnumber);
-my ($issuesinfo)=$sth->fetchrow_hashref;
-return $issuesinfo;
-}
-
-
-=item UpdateFine
-
-  &UpdateFine($itemnumber, $borrowernumber, $amount, $type, $description);
-
-(Note: the following is mostly conjecture and guesswork.)
-
-Updates the fine owed on an overdue book.
-
-C<$itemnumber> is the book's item number.
-
-C<$borrowernumber> is the borrower number of the patron who currently
-has the book on loan.
-
-C<$amount> is the current amount owed by the patron.
-
-C<$type> will be used in the description of the fine.
-
-C<$description> is a string that must be present in the description of
-the fine. I think this is expected to be a date in DD/MM/YYYY format.
-
-C<&UpdateFine> looks up the amount currently owed on the given item
-and sets it to C<$amount>, creating, if necessary, a new entry in the
-accountlines table of the Koha database.
-
-=cut
-
-#'
-# FIXME - This API doesn't look right: why should the caller have to
-# specify both the item number and the borrower number? A book can't
-# be on loan to two different people, so the item number should be
-# sufficient.
-sub UpdateFine {
-    my ( $itemnum, $borrowernumber, $amount, $type, $due ) = @_;
-    my $dbh = C4::Context->dbh;
-    # FIXME - What exactly is this query supposed to do? It looks up an
-    # entry in accountlines that matches the given item and borrower
-    # numbers, where the description contains $due, and where the
-    # account type has one of several values, but what does this _mean_?
-    # Does it look up existing fines for this item?
-    # FIXME - What are these various account types? ("FU", "O", "F", "M")
-    my $sth = $dbh->prepare(
-        "Select * from accountlines where itemnumber=? and
-  borrowernumber=? and (accounttype='FU' or accounttype='O' or
-  accounttype='F' or accounttype='M') and description like ?"
-    );
-    $sth->execute( $itemnum, $borrowernumber, "%$due%" );
-
-    if ( my $data = $sth->fetchrow_hashref ) {
-
-        # I think this if-clause deals with the case where we're updating
-        # an existing fine.
-        #    print "in accounts ...";
-    if ( $data->{'amount'} != $amount ) {
-           
-        #      print "updating";
-            my $diff = $amount - $data->{'amount'};
-            my $out  = $data->{'amountoutstanding'} + $diff;
-            my $sth2 = $dbh->prepare(
-                "update accountlines set date=now(), amount=?,
-      amountoutstanding=?,accounttype='FU' where
-      borrowernumber=? and itemnumber=?
-      and (accounttype='FU' or accounttype='O') and description like ?"
-            );
-            $sth2->execute( $amount, $out, $data->{'borrowernumber'},
-                $data->{'itemnumber'}, "%$due%" );
-            $sth2->finish;
-        }
-        else {
-
-            #      print "no update needed $data->{'amount'}"
-        }
-    }
-    else {
-
-        # I think this else-clause deals with the case where we're adding
-        # a new fine.
-        my $sth4 = $dbh->prepare(
-            "select title from biblio,items where items.itemnumber=?
-    and biblio.biblionumber=items.biblionumber"
-        );
-        $sth4->execute($itemnum);
-        my $title = $sth4->fetchrow_hashref;
-        $sth4->finish;
-
-#         #   print "not in account";
-#         my $sth3 = $dbh->prepare("Select max(accountno) from accountlines");
-#         $sth3->execute;
-# 
-#         # FIXME - Make $accountno a scalar.
-#         my @accountno = $sth3->fetchrow_array;
-#         $sth3->finish;
-#         $accountno[0]++;
-# begin transaction
-  my $nextaccntno = getnextacctno($borrowernumber);
-    my $sth2 = $dbh->prepare(
-            "INSERT INTO accountlines
-    (borrowernumber,itemnumber,date,amount,
-    description,accounttype,amountoutstanding,accountno) VALUES
-    (?,?,now(),?,?,'FU',?,?)"
-        );
-        $sth2->execute( $borrowernumber, $itemnum, $amount,
-            "$type $title->{'title'} $due",
-            $amount, $nextaccntno);
-        $sth2->finish;
-    }
-    # logging action
-    &logaction(
-        C4::Context->userenv->{'number'},
-        "FINES",
-        $type,
-        $borrowernumber,
-        "due=".$due."  amount=".$amount." itemnumber=".$itemnum
-        ) if C4::Context->preference("FinesLog");
-
-    $sth->finish;
-}
-
-=item BorType
-
-  $borrower = &BorType($borrowernumber);
-
-Looks up a patron by borrower number.
-
-C<$borrower> is a reference-to-hash whose keys are all of the fields
-from the borrowers and categories tables of the Koha database. Thus,
-C<$borrower> contains all information about both the borrower and
-category he or she belongs to.
-
-=cut
-
-#'
-sub BorType {
-    my ($borrowernumber) = @_;
-    my $dbh              = C4::Context->dbh;
-    my $sth              = $dbh->prepare(
-        "Select * from borrowers,categories where
-  borrowernumber=? and
-borrowers.categorycode=categories.categorycode"
-    );
-    $sth->execute($borrowernumber);
-    my $data = $sth->fetchrow_hashref;
-    $sth->finish;
-    return ($data);
-}
-
-=item ReplacementCost
-
-  $cost = &ReplacementCost($itemnumber);
-
-Returns the replacement cost of the item with the given item number.
-
-=cut
-
-#'
-sub ReplacementCost {
-    my ($itemnum) = @_;
-    my $dbh       = C4::Context->dbh;
-    my $sth       =
-      $dbh->prepare("Select replacementprice from items where itemnumber=?");
-    $sth->execute($itemnum);
-
-    # FIXME - Use fetchrow_array or something.
-    my $data = $sth->fetchrow_hashref;
-    $sth->finish;
-    return ( $data->{'replacementprice'} );
-}
-
-=item GetFine
-
-$data->{'sum(amountoutstanding)'} = &GetFine($itemnum,$borrowernumber);
-
-return the total of fine
-
-C<$itemnum> is item number
-
-C<$borrowernumber> is the borrowernumber
-
-=cut 
-
-
-sub GetFine {
-    my ( $itemnum, $borrowernumber ) = @_;
-    my $dbh   = C4::Context->dbh();
-    my $query = "SELECT sum(amountoutstanding) FROM accountlines 
-    where accounttype like 'F%'  
-  AND amountoutstanding > 0 AND itemnumber = ? AND borrowernumber=?";
-    my $sth = $dbh->prepare($query);
-    $sth->execute( $itemnum, $borrowernumber );
-    my $data = $sth->fetchrow_hashref();
-    $sth->finish();
-    $dbh->disconnect();
-    return ( $data->{'sum(amountoutstanding)'} );
-}
-
-
-
-
-=item GetIssuingRules
-
-$data = &GetIssuingRules($itemnumber,$categorycode);
-
-Looks up for all issuingrules an item info 
-
-C<$itemnumber> is a reference-to-hash whose keys are all of the fields
-from the borrowers and categories tables of the Koha database. Thus,
-
-C<$categorycode> contains  information about borrowers category 
-
-C<$data> contains all information about both the borrower and
-category he or she belongs to.
-=cut 
-
-sub GetIssuingRules {
-   my ($itemnumber,$categorycode)=@_;
-   my $dbh   = C4::Context->dbh();    
-   my $query=qq|SELECT * 
-        FROM items,biblioitems,itemtypes,issuingrules
-        WHERE items.itemnumber=?
-        AND items.biblioitemnumber=biblioitems.biblioitemnumber
-        AND biblioitems.itemtype=itemtypes.itemtype
-        AND issuingrules.itemtype=itemtypes.itemtype
-        AND issuingrules.categorycode=?
-        AND  (items.itemlost <> 1
-        OR items.itemlost is NULL)|;
-    my $sth = $dbh->prepare($query);
-    #  print $query;
-    $sth->execute($itemnumber,$categorycode);
-    my ($data) = $sth->fetchrow_hashref;
-   $sth->finish;
-return ($data);
-
-}
-
-
-sub ReplacementCost2 {
-    my ( $itemnum, $borrowernumber ) = @_;
-    my $dbh   = C4::Context->dbh();
-    my $query = "SELECT amountoutstanding 
-         FROM accountlines
-             WHERE accounttype like 'L'
-         AND amountoutstanding > 0
-         AND itemnumber = ?
-         AND borrowernumber= ?";
-    my $sth = $dbh->prepare($query);
-    $sth->execute( $itemnum, $borrowernumber );
-    my $data = $sth->fetchrow_hashref();
-    $sth->finish();
-    $dbh->disconnect();
-    return ( $data->{'amountoutstanding'} );
-}
-
-
-=item GetNextIdNotify
-
-($result) = &GetNextIdNotify($reference);
-
-Returns the new file number
-
-C<$result> contains the next file number
-
-C<$reference> contains the beggining of file number
-
-=cut
-
-
-
-sub GetNextIdNotify {
-my ($reference)=@_;
-my $query=qq|SELECT max(notify_id) 
-         FROM accountlines
-         WHERE notify_id  like \"$reference%\"
-         |;
-# AND borrowernumber=?|;   
-my $dbh = C4::Context->dbh;
-my $sth=$dbh->prepare($query);
-$sth->execute();
-my $result=$sth->fetchrow;
-$sth->finish;
-my $count;
-    if ($result eq '')
-    {
-    ($result=$reference."01")  ;
-    }else
-    {
-    $count=substr($result,6)+1;
-     
-    if($count<10){
-     ($count = "0".$count);
-     }
-     $result=$reference.$count;
-     }
-return $result;
-}
-
-
-=item AmountNotify
-
-(@notify) = &AmountNotify($borrowernumber);
-
-Returns amount for all file per borrowers
-C<@notify> array contains all file per borrowers
-
-C<$notify_id> contains the file number for the borrower number nad item number
-
-=cut
-
-sub NumberNotifyId{
-    my ($borrowernumber)=@_;
-    my $dbh = C4::Context->dbh;
-    my $query=qq|    SELECT distinct(notify_id)
-            FROM accountlines
-            WHERE borrowernumber=?
-           AND notify_id != 0
-           AND notify_id != 1  |;
-    my @notify;
-    my $sth=$dbh->prepare($query);
-        $sth->execute($borrowernumber);
-          while ( my $numberofotify=$sth->fetchrow_array){
-    push (@notify,$numberofotify);
-    }
-    $sth->finish;
-
-    return (@notify);
-
-}
-
-=item AmountNotify
-
-($totalnotify) = &AmountNotify($notifyid);
-
-Returns amount for all file per borrowers
-C<$notifyid> is the file number
-
-C<$totalnotify> contains amount of a file
-
-C<$notify_id> contains the file number for the borrower number nad item number
-
-=cut
-
-sub AmountNotify{
-    my ($notifyid)=@_;
-    my $dbh = C4::Context->dbh;
-    my $query=qq|    SELECT sum(amountoutstanding)
-            FROM accountlines
-            WHERE notify_id=?|;
-    my $sth=$dbh->prepare($query);
-        $sth->execute($notifyid);
-          my $totalnotify=$sth->fetchrow;
-    $sth->finish;
-    return ($totalnotify);
-}
-
-
-=item GetNotifyId
-
-($notify_id) = &GetNotifyId($borrowernumber,$itemnumber);
-
-Returns the file number per borrower and itemnumber
-
-C<$borrowernumber> is a reference-to-hash whose keys are all of the fields
-from the items tables of the Koha database. Thus,
-
-C<$itemnumber> contains the borrower categorycode
-
-C<$notify_id> contains the file number for the borrower number nad item number
-
-=cut
-
- sub GetNotifyId {
- my ($borrowernumber,$itemnumber)=@_;
- my $query=qq|SELECT notify_id 
-           FROM accountlines
-           WHERE borrowernumber=?
-          AND itemnumber=?
-           AND (accounttype='FU' or accounttype='O')|;
- my $dbh = C4::Context->dbh;
- my $sth=$dbh->prepare($query);
- $sth->execute($borrowernumber,$itemnumber);
- my ($notify_id)=$sth->fetchrow;
- $sth->finish;
- return ($notify_id);
-
- }
-
-=item CreateItemAccountLine
-
-() = &CreateItemAccountLine($borrowernumber,$itemnumber,$date,$amount,$description,$accounttype,$amountoutstanding,$timestamp,$notify_id,$level);
-
-update the account lines with file number or with file level
-
-C<$items> is a reference-to-hash whose keys are all of the fields
-from the items tables of the Koha database. Thus,
-
-C<$itemnumber> contains the item number
-
-C<$borrowernumber> contains the borrower number
-
-C<$date> contains the date of the day
-
-C<$amount> contains item price
-
-C<$description> contains the descritpion of accounttype 
-
-C<$accounttype> contains the account type
-
-C<$amountoutstanding> contains the $amountoutstanding 
-
-C<$timestamp> contains the timestamp with time and the date of the day
-
-C<$notify_id> contains the file number
-
-C<$level> contains the file level
-
-
-=cut
-
- sub CreateItemAccountLine {
-  my ($borrowernumber,$itemnumber,$date,$amount,$description,$accounttype,$amountoutstanding,$timestamp,$notify_id,$level)=@_;
-  my $dbh = C4::Context->dbh;
-  my $nextaccntno = getnextacctno($borrowernumber);
-   my $query= "INSERT into accountlines  
-         (borrowernumber,accountno,itemnumber,date,amount,description,accounttype,amountoutstanding,timestamp,notify_id,notify_level)
-          VALUES
-             (?,?,?,?,?,?,?,?,?,?,?)";
-  
-  
-  my $sth=$dbh->prepare($query);
-  $sth->execute($borrowernumber,$nextaccntno,$itemnumber,$date,$amount,$description,$accounttype,$amountoutstanding,$timestamp,$notify_id,$level);
-  $sth->finish;
- }
-
-=item UpdateAccountLines
-
-() = &UpdateAccountLines($notify_id,$notify_level,$borrowernumber,$itemnumber);
-
-update the account lines with file number or with file level
-
-C<$items> is a reference-to-hash whose keys are all of the fields
-from the items tables of the Koha database. Thus,
-
-C<$itemnumber> contains the item number
-
-C<$notify_id> contains the file number
-
-C<$notify_level> contains the file level
-
-C<$borrowernumber> contains the borrowernumber
-
-=cut
-
-sub UpdateAccountLines {
-my ($notify_id,$notify_level,$borrowernumber,$itemnumber)=@_;
-my $query;
-if ($notify_id eq '')
-{
-
-    $query=qq|UPDATE accountlines
-    SET  notify_level=?
-    WHERE borrowernumber=? AND itemnumber=?
-    AND (accounttype='FU' or accounttype='O')|;
-}else
-{
-    $query=qq|UPDATE accountlines
-     SET notify_id=?, notify_level=?
-           WHERE borrowernumber=?
-    AND itemnumber=?
-        AND (accounttype='FU' or accounttype='O')|;
-}
- my $dbh = C4::Context->dbh;
- my $sth=$dbh->prepare($query);
-
-if ($notify_id eq '')
-{
-    $sth->execute($notify_level,$borrowernumber,$itemnumber);
-}else
-{
-    $sth->execute($notify_id,$notify_level,$borrowernumber,$itemnumber);
-}
- $sth->finish;
-
-}
-
-
-=item GetItems
-
-($items) = &GetItems($itemnumber);
-
-Returns the list of all delays from overduerules.
-
-C<$items> is a reference-to-hash whose keys are all of the fields
-from the items tables of the Koha database. Thus,
-
-C<$itemnumber> contains the borrower categorycode
-
-=cut
-
-sub GetItems {
-    my($itemnumber) = @_;
-    my $query=qq|SELECT *
-             FROM items
-              WHERE itemnumber=?|;
-        my $dbh = C4::Context->dbh;
-        my $sth=$dbh->prepare($query);
-        $sth->execute($itemnumber);
-        my ($items)=$sth->fetchrow_hashref;
-        $sth->finish;
-    return($items);
-}
-
-=item GetOverdueDelays
-
-(@delays) = &GetOverdueDelays($categorycode);
-
-Returns the list of all delays from overduerules.
-
-C<@delays> it's an array contains the three delays from overduerules table
-
-C<$categorycode> contains the borrower categorycode
-
-=cut
-
-sub GetOverdueDelays {
-    my($category) = @_;
-    my $dbh = C4::Context->dbh;
-        my $query=qq|SELECT delay1,delay2,delay3
-                FROM overduerules
-                WHERE categorycode=?|;
-    my $sth=$dbh->prepare($query);
-        $sth->execute($category);
-        my (@delays)=$sth->fetchrow_array;
-        $sth->finish;
-        return(@delays);
-}
-
-=item CheckAccountLineLevelInfo
-
-($exist) = &CheckAccountLineLevelInfo($borrowernumber,$itemnumber,$accounttype,notify_level);
-
-Check and Returns the list of all overdue books.
-
-C<$exist> contains number of line in accounlines
-with the same .biblionumber,itemnumber,accounttype,and notify_level
-
-C<$borrowernumber> contains the borrower number
-
-C<$itemnumber> contains item number
-
-C<$accounttype> contains account type
-
-C<$notify_level> contains the accountline level 
-
-
-=cut
-
-sub CheckAccountLineLevelInfo {
-    my($borrowernumber,$itemnumber,$level,$datedue) = @_;
-       my @formatdate;
-       @formatdate=split('-',$datedue);
-       $datedue=$formatdate[2]."/".$formatdate[1]."/".$formatdate[0];
-       my $dbh = C4::Context->dbh;
-       my $query=      qq|SELECT count(*) 
-                       FROM accountlines 
-                       WHERE borrowernumber =?
-                       AND itemnumber = ?
-                       AND notify_level=?
-                       AND description like ?|;
-       my $sth=$dbh->prepare($query);
-       $sth->execute($borrowernumber,$itemnumber,$level,"%$datedue%");
-       my ($exist)=$sth->fetchrow;
-       $sth->finish;
-       return($exist);
-}
-
-=item GetOverduerules
-
-($overduerules) = &GetOverduerules($categorycode);
-
-Returns the value of borrowers (debarred or not) with notify level
-
-C<$overduerules> return value of debbraed field in overduerules table
-
-C<$category> contains the borrower categorycode
-
-C<$notify_level> contains the notify level
-=cut
-
-
-sub GetOverduerules{
-    my($category,$notify_level) = @_;
-    my $dbh = C4::Context->dbh;
-        my $query=qq|SELECT debarred$notify_level
-             FROM overduerules
-             WHERE categorycode=?|;
-    my $sth=$dbh->prepare($query);
-        $sth->execute($category);
-        my ($overduerules)=$sth->fetchrow;
-        $sth->finish;
-        return($overduerules);
-}
-
-
-=item CheckBorrowerDebarred
-
-($debarredstatus) = &CheckBorrowerDebarred($borrowernumber);
-
-Check if the borrowers is already debarred
-
-C<$debarredstatus> return 0 for not debarred and return 1 for debarred
-
-C<$borrowernumber> contains the borrower number
-
-=cut
-
-
-sub CheckBorrowerDebarred{
-    my($borrowernumber) = @_;
-    my $dbh = C4::Context->dbh;
-        my $query=qq|SELECT debarred
-              FROM borrowers
-             WHERE borrowernumber=?
-            |;
-    my $sth=$dbh->prepare($query);
-        $sth->execute($borrowernumber);
-        my ($debarredstatus)=$sth->fetchrow;
-        $sth->finish;
-        if ($debarredstatus eq '1'){
-    return(1);}
-    else{
-    return(0);
-    }
-}
-
-=item UpdateBorrowerDebarred
-
-($borrowerstatut) = &UpdateBorrowerDebarred($borrowernumber);
-
-update status of borrowers in borrowers table (field debarred)
-
-C<$borrowernumber> borrower number
-
-=cut
-
-sub UpdateBorrowerDebarred{
-    my($borrowernumber) = @_;
-    my $dbh = C4::Context->dbh;
-        my $query=qq|UPDATE borrowers
-             SET debarred='1'
-                     WHERE borrowernumber=?
-            |;
-    my $sth=$dbh->prepare($query);
-        $sth->execute($borrowernumber);
-        $sth->finish;
-        return 1;
-}
-
-=item CheckExistantNotifyid
-
-  ($exist) = &CheckExistantNotifyid($borrowernumber,$itemnumber,$accounttype,$notify_id);
-
-Check and Returns the notify id if exist else return 0.
-
-C<$exist> contains a notify_id 
-
-C<$borrowernumber> contains the borrower number
-
-C<$date_due> contains the date of item return 
-
-
-=cut
-
-sub CheckExistantNotifyid {
-    my($borrowernumber,$date_due) = @_;
-       my $dbh = C4::Context->dbh;
-       my @formatdate;
-       @formatdate=split('-',$date_due);
-       $date_due=$formatdate[2]."/".$formatdate[1]."/".$formatdate[0];
-       my $query =  qq|SELECT notify_id FROM accountlines 
-                       WHERE description like ?
-                       AND borrowernumber =?
-                       AND( accounttype='FU'  OR accounttype='F' )
-                           AND notify_id != 0
-                       AND notify_id != 1|;
-       my $sth=$dbh->prepare($query);
-               $sth->execute("%$date_due%",$borrowernumber);
-       my ($exist)=$sth->fetchrow;
-       $sth->finish;
-       if ($exist eq '')
-       {
-       return(0);
-       }else
-           {
-       return($exist);
-       }
-}
-
-=item CheckAccountLineItemInfo
-
-  ($exist) = &CheckAccountLineItemInfo($borrowernumber,$itemnumber,$accounttype,$notify_id);
-
-Check and Returns the list of all overdue items from the same file number(notify_id).
-
-C<$exist> contains number of line in accounlines
-with the same .biblionumber,itemnumber,accounttype,notify_id
-
-C<$borrowernumber> contains the borrower number
-
-C<$itemnumber> contains item number
-
-C<$accounttype> contains account type
-
-C<$notify_id> contains the file number 
-
-=cut
-
-sub CheckAccountLineItemInfo {
-     my($borrowernumber,$itemnumber,$accounttype,$notify_id) = @_;
-     my $dbh = C4::Context->dbh;
-         my $query =  qq|SELECT count(*) FROM accountlines
-             WHERE borrowernumber =?
-             AND itemnumber = ?
-              AND accounttype= ?
-            AND notify_id = ?|;
-    my $sth=$dbh->prepare($query);
-         $sth->execute($borrowernumber,$itemnumber,$accounttype,$notify_id);
-         my ($exist)=$sth->fetchrow;
-         $sth->finish;
-         return($exist);
- }
-
-
-1;
-__END__
-
-=back
-
-=head1 AUTHOR
-
-Koha Developement team <info@koha.org>
-
-=cut
index f426da4..5a06d43 100644 (file)
@@ -1104,17 +1104,15 @@ sub GetMemberAccountRecords {
     my @acctlines;
     my $numlines = 0;
     my $strsth      = qq(
-SELECT * 
-FROM accountlines 
-WHERE borrowernumber=?);
+                        SELECT * 
+                        FROM accountlines 
+                        WHERE borrowernumber=?);
     my @bind = ($borrowernumber);
     if ($date && $date ne ''){
-    $strsth.="
-AND date < ? ";
-    push(@bind,$date);
+            $strsth.=" AND date < ? ";
+            push(@bind,$date);
     }
-    $strsth.="
-ORDER BY date desc,timestamp DESC";
+    $strsth.=" ORDER BY date desc,timestamp DESC";
     my $sth= $dbh->prepare( $strsth );
     $sth->execute( @bind );
     my $total = 0;
@@ -1148,16 +1146,15 @@ sub GetBorNotifyAcctRecord {
     my $dbh = C4::Context->dbh;
     my @acctlines;
     my $numlines = 0;
-    my $query    = qq| SELECT * 
-                       FROM accountlines 
-                       WHERE borrowernumber=? 
-                       AND notify_id=? 
-                       AND (accounttype='FU' OR accounttype='N' OR accounttype='M'OR accounttype='A'OR accounttype='F'OR accounttype='L' OR accounttype='IP' OR accounttype='CH' OR accounttype='RE' OR accounttype='RL')
-                       AND amountoutstanding != '0' 
-                       ORDER BY notify_id,accounttype
-               |;
-    my $sth = $dbh->prepare($query);
-
+    my $sth = $dbh->prepare(
+            "SELECT * 
+                FROM accountlines 
+                WHERE borrowernumber=? 
+                    AND notify_id=? 
+                    AND (accounttype='FU' OR accounttype='N' OR accounttype='M'OR accounttype='A'OR accounttype='F'OR accounttype='L' OR accounttype='IP' OR accounttype='CH' OR accounttype='RE' OR accounttype='RL')
+                    AND amountoutstanding != '0' 
+                ORDER BY notify_id,accounttype
+                ");
     $sth->execute( $borrowernumber, $notifyid );
     my $total = 0;
     while ( my $data = $sth->fetchrow_hashref ) {
index a22483a..5cfd758 100644 (file)
@@ -104,11 +104,9 @@ push @EXPORT, qw(
 
 =item Getoverdues
 
-  ($count, $overdues) = &Getoverdues();
+  ($overdues) = &Getoverdues();
 
-Returns the list of all overdue books.
-
-C<$count> is the number of elements in C<@{$overdues}>.
+Returns the list of all overdue books, with their itemtype.
 
 C<$overdues> is a reference-to-array. Each element is a
 reference-to-hash whose keys are the fields of the issues table in the
@@ -120,8 +118,13 @@ Koha database.
 sub Getoverdues {
     my $dbh = C4::Context->dbh;
     my $sth = $dbh->prepare(
-        "Select * from issues where date_due < now() and returndate is
-  NULL order by borrowernumber "
+        "SELECT issues.*,biblioitems.itemtype FROM issues 
+                LEFT JOIN items USING (itemnumber)
+                LEFT JOIN biblioitems USING (biblioitemnumber)
+                WHERE date_due < now() 
+                    AND returndate IS 
+                    NULL ORDER BY borrowernumber 
+        "
     );
     $sth->execute;
 
@@ -220,20 +223,36 @@ or "Final Notice".
 
 #'
 sub CalcFine {
-    my ( $itemnumber, $bortype, $difference , $dues  ) = @_;
+    my ( $item, $bortype, $difference , $dues  ) = @_;
     my $dbh = C4::Context->dbh;
-    my $data = GetIssuingRules($itemnumber,$bortype);
     my $amount = 0;
     my $printout;
-    my $countspecialday=&GetSpecialHolidays($dues,$itemnumber);
-    my $countrepeatableday=&GetRepeatableHolidays($dues,$itemnumber,$difference);    
+    # calculate how many days the patron is late
+    my $countspecialday=&GetSpecialHolidays($dues,$item->{itemnumber});
+    my $countrepeatableday=&GetRepeatableHolidays($dues,$item->{itemnumber},$difference);    
     my $countalldayclosed = $countspecialday + $countrepeatableday;
-    my $daycount = $difference - $countalldayclosed;    
+    my $daycount = $difference - $countalldayclosed;
+    # get issuingrules (fines part will be used)
+    my $data = GetIssuingRules($item->{'itemtype'},$bortype);
     my $daycounttotal = $daycount - $data->{'firstremind'};
+    if ($data->{'chargeperiod'} >0) { # if there is a rule for this bortype
         if ($data->{'firstremind'} < $daycount)
-    {
-    $amount   = $daycounttotal*$data->{'fine'};
+            {
+            $amount   = int($daycounttotal/$data->{'chargeperiod'})*$data->{'fine'};
+        }
+    } else {
+        # get fines default rules
+        my $data = GetIssuingRules($item->{'itemtype'},'*');
+        $daycounttotal = $daycount - $data->{'firstremind'};
+        if ($data->{'firstremind'} < $daycount)
+            {
+                if ($data->{'chargeperiod'} >0) { # if there is a rule for this bortype
+                    $amount   = int($daycounttotal/$data->{'chargeperiod'})*$data->{'fine'};
+                }
+            }
     }
+    
+    warn "Calc Fine for $item->{'itemnumber'}, $bortype, $difference , $dues = $amount / $daycount";
  return ( $amount, $data->{'chargename'}, $printout ,$daycounttotal ,$daycount );
 }
 
@@ -441,10 +460,10 @@ sub UpdateFine {
             my $diff = $amount - $data->{'amount'};
             my $out  = $data->{'amountoutstanding'} + $diff;
             my $sth2 = $dbh->prepare(
-                "update accountlines set date=now(), amount=?,
-      amountoutstanding=?,accounttype='FU' where
-      borrowernumber=? and itemnumber=?
-      and (accounttype='FU' or accounttype='O') and description like ?"
+                "UPDATE accountlines SET date=now(), amount=?,
+      amountoutstanding=?,accounttype='FU' WHERE
+      borrowernumber=? AND itemnumber=?
+      AND (accounttype='FU' OR accounttype='O') AND description LIKE ?"
             );
             $sth2->execute( $amount, $out, $data->{'borrowernumber'},
                 $data->{'itemnumber'}, "%$due%" );
@@ -460,7 +479,7 @@ sub UpdateFine {
         # I think this else-clause deals with the case where we're adding
         # a new fine.
         my $sth4 = $dbh->prepare(
-            "select title from biblio LEFT JOIN items ON biblio.biblionumber=items.biblionumber where items.itemnumber=?"
+            "SELECT title FROM biblio LEFT JOIN items ON biblio.biblionumber=items.biblionumber WHERE items.itemnumber=?"
         );
         $sth4->execute($itemnum);
         my $title = $sth4->fetchrow_hashref;
@@ -475,11 +494,11 @@ sub UpdateFine {
 #         $sth3->finish;
 #         $accountno[0]++;
 # begin transaction
-  my $nextaccntno = getnextacctno($borrowernumber);
+  my $nextaccntno = C4::Accounts::getnextacctno($borrowernumber);
     my $sth2 = $dbh->prepare(
-            "Insert into accountlines
+            "INSERT INTO accountlines
     (borrowernumber,itemnumber,date,amount,
-    description,accounttype,amountoutstanding,accountno) values
+    description,accounttype,amountoutstanding,accountno) VALUES
     (?,?,now(),?,?,'FU',?,?)"
         );
         $sth2->execute( $borrowernumber, $itemnum, $amount,
@@ -581,7 +600,7 @@ sub GetFine {
 
 =item GetIssuingRules
 
-$data = &GetIssuingRules($itemnumber,$categorycode);
+$data = &GetIssuingRules($itemtype,$categorycode);
 
 Looks up for all issuingrules an item info 
 
@@ -595,20 +614,16 @@ category he or she belongs to.
 =cut 
 
 sub GetIssuingRules {
-   my ($itemnumber,$categorycode)=@_;
+   my ($itemtype,$categorycode)=@_;
    my $dbh   = C4::Context->dbh();    
    my $query=qq|SELECT * 
-        FROM items,biblioitems,itemtypes,issuingrules
-        WHERE items.itemnumber=?
-        AND items.biblioitemnumber=biblioitems.biblioitemnumber
-        AND biblioitems.itemtype=itemtypes.itemtype
-        AND issuingrules.itemtype=itemtypes.itemtype
-        AND issuingrules.categorycode=?
-        AND  (items.itemlost <> 1
-        OR items.itemlost is NULL)|;
+        FROM issuingrules
+        WHERE issuingrules.itemtype=?
+            AND issuingrules.categorycode=?
+        |;
     my $sth = $dbh->prepare($query);
     #  print $query;
-    $sth->execute($itemnumber,$categorycode);
+    $sth->execute($itemtype,$categorycode);
     my ($data) = $sth->fetchrow_hashref;
    $sth->finish;
 return ($data);
@@ -697,8 +712,8 @@ sub NumberNotifyId{
     my @notify;
     my $sth=$dbh->prepare($query);
         $sth->execute($borrowernumber);
-          while ( my $numberofotify=$sth->fetchrow_array){
-    push (@notify,$numberofotify);
+          while ( my ($numberofnotify)=$sth->fetchrow){
+    push (@notify,$numberofnotify);
     }
     $sth->finish;
 
index b3821ba..f8afbbb 100755 (executable)
@@ -130,6 +130,8 @@ my %tabsysprefs;
     $tabsysprefs{patronimages}="Members";
     $tabsysprefs{MinPasswordLength}="Members";
     $tabsysprefs{uppercasesurnames}="Members";
+    $tabsysprefs{NoReturnSetLost}="Members";
+    $tabsysprefs{MaxFine}="Members";
 
 # OPAC
     $tabsysprefs{AmazonAssocTag}="OPAC";
index 0ece2d9..692d2c6 100644 (file)
@@ -47,11 +47,13 @@ INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES
 INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES('marc','1','Turn on MARC support',NULL,'YesNo');
 INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES('marcflavour','MARC21','Define global MARC flavor (MARC21 or UNIMARC) used for character encoding','MARC21|UNIMARC','Choice');
 INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES('MARCOrgCode','OSt','Define MARC Organization Code - http://www.loc.gov/marc/organizations/orgshome.htm','','free');
+INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES('MaxFine','9999','Maximum fine a patron can have for a single late return','','Integer');
 INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES('maxoutstanding','5','maximum amount withstanding to be able make reserves','','Integer');
 INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES('maxreserves','50','Define maximum number of holds a patron can place','','Integer');
 INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES('memberofinstitution','0','If ON, patrons can be linked to institutions',NULL,'YesNo');
 INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES('MIME','EXCEL','Define the default application for exporting report data','EXCEL|OPENOFFICE.ORG','Choice');
 INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES('noissuescharge','5','Define maximum amount withstanding before check outs are blocked','','Integer');
+INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES('NoReturnSetLost','99','(if you have fines only) After this limit a non returned item is automatically marked as lost, and the itemprice is charged to the patron','','Integer');
 INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES('NotifyBorrowerDeparture','30','Define number of days before expiry where circulation is warned about patron account expiry',NULL,'Integer');
 INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES('OpacAuthorities','1','If ON, enables the search authorities link on OPAC',NULL,'YesNo');
 INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES('opacbookbag','1','If ON, enables display of biblio basket (book bag)','','YesNo');
index ea8e4f6..aabe1f8 100644 (file)
@@ -45,10 +45,12 @@ INSERT INTO `systempreferences` (`variable`, `value`, `options`, `explanation`,
 INSERT INTO `systempreferences` (`variable`, `value`, `options`, `explanation`, `type`) VALUES ('marc', '1', '', 'Ce paramètre active le support du MARC. Dans Koha 3.0, doit Ãªtre Ã  1.', 'YesNo');
 INSERT INTO `systempreferences` (`variable`, `value`, `options`, `explanation`, `type`) VALUES ('marcflavour', 'UNIMARC', 'MARC21|UNIMARC', 'Ce paramètre définit votre déclinaison MARC. Normalement, UNIMARC', 'Choice');
 INSERT INTO `systempreferences` (`variable`, `value`, `options`, `explanation`, `type`) VALUES ('MARCOrgCode', '0', '', 'Ce paramètre définit votre code organisme MARC. Utilisé en MARC21. Voir  - http://www.loc.gov/marc/organizations/orgshome.htm', '');
+INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES('MaxFine','9999','Amende maximum qu''un ahdérent peut avoir pour un retour en retard','','Integer');
 INSERT INTO `systempreferences` (`variable`, `value`, `options`, `explanation`, `type`) VALUES ('maxoutstanding', '5', '', 'Ce paramètre définit le montant maximal des dettes au dela duquel le lecteur ne peut plus faire de réservation', 'Integer');
 INSERT INTO `systempreferences` (`variable`, `value`, `options`, `explanation`, `type`) VALUES ('maxreserves', '2', '', 'Ce paramètre définit le nombre maximal de réservations qu''un lecteur peut faire.', 'Integer');
 INSERT INTO `systempreferences` (`variable`, `value`, `options`, `explanation`, `type`) VALUES ('memberofinstitution', '0', NULL, 'Vos adhérents sont ils membres d''une institution ?', 'YesNo');
 INSERT INTO `systempreferences` (`variable`, `value`, `options`, `explanation`, `type`) VALUES ('MIME', 'OPENOFFICE.ORG', 'EXCEL|OPENOFFICE.ORG', 'Ce paramètre définit l''application par défaut Ã  ouvrir lorsqu''on télécharge un fichier (OpenOffice.org ou MS-Excel habituellement)', 'Choice');
+INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES('NoReturnSetLost','99','(uniquement si vous avez des amendes) Après cette limite, un document non retourné est automatiquement marqué perdu, et le cout du document est imputé Ã  l''adhérent ','','Integer');
 INSERT INTO `systempreferences` (`variable`, `value`, `options`, `explanation`, `type`) VALUES ('noissuescharge', '5', '', 'Ce paramètre définit le montant maximal des dettes au delà duquel le lecteur ne peut plus emprunter', 'Integer');
 INSERT INTO `systempreferences` (`variable`, `value`, `options`, `explanation`, `type`) VALUES ('NotifyBorrowerDeparture', '0', '', 'Ce paramètre permet d''être prévenu N jours avant l''expiration de la carte d''un adhérent, Ã  la banque de prêt.', 'Integer');
 INSERT INTO `systempreferences` (`variable`, `value`, `options`, `explanation`, `type`) VALUES ('NoZebra', '0', '', 'Activer ce paramètre pour ne PAS utiliser Zebra (les fonds importants - plus de 100 000 docs environ- devraient utiliser zebra)', 'YesNo');
index 32ecb2c..3f2c0a9 100755 (executable)
@@ -33,17 +33,15 @@ use C4::Members;
 
 my $input=new CGI;
 
-my $theme = $input->param('theme'); # only used if allowthemeoverride is set
-#my %tmpldata = pathtotemplate ( template => 'boraccount.tmpl', theme => $theme );
-#my $template = HTML::Template->new(filename => $tmpldata{'path'}, die_on_bad_params => 0);
+
 my ($template, $loggedinuser, $cookie)
     = get_template_and_user({template_name => "members/boraccount.tmpl",
-                            query => $input,
-                            type => "intranet",
-                            authnotrequired => 0,
-                            flagsrequired => {borrowers => 1},
-                            debug => 1,
-                            });
+                            query => $input,
+                            type => "intranet",
+                            authnotrequired => 0,
+                            flagsrequired => {borrowers => 1},
+                            debug => 1,
+                            });
 
 my $borrowernumber=$input->param('borrowernumber');
 #get borrower details
@@ -53,48 +51,48 @@ my $data=GetMember($borrowernumber,'borrowernumber');
 my ($total,$accts,$numaccts)=GetMemberAccountRecords($borrowernumber);
 my $totalcredit;
 if($total <= 0){
-       $totalcredit = 1;
+        $totalcredit = 1;
 }
 my @accountrows; # this is for the tmpl-loop
 
 my $toggle;
 for (my $i=0;$i<$numaccts;$i++){
-       if($i%2){
-               $toggle = 0;
-       } else {
-               $toggle = 1;
-       }
-  $accts->[$i]{'toggle'} = $toggle;
-  $accts->[$i]{'amount'}+=0.00;
-  if($accts->[$i]{'amount'} <= 0){
-       $accts->[$i]{'amountcredit'} = 1;
-  }
-  $accts->[$i]{'amountoutstanding'}+=0.00;
-  if($accts->[$i]{'amountoutstanding'} <= 0){
-       $accts->[$i]{'amountoutstandingcredit'} = 1;
-  }
-  my %row = (   'date'              => format_date($accts->[$i]{'date'}),
-               'amountcredit' => $accts->[$i]{'amountcredit'},
-               'amountoutstandingcredit' => $accts->[$i]{'amountoutstandingcredit'},
-               'toggle' => $accts->[$i]{'toggle'},
-               'description'       => $accts->[$i]{'description'},
-               'amount'            => sprintf("%.2f",$accts->[$i]{'amount'}),
-               'amountoutstanding' => sprintf("%.2f",$accts->[$i]{'amountoutstanding'}) );
-
-  if ($accts->[$i]{'accounttype'} ne 'F' && $accts->[$i]{'accounttype'} ne 'FU'){
-    $row{'printtitle'}=1;
-    $row{'title'} = $accts->[$i]{'title'};
-  }
-
-  push(@accountrows, \%row);
+    if($i%2){
+            $toggle = 0;
+    } else {
+            $toggle = 1;
+    }
+    $accts->[$i]{'toggle'} = $toggle;
+    $accts->[$i]{'amount'}+=0.00;
+    if($accts->[$i]{'amount'} <= 0){
+        $accts->[$i]{'amountcredit'} = 1;
+    }
+    $accts->[$i]{'amountoutstanding'}+=0.00;
+    if($accts->[$i]{'amountoutstanding'} <= 0){
+        $accts->[$i]{'amountoutstandingcredit'} = 1;
+    }
+    my %row = ( 'date'              => format_date($accts->[$i]{'date'}),
+                'amountcredit' => $accts->[$i]{'amountcredit'},
+                'amountoutstandingcredit' => $accts->[$i]{'amountoutstandingcredit'},
+                'toggle' => $accts->[$i]{'toggle'},
+                'description'       => $accts->[$i]{'description'},
+                'amount'            => sprintf("%.2f",$accts->[$i]{'amount'}),
+                'amountoutstanding' => sprintf("%.2f",$accts->[$i]{'amountoutstanding'}) );
+    
+    if ($accts->[$i]{'accounttype'} ne 'F' && $accts->[$i]{'accounttype'} ne 'FU'){
+        $row{'printtitle'}=1;
+        $row{'title'} = $accts->[$i]{'title'};
+    }
+    
+    push(@accountrows, \%row);
 }
 
 $template->param(
-                       firstname       => $data->{'firstname'},
-                       surname         => $data->{'surname'},
-                       borrowernumber          => $borrowernumber,
-                       total           => sprintf("%.2f",$total),
-                       totalcredit => $totalcredit,
-                       accounts        => \@accountrows );
+                firstname       => $data->{'firstname'},
+                surname         => $data->{'surname'},
+                borrowernumber          => $borrowernumber,
+                total           => sprintf("%.2f",$total),
+                totalcredit => $totalcredit,
+                accounts        => \@accountrows );
 
 output_html_with_http_headers $input, $cookie, $template->output;
index a3a2f0a..88f56ec 100755 (executable)
@@ -51,7 +51,6 @@ my $user = $input->remote_user;
 
 # get account details
 my $branches = GetBranches();
-my $printers = GetPrinters();
 my $branch   = GetBranch( $input, $branches );
 
 my @names = $input->param;
@@ -91,8 +90,6 @@ if ( $check == 0 ) {
 
     my ( $total, $accts, $numaccts) = GetMemberAccountRecords( $borrowernumber );
 
-#       creation d'une fonction qui va nous retourner le notify_id dans un tableau
-
     my @allfile;
     my @notify = NumberNotifyId($borrowernumber);
 
@@ -132,7 +129,6 @@ if ( $check == 0 ) {
             'total'    => $totalnotify
           };
     }
-
     $template->param(
         allfile        => \@allfile,
         firstname      => $data->{'firstname'},
diff --git a/misc/fines-sanop.pl b/misc/fines-sanop.pl
new file mode 100644 (file)
index 0000000..5445fbe
--- /dev/null
@@ -0,0 +1,189 @@
+#!/usr/bin/perl
+
+#  This script loops through each overdue item, determines the fine,
+#  and updates the total amount of fines due by each user.  It relies on
+#  the existence of /tmp/fines, which is created by ???
+# Doesnt really rely on it, it relys on being able to write to /tmp/
+# It creates the fines file
+#
+#  This script is meant to be run nightly out of cron.
+
+# Copyright 2000-2002 Katipo Communications
+#
+# This file is part of Koha.
+#
+# Koha is free software; you can redistribute it and/or modify it under the
+# terms of the GNU General Public License as published by the Free Software
+# Foundation; either version 2 of the License, or (at your option) any later
+# version.
+#
+# Koha is distributed in the hope that it will be useful, but WITHOUT ANY
+# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+# A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along with
+# Koha; if not, write to the Free Software Foundation, Inc., 59 Temple Place,
+# Suite 330, Boston, MA  02111-1307 USA
+
+# $Id$
+
+use C4::Context;
+use C4::Circulation;
+use C4::Overdues;
+use Date::Manip qw/Date_DaysSince1BC/;
+use C4::Biblio;
+use strict;
+
+open (FILE,'>/tmp/fines') || die;
+# FIXME
+# it looks like $count is just a counter, would it be
+# better to rely on the length of the array @$data and turn the
+# for loop below into a foreach loop?
+#
+my $DEBUG =1;
+my $data=Getoverdues();
+# warn "Overdues : = ".scalar(@$data)." => ".Data::Dumper::Dumper($data);
+my $overdueItemsCounted=0 if $DEBUG;
+# FIXME - There's got to be a better way to figure out what day
+# today is.
+my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) =localtime(time);
+$mon++;
+$year=$year+1900;
+my $date=Date_DaysSince1BC($mon,$mday,$year);
+# print "DATE : ".$date if $DEBUG;
+if ($mon < '10'  ){
+$mon="0".$mon;
+}
+if ($mday < '10'  ){
+$mday="0".$mday;
+}
+my $reference = $year."".$mon;
+my $borrowernumber;
+
+for (my $i=0;$i<scalar(@$data);$i++){
+  my @dates=split('-',$data->[$i]->{'date_due'});
+  my $date2=Date_DaysSince1BC($dates[1],$dates[2],$dates[0]);
+  my $datedue=$data->[$i]->{'date_due'};
+  my $due="$dates[2]/$dates[1]/$dates[0]";
+  my $borrower=BorType($data->[$i]->{'borrowernumber'});
+  my $starter;
+      
+ if ($date2 <= $date){
+    $overdueItemsCounted++ if $DEBUG;
+    my $difference=$date-$date2;
+    my ($amount,$type,$printout,$daycounttotal,$daycount)=
+    CalcFine($data->[$i]->{'itemnumber'},
+        $borrower->{'categorycode'},
+        $difference,
+        $datedue);
+    
+    my ($delays1,$delays2,$delays3)=GetOverdueDelays($borrower->{'categorycode'});
+    my $issuingrules=GetIssuingRules($data->[$i]->{'itemnumber'},$borrower->{'categorycode'});
+
+# warn "$delays1  and $delays2  and $delays3";
+if($delays1  and $delays2  and $delays3)  {
+    
+    my $debarredstatus=CheckBorrowerDebarred($borrower->{'borrowernumber'});
+     
+    if (($issuingrules->{'fine'} > 0) || ($issuingrules->{'fine'} ne '' )){
+
+        #DELAYS 1##########################################
+#         warn "$amount > 0 && $daycount >= $delays1 && $daycount < $delays2";
+        if ($amount > 0 && $daycount >= $delays1 && $daycount < $delays2){
+            # FIXME : already in GetIssuingRules ?
+            my $debarred1=GetOverduerules($borrower->{'categorycode'},1);
+            (UpdateBorrowerDebarred($borrower->{'borrowernumber'}))if(($debarred1 eq '1' ) and ($debarredstatus eq '0'));
+            # save fine
+            UpdateFine($data->[$i]->{'itemnumber'},$data->[$i]->{'borrowernumber'},$amount,$type,$due);
+            # is there an open "dossier" for this date & borrower
+            my $getnotifyid=CheckExistantNotifyid($borrower->{'borrowernumber'},$datedue);
+        
+            my $update=CheckAccountLineLevelInfo($borrower->{'borrowernumber'},$data->[$i]->{'itemnumber'},1,$datedue);
+                if ($update eq '0'){
+                    if ($getnotifyid eq '0'){
+                        $starter=GetNextIdNotify($reference,$borrower->{'borrowernumber'});
+
+                    }
+                    else{
+                        $starter=$getnotifyid;
+                    }
+        
+                }
+            UpdateAccountLines($starter,1,$borrower->{'borrowernumber'},$data->[$i]->{'itemnumber'});
+        }
+        ###############################################
+        #SANOP specific
+        if ($daycount>=$delays2) {
+    
+            $amount=$issuingrules->{'fine'} * ($delays2);
+            UpdateFine($data->[$i]->{'itemnumber'},$data->[$i]->{'borrowernumber'},$amount,$type,$due);
+    
+        }
+    
+        #DELAYS 2#################################
+    
+        if ($daycount >= $delays2 && $daycount < $delays3){
+        my $debarred2=GetOverduerules($borrower->{'categorycode'},2);
+        (UpdateBorrowerDebarred($borrower->{'borrowernumber'}))if(($debarred2 eq '1' ) and ($debarredstatus eq '0'));
+       my $update=CheckAccountLineLevelInfo($borrower->{'borrowernumber'},$data->[$i]->{'itemnumber'},2,$datedue);
+        if ($update eq '0'){
+        UpdateAccountLines(undef,2,$borrower->{'borrowernumber'},$data->[$i]->{'itemnumber'});
+        }
+        }
+        ###############################################
+    
+        #DELAYS 3###################################
+        if ($daycount >= $delays3  ){
+            my $debarred3=GetOverduerules($borrower->{'categorycode'},3);
+            (UpdateBorrowerDebarred($borrower->{'borrowernumber'}))if(($debarred3 eq '1' ) and ($debarredstatus eq '0'));
+            my $update=CheckAccountLineLevelInfo($borrower->{'borrowernumber'},$data->[$i]->{'itemnumber'},3,$datedue);
+            if ($update eq '0'){
+                    UpdateAccountLines(undef,3,$borrower->{'borrowernumber'},$data->[$i]->{'itemnumber'});
+            }
+            my $items=GetItems($data->[$i]->{'itemnumber'});
+            my $todaydate=$year."-".$mon."-".$mday;
+            # add item price, the item is considered as lost.
+            my $description="Item Price";
+            my $typeaccount="IP";
+            my $level="3";
+            my $notifyid=GetNotifyId($borrower->{'borrowernumber'},$data->[$i]->{'itemnumber'});
+            my $timestamp=$todaydate." ".$hour."\:".$min."\:".$sec;
+            my $create=CheckAccountLineItemInfo($borrower->{'borrowernumber'},$data->[$i]->{'itemnumber'},$typeaccount,$notifyid);
+            if ($create eq '0'){
+    
+            CreateItemAccountLine($borrower->{'borrowernumber'},$data->[$i]->{'itemnumber'},$todaydate,$items->{'price'},$description,$typeaccount,
+            $items->{'price'},$timestamp,$notifyid,$level);
+            }
+        }
+        ###############################################
+    }
+}
+
+
+
+if ($borrower->{'category_type'} eq 'C'){  
+        my $query=qq|    SELECT *
+                FROM borrowers
+                WHERE borrowernumber=?|;
+        my $dbh = C4::Context->dbh;
+        my $sth=$dbh->prepare($query);
+        $sth->execute($borrower->{'guarantorid'});
+        my $tdata=$sth->fetchrow_hashref;
+        $sth->finish;
+        $borrower->{'phone'}=$tdata->{'phone'};
+       }
+ print "$printout\t$borrower->{'cardnumber'}\t$borrower->{'category_type'}\t$borrower->{'firstname'}\t$borrower->{'surname'}\t$data->[$i]->{'date_due'}\t$type\t$difference\t$borrower->{'email'}\t$borrower->{'phone'}\t$borrower->{'address'}\t$borrower->{'city'}\t$amount\n";
+ }
+}
+
+my $numOverdueItems=scalar(@$data);
+if ($DEBUG) {
+   print <<EOM
+
+Number of Overdue Items counted $overdueItemsCounted
+Number of Overdue Items reported $numOverdueItems
+
+EOM
+}
+
+close FILE;
diff --git a/misc/fines.pl b/misc/fines.pl
deleted file mode 100755 (executable)
index fa642f0..0000000
+++ /dev/null
@@ -1,180 +0,0 @@
-#!/usr/bin/perl
-
-#  This script loops through each overdue item, determines the fine,
-#  and updates the total amount of fines due by each user.  It relies on
-#  the existence of /tmp/fines, which is created by ???
-# Doesnt really rely on it, it relys on being able to write to /tmp/
-# It creates the fines file
-#
-#  This script is meant to be run nightly out of cron.
-
-# Copyright 2000-2002 Katipo Communications
-#
-# This file is part of Koha.
-#
-# Koha is free software; you can redistribute it and/or modify it under the
-# terms of the GNU General Public License as published by the Free Software
-# Foundation; either version 2 of the License, or (at your option) any later
-# version.
-#
-# Koha is distributed in the hope that it will be useful, but WITHOUT ANY
-# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
-# A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License along with
-# Koha; if not, write to the Free Software Foundation, Inc., 59 Temple Place,
-# Suite 330, Boston, MA  02111-1307 USA
-
-# $Id$
-
-use C4::Context;
-use C4::Circulation;
-use C4::Overdues;
-use Date::Manip qw/Date_DaysSince1BC/;
-use C4::Biblio;
-
-open (FILE,'>/tmp/fines') || die;
-# FIXME
-# it looks like $count is just a counter, would it be
-# better to rely on the length of the array @$data and turn the
-# for loop below into a foreach loop?
-#
-my ($numOverdueItems,$data)=Getoverdues();
-print $numOverdueItems if $DEBUG;
-my $overdueItemsCounted=0 if $DEBUG;
-# FIXME - There's got to be a better way to figure out what day
-# today is.
-my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) =localtime(time);
-$mon++;
-$year=$year+1900;
-my $date=Date_DaysSince1BC($mon,$mday,$year);
-print $date if $DEBUG;
-if ($mon < '10'  ){
-$mon="0".$mon;
-}
-if ($mday < '10'  ){
-$mday="0".$mday;
-}
-my $reference = $year."".$mon;
-my $borrowernumber;
-
-for (my $i=0;$i<$numOverdueItems;$i++){
-  my @dates=split('-',$data->[$i]->{'date_due'});
-  my $date2=Date_DaysSince1BC($dates[1],$dates[2],$dates[0]);
-  my $datedue=$data->[$i]->{'date_due'};
-  my $due="$dates[2]/$dates[1]/$dates[0]";
-  my $borrower=BorType($data->[$i]->{'borrowernumber'});
-  my $starter;    
-      
- if ($date2 <= $date){
-    $overdueItemsCounted++ if $DEBUG;
-    my $difference=$date-$date2;
-    my ($amount,$type,$printout,$daycounttotal,$daycount)=
-    CalcFine($data->[$i]->{'itemnumber'},
-        $borrower->{'categorycode'},
-        $difference,
-        $datedue);
-    
-    my ($delays1,$delays2,$delays3)=GetOverdueDelays($borrower->{'categorycode'});
-    my $issuingrules=GetIssuingRules($data->[$i]->{'itemnumber'},$borrower->{'categorycode'});
-if($delays1  and $delays2  and $delays3)  {
-    
-    my $debarredstatus=CheckBorrowerDebarred($borrower->{'borrowernumber'});
-     
-    if (($issuingrules->{'fine'} > 0) || ($issuingrules->{'fine'} ne '' )){
-
-        #DELAYS 1##########################################
-        if ($amount > 0 && $daycount >= $delays1 && $daycount < $delays2){
-        my $debarred1=GetOverduerules($borrower->{'categorycode'},1);
-        (UpdateBorrowerDebarred($borrower->{'borrowernumber'}))if(($debarred1 eq '1' ) and ($debarredstatus eq '0'));
-        UpdateFine($data->[$i]->{'itemnumber'},$data->[$i]->{'borrowernumber'},$amount,$type,$due);
-        my $getnotifyid=CheckExistantNotifyid($borrower->{'borrowernumber'},$datedue);
-    
-        my $update=CheckAccountLineLevelInfo($borrower->{'borrowernumber'},$data->[$i]->{'itemnumber'},1,$datedue);
-            if ($update eq '0'){
-                        if ($getnotifyid eq '0'){
-                            $starter=GetNextIdNotify($reference,$borrower->{'borrowernumber'});
-    
-                        }
-                        else{
-                            $starter=$getnotifyid;
-                        }
-    
-            }
-        UpdateAccountLines($starter,1,$borrower->{'borrowernumber'},$data->[$i]->{'itemnumber'});
-        }
-        ###############################################
-    
-        if ($daycount>=$delays2) {
-    
-            $amount=$issuingrules->{'fine'} * ($delays2);
-            UpdateFine($data->[$i]->{'itemnumber'},$data->[$i]->{'borrowernumber'},$amount,$type,$due);
-    
-        }
-    
-        #DELAYS 2#################################
-    
-        if ($daycount >= $delays2 && $daycount < $delays3){
-        my $debarred2=GetOverduerules($borrower->{'categorycode'},2);
-        (UpdateBorrowerDebarred($borrower->{'borrowernumber'}))if(($debarred2 eq '1' ) and ($debarredstatus eq '0'));
-       my $update=CheckAccountLineLevelInfo($borrower->{'borrowernumber'},$data->[$i]->{'itemnumber'},2,$datedue);
-        if ($update eq '0'){
-        UpdateAccountLines(undef,2,$borrower->{'borrowernumber'},$data->[$i]->{'itemnumber'});
-        }
-        }
-        ###############################################
-    
-        #DELAYS 3###################################
-        if ($daycount >= $delays3  ){
-            my $debarred3=GetOverduerules($borrower->{'categorycode'},3);
-            (UpdateBorrowerDebarred($borrower->{'borrowernumber'}))if(($debarred3 eq '1' ) and ($debarredstatus eq '0'));
-            my $update=CheckAccountLineLevelInfo($borrower->{'borrowernumber'},$data->[$i]->{'itemnumber'},3,$datedue);
-            if ($update eq '0'){
-                    UpdateAccountLines(undef,3,$borrower->{'borrowernumber'},$data->[$i]->{'itemnumber'});
-            }
-            my $items=GetItems($data->[$i]->{'itemnumber'});
-            my $todaydate=$year."-".$mon."-".$mday;
-            my $description="Item Price";
-            my $typeaccount="IP";
-            my $level="3";
-            my $notifyid=GetNotifyId($borrower->{'borrowernumber'},$data->[$i]->{'itemnumber'});
-            my $timestamp=$todaydate." ".$hour."\:".$min."\:".$sec;
-            my $create=CheckAccountLineItemInfo($borrower->{'borrowernumber'},$data->[$i]->{'itemnumber'},$typeaccount,$notifyid);
-            if ($create eq '0'){
-    
-            CreateItemAccountLine($borrower->{'borrowernumber'},$data->[$i]->{'itemnumber'},$todaydate,$items->{'price'},$description,$typeaccount,
-            $items->{'price'},$timestamp,$notifyid,$level);
-            }
-        }
-        ###############################################
-    }
-}
-
-
-
-if ($borrower->{'category_type'} eq 'C'){  
-        my $query=qq|    SELECT *
-                FROM borrowers
-                WHERE borrowernumber=?|;
-        my $dbh = C4::Context->dbh;
-        my $sth=$dbh->prepare($query);
-        $sth->execute($borrower->{'guarantorid'});
-        my $tdata=$sth->fetchrow_hashref;
-        $sth->finish;
-        $borrower->{'phone'}=$tdata->{'phone'};
-       }
- print "$printout\t$borrower->{'cardnumber'}\t$borrower->{'category_type'}\t$borrower->{'firstname'}\t$borrower->{'surname'}\t$data->[$i]->{'date_due'}\t$type\t$difference\t$borrower->{'email'}\t$borrower->{'phone'}\t$borrower->{'address'}\t$borrower->{'city'}\t$amount\n";
- }
-}
-
-if ($DEBUG) {
-   print <<EOM
-
-Number of Overdue Items counted $overdueItemsCounted
-Number of Overdue Items reported $numOverdueItems
-
-EOM
-}
-
-close FILE;
index ca5334d..148aecc 100755 (executable)
@@ -32,6 +32,7 @@ use C4::Circulation;
 use C4::Overdues;
 use Date::Manip;
 use C4::Biblio;
+use strict;
 
 open (FILE,'>/tmp/fines') || die;
 # FIXME
@@ -39,8 +40,9 @@ open (FILE,'>/tmp/fines') || die;
 # better to rely on the length of the array @$data and turn the
 # for loop below into a foreach loop?
 #
-my ($numOverdueItems,$data)=Getoverdues();
-print $numOverdueItems if $DEBUG;
+my $DEBUG=0;
+my ($data)=Getoverdues();
+print scalar(@$data) if $DEBUG;
 my $overdueItemsCounted=0 if $DEBUG;
 
 # FIXME - There's got to be a better way to figure out what day
@@ -61,99 +63,69 @@ my $borrowernumber;
 #
 my $total=0;
 
-# FIXME
-# this probably ought to be a global variable or constant
-# defined in a central place
-#
-# Yep
-my $maxFine=5;
-
-# FIXME
-# delete both of these?
-#my $borrowernumber2=$data->[0]->{'borrowernumber'};
-#my $i2=1;
+# get the maxfine parameter
+my $maxFine=C4::Context->preference("MaxFine") || 999999999;
 
 # FIXME
 # This should be rewritten to be a foreach loop
 # Also, this loop is really long, and could be better grokked if broken
 # into a number of smaller, separate functions
 #
-for (my $i=0;$i<$numOverdueItems;$i++){
-  my @dates=split('-',$data->[$i]->{'date_due'});
-  my $date2=Date_DaysSince1BC($dates[1],$dates[2],$dates[0]);
-  my $due="$dates[2]/$dates[1]/$dates[0]";
-  my $borrower=BorType($data->[$i]->{'borrowernumber'});
-  if ($date2 <= $date){
-    $overdueItemsCounted++ if $DEBUG;
-    my $difference=$date-$date2;
-    my ($amount,$type,$printout)=
-    CalcFine($data->[$i]->{'itemnumber'},
-         $borrower->{'categorycode'},
-         $difference);
-    if ($amount > $maxFine){
-      $amount=$maxFine;
-    }
-    if ($amount > 0){
-      UpdateFine($data->[$i]->{'itemnumber'},$data->[$i]->{'borrowernumber'},$amount,$type,$due);
-
-#
-# FIXME
-# If this isn't needed it should be deleted
-#
-#      if ($amount ==5){
-#          marklost();
-#      }
-
-       if ($borrower->{'categorycode'} eq 'C'){  # FIXME
-                                             # this should be a
-                                                 # separate function
-                                                 #
-     my $dbh = C4::Context->dbh;
-     my $sth=$dbh->prepare("Select * from borrowers where borrowernumber=?");
-     $sth->execute($borrower->{'guarantor'});
-     my $tdata=$sth->fetchrow_hashref;
-     $sth->finish;
-     $borrower->{'phone'}=$tdata->{'phone'};
-       }
-       print "$printout\t$borrower->{'cardnumber'}\t$borrower->{'categorycode'}\t$borrower->{'firstname'}\t$borrower->{'surname'}\t$data->[$i]->{'date_due'}\t$type\t$difference\t$borrower->{'emailaddress'}\t$borrower->{'phone'}\t$borrower->{'streetaddress'}\t$borrower->{'city'}\t$amount\n";
-    } else { # FIXME
-         # if this is really useless, the whole else clause should be
-         # deleted.
-             #
-#      print "$borrower->{'cardnumber'}\t$borrower->{'categorycode'}\t0 fine\n";
+for (my $i=0;$i<scalar(@$data);$i++){
+    my @dates=split('-',$data->[$i]->{'date_due'});
+    my $date2=Date_DaysSince1BC($dates[1],$dates[2],$dates[0]);
+    my $due="$dates[2]/$dates[1]/$dates[0]";
+    my $borrower=BorType($data->[$i]->{'borrowernumber'});
+    if ($date2 <= $date){
+        $overdueItemsCounted++ if $DEBUG;
+        my $difference=$date-$date2;
+        my ($amount,$type,$printout)=
+        CalcFine($data->[$i],
+            $borrower->{'categorycode'},
+            $difference);
+        if ($amount > $maxFine){
+            $amount=$maxFine;
+        }
+        if ($amount > 0){
+            UpdateFine($data->[$i]->{'itemnumber'},$data->[$i]->{'borrowernumber'},$amount,$type,$due);
+            if ($borrower->{'categorycode'} eq 'C'){  # FIXME
+                my $dbh = C4::Context->dbh;
+                my $sth=$dbh->prepare("Select * from borrowers where borrowernumber=?");
+                $sth->execute($borrower->{'guarantor'});
+                my $tdata=$sth->fetchrow_hashref;
+                $sth->finish;
+                $borrower->{'phone'}=$tdata->{'phone'};
+            }
+            print "$printout\t$borrower->{'cardnumber'}\t$borrower->{'categorycode'}\t$borrower->{'firstname'}\t$borrower->{'surname'}\t$data->[$i]->{'date_due'}\t$type\t$difference\t$borrower->{'emailaddress'}\t$borrower->{'phone'}\t$borrower->{'streetaddress'}\t$borrower->{'city'}\t$amount\n" if $DEBUG;
+        }
+        if ($difference >= C4::Context->preference("NoReturnSetLost")){
+            my $borrower=BorType($data->[$i]->{'borrowernumber'});
+            if ($borrower->{'cardnumber'} ne ''){
+                my $cost=ReplacementCost($data->[$i]->{'itemnumber'});
+                my $dbh = C4::Context->dbh;
+                my $accountno=C4::Accounts::getnextacctno($data->[$i]->{'borrowernumber'});
+                my $item=GetBiblioFromItemNumber($data->[$i]->{'itemnumber'});
+                if ($item->{'itemlost'} ne '1' && $item->{'itemlost'} ne '2' ){
+                    # FIXME this should be a separate function
+                    my $sth=$dbh->prepare("INSERT INTO accountlines
+                    (borrowernumber,itemnumber,accountno,date,amount,
+                    description,accounttype,amountoutstanding) VALUES
+                    (?,?,?,now(),?,?,'L',?)");
+                    $sth->execute($data->[$i]->{'borrowernumber'},$data->[$i]->{'itemnumber'},
+                    $accountno,$cost,"Lost item $item->{'title'} $item->{'barcode'} $due",$cost);
+                    $sth->finish;
+                    $sth=$dbh->prepare("UPDATE items SET itemlost=2 WHERE itemnumber=?");
+                    $sth->execute($data->[$i]->{'itemnumber'});
+                    $sth->finish;
+                }
+            }
+        }
     }
-    if ($difference >= 28){ # FIXME
-                        # this should be a separate function
-                            #
-      my $borrower=BorType($data->[$i]->{'borrowernumber'});
-      if ($borrower->{'cardnumber'} ne ''){
-        my $cost=ReplacementCost($data->[$i]->{'itemnumber'});
-    my $dbh = C4::Context->dbh;
-    my $accountno=C4::Circulation::Circ2::getnextacctno($data->[$i]->{'borrowernumber'});
-    my $item=GetBiblioFromItemNumber($data->[$i]->{'itemnumber'});
-    if ($item->{'itemlost'} ne '1' && $item->{'itemlost'} ne '2' ){
-              # FIXME
-              # this should be a separate function
-              #
-      my $sth=$dbh->prepare("INSERT INTO accountlines
-      (borrowernumber,itemnumber,accountno,date,amount,
-      description,accounttype,amountoutstanding) VALUES
-      (?,?,?,now(),?,?,'L',?)");
-      $sth->execute($data->[$i]->{'borrowernumber'},$data->[$i]->{'itemnumber'},
-      $accountno,$cost,"Lost item $item->{'title'} $item->{'barcode'} $due",$cost);
-      $sth->finish;
-      $sth=$dbh->prepare("update items set itemlost=2 where itemnumber=?");
-      $sth->execute($data->[$i]->{'itemnumber'});
-      $sth->finish;
-    }
-      }
-    }
-
-  }
 }
 
 if ($DEBUG) {
-   print <<EOM
+    my $numOverdueItems=scalar(@$data);
+    print <<EOM
 
 Number of Overdue Items counted $overdueItemsCounted
 Number of Overdue Items reported $numOverdueItems