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

(-)a/C4/Reserves.pm (-4 / +37 lines)
Lines 950-955 sub CancelExpiredReserves { Link Here
950
        if ( defined($hold->found) && $hold->found eq 'W' ) {
950
        if ( defined($hold->found) && $hold->found eq 'W' ) {
951
            $cancel_params->{charge_cancel_fee} = 1;
951
            $cancel_params->{charge_cancel_fee} = 1;
952
        }
952
        }
953
        $cancel_params->{autofill} = C4::Context->preference('ExpireReservesAutoFill');
953
        $hold->cancel( $cancel_params );
954
        $hold->cancel( $cancel_params );
954
    }
955
    }
955
}
956
}
Lines 1151-1157 sub ModReserveStatus { Link Here
1151
1152
1152
=head2 ModReserveAffect
1153
=head2 ModReserveAffect
1153
1154
1154
  &ModReserveAffect($itemnumber,$borrowernumber,$diffBranchSend,$reserve_id, $desk_id);
1155
  &ModReserveAffect($itemnumber,$borrowernumber,$diffBranchSend,$reserve_id, $desk_id, $notify_library);
1155
1156
1156
This function affect an item and a status for a given reserve, either fetched directly
1157
This function affect an item and a status for a given reserve, either fetched directly
1157
by record_id, or by borrowernumber and itemnumber or biblionumber. If only biblionumber
1158
by record_id, or by borrowernumber and itemnumber or biblionumber. If only biblionumber
Lines 1165-1171 take care of the waiting status Link Here
1165
=cut
1166
=cut
1166
1167
1167
sub ModReserveAffect {
1168
sub ModReserveAffect {
1168
    my ( $itemnumber, $borrowernumber, $transferToDo, $reserve_id, $desk_id ) = @_;
1169
    my ( $itemnumber, $borrowernumber, $transferToDo, $reserve_id, $desk_id, $notify_library ) = @_;
1169
    my $dbh = C4::Context->dbh;
1170
    my $dbh = C4::Context->dbh;
1170
1171
1171
    # we want to attach $itemnumber to $borrowernumber, find the biblionumber
1172
    # we want to attach $itemnumber to $borrowernumber, find the biblionumber
Lines 1199-1205 sub ModReserveAffect { Link Here
1199
        $hold->set_processing();
1200
        $hold->set_processing();
1200
    } else {
1201
    } else {
1201
        $hold->set_waiting($desk_id);
1202
        $hold->set_waiting($desk_id);
1202
        _koha_notify_reserve( $hold->reserve_id ) unless $already_on_shelf;
1203
        _koha_notify_reserve( $hold->reserve_id, $notify_library ) unless $already_on_shelf;
1203
        my $transfers = Koha::Item::Transfers->search({
1204
        my $transfers = Koha::Item::Transfers->search({
1204
            itemnumber => $itemnumber,
1205
            itemnumber => $itemnumber,
1205
            datearrived => undef
1206
            datearrived => undef
Lines 1209-1215 sub ModReserveAffect { Link Here
1209
        };
1210
        };
1210
    }
1211
    }
1211
1212
1212
1213
    _FixPriority( { biblionumber => $biblionumber } );
1213
    _FixPriority( { biblionumber => $biblionumber } );
1214
    my $item = Koha::Items->find($itemnumber);
1214
    my $item = Koha::Items->find($itemnumber);
1215
    if ( $item->location && $item->location eq 'CART'
1215
    if ( $item->location && $item->location eq 'CART'
Lines 1815-1820 The following tables are availalbe witin the notice: Link Here
1815
1815
1816
sub _koha_notify_reserve {
1816
sub _koha_notify_reserve {
1817
    my $reserve_id = shift;
1817
    my $reserve_id = shift;
1818
    my $notify_library = shift;
1819
1818
    my $hold = Koha::Holds->find($reserve_id);
1820
    my $hold = Koha::Holds->find($reserve_id);
1819
    my $borrowernumber = $hold->borrowernumber;
1821
    my $borrowernumber = $hold->borrowernumber;
1820
1822
Lines 1882-1887 sub _koha_notify_reserve { Link Here
1882
        &$send_notification('print', 'HOLD');
1884
        &$send_notification('print', 'HOLD');
1883
    }
1885
    }
1884
1886
1887
    if ($notify_library) {
1888
        my $letter = C4::Letters::GetPreparedLetter(
1889
            module      => 'reserves',
1890
            letter_code => 'HOLD_CHANGED',
1891
            branchcode  => $hold->branchcode,
1892
            substitute  => { today => output_pref( dt_from_string ) },
1893
            tables      => {
1894
                'branches'    => $library,
1895
                'borrowers'   => $patron->unblessed,
1896
                'biblio'      => $hold->biblionumber,
1897
                'biblioitems' => $hold->biblionumber,
1898
                'reserves'    => $hold->unblessed,
1899
                'items'       => $hold->itemnumber,
1900
            },
1901
        );
1902
1903
        my $email =
1904
             C4::Context->preference('ExpireReservesAutoFillEmail')
1905
          || $library->{branchemail}
1906
          || C4::Context->preference('KohaAdminEmailAddress');
1907
1908
        C4::Letters::EnqueueLetter(
1909
            {
1910
                letter                 => $letter,
1911
                borrowernumber         => $borrowernumber,
1912
                message_transport_type => 'email',
1913
                from_address           => $email,
1914
                to_address             => $email,
1915
            }
1916
        );
1917
    }
1885
}
1918
}
1886
1919
1887
=head2 _ShiftPriorityByDateAndPriority
1920
=head2 _ShiftPriorityByDateAndPriority
(-)a/Koha/Hold.pm (+15 lines)
Lines 27-32 use List::MoreUtils qw(any); Link Here
27
use C4::Context qw(preference);
27
use C4::Context qw(preference);
28
use C4::Letters;
28
use C4::Letters;
29
use C4::Log;
29
use C4::Log;
30
use C4::Reserves;
30
31
31
use Koha::AuthorisedValues;
32
use Koha::AuthorisedValues;
32
use Koha::DateUtils qw(dt_from_string output_pref);
33
use Koha::DateUtils qw(dt_from_string output_pref);
Lines 497-502 Cancel a hold: Link Here
497
498
498
sub cancel {
499
sub cancel {
499
    my ( $self, $params ) = @_;
500
    my ( $self, $params ) = @_;
501
502
    my $autofill_next = $params->{autofill} && $self->itemnumber && $self->found && $self->found eq 'W';
503
500
    $self->_result->result_source->schema->txn_do(
504
    $self->_result->result_source->schema->txn_do(
501
        sub {
505
        sub {
502
            $self->cancellationdate( dt_from_string->strftime( '%Y-%m-%d %H:%M:%S' ) );
506
            $self->cancellationdate( dt_from_string->strftime( '%Y-%m-%d %H:%M:%S' ) );
Lines 559-564 sub cancel { Link Here
559
                if C4::Context->preference('HoldsLog');
563
                if C4::Context->preference('HoldsLog');
560
        }
564
        }
561
    );
565
    );
566
567
    if ($autofill_next) {
568
        my ( undef, $next_hold ) = C4::Reserves::CheckReserves( $self->itemnumber );
569
        if ($next_hold) {
570
            my $is_transfer = $self->branchcode ne $next_hold->{branchcode};
571
572
            C4::Reserves::ModReserveAffect( $self->itemnumber, $self->borrowernumber, $is_transfer, $next_hold->{reserve_id}, $autofill_next );
573
            C4::Reserves::ModItemTransfer( $self->itemnumber, $self->branchcode, $next_hold->{branchcode} ) if $is_transfer;
574
        }
575
    }
576
562
    return $self;
577
    return $self;
563
}
578
}
564
579
(-)a/installer/data/mysql/atomicupdate/bug_14364.perl (+22 lines)
Line 0 Link Here
1
$DBversion = 'XXX'; # will be replaced by the RM
2
if( CheckVersion( $DBversion ) ) {
3
    $dbh->do(q{
4
        INSERT IGNORE INTO systempreferences ( `variable`, `value`, `options`, `explanation`, `type` ) VALUES
5
        ('ExpireReservesAutoFill','0',NULL,'Automatically fill the next hold with a automatically canceled expired waiting hold.','YesNo'),
6
        ('ExpireReservesAutoFillEmail','', NULL,'If ExpireReservesAutoFill and an email is defined here, the email notification for the change in the hold will be sent to this address.','Free');
7
    });
8
9
    $dbh->do(q{
10
        INSERT INTO letter(module,code,branchcode,name,is_html,title,content,message_transport_type)
11
        VALUES ( 'reserves', 'HOLD_CHANGED', '', 'Canceled Hold Available for Different Patron', '0', 'Canceled Hold Available for Different Patron', 'The patron picking up <<biblio.title>> (<<items.barcode>>) has changed to <<borrowers.firstname>> <<borrowers.surname>> (<<borrowers.cardnumber>>).
12
13
Please update the hold information for this item.
14
15
Title: <<biblio.title>>
16
Author: <<biblio.author>>
17
Copy: <<items.copynumber>>
18
Pickup location: <<branches.branchname>>', 'email');
19
    });
20
21
    NewVersion( $DBversion, 14364, "Allow automatically canceled expired waiting holds to fill the next hold");
22
}
(-)a/installer/data/mysql/mandatory/sysprefs.sql (+2 lines)
Lines 190-195 INSERT INTO systempreferences ( `variable`, `value`, `options`, `explanation`, ` Link Here
190
('EnhancedMessagingPreferences','1','','If ON, allows patrons to select to receive additional messages about items due or nearly due.','YesNo'),
190
('EnhancedMessagingPreferences','1','','If ON, allows patrons to select to receive additional messages about items due or nearly due.','YesNo'),
191
('EnhancedMessagingPreferencesOPAC', '1', NULL, 'If ON, show patrons messaging setting on the OPAC.', 'YesNo'),
191
('EnhancedMessagingPreferencesOPAC', '1', NULL, 'If ON, show patrons messaging setting on the OPAC.', 'YesNo'),
192
('expandedSearchOption','0',NULL,'If ON, set advanced search to be expanded by default','YesNo'),
192
('expandedSearchOption','0',NULL,'If ON, set advanced search to be expanded by default','YesNo'),
193
('ExpireReservesAutoFill','0',NULL,'Automatically fill the next hold with a automatically canceled expired waiting hold.','YesNo'),
194
('ExpireReservesAutoFillEmail','', NULL,'If ExpireReservesAutoFill and an email is defined here, the email notification for the change in the hold will be sent to this address.','Free'),
193
('ExpireReservesMaxPickUpDelay','0','','Enabling this allows holds to expire automatically if they have not been picked by within the time period specified in ReservesMaxPickUpDelay','YesNo'),
195
('ExpireReservesMaxPickUpDelay','0','','Enabling this allows holds to expire automatically if they have not been picked by within the time period specified in ReservesMaxPickUpDelay','YesNo'),
194
('ExpireReservesMaxPickUpDelayCharge','0',NULL,'If ExpireReservesMaxPickUpDelay is enabled, and this field has a non-zero value, than a borrower whose waiting hold has expired will be charged this amount.','free'),
196
('ExpireReservesMaxPickUpDelayCharge','0',NULL,'If ExpireReservesMaxPickUpDelay is enabled, and this field has a non-zero value, than a borrower whose waiting hold has expired will be charged this amount.','free'),
195
('ExpireReservesOnHolidays', '1', NULL, 'If false, reserves at a library will not be canceled on days the library is not open.', 'YesNo'),
197
('ExpireReservesOnHolidays', '1', NULL, 'If false, reserves at a library will not be canceled on days the library is not open.', 'YesNo'),
(-)a/installer/data/mysql/pl-PL/mandatory/sample_notices.sql (+10 lines)
Lines 410-412 INSERT IGNORE INTO letter(module, code, branchcode, name, is_html, title, conten Link Here
410
INSERT IGNORE INTO letter(module, code, branchcode, name, is_html, title, content, message_transport_type, lang) VALUES ('ill', 'ILL_REQUEST_CANCEL', '', 'ILL request cancelled', 0, "Interlibrary loan request cancelled", "The patron for interlibrary loans request [% illrequest.illrequest_id %], with the following details, has requested cancellation of this ILL request:\n\n[% ill_full_metadata %]", 'sms', 'default');
410
INSERT IGNORE INTO letter(module, code, branchcode, name, is_html, title, content, message_transport_type, lang) VALUES ('ill', 'ILL_REQUEST_CANCEL', '', 'ILL request cancelled', 0, "Interlibrary loan request cancelled", "The patron for interlibrary loans request [% illrequest.illrequest_id %], with the following details, has requested cancellation of this ILL request:\n\n[% ill_full_metadata %]", 'sms', 'default');
411
INSERT IGNORE INTO letter(module, code, branchcode, name, is_html, title, content, message_transport_type, lang) VALUES ('ill', 'ILL_REQUEST_MODIFIED', '', 'ILL request modified', 0, "Interlibrary loan request modified", "The patron for interlibrary loans request [% illrequest.illrequest_id %], with the following details, has modified this ILL request:\n\n[% ill_full_metadata %]", 'sms', 'default');
411
INSERT IGNORE INTO letter(module, code, branchcode, name, is_html, title, content, message_transport_type, lang) VALUES ('ill', 'ILL_REQUEST_MODIFIED', '', 'ILL request modified', 0, "Interlibrary loan request modified", "The patron for interlibrary loans request [% illrequest.illrequest_id %], with the following details, has modified this ILL request:\n\n[% ill_full_metadata %]", 'sms', 'default');
412
INSERT IGNORE INTO letter(module, code, branchcode, name, is_html, title, content, message_transport_type, lang) VALUES ('ill', 'ILL_PARTNER_REQ', '', 'ILL request to partners', 0, "Interlibrary loan request to partners", "Dear Sir/Madam,\n\nWe would like to request an interlibrary loan for a title matching the following description:\n\n[% ill_full_metadata %]\n\nPlease let us know if you are able to supply this to us.\n\nKind Regards\n\n[% branch.branchname %]\n[% branch.branchaddress1 %]\n[% branch.branchaddress2 %]\n[% branch.branchaddress3 %]\n[% branch.branchcity %]\n[% branch.branchstate %]\n[% branch.branchzip %]\n[% branch.branchphone %]\n[% branch.branchillemail %]\n[% branch.branchemail %]", 'sms', 'default');
412
INSERT IGNORE INTO letter(module, code, branchcode, name, is_html, title, content, message_transport_type, lang) VALUES ('ill', 'ILL_PARTNER_REQ', '', 'ILL request to partners', 0, "Interlibrary loan request to partners", "Dear Sir/Madam,\n\nWe would like to request an interlibrary loan for a title matching the following description:\n\n[% ill_full_metadata %]\n\nPlease let us know if you are able to supply this to us.\n\nKind Regards\n\n[% branch.branchname %]\n[% branch.branchaddress1 %]\n[% branch.branchaddress2 %]\n[% branch.branchaddress3 %]\n[% branch.branchcity %]\n[% branch.branchstate %]\n[% branch.branchzip %]\n[% branch.branchphone %]\n[% branch.branchillemail %]\n[% branch.branchemail %]", 'sms', 'default');
413
414
INSERT INTO letter(module,code,branchcode,name,is_html,title,content,message_transport_type)
415
    VALUES ( 'reserves', 'HOLD_CHANGED', '', 'Canceled Hold Available for Different Patron', '0', 'Canceled Hold Available for Different Patron', 'The patron picking up <<biblio.title>> (<<items.barcode>>) has changed to <<borrowers.firstname>> <<borrowers.surname>> (<<borrowers.cardnumber>>).
416
417
Please update the hold information for this item.
418
419
Title: <<biblio.title>>
420
Author: <<biblio.author>>
421
Copy: <<items.copynumber>>
422
Pickup location: <<branches.branchname>>', 'email');
(-)a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/circulation.pref (-1 / +11 lines)
Lines 731-737 Circulation: Link Here
731
              choices:
731
              choices:
732
                  yes: Allow
732
                  yes: Allow
733
                  no: "Don't allow"
733
                  no: "Don't allow"
734
            - 'holds to expire automatically if they have not been picked by within the time period specified in the <a href="/cgi-bin/koha/admin/preferences.pl?op=search&searchfield=ReservesMaxPickUpDelay">ReservesMaxPickUpDelay</a> system preference.<br><strong>NOTE:</strong> This system preference requires the <code>misc/cronjobs/holds/cancel_expired_holds.pl</code> cronjob. Ask your system administrator to schedule it.'
734
            - 'holds to expire automatically if they have not been picked by within the time period specified in the <a href="/cgi-bin/koha/admin/preferences.pl?op=search&searchfield=ReservesMaxPickUpDelay">ReservesMaxPickUpDelay</a> system preference.'
735
            - '<br><strong>NOTE:</strong> This system preference requires the <code>misc/cronjobs/holds/cancel_expired_holds.pl</code> cronjob. Ask your system administrator to schedule it.<br>'
736
            - pref: ExpireReservesAutoFill
737
              choices:
738
                  yes: "Do"
739
                  no: "Don't"
740
            - automatically fill the next hold using the item. If enabled, an email notification will be sent to either the email address defined in ExpireReservesAutoFillEmail, the item's holding library's email address, or the email address defined in KohaAdminEmailAddress in that order.
741
        -
742
            - Send email notification of the new hold filled with a canceled item to
743
            - pref: ExpireReservesAutoFillEmail
744
            - . If no address is defined here, the email will be sent to either the item's holding library or the email address defined in KohaAdminEmailAddress in that order.
735
        -
745
        -
736
            - If using <a href="/cgi-bin/koha/admin/preferences.pl?op=search&searchfield=ExpireReservesMaxPickUpDelay">ExpireReservesMaxPickUpDelay</a>, charge a patron who allows their waiting hold to expire a fee of
746
            - If using <a href="/cgi-bin/koha/admin/preferences.pl?op=search&searchfield=ExpireReservesMaxPickUpDelay">ExpireReservesMaxPickUpDelay</a>, charge a patron who allows their waiting hold to expire a fee of
737
            - pref: ExpireReservesMaxPickUpDelayCharge
747
            - pref: ExpireReservesMaxPickUpDelayCharge
(-)a/t/db_dependent/Holds/ExpireReservesAutoFill.t (-1 / +186 lines)
Line 0 Link Here
0
- 
1
#!/usr/bin/perl
2
3
use Modern::Perl;
4
5
use Test::More tests => 3;
6
7
use t::lib::Mocks;
8
use t::lib::TestBuilder;
9
10
use MARC::Record;
11
12
use C4::Context;
13
use C4::Biblio;
14
use C4::Items;
15
use Koha::Database;
16
use Koha::Holds;
17
18
BEGIN {
19
    use FindBin;
20
    use lib $FindBin::Bin;
21
    use_ok('C4::Reserves');
22
}
23
24
my $schema = Koha::Database->new->schema;
25
$schema->storage->txn_begin;
26
27
my $builder = t::lib::TestBuilder->new();
28
my $dbh     = C4::Context->dbh;
29
30
# Create two random branches
31
my $library_1 = $builder->build({ source => 'Branch' })->{ branchcode };
32
my $library_2 = $builder->build({ source => 'Branch' })->{ branchcode };
33
34
my $biblio = $builder->build_sample_biblio({ itemtype => 'DUMMY' });
35
my $biblionumber = $biblio->id;
36
37
# Create item instance for testing.
38
my $itemnumber = $builder->build_sample_item({ library => $library_1, biblionumber => $biblio->biblionumber })->itemnumber;
39
40
my $patron_1 = $builder->build( { source => 'Borrower' } );
41
my $patron_2 = $builder->build( { source => 'Borrower' } );
42
my $patron_3 = $builder->build( { source => 'Borrower' } );
43
44
subtest 'Test automatically canceled expired waiting holds to fill the next hold, without a transfer' => sub {
45
    plan tests => 8;
46
47
    $dbh->do('DELETE FROM reserves');
48
    $dbh->do('DELETE FROM message_queue');
49
50
    # Add a hold on the item for each of our patrons
51
    my $hold_1 = Koha::Hold->new(
52
        {
53
            priority       => 0,
54
            borrowernumber => $patron_1->{borrowernumber},
55
            branchcode     => $library_1,
56
            biblionumber   => $biblionumber,
57
            itemnumber     => $itemnumber,
58
            found          => 'W',
59
            reservedate    => '1900-01-01',
60
            waitingdate    => '1900-01-01',
61
            expirationdate => '1900-01-01',
62
            lowestPriority => 0,
63
            suspend        => 0,
64
        }
65
    )->store();
66
    my $hold_2 = Koha::Hold->new(
67
        {
68
            priority       => 1,
69
            borrowernumber => $patron_2->{borrowernumber},
70
            branchcode     => $library_1,
71
            biblionumber   => $biblionumber,
72
            itemnumber     => $itemnumber,
73
            reservedate    => '1900-01-01',
74
            expirationdate => '9999-01-01',
75
            lowestPriority => 0,
76
            suspend        => 0,
77
        }
78
    )->store();
79
    my $hold_3 = Koha::Hold->new(
80
        {
81
            priority       => 2,
82
            borrowernumber => $patron_2->{borrowernumber},
83
            branchcode     => $library_1,
84
            biblionumber   => $biblionumber,
85
            itemnumber     => $itemnumber,
86
            reservedate    => '1900-01-01',
87
            expirationdate => '9999-01-01',
88
            lowestPriority => 0,
89
            suspend        => 0,
90
        }
91
    )->store();
92
93
    # Test CancelExpiredReserves
94
    t::lib::Mocks::mock_preference( 'ExpireReservesMaxPickUpDelay', 1 );
95
    t::lib::Mocks::mock_preference( 'ReservesMaxPickUpDelay',       1 );
96
    t::lib::Mocks::mock_preference( 'ExpireReservesOnHolidays',     1 );
97
    t::lib::Mocks::mock_preference( 'ExpireReservesAutoFill',       1 );
98
    t::lib::Mocks::mock_preference( 'ExpireReservesAutoFillEmail',
99
        'kyle@example.com' );
100
101
    CancelExpiredReserves();
102
103
    my @holds = Koha::Holds->search( {}, { order_by => 'priority' } );
104
    $hold_2 = $holds[0];
105
    $hold_3 = $holds[1];
106
107
    is( @holds,            2,   'Found 2 holds' );
108
    is( $hold_2->priority, 0,   'Next hold in line now has priority of 0' );
109
    is( $hold_2->found,    'W', 'Next hold in line is now set to waiting' );
110
111
    my @messages = $schema->resultset('MessageQueue')
112
      ->search( { letter_code => 'HOLD_CHANGED' } );
113
    is( @messages, 1, 'Found 1 message in the message queue' );
114
    is( $messages[0]->to_address, 'kyle@example.com', 'Message sent to correct email address' );
115
116
    $hold_2->expirationdate('1900-01-01')->store();
117
118
    CancelExpiredReserves();
119
120
    @holds = Koha::Holds->search( {}, { order_by => 'priority' } );
121
    $hold_3 = $holds[0];
122
123
    is( @holds,            1,   'Found 1 hold' );
124
    is( $hold_3->priority, 0,   'Next hold in line now has priority of 0' );
125
    is( $hold_3->found,    'W', 'Next hold in line is now set to waiting' );
126
};
127
128
subtest 'Test automatically canceled expired waiting holds to fill the next hold, with a transfer' => sub {
129
    plan tests => 6;
130
131
    $dbh->do('DELETE FROM reserves');
132
    $dbh->do('DELETE FROM message_queue');
133
134
    # Add a hold on the item for each of our patrons
135
    my $hold_1 = Koha::Hold->new(
136
        {
137
            priority       => 0,
138
            borrowernumber => $patron_1->{borrowernumber},
139
            branchcode     => $library_1,
140
            biblionumber   => $biblionumber,
141
            itemnumber     => $itemnumber,
142
            found          => 'W',
143
            reservedate    => '1900-01-01',
144
            waitingdate    => '1900-01-01',
145
            expirationdate => '1900-01-01',
146
            lowestPriority => 0,
147
            suspend        => 0,
148
        }
149
    )->store();
150
    my $hold_2 = Koha::Hold->new(
151
        {
152
            priority       => 1,
153
            borrowernumber => $patron_2->{borrowernumber},
154
            branchcode     => $library_2,
155
            biblionumber   => $biblionumber,
156
            itemnumber     => $itemnumber,
157
            reservedate    => '1900-01-01',
158
            expirationdate => '9999-01-01',
159
            lowestPriority => 0,
160
            suspend        => 0,
161
        }
162
    )->store();
163
164
    # Test CancelExpiredReserves
165
    t::lib::Mocks::mock_preference( 'ExpireReservesMaxPickUpDelay', 1 );
166
    t::lib::Mocks::mock_preference( 'ReservesMaxPickUpDelay',       1 );
167
    t::lib::Mocks::mock_preference( 'ExpireReservesOnHolidays',     1 );
168
    t::lib::Mocks::mock_preference( 'ExpireReservesAutoFill',       1 );
169
    t::lib::Mocks::mock_preference( 'ExpireReservesAutoFillEmail',
170
        'kyle@example.com' );
171
172
    CancelExpiredReserves();
173
174
    my @holds = Koha::Holds->search( {}, { order_by => 'priority' } );
175
    $hold_2 = $holds[0];
176
177
    is( @holds,            1,   'Found 1 hold' );
178
    is( $hold_2->priority, 0,   'Next hold in line now has priority of 0' );
179
    is( $hold_2->found,    'T', 'Next hold in line is now set to in transit' );
180
    is( $hold_2->branchcode, $library_2, "Next hold in line has correct branchcode" );
181
182
    my @messages = $schema->resultset('MessageQueue')
183
      ->search( { letter_code => 'HOLD_CHANGED' } );
184
    is( @messages, 1, 'Found 1 message in the message queue' );
185
    is( $messages[0]->to_address, 'kyle@example.com', 'Message sent to correct email address' );
186
};

Return to bug 14364