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
|);