3 # This file is part of Koha.
5 # Koha is free software; you can redistribute it and/or modify it under the
6 # terms of the GNU General Public License as published by the Free Software
7 # Foundation; either version 3 of the License, or (at your option) any later
10 # Koha is distributed in the hope that it will be useful, but WITHOUT ANY
11 # WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
12 # A PARTICULAR PURPOSE. See the GNU General Public License for more details.
14 # You should have received a copy of the GNU General Public License along
15 # with Koha; if not, see <http://www.gnu.org/licenses>.
18 use Test::More tests => 7;
27 use Koha::DateUtils qw( dt_from_string );
29 use Koha::CirculationRules;
31 use t::lib::TestBuilder;
34 my $schema = Koha::Database->new->schema;
35 $schema->storage->txn_begin;
37 our $dbh = C4::Context->dbh;
39 $dbh->do(q|DELETE FROM issues|);
40 $dbh->do(q|DELETE FROM items|);
41 $dbh->do(q|DELETE FROM borrowers|);
42 $dbh->do(q|DELETE FROM branches|);
43 $dbh->do(q|DELETE FROM categories|);
44 $dbh->do(q|DELETE FROM accountlines|);
45 $dbh->do(q|DELETE FROM itemtypes|);
46 $dbh->do(q|DELETE FROM branch_item_rules|);
47 $dbh->do(q|DELETE FROM default_branch_circ_rules|);
48 $dbh->do(q|DELETE FROM default_circ_rules|);
49 $dbh->do(q|DELETE FROM default_branch_item_rules|);
50 $dbh->do(q|DELETE FROM issuingrules|);
51 Koha::CirculationRules->search()->delete();
53 my $builder = t::lib::TestBuilder->new();
54 t::lib::Mocks::mock_preference('item-level_itypes', 1); # Assuming the item type is defined at item level
56 my $branch = $builder->build({
60 my $category = $builder->build({
64 my $patron = $builder->build({
67 categorycode => $category->{categorycode},
68 branchcode => $branch->{branchcode},
72 my $biblio = $builder->build({
75 branchcode => $branch->{branchcode},
78 my $item = $builder->build({
81 biblionumber => $biblio->{biblionumber},
82 homebranch => $branch->{branchcode},
83 holdingbranch => $branch->{branchcode},
87 my $patron_object = Koha::Patrons->find( $patron->{borrowernumber} );
88 t::lib::Mocks::mock_userenv( { patron => $patron_object });
90 # TooMany return ($current_loan_count, $max_loans_allowed) or undef
92 # OSCO: On-site checkout
94 subtest 'no rules exist' => sub {
97 C4::Circulation::TooMany( $patron, $biblio->{biblionumber}, $item ),
98 { reason => 'NO_RULE_DEFINED', max_allowed => 0 },
99 'CO should not be allowed, in any cases'
102 C4::Circulation::TooMany( $patron, $biblio->{biblionumber}, $item, { onsite_checkout => 1 } ),
103 { reason => 'NO_RULE_DEFINED', max_allowed => 0 },
104 'OSCO should not be allowed, in any cases'
108 subtest '1 Issuingrule exist 0 0: no issue allowed' => sub {
110 Koha::CirculationRules->set_rules(
112 branchcode => $branch->{branchcode},
113 categorycode => $category->{categorycode},
117 maxonsiteissueqty => 0,
121 t::lib::Mocks::mock_preference('ConsiderOnSiteCheckoutsAsNormalCheckouts', 0);
123 C4::Circulation::TooMany( $patron, $biblio->{biblionumber}, $item ),
125 reason => 'TOO_MANY_CHECKOUTS',
129 'CO should not be allowed if ConsiderOnSiteCheckoutsAsNormalCheckouts == 0'
132 C4::Circulation::TooMany( $patron, $biblio->{biblionumber}, $item, { onsite_checkout => 1 } ),
134 reason => 'TOO_MANY_ONSITE_CHECKOUTS',
138 'OSCO should not be allowed if ConsiderOnSiteCheckoutsAsNormalCheckouts == 0'
141 t::lib::Mocks::mock_preference('ConsiderOnSiteCheckoutsAsNormalCheckouts', 1);
143 C4::Circulation::TooMany( $patron, $biblio->{biblionumber}, $item ),
145 reason => 'TOO_MANY_CHECKOUTS',
149 'CO should not be allowed if ConsiderOnSiteCheckoutsAsNormalCheckouts == 1'
152 C4::Circulation::TooMany( $patron, $biblio->{biblionumber}, $item, { onsite_checkout => 1 } ),
154 reason => 'TOO_MANY_ONSITE_CHECKOUTS',
158 'OSCO should not be allowed if ConsiderOnSiteCheckoutsAsNormalCheckouts == 1'
164 subtest '1 Issuingrule exist with onsiteissueqty=unlimited' => sub {
167 Koha::CirculationRules->set_rules(
169 branchcode => $branch->{branchcode},
170 categorycode => $category->{categorycode},
174 maxonsiteissueqty => undef,
179 my $issue = C4::Circulation::AddIssue( $patron, $item->{barcode}, dt_from_string() );
180 t::lib::Mocks::mock_preference('ConsiderOnSiteCheckoutsAsNormalCheckouts', 0);
182 C4::Circulation::TooMany( $patron, $biblio->{biblionumber}, $item ),
184 reason => 'TOO_MANY_CHECKOUTS',
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 reason => 'TOO_MANY_CHECKOUTS',
204 'CO should not be allowed if ConsiderOnSiteCheckoutsAsNormalCheckouts == 1'
207 C4::Circulation::TooMany( $patron, $biblio->{biblionumber}, $item, { onsite_checkout => 1 } ),
209 reason => 'TOO_MANY_CHECKOUTS',
213 'OSCO should not be allowed if ConsiderOnSiteCheckoutsAsNormalCheckouts == 1'
220 subtest '1 Issuingrule exist 1 1: issue is allowed' => sub {
222 Koha::CirculationRules->set_rules(
224 branchcode => $branch->{branchcode},
225 categorycode => $category->{categorycode},
229 maxonsiteissueqty => 1,
233 t::lib::Mocks::mock_preference('ConsiderOnSiteCheckoutsAsNormalCheckouts', 0);
235 C4::Circulation::TooMany( $patron, $biblio->{biblionumber}, $item ),
237 'CO should be allowed if ConsiderOnSiteCheckoutsAsNormalCheckouts == 0'
240 C4::Circulation::TooMany( $patron, $biblio->{biblionumber}, $item, { onsite_checkout => 1 } ),
242 'OSCO should be allowed if ConsiderOnSiteCheckoutsAsNormalCheckouts == 0'
245 t::lib::Mocks::mock_preference('ConsiderOnSiteCheckoutsAsNormalCheckouts', 1);
247 C4::Circulation::TooMany( $patron, $biblio->{biblionumber}, $item ),
249 'CO should not be allowed if ConsiderOnSiteCheckoutsAsNormalCheckouts == 1'
252 C4::Circulation::TooMany( $patron, $biblio->{biblionumber}, $item, { onsite_checkout => 1 } ),
254 'OSCO should not be allowed if ConsiderOnSiteCheckoutsAsNormalCheckouts == 1'
260 subtest '1 Issuingrule exist: 1 CO allowed, 1 OSCO allowed. Do a CO' => sub {
262 Koha::CirculationRules->set_rules(
264 branchcode => $branch->{branchcode},
265 categorycode => $category->{categorycode},
269 maxonsiteissueqty => 1,
274 my $issue = C4::Circulation::AddIssue( $patron, $item->{barcode}, dt_from_string() );
275 like( $issue->issue_id, qr|^\d+$|, 'The issue should have been inserted' );
277 t::lib::Mocks::mock_preference('ConsiderOnSiteCheckoutsAsNormalCheckouts', 0);
279 C4::Circulation::TooMany( $patron, $biblio->{biblionumber}, $item ),
281 reason => 'TOO_MANY_CHECKOUTS',
285 'CO should not be allowed if ConsiderOnSiteCheckoutsAsNormalCheckouts == 0'
288 C4::Circulation::TooMany( $patron, $biblio->{biblionumber}, $item, { onsite_checkout => 1 } ),
290 'OSCO should be allowed if ConsiderOnSiteCheckoutsAsNormalCheckouts == 0'
293 t::lib::Mocks::mock_preference('ConsiderOnSiteCheckoutsAsNormalCheckouts', 1);
295 C4::Circulation::TooMany( $patron, $biblio->{biblionumber}, $item ),
297 reason => 'TOO_MANY_CHECKOUTS',
301 'CO should not be allowed if ConsiderOnSiteCheckoutsAsNormalCheckouts == 1'
304 C4::Circulation::TooMany( $patron, $biblio->{biblionumber}, $item, { onsite_checkout => 1 } ),
306 reason => 'TOO_MANY_CHECKOUTS',
310 'OSCO should not be allowed if ConsiderOnSiteCheckoutsAsNormalCheckouts == 1'
316 subtest '1 Issuingrule exist: 1 CO allowed, 1 OSCO allowed, Do a OSCO' => sub {
318 Koha::CirculationRules->set_rules(
320 branchcode => $branch->{branchcode},
321 categorycode => $category->{categorycode},
325 maxonsiteissueqty => 1,
330 my $issue = C4::Circulation::AddIssue( $patron, $item->{barcode}, dt_from_string(), undef, undef, undef, { onsite_checkout => 1 } );
331 like( $issue->issue_id, qr|^\d+$|, 'The issue should have been inserted' );
333 t::lib::Mocks::mock_preference('ConsiderOnSiteCheckoutsAsNormalCheckouts', 0);
335 C4::Circulation::TooMany( $patron, $biblio->{biblionumber}, $item ),
337 'CO should be allowed if ConsiderOnSiteCheckoutsAsNormalCheckouts == 0'
340 C4::Circulation::TooMany( $patron, $biblio->{biblionumber}, $item, { onsite_checkout => 1 } ),
342 reason => 'TOO_MANY_ONSITE_CHECKOUTS',
346 'OSCO should not be allowed if ConsiderOnSiteCheckoutsAsNormalCheckouts == 0'
349 t::lib::Mocks::mock_preference('ConsiderOnSiteCheckoutsAsNormalCheckouts', 1);
351 C4::Circulation::TooMany( $patron, $biblio->{biblionumber}, $item ),
353 reason => 'TOO_MANY_CHECKOUTS',
357 'CO should not be allowed if ConsiderOnSiteCheckoutsAsNormalCheckouts == 1'
360 C4::Circulation::TooMany( $patron, $biblio->{biblionumber}, $item, { onsite_checkout => 1 } ),
362 reason => 'TOO_MANY_ONSITE_CHECKOUTS',
366 'OSCO should not be allowed if ConsiderOnSiteCheckoutsAsNormalCheckouts == 1'
372 subtest '1 BranchBorrowerCircRule exist: 1 CO allowed, 1 OSCO allowed' => sub {
373 # Note: the same test coul be done for
374 # DefaultBorrowerCircRule, DefaultBranchCircRule, DefaultBranchItemRule ans DefaultCircRule.pm
377 Koha::CirculationRules->set_rules(
379 branchcode => $branch->{branchcode},
380 categorycode => $category->{categorycode},
384 maxonsiteissueqty => 1,
389 my $issue = C4::Circulation::AddIssue( $patron, $item->{barcode}, dt_from_string(), undef, undef, undef );
390 like( $issue->issue_id, qr|^\d+$|, 'The issue should have been inserted' );
392 t::lib::Mocks::mock_preference('ConsiderOnSiteCheckoutsAsNormalCheckouts', 0);
394 C4::Circulation::TooMany( $patron, $biblio->{biblionumber}, $item ),
396 reason => 'TOO_MANY_CHECKOUTS',
400 'CO should be allowed if ConsiderOnSiteCheckoutsAsNormalCheckouts == 0'
403 C4::Circulation::TooMany( $patron, $biblio->{biblionumber}, $item, { onsite_checkout => 1 } ),
405 'OSCO should not be allowed if ConsiderOnSiteCheckoutsAsNormalCheckouts == 0'
408 t::lib::Mocks::mock_preference('ConsiderOnSiteCheckoutsAsNormalCheckouts', 1);
410 C4::Circulation::TooMany( $patron, $biblio->{biblionumber}, $item ),
412 reason => 'TOO_MANY_CHECKOUTS',
416 'CO should not be allowed if ConsiderOnSiteCheckoutsAsNormalCheckouts == 1'
419 C4::Circulation::TooMany( $patron, $biblio->{biblionumber}, $item, { onsite_checkout => 1 } ),
421 reason => 'TOO_MANY_CHECKOUTS',
425 'OSCO should not be allowed if ConsiderOnSiteCheckoutsAsNormalCheckouts == 1'
430 $issue = C4::Circulation::AddIssue( $patron, $item->{barcode}, dt_from_string(), undef, undef, undef, { onsite_checkout => 1 } );
431 like( $issue->issue_id, qr|^\d+$|, 'The issue should have been inserted' );
433 t::lib::Mocks::mock_preference('ConsiderOnSiteCheckoutsAsNormalCheckouts', 0);
435 C4::Circulation::TooMany( $patron, $biblio->{biblionumber}, $item ),
437 'CO should be allowed if ConsiderOnSiteCheckoutsAsNormalCheckouts == 0'
440 C4::Circulation::TooMany( $patron, $biblio->{biblionumber}, $item, { onsite_checkout => 1 } ),
442 reason => 'TOO_MANY_ONSITE_CHECKOUTS',
446 'OSCO should not be allowed if ConsiderOnSiteCheckoutsAsNormalCheckouts == 0'
449 t::lib::Mocks::mock_preference('ConsiderOnSiteCheckoutsAsNormalCheckouts', 1);
451 C4::Circulation::TooMany( $patron, $biblio->{biblionumber}, $item ),
453 reason => 'TOO_MANY_CHECKOUTS',
457 'CO should not be allowed if ConsiderOnSiteCheckoutsAsNormalCheckouts == 1'
460 C4::Circulation::TooMany( $patron, $biblio->{biblionumber}, $item, { onsite_checkout => 1 } ),
462 reason => 'TOO_MANY_ONSITE_CHECKOUTS',
466 'OSCO should not be allowed if ConsiderOnSiteCheckoutsAsNormalCheckouts == 1'
472 $schema->storage->txn_rollback;
475 $dbh->do(q|DELETE FROM issues|);
476 $dbh->do(q|DELETE FROM issuingrules|);