Bug 18936: Convert issuingrules fields to circulation_rules
[koha.git] / t / db_dependent / Circulation / CalcFine.t
1 #!/usr/bin/perl
2
3 use Modern::Perl;
4
5 use Test::More tests => 3;
6
7 use C4::Context;
8 use C4::Overdues;
9
10 use Koha::DateUtils qw( dt_from_string );
11
12 use t::lib::TestBuilder;
13 use t::lib::Mocks;
14
15 my $schema = Koha::Database->schema;
16 $schema->storage->txn_begin;
17
18 our $dbh = C4::Context->dbh;
19 $dbh->do(q|DELETE FROM issues|);
20
21 t::lib::Mocks::mock_preference('item-level_itypes', '1');
22
23 my $builder = t::lib::TestBuilder->new();
24
25 my $branch = $builder->build(
26     {
27         source => 'Branch',
28     }
29 );
30
31 my $category = $builder->build(
32     {
33         source => 'Category',
34     }
35 );
36
37 my $patron = $builder->build(
38     {
39         source => 'Borrower',
40         value  => {
41             categorycode => $category->{categorycode},
42             branchcode   => $branch->{branchcode},
43         },
44     }
45 );
46
47 my $biblio = $builder->build(
48     {
49         source => 'Biblio',
50         value  => {
51             branchcode => $branch->{branchcode},
52         },
53     }
54 );
55
56 my $itemtype = $builder->build(
57     {
58         source => 'Itemtype',
59         value => {
60             defaultreplacecost => 6,
61         },
62     }
63 );
64
65 my $item = $builder->build(
66     {
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},
74         },
75     }
76 );
77
78 subtest 'Test basic functionality' => sub {
79     plan tests => 1;
80
81     Koha::CirculationRules->set_rules(
82         {
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,
94             }
95         },
96     );
97
98     my $start_dt = DateTime->new(
99         year       => 2000,
100         month      => 1,
101         day        => 1,
102     );
103
104     my $end_dt = DateTime->new(
105         year       => 2000,
106         month      => 1,
107         day        => 30,
108     );
109
110     my ($amount) = CalcFine( $item, $patron->{categorycode}, $branch->{branchcode}, $start_dt, $end_dt );
111
112     is( $amount, 29, 'Amount is calculated correctly' );
113
114     teardown();
115 };
116
117 subtest 'Test cap_fine_to_replacement_price' => sub {
118     plan tests => 2;
119
120     t::lib::Mocks::mock_preference('useDefaultReplacementCost', '1');
121     Koha::CirculationRules->set_rules(
122         {
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,
134             },
135         }
136     );
137
138     my $start_dt = DateTime->new(
139         year       => 2000,
140         month      => 1,
141         day        => 1,
142     );
143
144     my $end_dt = DateTime->new(
145         year       => 2000,
146         month      => 1,
147         day        => 30,
148     );
149
150     my ($amount) = CalcFine( $item, $patron->{categorycode}, $branch->{branchcode}, $start_dt, $end_dt );
151
152     is( int($amount), 5, 'Amount is calculated correctly' );
153
154
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' );
160
161     teardown();
162 };
163
164 subtest 'Test cap_fine_to_replacement_pricew with overduefinescap' => sub {
165     plan tests => 2;
166
167     t::lib::Mocks::mock_preference('useDefaultReplacementCost', '1');
168     my $issuingrule = $builder->build_object(
169         {
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,
182             },
183         }
184     );
185
186     my $start_dt = DateTime->new(
187         year       => 2000,
188         month      => 1,
189         day        => 1,
190     );
191
192     my $end_dt = DateTime->new(
193         year       => 2000,
194         month      => 1,
195         day        => 30,
196     );
197
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' );
200
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' );
204
205     teardown();
206 };
207
208 sub teardown {
209     $dbh->do(q|DELETE FROM circulation_rules|);
210 }