Bug 18936: Convert issuingrules fields to circulation_rules
[koha.git] / t / db_dependent / Circulation / CalcFine.t
blobdaff962ed6abeefd80fe11ed23bf1140c88951cd
1 #!/usr/bin/perl
3 use Modern::Perl;
5 use Test::More tests => 3;
7 use C4::Context;
8 use C4::Overdues;
10 use Koha::DateUtils qw( dt_from_string );
12 use t::lib::TestBuilder;
13 use t::lib::Mocks;
15 my $schema = Koha::Database->schema;
16 $schema->storage->txn_begin;
18 our $dbh = C4::Context->dbh;
19 $dbh->do(q|DELETE FROM issues|);
21 t::lib::Mocks::mock_preference('item-level_itypes', '1');
23 my $builder = t::lib::TestBuilder->new();
25 my $branch = $builder->build(
27 source => 'Branch',
31 my $category = $builder->build(
33 source => 'Category',
37 my $patron = $builder->build(
39 source => 'Borrower',
40 value => {
41 categorycode => $category->{categorycode},
42 branchcode => $branch->{branchcode},
47 my $biblio = $builder->build(
49 source => 'Biblio',
50 value => {
51 branchcode => $branch->{branchcode},
56 my $itemtype = $builder->build(
58 source => 'Itemtype',
59 value => {
60 defaultreplacecost => 6,
65 my $item = $builder->build(
67 source => 'Item',
68 value => {
69 biblionumber => $biblio->{biblionumber},
70 homebranch => $branch->{branchcode},
71 holdingbranch => $branch->{branchcode},
72 replacementprice => '5.00',
73 itype => $itemtype->{itemtype},
78 subtest 'Test basic functionality' => sub {
79 plan tests => 1;
81 Koha::CirculationRules->set_rules(
83 branchcode => '*',
84 categorycode => '*',
85 itemtype => '*',
86 rules => {
87 fine => '1.00',
88 lengthunit => 'days',
89 finedays => 0,
90 firstremind => 0,
91 chargeperiod => 1,
92 overduefinescap => undef,
93 cap_fine_to_replacement_price => 0,
98 my $start_dt = DateTime->new(
99 year => 2000,
100 month => 1,
101 day => 1,
104 my $end_dt = DateTime->new(
105 year => 2000,
106 month => 1,
107 day => 30,
110 my ($amount) = CalcFine( $item, $patron->{categorycode}, $branch->{branchcode}, $start_dt, $end_dt );
112 is( $amount, 29, 'Amount is calculated correctly' );
114 teardown();
117 subtest 'Test cap_fine_to_replacement_price' => sub {
118 plan tests => 2;
120 t::lib::Mocks::mock_preference('useDefaultReplacementCost', '1');
121 Koha::CirculationRules->set_rules(
123 branchcode => '*',
124 categorycode => '*',
125 itemtype => '*',
126 rules => {
127 fine => '1.00',
128 lengthunit => 'days',
129 finedays => 0,
130 firstremind => 0,
131 chargeperiod => 1,
132 overduefinescap => undef,
133 cap_fine_to_replacement_price => 1,
138 my $start_dt = DateTime->new(
139 year => 2000,
140 month => 1,
141 day => 1,
144 my $end_dt = DateTime->new(
145 year => 2000,
146 month => 1,
147 day => 30,
150 my ($amount) = CalcFine( $item, $patron->{categorycode}, $branch->{branchcode}, $start_dt, $end_dt );
152 is( int($amount), 5, 'Amount is calculated correctly' );
155 # Use default replacement cost (useDefaultReplacementCost) is item's replacement price is 0
156 my $item_obj = Koha::Items->find($item->{itemnumber});
157 $item_obj->replacementprice(0)->store;
158 ($amount) = CalcFine( $item_obj->unblessed, $patron->{categorycode}, $branch->{branchcode}, $start_dt, $end_dt );
159 is( int($amount), 6, 'Amount is calculated correctly' );
161 teardown();
164 subtest 'Test cap_fine_to_replacement_pricew with overduefinescap' => sub {
165 plan tests => 2;
167 t::lib::Mocks::mock_preference('useDefaultReplacementCost', '1');
168 my $issuingrule = $builder->build_object(
170 class => 'Koha::IssuingRules',
171 value => {
172 branchcode => '*',
173 categorycode => '*',
174 itemtype => '*',
175 fine => '1.00',
176 lengthunit => 'days',
177 finedays => 0,
178 firstremind => 0,
179 chargeperiod => 1,
180 overduefinescap => 3,
181 cap_fine_to_replacement_price => 1,
186 my $start_dt = DateTime->new(
187 year => 2000,
188 month => 1,
189 day => 1,
192 my $end_dt = DateTime->new(
193 year => 2000,
194 month => 1,
195 day => 30,
198 my ($amount) = CalcFine( $item, $patron->{categorycode}, $branch->{branchcode}, $start_dt, $end_dt );
199 is( int($amount), 3, 'Got the lesser of overduefinescap and replacement price where overduefinescap < replacement price' );
201 $issuingrule->overduefinescap(6)->store();
202 ($amount) = CalcFine( $item, $patron->{categorycode}, $branch->{branchcode}, $start_dt, $end_dt );
203 is( int($amount), 5, 'Get the lesser of overduefinescap and replacement price where overduefinescap > replacement price' );
205 teardown();
208 sub teardown {
209 $dbh->do(q|DELETE FROM circulation_rules|);