Bug 6810: Add new systempreference (MembershipExpiryDaysNotice)
authorAlex Arnaud <alex.arnaud@biblibre.com>
Thu, 11 Jun 2015 10:17:07 +0000 (12:17 +0200)
committerTomas Cohen Arazi <tomascohen@theke.io>
Tue, 6 Oct 2015 14:13:19 +0000 (11:13 -0300)
Signed-off-by: Indranil Das Gupta (L2C2 Technologies) <indradg@gmail.com>

Bug 6810 - Fix QA failures

- Use KohaDates to convert dateexpiry
- remove MYSQL specifics methods for date handling in
  GetUpcomingMembershipExpires
- make the script membership_expiry.pl write in Koha system logs
- add tests

Signed-off-by: Indranil Das Gupta (L2C2 Technologies) <indradg@gmail.com>

Bug 6810 - Fix QA failures:

  - use Koha::DateUtils instead of Koha::Template::Plugin::KohaDates,
  - Add test with syspref MembershipExpiryDaysNotice equals 0 and undef,
  - fix (new) test failure (when MembershipExpiryDaysNotice is undef).

Signed-off-by: Indranil Das Gupta (L2C2 Technologies) <indradg@gmail.com>

Signed-off-by: Marcel de Rooy <m.de.rooy@rijksmuseum.nl>
Signed-off-by: Tomas Cohen Arazi <tomascohen@theke.io>

C4/Letters.pm
C4/Members.pm
installer/data/mysql/atomicupdate/bug_6810-add_MembershipExpiryDaysNotice_syspref.sql [new file with mode: 0644]
installer/data/mysql/sysprefs.sql
koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/patrons.pref
misc/cronjobs/membership_expiry.pl
t/Members.t [new file with mode: 0644]

index 764f238..6f148a9 100644 (file)
@@ -35,6 +35,7 @@ use Date::Calc qw( Add_Delta_Days );
 use Encode;
 use Carp;
 use Koha::Email;
+use Koha::DateUtils qw( format_sqldatetime );
 
 use vars qw($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS);
 
@@ -799,15 +800,7 @@ sub _parseletter {
     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'} ) {
index ebb8a1f..ede73da 100644 (file)
@@ -1493,16 +1493,18 @@ sub GetExpiryDate {
 
 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;
 }
diff --git a/installer/data/mysql/atomicupdate/bug_6810-add_MembershipExpiryDaysNotice_syspref.sql b/installer/data/mysql/atomicupdate/bug_6810-add_MembershipExpiryDaysNotice_syspref.sql
new file mode 100644 (file)
index 0000000..19bbba9
--- /dev/null
@@ -0,0 +1 @@
+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
index 39ed1b6..dd4b4dc 100644 (file)
@@ -492,5 +492,6 @@ INSERT INTO systempreferences ( `variable`, `value`, `options`, `explanation`, `
 ('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')
 ;
index 89e07b1..a0e8587 100644 (file)
@@ -84,7 +84,7 @@ Patrons:
            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.
index 2ed3d75..f92b77f 100755 (executable)
@@ -45,6 +45,9 @@ BEGIN {
 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.
diff --git a/t/Members.t b/t/Members.t
new file mode 100644 (file)
index 0000000..241858f
--- /dev/null
@@ -0,0 +1,117 @@
+#!/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.');