Bugzilla – Attachment 6197 Details for
Bug 6858
Adds staticfines.pl for static fines processing
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Help
|
New Account
|
Log In
[x]
|
Forgot Password
Login:
[x]
[patch]
Bug 6858: Adds staticfines.pl for static fines processing
Bug-6858-Adds-staticfinespl-for-static-fines-proce.patch (text/plain), 9.45 KB, created by
claire.hernandez@biblibre.com
on 2011-11-04 10:59:29 UTC
(
hide
)
Description:
Bug 6858: Adds staticfines.pl for static fines processing
Filename:
MIME Type:
Creator:
claire.hernandez@biblibre.com
Created:
2011-11-04 10:59:29 UTC
Size:
9.45 KB
patch
obsolete
>From 36b95dfb8c457b642c3cb5954dafcda1d70ea7e9 Mon Sep 17 00:00:00 2001 >From: Matthias Meusburger <matthias.meusburger@biblibre.com> >Date: Wed, 23 Mar 2011 16:19:07 +0100 >Subject: [PATCH] Bug 6858: Adds staticfines.pl for static fines processing >MIME-Version: 1.0 >Content-Type: text/plain; charset=UTF-8 >Content-Transfer-Encoding: 8bit > >Add a tool to calculate static fine. For example, 7 days left = 1⬠fixed fine >--- > misc/cronjobs/staticfines.pl | 227 ++++++++++++++++++++++++++++++++++++++++++ > 1 files changed, 227 insertions(+), 0 deletions(-) > create mode 100755 misc/cronjobs/staticfines.pl > >diff --git a/misc/cronjobs/staticfines.pl b/misc/cronjobs/staticfines.pl >new file mode 100755 >index 0000000..dfe1e3f >--- /dev/null >+++ b/misc/cronjobs/staticfines.pl >@@ -0,0 +1,227 @@ >+#!/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., >+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. >+ >+# FIXME: use FinesMode as described or change syspref description >+use strict; >+ >+#use warnings; FIXME - Bug 2505 >+ >+BEGIN { >+ >+ # find Koha's Perl modules >+ # test carefully before changing this >+ use FindBin; >+ eval { require "$FindBin::Bin/kohalib.pl" }; >+} >+ >+use Date::Calc qw/Date_to_Days/; >+ >+use C4::Context; >+use C4::Circulation; >+use C4::Overdues; >+use C4::Calendar qw(); # don't need any exports from Calendar >+use C4::Biblio; >+use C4::Debug; # supplying $debug and $cgi_debug >+use Getopt::Long; >+use List::MoreUtils qw/none/; >+ >+my $help = 0; >+my $verbose = 0; >+my $output_dir; >+my @pcategories; >+my @categories; >+my %catamounts; >+my @libraries; >+my $delay; >+my $useborrowerlibrary; >+my $borrowersalreadyapplied; # hashref of borrowers for whom we already applied the fine, so it's only applied once >+my $debug = 0; >+my $bigdebug = 0; >+ >+GetOptions( >+ 'h|help' => \$help, >+ 'v|verbose' => \$verbose, >+ 'o|out:s' => \$output_dir, >+ 'c|category:s'=> \@pcategories, >+ 'l|library:s' => \@libraries, >+ 'd|delay:i' => \$delay, >+ 'u|use-borrower-library' => \$useborrowerlibrary >+); >+my $usage = << 'ENDUSAGE'; >+ >+This script calculates and charges overdue fines >+to patron accounts. If the Koha System Preference >+'finesMode' is set to 'production', the fines are charged >+to the patron accounts. If set to 'test', the fines are >+calculated but not applied. >+ >+This script has the following parameters : >+ -h --help: this message >+ -o --out: ouput directory for logs (defaults to env or /tmp if !exist) >+ -v --verbose >+ -c --category borrower_category,amount (repeatable) >+ -l --library (repeatable) >+ -d --delay >+ -u --use-borrower-libraray: use borrower's libraray, regardless of the CircControl syspref >+ >+ENDUSAGE >+die $usage if $help; >+ >+# Processing categories >+foreach (@pcategories) { >+ my ($category, $amount) = split(',', $_); >+ push @categories, $category; >+ $catamounts{$category} = $amount; >+} >+ >+use vars qw(@borrower_fields @item_fields @other_fields); >+use vars qw($fldir $libname $control $mode $delim $dbname $today $today_iso $today_days); >+use vars qw($filename); >+ >+CHECK { >+ @borrower_fields = qw(cardnumber categorycode surname firstname email phone address citystate); >+ @item_fields = qw(itemnumber barcode date_due); >+ @other_fields = qw(type days_overdue fine); >+ $libname = C4::Context->preference('LibraryName'); >+ $control = C4::Context->preference('CircControl'); >+ $mode = C4::Context->preference('finesMode'); >+ $dbname = C4::Context->config('database'); >+ $delim = "\t"; # ? C4::Context->preference('delimiter') || "\t"; >+ >+} >+ >+INIT { >+ $debug and print "Each line will contain the following fields:\n", >+ "From borrowers : ", join( ', ', @borrower_fields ), "\n", >+ "From items : ", join( ', ', @item_fields ), "\n", >+ "Per overdue: ", join( ', ', @other_fields ), "\n", >+ "Delimiter: '$delim'\n"; >+} >+ >+my $data = Getoverdues(); >+my $overdueItemsCounted = 0; >+my %calendars = (); >+$today = C4::Dates->new(); >+$today_iso = $today->output('iso'); >+$today_days = Date_to_Days( split( /-/, $today_iso ) ); >+if ($output_dir) { >+ $fldir = $output_dir if ( -d $output_dir ); >+} else { >+ $fldir = $ENV{TMPDIR} || "/tmp"; >+} >+if ( !-d $fldir ) { >+ warn "Could not write to $fldir ... does not exist!"; >+} >+$filename = $dbname; >+$filename =~ s/\W//; >+$filename = $fldir . '/' . $filename . '_' . $today_iso . ".log"; >+print "writing to $filename\n" if $verbose; >+open( FILE, ">$filename" ) or die "Cannot write file $filename: $!"; >+print FILE join $delim, ( @borrower_fields, @item_fields, @other_fields ); >+print FILE "\n"; >+ >+for ( my $i = 0 ; $i < scalar(@$data) ; $i++ ) { >+ my $datedue; >+ my $datedue_days; >+ eval { >+ $datedue = C4::Dates->new( $data->[$i]->{'date_due'}, 'iso' ); >+ $datedue_days = Date_to_Days( split( /-/, $datedue->output('iso') ) ); >+ }; >+ if ($@) { >+ warn "Error on date for borrower " . $data->[$i]->{'borrowernumber'} . ": $@date_due: " . $data->[$i]->{'date_due'} . "\ndatedue_days: " . $datedue_days . "\nSkipping"; >+ next; >+ } >+ my $due_str = $datedue->output(); >+ unless ( defined $data->[$i]->{'borrowernumber'} ) { >+ print STDERR "ERROR in Getoverdues line $i: issues.borrowernumber IS NULL. Repair 'issues' table now! Skipping record.\n"; >+ next; # Note: this doesn't solve everything. After NULL borrowernumber, multiple issues w/ real borrowernumbers can pile up. >+ } >+ my $borrower = BorType( $data->[$i]->{'borrowernumber'} ); >+ >+ # Skipping borrowers that are not in @categories >+ $bigdebug and warn "Skipping borrower from category " . $borrower->{categorycode} if none { $borrower->{categorycode} eq $_ } @categories; >+ next if none { $borrower->{categorycode} eq $_ } @categories; >+ >+ my $branchcode = >+ ( $useborrowerlibrary ) ? $borrower->{branchcode} >+ : ( $control eq 'ItemHomeLibrary' ) ? $data->[$i]->{homebranch} >+ : ( $control eq 'PatronLibrary' ) ? $borrower->{branchcode} >+ : $data->[$i]->{branchcode}; >+ # In final case, CircControl must be PickupLibrary. (branchcode comes from issues table here). >+ >+ # Skipping branchcodes that are not in @libraries >+ $bigdebug and warn "Skipping library $branchcode" if none { $branchcode eq $_ } @libraries; >+ next if none { $branchcode eq $_ } @libraries; >+ >+ my $calendar; >+ unless ( defined( $calendars{$branchcode} ) ) { >+ $calendars{$branchcode} = C4::Calendar->new( branchcode => $branchcode ); >+ } >+ $calendar = $calendars{$branchcode}; >+ my $isHoliday = $calendar->isHoliday( split '/', $today->output('metric') ); >+ >+ # Reassing datedue_days if -delay specified in commandline >+ $bigdebug and warn "Using commandline supplied delay : $delay" if ($delay); >+ $datedue_days += $delay if ($delay); >+ >+ ( $datedue_days <= $today_days ) or next; # or it's not overdue, right? >+ >+ $overdueItemsCounted++; >+ my ( $amount, $type, $daycounttotal, $daycount ) = CalcFine( $data->[$i], $borrower->{'categorycode'}, $branchcode, undef, undef, $datedue, $today ); >+ >+ # Reassign fine's amount if specified in command-line >+ $amount = %catamounts->{$borrower->{'categorycode'}} if (defined %catamounts->{$borrower->{'categorycode'}}); >+ >+ # FIXME: $type NEVER gets populated by anything. >+ ( defined $type ) or $type = ''; >+ >+ # Don't update the fine if today is a holiday. >+ # This ensures that dropbox mode will remove the correct amount of fine. >+ if ( $mode eq 'production' and !$isHoliday and !$borrowersalreadyapplied->{$data->[$i]->{'borrowernumber'}}) { >+ $debug and warn "Updating fine for borrower " . $data->[$i]->{'borrowernumber'} . " with amount : $amount"; >+ UpdateFine( $data->[$i]->{'itemnumber'}, $data->[$i]->{'borrowernumber'}, $amount, $type, $due_str ) if ( $amount > 0 ); >+ $borrowersalreadyapplied->{$data->[$i]->{'borrowernumber'}} = 1; >+ } >+ my @cells = (); >+ push @cells, map { $borrower->{$_} } @borrower_fields; >+ push @cells, map { $data->[$i]->{$_} } @item_fields; >+ push @cells, $type, $daycounttotal, $amount; >+ print FILE join( $delim, @cells ), "\n"; >+} >+ >+my $numOverdueItems = scalar(@$data); >+if ($verbose) { >+ print <<EOM; >+Fines assessment -- $today_iso -- Saved to $filename >+Number of Overdue Items: >+ counted $overdueItemsCounted >+ reported $numOverdueItems >+ >+EOM >+} >+ >+close FILE; >-- >1.7.4.1
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
|
Splinter Review
Attachments on
bug 6858
:
5378
|
6197
|
8516
|
8521
|
8522
|
9772