3 # Copyright 2020 Koha Development team
5 # This file is part of Koha
7 # Koha is free software; you can redistribute it and/or modify it
8 # under the terms of the GNU General Public License as published by
9 # the Free Software Foundation; either version 3 of the License, or
10 # (at your option) any later version.
12 # Koha is distributed in the hope that it will be useful, but
13 # WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
17 # You should have received a copy of the GNU General Public License
18 # along with Koha; if not, see <http://www.gnu.org/licenses>.
22 use Test::More tests => 4;
25 use Koha::CirculationRules;
29 use t::lib::TestBuilder;
32 my $schema = Koha::Database->new->schema;
33 my $builder = t::lib::TestBuilder->new;
35 subtest 'set_rule + get_effective_rule' => sub {
38 $schema->storage->txn_begin;
40 my $categorycode = $builder->build_object( { class => 'Koha::Patron::Categories' } )->categorycode;
41 my $itemtype = $builder->build_object( { class => 'Koha::ItemTypes' } )->itemtype;
42 my $branchcode = $builder->build_object( { class => 'Koha::Libraries' } )->branchcode;
43 my $branchcode_2 = $builder->build_object( { class => 'Koha::Libraries' } )->branchcode;
44 my $rule_name = 'maxissueqty';
45 my $default_rule_value = 1;
48 Koha::CirculationRules->delete;
50 throws_ok { Koha::CirculationRules->get_effective_rule }
51 'Koha::Exceptions::MissingParameter',
52 "Exception should be raised if get_effective_rule is called without rule_name parameter";
54 $rule = Koha::CirculationRules->get_effective_rule(
56 branchcode => $branchcode,
57 categorycode => $categorycode,
58 itemtype => $itemtype,
59 rule_name => $rule_name,
62 is( $rule, undef, 'Undef should be returned if no rule exist' );
64 Koha::CirculationRules->set_rule(
69 rule_name => $rule_name,
70 rule_value => $default_rule_value,
74 $rule = Koha::CirculationRules->get_effective_rule(
77 categorycode => undef,
79 rule_name => $rule_name,
82 is( $rule->rule_value, $default_rule_value, 'undef means default' );
83 $rule = Koha::CirculationRules->get_effective_rule(
88 rule_name => $rule_name,
92 is( $rule->rule_value, $default_rule_value, '* means default' );
94 Koha::CirculationRules->set_rule(
98 itemtype => $itemtype,
99 rule_name => $rule_name,
104 $rule = Koha::CirculationRules->get_effective_rule(
106 branchcode => $branchcode,
107 categorycode => $categorycode,
108 itemtype => $itemtype,
109 rule_name => $rule_name,
112 is( $rule->rule_value, 2,
113 'More specific rule is returned when itemtype is given' );
115 $rule = Koha::CirculationRules->get_effective_rule(
117 branchcode => $branchcode_2,
120 rule_name => $rule_name,
123 is( $rule->rule_value, 1,
124 'Default rule is returned if there is no rule for this branchcode' );
126 Koha::CirculationRules->set_rule(
129 categorycode => $categorycode,
131 rule_name => $rule_name,
136 $rule = Koha::CirculationRules->get_effective_rule(
139 branchcode => $branchcode,
140 categorycode => $categorycode,
141 itemtype => $itemtype,
142 rule_name => $rule_name,
145 is( $rule->rule_value, 3,
146 'More specific rule is returned when categorycode exists' );
148 Koha::CirculationRules->set_rule(
151 categorycode => $categorycode,
152 itemtype => $itemtype,
153 rule_name => $rule_name,
157 $rule = Koha::CirculationRules->get_effective_rule(
159 branchcode => $branchcode,
160 categorycode => $categorycode,
161 itemtype => $itemtype,
162 rule_name => $rule_name,
165 is( $rule->rule_value, 4,
166 'More specific rule is returned when categorycode and itemtype exist' );
168 Koha::CirculationRules->set_rule(
170 branchcode => $branchcode,
173 rule_name => $rule_name,
177 $rule = Koha::CirculationRules->get_effective_rule(
179 branchcode => $branchcode,
180 categorycode => $categorycode,
181 itemtype => $itemtype,
182 rule_name => $rule_name,
185 is( $rule->rule_value, 5,
186 'More specific rule is returned when branchcode exists' );
188 Koha::CirculationRules->set_rule(
190 branchcode => $branchcode,
192 itemtype => $itemtype,
193 rule_name => $rule_name,
197 $rule = Koha::CirculationRules->get_effective_rule(
199 branchcode => $branchcode,
200 categorycode => $categorycode,
201 itemtype => $itemtype,
202 rule_name => $rule_name,
205 is( $rule->rule_value, 6,
206 'More specific rule is returned when branchcode and itemtype exists' );
208 Koha::CirculationRules->set_rule(
210 branchcode => $branchcode,
211 categorycode => $categorycode,
213 rule_name => $rule_name,
217 $rule = Koha::CirculationRules->get_effective_rule(
219 branchcode => $branchcode,
220 categorycode => $categorycode,
221 itemtype => $itemtype,
222 rule_name => $rule_name,
225 is( $rule->rule_value, 7,
226 'More specific rule is returned when branchcode and categorycode exist'
229 Koha::CirculationRules->set_rule(
231 branchcode => $branchcode,
232 categorycode => $categorycode,
233 itemtype => $itemtype,
234 rule_name => $rule_name,
238 $rule = Koha::CirculationRules->get_effective_rule(
240 branchcode => $branchcode,
241 categorycode => $categorycode,
242 itemtype => $itemtype,
243 rule_name => $rule_name,
246 is( $rule->rule_value, 8,
247 'More specific rule is returned when branchcode, categorycode and itemtype exist'
250 my $our_branch_rules = Koha::CirculationRules->search({branchcode => $branchcode});
251 is( $our_branch_rules->count, 4, "We added 8 rules");
252 $our_branch_rules->delete;
253 is( $our_branch_rules->count, 0, "We deleted 8 rules");
255 $schema->storage->txn_rollback;
258 subtest 'get_onshelfholds_policy() tests' => sub {
262 $schema->storage->txn_begin;
264 my $item = $builder->build_sample_item();
266 my $circ_rules = Koha::CirculationRules->new;
268 $circ_rules->search({ rule_name => 'onshelfholds' })->delete;
270 $circ_rules->set_rule(
275 rule_name => 'onshelfholds',
280 is( $circ_rules->get_onshelfholds_policy({ item => $item }), 1, 'If rule_value is set on a matching rule, return it' );
281 # Delete the rule (i.e. get_effective_rule returns undef)
283 is( $circ_rules->get_onshelfholds_policy({ item => $item }), 0, 'If no matching rule, fallback to 0' );
285 $schema->storage->txn_rollback;
288 subtest 'get_effective_daysmode' => sub {
291 $schema->storage->txn_begin;
293 my $item_1 = $builder->build_sample_item();
294 my $item_2 = $builder->build_sample_item();
297 Koha::CirculationRules->search( { rule_name => 'daysmode' } )->delete;
299 # Default value 'Datedue' at pref level
300 t::lib::Mocks::mock_preference( 'useDaysMode', 'Datedue' );
303 Koha::CirculationRules->get_effective_daysmode(
305 categorycode => undef,
306 itemtype => $item_1->effective_itemtype,
311 'daysmode default to pref value if the rule does not exist'
314 Koha::CirculationRules->set_rule(
319 rule_name => 'daysmode',
320 rule_value => 'Calendar',
323 Koha::CirculationRules->set_rule(
327 itemtype => $item_1->effective_itemtype,
328 rule_name => 'daysmode',
329 rule_value => 'Days',
334 Koha::CirculationRules->get_effective_daysmode(
336 categorycode => undef,
337 itemtype => $item_1->effective_itemtype,
342 "daysmode for item_1 is the specific rule"
345 Koha::CirculationRules->get_effective_daysmode(
347 categorycode => undef,
348 itemtype => $item_2->effective_itemtype,
353 "daysmode for item_2 is the one defined for the default circ rule"
356 Koha::CirculationRules->set_rule(
360 itemtype => $item_2->effective_itemtype,
361 rule_name => 'daysmode',
367 Koha::CirculationRules->get_effective_daysmode(
369 categorycode => undef,
370 itemtype => $item_2->effective_itemtype,
375 'daysmode default to pref value if the rule exists but set to""'
378 $schema->storage->txn_rollback;
381 subtest 'get_lostreturn_policy() tests' => sub {
384 $schema->storage->txn_begin;
386 $schema->resultset('CirculationRule')->search()->delete;
388 my $default_rule = $builder->build(
390 source => 'CirculationRule',
393 categorycode => undef,
395 rule_name => 'refund',
400 my $branchcode = $builder->build( { source => 'Branch' } )->{branchcode};
401 my $specific_rule_false = $builder->build(
403 source => 'CirculationRule',
405 branchcode => $branchcode,
406 categorycode => undef,
408 rule_name => 'refund',
413 my $branchcode2 = $builder->build( { source => 'Branch' } )->{branchcode};
414 my $specific_rule_true = $builder->build(
416 source => 'CirculationRule',
418 branchcode => $branchcode2,
419 categorycode => undef,
421 rule_name => 'refund',
426 # Make sure we have an unused branchcode
427 my $branchcode3 = $builder->build( { source => 'Branch' } )->{branchcode};
428 my $specific_rule_dummy = $builder->build(
430 source => 'CirculationRule',
432 branchcode => $branchcode3,
433 categorycode => undef,
435 rule_name => 'refund',
439 my $branch_without_rule = $specific_rule_dummy->{ branchcode };
440 Koha::CirculationRules
443 branchcode => $branch_without_rule,
444 categorycode => undef,
446 rule_name => 'refund'
452 my $item = $builder->build_sample_item(
454 homebranch => $specific_rule_true->{branchcode},
455 holdingbranch => $specific_rule_false->{branchcode}
459 return_branch => $specific_rule_true->{ branchcode },
464 t::lib::Mocks::mock_preference( 'RefundLostOnReturnControl', 'CheckinLibrary' );
465 is( Koha::CirculationRules->get_lostreturn_policy( $params ),
466 1,'Specific rule for checkin branch is applied (true)');
468 t::lib::Mocks::mock_preference( 'RefundLostOnReturnControl', 'ItemHomeBranch' );
469 is( Koha::CirculationRules->get_lostreturn_policy( $params ),
470 1,'Specific rule for home branch is applied (true)');
472 t::lib::Mocks::mock_preference( 'RefundLostOnReturnControl', 'ItemHoldingBranch' );
473 is( Koha::CirculationRules->get_lostreturn_policy( $params ),
474 0,'Specific rule for holoding branch is applied (false)');
477 t::lib::Mocks::mock_preference( 'RefundLostOnReturnControl', 'CheckinLibrary' );
478 $params->{return_branch} = $branch_without_rule;
479 is( Koha::CirculationRules->get_lostreturn_policy( $params ),
480 1,'No rule for branch, global rule applied (true)');
482 # Change the default value just to try
483 Koha::CirculationRules->search({ branchcode => undef, rule_name => 'refund' })->next->rule_value(0)->store;
484 is( Koha::CirculationRules->get_lostreturn_policy( $params ),
485 0,'No rule for branch, global rule applied (false)');
487 # No default rule defined check
488 Koha::CirculationRules
492 categorycode => undef,
494 rule_name => 'refund'
499 is( Koha::CirculationRules->get_lostreturn_policy( $params ),
500 1,'No rule for branch, no default rule, fallback default (true)');
502 $schema->storage->txn_rollback;