9 use t::lib::TestBuilder;
11 use Test::More tests => 11;
13 use_ok('C4::Reserves');
15 my $schema = Koha::Database->new->schema;
16 $schema->storage->txn_begin;
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");
23 my $builder = t::lib::TestBuilder->new();
25 # Category, branch and patrons
29 categorycode => 'XYZ1',
46 my $patron1 = $builder->build({
49 categorycode => 'XYZ1',
54 my $patron2 = $builder->build({
57 categorycode => 'XYZ1',
62 my $biblio = $builder->build({
65 title => 'Title 1', },
68 my $biblio2 = $builder->build({
71 title => 'Title 2', },
74 my $biblio3 = $builder->build({
77 title => 'Title 3', },
80 my $biblio4 = $builder->build({
83 title => 'Title 4', },
86 my $item1 = $builder->build({
89 biblionumber => $biblio->{biblionumber},
93 my $item2 = $builder->build({
96 biblionumber => $biblio2->{biblionumber},
100 my $item3 = $builder->build({
103 biblionumber => $biblio3->{biblionumber},
107 my $item4 = $builder->build({
110 biblionumber => $biblio4->{biblionumber},
114 my $today = dt_from_string();
116 my $reserve1_reservedate = $today->clone;
117 $reserve1_reservedate->subtract(days => 20);
119 my $reserve1_expirationdate = $today->clone;
120 $reserve1_expirationdate->add(days => 6);
122 my $reserve1 = $builder->build({
125 borrowernumber => $patron1->{borrowernumber},
126 reservedate => $reserve1_reservedate->ymd,
127 expirationdate => undef,
128 biblionumber => $biblio->{biblionumber},
129 branchcode => 'LIB1',
135 t::lib::Mocks::mock_preference('ExpireReservesMaxPickUpDelay', 1);
136 t::lib::Mocks::mock_preference('ReservesMaxPickUpDelay', 6);
138 ModReserveAffect( $item1->{itemnumber}, $patron1->{borrowernumber});
139 my $r = Koha::Holds->find($reserve1->{reserve_id});
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' );
147 my $reserve2 = $builder->build({
150 borrowernumber => $patron2->{borrowernumber},
151 reservedate => $reserve1_reservedate->ymd,
152 expirationdate => undef,
153 biblionumber => $biblio2->{biblionumber},
154 branchcode => 'LIB1',
160 ModReserveAffect( $item2->{itemnumber}, $patron2->{borrowernumber}, 1);
161 my $r2 = Koha::Holds->find($reserve2->{reserve_id});
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' );
167 my $reserve3 = $builder->build({
170 borrowernumber => $patron2->{borrowernumber},
171 reservedate => $reserve1_reservedate->ymd,
172 expirationdate => undef,
173 biblionumber => $biblio3->{biblionumber},
174 branchcode => 'LIB1',
180 my $special_holiday1_dt = $today->clone;
181 $special_holiday1_dt->add(days => 2);
183 my $holiday = $builder->build({
184 source => 'SpecialHoliday',
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',
195 my $special_holiday2_dt = $today->clone;
196 $special_holiday2_dt->add(days => 4);
198 my $holiday2 = $builder->build({
199 source => 'SpecialHoliday',
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',
210 Koha::Caches->get_instance->flush_all;
212 t::lib::Mocks::mock_preference('ExcludeHolidaysFromMaxPickUpDelay', 1);
213 ModReserveAffect( $item3->{itemnumber}, $patron2->{borrowernumber});
215 # Add 6 days of pickup delay + 1 day of holiday.
216 my $expected_expiration = $today->clone;
217 $expected_expiration->add(days => 8);
219 my $r3 = Koha::Holds->find($reserve3->{reserve_id});
220 is($r3->expirationdate, $expected_expiration->ymd, 'Expiration date should be set to today + 7' );
222 my $reserve4_reservedate = $today->clone;
223 my $requested_expiredate = $today->clone()->add(days => 6);
225 my $reserve4 = $builder->build({
228 borrowernumber => $patron2->{borrowernumber},
229 reservedate => $reserve4_reservedate->ymd,
230 expirationdate => $requested_expiredate->ymd,
231 biblionumber => $biblio4->{biblionumber},
232 branchcode => 'LIB1',
238 t::lib::Mocks::mock_preference('ReservesMaxPickUpDelay', 10);
239 ModReserveAffect( $item4->{itemnumber}, $patron2->{borrowernumber}, 0, $reserve4->{reserve_id});
241 my $r4 = Koha::Holds->find($reserve4->{reserve_id});
242 is($r4->expirationdate, $requested_expiredate->ymd, 'Requested expiration date should be kept' );
244 $schema->storage->txn_rollback;