Bug 16330: Move patches to OpenAPI
[koha.git] / t / db_dependent / Holds / WaitingReserves.t
1 #!/usr/bin/perl
2
3 use Modern::Perl;
4
5 use C4::Reserves;
6 use Koha::DateUtils;
7
8 use t::lib::Mocks;
9 use t::lib::TestBuilder;
10
11 use Test::More tests => 11;
12
13 use_ok('C4::Reserves');
14
15 my $schema  = Koha::Database->new->schema;
16 $schema->storage->txn_begin;
17
18 my $dbh = C4::Context->dbh;
19 $dbh->do(q{DELETE FROM special_holidays});
20 $dbh->do(q{DELETE FROM repeatable_holidays});
21 $dbh->do("DELETE FROM reserves");
22
23 my $builder = t::lib::TestBuilder->new();
24
25 # Category, branch and patrons
26 $builder->build({
27     source => 'Category',
28     value  => {
29         categorycode => 'XYZ1',
30     },
31 });
32 $builder->build({
33     source => 'Branch',
34     value  => {
35         branchcode => 'LIB1',
36     },
37 });
38
39 $builder->build({
40     source => 'Branch',
41     value  => {
42         branchcode => 'LIB2',
43     },
44 });
45
46 my $patron1 = $builder->build({
47     source => 'Borrower',
48     value  => {
49         categorycode => 'XYZ1',
50         branchcode => 'LIB1',
51     },
52 });
53
54 my $patron2 = $builder->build({
55     source => 'Borrower',
56     value  => {
57         categorycode => 'XYZ1',
58         branchcode => 'LIB2',
59     },
60 });
61
62 my $biblio = $builder->build({
63     source => 'Biblio',
64     value  => {
65         title => 'Title 1',    },
66 });
67
68 my $biblio2 = $builder->build({
69     source => 'Biblio',
70     value  => {
71         title => 'Title 2',    },
72 });
73
74 my $biblio3 = $builder->build({
75     source => 'Biblio',
76     value  => {
77         title => 'Title 3',    },
78 });
79
80 my $biblio4 = $builder->build({
81     source => 'Biblio',
82     value  => {
83         title => 'Title 4',    },
84 });
85
86 my $item1 = $builder->build({
87     source => 'Item',
88     value  => {
89         biblionumber => $biblio->{biblionumber},
90     },
91 });
92
93 my $item2 = $builder->build({
94     source => 'Item',
95     value  => {
96         biblionumber => $biblio2->{biblionumber},
97     },
98 });
99
100 my $item3 = $builder->build({
101     source => 'Item',
102     value  => {
103         biblionumber => $biblio3->{biblionumber},
104     },
105 });
106
107 my $item4 = $builder->build({
108     source => 'Item',
109     value  => {
110         biblionumber => $biblio4->{biblionumber},
111     },
112 });
113
114 my $today = dt_from_string();
115
116 my $reserve1_reservedate = $today->clone;
117 $reserve1_reservedate->subtract(days => 20);
118
119 my $reserve1_expirationdate = $today->clone;
120 $reserve1_expirationdate->add(days => 6);
121
122 my $reserve1 = $builder->build({
123     source => 'Reserve',
124     value => {
125         borrowernumber => $patron1->{borrowernumber},
126         reservedate => $reserve1_reservedate->ymd,
127         expirationdate => undef,
128         biblionumber => $biblio->{biblionumber},
129         branchcode => 'LIB1',
130         priority => 1,
131         found => '',
132     },
133 });
134
135 t::lib::Mocks::mock_preference('ExpireReservesMaxPickUpDelay', 1);
136 t::lib::Mocks::mock_preference('ReservesMaxPickUpDelay', 6);
137
138 ModReserveAffect( $item1->{itemnumber}, $patron1->{borrowernumber});
139 my $r = Koha::Holds->find($reserve1->{reserve_id});
140
141 is($r->waitingdate, $today->ymd, 'Waiting date should be set to today' );
142 is($r->expirationdate, $reserve1_expirationdate->ymd, 'Expiration date should be set to today + 6' );
143 is($r->found, 'W', 'Reserve status is now "waiting"' );
144 is($r->priority, 0, 'Priority should be 0' );
145 is($r->itemnumber, $item1->{itemnumber}, 'Item number should be set correctly' );
146
147 my $reserve2 = $builder->build({
148     source => 'Reserve',
149     value => {
150         borrowernumber => $patron2->{borrowernumber},
151         reservedate => $reserve1_reservedate->ymd,
152         expirationdate => undef,
153         biblionumber => $biblio2->{biblionumber},
154         branchcode => 'LIB1',
155         priority => 1,
156         found => '',
157     },
158 });
159
160 ModReserveAffect( $item2->{itemnumber}, $patron2->{borrowernumber}, 1);
161 my $r2 = Koha::Holds->find($reserve2->{reserve_id});
162
163 is($r2->found, 'T', '2nd reserve - Reserve status is now "To transfer"' );
164 is($r2->priority, 0, '2nd reserve - Priority should be 0' );
165 is($r2->itemnumber, $item2->{itemnumber}, '2nd reserve - Item number should be set correctly' );
166
167 my $reserve3 = $builder->build({
168     source => 'Reserve',
169     value => {
170         borrowernumber => $patron2->{borrowernumber},
171         reservedate => $reserve1_reservedate->ymd,
172         expirationdate => undef,
173         biblionumber => $biblio3->{biblionumber},
174         branchcode => 'LIB1',
175         priority => 1,
176         found => '',
177     },
178 });
179
180 my $special_holiday1_dt = $today->clone;
181 $special_holiday1_dt->add(days => 2);
182
183 my $holiday = $builder->build({
184     source => 'SpecialHoliday',
185     value => {
186         branchcode => 'LIB1',
187         day => $special_holiday1_dt->day,
188         month => $special_holiday1_dt->month,
189         year => $special_holiday1_dt->year,
190         title => 'My special holiday',
191         isexception => 0
192     },
193 });
194
195 my $special_holiday2_dt = $today->clone;
196 $special_holiday2_dt->add(days => 4);
197
198 my $holiday2 = $builder->build({
199     source => 'SpecialHoliday',
200     value => {
201         branchcode => 'LIB1',
202         day => $special_holiday2_dt->day,
203         month => $special_holiday2_dt->month,
204         year => $special_holiday2_dt->year,
205         title => 'My special holiday 2',
206         isexception => 0
207     },
208 });
209
210 Koha::Caches->get_instance->flush_all;
211
212 t::lib::Mocks::mock_preference('ExcludeHolidaysFromMaxPickUpDelay', 1);
213 ModReserveAffect( $item3->{itemnumber}, $patron2->{borrowernumber});
214
215 # Add 6 days of pickup delay + 1 day of holiday.
216 my $expected_expiration = $today->clone;
217 $expected_expiration->add(days => 8);
218
219 my $r3 = Koha::Holds->find($reserve3->{reserve_id});
220 is($r3->expirationdate, $expected_expiration->ymd, 'Expiration date should be set to today + 7' );
221
222 my $reserve4_reservedate = $today->clone;
223 my $requested_expiredate = $today->clone()->add(days => 6);
224
225 my $reserve4 = $builder->build({
226     source => 'Reserve',
227     value => {
228         borrowernumber => $patron2->{borrowernumber},
229         reservedate => $reserve4_reservedate->ymd,
230         expirationdate => $requested_expiredate->ymd,
231         biblionumber => $biblio4->{biblionumber},
232         branchcode => 'LIB1',
233         priority => 1,
234         found => '',
235     },
236 });
237
238 t::lib::Mocks::mock_preference('ReservesMaxPickUpDelay', 10);
239 ModReserveAffect( $item4->{itemnumber}, $patron2->{borrowernumber}, 0, $reserve4->{reserve_id});
240
241 my $r4 = Koha::Holds->find($reserve4->{reserve_id});
242 is($r4->expirationdate, $requested_expiredate->ymd, 'Requested expiration date should be kept' );
243
244 $schema->storage->txn_rollback;