3 # This script loops through each overdue item, determines the fine,
4 # and updates the total amount of fines due by each user. It relies on
5 # the existence of /tmp/fines, which is created by ???
6 # Doesn't really rely on it, it relys on being able to write to /tmp/
7 # It creates the fines file
9 # This script is meant to be run nightly out of cron.
11 # Copyright 2000-2002 Katipo Communications
12 # Copyright 2011 PTFS-Europe Ltd
14 # This file is part of Koha.
16 # Koha is free software; you can redistribute it and/or modify it
17 # under the terms of the GNU General Public License as published by
18 # the Free Software Foundation; either version 3 of the License, or
19 # (at your option) any later version.
21 # Koha is distributed in the hope that it will be useful, but
22 # WITHOUT ANY WARRANTY; without even the implied warranty of
23 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
24 # GNU General Public License for more details.
26 # You should have received a copy of the GNU General Public License
27 # along with Koha; if not, see <http://www.gnu.org/licenses>.
50 'v|verbose' => \
$verbose,
52 'o|out:s' => \
$output_dir,
54 my $usage = << 'ENDUSAGE';
56 This script calculates
and charges overdue fines
57 to patron accounts
. The Koha
system preference
'finesMode' controls
58 whether the fines are calculated
and charged to the patron accounts
("Calculate and charge");
59 calculated
and emailed to the admin but
not applied
("Calculate (but only for mailing to the admin)"); or not calculated
("Don't calculate").
61 This script has the following parameters
:
62 -h
--help
: this message
63 -l
--log: log the output to a file
(optional
if the
-o parameter is
given)
64 -o
--out
: ouput directory
for logs
(defaults to env
or /tmp
if !exist
)
77 qw(cardnumber categorycode surname firstname email phone address citystate);
78 my @item_fields = qw(itemnumber barcode date_due);
79 my @other_fields = qw(days_overdue fine);
80 my $libname = C4
::Context
->preference('LibraryName');
81 my $control = C4
::Context
->preference('CircControl');
82 my $mode = C4
::Context
->preference('finesMode');
83 my $delim = "\t"; # ? C4::Context->preference('delimiter') || "\t";
86 my $today = DateTime
->now( time_zone
=> C4
::Context
->tz() );
88 if ($log or $output_dir) {
89 $filename = get_filename
($output_dir);
94 open $fh, '>>', $filename or croak
"Cannot write file $filename: $!";
95 print {$fh} join $delim, ( @borrower_fields, @item_fields, @other_fields );
99 my $overdues = Getoverdues
();
100 for my $overdue ( @
{$overdues} ) {
101 next if $overdue->{itemlost
};
103 if ( !defined $overdue->{borrowernumber
} ) {
105 "ERROR in Getoverdues : issues.borrowernumber IS NULL. Repair 'issues' table now! Skipping record.\n";
108 my $borrower = BorType
( $overdue->{borrowernumber
} );
110 ( $control eq 'ItemHomeLibrary' ) ?
$overdue->{homebranch
}
111 : ( $control eq 'PatronLibrary' ) ?
$borrower->{branchcode
}
112 : $overdue->{branchcode
};
114 # In final case, CircControl must be PickupLibrary. (branchcode comes from issues table here).
115 if ( !exists $is_holiday{$branchcode} ) {
116 $is_holiday{$branchcode} = set_holiday
( $branchcode, $today );
119 my $datedue = dt_from_string
( $overdue->{date_due
} );
120 if ( DateTime
->compare( $datedue, $today ) == 1 ) {
125 my ( $amount, $unitcounttotal, $unitcount ) =
126 CalcFine
( $overdue, $borrower->{categorycode
},
127 $branchcode, $datedue, $today );
129 # Don't update the fine if today is a holiday.
130 # This ensures that dropbox mode will remove the correct amount of fine.
131 if ( $mode eq 'production' && !$is_holiday{$branchcode} ) {
132 if ( $amount && $amount > 0 ) {
135 issue_id
=> $overdue->{issue_id
},
136 itemnumber
=> $overdue->{itemnumber
},
137 borrowernumber
=> $overdue->{borrowernumber
},
139 due
=> output_pref
($datedue),
147 map { defined $borrower->{$_} ?
$borrower->{$_} : q{} }
149 push @cells, map { $overdue->{$_} } @item_fields;
150 push @cells, $unitcounttotal, $amount;
151 say {$fh} join $delim, @cells;
159 my $overdue_items = @
{$overdues};
161 Fines assessment -- $today
164 say "Saved to $filename";
167 Number of Overdue Items:
168 counted $overdue_items
175 my ( $branch, $dt ) = @_;
177 my $calendar = Koha
::Calendar
->new( branchcode
=> $branch );
178 return $calendar->is_holiday($dt);
182 my $directory = shift;
184 $directory = C4
::Context
::temporary_directory
;
186 if ( !-d
$directory ) {
187 carp
"Could not write to $directory ... does not exist!";
189 my $name = C4
::Context
->config('database');
191 $name .= join q{}, q{_}, $today->ymd(), '.log';
192 $name = File
::Spec
->catfile( $directory, $name );
193 if ($verbose && $log) {
194 say "writing to $name";