Lines 7-13
use C4::Circulation;
Link Here
|
7 |
use C4::Items; |
7 |
use C4::Items; |
8 |
use Koha::IssuingRule; |
8 |
use Koha::IssuingRule; |
9 |
use Koha::Items; |
9 |
use Koha::Items; |
10 |
|
|
|
11 |
use Test::More tests => 6; |
10 |
use Test::More tests => 6; |
12 |
|
11 |
|
13 |
use t::lib::TestBuilder; |
12 |
use t::lib::TestBuilder; |
Lines 29-39
my $library1 = $builder->build({
Link Here
|
29 |
my $library2 = $builder->build({ |
28 |
my $library2 = $builder->build({ |
30 |
source => 'Branch', |
29 |
source => 'Branch', |
31 |
}); |
30 |
}); |
32 |
|
31 |
my $itemtype = $builder->build({ |
|
|
32 |
source => 'Itemtype', |
33 |
value => { notforloan => 0 } |
34 |
})->{itemtype}; |
33 |
|
35 |
|
34 |
t::lib::Mocks::mock_userenv({ branchcode => $library1->{branchcode} }); |
36 |
t::lib::Mocks::mock_userenv({ branchcode => $library1->{branchcode} }); |
35 |
|
37 |
|
36 |
my $bib_title = "Test Title"; |
|
|
37 |
|
38 |
|
38 |
my $borrower1 = $builder->build({ |
39 |
my $borrower1 = $builder->build({ |
39 |
source => 'Borrower', |
40 |
source => 'Borrower', |
Lines 51-101
my $borrower2 = $builder->build({
Link Here
|
51 |
} |
52 |
} |
52 |
}); |
53 |
}); |
53 |
|
54 |
|
54 |
# Test hold_fulfillment_policy |
55 |
my $borrower3 = $builder->build({ |
55 |
my ( $itemtype ) = @{ $dbh->selectrow_arrayref("SELECT itemtype FROM itemtypes LIMIT 1") }; |
56 |
source => 'Borrower', |
|
|
57 |
value => { |
58 |
branchcode => $library2->{branchcode}, |
59 |
dateexpiry => '3000-01-01', |
60 |
} |
61 |
}); |
62 |
|
56 |
my $borrowernumber1 = $borrower1->{borrowernumber}; |
63 |
my $borrowernumber1 = $borrower1->{borrowernumber}; |
57 |
my $borrowernumber2 = $borrower2->{borrowernumber}; |
64 |
my $borrowernumber2 = $borrower2->{borrowernumber}; |
58 |
my $library_A = $library1->{branchcode}; |
65 |
my $library_A = $library1->{branchcode}; |
59 |
my $library_B = $library2->{branchcode}; |
66 |
my $library_B = $library2->{branchcode}; |
60 |
|
67 |
|
61 |
$dbh->do("INSERT INTO biblio (frameworkcode, author, title, datecreated) VALUES ('', 'Koha test', '$bib_title', '2011-02-01')"); |
68 |
my $biblio = $builder->build_sample_biblio({itemtype=>$itemtype}); |
62 |
|
69 |
my $biblionumber = $biblio->biblionumber; |
63 |
my $biblionumber = $dbh->selectrow_array("SELECT biblionumber FROM biblio WHERE title = '$bib_title'") |
70 |
my $item1 = $builder->build_sample_item({ |
64 |
or BAIL_OUT("Cannot find newly created biblio record"); |
71 |
biblionumber=>$biblionumber, |
65 |
|
72 |
itype=>$itemtype, |
66 |
$dbh->do("INSERT INTO biblioitems (biblionumber, itemtype) VALUES ($biblionumber, '$itemtype')"); |
73 |
homebranch => $library_A, |
67 |
|
74 |
holdingbranch => $library_A |
68 |
my $biblioitemnumber = |
75 |
})->unblessed; |
69 |
$dbh->selectrow_array("SELECT biblioitemnumber FROM biblioitems WHERE biblionumber = $biblionumber") |
76 |
my $item2 = $builder->build_sample_item({ |
70 |
or BAIL_OUT("Cannot find newly created biblioitems record"); |
77 |
biblionumber=>$biblionumber, |
71 |
|
78 |
itype=>$itemtype, |
72 |
$dbh->do(" |
79 |
homebranch => $library_A, |
73 |
INSERT INTO items (barcode, biblionumber, biblioitemnumber, homebranch, holdingbranch, notforloan, damaged, itemlost, withdrawn, onloan, itype) |
80 |
holdingbranch => $library_A |
74 |
VALUES ('AllowHoldIf1', $biblionumber, $biblioitemnumber, '$library_A', '$library_A', 0, 0, 0, 0, NULL, '$itemtype') |
81 |
})->unblessed; |
75 |
"); |
|
|
76 |
|
82 |
|
77 |
my $itemnumber1 = |
83 |
# Test hold_fulfillment_policy |
78 |
$dbh->selectrow_array("SELECT itemnumber FROM items WHERE biblionumber = $biblionumber") |
|
|
79 |
or BAIL_OUT("Cannot find newly created item"); |
80 |
|
81 |
my $item1 = Koha::Items->find( $itemnumber1 )->unblessed; |
82 |
|
83 |
$dbh->do(" |
84 |
INSERT INTO items (barcode, biblionumber, biblioitemnumber, homebranch, holdingbranch, notforloan, damaged, itemlost, withdrawn, onloan, itype) |
85 |
VALUES ('AllowHoldIf2', $biblionumber, $biblioitemnumber, '$library_A', '$library_A', 0, 0, 0, 0, NULL, '$itemtype') |
86 |
"); |
87 |
|
84 |
|
88 |
my $itemnumber2 = |
|
|
89 |
$dbh->selectrow_array("SELECT itemnumber FROM items WHERE biblionumber = $biblionumber ORDER BY itemnumber DESC") |
90 |
or BAIL_OUT("Cannot find newly created item"); |
91 |
|
85 |
|
92 |
my $item2 = Koha::Items->find( $itemnumber2 )->unblessed; |
|
|
93 |
|
86 |
|
94 |
$dbh->do("DELETE FROM issuingrules"); |
|
|
95 |
my $rule = Koha::IssuingRule->new( |
87 |
my $rule = Koha::IssuingRule->new( |
96 |
{ |
88 |
{ |
97 |
categorycode => '*', |
89 |
categorycode => '*', |
98 |
itemtype => '*', |
90 |
itemtype => $itemtype, |
99 |
branchcode => '*', |
91 |
branchcode => '*', |
100 |
issuelength => 7, |
92 |
issuelength => 7, |
101 |
lengthunit => 8, |
93 |
lengthunit => 8, |
Lines 128-136
AddReturn( $item1->{barcode} );
Link Here
|
128 |
my $hold_allowed_from_any_libraries = 2; |
120 |
my $hold_allowed_from_any_libraries = 2; |
129 |
my $sth_delete_rules = $dbh->prepare(q|DELETE FROM default_circ_rules|); |
121 |
my $sth_delete_rules = $dbh->prepare(q|DELETE FROM default_circ_rules|); |
130 |
my $sth_insert_rule = $dbh->prepare(q|INSERT INTO default_circ_rules(singleton, holdallowed, hold_fulfillment_policy, returnbranch) VALUES ('singleton', ?, 'any', 'homebranch');|); |
122 |
my $sth_insert_rule = $dbh->prepare(q|INSERT INTO default_circ_rules(singleton, holdallowed, hold_fulfillment_policy, returnbranch) VALUES ('singleton', ?, 'any', 'homebranch');|); |
|
|
123 |
my $sth_insert_branch_rule = $dbh->prepare(q|INSERT INTO default_branch_circ_rules(branchcode, holdallowed, hold_fulfillment_policy, returnbranch) VALUES (?, ?, 'any', 'homebranch');|); |
131 |
|
124 |
|
132 |
subtest 'Item is available at a different library' => sub { |
125 |
subtest 'Item is available at a different library' => sub { |
133 |
plan tests => 4; |
126 |
plan tests => 7; |
134 |
|
127 |
|
135 |
$item1 = Koha::Items->find( $item1->{itemnumber} ); |
128 |
$item1 = Koha::Items->find( $item1->{itemnumber} ); |
136 |
$item1->set({homebranch => $library_B, holdingbranch => $library_B })->store; |
129 |
$item1->set({homebranch => $library_B, holdingbranch => $library_B })->store; |
Lines 140-147
AddReturn( $item1->{barcode} );
Link Here
|
140 |
#Item 1 homebranch library B is available |
133 |
#Item 1 homebranch library B is available |
141 |
#Item 2 homebranch library A is checked out |
134 |
#Item 2 homebranch library A is checked out |
142 |
#Borrower1 is from library A |
135 |
#Borrower1 is from library A |
143 |
#CircControl has no effect - same rule for all branches as set at line 96 |
|
|
144 |
#FIXME: ReservesControlBranch is not checked in these subs we are testing |
145 |
|
136 |
|
146 |
{ |
137 |
{ |
147 |
$sth_delete_rules->execute; |
138 |
$sth_delete_rules->execute; |
Lines 150-159
AddReturn( $item1->{barcode} );
Link Here
|
150 |
t::lib::Mocks::mock_preference('ReservesControlBranch', 'ItemHomeLibrary'); |
141 |
t::lib::Mocks::mock_preference('ReservesControlBranch', 'ItemHomeLibrary'); |
151 |
$is = IsAvailableForItemLevelRequest( $item1, $borrower1); |
142 |
$is = IsAvailableForItemLevelRequest( $item1, $borrower1); |
152 |
is( $is, 1, "Hold allowed from home library + ReservesControlBranch=ItemHomeLibrary, One item is available at different library, not holdable = none available => the hold is allowed at item level" ); |
143 |
is( $is, 1, "Hold allowed from home library + ReservesControlBranch=ItemHomeLibrary, One item is available at different library, not holdable = none available => the hold is allowed at item level" ); |
|
|
144 |
$is = IsAvailableForItemLevelRequest( $item1, $borrower2); |
145 |
is( $is, 1, "Hold allowed from home library + ReservesControlBranch=ItemHomeLibrary, One item is available at home library, holdable = one available => the hold is not allowed at item level" ); |
146 |
$sth_insert_branch_rule->execute( $library_B, $hold_allowed_from_any_libraries ); |
147 |
#Adding a rule for the item's home library affects the availability for a borrower from another library because ReservesControlBranch is set to ItemHomeLibrary |
148 |
$is = IsAvailableForItemLevelRequest( $item1, $borrower1); |
149 |
is( $is, 0, "Hold allowed from home library + ReservesControlBranch=ItemHomeLibrary, One item is available at different library, holdable = one available => the hold is not allowed at item level" ); |
153 |
|
150 |
|
154 |
t::lib::Mocks::mock_preference('ReservesControlBranch', 'PatronLibrary'); |
151 |
t::lib::Mocks::mock_preference('ReservesControlBranch', 'PatronLibrary'); |
155 |
$is = IsAvailableForItemLevelRequest( $item1, $borrower1); |
152 |
$is = IsAvailableForItemLevelRequest( $item1, $borrower1); |
156 |
is( $is, 1, "Hold allowed from home library + ReservesControlBranch=PatronLibrary, One item is available at different library, not holdable = none available => the hold is allowed at item level" ); |
153 |
is( $is, 1, "Hold allowed from home library + ReservesControlBranch=PatronLibrary, One item is available at different library, not holdable = none available => the hold is allowed at item level" ); |
|
|
154 |
#Adding a rule for the patron's home library affects the availability for an item from another library because ReservesControlBranch is set to PatronLibrary |
155 |
$sth_insert_branch_rule->execute( $library_A, $hold_allowed_from_any_libraries ); |
156 |
$is = IsAvailableForItemLevelRequest( $item1, $borrower1); |
157 |
is( $is, 0, "Hold allowed from home library + ReservesControlBranch=PatronLibrary, One item is available at different library, holdable = one available => the hold is not allowed at item level" ); |
157 |
} |
158 |
} |
158 |
|
159 |
|
159 |
{ |
160 |
{ |
Lines 213-247
AddReturn( $item1->{barcode} );
Link Here
|
213 |
}; |
214 |
}; |
214 |
} |
215 |
} |
215 |
|
216 |
|
216 |
my $biblio = $builder->build({ |
217 |
my $itemtype2 = $builder->build({ |
217 |
source => 'Biblio', |
218 |
source => 'Itemtype', |
218 |
}); |
219 |
value => { notforloan => 0 } |
219 |
|
220 |
})->{itemtype}; |
220 |
my $item3 = $builder->build({ |
221 |
my $item3 = $builder->build_sample_item({ itype => $itemtype2 }); |
221 |
source => 'Item', |
|
|
222 |
value => { |
223 |
biblionumber => $biblio->{biblionumber}, |
224 |
itemlost => 0, |
225 |
notforloan => 0, |
226 |
withdrawn => 0, |
227 |
damaged => 0, |
228 |
onloan => undef, |
229 |
} |
230 |
}); |
231 |
|
222 |
|
232 |
my $hold = $builder->build({ |
223 |
my $hold = $builder->build({ |
233 |
source => 'Reserve', |
224 |
source => 'Reserve', |
234 |
value =>{ |
225 |
value =>{ |
235 |
itemnumber => $item3->{itemnumber}, |
226 |
itemnumber => $item3->itemnumber, |
236 |
found => 'T' |
227 |
found => 'T' |
237 |
} |
228 |
} |
238 |
}); |
229 |
}); |
239 |
|
230 |
|
240 |
$dbh->do("DELETE FROM issuingrules"); |
|
|
241 |
$rule = Koha::IssuingRule->new( |
231 |
$rule = Koha::IssuingRule->new( |
242 |
{ |
232 |
{ |
243 |
categorycode => '*', |
233 |
categorycode => '*', |
244 |
itemtype => '*', |
234 |
itemtype => $itemtype2, |
245 |
branchcode => '*', |
235 |
branchcode => '*', |
246 |
issuelength => 7, |
236 |
issuelength => 7, |
247 |
lengthunit => 8, |
237 |
lengthunit => 8, |
Lines 251-257
$rule = Koha::IssuingRule->new(
Link Here
|
251 |
); |
241 |
); |
252 |
$rule->store(); |
242 |
$rule->store(); |
253 |
|
243 |
|
254 |
$is = IsAvailableForItemLevelRequest( $item3, $borrower1); |
244 |
$is = IsAvailableForItemLevelRequest( $item3->unblessed, $borrower1); |
255 |
is( $is, 1, "Item can be held, items in transit are not available" ); |
245 |
is( $is, 1, "Item can be held, items in transit are not available" ); |
256 |
|
246 |
|
257 |
# Cleanup |
247 |
# Cleanup |
258 |
- |
|
|