View | Details | Raw Unified | Return to bug 14834
Collapse All | Expand All

(-)a/C4/Members.pm (-10 / +31 lines)
Lines 1489-1513 sub GetExpiryDate { Link Here
1489
1489
1490
=head2 GetUpcomingMembershipExpires
1490
=head2 GetUpcomingMembershipExpires
1491
1491
1492
  my $upcoming_mem_expires = GetUpcomingMembershipExpires();
1492
    my $expires =
1493
        GetUpcomingMembershipExpires({ branch => $branch, range => $range });
1494
1495
    $branch is an optional branch code.
1496
    $range is an optional number of days before and after the date that
1497
    is set by the preference MembershipExpiryDaysNotice.
1498
    If the pref is e.g. 14 and range is 3 days, you will get all expires
1499
    from 11 to 17 days.
1493
1500
1494
=cut
1501
=cut
1495
1502
1496
sub GetUpcomingMembershipExpires {
1503
sub GetUpcomingMembershipExpires {
1504
    my ( $params ) = @_;
1505
    my $range = $params->{range} || 0;
1506
    my $branch = $params->{branch};
1507
1497
    my $dbh = C4::Context->dbh;
1508
    my $dbh = C4::Context->dbh;
1498
    my $days = C4::Context->preference("MembershipExpiryDaysNotice") || 0;
1509
    my $days = C4::Context->preference("MembershipExpiryDaysNotice") || 0;
1499
    my $dateexpiry = output_pref({ dt => (dt_from_string()->add( days => $days)), dateformat => 'iso', dateonly => 1 });
1510
    my $date1 = dt_from_string->add( days => $days - $range );
1511
    my $date2 = dt_from_string->add( days => $days + $range );
1512
    $date1= output_pref({ dt => $date1, dateformat => 'iso', dateonly => 1 });
1513
    $date2= output_pref({ dt => $date2, dateformat => 'iso', dateonly => 1 });
1500
1514
1501
    my $query = "
1515
    my $query = q|
1502
        SELECT borrowers.*, categories.description,
1516
        SELECT borrowers.*, categories.description,
1503
        branches.branchname, branches.branchemail FROM borrowers
1517
        branches.branchname, branches.branchemail FROM borrowers
1504
        LEFT JOIN branches on borrowers.branchcode = branches.branchcode
1518
        LEFT JOIN branches USING (branchcode)
1505
        LEFT JOIN categories on borrowers.categorycode = categories.categorycode
1519
        LEFT JOIN categories USING (categorycode)
1506
        WHERE dateexpiry = ?;
1520
    |;
1507
    ";
1521
    if( $branch ) {
1508
    my $sth = $dbh->prepare($query);
1522
        $query.= 'WHERE branchcode=? AND dateexpiry BETWEEN ? AND ?';
1509
    $sth->execute($dateexpiry);
1523
    } else {
1510
    my $results = $sth->fetchall_arrayref({});
1524
        $query.= 'WHERE dateexpiry BETWEEN ? AND ?';
1525
    }
1526
1527
    my $sth = $dbh->prepare( $query );
1528
    my @pars = $branch? ( $branch ): ();
1529
    push @pars, $date1, $date2;
1530
    $sth->execute( @pars );
1531
    my $results = $sth->fetchall_arrayref( {} );
1511
    return $results;
1532
    return $results;
1512
}
1533
}
1513
1534
(-)a/misc/cronjobs/membership_expiry.pl (-3 / +16 lines)
Lines 61-66 the patrons are printed to standard out. Link Here
61
Confirm flag: Add this option. The script will only print a usage
61
Confirm flag: Add this option. The script will only print a usage
62
statement otherwise.
62
statement otherwise.
63
63
64
=item B<-branch>
65
66
Optional branchcode to restrict the cronjob to that branch.
67
68
=item B<-range>
69
70
Optional range parameter to extend the selection with a number of days around
71
the date set by the preference.
72
64
=back
73
=back
65
74
66
=head1 CONFIGURATION
75
=head1 CONFIGURATION
Lines 115-123 use C4::Log; Link Here
115
# These are defaults for command line options.
124
# These are defaults for command line options.
116
my $confirm;                              # -c: Confirm that the user has read and configured this script.
125
my $confirm;                              # -c: Confirm that the user has read and configured this script.
117
my $nomail;                               # -n: No mail. Will not send any emails.
126
my $nomail;                               # -n: No mail. Will not send any emails.
118
my $verbose= 0;                           # -v: verbose
127
my $verbose = 0;                           # -v: verbose
119
my $help    = 0;
128
my $help    = 0;
120
my $man     = 0;
129
my $man     = 0;
130
my $range   = 0;
131
my $branch;
121
132
122
GetOptions(
133
GetOptions(
123
    'help|?'         => \$help,
134
    'help|?'         => \$help,
Lines 125-130 GetOptions( Link Here
125
    'c'              => \$confirm,
136
    'c'              => \$confirm,
126
    'n'              => \$nomail,
137
    'n'              => \$nomail,
127
    'v'              => \$verbose,
138
    'v'              => \$verbose,
139
    'branch:s'       => \$branch,
140
    'range:i'        => \$range,
128
) or pod2usage(2);
141
) or pod2usage(2);
129
142
130
pod2usage( -verbose => 2 ) if $man;
143
pod2usage( -verbose => 2 ) if $man;
Lines 134-140 cronlogaction(); Link Here
134
147
135
my $admin_adress = C4::Context->preference('KohaAdminEmailAddress');
148
my $admin_adress = C4::Context->preference('KohaAdminEmailAddress');
136
warn 'getting upcoming membership expires' if $verbose;
149
warn 'getting upcoming membership expires' if $verbose;
137
my $upcoming_mem_expires = C4::Members::GetUpcomingMembershipExpires();
150
my $upcoming_mem_expires = C4::Members::GetUpcomingMembershipExpires({ branch => $branch, range => $range });
138
warn 'found ' . scalar( @$upcoming_mem_expires ) . ' soon expiring members'
151
warn 'found ' . scalar( @$upcoming_mem_expires ) . ' soon expiring members'
139
    if $verbose;
152
    if $verbose;
140
153
Lines 156-162 foreach my $recent ( @$upcoming_mem_expires ) { Link Here
156
    });
169
    });
