eval { require "$FindBin::Bin/kohalib.pl" };
}
+use Date::Manip; # qw( Date_DaysSince1BC ) ;
+use Data::Dumper;
+use Getopt::Long;
+
use C4::Context;
use C4::Circulation;
-use C4::Overdues;
-use Date::Manip;
+use C4::Overdues; # qw( Getoverdues CalcFine );
use C4::Biblio;
use C4::Items;
+use C4::Dates;
+use C4::Debug;
-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=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
-# today is.
-my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) =localtime(time);
-$mon++;
-$year=$year+1900;
+our $verbose;
+GetOptions('verbose+', \$verbose);
+$debug and $verbose++;
-my $date=Date_DaysSince1BC($mon,$mday,$year);
+# my $filename = "/tmp/fines";
+# open (FILE, ">$filename") or die "Cannot write to $filename";
-print $date if $DEBUG;
+my ($data)=Getoverdues();
+my $overdueItemsCounted=0;
-my $borrowernumber;
+# FIXME - There's got to be a better way to figure out what day today is.
+my ($mday,$mon,$year) = (localtime)[3..5]; # ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)
+my $date = Date_DaysSince1BC($mon+1,$mday,$year+1900);
+my $today_obj = C4::Dates->new();
+my $today_iso = $today_obj->output('iso');
-# FIXME
-# $total isn't used anywhere else in the file,
-# can we delete it?
-#
-my $total=0;
+if ($verbose) {
+ printf "Number of overdues: %7d\nDate_DaysSince1BC : %7d\n", scalar(@$data), $date;
+ print "today: $today_iso\n";
+}
# 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<scalar(@$data);$i++){
- my @dates=split('-',$data->[$i]->{'date_due'});
+our $phone_sth = C4::Context->dbh->prepare("Select * from borrowers where borrowernumber=?");
+sub get_guarantor_phone ($) {
+ $phone_sth->execute(shift);
+ my $x = $phone_sth->fetchrow_hashref;
+ return $x->{'phone'};
+}
+
+our $fine_sth = C4::Context->dbh->prepare("
+ INSERT INTO accountlines
+ (borrowernumber, itemnumber, accountno, date,
+ amount, description, accounttype, amountoutstanding)
+ VALUES (?,?,?,now(),?,?,'L',?)
+ ");
+sub insert_fine ($$$$$$) {
+ $verbose and print "inserting fine: " . join(", ",@_), "\n";
+ return $fine_sth->execute(@_);
+}
+
+my $circcontrol = C4::Context->preference('CircControl');
+foreach (@$data){
+ my $date_due = $_->{date_due};
+ $verbose and print "date_due: $date_due ", ($date_due le $today_iso ? 'fine!' : 'ok'), "\n";
+ my @dates=split('-',$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;
- ModItem({ itemlost => 2 }, undef, $data->[$i]->{'itemnumber'});
- }
- }
- }
- }
+ my $borrowernumber = $_->{borrowernumber};
+ my $itemnumber = $_->{itemnumber};
+ my $borrower = BorType($borrowernumber);
+ ($date_due le $today_iso) or next; # it is valid to string compare ISO dates.
+ $overdueItemsCounted++ if $verbose;
+ my $branchcode = ($circcontrol eq 'PatronLibrary' ) ? $borrower->{branchcode} :
+ ($circcontrol eq 'ItemHomeLibrary') ? $_->{homebranch} :
+ $_->{branchcode} ; # Last option: Pickup Library.
+ my $difference=$date-$date2;
+ my (@calc_returns) = CalcFine(
+ $_, $borrower->{categorycode}, $branchcode,undef,undef, C4::Dates->new($date_due,'iso'), $today_obj
+ );
+ if ($verbose) {
+ my $dump = Dumper($_);
+ $dump =~ s/;/,/;
+ $verbose and print "CalcFine($dump" .
+ "\t$borrower->{categorycode}, $branchcode,undef,undef,[$date_due],[today]) returns:\n" . Dumper(\@calc_returns), "\n";
+ }
+ my ($amount,$type,$printout) = @calc_returns[0..2];
+ # ($amount,$chargename,$daycount,$daycounttotal)=&CalcFine($itemnumber,$categorycode,$branch,$days_overdue,$description, $start_date, $end_date );
+
+ ($amount > $maxFine) and $amount = $maxFine;
+ if ($amount > 0) {
+ UpdateFine($itemnumber,$borrowernumber,$amount,$type,$due);
+ if ($borrower->{'guarantorid'}) {
+ $borrower->{'phone'} = get_guarantor_phone($borrower->{'guarantorid'}) || $borrower->{'phone'};
+ }
+ print "$printout\t$borrower->{'cardnumber'}\t$borrower->{'categorycode'}\t$borrower->{'firstname'}\t$borrower->{'surname'}\t",
+ "$_->{'date_due'}\t$type\t$difference\t",
+ "$borrower->{'emailaddress'}\t$borrower->{'phone'}\t$borrower->{'streetaddress'}\t$borrower->{'city'}\t$amount\n" if $verbose;
+ }
+ if ($difference >= C4::Context->preference("NoReturnSetLost")){
+ my $borrower=BorType($borrowernumber);
+ if ($borrower->{'cardnumber'} ne ''){
+ my $cost = ReplacementCost($itemnumber);
+ my $item = GetBiblioFromItemNumber($itemnumber);
+ if ($item->{'itemlost'} ne '1' && $item->{'itemlost'} ne '2' ){
+ insert_fine(
+ $borrowernumber,
+ $itemnumber,
+ C4::Accounts::getnextacctno($borrowernumber),
+ $cost,
+ "Lost item $item->{'title'} $item->{'barcode'} $due",
+ $cost
+ );
+ ModItem({ itemlost => 2 }, undef, $itemnumber);
+ }
+ }
+ }
}
-if ($DEBUG) {
+if ($verbose) {
my $numOverdueItems=scalar(@$data);
print <<EOM
-Number of Overdue Items counted $overdueItemsCounted
+Number of Overdue Items counted $overdueItemsCounted
Number of Overdue Items reported $numOverdueItems
EOM
}
-close FILE;
+# close FILE;