=head1 SYNOPSIS
-./automatic_renewals.pl
+./automatic_renewals.pl [--send-notices]
or, in crontab:
0 3 * * * automatic_renewals.pl
=head1 OPTIONS
-No options.
+=over
+
+=item B<--send-notices>
+
+Send AUTO_RENEWALS notices to patrons if the auto renewal has been done.
+
+Note that this option does not support digest yet.
+
+=back
=cut
use Modern::Perl;
+use Pod::Usage;
+use Getopt::Long;
use C4::Circulation;
use C4::Context;
use C4::Log;
+use C4::Letters;
+use Koha::Checkouts;
+use Koha::Libraries;
+use Koha::Patrons;
-cronlogaction();
+my ( $help, $send_notices );
+GetOptions(
+ 'h|help' => \$help,
+ 'send-notices' => \$send_notices,
+) || pod2usage(1);
-my $dbh = C4::Context->dbh;
-my ( $borrowernumber, $itemnumber, $branch, $ok, $error );
+pod2usage(0) if $help;
-my $query =
-"SELECT borrowernumber, itemnumber, branchcode FROM issues WHERE auto_renew = 1";
-my $sth = $dbh->prepare($query);
-$sth->execute();
+cronlogaction();
-while ( ( $borrowernumber, $itemnumber, $branch ) = $sth->fetchrow_array ) {
+my $auto_renews = Koha::Checkouts->search({ auto_renew => 1 });
+
+my %report;
+while ( my $auto_renew = $auto_renews->next ) {
+
+ # CanBookBeRenewed returns 'auto_renew' when the renewal should be done by this script
+ my ( $ok, $error ) = CanBookBeRenewed( $auto_renew->borrowernumber, $auto_renew->itemnumber );
+ if ( $error eq 'auto_renew' ) {
+ my $date_due = AddRenewal( $auto_renew->borrowernumber, $auto_renew->itemnumber, $auto_renew->branchcode );
+ $auto_renew->auto_renew_error(undef)->store;
+ push @{ $report{ $auto_renew->borrowernumber } }, $auto_renew;
+ } elsif ( $error eq 'too_many'
+ or $error eq 'on_reserve'
+ or $error eq 'restriction'
+ or $error eq 'overdue'
+ or $error eq 'auto_account_expired'
+ or $error eq 'auto_too_late'
+ or $error eq 'auto_too_much_oweing'
+ or $error eq 'auto_too_soon' ) {
+ if ( not $auto_renew->auto_renew_error or $error ne $auto_renew->auto_renew_error ) {
+ $auto_renew->auto_renew_error($error)->store;
+ push @{ $report{ $auto_renew->borrowernumber } }, $auto_renew
+ if $error ne 'auto_too_soon'; # Do not notify if it's too soon
+ }
+ }
+}
-# CanBookBeRenewed returns 'auto_renew' when the renewal should be done by this script
- ( $ok, $error ) = CanBookBeRenewed( $borrowernumber, $itemnumber );
- AddRenewal( $borrowernumber, $itemnumber, $branch )
- if ( $error eq "auto_renew" );
+if ( $send_notices ) {
+ for my $borrowernumber ( keys %report ) {
+ my $patron = Koha::Patrons->find($borrowernumber);
+ for my $issue ( @{ $report{$borrowernumber} } ) {
+ my $item = Koha::Items->find( $issue->itemnumber );
+ my $letter = C4::Letters::GetPreparedLetter(
+ module => 'circulation',
+ letter_code => 'AUTO_RENEWALS',
+ tables => {
+ borrowers => $patron->borrowernumber,
+ issues => $issue->itemnumber,
+ items => $issue->itemnumber,
+ biblio => $item->biblionumber,
+ },
+ );
+
+ my $library = Koha::Libraries->find( $patron->branchcode );
+ my $admin_email_address = $library->branchemail || C4::Context->preference('KohaAdminEmailAddress');
+
+ C4::Letters::EnqueueLetter(
+ { letter => $letter,
+ borrowernumber => $borrowernumber,
+ message_transport_type => 'email',
+ from_address => $admin_email_address,
+ }
+ );
+ }
+ }
}