View | Details | Raw Unified | Return to bug 22547
Collapse All | Expand All

(-)a/t/db_dependent/Overdues.t (-2 / +185 lines)
Lines 1-16 Link Here
1
#!/usr/bin/perl;
1
#!/usr/bin/perl;
2
2
3
use Modern::Perl;
3
use Modern::Perl;
4
use Test::More tests => 16;
4
use Test::More tests => 17;
5
5
6
use C4::Context;
6
use C4::Context;
7
use Koha::Database;
7
use Koha::Database;
8
use Koha::Libraries;
8
use Koha::Libraries;
9
10
use t::lib::Mocks;
11
use t::lib::TestBuilder;
12
9
use_ok('C4::Overdues');
13
use_ok('C4::Overdues');
10
can_ok('C4::Overdues', 'GetOverdueMessageTransportTypes');
14
can_ok('C4::Overdues', 'GetOverdueMessageTransportTypes');
11
can_ok('C4::Overdues', 'GetBranchcodesWithOverdueRules');
15
can_ok('C4::Overdues', 'GetBranchcodesWithOverdueRules');
12
16
13
my $schema = Koha::Database->new->schema;
17
my $schema = Koha::Database->new->schema;
18
my $builder = t::lib::TestBuilder->new;
19
14
$schema->storage->txn_begin;
20
$schema->storage->txn_begin;
15
my $dbh = C4::Context->dbh;
21
my $dbh = C4::Context->dbh;
16
22
Lines 121-123 $dbh->do(q| Link Here
121
127
122
@overdue_branches = C4::Overdues::GetBranchcodesWithOverdueRules();
128
@overdue_branches = C4::Overdues::GetBranchcodesWithOverdueRules();
123
is_deeply( \@overdue_branches, ['CPL', 'MPL'] , 'If only 2 specific rules exist, 2 branches should be returned' );
129
is_deeply( \@overdue_branches, ['CPL', 'MPL'] , 'If only 2 specific rules exist, 2 branches should be returned' );
124
- 
130
131
$schema->storage->txn_rollback;
132
133
subtest 'UpdateFine tests' => sub {
134
135
    plan tests => 25;
136
137
    $schema->storage->txn_begin;
138
139
    t::lib::Mocks::mock_preference( 'MaxFine', '100' );
140
141
    my $patron    = $builder->build_object( { class => 'Koha::Patrons' } );
142
    my $item1     = $builder->build_sample_item();
143
    my $item2     = $builder->build_sample_item();
144
    my $checkout1 = $builder->build_object(
145
        {
146
            class => 'Koha::Checkouts',
147
            value => { itemnumber => $item1->itemnumber }
148
        }
149
    );
150
    my $checkout2 = $builder->build_object(
151
        {
152
            class => 'Koha::Checkouts',
153
            value => { itemnumber => $item2->itemnumber }
154
        }
155
    );
156
157
    # Try to add 0 amount fine
158
    UpdateFine(
159
        {
160
            issue_id       => $checkout1->issue_id,
161
            itemnumber     => $item1->itemnumber,
162
            borrowernumber => $patron->borrowernumber,
163
            amount         => '0',
164
            due            => $checkout1->date_due
165
        }
166
    );
167
168
    my $fines = Koha::Account::Lines->search(
169
        { borrowernumber => $patron->borrowernumber } );
170
    is( $fines->count, 0, "No fine added when amount is 0" );
171
172
    # Add fine 1
173
    UpdateFine(
174
        {
175
            issue_id       => $checkout1->issue_id,
176
            itemnumber     => $item1->itemnumber,
177
            borrowernumber => $patron->borrowernumber,
178
            amount         => '50',
179
            due            => $checkout1->date_due
180
        }
181
    );
182
183
    $fines = Koha::Account::Lines->search(
184
        { borrowernumber => $patron->borrowernumber } );
185
    is( $fines->count, 1, "Fine added when amount is greater than 0" );
186
    my $fine = $fines->next;
187
    is( $fine->amount, '50.000000', "Fine amount correctly set to 50" );
188
    is( $fine->issue_id, $checkout1->issue_id, "Fine is associated with the correct issue" );
189
    is( $fine->itemnumber, $checkout1->itemnumber, "Fine is associated with the correct item" );
190
191
    # Increase fine 1
192
    UpdateFine(
193
        {
194
            issue_id       => $checkout1->issue_id,
195
            itemnumber     => $item1->itemnumber,
196
            borrowernumber => $patron->borrowernumber,
197
            amount         => '80',
198
            due            => $checkout1->date_due
199
        }
200
    );
201
202
    $fines = Koha::Account::Lines->search(
203
        { borrowernumber => $patron->borrowernumber } );
204
    is( $fines->count, 1, "Existing fine updated" );
205
    $fine = $fines->next;
206
    is( $fine->amount, '80.000000', "Fine amount correctly updated to 80" );
207
208
    # Add fine 2
209
    UpdateFine(
210
        {
211
            issue_id       => $checkout2->issue_id,
212
            itemnumber     => $item2->itemnumber,
213
            borrowernumber => $patron->borrowernumber,
214
            amount         => '30',
215
            due            => $checkout2->date_due
216
        }
217
    );
218
219
    $fines = Koha::Account::Lines->search(
220
        { borrowernumber => $patron->borrowernumber },
221
        { order_by       => { '-asc' => 'accountlines_id' } }
222
    );
223
    is( $fines->count,        2,    "New fine added for second checkout" );
224
    $fine = $fines->next;
225
    is( $fine->amount, '80.000000', "First fine amount unchanged" );
226
    my $fine2 = $fines->next;
227
    is( $fine2->amount, '20.000000', "Second fine capped at '20' by MaxFine" );
228
    is( $fine2->issue_id, $checkout2->issue_id, "Second fine is associated with the correct issue" );
229
    is( $fine2->itemnumber, $checkout2->itemnumber, "Second fine is associated with the correct item" );
230
231
    # Partial pay fine 1
232
    $fine->amountoutstanding('50')->store;
233
    UpdateFine(
234
        {
235
            issue_id       => $checkout2->issue_id,
236
            itemnumber     => $item2->itemnumber,
237
            borrowernumber => $patron->borrowernumber,
238
            amount         => '30',
239
            due            => $checkout2->date_due
240
        }
241
    );
242
243
    $fines = Koha::Account::Lines->search(
244
        { borrowernumber => $patron->borrowernumber },
245
        { order_by       => { '-asc' => 'accountlines_id' } }
246
    );
247
    is( $fines->count,        2,    "Still two fines after second checkout update" );
248
    $fine = $fines->next;
249
    is( $fine->amount, '80.000000', "First fine amount unchanged" );
250
    $fine2 = $fines->next;
251
    is( $fine2->amount, '30.000000', "Second fine increased after partial payment of first" );
252
253
    # Fix fine 1, create third fine
254
    $fine->accounttype('F')->store;
255
    UpdateFine(
256
        {
257
            issue_id       => $checkout1->issue_id,
258
            itemnumber     => $item1->itemnumber,
259
            borrowernumber => $patron->borrowernumber,
260
            amount         => '30',
261
            due            => $checkout1->date_due
262
        }
263
    );
264
265
    $fines = Koha::Account::Lines->search(
266
        { borrowernumber => $patron->borrowernumber },
267
        { order_by       => { '-asc' => 'accountlines_id' } }
268
    );
269
    is( $fines->count,        3,    "Third fine added for overdue renewal" );
270
    $fine = $fines->next;
271
    is( $fine->amount, '80.000000', "First fine amount unchanged" );
272
    $fine2 = $fines->next;
273
    is( $fine2->amount, '30.000000', "Second fine amount unchanged" );
274
    my $fine3 = $fines->next;
275
    is( $fine3->amount, '20.000000', "Third fine amount capped due to MaxFine" );
276
    is( $fine3->issue_id, $checkout1->issue_id, "Third fine is associated with the correct issue" );
277
    is( $fine3->itemnumber, $checkout1->itemnumber, "Third fine is associated with the correct item" );
278
279
    # FIXME: Add test to check whether sundry/manual charges are included within MaxFine.
280
    # FIXME: Add test to ensure other charges are not included within MaxFine.
281
282
    # Disable MaxFine
283
    t::lib::Mocks::mock_preference( 'MaxFine', '0' );
284
    UpdateFine(
285
        {
286
            issue_id       => $checkout1->issue_id,
287
            itemnumber     => $item1->itemnumber,
288
            borrowernumber => $patron->borrowernumber,
289
            amount         => '30',
290
            due            => $checkout1->date_due
291
        }
292
    );
293
294
    $fines = Koha::Account::Lines->search(
295
        { borrowernumber => $patron->borrowernumber },
296
        { order_by       => { '-asc' => 'accountlines_id' } }
297
    );
298
    is( $fines->count,        3,    "Still only three fines after MaxFine cap removed" );
299
    $fine = $fines->next;
300
    is( $fine->amount, '80.000000', "First fine amount unchanged" );
301
    $fine2 = $fines->next;
302
    is( $fine2->amount, '30.000000', "Second fine amount unchanged" );
303
    $fine3 = $fines->next;
304
    is( $fine3->amount, '30.000000', "Third fine increased now MaxFine cap is disabled" );
305
306
    $schema->storage->txn_rollback;
307
};

Return to bug 22547