157
    if ($letter) {
170
    if ($letter) {
158
        if ($nomail) {
171
        if ($nomail) {
159
            print $letter->{'content'};
172
            print $letter->{'content'}."\n";
160
        } else {
173
        } else {
161
            C4::Letters::EnqueueLetter({
174
            C4::Letters::EnqueueLetter({
162
                letter                 => $letter,
175
                letter                 => $letter,
(-)a/t/db_dependent/Members/GetUpcomingMembershipExpires.t (-27 / +36 lines)
Lines 1-5 Link Here
1
#!/usr/bin/perl
1
#!/usr/bin/perl
2
2
3
# Tests for C4::Members::GetUpcomingMembershipExpires
4
3
# This file is part of Koha.
5
# This file is part of Koha.
4
#
6
#
5
# Copyright 2015 Biblibre
7
# Copyright 2015 Biblibre
Lines 18-34 Link Here
18
# along with Koha; if not, see <http://www.gnu.org/licenses>.
20
# along with Koha; if not, see <http://www.gnu.org/licenses>.
19
21
20
use Modern::Perl;
22
use Modern::Perl;
21
use C4::Members;
22
use Test::MockModule;
23
use t::lib::TestBuilder;
24
use t::lib::Mocks qw( mock_preference );
25
23
26
use Test::More tests => 5;
27
use Test::MockModule;
24
use Test::MockModule;
25
use Test::More tests => 6;
28
26
29
BEGIN {
27
use C4::Members qw|GetUpcomingMembershipExpires|;
30
    use_ok('C4::Members');
28
use t::lib::TestBuilder;
31
}
29
use t::lib::Mocks qw( mock_preference );
32
30
33
my $date_time = new Test::MockModule('DateTime');
31
my $date_time = new Test::MockModule('DateTime');
34
$date_time->mock(
32
$date_time->mock(
Lines 38-47 $date_time->mock( Link Here
38
            month     => 6,
36
            month     => 6,
39
            day       => 15,
37
            day       => 15,
40
        );
38
        );
41
42
});
39
});
43
40
44
t::lib::Mocks::mock_preference('MembershipExpiryDaysNotice', 15);
41
t::lib::Mocks::mock_preference( 'MembershipExpiryDaysNotice', 15 );
45
42
46
my $builder = t::lib::TestBuilder->new();
43
my $builder = t::lib::TestBuilder->new();
47
$builder->build({
44
$builder->build({
Lines 55-67 $builder->build({ Link Here
55
    },
52
    },
56
});
53
});
57
54
58
$builder->build({
55
my $branch = $builder->build({
59
    source => 'Branch',
56
    source => 'Branch',
60
    value  => {
57
    value  => {
61
        branchcode              => 'CR',
62
        branchname              => 'My branch',
58
        branchname              => 'My branch',
63
    },
59
    },
64
});
60
});
61
my $branchcode = $branch->{branchcode};
62
# before we add borrowers to this branch, add the expires we have now
63
# note that this pertains to the current mocked setting of the pref
64
my $expires = scalar @{ GetUpcomingMembershipExpires() };
65
65
66
$builder->build({
66
$builder->build({
67
    source => 'Borrower',
67
    source => 'Borrower',
Lines 70-76 $builder->build({ Link Here
70
        surname                 => 'Martin',
70
        surname                 => 'Martin',
71
        cardnumber              => '80808081',
71
        cardnumber              => '80808081',
72
        categorycode            => 'AD',
72
        categorycode            => 'AD',
73
        branchcode              => 'CR',
73
        branchcode              => $branchcode,
74
        dateexpiry              => '2015-06-30'
74
        dateexpiry              => '2015-06-30'
75
    },
75
    },
76
});
76
});
Lines 82-88 $builder->build({ Link Here
82
        surname                 => 'Dupont',
82
        surname                 => 'Dupont',
83
        cardnumber              => '80808082',
83
        cardnumber              => '80808082',
84
        categorycode            => 'AD',
84
        categorycode            => 'AD',
85
        branchcode              => 'CR',
85
        branchcode              => $branchcode,
86
        dateexpiry              => '2015-06-29'
86
        dateexpiry              => '2015-06-29'
87
    },
87
    },
88
});
88
});
Lines 94-117 $builder->build({ Link Here
94
        surname                 => 'Dupond',
94
        surname                 => 'Dupond',
95
        cardnumber              => '80808083',
95
        cardnumber              => '80808083',
96
        categorycode            => 'AD',
96
        categorycode            => 'AD',
97
        branchcode              => 'CR',
97
        branchcode              => $branchcode,
98
        dateexpiry              => '2015-07-02'
98
        dateexpiry              => '2015-07-02'
99
    },
99
    },
100
});
100
});
101
101
102
my $upcoming_mem_expires = C4::Members::GetUpcomingMembershipExpires();
102
# Test without extra parameters
103
is(scalar(@$upcoming_mem_expires), 1, 'Get upcoming membership expires should return 1 borrower.');
103
my $upcoming_mem_expires = GetUpcomingMembershipExpires();
104
is( scalar(@$upcoming_mem_expires), $expires + 1, 'Get upcoming membership expires should return one new borrower.' );
104
105
105
is($upcoming_mem_expires->[0]{surname}, 'Martin', 'Get upcoming membership expires should return borrower "Martin".');
106
# Test with branch
107
$upcoming_mem_expires = GetUpcomingMembershipExpires({ branch => $branchcode });
108
is( @$upcoming_mem_expires==1 && $upcoming_mem_expires->[0]{surname} eq 'Martin',1 , 'Get upcoming membership expires should return borrower "Martin".' );
106
109
107
# Test GetUpcomingMembershipExpires() with MembershipExpiryDaysNotice == 0
110
# Test MembershipExpiryDaysNotice == 0
108
t::lib::Mocks::mock_preference('MembershipExpiryDaysNotice', 0);
111
t::lib::Mocks::mock_preference( 'MembershipExpiryDaysNotice', 0 );
112
$upcoming_mem_expires = GetUpcomingMembershipExpires({ branch => $branchcode });
113
is( scalar(@$upcoming_mem_expires), 0, 'Get upcoming membership expires with MembershipExpiryDaysNotice==0 should not return new records.' );
109
114
110
$upcoming_mem_expires = C4::Members::GetUpcomingMembershipExpires();
115
# Test MembershipExpiryDaysNotice == undef
111
is(scalar(@$upcoming_mem_expires), 0, 'Get upcoming membership expires with 0 MembershipExpiryDaysNotice should return 0.');
116
t::lib::Mocks::mock_preference( 'MembershipExpiryDaysNotice', undef );
117
$upcoming_mem_expires = GetUpcomingMembershipExpires({ branch => $branchcode });
118
is( scalar(@$upcoming_mem_expires), 0, 'Get upcoming membership expires without MembershipExpiryDaysNotice should not return new records.' );
112
119
113
# Test GetUpcomingMembershipExpires() with MembershipExpiryDaysNotice == undef
120
# Test the range parameter
114
t::lib::Mocks::mock_preference('MembershipExpiryDaysNotice', undef);
121
t::lib::Mocks::mock_preference( 'MembershipExpiryDaysNotice', 15 );
122
$upcoming_mem_expires = GetUpcomingMembershipExpires({ branch => $branchcode, range => 1 });
123
is( scalar(@$upcoming_mem_expires), 2, 'Expect two results for range==1');
124
$upcoming_mem_expires = GetUpcomingMembershipExpires({ branch => $branchcode, range => 2 });
125
is( scalar(@$upcoming_mem_expires), 3, 'Expect three results for range==2' );
115
126
116
$upcoming_mem_expires = C4::Members::GetUpcomingMembershipExpires();
127
# End
117
is(scalar(@$upcoming_mem_expires), 0, 'Get upcoming membership expires without MembershipExpiryDaysNotice should return 0.');
118
- 

Return to bug 14834