|
Lines 2-8
Link Here
|
| 2 |
|
2 |
|
| 3 |
# This file is part of Koha. |
3 |
# This file is part of Koha. |
| 4 |
# |
4 |
# |
| 5 |
# Copyright (C) 2014 Hochschule für Gesundheit (hsg), Germany |
5 |
# Copyright (C) 2014 Hochschule für Gesundheit (hsg), Germany |
| 6 |
# |
6 |
# |
| 7 |
# Koha is free software; you can redistribute it and/or modify it |
7 |
# Koha is free software; you can redistribute it and/or modify it |
| 8 |
# under the terms of the GNU General Public License as published by |
8 |
# under the terms of the GNU General Public License as published by |
|
Lines 42-48
and the renewal isn't premature (No Renewal before) the issue is renewed.
Link Here
|
| 42 |
|
42 |
|
| 43 |
Send AUTO_RENEWALS notices to patrons if the auto renewal has been done. |
43 |
Send AUTO_RENEWALS notices to patrons if the auto renewal has been done. |
| 44 |
|
44 |
|
| 45 |
Note that this option does not support digest yet. |
45 |
=item B<-v> |
|
|
46 |
|
| 47 |
Verbose. Without this flag set, only fatal errors are reported. |
| 48 |
|
| 49 |
=item B<--digest-per-branch> |
| 50 |
|
| 51 |
Flag to indicate that generation of message digests should be |
| 52 |
performed separately for each branch. |
| 53 |
|
| 54 |
A patron could potentially have loans at several different branches |
| 55 |
There is no natural branch to set as the sender on the aggregated |
| 56 |
message in this situation so the default behavior is to use the |
| 57 |
borrowers home branch. This could surprise to the borrower when |
| 58 |
message sender is a library where they have not borrowed anything. |
| 59 |
|
| 60 |
Enabling this flag ensures that the issuing library is the sender of |
| 61 |
the digested message. It has no effect unless the borrower has |
| 62 |
chosen 'Digests only' on the advance messages. |
| 46 |
|
63 |
|
| 47 |
=back |
64 |
=back |
| 48 |
|
65 |
|
|
Lines 62-86
use Koha::Libraries;
Link Here
|
| 62 |
use Koha::Patrons; |
79 |
use Koha::Patrons; |
| 63 |
|
80 |
|
| 64 |
my ( $help, $send_notices ); |
81 |
my ( $help, $send_notices ); |
|
|
82 |
my $verbose = 0; # -v: verbose |
| 83 |
my $digest_per_branch = 0; # -digest-per-branch: Prepare and send digests per branch |
| 65 |
GetOptions( |
84 |
GetOptions( |
| 66 |
'h|help' => \$help, |
85 |
'h|help' => \$help, |
| 67 |
'send-notices' => \$send_notices, |
86 |
'send-notices' => \$send_notices, |
|
|
87 |
'v' => \$verbose, |
| 88 |
'digest-per-branch' => \$digest_per_branch, |
| 89 |
|
| 68 |
) || pod2usage(1); |
90 |
) || pod2usage(1); |
| 69 |
|
91 |
|
| 70 |
pod2usage(0) if $help; |
92 |
pod2usage(0) if $help; |
|
|
93 |
|
| 94 |
# Since advance notice options are not visible in the web-interface |
| 95 |
# unless EnhancedMessagingPreferences is on, let the user know that |
| 96 |
# this script probably isn't going to do much |
| 97 |
if ( ! C4::Context->preference('EnhancedMessagingPreferences') ) { |
| 98 |
warn <<'END_WARN'; |
| 99 |
|
| 100 |
The "EnhancedMessagingPreferences" syspref is off. |
| 101 |
Therefore, it is unlikely that this script will actually produce any messages to be sent. |
| 102 |
To change this, edit the "EnhancedMessagingPreferences" syspref. |
| 103 |
|
| 104 |
END_WARN |
| 105 |
} |
| 106 |
|
| 71 |
cronlogaction(); |
107 |
cronlogaction(); |
| 72 |
|
108 |
|
|
|
109 |
warn 'getting auto renewals' if $verbose; |
| 73 |
my $auto_renews = Koha::Checkouts->search({ auto_renew => 1 }); |
110 |
my $auto_renews = Koha::Checkouts->search({ auto_renew => 1 }); |
|
|
111 |
warn 'found ' . $auto_renews->size . ' auto renewals' if $verbose; |
| 74 |
|
112 |
|
|
|
113 |
my $renew_digest = {}; |
| 75 |
my %report; |
114 |
my %report; |
| 76 |
while ( my $auto_renew = $auto_renews->next ) { |
115 |
while ( my $auto_renew = $auto_renews->next ) { |
|
|
116 |
warn 'examining ' . $auto_renew->{'itemnumber'} . ' auto renew' if $verbose; |
| 117 |
|
| 118 |
my $borrower_preferences = C4::Members::Messaging::GetMessagingPreferences( { borrowernumber => $auto_renew->{'borrowernumber'}, |
| 119 |
message_name => 'auto_renewals' } ); |
| 120 |
|
| 121 |
next unless $borrower_preferences; |
| 77 |
|
122 |
|
| 78 |
# CanBookBeRenewed returns 'auto_renew' when the renewal should be done by this script |
123 |
# CanBookBeRenewed returns 'auto_renew' when the renewal should be done by this script |
| 79 |
my ( $ok, $error ) = CanBookBeRenewed( $auto_renew->borrowernumber, $auto_renew->itemnumber ); |
124 |
my ( $ok, $error ) = CanBookBeRenewed( $auto_renew->borrowernumber, $auto_renew->itemnumber ); |
| 80 |
if ( $error eq 'auto_renew' ) { |
125 |
if ( $error eq 'auto_renew' ) { |
| 81 |
my $date_due = AddRenewal( $auto_renew->borrowernumber, $auto_renew->itemnumber, $auto_renew->branchcode ); |
126 |
my $date_due = AddRenewal( $auto_renew->borrowernumber, $auto_renew->itemnumber, $auto_renew->branchcode ); |
| 82 |
$auto_renew->auto_renew_error(undef)->store; |
127 |
$auto_renew->auto_renew_error(undef)->store; |
| 83 |
push @{ $report{ $auto_renew->borrowernumber } }, $auto_renew; |
128 |
push @{ $report{ $auto_renew->borrowernumber } }, $auto_renew unless $borrower_preferences->{'wants_digest'}; |
| 84 |
} elsif ( $error eq 'too_many' |
129 |
} elsif ( $error eq 'too_many' |
| 85 |
or $error eq 'on_reserve' |
130 |
or $error eq 'on_reserve' |
| 86 |
or $error eq 'restriction' |
131 |
or $error eq 'restriction' |
|
Lines 93-101
while ( my $auto_renew = $auto_renews->next ) {
Link Here
|
| 93 |
if ( not $auto_renew->auto_renew_error or $error ne $auto_renew->auto_renew_error ) { |
138 |
if ( not $auto_renew->auto_renew_error or $error ne $auto_renew->auto_renew_error ) { |
| 94 |
$auto_renew->auto_renew_error($error)->store; |
139 |
$auto_renew->auto_renew_error($error)->store; |
| 95 |
push @{ $report{ $auto_renew->borrowernumber } }, $auto_renew |
140 |
push @{ $report{ $auto_renew->borrowernumber } }, $auto_renew |
| 96 |
if $error ne 'auto_too_soon'; # Do not notify if it's too soon |
141 |
if $error ne 'auto_too_soon' && !$borrower_preferences->{'wants_digest'}; # Do not notify if it's too soon |
| 97 |
} |
142 |
} |
| 98 |
} |
143 |
} |
|
|
144 |
if ( $borrower_preferences->{'wants_digest'} ) { |
| 145 |
# cache this one to process after we've run through all of the items. |
| 146 |
if ($digest_per_branch) { |
| 147 |
$renew_digest->{ $auto_renew->{branchcode} }->{ $auto_renew->{borrowernumber} }->{success} ++ if $error == 'auto_renew'; |
| 148 |
$renew_digest->{ $auto_renew->{branchcode} }->{ $auto_renew->{borrowernumber} }->{error}++ unless $error == 'auto_renew' || $error == 'auto_too_soon' ; |
| 149 |
} else { |
| 150 |
$renew_digest->{ $auto_renew->{borrowernumber} }->{success} ++ if $error == 'auto_renew'; |
| 151 |
$renew_digest->{ $auto_renew->{borrowernumber} }->{error}++ unless $error == 'auto_renew' || $error == 'auto_too_soon' ; |
| 152 |
} |
| 153 |
} |
| 154 |
|
| 99 |
} |
155 |
} |
| 100 |
|
156 |
|
| 101 |
if ( $send_notices ) { |
157 |
if ( $send_notices ) { |
|
Lines 127-130
if ( $send_notices ) {
Link Here
|
| 127 |
); |
183 |
); |
| 128 |
} |
184 |
} |
| 129 |
} |
185 |
} |
|
|
186 |
|
| 187 |
if ($digest_per_branch) { |
| 188 |
while (my ($branchcode, $digests) = each %$renew_digest) { |
| 189 |
send_digests({ |
| 190 |
digests => $digests, |
| 191 |
branchcode => $branchcode, |
| 192 |
letter_code => 'AUTO_RENEWALS_DGST', |
| 193 |
}); |
| 194 |
} |
| 195 |
} else { |
| 196 |
send_digests({ |
| 197 |
digests => $renew_digest, |
| 198 |
letter_code => 'AUTO_RENEWALS_DGST', |
| 199 |
}); |
| 200 |
} |
| 130 |
} |
201 |
} |
| 131 |
- |
202 |
|
|
|
203 |
=head1 METHODS |
| 204 |
|
| 205 |
=head2 send_digests |
| 206 |
|
| 207 |
send_digests({ |
| 208 |
digests => ..., |
| 209 |
letter_code => ..., |
| 210 |
}) |
| 211 |
|
| 212 |
Enqueue digested letters. |
| 213 |
|
| 214 |
Parameters: |
| 215 |
|
| 216 |
=over 4 |
| 217 |
|
| 218 |
=item C<$digests> |
| 219 |
|
| 220 |
Reference to the array of digested messages. |
| 221 |
|
| 222 |
=item C<$letter_code> |
| 223 |
|
| 224 |
String that denote the letter code. |
| 225 |
|
| 226 |
=back |
| 227 |
|
| 228 |
=cut |
| 229 |
|
| 230 |
sub send_digests { |
| 231 |
my $params = shift; |
| 232 |
|
| 233 |
my $admin_email_address = C4::Context->preference('KohaAdminEmailAddress'); |
| 234 |
|
| 235 |
PATRON: while ( my ( $borrowernumber, $digest ) = each %{$params->{digests}} ) { |
| 236 |
my $borrower_preferences = |
| 237 |
C4::Members::Messaging::GetMessagingPreferences( |
| 238 |
{ |
| 239 |
borrowernumber => $borrowernumber, |
| 240 |
message_name => 'auto_renewals' |
| 241 |
} |
| 242 |
); |
| 243 |
|
| 244 |
next PATRON unless $borrower_preferences; # how could this happen? |
| 245 |
|
| 246 |
my $patron = Koha::Patrons->find( $borrowernumber ); |
| 247 |
my $library = Koha::Libraries->find( $params->{branchcode} ); |
| 248 |
my $from_address = $library->{branchemail} || $admin_email_address; |
| 249 |
|
| 250 |
foreach my $transport ( keys %{ $borrower_preferences->{'transports'} } ) { |
| 251 |
my $letter = C4::Letters::GetPreparedLetter ( |
| 252 |
module => 'circulation', |
| 253 |
letter_code => $params->{letter_code}, |
| 254 |
branchcode => $params->{branchcode}, |
| 255 |
lang => $patron->lang, |
| 256 |
substitute => { |
| 257 |
error => $digest->{error}, |
| 258 |
success => $digest->{success}, |
| 259 |
}, |
| 260 |
tables => { |
| 261 |
borrowers => $patron->borrowernumber, |
| 262 |
}, |
| 263 |
message_transport_type => $transport, |
| 264 |
) || warn "no letter of type '$params->{letter_code}' found for borrowernumber $borrowernumber. Please see sample_notices.sql"; |
| 265 |
|
| 266 |
next unless $letter; |
| 267 |
|
| 268 |
C4::Letters::EnqueueLetter({ |
| 269 |
letter => $letter, |
| 270 |
borrowernumber => $borrowernumber, |
| 271 |
from_address => $from_address, |
| 272 |
message_transport_type => $transport |
| 273 |
}); |
| 274 |
} |
| 275 |
} |
| 276 |
} |