Minor update to README for RM
[koha_fer] / misc / cronjobs / fines2.pl
index ae4b3b9..fe2cfa1 100755 (executable)
@@ -34,108 +34,126 @@ BEGIN {
     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;