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->{AutoCommit} = 0;
20 $dbh->{RaiseError} = 1;
21 $dbh->do(q{DELETE FROM special_holidays});
22 $dbh->do(q{DELETE FROM repeatable_holidays});
23 $dbh->do("DELETE FROM reserves");
25 my $builder = t::lib::TestBuilder->new();
27 # Category, branch and patrons
31 categorycode => 'XYZ1',
48 my $patron1 = $builder->build({
51 categorycode => 'XYZ1',
56 my $patron2 = $builder->build({
59 categorycode => 'XYZ1',
64 my $biblio = $builder->build({
67 title => 'Title 1', },
70 my $biblio2 = $builder->build({
73 title => 'Title 2', },
76 my $biblio3 = $builder->build({
79 title => 'Title 3', },
82 my $biblio4 = $builder->build({
85 title => 'Title 4', },
88 my $item1 = $builder->build({
91 biblionumber => $biblio->{biblionumber},
95 my $item2 = $builder->build({
98 biblionumber => $biblio2->{biblionumber},
102 my $item3 = $builder->build({
105 biblionumber => $biblio3->{biblionumber},
109 my $item4 = $builder->build({
112 biblionumber => $biblio4->{biblionumber},
116 my $today = dt_from_string();
118 my $reserve1_reservedate = $today->clone;
119 $reserve1_reservedate->subtract(days => 20);
121 my $reserve1_expirationdate = $today->clone;
122 $reserve1_expirationdate->add(days => 6);
124 my $reserve1 = $builder->build({
127 borrowernumber => $patron1->{borrowernumber},
128 reservedate => $reserve1_reservedate->ymd,
129 expirationdate => undef,
130 biblionumber => $biblio->{biblionumber},
131 branchcode => 'LIB1',
137 t::lib::Mocks::mock_preference('ExpireReservesMaxPickUpDelay', 1);
138 t::lib::Mocks::mock_preference('ReservesMaxPickUpDelay', 6);
140 ModReserveAffect( $item1->{itemnumber}, $patron1->{borrowernumber});
141 my $r = Koha::Holds->find($reserve1->{reserve_id});
143 is($r->waitingdate, $today->ymd, 'Waiting date should be set to today' );
144 is($r->expirationdate, $reserve1_expirationdate->ymd, 'Expiration date should be set to today + 6' );
145 is($r->found, 'W', 'Reserve status is now "waiting"' );
146 is($r->priority, 0, 'Priority should be 0' );
147 is($r->itemnumber, $item1->{itemnumber}, 'Item number should be set correctly' );
149 my $reserve2 = $builder->build({
152 borrowernumber => $patron2->{borrowernumber},
153 reservedate => $reserve1_reservedate->ymd,
154 expirationdate => undef,
155 biblionumber => $biblio2->{biblionumber},
156 branchcode => 'LIB1',
162 ModReserveAffect( $item2->{itemnumber}, $patron2->{borrowernumber}, 1);
163 my $r2 = Koha::Holds->find($reserve2->{reserve_id});
165 is($r2->found, 'T', '2nd reserve - Reserve status is now "To transfer"' );
166 is($r2->priority, 0, '2nd reserve - Priority should be 0' );
167 is($r2->itemnumber, $item2->{itemnumber}, '2nd reserve - Item number should be set correctly' );
169 my $reserve3 = $builder->build({
172 borrowernumber => $patron2->{borrowernumber},
173 reservedate => $reserve1_reservedate->ymd,
174 expirationdate => undef,
175 biblionumber => $biblio3->{biblionumber},
176 branchcode => 'LIB1',
182 my $special_holiday1_dt = $today->clone;
183 $special_holiday1_dt->add(days => 2);
185 my $holiday = $builder->build({
186 source => 'SpecialHoliday',
188 branchcode => 'LIB1',
189 day => $special_holiday1_dt->day,
190 month => $special_holiday1_dt->month,
191 year => $special_holiday1_dt->year,
192 title => 'My special holiday',
197 my $special_holiday2_dt = $today->clone;
198 $special_holiday2_dt->add(days => 4);
200 my $holiday2 = $builder->build({
201 source => 'SpecialHoliday',
203 branchcode => 'LIB1',
204 day => $special_holiday2_dt->day,
205 month => $special_holiday2_dt->month,
206 year => $special_holiday2_dt->year,
207 title => 'My special holiday 2',
212 Koha::Caches->get_instance->flush_all;
214 t::lib::Mocks::mock_preference('ExcludeHolidaysFromMaxPickUpDelay', 1);
215 ModReserveAffect( $item3->{itemnumber}, $patron2->{borrowernumber});
217 # Add 6 days of pickup delay + 1 day of holiday.
218 my $expected_expiration = $today->clone;
219 $expected_expiration->add(days => 8);
221 my $r3 = Koha::Holds->find($reserve3->{reserve_id});
222 is($r3->expirationdate, $expected_expiration->ymd, 'Expiration date should be set to today + 7' );
224 my $reserve4_reservedate = $today->clone;
225 my $requested_expiredate = $today->clone()->add(days => 6);
227 my $reserve4 = $builder->build({
230 borrowernumber => $patron2->{borrowernumber},
231 reservedate => $reserve4_reservedate->ymd,
232 expirationdate => $requested_expiredate->ymd,
233 biblionumber => $biblio4->{biblionumber},
234 branchcode => 'LIB1',
240 t::lib::Mocks::mock_preference('ReservesMaxPickUpDelay', 10);
241 ModReserveAffect( $item4->{itemnumber}, $patron2->{borrowernumber}, 0, $reserve4->{reserve_id});
243 my $r4 = Koha::Holds->find($reserve4->{reserve_id});
244 is($r4->expirationdate, $requested_expiredate->ymd, 'Requested expiration date should be kept' );