Bug 21698: Fix POD of cancel_unfilled_holds.pl
[koha.git] / misc / cronjobs / automatic_renewals.pl
index 73aad5f..6a170ca 100755 (executable)
@@ -23,7 +23,7 @@ automatic_renewals.pl - cron script to renew loans
 
 =head1 SYNOPSIS
 
-./automatic_renewals.pl
+./automatic_renewals.pl [--send-notices]
 
 or, in crontab:
 0 3 * * * automatic_renewals.pl
@@ -36,30 +36,93 @@ and the renewal isn't premature (No Renewal before) the issue is renewed.
 
 =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,
+                }
+            );
+        }
+    }
 }