|
Lines 34-40
use Koha::Script -cron;
Link Here
|
| 34 |
use C4::Context; |
34 |
use C4::Context; |
| 35 |
use C4::Overdues qw( Getoverdues CalcFine UpdateFine ); |
35 |
use C4::Overdues qw( Getoverdues CalcFine UpdateFine ); |
| 36 |
use Getopt::Long qw( GetOptions ); |
36 |
use Getopt::Long qw( GetOptions ); |
| 37 |
use Carp qw( carp croak ); |
37 |
use Carp qw( carp croak ); |
| 38 |
use File::Spec; |
38 |
use File::Spec; |
| 39 |
use Try::Tiny qw( catch try ); |
39 |
use Try::Tiny qw( catch try ); |
| 40 |
|
40 |
|
|
Lines 52-66
my $maxdays;
Link Here
|
| 52 |
my $verify_issue; |
52 |
my $verify_issue; |
| 53 |
my $maxfinesdays; |
53 |
my $maxfinesdays; |
| 54 |
|
54 |
|
| 55 |
my $command_line_options = join(" ",@ARGV); |
55 |
my $command_line_options = join( " ", @ARGV ); |
| 56 |
|
56 |
|
| 57 |
GetOptions( |
57 |
GetOptions( |
| 58 |
'h|help' => \$help, |
58 |
'h|help' => \$help, |
| 59 |
'v|verbose' => \$verbose, |
59 |
'v|verbose' => \$verbose, |
| 60 |
'l|log' => \$log, |
60 |
'l|log' => \$log, |
| 61 |
'o|out:s' => \$output_dir, |
61 |
'o|out:s' => \$output_dir, |
| 62 |
'm|maxdays:i' => \$maxdays, |
62 |
'm|maxdays:i' => \$maxdays, |
| 63 |
'i|verifyissue' => \$verify_issue, |
63 |
'i|verifyissue' => \$verify_issue, |
| 64 |
'maxfinesdays=i' => \$maxfinesdays |
64 |
'maxfinesdays=i' => \$maxfinesdays |
| 65 |
); |
65 |
); |
| 66 |
my $usage = << 'ENDUSAGE'; |
66 |
my $usage = << 'ENDUSAGE'; |
|
Lines 87-121
if ($help) {
Link Here
|
| 87 |
exit; |
87 |
exit; |
| 88 |
} |
88 |
} |
| 89 |
|
89 |
|
| 90 |
my $script_handler = Koha::Script->new({ script => $0 }); |
90 |
my $script_handler = Koha::Script->new( { script => $0 } ); |
| 91 |
|
91 |
|
| 92 |
try { |
92 |
try { |
| 93 |
$script_handler->lock_exec; |
93 |
$script_handler->lock_exec; |
| 94 |
} |
94 |
} catch { |
| 95 |
catch { |
|
|
| 96 |
my $message = "Skipping execution of $0 ($_)"; |
95 |
my $message = "Skipping execution of $0 ($_)"; |
| 97 |
print STDERR "$message\n" |
96 |
print STDERR "$message\n" |
| 98 |
if $verbose; |
97 |
if $verbose; |
| 99 |
cronlogaction({ info => $message }); |
98 |
cronlogaction( { info => $message } ); |
| 100 |
exit; |
99 |
exit; |
| 101 |
}; |
100 |
}; |
| 102 |
|
101 |
|
| 103 |
cronlogaction({ info => $command_line_options }); |
102 |
cronlogaction( { info => $command_line_options } ); |
| 104 |
|
103 |
|
| 105 |
my @borrower_fields = |
104 |
my @borrower_fields = qw(cardnumber categorycode surname firstname email phone address citystate); |
| 106 |
qw(cardnumber categorycode surname firstname email phone address citystate); |
105 |
my @item_fields = qw(itemnumber barcode date_due); |
| 107 |
my @item_fields = qw(itemnumber barcode date_due); |
106 |
my @other_fields = qw(days_overdue fine); |
| 108 |
my @other_fields = qw(days_overdue fine); |
107 |
my $libname = C4::Context->preference('LibraryName'); |
| 109 |
my $libname = C4::Context->preference('LibraryName'); |
108 |
my $control = C4::Context->preference('CircControl'); |
| 110 |
my $control = C4::Context->preference('CircControl'); |
109 |
my $branch_type = C4::Context->preference('HomeOrHoldingBranch') || 'homebranch'; |
| 111 |
my $branch_type = C4::Context->preference('HomeOrHoldingBranch') || 'homebranch'; |
110 |
my $mode = C4::Context->preference('finesMode'); |
| 112 |
my $mode = C4::Context->preference('finesMode'); |
111 |
my $delim = "\t"; # ? C4::Context->preference('CSVDelimiter') || "\t"; |
| 113 |
my $delim = "\t"; # ? C4::Context->preference('CSVDelimiter') || "\t"; |
|
|
| 114 |
|
112 |
|
| 115 |
my %is_holiday; |
113 |
my %is_holiday; |
| 116 |
my $today = dt_from_string(); |
114 |
my $today = dt_from_string(); |
| 117 |
my $filename; |
115 |
my $filename; |
| 118 |
if ($log or $output_dir) { |
116 |
if ( $log or $output_dir ) { |
| 119 |
$filename = get_filename($output_dir); |
117 |
$filename = get_filename($output_dir); |
| 120 |
} |
118 |
} |
| 121 |
|
119 |
|
|
Lines 134-150
for my $overdue ( @{$overdues} ) {
Link Here
|
| 134 |
next if $overdue->{itemlost}; |
132 |
next if $overdue->{itemlost}; |
| 135 |
|
133 |
|
| 136 |
if ( !defined $overdue->{borrowernumber} ) { |
134 |
if ( !defined $overdue->{borrowernumber} ) { |
| 137 |
carp |
135 |
carp "ERROR in Getoverdues : issues.borrowernumber IS NULL. Repair 'issues' table now! Skipping record.\n"; |
| 138 |
"ERROR in Getoverdues : issues.borrowernumber IS NULL. Repair 'issues' table now! Skipping record.\n"; |
|
|
| 139 |
next; |
136 |
next; |
| 140 |
} |
137 |
} |
| 141 |
my $patron = Koha::Patrons->find( $overdue->{borrowernumber} ); |
138 |
my $patron = Koha::Patrons->find( $overdue->{borrowernumber} ); |
| 142 |
my $branchcode = |
139 |
my $branchcode = |
| 143 |
( $control eq 'ItemHomeLibrary' ) ? $overdue->{$branch_type} |
140 |
( $control eq 'ItemHomeLibrary' ) ? $overdue->{$branch_type} |
| 144 |
: ( $control eq 'PatronLibrary' ) ? $patron->branchcode |
141 |
: ( $control eq 'PatronLibrary' ) ? $patron->branchcode |
| 145 |
: $overdue->{branchcode}; |
142 |
: $overdue->{branchcode}; |
| 146 |
|
143 |
|
| 147 |
# In final case, CircControl must be PickupLibrary. (branchcode comes from issues table here). |
144 |
# In final case, CircControl must be PickupLibrary. (branchcode comes from issues table here). |
| 148 |
if ( !exists $is_holiday{$branchcode} ) { |
145 |
if ( !exists $is_holiday{$branchcode} ) { |
| 149 |
$is_holiday{$branchcode} = set_holiday( $branchcode, $today ); |
146 |
$is_holiday{$branchcode} = set_holiday( $branchcode, $today ); |
| 150 |
} |
147 |
} |
|
Lines 155-177
for my $overdue ( @{$overdues} ) {
Link Here
|
| 155 |
} |
152 |
} |
| 156 |
++$counted; |
153 |
++$counted; |
| 157 |
|
154 |
|
| 158 |
my ( $amount, $unitcounttotal, $unitcount); |
155 |
my ( $amount, $unitcounttotal, $unitcount ); |
| 159 |
if ( defined($maxfinesdays) && $maxfinesdays <= $datedue->delta_days( $today )->in_units( 'days' ) ) { |
156 |
if ( defined($maxfinesdays) && $maxfinesdays <= $datedue->delta_days($today)->in_units('days') ) { |
| 160 |
my $itype = $overdue->{itemtype} || $overdue->{itype}; |
157 |
my $itype = $overdue->{itemtype} || $overdue->{itype}; |
| 161 |
my $data = Koha::CirculationRules->get_effective_rule( { rule_name => 'overduefinescap', categorycode => $patron->categorycode, itemtype => $itype, branchcode => $branchcode } ); |
158 |
my $data = Koha::CirculationRules->get_effective_rule( |
| 162 |
if ( defined($data->rule_value) ) { |
159 |
{ |
| 163 |
$amount = $data->rule_value; |
160 |
rule_name => 'overduefinescap', categorycode => $patron->categorycode, itemtype => $itype, |
|
|
161 |
branchcode => $branchcode |
| 162 |
} |
| 163 |
); |
| 164 |
if ( defined( $data->rule_value ) ) { |
| 165 |
$amount = $data->rule_value; |
| 164 |
$unitcount = 'n/a'; |
166 |
$unitcount = 'n/a'; |
| 165 |
} |
167 |
} else { |
| 166 |
else { |
168 |
print |
| 167 |
print "No overduefinescap defined for {branchcode = $branchcode, itemtype = $itype and categorycode = $patron->categorycode}\n"; |
169 |
"No overduefinescap defined for {branchcode = $branchcode, itemtype = $itype and categorycode = $patron->categorycode}\n"; |
| 168 |
} |
170 |
} |
| 169 |
} |
171 |
} |
| 170 |
if (!$amount) { |
172 |
if ( !$amount ) { |
| 171 |
( $amount, $unitcounttotal, $unitcount ) = CalcFine( $overdue, $patron->categorycode, $branchcode, $datedue, $today ); |
173 |
( $amount, $unitcounttotal, $unitcount ) = |
|
|
174 |
CalcFine( $overdue, $patron->categorycode, $branchcode, $datedue, $today ); |
| 172 |
} |
175 |
} |
| 173 |
|
176 |
|
| 174 |
|
|
|
| 175 |
# Don't update the fine if today is a holiday. |
177 |
# Don't update the fine if today is a holiday. |
| 176 |
# This ensures that dropbox mode will remove the correct amount of fine. |
178 |
# This ensures that dropbox mode will remove the correct amount of fine. |
| 177 |
if ( |
179 |
if ( |
|
Lines 179-190
for my $overdue ( @{$overdues} ) {
Link Here
|
| 179 |
&& ( !$is_holiday{$branchcode} |
181 |
&& ( !$is_holiday{$branchcode} |
| 180 |
|| C4::Context->preference('ChargeFinesOnClosedDays') ) |
182 |
|| C4::Context->preference('ChargeFinesOnClosedDays') ) |
| 181 |
&& ( $amount && $amount > 0 ) |
183 |
&& ( $amount && $amount > 0 ) |
| 182 |
) |
184 |
) |
| 183 |
{ |
185 |
{ |
| 184 |
if ( $verify_issue ) { |
186 |
if ($verify_issue) { |
|
|
187 |
|
| 185 |
# if the issue changed before the script got to it, then pass on it. |
188 |
# if the issue changed before the script got to it, then pass on it. |
| 186 |
my $issue = Koha::Checkouts->find({ issue_id => $overdue->{issue_id} }); |
189 |
my $issue = Koha::Checkouts->find( { issue_id => $overdue->{issue_id} } ); |
| 187 |
if ( ! $issue or $issue->date_due ne $overdue->{date_due} ) { |
190 |
if ( !$issue or $issue->date_due ne $overdue->{date_due} ) { |
| 188 |
$counted--; |
191 |
$counted--; |
| 189 |
next; |
192 |
next; |
| 190 |
} |
193 |
} |
|
Lines 204-217
for my $overdue ( @{$overdues} ) {
Link Here
|
| 204 |
if ($filename) { |
207 |
if ($filename) { |
| 205 |
my @cells; |
208 |
my @cells; |
| 206 |
push @cells, |
209 |
push @cells, |
| 207 |
map { defined $borrower->{$_} ? $borrower->{$_} : q{} } |
210 |
map { defined $borrower->{$_} ? $borrower->{$_} : q{} } @borrower_fields; |
| 208 |
@borrower_fields; |
|
|
| 209 |
push @cells, map { $overdue->{$_} } @item_fields; |
211 |
push @cells, map { $overdue->{$_} } @item_fields; |
| 210 |
push @cells, $unitcounttotal, $amount; |
212 |
push @cells, $unitcounttotal, $amount; |
| 211 |
say {$fh} join $delim, @cells; |
213 |
say {$fh} join $delim, @cells; |
| 212 |
} |
214 |
} |
| 213 |
} |
215 |
} |
| 214 |
if ($filename){ |
216 |
if ($filename) { |
| 215 |
close $fh; |
217 |
close $fh; |
| 216 |
} |
218 |
} |
| 217 |
|
219 |
|
|
Lines 232-238
Number of Overdue Items:
Link Here
|
| 232 |
EOM |
234 |
EOM |
| 233 |
} |
235 |
} |
| 234 |
|
236 |
|
| 235 |
cronlogaction({ action => 'End', info => "COMPLETED" }); |
237 |
cronlogaction( { action => 'End', info => "COMPLETED" } ); |
| 236 |
|
238 |
|
| 237 |
sub set_holiday { |
239 |
sub set_holiday { |
| 238 |
my ( $branch, $dt ) = @_; |
240 |
my ( $branch, $dt ) = @_; |
|
Lines 253-259
sub get_filename {
Link Here
|
| 253 |
$name =~ s/\W//; |
255 |
$name =~ s/\W//; |
| 254 |
$name .= join q{}, q{_}, $today->ymd(), '.log'; |
256 |
$name .= join q{}, q{_}, $today->ymd(), '.log'; |
| 255 |
$name = File::Spec->catfile( $directory, $name ); |
257 |
$name = File::Spec->catfile( $directory, $name ); |
| 256 |
if ($verbose && $log) { |
258 |
if ( $verbose && $log ) { |
| 257 |
say "writing to $name"; |
259 |
say "writing to $name"; |
| 258 |
} |
260 |
} |
| 259 |
return $name; |
261 |
return $name; |
| 260 |
- |
|
|