Lines 21-42
use Test::More tests => 72;
Link Here
|
21 |
use Test::MockModule; |
21 |
use Test::MockModule; |
22 |
use Test::Warn; |
22 |
use Test::Warn; |
23 |
|
23 |
|
|
|
24 |
use t::lib::Mocks; |
25 |
use t::lib::TestBuilder; |
26 |
|
24 |
use MARC::Record; |
27 |
use MARC::Record; |
25 |
use DateTime::Duration; |
28 |
use DateTime::Duration; |
26 |
|
29 |
|
27 |
use C4::Biblio; |
30 |
use C4::Biblio; |
28 |
use C4::Reserves; |
31 |
use C4::Circulation; |
29 |
use C4::Items; |
32 |
use C4::Items; |
30 |
use C4::Members; |
33 |
use C4::Members; |
31 |
use C4::Circulation; |
34 |
use C4::Reserves; |
32 |
use Koha::Holds; |
|
|
33 |
use t::lib::Mocks; |
34 |
|
35 |
use Koha::DateUtils; |
35 |
use Koha::DateUtils; |
|
|
36 |
use Koha::Holds; |
36 |
use Koha::Libraries; |
37 |
use Koha::Libraries; |
37 |
use Koha::Patron::Categories; |
38 |
use Koha::Patron::Categories; |
38 |
|
39 |
|
39 |
use Data::Dumper; |
|
|
40 |
BEGIN { |
40 |
BEGIN { |
41 |
require_ok('C4::Reserves'); |
41 |
require_ok('C4::Reserves'); |
42 |
} |
42 |
} |
Lines 54-73
my $database = Koha::Database->new();
Link Here
|
54 |
my $schema = $database->schema(); |
54 |
my $schema = $database->schema(); |
55 |
$schema->storage->txn_begin(); |
55 |
$schema->storage->txn_begin(); |
56 |
|
56 |
|
|
|
57 |
my $builder = t::lib::TestBuilder->new; |
58 |
|
57 |
# Somewhat arbitrary field chosen for age restriction unit tests. Must be added to db before the framework is cached |
59 |
# Somewhat arbitrary field chosen for age restriction unit tests. Must be added to db before the framework is cached |
58 |
$dbh->do("update marc_subfield_structure set kohafield='biblioitems.agerestriction' where tagfield='521' and tagsubfield='a'"); |
60 |
$dbh->do("update marc_subfield_structure set kohafield='biblioitems.agerestriction' where tagfield='521' and tagsubfield='a'"); |
59 |
|
61 |
|
60 |
# Setup Test------------------------ |
62 |
## Setup Test |
|
|
63 |
# Add branches |
64 |
my $branch_1 = $builder->build({ source => 'Branch' })->{ branchcode }; |
65 |
my $branch_2 = $builder->build({ source => 'Branch' })->{ branchcode }; |
66 |
my $branch_3 = $builder->build({ source => 'Branch' })->{ branchcode }; |
67 |
# Add categories |
68 |
my $category_1 = $builder->build({ source => 'Category' })->{ categorycode }; |
69 |
my $category_2 = $builder->build({ source => 'Category' })->{ categorycode }; |
70 |
# Add an item type |
71 |
my $itemtype = $builder->build( |
72 |
{ source => 'Itemtype', value => { notforloan => undef } } )->{itemtype}; |
61 |
|
73 |
|
62 |
# Add branches if not existing |
|
|
63 |
foreach my $addbra ('CPL', 'FPL', 'RPL') { |
64 |
$dbh->do("INSERT INTO branches (branchcode,branchname) VALUES (?,?)", undef, ($addbra,"$addbra branch")) unless Koha::Libraries->find($addbra); |
65 |
} |
66 |
|
67 |
# Add categories if not existing |
68 |
foreach my $addcat ('S', 'PT') { |
69 |
$dbh->do("INSERT INTO categories (categorycode,hidelostitems,category_type) VALUES (?,?,?)",undef,($addcat, 0, $addcat eq 'S'? 'S': 'A')) unless Koha::Patron::Categories->find($addcat); |
70 |
} |
71 |
|
74 |
|
72 |
# Create a helper biblio |
75 |
# Create a helper biblio |
73 |
my $bib = MARC::Record->new(); |
76 |
my $bib = MARC::Record->new(); |
Lines 88-94
my ($bibnum, $bibitemnum);
Link Here
|
88 |
($bibnum, $title, $bibitemnum) = AddBiblio($bib, ''); |
91 |
($bibnum, $title, $bibitemnum) = AddBiblio($bib, ''); |
89 |
|
92 |
|
90 |
# Create a helper item instance for testing |
93 |
# Create a helper item instance for testing |
91 |
my ($item_bibnum, $item_bibitemnum, $itemnumber) = AddItem({ homebranch => 'CPL', holdingbranch => 'CPL' } , $bibnum); |
94 |
my ( $item_bibnum, $item_bibitemnum, $itemnumber ) = AddItem( |
|
|
95 |
{ homebranch => $branch_1, |
96 |
holdingbranch => $branch_1, |
97 |
itype => $itemtype |
98 |
}, |
99 |
$bibnum |
100 |
); |
101 |
|
92 |
|
102 |
|
93 |
# Modify item; setting barcode. |
103 |
# Modify item; setting barcode. |
94 |
my $testbarcode = '97531'; |
104 |
my $testbarcode = '97531'; |
Lines 98-107
ModItem({ barcode => $testbarcode }, $bibnum, $itemnumber);
Link Here
|
98 |
my %data = ( |
108 |
my %data = ( |
99 |
firstname => 'my firstname', |
109 |
firstname => 'my firstname', |
100 |
surname => 'my surname', |
110 |
surname => 'my surname', |
101 |
categorycode => 'S', |
111 |
categorycode => $category_1, |
102 |
branchcode => 'CPL', |
112 |
branchcode => $branch_1, |
103 |
); |
113 |
); |
104 |
Koha::Patron::Categories->find('S')->set({ enrolmentfee => 0})->store; |
114 |
Koha::Patron::Categories->find($category_1)->set({ enrolmentfee => 0})->store; |
105 |
my $borrowernumber = AddMember(%data); |
115 |
my $borrowernumber = AddMember(%data); |
106 |
my $borrower = GetMember( borrowernumber => $borrowernumber ); |
116 |
my $borrower = GetMember( borrowernumber => $borrowernumber ); |
107 |
my $biblionumber = $bibnum; |
117 |
my $biblionumber = $bibnum; |
Lines 154-184
t::lib::Mocks::mock_preference( 'ReservesControlBranch', $ReservesControlBranch
Link Here
|
154 |
### Regression test for bug 10272 |
164 |
### Regression test for bug 10272 |
155 |
### |
165 |
### |
156 |
my %requesters = (); |
166 |
my %requesters = (); |
157 |
$requesters{'CPL'} = AddMember( |
167 |
$requesters{$branch_1} = AddMember( |
158 |
branchcode => 'CPL', |
168 |
branchcode => $branch_1, |
159 |
categorycode => 'PT', |
169 |
categorycode => $category_2, |
160 |
surname => 'borrower from CPL', |
170 |
surname => "borrower from $branch_1", |
161 |
); |
171 |
); |
162 |
for my $i ( 2 .. 5 ) { |
172 |
for my $i ( 2 .. 5 ) { |
163 |
$requesters{"CPL$i"} = AddMember( |
173 |
$requesters{"CPL$i"} = AddMember( |
164 |
branchcode => 'CPL', |
174 |
branchcode => $branch_1, |
165 |
categorycode => 'PT', |
175 |
categorycode => $category_2, |
166 |
surname => 'borrower $i from CPL', |
176 |
surname => "borrower $i from $branch_1", |
167 |
); |
177 |
); |
168 |
} |
178 |
} |
169 |
$requesters{'FPL'} = AddMember( |
179 |
$requesters{$branch_2} = AddMember( |
170 |
branchcode => 'FPL', |
180 |
branchcode => $branch_2, |
171 |
categorycode => 'PT', |
181 |
categorycode => $category_2, |
172 |
surname => 'borrower from FPL', |
182 |
surname => "borrower from $branch_2", |
173 |
); |
183 |
); |
174 |
$requesters{'RPL'} = AddMember( |
184 |
$requesters{$branch_3} = AddMember( |
175 |
branchcode => 'RPL', |
185 |
branchcode => $branch_3, |
176 |
categorycode => 'PT', |
186 |
categorycode => $category_2, |
177 |
surname => 'borrower from RPL', |
187 |
surname => "borrower from $branch_3", |
178 |
); |
188 |
); |
179 |
|
189 |
|
180 |
# Configure rules so that CPL allows only CPL patrons |
190 |
# Configure rules so that $branch_1 allows only $branch_1 patrons |
181 |
# to request its items, while FPL will allow its items |
191 |
# to request its items, while $branch_2 will allow its items |
182 |
# to fill holds from anywhere. |
192 |
# to fill holds from anywhere. |
183 |
|
193 |
|
184 |
$dbh->do('DELETE FROM issuingrules'); |
194 |
$dbh->do('DELETE FROM issuingrules'); |
Lines 200-206
$dbh->do(
Link Here
|
200 |
q{INSERT INTO default_branch_circ_rules (branchcode, maxissueqty, holdallowed, returnbranch) |
210 |
q{INSERT INTO default_branch_circ_rules (branchcode, maxissueqty, holdallowed, returnbranch) |
201 |
VALUES (?, ?, ?, ?)}, |
211 |
VALUES (?, ?, ?, ?)}, |
202 |
{}, |
212 |
{}, |
203 |
'CPL', 10, 1, 'homebranch', |
213 |
$branch_1, 10, 1, 'homebranch', |
204 |
); |
214 |
); |
205 |
|
215 |
|
206 |
# ... while FPL allows anybody to request its items |
216 |
# ... while FPL allows anybody to request its items |
Lines 208-214
$dbh->do(
Link Here
|
208 |
q{INSERT INTO default_branch_circ_rules (branchcode, maxissueqty, holdallowed, returnbranch) |
218 |
q{INSERT INTO default_branch_circ_rules (branchcode, maxissueqty, holdallowed, returnbranch) |
209 |
VALUES (?, ?, ?, ?)}, |
219 |
VALUES (?, ?, ?, ?)}, |
210 |
{}, |
220 |
{}, |
211 |
'FPL', 10, 2, 'homebranch', |
221 |
$branch_2, 10, 2, 'homebranch', |
212 |
); |
222 |
); |
213 |
|
223 |
|
214 |
# helper biblio for the bug 10272 regression test |
224 |
# helper biblio for the bug 10272 regression test |
Lines 221-250
$bib2->append_fields(
Link Here
|
221 |
# create one item belonging to FPL and one belonging to CPL |
231 |
# create one item belonging to FPL and one belonging to CPL |
222 |
my ($bibnum2, $bibitemnum2) = AddBiblio($bib, ''); |
232 |
my ($bibnum2, $bibitemnum2) = AddBiblio($bib, ''); |
223 |
my ($itemnum_cpl, $itemnum_fpl); |
233 |
my ($itemnum_cpl, $itemnum_fpl); |
224 |
(undef, undef, $itemnum_cpl) = AddItem({ |
234 |
( undef, undef, $itemnum_cpl ) = AddItem( |
225 |
homebranch => 'CPL', |
235 |
{ homebranch => $branch_1, |
226 |
holdingbranch => 'CPL', |
236 |
holdingbranch => $branch_1, |
227 |
barcode => 'bug10272_CPL' |
237 |
barcode => 'bug10272_CPL', |
228 |
} , $bibnum2); |
238 |
itype => $itemtype |
229 |
(undef, undef, $itemnum_fpl) = AddItem({ |
239 |
}, |
230 |
homebranch => 'FPL', |
240 |
$bibnum2 |
231 |
holdingbranch => 'FPL', |
241 |
); |
232 |
barcode => 'bug10272_FPL' |
242 |
( undef, undef, $itemnum_fpl ) = AddItem( |
233 |
} , $bibnum2); |
243 |
{ homebranch => $branch_2, |
|
|
244 |
holdingbranch => $branch_2, |
245 |
barcode => 'bug10272_FPL', |
246 |
itype => $itemtype |
247 |
}, |
248 |
$bibnum2 |
249 |
); |
250 |
|
234 |
|
251 |
|
235 |
# Ensure that priorities are numbered correcly when a hold is moved to waiting |
252 |
# Ensure that priorities are numbered correcly when a hold is moved to waiting |
236 |
# (bug 11947) |
253 |
# (bug 11947) |
237 |
$dbh->do("DELETE FROM reserves WHERE biblionumber=?",undef,($bibnum2)); |
254 |
$dbh->do("DELETE FROM reserves WHERE biblionumber=?",undef,($bibnum2)); |
238 |
AddReserve('RPL', $requesters{'RPL'}, $bibnum2, |
255 |
AddReserve($branch_3, $requesters{$branch_3}, $bibnum2, |
239 |
$bibitems, 1, $resdate, $expdate, $notes, |
256 |
$bibitems, 1, $resdate, $expdate, $notes, |
240 |
$title, $checkitem, $found); |
257 |
$title, $checkitem, $found); |
241 |
AddReserve('FPL', $requesters{'FPL'}, $bibnum2, |
258 |
AddReserve($branch_2, $requesters{$branch_2}, $bibnum2, |
242 |
$bibitems, 2, $resdate, $expdate, $notes, |
259 |
$bibitems, 2, $resdate, $expdate, $notes, |
243 |
$title, $checkitem, $found); |
260 |
$title, $checkitem, $found); |
244 |
AddReserve('CPL', $requesters{'CPL'}, $bibnum2, |
261 |
AddReserve($branch_1, $requesters{$branch_1}, $bibnum2, |
245 |
$bibitems, 3, $resdate, $expdate, $notes, |
262 |
$bibitems, 3, $resdate, $expdate, $notes, |
246 |
$title, $checkitem, $found); |
263 |
$title, $checkitem, $found); |
247 |
ModReserveAffect($itemnum_cpl, $requesters{'RPL'}, 0); |
264 |
ModReserveAffect($itemnum_cpl, $requesters{$branch_3}, 0); |
248 |
|
265 |
|
249 |
# Now it should have different priorities. |
266 |
# Now it should have different priorities. |
250 |
my $title_reserves = GetReservesFromBiblionumber({biblionumber => $bibnum2}); |
267 |
my $title_reserves = GetReservesFromBiblionumber({biblionumber => $bibnum2}); |
Lines 254-272
is($reserves[0]{priority}, 0, 'Item is correctly waiting');
Link Here
|
254 |
is($reserves[1]{priority}, 1, 'Item is correctly priority 1'); |
271 |
is($reserves[1]{priority}, 1, 'Item is correctly priority 1'); |
255 |
is($reserves[2]{priority}, 2, 'Item is correctly priority 2'); |
272 |
is($reserves[2]{priority}, 2, 'Item is correctly priority 2'); |
256 |
|
273 |
|
257 |
@reserves = Koha::Holds->search({ borrowernumber => $requesters{'RPL'} })->waiting(); |
274 |
@reserves = Koha::Holds->search({ borrowernumber => $requesters{$branch_3} })->waiting(); |
258 |
is( @reserves, 1, 'GetWaiting got only the waiting reserve' ); |
275 |
is( @reserves, 1, 'GetWaiting got only the waiting reserve' ); |
259 |
is( $reserves[0]->borrowernumber(), $requesters{'RPL'}, 'GetWaiting got the reserve for the correct borrower' ); |
276 |
is( $reserves[0]->borrowernumber(), $requesters{$branch_3}, 'GetWaiting got the reserve for the correct borrower' ); |
260 |
|
277 |
|
261 |
|
278 |
|
262 |
$dbh->do("DELETE FROM reserves WHERE biblionumber=?",undef,($bibnum2)); |
279 |
$dbh->do("DELETE FROM reserves WHERE biblionumber=?",undef,($bibnum2)); |
263 |
AddReserve('RPL', $requesters{'RPL'}, $bibnum2, |
280 |
AddReserve($branch_3, $requesters{$branch_3}, $bibnum2, |
264 |
$bibitems, 1, $resdate, $expdate, $notes, |
281 |
$bibitems, 1, $resdate, $expdate, $notes, |
265 |
$title, $checkitem, $found); |
282 |
$title, $checkitem, $found); |
266 |
AddReserve('FPL', $requesters{'FPL'}, $bibnum2, |
283 |
AddReserve($branch_2, $requesters{$branch_2}, $bibnum2, |
267 |
$bibitems, 2, $resdate, $expdate, $notes, |
284 |
$bibitems, 2, $resdate, $expdate, $notes, |
268 |
$title, $checkitem, $found); |
285 |
$title, $checkitem, $found); |
269 |
AddReserve('CPL', $requesters{'CPL'}, $bibnum2, |
286 |
AddReserve($branch_1, $requesters{$branch_1}, $bibnum2, |
270 |
$bibitems, 3, $resdate, $expdate, $notes, |
287 |
$bibitems, 3, $resdate, $expdate, $notes, |
271 |
$title, $checkitem, $found); |
288 |
$title, $checkitem, $found); |
272 |
|
289 |
|
Lines 277-285
my $messages;
Link Here
|
277 |
# Return the CPL item at FPL. The hold that should be triggered is |
294 |
# Return the CPL item at FPL. The hold that should be triggered is |
278 |
# the one placed by the CPL patron, as the other two patron's hold |
295 |
# the one placed by the CPL patron, as the other two patron's hold |
279 |
# requests cannot be filled by that item per policy. |
296 |
# requests cannot be filled by that item per policy. |
280 |
(undef, $messages, undef, undef) = AddReturn('bug10272_CPL', 'FPL'); |
297 |
(undef, $messages, undef, undef) = AddReturn('bug10272_CPL', $branch_2); |
281 |
is( $messages->{ResFound}->{borrowernumber}, |
298 |
is( $messages->{ResFound}->{borrowernumber}, |
282 |
$requesters{'CPL'}, |
299 |
$requesters{$branch_1}, |
283 |
'restrictive library\'s items only fill requests by own patrons (bug 10272)'); |
300 |
'restrictive library\'s items only fill requests by own patrons (bug 10272)'); |
284 |
|
301 |
|
285 |
# Return the FPL item at FPL. The hold that should be triggered is |
302 |
# Return the FPL item at FPL. The hold that should be triggered is |
Lines 289-297
is( $messages->{ResFound}->{borrowernumber},
Link Here
|
289 |
# Ensure that the preference 'LocalHoldsPriority' is not set (Bug 15244): |
306 |
# Ensure that the preference 'LocalHoldsPriority' is not set (Bug 15244): |
290 |
t::lib::Mocks::mock_preference( 'LocalHoldsPriority', '' ); |
307 |
t::lib::Mocks::mock_preference( 'LocalHoldsPriority', '' ); |
291 |
|
308 |
|
292 |
(undef, $messages, undef, undef) = AddReturn('bug10272_FPL', 'FPL'); |
309 |
(undef, $messages, undef, undef) = AddReturn('bug10272_FPL', $branch_2); |
293 |
is( $messages->{ResFound}->{borrowernumber}, |
310 |
is( $messages->{ResFound}->{borrowernumber}, |
294 |
$requesters{'RPL'}, |
311 |
$requesters{$branch_3}, |
295 |
'for generous library, its items fill first hold request in line (bug 10272)'); |
312 |
'for generous library, its items fill first hold request in line (bug 10272)'); |
296 |
|
313 |
|
297 |
my $reserves = GetReservesFromBiblionumber({biblionumber => $biblionumber}); |
314 |
my $reserves = GetReservesFromBiblionumber({biblionumber => $biblionumber}); |
Lines 320-326
is($reserve, undef, "CancelReserve return undef if reserve does not exist");
Link Here
|
320 |
$resdate= undef; #defaults to today in AddReserve |
337 |
$resdate= undef; #defaults to today in AddReserve |
321 |
$expdate= undef; #no expdate |
338 |
$expdate= undef; #no expdate |
322 |
$dbh->do("DELETE FROM reserves WHERE biblionumber=?",undef,($bibnum)); |
339 |
$dbh->do("DELETE FROM reserves WHERE biblionumber=?",undef,($bibnum)); |
323 |
AddReserve('CPL', $requesters{'CPL'}, $bibnum, |
340 |
AddReserve($branch_1, $requesters{$branch_1}, $bibnum, |
324 |
$bibitems, 1, $resdate, $expdate, $notes, |
341 |
$bibitems, 1, $resdate, $expdate, $notes, |
325 |
$title, $checkitem, $found); |
342 |
$title, $checkitem, $found); |
326 |
($status)=CheckReserves($itemnumber,undef,undef); |
343 |
($status)=CheckReserves($itemnumber,undef,undef); |
Lines 335-341
$resdate= dt_from_string();
Link Here
|
335 |
$resdate->add_duration(DateTime::Duration->new(days => 4)); |
352 |
$resdate->add_duration(DateTime::Duration->new(days => 4)); |
336 |
$resdate=output_pref($resdate); |
353 |
$resdate=output_pref($resdate); |
337 |
$expdate= undef; #no expdate |
354 |
$expdate= undef; #no expdate |
338 |
AddReserve('CPL', $requesters{'CPL'}, $bibnum, |
355 |
AddReserve($branch_1, $requesters{$branch_1}, $bibnum, |
339 |
$bibitems, 1, $resdate, $expdate, $notes, |
356 |
$bibitems, 1, $resdate, $expdate, $notes, |
340 |
$title, $checkitem, $found); |
357 |
$title, $checkitem, $found); |
341 |
($status)=CheckReserves($itemnumber,undef,undef); |
358 |
($status)=CheckReserves($itemnumber,undef,undef); |
Lines 351-375
is( $status, 'Reserved', 'CheckReserves returns future reserve with sufficient l
Link Here
|
351 |
# Note that AddReturn is in Circulation.pm, but this test really pertains to reserves; AddReturn uses the ConfirmFutureHolds pref when calling CheckReserves |
368 |
# Note that AddReturn is in Circulation.pm, but this test really pertains to reserves; AddReturn uses the ConfirmFutureHolds pref when calling CheckReserves |
352 |
# In this test we do not need an issued item; it is just a 'checkin' |
369 |
# In this test we do not need an issued item; it is just a 'checkin' |
353 |
t::lib::Mocks::mock_preference('ConfirmFutureHolds', 0); |
370 |
t::lib::Mocks::mock_preference('ConfirmFutureHolds', 0); |
354 |
(my $doreturn, $messages)= AddReturn('97531','CPL'); |
371 |
(my $doreturn, $messages)= AddReturn('97531',$branch_1); |
355 |
is($messages->{ResFound}//'', '', 'AddReturn does not care about future reserve when ConfirmFutureHolds is off'); |
372 |
is($messages->{ResFound}//'', '', 'AddReturn does not care about future reserve when ConfirmFutureHolds is off'); |
356 |
t::lib::Mocks::mock_preference('ConfirmFutureHolds', 3); |
373 |
t::lib::Mocks::mock_preference('ConfirmFutureHolds', 3); |
357 |
($doreturn, $messages)= AddReturn('97531','CPL'); |
374 |
($doreturn, $messages)= AddReturn('97531',$branch_1); |
358 |
is(exists $messages->{ResFound}?1:0, 0, 'AddReturn ignores future reserve beyond ConfirmFutureHolds days'); |
375 |
is(exists $messages->{ResFound}?1:0, 0, 'AddReturn ignores future reserve beyond ConfirmFutureHolds days'); |
359 |
t::lib::Mocks::mock_preference('ConfirmFutureHolds', 7); |
376 |
t::lib::Mocks::mock_preference('ConfirmFutureHolds', 7); |
360 |
($doreturn, $messages)= AddReturn('97531','CPL'); |
377 |
($doreturn, $messages)= AddReturn('97531',$branch_1); |
361 |
is(exists $messages->{ResFound}?1:0, 1, 'AddReturn considers future reserve within ConfirmFutureHolds days'); |
378 |
is(exists $messages->{ResFound}?1:0, 1, 'AddReturn considers future reserve within ConfirmFutureHolds days'); |
362 |
|
379 |
|
363 |
# End of tests for bug 9761 (ConfirmFutureHolds) |
380 |
# End of tests for bug 9761 (ConfirmFutureHolds) |
364 |
|
381 |
|
365 |
# test marking a hold as captured |
382 |
# test marking a hold as captured |
366 |
my $hold_notice_count = count_hold_print_messages(); |
383 |
my $hold_notice_count = count_hold_print_messages(); |
367 |
ModReserveAffect($itemnumber, $requesters{'CPL'}, 0); |
384 |
ModReserveAffect($itemnumber, $requesters{$branch_1}, 0); |
368 |
my $new_count = count_hold_print_messages(); |
385 |
my $new_count = count_hold_print_messages(); |
369 |
is($new_count, $hold_notice_count + 1, 'patron notified when item set to waiting'); |
386 |
is($new_count, $hold_notice_count + 1, 'patron notified when item set to waiting'); |
370 |
|
387 |
|
371 |
# test that duplicate notices aren't generated |
388 |
# test that duplicate notices aren't generated |
372 |
ModReserveAffect($itemnumber, $requesters{'CPL'}, 0); |
389 |
ModReserveAffect($itemnumber, $requesters{$branch_1}, 0); |
373 |
$new_count = count_hold_print_messages(); |
390 |
$new_count = count_hold_print_messages(); |
374 |
is($new_count, $hold_notice_count + 1, 'patron not notified a second time (bug 11445)'); |
391 |
is($new_count, $hold_notice_count + 1, 'patron not notified a second time (bug 11445)'); |
375 |
|
392 |
|
Lines 381-387
is(
Link Here
|
381 |
'item that is captured to fill a hold cannot be deleted', |
398 |
'item that is captured to fill a hold cannot be deleted', |
382 |
); |
399 |
); |
383 |
|
400 |
|
384 |
my $letter = ReserveSlip('CPL', $requesters{'CPL'}, $bibnum); |
401 |
my $letter = ReserveSlip($branch_1, $requesters{$branch_1}, $bibnum); |
385 |
ok(defined($letter), 'can successfully generate hold slip (bug 10949)'); |
402 |
ok(defined($letter), 'can successfully generate hold slip (bug 10949)'); |
386 |
|
403 |
|
387 |
# Tests for bug 9788: Does GetReservesFromItemnumber return a future wait? |
404 |
# Tests for bug 9788: Does GetReservesFromItemnumber return a future wait? |
Lines 392-411
t::lib::Mocks::mock_preference('AllowHoldDateInFuture', 1);
Link Here
|
392 |
$resdate= dt_from_string(); |
409 |
$resdate= dt_from_string(); |
393 |
$resdate->add_duration(DateTime::Duration->new(days => 2)); |
410 |
$resdate->add_duration(DateTime::Duration->new(days => 2)); |
394 |
$resdate=output_pref($resdate); |
411 |
$resdate=output_pref($resdate); |
395 |
AddReserve('CPL', $requesters{'CPL'}, $bibnum, |
412 |
AddReserve($branch_1, $requesters{$branch_1}, $bibnum, |
396 |
$bibitems, 1, $resdate, $expdate, $notes, |
413 |
$bibitems, 1, $resdate, $expdate, $notes, |
397 |
$title, $checkitem, $found); |
414 |
$title, $checkitem, $found); |
398 |
my @results= GetReservesFromItemnumber($itemnumber); |
415 |
my @results= GetReservesFromItemnumber($itemnumber); |
399 |
is(defined $results[3]?1:0, 0, 'GetReservesFromItemnumber does not return a future next available hold'); |
416 |
is(defined $results[3]?1:0, 0, 'GetReservesFromItemnumber does not return a future next available hold'); |
400 |
# 9788b: GetReservesFromItemnumber does not return future item level hold |
417 |
# 9788b: GetReservesFromItemnumber does not return future item level hold |
401 |
$dbh->do("DELETE FROM reserves WHERE biblionumber=?",undef,($bibnum)); |
418 |
$dbh->do("DELETE FROM reserves WHERE biblionumber=?",undef,($bibnum)); |
402 |
AddReserve('CPL', $requesters{'CPL'}, $bibnum, |
419 |
AddReserve($branch_1, $requesters{$branch_1}, $bibnum, |
403 |
$bibitems, 1, $resdate, $expdate, $notes, |
420 |
$bibitems, 1, $resdate, $expdate, $notes, |
404 |
$title, $itemnumber, $found); #item level hold |
421 |
$title, $itemnumber, $found); #item level hold |
405 |
@results= GetReservesFromItemnumber($itemnumber); |
422 |
@results= GetReservesFromItemnumber($itemnumber); |
406 |
is(defined $results[3]?1:0, 0, 'GetReservesFromItemnumber does not return a future item level hold'); |
423 |
is(defined $results[3]?1:0, 0, 'GetReservesFromItemnumber does not return a future item level hold'); |
407 |
# 9788c: GetReservesFromItemnumber returns future wait (confirmed future hold) |
424 |
# 9788c: GetReservesFromItemnumber returns future wait (confirmed future hold) |
408 |
ModReserveAffect( $itemnumber, $requesters{'CPL'} , 0); #confirm hold |
425 |
ModReserveAffect( $itemnumber, $requesters{$branch_1} , 0); #confirm hold |
409 |
@results= GetReservesFromItemnumber($itemnumber); |
426 |
@results= GetReservesFromItemnumber($itemnumber); |
410 |
is(defined $results[3]?1:0, 1, 'GetReservesFromItemnumber returns a future wait (confirmed future hold)'); |
427 |
is(defined $results[3]?1:0, 1, 'GetReservesFromItemnumber returns a future wait (confirmed future hold)'); |
411 |
# End of tests for bug 9788 |
428 |
# End of tests for bug 9788 |
Lines 415-421
$dbh->do("DELETE FROM reserves WHERE biblionumber=?",undef,($bibnum));
Link Here
|
415 |
my $p = C4::Reserves::CalculatePriority($bibnum2); |
432 |
my $p = C4::Reserves::CalculatePriority($bibnum2); |
416 |
is($p, 4, 'CalculatePriority should now return priority 4'); |
433 |
is($p, 4, 'CalculatePriority should now return priority 4'); |
417 |
$resdate=undef; |
434 |
$resdate=undef; |
418 |
AddReserve('CPL', $requesters{'CPL2'}, $bibnum2, |
435 |
AddReserve($branch_1, $requesters{'CPL2'}, $bibnum2, |
419 |
$bibitems, $p, $resdate, $expdate, $notes, |
436 |
$bibitems, $p, $resdate, $expdate, $notes, |
420 |
$title, $checkitem, $found); |
437 |
$title, $checkitem, $found); |
421 |
$p = C4::Reserves::CalculatePriority($bibnum2); |
438 |
$p = C4::Reserves::CalculatePriority($bibnum2); |
Lines 425-440
$dbh->do("DELETE FROM reserves WHERE biblionumber=?",undef,($bibnum));
Link Here
|
425 |
$p = C4::Reserves::CalculatePriority($bibnum); |
442 |
$p = C4::Reserves::CalculatePriority($bibnum); |
426 |
is($p, 1, 'CalculatePriority should now return priority 1'); |
443 |
is($p, 1, 'CalculatePriority should now return priority 1'); |
427 |
#add a new reserve and confirm it to waiting |
444 |
#add a new reserve and confirm it to waiting |
428 |
AddReserve('CPL', $requesters{'CPL'}, $bibnum, |
445 |
AddReserve($branch_1, $requesters{$branch_1}, $bibnum, |
429 |
$bibitems, $p, $resdate, $expdate, $notes, |
446 |
$bibitems, $p, $resdate, $expdate, $notes, |
430 |
$title, $itemnumber, $found); |
447 |
$title, $itemnumber, $found); |
431 |
$p = C4::Reserves::CalculatePriority($bibnum); |
448 |
$p = C4::Reserves::CalculatePriority($bibnum); |
432 |
is($p, 2, 'CalculatePriority should now return priority 2'); |
449 |
is($p, 2, 'CalculatePriority should now return priority 2'); |
433 |
ModReserveAffect( $itemnumber, $requesters{'CPL'} , 0); |
450 |
ModReserveAffect( $itemnumber, $requesters{$branch_1} , 0); |
434 |
$p = C4::Reserves::CalculatePriority($bibnum); |
451 |
$p = C4::Reserves::CalculatePriority($bibnum); |
435 |
is($p, 1, 'CalculatePriority should now return priority 1'); |
452 |
is($p, 1, 'CalculatePriority should now return priority 1'); |
436 |
#add another biblio hold, no resdate |
453 |
#add another biblio hold, no resdate |
437 |
AddReserve('CPL', $requesters{'CPL2'}, $bibnum, |
454 |
AddReserve($branch_1, $requesters{'CPL2'}, $bibnum, |
438 |
$bibitems, $p, $resdate, $expdate, $notes, |
455 |
$bibitems, $p, $resdate, $expdate, $notes, |
439 |
$title, $checkitem, $found); |
456 |
$title, $checkitem, $found); |
440 |
$p = C4::Reserves::CalculatePriority($bibnum); |
457 |
$p = C4::Reserves::CalculatePriority($bibnum); |
Lines 443-449
is($p, 2, 'CalculatePriority should now return priority 2');
Link Here
|
443 |
t::lib::Mocks::mock_preference('AllowHoldDateInFuture', 1); |
460 |
t::lib::Mocks::mock_preference('AllowHoldDateInFuture', 1); |
444 |
$resdate= dt_from_string(); |
461 |
$resdate= dt_from_string(); |
445 |
$resdate->add_duration(DateTime::Duration->new(days => 1)); |
462 |
$resdate->add_duration(DateTime::Duration->new(days => 1)); |
446 |
AddReserve('CPL', $requesters{'CPL3'}, $bibnum, |
463 |
AddReserve($branch_1, $requesters{'CPL3'}, $bibnum, |
447 |
$bibitems, $p, output_pref($resdate), $expdate, $notes, |
464 |
$bibitems, $p, output_pref($resdate), $expdate, $notes, |
448 |
$title, $checkitem, $found); |
465 |
$title, $checkitem, $found); |
449 |
$p = C4::Reserves::CalculatePriority($bibnum); |
466 |
$p = C4::Reserves::CalculatePriority($bibnum); |
Lines 455-461
is($p, 3, 'CalculatePriority should now return priority 3');
Link Here
|
455 |
|
472 |
|
456 |
# Tests for cancel reserves by users from OPAC. |
473 |
# Tests for cancel reserves by users from OPAC. |
457 |
$dbh->do('DELETE FROM reserves', undef, ($bibnum)); |
474 |
$dbh->do('DELETE FROM reserves', undef, ($bibnum)); |
458 |
AddReserve('CPL', $requesters{'CPL'}, $item_bibnum, |
475 |
AddReserve($branch_1, $requesters{$branch_1}, $item_bibnum, |
459 |
$bibitems, 1, undef, $expdate, $notes, |
476 |
$bibitems, 1, undef, $expdate, $notes, |
460 |
$title, $checkitem, ''); |
477 |
$title, $checkitem, ''); |
461 |
my (undef, $canres, undef) = CheckReserves($itemnumber); |
478 |
my (undef, $canres, undef) = CheckReserves($itemnumber); |
Lines 474-497
is(
Link Here
|
474 |
'CanReserveBeCanceledFromOpac should return undef if called without borrowernumber' |
491 |
'CanReserveBeCanceledFromOpac should return undef if called without borrowernumber' |
475 |
); |
492 |
); |
476 |
|
493 |
|
477 |
my $cancancel = CanReserveBeCanceledFromOpac($canres->{reserve_id}, $requesters{'CPL'}); |
494 |
my $cancancel = CanReserveBeCanceledFromOpac($canres->{reserve_id}, $requesters{$branch_1}); |
478 |
is($cancancel, 1, 'Can user cancel its own reserve'); |
495 |
is($cancancel, 1, 'Can user cancel its own reserve'); |
479 |
|
496 |
|
480 |
$cancancel = CanReserveBeCanceledFromOpac($canres->{reserve_id}, $requesters{'FPL'}); |
497 |
$cancancel = CanReserveBeCanceledFromOpac($canres->{reserve_id}, $requesters{$branch_2}); |
481 |
is($cancancel, 0, 'Other user cant cancel reserve'); |
498 |
is($cancancel, 0, 'Other user cant cancel reserve'); |
482 |
|
499 |
|
483 |
ModReserveAffect($itemnumber, $requesters{'CPL'}, 1); |
500 |
ModReserveAffect($itemnumber, $requesters{$branch_1}, 1); |
484 |
$cancancel = CanReserveBeCanceledFromOpac($canres->{reserve_id}, $requesters{'CPL'}); |
501 |
$cancancel = CanReserveBeCanceledFromOpac($canres->{reserve_id}, $requesters{$branch_1}); |
485 |
is($cancancel, 0, 'Reserve in transfer status cant be canceled'); |
502 |
is($cancancel, 0, 'Reserve in transfer status cant be canceled'); |
486 |
|
503 |
|
487 |
$dbh->do('DELETE FROM reserves', undef, ($bibnum)); |
504 |
$dbh->do('DELETE FROM reserves', undef, ($bibnum)); |
488 |
AddReserve('CPL', $requesters{'CPL'}, $item_bibnum, |
505 |
AddReserve($branch_1, $requesters{$branch_1}, $item_bibnum, |
489 |
$bibitems, 1, undef, $expdate, $notes, |
506 |
$bibitems, 1, undef, $expdate, $notes, |
490 |
$title, $checkitem, ''); |
507 |
$title, $checkitem, ''); |
491 |
(undef, $canres, undef) = CheckReserves($itemnumber); |
508 |
(undef, $canres, undef) = CheckReserves($itemnumber); |
492 |
|
509 |
|
493 |
ModReserveAffect($itemnumber, $requesters{'CPL'}, 0); |
510 |
ModReserveAffect($itemnumber, $requesters{$branch_1}, 0); |
494 |
$cancancel = CanReserveBeCanceledFromOpac($canres->{reserve_id}, $requesters{'CPL'}); |
511 |
$cancancel = CanReserveBeCanceledFromOpac($canres->{reserve_id}, $requesters{$branch_1}); |
495 |
is($cancancel, 0, 'Reserve in waiting status cant be canceled'); |
512 |
is($cancancel, 0, 'Reserve in waiting status cant be canceled'); |
496 |
|
513 |
|
497 |
# End of tests for bug 12876 |
514 |
# End of tests for bug 12876 |
Lines 560-566
is( !$bz14464_fines || $bz14464_fines==0, 1, 'Bug 14464 - No fines at beginning'
Link Here
|
560 |
t::lib::Mocks::mock_preference('ExpireReservesMaxPickUpDelayCharge', 0); |
577 |
t::lib::Mocks::mock_preference('ExpireReservesMaxPickUpDelayCharge', 0); |
561 |
|
578 |
|
562 |
my $bz14464_reserve = AddReserve( |
579 |
my $bz14464_reserve = AddReserve( |
563 |
'CPL', |
580 |
$branch_1, |
564 |
$borrowernumber, |
581 |
$borrowernumber, |
565 |
$bibnum, |
582 |
$bibnum, |
566 |
undef, |
583 |
undef, |
Lines 587-593
is( !$bz14464_fines || $bz14464_fines==0, 1, 'Bug 14464 - No fines after cancell
Link Here
|
587 |
t::lib::Mocks::mock_preference('ExpireReservesMaxPickUpDelayCharge', 42); |
604 |
t::lib::Mocks::mock_preference('ExpireReservesMaxPickUpDelayCharge', 42); |
588 |
|
605 |
|
589 |
$bz14464_reserve = AddReserve( |
606 |
$bz14464_reserve = AddReserve( |
590 |
'CPL', |
607 |
$branch_1, |
591 |
$borrowernumber, |
608 |
$borrowernumber, |
592 |
$bibnum, |
609 |
$bibnum, |
593 |
undef, |
610 |
undef, |
Lines 609-615
is( !$bz14464_fines || $bz14464_fines==0, 1, 'Bug 14464 - No fines after cancell
Link Here
|
609 |
|
626 |
|
610 |
# Finally, test cancelling a reserve when there's a charge desired and configured. |
627 |
# Finally, test cancelling a reserve when there's a charge desired and configured. |
611 |
$bz14464_reserve = AddReserve( |
628 |
$bz14464_reserve = AddReserve( |
612 |
'CPL', |
629 |
$branch_1, |
613 |
$borrowernumber, |
630 |
$borrowernumber, |
614 |
$bibnum, |
631 |
$bibnum, |
615 |
undef, |
632 |
undef, |
Lines 634-646
is( int( $bz14464_fines ), 42, 'Bug 14464 - Fine applied after cancelling reserv
Link Here
|
634 |
$dbh->do('DELETE FROM reserves', undef, ($bibnum)); |
651 |
$dbh->do('DELETE FROM reserves', undef, ($bibnum)); |
635 |
t::lib::Mocks::mock_preference('ConfirmFutureHolds', 0); |
652 |
t::lib::Mocks::mock_preference('ConfirmFutureHolds', 0); |
636 |
t::lib::Mocks::mock_preference('AllowHoldDateInFuture', 1); |
653 |
t::lib::Mocks::mock_preference('AllowHoldDateInFuture', 1); |
637 |
AddReserve('CPL', $borrowernumber, $item_bibnum, |
654 |
AddReserve($branch_1, $borrowernumber, $item_bibnum, |
638 |
$bibitems, 1, undef, $expdate, $notes, $title, $checkitem, ''); |
655 |
$bibitems, 1, undef, $expdate, $notes, $title, $checkitem, ''); |
639 |
MoveReserve( $itemnumber, $borrowernumber ); |
656 |
MoveReserve( $itemnumber, $borrowernumber ); |
640 |
($status)=CheckReserves( $itemnumber ); |
657 |
($status)=CheckReserves( $itemnumber ); |
641 |
is( $status, '', 'MoveReserve filled hold'); |
658 |
is( $status, '', 'MoveReserve filled hold'); |
642 |
# hold from A waiting, today, no fut holds: MoveReserve should fill it |
659 |
# hold from A waiting, today, no fut holds: MoveReserve should fill it |
643 |
AddReserve('CPL', $borrowernumber, $item_bibnum, |
660 |
AddReserve($branch_1, $borrowernumber, $item_bibnum, |
644 |
$bibitems, 1, undef, $expdate, $notes, $title, $checkitem, 'W'); |
661 |
$bibitems, 1, undef, $expdate, $notes, $title, $checkitem, 'W'); |
645 |
MoveReserve( $itemnumber, $borrowernumber ); |
662 |
MoveReserve( $itemnumber, $borrowernumber ); |
646 |
($status)=CheckReserves( $itemnumber ); |
663 |
($status)=CheckReserves( $itemnumber ); |
Lines 649-655
is( $status, '', 'MoveReserve filled waiting hold');
Link Here
|
649 |
$resdate= dt_from_string(); |
666 |
$resdate= dt_from_string(); |
650 |
$resdate->add_duration(DateTime::Duration->new(days => 1)); |
667 |
$resdate->add_duration(DateTime::Duration->new(days => 1)); |
651 |
$resdate=output_pref($resdate); |
668 |
$resdate=output_pref($resdate); |
652 |
AddReserve('CPL', $borrowernumber, $item_bibnum, |
669 |
AddReserve($branch_1, $borrowernumber, $item_bibnum, |
653 |
$bibitems, 1, $resdate, $expdate, $notes, $title, $checkitem, ''); |
670 |
$bibitems, 1, $resdate, $expdate, $notes, $title, $checkitem, ''); |
654 |
MoveReserve( $itemnumber, $borrowernumber ); |
671 |
MoveReserve( $itemnumber, $borrowernumber ); |
655 |
($status)=CheckReserves( $itemnumber, undef, 1 ); |
672 |
($status)=CheckReserves( $itemnumber, undef, 1 ); |
Lines 657-669
is( $status, 'Reserved', 'MoveReserve did not fill future hold');
Link Here
|
657 |
$dbh->do('DELETE FROM reserves', undef, ($bibnum)); |
674 |
$dbh->do('DELETE FROM reserves', undef, ($bibnum)); |
658 |
# hold from A pos 1, tomorrow, fut holds=2: MoveReserve should fill it |
675 |
# hold from A pos 1, tomorrow, fut holds=2: MoveReserve should fill it |
659 |
t::lib::Mocks::mock_preference('ConfirmFutureHolds', 2); |
676 |
t::lib::Mocks::mock_preference('ConfirmFutureHolds', 2); |
660 |
AddReserve('CPL', $borrowernumber, $item_bibnum, |
677 |
AddReserve($branch_1, $borrowernumber, $item_bibnum, |
661 |
$bibitems, 1, $resdate, $expdate, $notes, $title, $checkitem, ''); |
678 |
$bibitems, 1, $resdate, $expdate, $notes, $title, $checkitem, ''); |
662 |
MoveReserve( $itemnumber, $borrowernumber ); |
679 |
MoveReserve( $itemnumber, $borrowernumber ); |
663 |
($status)=CheckReserves( $itemnumber, undef, 2 ); |
680 |
($status)=CheckReserves( $itemnumber, undef, 2 ); |
664 |
is( $status, '', 'MoveReserve filled future hold now'); |
681 |
is( $status, '', 'MoveReserve filled future hold now'); |
665 |
# hold from A waiting, tomorrow, fut holds=2: MoveReserve should fill it |
682 |
# hold from A waiting, tomorrow, fut holds=2: MoveReserve should fill it |
666 |
AddReserve('CPL', $borrowernumber, $item_bibnum, |
683 |
AddReserve($branch_1, $borrowernumber, $item_bibnum, |
667 |
$bibitems, 1, $resdate, $expdate, $notes, $title, $checkitem, 'W'); |
684 |
$bibitems, 1, $resdate, $expdate, $notes, $title, $checkitem, 'W'); |
668 |
MoveReserve( $itemnumber, $borrowernumber ); |
685 |
MoveReserve( $itemnumber, $borrowernumber ); |
669 |
($status)=CheckReserves( $itemnumber, undef, 2 ); |
686 |
($status)=CheckReserves( $itemnumber, undef, 2 ); |
Lines 672-678
is( $status, '', 'MoveReserve filled future waiting hold now');
Link Here
|
672 |
$resdate= dt_from_string(); |
689 |
$resdate= dt_from_string(); |
673 |
$resdate->add_duration(DateTime::Duration->new(days => 3)); |
690 |
$resdate->add_duration(DateTime::Duration->new(days => 3)); |
674 |
$resdate=output_pref($resdate); |
691 |
$resdate=output_pref($resdate); |
675 |
AddReserve('CPL', $borrowernumber, $item_bibnum, |
692 |
AddReserve($branch_1, $borrowernumber, $item_bibnum, |
676 |
$bibitems, 1, $resdate, $expdate, $notes, $title, $checkitem, ''); |
693 |
$bibitems, 1, $resdate, $expdate, $notes, $title, $checkitem, ''); |
677 |
MoveReserve( $itemnumber, $borrowernumber ); |
694 |
MoveReserve( $itemnumber, $borrowernumber ); |
678 |
($status)=CheckReserves( $itemnumber, undef, 3 ); |
695 |
($status)=CheckReserves( $itemnumber, undef, 3 ); |
679 |
- |
|
|