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(type 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, $type, $unitcounttotal ) =
126 CalcFine
( $overdue, $borrower->{categorycode
},
127 $branchcode, $datedue, $today );
130 # Don't update the fine if today is a holiday.
131 # This ensures that dropbox mode will remove the correct amount of fine.
132 if ( $mode eq 'production' && !$is_holiday{$branchcode} ) {
136 issue_id
=> $overdue->{issue_id
},
137 itemnumber
=> $overdue->{itemnumber
},
138 borrowernumber
=> $overdue->{borrowernumber
},
141 due
=> output_pref
($datedue),
149 map { defined $borrower->{$_} ?
$borrower->{$_} : q{} }
151 push @cells, map { $overdue->{$_} } @item_fields;
152 push @cells, $type, $unitcounttotal, $amount;
153 say {$fh} join $delim, @cells;
161 my $overdue_items = @
{$overdues};
163 Fines assessment -- $today
166 say "Saved to $filename";
169 Number of Overdue Items:
170 counted $overdue_items
177 my ( $branch, $dt ) = @_;
179 my $calendar = Koha
::Calendar
->new( branchcode
=> $branch );
180 return $calendar->is_holiday($dt);
184 my $directory = shift;
186 $directory = File
::Spec
->tmpdir();
188 if ( !-d
$directory ) {
189 carp
"Could not write to $directory ... does not exist!";
191 my $name = C4
::Context
->config('database');
193 $name .= join q{}, q{_}, $today->ymd(), '.log';
194 $name = File
::Spec
->catfile( $directory, $name );
195 if ($verbose && $log) {
196 say "writing to $name";