4 use Test::More tests => 6;
14 use Koha::DateUtils qw( dt_from_string );
16 use t::lib::TestBuilder;
19 our $dbh = C4::Context->dbh;
20 $dbh->{AutoCommit} = 0;
21 $dbh->{RaiseError} = 1;
23 $dbh->do(q|DELETE FROM issues|);
24 $dbh->do(q|DELETE FROM items|);
25 $dbh->do(q|DELETE FROM borrowers|);
26 $dbh->do(q|DELETE FROM branches|);
27 $dbh->do(q|DELETE FROM categories|);
28 $dbh->do(q|DELETE FROM accountlines|);
29 $dbh->do(q|DELETE FROM itemtypes|);
30 $dbh->do(q|DELETE FROM branch_item_rules|);
31 $dbh->do(q|DELETE FROM branch_borrower_circ_rules|);
32 $dbh->do(q|DELETE FROM default_branch_circ_rules|);
33 $dbh->do(q|DELETE FROM default_circ_rules|);
34 $dbh->do(q|DELETE FROM default_branch_item_rules|);
36 my $builder = t::lib::TestBuilder->new();
38 my $branch = $builder->build({
42 my $category = $builder->build({
46 my $patron = $builder->build({
49 categorycode => $category->{categorycode},
50 branchcode => $branch->{branchcode},
54 my $biblio = $builder->build({
57 branchcode => $branch->{branchcode},
60 my $item = $builder->build({
63 biblionumber => $biblio->{biblionumber},
64 homebranch => $branch->{branchcode},
65 holdingbranch => $branch->{branchcode},
69 C4::Context->_new_userenv ('DUMMY_SESSION_ID');
70 C4::Context->set_userenv($patron->{borrowernumber}, $patron->{userid}, 'usercnum', 'First name', 'Surname', $branch->{branchcode}, 'My Library', 0);
72 # TooMany return ($current_loan_count, $max_loans_allowed) or undef
74 # OSCO: On-site checkout
76 subtest 'no rules exist' => sub {
79 C4::Circulation::TooMany( $patron, $biblio->{biblionumber}, $item ),
81 'CO should be allowed, in any cases'
84 C4::Circulation::TooMany( $patron, $biblio->{biblionumber}, $item, { onsite_checkout => 1 } ),
86 'OSCO should be allowed, in any cases'
90 subtest '1 Issuingrule exist 0 0: no issue allowed' => sub {
92 my $issuingrule = $builder->build({
93 source => 'Issuingrule',
95 branchcode => $branch->{branchcode},
96 categorycode => $category->{categorycode},
99 maxonsiteissueqty => 0,
102 t::lib::Mocks::mock_preference('ConsiderOnSiteCheckoutsAsNormalCheckouts', 0);
104 [ C4::Circulation::TooMany( $patron, $biblio->{biblionumber}, $item ) ],
106 'CO should not be allowed if ConsiderOnSiteCheckoutsAsNormalCheckouts == 0'
109 [ C4::Circulation::TooMany( $patron, $biblio->{biblionumber}, $item, { onsite_checkout => 1 } ) ],
111 'OSCO should not be allowed if ConsiderOnSiteCheckoutsAsNormalCheckouts == 0'
114 t::lib::Mocks::mock_preference('ConsiderOnSiteCheckoutsAsNormalCheckouts', 1);
116 [ C4::Circulation::TooMany( $patron, $biblio->{biblionumber}, $item ) ],
118 'CO should not be allowed if ConsiderOnSiteCheckoutsAsNormalCheckouts == 1'
121 [ C4::Circulation::TooMany( $patron, $biblio->{biblionumber}, $item, { onsite_checkout => 1 } ) ],
123 'OSCO should not be allowed if ConsiderOnSiteCheckoutsAsNormalCheckouts == 1'
129 subtest '1 Issuingrule exist 1 1: issue is allowed' => sub {
131 my $issuingrule = $builder->build({
132 source => 'Issuingrule',
134 branchcode => $branch->{branchcode},
135 categorycode => $category->{categorycode},
138 maxonsiteissueqty => 1,
141 t::lib::Mocks::mock_preference('ConsiderOnSiteCheckoutsAsNormalCheckouts', 0);
143 C4::Circulation::TooMany( $patron, $biblio->{biblionumber}, $item ),
145 'CO should be allowed if ConsiderOnSiteCheckoutsAsNormalCheckouts == 0'
148 C4::Circulation::TooMany( $patron, $biblio->{biblionumber}, $item, { onsite_checkout => 1 } ),
150 'OSCO should be allowed if ConsiderOnSiteCheckoutsAsNormalCheckouts == 0'
153 t::lib::Mocks::mock_preference('ConsiderOnSiteCheckoutsAsNormalCheckouts', 1);
155 C4::Circulation::TooMany( $patron, $biblio->{biblionumber}, $item ),
157 'CO should not be allowed if ConsiderOnSiteCheckoutsAsNormalCheckouts == 1'
160 C4::Circulation::TooMany( $patron, $biblio->{biblionumber}, $item, { onsite_checkout => 1 } ),
162 'OSCO should not be allowed if ConsiderOnSiteCheckoutsAsNormalCheckouts == 1'
168 subtest '1 Issuingrule exist: 1 CO allowed, 1 OSCO allowed. Do a CO' => sub {
170 my $issuingrule = $builder->build({
171 source => 'Issuingrule',
173 branchcode => $branch->{branchcode},
174 categorycode => $category->{categorycode},
177 maxonsiteissueqty => 1,
181 my $issue = C4::Circulation::AddIssue( $patron, $item->{barcode}, dt_from_string() );
182 like( $issue->issue_id, qr|^\d+$|, 'The issue should have been inserted' );
184 t::lib::Mocks::mock_preference('ConsiderOnSiteCheckoutsAsNormalCheckouts', 0);
186 [ C4::Circulation::TooMany( $patron, $biblio->{biblionumber}, $item ) ],
188 'CO should not be allowed if ConsiderOnSiteCheckoutsAsNormalCheckouts == 0'
191 C4::Circulation::TooMany( $patron, $biblio->{biblionumber}, $item, { onsite_checkout => 1 } ),
193 'OSCO should be allowed if ConsiderOnSiteCheckoutsAsNormalCheckouts == 0'
196 t::lib::Mocks::mock_preference('ConsiderOnSiteCheckoutsAsNormalCheckouts', 1);
198 [ C4::Circulation::TooMany( $patron, $biblio->{biblionumber}, $item ) ],
200 'CO should not be allowed if ConsiderOnSiteCheckoutsAsNormalCheckouts == 1'
203 [ C4::Circulation::TooMany( $patron, $biblio->{biblionumber}, $item, { onsite_checkout => 1 } ) ],
205 'OSCO should not be allowed if ConsiderOnSiteCheckoutsAsNormalCheckouts == 1'
211 subtest '1 Issuingrule exist: 1 CO allowed, 1 OSCO allowed, Do a OSCO' => sub {
213 my $issuingrule = $builder->build({
214 source => 'Issuingrule',
216 branchcode => $branch->{branchcode},
217 categorycode => $category->{categorycode},
220 maxonsiteissueqty => 1,
224 my $issue = C4::Circulation::AddIssue( $patron, $item->{barcode}, dt_from_string(), undef, undef, undef, { onsite_checkout => 1 } );
225 like( $issue->issue_id, qr|^\d+$|, 'The issue should have been inserted' );
227 t::lib::Mocks::mock_preference('ConsiderOnSiteCheckoutsAsNormalCheckouts', 0);
229 C4::Circulation::TooMany( $patron, $biblio->{biblionumber}, $item ),
231 'CO should be allowed if ConsiderOnSiteCheckoutsAsNormalCheckouts == 0'
234 [ C4::Circulation::TooMany( $patron, $biblio->{biblionumber}, $item, { onsite_checkout => 1 } ) ],
236 'OSCO should not be allowed if ConsiderOnSiteCheckoutsAsNormalCheckouts == 0'
239 t::lib::Mocks::mock_preference('ConsiderOnSiteCheckoutsAsNormalCheckouts', 1);
241 [ C4::Circulation::TooMany( $patron, $biblio->{biblionumber}, $item ) ],
243 'CO should not be allowed if ConsiderOnSiteCheckoutsAsNormalCheckouts == 1'
246 [ C4::Circulation::TooMany( $patron, $biblio->{biblionumber}, $item, { onsite_checkout => 1 } ) ],
248 'OSCO should not be allowed if ConsiderOnSiteCheckoutsAsNormalCheckouts == 1'
254 subtest '1 BranchBorrowerCircRule exist: 1 CO allowed, 1 OSCO allowed' => sub {
255 # Note: the same test coul be done for
256 # DefaultBorrowerCircRule, DefaultBranchCircRule, DefaultBranchItemRule ans DefaultCircRule.pm
259 my $issuingrule = $builder->build({
260 source => 'BranchBorrowerCircRule',
262 branchcode => $branch->{branchcode},
263 categorycode => $category->{categorycode},
265 maxonsiteissueqty => 1,
269 my $issue = C4::Circulation::AddIssue( $patron, $item->{barcode}, dt_from_string(), undef, undef, undef );
270 like( $issue->issue_id, qr|^\d+$|, 'The issue should have been inserted' );
272 t::lib::Mocks::mock_preference('ConsiderOnSiteCheckoutsAsNormalCheckouts', 0);
274 [ C4::Circulation::TooMany( $patron, $biblio->{biblionumber}, $item ) ],
276 'CO should be allowed if ConsiderOnSiteCheckoutsAsNormalCheckouts == 0'
279 C4::Circulation::TooMany( $patron, $biblio->{biblionumber}, $item, { onsite_checkout => 1 } ),
281 'OSCO should not be allowed if ConsiderOnSiteCheckoutsAsNormalCheckouts == 0'
284 t::lib::Mocks::mock_preference('ConsiderOnSiteCheckoutsAsNormalCheckouts', 1);
286 [ C4::Circulation::TooMany( $patron, $biblio->{biblionumber}, $item ) ],
288 'CO should not be allowed if ConsiderOnSiteCheckoutsAsNormalCheckouts == 1'
291 [ C4::Circulation::TooMany( $patron, $biblio->{biblionumber}, $item, { onsite_checkout => 1 } ) ],
293 'OSCO should not be allowed if ConsiderOnSiteCheckoutsAsNormalCheckouts == 1'
298 $issue = C4::Circulation::AddIssue( $patron, $item->{barcode}, dt_from_string(), undef, undef, undef, { onsite_checkout => 1 } );
299 like( $issue->issue_id, qr|^\d+$|, 'The issue should have been inserted' );
301 t::lib::Mocks::mock_preference('ConsiderOnSiteCheckoutsAsNormalCheckouts', 0);
303 C4::Circulation::TooMany( $patron, $biblio->{biblionumber}, $item ),
305 'CO should be allowed if ConsiderOnSiteCheckoutsAsNormalCheckouts == 0'
308 [ C4::Circulation::TooMany( $patron, $biblio->{biblionumber}, $item, { onsite_checkout => 1 } ) ],
310 'OSCO should not be allowed if ConsiderOnSiteCheckoutsAsNormalCheckouts == 0'
313 t::lib::Mocks::mock_preference('ConsiderOnSiteCheckoutsAsNormalCheckouts', 1);
315 [ C4::Circulation::TooMany( $patron, $biblio->{biblionumber}, $item ) ],
317 'CO should not be allowed if ConsiderOnSiteCheckoutsAsNormalCheckouts == 1'
320 [ C4::Circulation::TooMany( $patron, $biblio->{biblionumber}, $item, { onsite_checkout => 1 } ) ],
322 'OSCO should not be allowed if ConsiderOnSiteCheckoutsAsNormalCheckouts == 1'
329 $dbh->do(q|DELETE FROM issues|);
330 $dbh->do(q|DELETE FROM issuingrules|);