use Encode;
use Carp;
use Koha::Email;
+use Koha::DateUtils qw( format_sqldatetime );
use vars qw($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS);
my ( $letter, $table, $values ) = @_;
if ( $table eq 'borrowers' && $values->{'dateexpiry'} ){
- my @dateexpiry = split /-/, $values->{'dateexpiry'};
-
- $values->{'dateexpiry'} = C4::Dates->new(
- sprintf(
- '%04d-%02d-%02d',
- Add_Delta_Days( @dateexpiry,0)
- ),
- 'iso'
- )->output();
+ $values->{'dateexpiry'} = format_sqldatetime( $values->{'dateexpiry'} );
}
if ( $table eq 'reserves' && $values->{'waitingdate'} ) {
sub GetUpcomingMembershipExpires {
my $dbh = C4::Context->dbh;
- my $days = C4::Context->preference("MembershipExpiryDaysNotice");
+ my $days = C4::Context->preference("MembershipExpiryDaysNotice") || 0;
+ my $dateexpiry = DateTime->now()->add(days => $days)->ymd();
+
my $query = "
SELECT borrowers.*, categories.description,
branches.branchname, branches.branchemail FROM borrowers
LEFT JOIN branches on borrowers.branchcode = branches.branchcode
LEFT JOIN categories on borrowers.categorycode = categories.categorycode
- WHERE dateexpiry = DATE_ADD(CURDATE(),INTERVAL $days DAY);
+ WHERE dateexpiry = ?;
";
my $sth = $dbh->prepare($query);
- $sth->execute;
+ $sth->execute($dateexpiry);
my $results = $sth->fetchall_arrayref({});
return $results;
}
--- /dev/null
+INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES('MembershipExpiryDaysNotice',14,'Send an account expiration notice that a patron''s card is about to expire after',NULL,'Integer')
\ No newline at end of file
('XSLTDetailsDisplay','default','','Enable XSL stylesheet control over details page display on intranet','Free'),
('XSLTResultsDisplay','default','','Enable XSL stylesheet control over results page display on intranet','Free'),
('z3950AuthorAuthFields','701,702,700',NULL,'Define the MARC biblio fields for Personal Name Authorities to fill biblio.author','free'),
-('z3950NormalizeAuthor','0','','If ON, Personal Name Authorities will replace authors in biblio.author','YesNo')
+('z3950NormalizeAuthor','0','','If ON, Personal Name Authorities will replace authors in biblio.author','YesNo'),
+('MembershipExpiryDaysNotice' ,14,'Send an account expiration notice that a patron\'s card is about to expire after',NULL,'Integer')
;
class: integer
- days beforehand.
-
- - Send a membership expiry notice that a patron is about to expire after
+ - Send an account expiration notice when a patron's card will expire in.
- pref: MembershipExpiryDaysNotice
class: integer
- days.
use C4::Context;
use C4::Letters;
use C4::Dates qw/format_date/;
+use C4::Log;
+
+cronlogaction();
# These are defaults for command line options.
my $confirm; # -c: Confirm that the user has read and configured this script.
--- /dev/null
+#!/usr/bin/perl
+
+# This file is part of Koha.
+#
+# Copyright 2015 Biblibre
+#
+# Koha is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# Koha is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with Koha; if not, see <http://www.gnu.org/licenses>.
+
+use Modern::Perl;
+use C4::Members;
+use Test::MockModule;
+use t::lib::TestBuilder;
+use t::lib::Mocks qw( mock_preference );
+
+use Test::More tests => 5;
+use Test::MockModule;
+
+BEGIN {
+ use_ok('C4::Members');
+}
+
+my $date_time = new Test::MockModule('DateTime');
+$date_time->mock(
+ 'now', sub {
+ return DateTime->new(
+ year => 2015,
+ month => 6,
+ day => 15,
+ );
+
+});
+
+t::lib::Mocks::mock_preference('MembershipExpiryDaysNotice', 15);
+
+my $builder = t::lib::TestBuilder->new();
+$builder->build({
+ source => 'Category',
+ value => {
+ categorycode => 'AD',
+ description => 'Adult',
+ enrolmentperiod => 18,
+ upperagelimit => 99,
+ category_type => 'A',
+ },
+});
+
+$builder->build({
+ source => 'Branch',
+ value => {
+ branchcode => 'CR',
+ branchname => 'My branch',
+ },
+});
+
+$builder->build({
+ source => 'Borrower',
+ value => {
+ firstname => 'Vincent',
+ surname => 'Martin',
+ cardnumber => '80808081',
+ categorycode => 'AD',
+ branchcode => 'CR',
+ dateexpiry => '2015-06-30'
+ },
+});
+
+$builder->build({
+ source => 'Borrower',
+ value => {
+ firstname => 'Claude',
+ surname => 'Dupont',
+ cardnumber => '80808082',
+ categorycode => 'AD',
+ branchcode => 'CR',
+ dateexpiry => '2015-06-29'
+ },
+});
+
+$builder->build({
+ source => 'Borrower',
+ value => {
+ firstname => 'Gilles',
+ surname => 'Dupond',
+ cardnumber => '80808083',
+ categorycode => 'AD',
+ branchcode => 'CR',
+ dateexpiry => '2015-07-02'
+ },
+});
+
+my $upcoming_mem_expires = C4::Members::GetUpcomingMembershipExpires();
+is(scalar(@$upcoming_mem_expires), 1, 'Get upcoming membership expires should return 1 borrower.');
+
+is($upcoming_mem_expires->[0]{surname}, 'Martin', 'Get upcoming membership expires should return borrower "Martin".');
+
+# Test GetUpcomingMembershipExpires() with MembershipExpiryDaysNotice == 0
+t::lib::Mocks::mock_preference('MembershipExpiryDaysNotice', 0);
+
+$upcoming_mem_expires = C4::Members::GetUpcomingMembershipExpires();
+is(scalar(@$upcoming_mem_expires), 0, 'Get upcoming membership expires with 0 MembershipExpiryDaysNotice should return 0.');
+
+# Test GetUpcomingMembershipExpires() with MembershipExpiryDaysNotice == undef
+t::lib::Mocks::mock_preference('MembershipExpiryDaysNotice', undef);
+
+$upcoming_mem_expires = C4::Members::GetUpcomingMembershipExpires();
+is(scalar(@$upcoming_mem_expires), 0, 'Get upcoming membership expires without MembershipExpiryDaysNotice should return 0.');