ffzg/recall_notices.pl: added --interval and --dedup
[koha.git] / misc / cronjobs / membership_expiry.pl
index 4a0f98b..1b6ea81 100755 (executable)
@@ -61,6 +61,24 @@ the patrons are printed to standard out.
 Confirm flag: Add this option. The script will only print a usage
 statement otherwise.
 
+=item B<-branch>
+
+Optional branchcode to restrict the cronjob to that branch.
+
+=item B<-before>
+
+Optional parameter to extend the selection with a number of days BEFORE
+the date set by the preference.
+
+=item B<-after>
+
+Optional parameter to extend the selection with a number of days AFTER
+the date set by the preference.
+
+=item B<-letter>
+
+Optional parameter to use another notice than the default one.
+
 =back
 
 =head1 CONFIGURATION
@@ -112,12 +130,17 @@ use C4::Context;
 use C4::Letters;
 use C4::Log;
 
+use Koha::Patrons;
+
 # These are defaults for command line options.
 my $confirm;                              # -c: Confirm that the user has read and configured this script.
 my $nomail;                               # -n: No mail. Will not send any emails.
-my $verbose= 0;                           # -v: verbose
+my $verbose = 0;                           # -v: verbose
 my $help    = 0;
 my $man     = 0;
+my $before  = 0;
+my $after   = 0;
+my ( $branch, $letter_type );
 
 GetOptions(
     'help|?'         => \$help,
@@ -125,6 +148,10 @@ GetOptions(
     'c'              => \$confirm,
     'n'              => \$nomail,
     'v'              => \$verbose,
+    'branch:s'       => \$branch,
+    'before:i'       => \$before,
+    'after:i'        => \$after,
+    'letter:s'       => \$letter_type,
 ) or pod2usage(2);
 
 pod2usage( -verbose => 2 ) if $man;
@@ -132,59 +159,49 @@ pod2usage(1) if $help || !$confirm;
 
 cronlogaction();
 
+my $expdays = C4::Context->preference('MembershipExpiryDaysNotice');
+if( !$expdays ) {
+    #If the pref is not set, we will exit
+    warn 'Exiting membership_expiry.pl: MembershipExpiryDaysNotice not set'
+        if $verbose;
+    exit;
+}
+
 my $admin_adress = C4::Context->preference('KohaAdminEmailAddress');
 warn 'getting upcoming membership expires' if $verbose;
-my $upcoming_mem_expires = C4::Members::GetUpcomingMembershipExpires();
-warn 'found ' . scalar( @$upcoming_mem_expires ) . ' soon expiring members'
+my $upcoming_mem_expires = Koha::Patrons->search_upcoming_membership_expires(
+    {
+        ( $branch ? ( 'me.branchcode' => $branch ) : () ),
+        before => $before,
+        after  => $after,
+    }
+);
+warn 'found ' . $upcoming_mem_expires->count . ' soon expiring members'
     if $verbose;
 
 # main loop
-foreach my $recent ( @$upcoming_mem_expires ) {
-    my $from_address = $recent->{'branchemail'} || $admin_adress;
-    my $letter_type = 'MEMBERSHIP_EXPIRY';
-    my $letter = C4::Letters::getletter( 'members', $letter_type,
-        $recent->{'branchcode'} );
-    die "no letter of type '$letter_type' found. Please see sample_notices.sql"
-        unless $letter;
-
-    $letter = parse_letter({
-        letter         => $letter,
-        borrowernumber => $recent->{'borrowernumber'},
-        firstname      => $recent->{'firstname'},
-        categorycode   => $recent->{'categorycode'},
-        branchcode     => $recent->{'branchcode'},
-    });
-    if ($letter) {
-        if ($nomail) {
-            print $letter->{'content'};
-        } else {
-            C4::Letters::EnqueueLetter({
-                letter                 => $letter,
-                borrowernumber         =>  $recent->{'borrowernumber'},
-                from_address           => $from_address,
-                message_transport_type => 'email',
-            });
-        }
-    }
-}
-
-=head1 SUBROUTINES
-
-=head2 parse_letter
-
-=cut
-
-sub parse_letter {
-    my $params = shift;
-    foreach my $required ( qw( letter borrowernumber ) ) {
-        return unless exists $params->{$required};
-    }
-    my $letter =  C4::Letters::GetPreparedLetter (
-        module => 'members',
-        letter_code => 'MEMBERSHIP_EXPIRY',
-        tables => {
-            'borrowers', $params->{'borrowernumber'},
-            'branches', $params->{'branchcode'}
+$letter_type = 'MEMBERSHIP_EXPIRY' if !$letter_type;
+while ( my $recent = $upcoming_mem_expires->next ) {
+    my $from_address = $recent->library->branchemail || $admin_adress;
+    my $letter =  C4::Letters::GetPreparedLetter(
+        module      => 'members',
+        letter_code => $letter_type,
+        branchcode  => $recent->branchcode,
+        lang        => $recent->lang,
+        tables      => {
+            borrowers => $recent->borrowernumber,
+            branches  => $recent->branchcode,
         },
     );
+    last if !$letter; # Letters.pm already warned, just exit
+    if( $nomail ) {
+        print $letter->{'content'}."\n";
+    } else {
+        C4::Letters::EnqueueLetter({
+            letter                 => $letter,
+            borrowernumber         =>  $recent->borrowernumber,
+            from_address           => $from_address,
+            message_transport_type => 'email',
+        });
+    }
 }