+++ /dev/null
-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
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;
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 ) {
=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
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;
#'
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 );
}
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%" );
# 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;
# $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,
=item GetIssuingRules
-$data = &GetIssuingRules($itemnumber,$categorycode);
+$data = &GetIssuingRules($itemtype,$categorycode);
Looks up for all issuingrules an item info
=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);
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;
$tabsysprefs{patronimages}="Members";
$tabsysprefs{MinPasswordLength}="Members";
$tabsysprefs{uppercasesurnames}="Members";
+ $tabsysprefs{NoReturnSetLost}="Members";
+ $tabsysprefs{MaxFine}="Members";
# OPAC
$tabsysprefs{AmazonAssocTag}="OPAC";
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');
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');
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
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;
# get account details
my $branches = GetBranches();
-my $printers = GetPrinters();
my $branch = GetBranch( $input, $branches );
my @names = $input->param;
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);
'total' => $totalnotify
};
}
-
$template->param(
allfile => \@allfile,
firstname => $data->{'firstname'},
--- /dev/null
+#!/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;
+++ /dev/null
-#!/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;
use C4::Overdues;
use Date::Manip;
use C4::Biblio;
+use strict;
open (FILE,'>/tmp/fines') || die;
# FIXME
# 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
#
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