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

(-)a/t/db_dependent/Circulation.t (-276 / +222 lines)
Lines 223-270 ok( $new_count == $original_count + 1, 'ProcessOfflinePayment makes payment cor Link Here
223
C4::Context->dbh->do("DELETE FROM accountlines WHERE borrowernumber IN ( SELECT borrowernumber FROM borrowers WHERE cardnumber = '99999999999' )");
223
C4::Context->dbh->do("DELETE FROM accountlines WHERE borrowernumber IN ( SELECT borrowernumber FROM borrowers WHERE cardnumber = '99999999999' )");
224
C4::Context->dbh->do("DELETE FROM borrowers WHERE cardnumber = '99999999999'");
224
C4::Context->dbh->do("DELETE FROM borrowers WHERE cardnumber = '99999999999'");
225
C4::Context->dbh->do("DELETE FROM accountlines");
225
C4::Context->dbh->do("DELETE FROM accountlines");
226
my ( $reused_itemnumber_1, $reused_itemnumber_2 );
226
{
227
{
227
# CanBookBeRenewed tests
228
# CanBookBeRenewed tests
228
    C4::Context->set_preference('ItemsDeniedRenewal','');
229
    C4::Context->set_preference('ItemsDeniedRenewal','');
229
    # Generate test biblio
230
    # Generate test biblio
230
    my $biblio = $builder->gimme_a_biblio();
231
    my $biblio = $builder->gimme_a_biblio();
231
232
232
    my $barcode = 'R00000342';
233
    my $branch = $library2->{branchcode};
233
    my $branch = $library2->{branchcode};
234
234
235
    my ( $item_bibnum, $item_bibitemnum, $itemnumber ) = AddItem(
235
    my $item_1 = $builder->gimme_an_item(
236
        {
236
        {
237
            homebranch       => $branch,
237
            biblionumber     => $biblio->biblionumber,
238
            holdingbranch    => $branch,
238
            library          => $branch,
239
            barcode          => $barcode,
240
            replacementprice => 12.00,
239
            replacementprice => 12.00,
241
            itype            => $itemtype
240
            itype            => $itemtype,
242
        },
241
        }
243
        $biblio->biblionumber
244
    );
242
    );
243
    $reused_itemnumber_1 = $item_1->itemnumber;
245
244
246
    my $barcode2 = 'R00000343';
245
    my $item_2 = $builder->gimme_an_item(
247
    my ( $item_bibnum2, $item_bibitemnum2, $itemnumber2 ) = AddItem(
248
        {
246
        {
249
            homebranch       => $branch,
247
            biblionumber     => $biblio->biblionumber,
250
            holdingbranch    => $branch,
248
            library          => $branch,
251
            barcode          => $barcode2,
252
            replacementprice => 23.00,
249
            replacementprice => 23.00,
253
            itype            => $itemtype
250
            itype            => $itemtype,
254
        },
251
        }
255
        $biblio->biblionumber
256
    );
252
    );
253
    $reused_itemnumber_2 = $item_2->itemnumber;
257
254
258
    my $barcode3 = 'R00000346';
255
    my $item_3 = $builder->gimme_an_item(
259
    my ( $item_bibnum3, $item_bibitemnum3, $itemnumber3 ) = AddItem(
260
        {
256
        {
261
            homebranch       => $branch,
257
            biblionumber     => $biblio->biblionumber,
262
            holdingbranch    => $branch,
258
            library          => $branch,
263
            barcode          => $barcode3,
264
            replacementprice => 23.00,
259
            replacementprice => 23.00,
265
            itype            => $itemtype
260
            itype            => $itemtype,
266
        },
261
        }
267
        $biblio->biblionumber
268
    );
262
    );
269
263
270
    # Create borrowers
264
    # Create borrowers
Lines 323-341 C4::Context->dbh->do("DELETE FROM accountlines"); Link Here
323
    my $checkitem      = undef;
317
    my $checkitem      = undef;
324
    my $found          = undef;
318
    my $found          = undef;
325
319
326
    my $issue = AddIssue( $renewing_borrower, $barcode);
320
    my $issue = AddIssue( $renewing_borrower, $item_1->barcode);
327
    my $datedue = dt_from_string( $issue->date_due() );
321
    my $datedue = dt_from_string( $issue->date_due() );
328
    is (defined $issue->date_due(), 1, "Item 1 checked out, due date: " . $issue->date_due() );
322
    is (defined $issue->date_due(), 1, "Item 1 checked out, due date: " . $issue->date_due() );
329
323
330
    my $issue2 = AddIssue( $renewing_borrower, $barcode2);
324
    my $issue2 = AddIssue( $renewing_borrower, $item_2->barcode);
331
    $datedue = dt_from_string( $issue->date_due() );
325
    $datedue = dt_from_string( $issue->date_due() );
332
    is (defined $issue2, 1, "Item 2 checked out, due date: " . $issue2->date_due());
326
    is (defined $issue2, 1, "Item 2 checked out, due date: " . $issue2->date_due());
333
327
334
328
335
    my $borrowing_borrowernumber = Koha::Checkouts->find( { itemnumber => $itemnumber } )->borrowernumber;
329
    my $borrowing_borrowernumber = Koha::Checkouts->find( { itemnumber => $item_1->itemnumber } )->borrowernumber;
336
    is ($borrowing_borrowernumber, $renewing_borrowernumber, "Item checked out to $renewing_borrower->{firstname} $renewing_borrower->{surname}");
330
    is ($borrowing_borrowernumber, $renewing_borrowernumber, "Item checked out to $renewing_borrower->{firstname} $renewing_borrower->{surname}");
337
331
338
    my ( $renewokay, $error ) = CanBookBeRenewed($renewing_borrowernumber, $itemnumber, 1);
332
    my ( $renewokay, $error ) = CanBookBeRenewed($renewing_borrowernumber, $item_1->itemnumber, 1);
339
    is( $renewokay, 1, 'Can renew, no holds for this title or item');
333
    is( $renewokay, 1, 'Can renew, no holds for this title or item');
340
334
341
335
Lines 349-357 C4::Context->dbh->do("DELETE FROM accountlines"); Link Here
349
    # Testing of feature to allow the renewal of reserved items if other items on the record can fill all needed holds
343
    # Testing of feature to allow the renewal of reserved items if other items on the record can fill all needed holds
350
    C4::Context->dbh->do("UPDATE issuingrules SET onshelfholds = 1");
344
    C4::Context->dbh->do("UPDATE issuingrules SET onshelfholds = 1");
351
    t::lib::Mocks::mock_preference('AllowRenewalIfOtherItemsAvailable', 1 );
345
    t::lib::Mocks::mock_preference('AllowRenewalIfOtherItemsAvailable', 1 );
352
    ( $renewokay, $error ) = CanBookBeRenewed($renewing_borrowernumber, $itemnumber);
346
    ( $renewokay, $error ) = CanBookBeRenewed($renewing_borrowernumber, $item_1->itemnumber);
353
    is( $renewokay, 1, 'Bug 11634 - Allow renewal of item with unfilled holds if other available items can fill those holds');
347
    is( $renewokay, 1, 'Bug 11634 - Allow renewal of item with unfilled holds if other available items can fill those holds');
354
    ( $renewokay, $error ) = CanBookBeRenewed($renewing_borrowernumber, $itemnumber2);
348
    ( $renewokay, $error ) = CanBookBeRenewed($renewing_borrowernumber, $item_2->itemnumber);
355
    is( $renewokay, 1, 'Bug 11634 - Allow renewal of item with unfilled holds if other available items can fill those holds');
349
    is( $renewokay, 1, 'Bug 11634 - Allow renewal of item with unfilled holds if other available items can fill those holds');
356
350
357
    # Now let's add an item level hold, we should no longer be able to renew the item
351
    # Now let's add an item level hold, we should no longer be able to renew the item
Lines 359-370 C4::Context->dbh->do("DELETE FROM accountlines"); Link Here
359
        {
353
        {
360
            borrowernumber => $hold_waiting_borrowernumber,
354
            borrowernumber => $hold_waiting_borrowernumber,
361
            biblionumber   => $biblio->biblionumber,
355
            biblionumber   => $biblio->biblionumber,
362
            itemnumber     => $itemnumber,
356
            itemnumber     => $item_1->itemnumber,
363
            branchcode     => $branch,
357
            branchcode     => $branch,
364
            priority       => 3,
358
            priority       => 3,
365
        }
359
        }
366
    );
360
    );
367
    ( $renewokay, $error ) = CanBookBeRenewed($renewing_borrowernumber, $itemnumber);
361
    ( $renewokay, $error ) = CanBookBeRenewed($renewing_borrowernumber, $item_1->itemnumber);
368
    is( $renewokay, 0, 'Bug 13919 - Renewal possible with item level hold on item');
362
    is( $renewokay, 0, 'Bug 13919 - Renewal possible with item level hold on item');
369
    $hold->delete();
363
    $hold->delete();
370
364
Lines 374-402 C4::Context->dbh->do("DELETE FROM accountlines"); Link Here
374
        {
368
        {
375
            borrowernumber => $hold_waiting_borrowernumber,
369
            borrowernumber => $hold_waiting_borrowernumber,
376
            biblionumber   => $biblio->biblionumber,
370
            biblionumber   => $biblio->biblionumber,
377
            itemnumber     => $itemnumber3,
371
            itemnumber     => $item_3->itemnumber,
378
            branchcode     => $branch,
372
            branchcode     => $branch,
379
            priority       => 0,
373
            priority       => 0,
380
            found          => 'W'
374
            found          => 'W'
381
        }
375
        }
382
    );
376
    );
383
    ( $renewokay, $error ) = CanBookBeRenewed($renewing_borrowernumber, $itemnumber);
377
    ( $renewokay, $error ) = CanBookBeRenewed($renewing_borrowernumber, $item_1->itemnumber);
384
    is( $renewokay, 0, 'Bug 11634 - Allow renewal of item with unfilled holds if other available items can fill those holds');
378
    is( $renewokay, 0, 'Bug 11634 - Allow renewal of item with unfilled holds if other available items can fill those holds');
385
    ( $renewokay, $error ) = CanBookBeRenewed($renewing_borrowernumber, $itemnumber2);
379
    ( $renewokay, $error ) = CanBookBeRenewed($renewing_borrowernumber, $item_2->itemnumber);
386
    is( $renewokay, 0, 'Bug 11634 - Allow renewal of item with unfilled holds if other available items can fill those holds');
380
    is( $renewokay, 0, 'Bug 11634 - Allow renewal of item with unfilled holds if other available items can fill those holds');
387
    t::lib::Mocks::mock_preference('AllowRenewalIfOtherItemsAvailable', 0 );
381
    t::lib::Mocks::mock_preference('AllowRenewalIfOtherItemsAvailable', 0 );
388
382
389
    ( $renewokay, $error ) = CanBookBeRenewed($renewing_borrowernumber, $itemnumber);
383
    ( $renewokay, $error ) = CanBookBeRenewed($renewing_borrowernumber, $item_1->itemnumber);
390
    is( $renewokay, 0, '(Bug 10663) Cannot renew, reserved');
384
    is( $renewokay, 0, '(Bug 10663) Cannot renew, reserved');
391
    is( $error, 'on_reserve', '(Bug 10663) Cannot renew, reserved (returned error is on_reserve)');
385
    is( $error, 'on_reserve', '(Bug 10663) Cannot renew, reserved (returned error is on_reserve)');
392
386
393
    ( $renewokay, $error ) = CanBookBeRenewed($renewing_borrowernumber, $itemnumber2);
387
    ( $renewokay, $error ) = CanBookBeRenewed($renewing_borrowernumber, $item_2->itemnumber);
394
    is( $renewokay, 0, '(Bug 10663) Cannot renew, reserved');
388
    is( $renewokay, 0, '(Bug 10663) Cannot renew, reserved');
395
    is( $error, 'on_reserve', '(Bug 10663) Cannot renew, reserved (returned error is on_reserve)');
389
    is( $error, 'on_reserve', '(Bug 10663) Cannot renew, reserved (returned error is on_reserve)');
396
390
397
    my $reserveid = Koha::Holds->search({ biblionumber => $biblio->biblionumber, borrowernumber => $reserving_borrowernumber })->next->reserve_id;
391
    my $reserveid = Koha::Holds->search({ biblionumber => $biblio->biblionumber, borrowernumber => $reserving_borrowernumber })->next->reserve_id;
398
    my $reserving_borrower = Koha::Patrons->find( $reserving_borrowernumber )->unblessed;
392
    my $reserving_borrower = Koha::Patrons->find( $reserving_borrowernumber )->unblessed;
399
    AddIssue($reserving_borrower, $barcode3);
393
    AddIssue($reserving_borrower, $item_3->barcode);
400
    my $reserve = $dbh->selectrow_hashref(
394
    my $reserve = $dbh->selectrow_hashref(
401
        'SELECT * FROM old_reserves WHERE reserve_id = ?',
395
        'SELECT * FROM old_reserves WHERE reserve_id = ?',
402
        { Slice => {} },
396
        { Slice => {} },
Lines 408-477 C4::Context->dbh->do("DELETE FROM accountlines"); Link Here
408
    AddReserve(
402
    AddReserve(
409
        $branch, $reserving_borrowernumber, $biblio->biblionumber,
403
        $branch, $reserving_borrowernumber, $biblio->biblionumber,
410
        $bibitems,  $priority, $resdate, $expdate, $notes,
404
        $bibitems,  $priority, $resdate, $expdate, $notes,
411
        'a title', $itemnumber, $found
405
        'a title', $item_1->itemnumber, $found
412
    );
406
    );
413
407
414
    ( $renewokay, $error ) = CanBookBeRenewed($renewing_borrowernumber, $itemnumber, 1);
408
    ( $renewokay, $error ) = CanBookBeRenewed($renewing_borrowernumber, $item_1->itemnumber, 1);
415
    is( $renewokay, 0, '(Bug 10663) Cannot renew, item reserved');
409
    is( $renewokay, 0, '(Bug 10663) Cannot renew, item reserved');
416
    is( $error, 'on_reserve', '(Bug 10663) Cannot renew, item reserved (returned error is on_reserve)');
410
    is( $error, 'on_reserve', '(Bug 10663) Cannot renew, item reserved (returned error is on_reserve)');
417
411
418
    ( $renewokay, $error ) = CanBookBeRenewed($renewing_borrowernumber, $itemnumber2, 1);
412
    ( $renewokay, $error ) = CanBookBeRenewed($renewing_borrowernumber, $item_2->itemnumber, 1);
419
    is( $renewokay, 1, 'Can renew item 2, item-level hold is on item 1');
413
    is( $renewokay, 1, 'Can renew item 2, item-level hold is on item 1');
420
414
421
    # Items can't fill hold for reasons
415
    # Items can't fill hold for reasons
422
    ModItem({ notforloan => 1 }, $biblio->biblionumber, $itemnumber);
416
    ModItem({ notforloan => 1 }, $biblio->biblionumber, $item_1->itemnumber);
423
    ( $renewokay, $error ) = CanBookBeRenewed($renewing_borrowernumber, $itemnumber, 1);
417
    ( $renewokay, $error ) = CanBookBeRenewed($renewing_borrowernumber, $item_1->itemnumber, 1);
424
    is( $renewokay, 1, 'Can renew, item is marked not for loan, hold does not block');
418
    is( $renewokay, 1, 'Can renew, item is marked not for loan, hold does not block');
425
    ModItem({ notforloan => 0, itype => $itemtype }, $biblio->biblionumber, $itemnumber);
419
    ModItem({ notforloan => 0, itype => $itemtype }, $biblio->biblionumber, $item_1->itemnumber);
426
420
427
    # FIXME: Add more for itemtype not for loan etc.
421
    # FIXME: Add more for itemtype not for loan etc.
428
422
429
    # Restricted users cannot renew when RestrictionBlockRenewing is enabled
423
    # Restricted users cannot renew when RestrictionBlockRenewing is enabled
430
    my $barcode5 = 'R00000347';
424
    my $item_5 = $builder->gimme_an_item(
431
    my ( $item_bibnum5, $item_bibitemnum5, $itemnumber5 ) = AddItem(
432
        {
425
        {
433
            homebranch       => $branch,
426
            biblionumber     => $biblio->biblionumber,
434
            holdingbranch    => $branch,
427
            library          => $branch,
435
            barcode          => $barcode5,
436
            replacementprice => 23.00,
428
            replacementprice => 23.00,
437
            itype            => $itemtype
429
            itype            => $itemtype,
438
        },
430
        }
439
        $biblio->biblionumber
440
    );
431
    );
441
    my $datedue5 = AddIssue($restricted_borrower, $barcode5);
432
    my $datedue5 = AddIssue($restricted_borrower, $item_5->barcode);
442
    is (defined $datedue5, 1, "Item with date due checked out, due date: $datedue5");
433
    is (defined $datedue5, 1, "Item with date due checked out, due date: $datedue5");
443
434
444
    t::lib::Mocks::mock_preference('RestrictionBlockRenewing','1');
435
    t::lib::Mocks::mock_preference('RestrictionBlockRenewing','1');
445
    ( $renewokay, $error ) = CanBookBeRenewed($renewing_borrowernumber, $itemnumber2);
436
    ( $renewokay, $error ) = CanBookBeRenewed($renewing_borrowernumber, $item_2->itemnumber);
446
    is( $renewokay, 1, '(Bug 8236), Can renew, user is not restricted');
437
    is( $renewokay, 1, '(Bug 8236), Can renew, user is not restricted');
447
    ( $renewokay, $error ) = CanBookBeRenewed($restricted_borrowernumber, $itemnumber5);
438
    ( $renewokay, $error ) = CanBookBeRenewed($restricted_borrowernumber, $item_5->itemnumber);
448
    is( $renewokay, 0, '(Bug 8236), Cannot renew, user is restricted');
439
    is( $renewokay, 0, '(Bug 8236), Cannot renew, user is restricted');
449
440
450
    # Users cannot renew an overdue item
441
    # Users cannot renew an overdue item
451
    my $barcode6 = 'R00000348';
442
    my $item_6 = $builder->gimme_an_item(
452
    my ( $item_bibnum6, $item_bibitemnum6, $itemnumber6 ) = AddItem(
453
        {
443
        {
454
            homebranch       => $branch,
444
            biblionumber     => $biblio->biblionumber,
455
            holdingbranch    => $branch,
445
            library          => $branch,
456
            barcode          => $barcode6,
457
            replacementprice => 23.00,
446
            replacementprice => 23.00,
458
            itype            => $itemtype
447
            itype            => $itemtype,
459
        },
448
        }
460
        $biblio->biblionumber
461
    );
449
    );
462
450
463
    my $barcode7 = 'R00000349';
451
    my $item_7 = $builder->gimme_an_item(
464
    my ( $item_bibnum7, $item_bibitemnum7, $itemnumber7 ) = AddItem(
465
        {
452
        {
466
            homebranch       => $branch,
453
            biblionumber     => $biblio->biblionumber,
467
            holdingbranch    => $branch,
454
            library          => $branch,
468
            barcode          => $barcode7,
469
            replacementprice => 23.00,
455
            replacementprice => 23.00,
470
            itype            => $itemtype
456
            itype            => $itemtype,
471
        },
457
        }
472
        $biblio->biblionumber
473
    );
458
    );
474
    my $datedue6 = AddIssue( $renewing_borrower, $barcode6);
459
460
    my $datedue6 = AddIssue( $renewing_borrower, $item_6->barcode);
475
    is (defined $datedue6, 1, "Item 2 checked out, due date: ".$datedue6->date_due);
461
    is (defined $datedue6, 1, "Item 2 checked out, due date: ".$datedue6->date_due);
476
462
477
    my $now = dt_from_string();
463
    my $now = dt_from_string();
Lines 479-492 C4::Context->dbh->do("DELETE FROM accountlines"); Link Here
479
    my $five_weeks_ago = $now - $five_weeks;
465
    my $five_weeks_ago = $now - $five_weeks;
480
    t::lib::Mocks::mock_preference('finesMode', 'production');
466
    t::lib::Mocks::mock_preference('finesMode', 'production');
481
467
482
    my $passeddatedue1 = AddIssue($renewing_borrower, $barcode7, $five_weeks_ago);
468
    my $passeddatedue1 = AddIssue($renewing_borrower, $item_7->barcode, $five_weeks_ago);
483
    is (defined $passeddatedue1, 1, "Item with passed date due checked out, due date: " . $passeddatedue1->date_due);
469
    is (defined $passeddatedue1, 1, "Item with passed date due checked out, due date: " . $passeddatedue1->date_due);
484
470
485
    my ( $fine ) = CalcFine( GetItem(undef, $barcode7), $renewing_borrower->{categorycode}, $branch, $five_weeks_ago, $now );
471
    my ( $fine ) = CalcFine( GetItem(undef, $item_7->barcode), $renewing_borrower->{categorycode}, $branch, $five_weeks_ago, $now );
486
    C4::Overdues::UpdateFine(
472
    C4::Overdues::UpdateFine(
487
        {
473
        {
488
            issue_id       => $passeddatedue1->id(),
474
            issue_id       => $passeddatedue1->id(),
489
            itemnumber     => $itemnumber7,
475
            itemnumber     => $item_7->itemnumber,
490
            borrowernumber => $renewing_borrower->{borrowernumber},
476
            borrowernumber => $renewing_borrower->{borrowernumber},
491
            amount         => $fine,
477
            amount         => $fine,
492
            type           => 'FU',
478
            type           => 'FU',
Lines 497-514 C4::Context->dbh->do("DELETE FROM accountlines"); Link Here
497
    t::lib::Mocks::mock_preference('RenewalLog', 0);
483
    t::lib::Mocks::mock_preference('RenewalLog', 0);
498
    my $date = output_pref( { dt => dt_from_string(), datenonly => 1, dateformat => 'iso' } );
484
    my $date = output_pref( { dt => dt_from_string(), datenonly => 1, dateformat => 'iso' } );
499
    my $old_log_size =  scalar(@{GetLogs( $date, $date, undef,["CIRCULATION"], ["RENEWAL"]) } );
485
    my $old_log_size =  scalar(@{GetLogs( $date, $date, undef,["CIRCULATION"], ["RENEWAL"]) } );
500
    AddRenewal( $renewing_borrower->{borrowernumber}, $itemnumber7, $branch );
486
    AddRenewal( $renewing_borrower->{borrowernumber}, $item_7->itemnumber, $branch );
501
    my $new_log_size =  scalar(@{GetLogs( $date, $date, undef,["CIRCULATION"], ["RENEWAL"]) } );
487
    my $new_log_size =  scalar(@{GetLogs( $date, $date, undef,["CIRCULATION"], ["RENEWAL"]) } );
502
    is ($new_log_size, $old_log_size, 'renew log not added because of the syspref RenewalLog');
488
    is ($new_log_size, $old_log_size, 'renew log not added because of the syspref RenewalLog');
503
489
504
    t::lib::Mocks::mock_preference('RenewalLog', 1);
490
    t::lib::Mocks::mock_preference('RenewalLog', 1);
505
    $date = output_pref( { dt => dt_from_string(), datenonly => 1, dateformat => 'iso' } );
491
    $date = output_pref( { dt => dt_from_string(), datenonly => 1, dateformat => 'iso' } );
506
    $old_log_size =  scalar(@{GetLogs( $date, $date, undef,["CIRCULATION"], ["RENEWAL"]) } );
492
    $old_log_size =  scalar(@{GetLogs( $date, $date, undef,["CIRCULATION"], ["RENEWAL"]) } );
507
    AddRenewal( $renewing_borrower->{borrowernumber}, $itemnumber7, $branch );
493
    AddRenewal( $renewing_borrower->{borrowernumber}, $item_7->itemnumber, $branch );
508
    $new_log_size =  scalar(@{GetLogs( $date, $date, undef,["CIRCULATION"], ["RENEWAL"]) } );
494
    $new_log_size =  scalar(@{GetLogs( $date, $date, undef,["CIRCULATION"], ["RENEWAL"]) } );
509
    is ($new_log_size, $old_log_size + 1, 'renew log successfully added');
495
    is ($new_log_size, $old_log_size + 1, 'renew log successfully added');
510
496
511
    my $fines = Koha::Account::Lines->search( { borrowernumber => $renewing_borrower->{borrowernumber}, itemnumber => $itemnumber7 } );
497
    my $fines = Koha::Account::Lines->search( { borrowernumber => $renewing_borrower->{borrowernumber}, itemnumber => $item_7->itemnumber } );
512
    is( $fines->count, 2 );
498
    is( $fines->count, 2 );
513
    is( $fines->next->accounttype, 'F', 'Fine on renewed item is closed out properly' );
499
    is( $fines->next->accounttype, 'F', 'Fine on renewed item is closed out properly' );
514
    is( $fines->next->accounttype, 'F', 'Fine on renewed item is closed out properly' );
500
    is( $fines->next->accounttype, 'F', 'Fine on renewed item is closed out properly' );
Lines 517-535 C4::Context->dbh->do("DELETE FROM accountlines"); Link Here
517
503
518
    my $old_issue_log_size =  scalar(@{GetLogs( $date, $date, undef,["CIRCULATION"], ["ISSUE"]) } );
504
    my $old_issue_log_size =  scalar(@{GetLogs( $date, $date, undef,["CIRCULATION"], ["ISSUE"]) } );
519
    my $old_renew_log_size =  scalar(@{GetLogs( $date, $date, undef,["CIRCULATION"], ["RENEWAL"]) } );
505
    my $old_renew_log_size =  scalar(@{GetLogs( $date, $date, undef,["CIRCULATION"], ["RENEWAL"]) } );
520
    AddIssue( $renewing_borrower,$barcode7,Koha::DateUtils::output_pref({str=>$datedue6->date_due, dateformat =>'iso'}),0,$date, 0, undef );
506
    AddIssue( $renewing_borrower,$item_7->barcode,Koha::DateUtils::output_pref({str=>$datedue6->date_due, dateformat =>'iso'}),0,$date, 0, undef );
521
    $new_log_size =  scalar(@{GetLogs( $date, $date, undef,["CIRCULATION"], ["RENEWAL"]) } );
507
    $new_log_size =  scalar(@{GetLogs( $date, $date, undef,["CIRCULATION"], ["RENEWAL"]) } );
522
    is ($new_log_size, $old_renew_log_size + 1, 'renew log successfully added when renewed via issuing');
508
    is ($new_log_size, $old_renew_log_size + 1, 'renew log successfully added when renewed via issuing');
523
    $new_log_size =  scalar(@{GetLogs( $date, $date, undef,["CIRCULATION"], ["ISSUE"]) } );
509
    $new_log_size =  scalar(@{GetLogs( $date, $date, undef,["CIRCULATION"], ["ISSUE"]) } );
524
    is ($new_log_size, $old_issue_log_size, 'renew not logged as issue when renewed via issuing');
510
    is ($new_log_size, $old_issue_log_size, 'renew not logged as issue when renewed via issuing');
525
511
526
    $fines = Koha::Account::Lines->search( { borrowernumber => $renewing_borrower->{borrowernumber}, itemnumber => $itemnumber7 } );
512
    $fines = Koha::Account::Lines->search( { borrowernumber => $renewing_borrower->{borrowernumber}, itemnumber => $item_7->itemnumber } );
527
    $fines->delete();
513
    $fines->delete();
528
514
529
    t::lib::Mocks::mock_preference('OverduesBlockRenewing','blockitem');
515
    t::lib::Mocks::mock_preference('OverduesBlockRenewing','blockitem');
530
    ( $renewokay, $error ) = CanBookBeRenewed($renewing_borrowernumber, $itemnumber6);
516
    ( $renewokay, $error ) = CanBookBeRenewed($renewing_borrowernumber, $item_6->itemnumber);
531
    is( $renewokay, 1, '(Bug 8236), Can renew, this item is not overdue');
517
    is( $renewokay, 1, '(Bug 8236), Can renew, this item is not overdue');
532
    ( $renewokay, $error ) = CanBookBeRenewed($renewing_borrowernumber, $itemnumber7);
518
    ( $renewokay, $error ) = CanBookBeRenewed($renewing_borrowernumber, $item_7->itemnumber);
533
    is( $renewokay, 0, '(Bug 8236), Cannot renew, this item is overdue');
519
    is( $renewokay, 0, '(Bug 8236), Cannot renew, this item is overdue');
534
520
535
521
Lines 539-559 C4::Context->dbh->do("DELETE FROM accountlines"); Link Here
539
    # Bug 14101
525
    # Bug 14101
540
    # Test automatic renewal before value for "norenewalbefore" in policy is set
526
    # Test automatic renewal before value for "norenewalbefore" in policy is set
541
    # In this case automatic renewal is not permitted prior to due date
527
    # In this case automatic renewal is not permitted prior to due date
542
    my $barcode4 = '11235813';
528
    my $item_4 = $builder->gimme_an_item(
543
    my ( $item_bibnum4, $item_bibitemnum4, $itemnumber4 ) = AddItem(
544
        {
529
        {
545
            homebranch       => $branch,
530
            biblionumber     => $biblio->biblionumber,
546
            holdingbranch    => $branch,
531
            library          => $branch,
547
            barcode          => $barcode4,
548
            replacementprice => 16.00,
532
            replacementprice => 16.00,
549
            itype            => $itemtype
533
            itype            => $itemtype,
550
        },
534
        }
551
        $biblio->biblionumber
552
    );
535
    );
553
536
554
    $issue = AddIssue( $renewing_borrower, $barcode4, undef, undef, undef, undef, { auto_renew => 1 } );
537
    $issue = AddIssue( $renewing_borrower, $item_4->barcode, undef, undef, undef, undef, { auto_renew => 1 } );
555
    ( $renewokay, $error ) =
538
    ( $renewokay, $error ) =
556
      CanBookBeRenewed( $renewing_borrowernumber, $itemnumber4 );
539
      CanBookBeRenewed( $renewing_borrowernumber, $item_4->itemnumber );
557
    is( $renewokay, 0, 'Bug 14101: Cannot renew, renewal is automatic and premature' );
540
    is( $renewokay, 0, 'Bug 14101: Cannot renew, renewal is automatic and premature' );
558
    is( $error, 'auto_too_soon',
541
    is( $error, 'auto_too_soon',
559
        'Bug 14101: Cannot renew, renewal is automatic and premature, "No renewal before" = undef (returned code is auto_too_soon)' );
542
        'Bug 14101: Cannot renew, renewal is automatic and premature, "No renewal before" = undef (returned code is auto_too_soon)' );
Lines 562-568 C4::Context->dbh->do("DELETE FROM accountlines"); Link Here
562
    # Test premature manual renewal
545
    # Test premature manual renewal
563
    $dbh->do('UPDATE issuingrules SET norenewalbefore = 7');
546
    $dbh->do('UPDATE issuingrules SET norenewalbefore = 7');
564
547
565
    ( $renewokay, $error ) = CanBookBeRenewed($renewing_borrowernumber, $itemnumber);
548
    ( $renewokay, $error ) = CanBookBeRenewed($renewing_borrowernumber, $item_1->itemnumber);
566
    is( $renewokay, 0, 'Bug 7413: Cannot renew, renewal is premature');
549
    is( $renewokay, 0, 'Bug 7413: Cannot renew, renewal is premature');
567
    is( $error, 'too_soon', 'Bug 7413: Cannot renew, renewal is premature (returned code is too_soon)');
550
    is( $error, 'too_soon', 'Bug 7413: Cannot renew, renewal is premature (returned code is too_soon)');
568
551
Lines 570-576 C4::Context->dbh->do("DELETE FROM accountlines"); Link Here
570
    # Test 'exact time' setting for syspref NoRenewalBeforePrecision
553
    # Test 'exact time' setting for syspref NoRenewalBeforePrecision
571
    t::lib::Mocks::mock_preference( 'NoRenewalBeforePrecision', 'exact_time' );
554
    t::lib::Mocks::mock_preference( 'NoRenewalBeforePrecision', 'exact_time' );
572
    is(
555
    is(
573
        GetSoonestRenewDate( $renewing_borrowernumber, $itemnumber ),
556
        GetSoonestRenewDate( $renewing_borrowernumber, $item_1->itemnumber ),
574
        $datedue->clone->add( days => -7 ),
557
        $datedue->clone->add( days => -7 ),
575
        'Bug 14395: Renewals permitted 7 days before due date, as expected'
558
        'Bug 14395: Renewals permitted 7 days before due date, as expected'
576
    );
559
    );
Lines 579-585 C4::Context->dbh->do("DELETE FROM accountlines"); Link Here
579
    # Test 'date' setting for syspref NoRenewalBeforePrecision
562
    # Test 'date' setting for syspref NoRenewalBeforePrecision
580
    t::lib::Mocks::mock_preference( 'NoRenewalBeforePrecision', 'date' );
563
    t::lib::Mocks::mock_preference( 'NoRenewalBeforePrecision', 'date' );
581
    is(
564
    is(
582
        GetSoonestRenewDate( $renewing_borrowernumber, $itemnumber ),
565
        GetSoonestRenewDate( $renewing_borrowernumber, $item_1->itemnumber ),
583
        $datedue->clone->add( days => -7 )->truncate( to => 'day' ),
566
        $datedue->clone->add( days => -7 )->truncate( to => 'day' ),
584
        'Bug 14395: Renewals permitted 7 days before due date, as expected'
567
        'Bug 14395: Renewals permitted 7 days before due date, as expected'
585
    );
568
    );
Lines 587-593 C4::Context->dbh->do("DELETE FROM accountlines"); Link Here
587
    # Bug 14101
570
    # Bug 14101
588
    # Test premature automatic renewal
571
    # Test premature automatic renewal
589
    ( $renewokay, $error ) =
572
    ( $renewokay, $error ) =
590
      CanBookBeRenewed( $renewing_borrowernumber, $itemnumber4 );
573
      CanBookBeRenewed( $renewing_borrowernumber, $item_4->itemnumber );
591
    is( $renewokay, 0, 'Bug 14101: Cannot renew, renewal is automatic and premature' );
574
    is( $renewokay, 0, 'Bug 14101: Cannot renew, renewal is automatic and premature' );
592
    is( $error, 'auto_too_soon',
575
    is( $error, 'auto_too_soon',
593
        'Bug 14101: Cannot renew, renewal is automatic and premature (returned code is auto_too_soon)'
576
        'Bug 14101: Cannot renew, renewal is automatic and premature (returned code is auto_too_soon)'
Lines 597-603 C4::Context->dbh->do("DELETE FROM accountlines"); Link Here
597
    # and test automatic renewal again
580
    # and test automatic renewal again
598
    $dbh->do('UPDATE issuingrules SET norenewalbefore = 0');
581
    $dbh->do('UPDATE issuingrules SET norenewalbefore = 0');
599
    ( $renewokay, $error ) =
582
    ( $renewokay, $error ) =
600
      CanBookBeRenewed( $renewing_borrowernumber, $itemnumber4 );
583
      CanBookBeRenewed( $renewing_borrowernumber, $item_4->itemnumber );
601
    is( $renewokay, 0, 'Bug 14101: Cannot renew, renewal is automatic and premature' );
584
    is( $renewokay, 0, 'Bug 14101: Cannot renew, renewal is automatic and premature' );
602
    is( $error, 'auto_too_soon',
585
    is( $error, 'auto_too_soon',
603
        'Bug 14101: Cannot renew, renewal is automatic and premature, "No renewal before" = 0 (returned code is auto_too_soon)'
586
        'Bug 14101: Cannot renew, renewal is automatic and premature, "No renewal before" = 0 (returned code is auto_too_soon)'
Lines 607-613 C4::Context->dbh->do("DELETE FROM accountlines"); Link Here
607
    # and test automatic renewal again
590
    # and test automatic renewal again
608
    $dbh->do('UPDATE issuingrules SET norenewalbefore = 99');
591
    $dbh->do('UPDATE issuingrules SET norenewalbefore = 99');
609
    ( $renewokay, $error ) =
592
    ( $renewokay, $error ) =
610
      CanBookBeRenewed( $renewing_borrowernumber, $itemnumber4 );
593
      CanBookBeRenewed( $renewing_borrowernumber, $item_4->itemnumber );
611
    is( $renewokay, 0, 'Bug 14101: Cannot renew, renewal is automatic' );
594
    is( $renewokay, 0, 'Bug 14101: Cannot renew, renewal is automatic' );
612
    is( $error, 'auto_renew',
595
    is( $error, 'auto_renew',
613
        'Bug 14101: Cannot renew, renewal is automatic (returned code is auto_renew)'
596
        'Bug 14101: Cannot renew, renewal is automatic (returned code is auto_renew)'
Lines 817-823 C4::Context->dbh->do("DELETE FROM accountlines"); Link Here
817
    # set policy to forbid renewals
800
    # set policy to forbid renewals
818
    $dbh->do('UPDATE issuingrules SET norenewalbefore = NULL, renewalsallowed = 0');
801
    $dbh->do('UPDATE issuingrules SET norenewalbefore = NULL, renewalsallowed = 0');
819
802
820
    ( $renewokay, $error ) = CanBookBeRenewed($renewing_borrowernumber, $itemnumber);
803
    ( $renewokay, $error ) = CanBookBeRenewed($renewing_borrowernumber, $item_1->itemnumber);
821
    is( $renewokay, 0, 'Cannot renew, 0 renewals allowed');
804
    is( $renewokay, 0, 'Cannot renew, 0 renewals allowed');
822
    is( $error, 'too_many', 'Cannot renew, 0 renewals allowed (returned code is too_many)');
805
    is( $error, 'too_many', 'Cannot renew, 0 renewals allowed (returned code is too_many)');
823
806
Lines 828-834 C4::Context->dbh->do("DELETE FROM accountlines"); Link Here
828
    C4::Overdues::UpdateFine(
811
    C4::Overdues::UpdateFine(
829
        {
812
        {
830
            issue_id       => $issue->id(),
813
            issue_id       => $issue->id(),
831
            itemnumber     => $itemnumber,
814
            itemnumber     => $item_1->itemnumber,
832
            borrowernumber => $renewing_borrower->{borrowernumber},
815
            borrowernumber => $renewing_borrower->{borrowernumber},
833
            amount         => 15.00,
816
            amount         => 15.00,
834
            type           => q{},
817
            type           => q{},
Lines 850-863 C4::Context->dbh->do("DELETE FROM accountlines"); Link Here
850
    t::lib::Mocks::mock_preference('WhenLostForgiveFine','0');
833
    t::lib::Mocks::mock_preference('WhenLostForgiveFine','0');
851
    t::lib::Mocks::mock_preference('WhenLostChargeReplacementFee','0');
834
    t::lib::Mocks::mock_preference('WhenLostChargeReplacementFee','0');
852
835
853
    LostItem( $itemnumber, 'test', 1 );
836
    LostItem( $item_1->itemnumber, 'test', 1 );
854
837
855
    $line = Koha::Account::Lines->find($line->id);
838
    $line = Koha::Account::Lines->find($line->id);
856
    is( $line->accounttype, 'F', 'Account type correctly changed from FU to F' );
839
    is( $line->accounttype, 'F', 'Account type correctly changed from FU to F' );
857
840
858
    my $item = Koha::Database->new()->schema()->resultset('Item')->find($itemnumber);
841
    my $item = Koha::Items->find($item_1->itemnumber);
859
    ok( !$item->onloan(), "Lost item marked as returned has false onloan value" );
842
    ok( !$item->onloan(), "Lost item marked as returned has false onloan value" );
860
    my $checkout = Koha::Checkouts->find({ itemnumber => $itemnumber });
843
    my $checkout = Koha::Checkouts->find({ itemnumber => $item_1->itemnumber });
861
    is( $checkout, undef, 'LostItem called with forced return has checked in the item' );
844
    is( $checkout, undef, 'LostItem called with forced return has checked in the item' );
862
845
863
    my $total_due = $dbh->selectrow_array(
846
    my $total_due = $dbh->selectrow_array(
Lines 872-878 C4::Context->dbh->do("DELETE FROM accountlines"); Link Here
872
    C4::Overdues::UpdateFine(
855
    C4::Overdues::UpdateFine(
873
        {
856
        {
874
            issue_id       => $issue2->id(),
857
            issue_id       => $issue2->id(),
875
            itemnumber     => $itemnumber2,
858
            itemnumber     => $item_2->itemnumber,
876
            borrowernumber => $renewing_borrower->{borrowernumber},
859
            borrowernumber => $renewing_borrower->{borrowernumber},
877
            amount         => 15.00,
860
            amount         => 15.00,
878
            type           => q{},
861
            type           => q{},
Lines 880-890 C4::Context->dbh->do("DELETE FROM accountlines"); Link Here
880
        }
863
        }
881
    );
864
    );
882
865
883
    LostItem( $itemnumber2, 'test', 0 );
866
    LostItem( $item_2->itemnumber, 'test', 0 );
884
867
885
    my $item2 = Koha::Database->new()->schema()->resultset('Item')->find($itemnumber2);
868
    my $item2 = Koha::Items->find($item_2->itemnumber);
886
    ok( $item2->onloan(), "Lost item *not* marked as returned has true onloan value" );
869
    ok( $item2->onloan(), "Lost item *not* marked as returned has true onloan value" );
887
    ok( Koha::Checkouts->find({ itemnumber => $itemnumber2 }), 'LostItem called without forced return has checked in the item' );
870
    ok( Koha::Checkouts->find({ itemnumber => $item_2->itemnumber }), 'LostItem called without forced return has checked in the item' );
888
871
889
    $total_due = $dbh->selectrow_array(
872
    $total_due = $dbh->selectrow_array(
890
        'SELECT SUM( amountoutstanding ) FROM accountlines WHERE borrowernumber = ?',
873
        'SELECT SUM( amountoutstanding ) FROM accountlines WHERE borrowernumber = ?',
Lines 900-939 C4::Context->dbh->do("DELETE FROM accountlines"); Link Here
900
883
901
    # Users cannot renew any item if there is an overdue item
884
    # Users cannot renew any item if there is an overdue item
902
    t::lib::Mocks::mock_preference('OverduesBlockRenewing','block');
885
    t::lib::Mocks::mock_preference('OverduesBlockRenewing','block');
903
    ( $renewokay, $error ) = CanBookBeRenewed($renewing_borrowernumber, $itemnumber6);
886
    ( $renewokay, $error ) = CanBookBeRenewed($renewing_borrowernumber, $item_6->itemnumber);
904
    is( $renewokay, 0, '(Bug 8236), Cannot renew, one of the items is overdue');
887
    is( $renewokay, 0, '(Bug 8236), Cannot renew, one of the items is overdue');
905
    ( $renewokay, $error ) = CanBookBeRenewed($renewing_borrowernumber, $itemnumber7);
888
    ( $renewokay, $error ) = CanBookBeRenewed($renewing_borrowernumber, $item_7->itemnumber);
906
    is( $renewokay, 0, '(Bug 8236), Cannot renew, one of the items is overdue');
889
    is( $renewokay, 0, '(Bug 8236), Cannot renew, one of the items is overdue');
907
890
908
    t::lib::Mocks::mock_preference('WhenLostChargeReplacementFee','1');
891
    t::lib::Mocks::mock_preference('WhenLostChargeReplacementFee','1');
909
    $checkout = Koha::Checkouts->find( { itemnumber => $itemnumber3 } );
892
    $checkout = Koha::Checkouts->find( { itemnumber => $item_3->itemnumber } );
910
    LostItem( $itemnumber3, 'test', 0 );
893
    LostItem( $item_3->itemnumber, 'test', 0 );
911
    my $accountline = Koha::Account::Lines->find( { itemnumber => $itemnumber3 } );
894
    my $accountline = Koha::Account::Lines->find( { itemnumber => $item_3->itemnumber } );
912
    is( $accountline->issue_id, $checkout->id, "Issue id added for lost replacement fee charge" );
895
    is( $accountline->issue_id, $checkout->id, "Issue id added for lost replacement fee charge" );
913
914
  }
896
  }
915
897
916
{
898
{
917
    # GetUpcomingDueIssues tests
899
    # GetUpcomingDueIssues tests
918
    my $barcode  = 'R00000342';
919
    my $barcode2 = 'R00000343';
920
    my $barcode3 = 'R00000344';
921
    my $branch   = $library2->{branchcode};
900
    my $branch   = $library2->{branchcode};
922
901
923
    #Create another record
902
    #Create another record
924
    my $biblio2 = $builder->gimme_a_biblio();
903
    my $biblio2 = $builder->gimme_a_biblio();
925
904
926
    #Create third item
905
    #Create third item
927
    AddItem(
906
    my $item_1 = Koha::Items->find($reused_itemnumber_1);
907
    my $item_2 = Koha::Items->find($reused_itemnumber_2);
908
    my $item_3 = $builder->gimme_an_item(
928
        {
909
        {
929
            homebranch       => $branch,
910
            biblionumber     => $biblio2->biblionumber,
930
            holdingbranch    => $branch,
911
            library          => $branch,
931
            barcode          => $barcode3,
912
            itype            => $itemtype,
932
            itype            => $itemtype
913
        }
933
        },
934
        $biblio2->biblionumber
935
    );
914
    );
936
915
916
937
    # Create a borrower
917
    # Create a borrower
938
    my %a_borrower_data = (
918
    my %a_borrower_data = (
939
        firstname =>  'Fridolyn',
919
        firstname =>  'Fridolyn',
Lines 949-957 C4::Context->dbh->do("DELETE FROM accountlines"); Link Here
949
    my $two_days_ahead = DateTime->today(time_zone => C4::Context->tz())->add( days => 2 );
929
    my $two_days_ahead = DateTime->today(time_zone => C4::Context->tz())->add( days => 2 );
950
    my $today = DateTime->today(time_zone => C4::Context->tz());
930
    my $today = DateTime->today(time_zone => C4::Context->tz());
951
931
952
    my $issue = AddIssue( $a_borrower, $barcode, $yesterday );
932
    my $issue = AddIssue( $a_borrower, $item_1->barcode, $yesterday );
953
    my $datedue = dt_from_string( $issue->date_due() );
933
    my $datedue = dt_from_string( $issue->date_due() );
954
    my $issue2 = AddIssue( $a_borrower, $barcode2, $two_days_ahead );
934
    my $issue2 = AddIssue( $a_borrower, $item_2->barcode, $two_days_ahead );
955
    my $datedue2 = dt_from_string( $issue->date_due() );
935
    my $datedue2 = dt_from_string( $issue->date_due() );
956
936
957
    my $upcoming_dues;
937
    my $upcoming_dues;
Lines 974-980 C4::Context->dbh->do("DELETE FROM accountlines"); Link Here
974
954
975
    # Bug 11218 - Due notices not generated - GetUpcomingDueIssues needs to select due today items as well
955
    # Bug 11218 - Due notices not generated - GetUpcomingDueIssues needs to select due today items as well
976
956
977
    my $issue3 = AddIssue( $a_borrower, $barcode3, $today );
957
    my $issue3 = AddIssue( $a_borrower, $item_3->barcode, $today );
978
958
979
    $upcoming_dues = C4::Circulation::GetUpcomingDueIssues( { days_in_advance => -1 } );
959
    $upcoming_dues = C4::Circulation::GetUpcomingDueIssues( { days_in_advance => -1 } );
980
    is ( scalar ( @$upcoming_dues), 0, "Overdues can not be selected" );
960
    is ( scalar ( @$upcoming_dues), 0, "Overdues can not be selected" );
Lines 997-1016 C4::Context->dbh->do("DELETE FROM accountlines"); Link Here
997
}
977
}
998
978
999
{
979
{
1000
    my $barcode  = '1234567890';
1001
    my $branch   = $library2->{branchcode};
980
    my $branch   = $library2->{branchcode};
1002
981
1003
    my $biblio = $builder->gimme_a_biblio();
982
    my $biblio = $builder->gimme_a_biblio();
1004
983
1005
    #Create third item
984
    #Create third item
1006
    my ( undef, undef, $itemnumber ) = AddItem(
985
    my $item = $builder->gimme_an_item(
1007
        {
986
        {
1008
            homebranch       => $branch,
987
            biblionumber     => $biblio->biblionumber,
1009
            holdingbranch    => $branch,
988
            library          => $branch,
1010
            barcode          => $barcode,
989
            itype            => $itemtype,
1011
            itype            => $itemtype
990
        }
1012
        },
1013
        $biblio->biblionumber
1014
    );
991
    );
1015
992
1016
    # Create a borrower
993
    # Create a borrower
Lines 1024-1041 C4::Context->dbh->do("DELETE FROM accountlines"); Link Here
1024
    my $borrowernumber = Koha::Patron->new(\%a_borrower_data)->store->borrowernumber;
1001
    my $borrowernumber = Koha::Patron->new(\%a_borrower_data)->store->borrowernumber;
1025
1002
1026
    my $borrower = Koha::Patrons->find( $borrowernumber )->unblessed;
1003
    my $borrower = Koha::Patrons->find( $borrowernumber )->unblessed;
1027
    my $issue = AddIssue( $borrower, $barcode );
1004
    my $issue = AddIssue( $borrower, $item->barcode );
1028
    UpdateFine(
1005
    UpdateFine(
1029
        {
1006
        {
1030
            issue_id       => $issue->id(),
1007
            issue_id       => $issue->id(),
1031
            itemnumber     => $itemnumber,
1008
            itemnumber     => $item->itemnumber,
1032
            borrowernumber => $borrowernumber,
1009
            borrowernumber => $borrowernumber,
1033
            amount         => 0,
1010
            amount         => 0,
1034
            type           => q{}
1011
            type           => q{}
1035
        }
1012
        }
1036
    );
1013
    );
1037
1014
1038
    my $hr = $dbh->selectrow_hashref(q{SELECT COUNT(*) AS count FROM accountlines WHERE borrowernumber = ? AND itemnumber = ?}, undef, $borrowernumber, $itemnumber );
1015
    my $hr = $dbh->selectrow_hashref(q{SELECT COUNT(*) AS count FROM accountlines WHERE borrowernumber = ? AND itemnumber = ?}, undef, $borrowernumber, $item->itemnumber );
1039
    my $count = $hr->{count};
1016
    my $count = $hr->{count};
1040
1017
1041
    is ( $count, 0, "Calling UpdateFine on non-existant fine with an amount of 0 does not result in an empty fine" );
1018
    is ( $count, 0, "Calling UpdateFine on non-existant fine with an amount of 0 does not result in an empty fine" );
Lines 1059-1083 C4::Context->dbh->do("DELETE FROM accountlines"); Link Here
1059
    );
1036
    );
1060
    my $biblio = $builder->gimme_a_biblio();
1037
    my $biblio = $builder->gimme_a_biblio();
1061
1038
1062
    my $barcode1 = '1234';
1039
    my $item_1 = $builder->gimme_an_item(
1063
    my ( undef, undef, $itemnumber1 ) = AddItem(
1064
        {
1040
        {
1065
            homebranch    => $library2->{branchcode},
1041
            biblionumber     => $biblio->biblionumber,
1066
            holdingbranch => $library2->{branchcode},
1042
            library          => $library2->{branchcode},
1067
            barcode       => $barcode1,
1043
            itype            => $itemtype,
1068
            itype         => $itemtype
1044
        }
1069
        },
1070
        $biblio->biblionumber
1071
    );
1045
    );
1072
    my $barcode2 = '4321';
1046
1073
    my ( undef, undef, $itemnumber2 ) = AddItem(
1047
    my $item_2= $builder->gimme_an_item(
1074
        {
1048
        {
1075
            homebranch    => $library2->{branchcode},
1049
            biblionumber     => $biblio->biblionumber,
1076
            holdingbranch => $library2->{branchcode},
1050
            library          => $library2->{branchcode},
1077
            barcode       => $barcode2,
1051
            itype            => $itemtype,
1078
            itype         => $itemtype
1052
        }
1079
        },
1080
        $biblio->biblionumber
1081
    );
1053
    );
1082
1054
1083
    my $borrowernumber1 = Koha::Patron->new({
1055
    my $borrowernumber1 = Koha::Patron->new({
Lines 1096-1104 C4::Context->dbh->do("DELETE FROM accountlines"); Link Here
1096
    my $borrower1 = Koha::Patrons->find( $borrowernumber1 )->unblessed;
1068
    my $borrower1 = Koha::Patrons->find( $borrowernumber1 )->unblessed;
1097
    my $borrower2 = Koha::Patrons->find( $borrowernumber2 )->unblessed;
1069
    my $borrower2 = Koha::Patrons->find( $borrowernumber2 )->unblessed;
1098
1070
1099
    my $issue = AddIssue( $borrower1, $barcode1 );
1071
    my $issue = AddIssue( $borrower1, $item_1->barcode );
1100
1072
1101
    my ( $renewokay, $error ) = CanBookBeRenewed( $borrowernumber1, $itemnumber1 );
1073
    my ( $renewokay, $error ) = CanBookBeRenewed( $borrowernumber1, $item_1->itemnumber );
1102
    is( $renewokay, 1, 'Bug 14337 - Verify the borrower can renew with no hold on the record' );
1074
    is( $renewokay, 1, 'Bug 14337 - Verify the borrower can renew with no hold on the record' );
1103
1075
1104
    AddReserve(
1076
    AddReserve(
Lines 1109-1155 C4::Context->dbh->do("DELETE FROM accountlines"); Link Here
1109
1081
1110
    C4::Context->dbh->do("UPDATE issuingrules SET onshelfholds = 0");
1082
    C4::Context->dbh->do("UPDATE issuingrules SET onshelfholds = 0");
1111
    t::lib::Mocks::mock_preference( 'AllowRenewalIfOtherItemsAvailable', 0 );
1083
    t::lib::Mocks::mock_preference( 'AllowRenewalIfOtherItemsAvailable', 0 );
1112
    ( $renewokay, $error ) = CanBookBeRenewed( $borrowernumber1, $itemnumber1 );
1084
    ( $renewokay, $error ) = CanBookBeRenewed( $borrowernumber1, $item_1->itemnumber );
1113
    is( $renewokay, 0, 'Bug 14337 - Verify the borrower cannot renew with a hold on the record if AllowRenewalIfOtherItemsAvailable and onshelfholds are disabled' );
1085
    is( $renewokay, 0, 'Bug 14337 - Verify the borrower cannot renew with a hold on the record if AllowRenewalIfOtherItemsAvailable and onshelfholds are disabled' );
1114
1086
1115
    C4::Context->dbh->do("UPDATE issuingrules SET onshelfholds = 0");
1087
    C4::Context->dbh->do("UPDATE issuingrules SET onshelfholds = 0");
1116
    t::lib::Mocks::mock_preference( 'AllowRenewalIfOtherItemsAvailable', 1 );
1088
    t::lib::Mocks::mock_preference( 'AllowRenewalIfOtherItemsAvailable', 1 );
1117
    ( $renewokay, $error ) = CanBookBeRenewed( $borrowernumber1, $itemnumber1 );
1089
    ( $renewokay, $error ) = CanBookBeRenewed( $borrowernumber1, $item_1->itemnumber );
1118
    is( $renewokay, 0, 'Bug 14337 - Verify the borrower cannot renew with a hold on the record if AllowRenewalIfOtherItemsAvailable is enabled and onshelfholds is disabled' );
1090
    is( $renewokay, 0, 'Bug 14337 - Verify the borrower cannot renew with a hold on the record if AllowRenewalIfOtherItemsAvailable is enabled and onshelfholds is disabled' );
1119
1091
1120
    C4::Context->dbh->do("UPDATE issuingrules SET onshelfholds = 1");
1092
    C4::Context->dbh->do("UPDATE issuingrules SET onshelfholds = 1");
1121
    t::lib::Mocks::mock_preference( 'AllowRenewalIfOtherItemsAvailable', 0 );
1093
    t::lib::Mocks::mock_preference( 'AllowRenewalIfOtherItemsAvailable', 0 );
1122
    ( $renewokay, $error ) = CanBookBeRenewed( $borrowernumber1, $itemnumber1 );
1094
    ( $renewokay, $error ) = CanBookBeRenewed( $borrowernumber1, $item_1->itemnumber );
1123
    is( $renewokay, 0, 'Bug 14337 - Verify the borrower cannot renew with a hold on the record if AllowRenewalIfOtherItemsAvailable is disabled and onshelfhold is enabled' );
1095
    is( $renewokay, 0, 'Bug 14337 - Verify the borrower cannot renew with a hold on the record if AllowRenewalIfOtherItemsAvailable is disabled and onshelfhold is enabled' );
1124
1096
1125
    C4::Context->dbh->do("UPDATE issuingrules SET onshelfholds = 1");
1097
    C4::Context->dbh->do("UPDATE issuingrules SET onshelfholds = 1");
1126
    t::lib::Mocks::mock_preference( 'AllowRenewalIfOtherItemsAvailable', 1 );
1098
    t::lib::Mocks::mock_preference( 'AllowRenewalIfOtherItemsAvailable', 1 );
1127
    ( $renewokay, $error ) = CanBookBeRenewed( $borrowernumber1, $itemnumber1 );
1099
    ( $renewokay, $error ) = CanBookBeRenewed( $borrowernumber1, $item_1->itemnumber );
1128
    is( $renewokay, 1, 'Bug 14337 - Verify the borrower can renew with a hold on the record if AllowRenewalIfOtherItemsAvailable and onshelfhold are enabled' );
1100
    is( $renewokay, 1, 'Bug 14337 - Verify the borrower can renew with a hold on the record if AllowRenewalIfOtherItemsAvailable and onshelfhold are enabled' );
1129
1101
1130
    # Setting item not checked out to be not for loan but holdable
1102
    # Setting item not checked out to be not for loan but holdable
1131
    ModItem({ notforloan => -1 }, $biblio->biblionumber, $itemnumber2);
1103
    ModItem({ notforloan => -1 }, $biblio->biblionumber, $item_2->itemnumber);
1132
1104
1133
    ( $renewokay, $error ) = CanBookBeRenewed( $borrowernumber1, $itemnumber1 );
1105
    ( $renewokay, $error ) = CanBookBeRenewed( $borrowernumber1, $item_1->itemnumber );
1134
    is( $renewokay, 0, 'Bug 14337 - Verify the borrower can not renew with a hold on the record if AllowRenewalIfOtherItemsAvailable is enabled but the only available item is notforloan' );
1106
    is( $renewokay, 0, 'Bug 14337 - Verify the borrower can not renew with a hold on the record if AllowRenewalIfOtherItemsAvailable is enabled but the only available item is notforloan' );
1135
}
1107
}
1136
1108
1137
{
1109
{
1138
    # Don't allow renewing onsite checkout
1110
    # Don't allow renewing onsite checkout
1139
    my $barcode  = 'R00000XXX';
1140
    my $branch   = $library->{branchcode};
1111
    my $branch   = $library->{branchcode};
1141
1112
1142
    #Create another record
1113
    #Create another record
1143
    my $biblio = $builder->gimme_a_biblio();
1114
    my $biblio = $builder->gimme_a_biblio();
1144
1115
1145
    my (undef, undef, $itemnumber) = AddItem(
1116
    my $item = $builder->gimme_an_item(
1146
        {
1117
        {
1147
            homebranch       => $branch,
1118
            biblionumber     => $biblio->biblionumber,
1148
            holdingbranch    => $branch,
1119
            library          => $branch,
1149
            barcode          => $barcode,
1120
            itype            => $itemtype,
1150
            itype            => $itemtype
1121
        }
1151
        },
1152
        $biblio->biblionumber
1153
    );
1122
    );
1154
1123
1155
    my $borrowernumber = Koha::Patron->new({
1124
    my $borrowernumber = Koha::Patron->new({
Lines 1161-1168 C4::Context->dbh->do("DELETE FROM accountlines"); Link Here
1161
1130
1162
    my $borrower = Koha::Patrons->find( $borrowernumber )->unblessed;
1131
    my $borrower = Koha::Patrons->find( $borrowernumber )->unblessed;
1163
1132
1164
    my $issue = AddIssue( $borrower, $barcode, undef, undef, undef, undef, { onsite_checkout => 1 } );
1133
    my $issue = AddIssue( $borrower, $item->barcode, undef, undef, undef, undef, { onsite_checkout => 1 } );
1165
    my ( $renewed, $error ) = CanBookBeRenewed( $borrowernumber, $itemnumber );
1134
    my ( $renewed, $error ) = CanBookBeRenewed( $borrowernumber, $item->itemnumber );
1166
    is( $renewed, 0, 'CanBookBeRenewed should not allow to renew on-site checkout' );
1135
    is( $renewed, 0, 'CanBookBeRenewed should not allow to renew on-site checkout' );
1167
    is( $error, 'onsite_checkout', 'A correct error code should be returned by CanBookBeRenewed for on-site checkout' );
1136
    is( $error, 'onsite_checkout', 'A correct error code should be returned by CanBookBeRenewed for on-site checkout' );
1168
}
1137
}
Lines 1172-1195 C4::Context->dbh->do("DELETE FROM accountlines"); Link Here
1172
1141
1173
    my $biblio = $builder->gimme_a_biblio();
1142
    my $biblio = $builder->gimme_a_biblio();
1174
1143
1175
    my $barcode = 'just a barcode';
1144
    my $item = $builder->gimme_an_item(
1176
    my ( undef, undef, $itemnumber ) = AddItem(
1177
        {
1145
        {
1178
            homebranch       => $library->{branchcode},
1146
            biblionumber     => $biblio->biblionumber,
1179
            holdingbranch    => $library->{branchcode},
1147
            library          => $library->{branchcode},
1180
            barcode          => $barcode,
1148
            itype            => $itemtype,
1181
            itype            => $itemtype
1149
        }
1182
        },
1183
        $biblio->biblionumber,
1184
    );
1150
    );
1185
1151
1186
    my $patron = $builder->build({ source => 'Borrower', value => { branchcode => $library->{branchcode}, categorycode => $patron_category->{categorycode} } } );
1152
    my $patron = $builder->build({ source => 'Borrower', value => { branchcode => $library->{branchcode}, categorycode => $patron_category->{categorycode} } } );
1187
1153
1188
    my $issue = AddIssue( $patron, $barcode );
1154
    my $issue = AddIssue( $patron, $item->barcode );
1189
    UpdateFine(
1155
    UpdateFine(
1190
        {
1156
        {
1191
            issue_id       => $issue->id(),
1157
            issue_id       => $issue->id(),
1192
            itemnumber     => $itemnumber,
1158
            itemnumber     => $item->itemnumber,
1193
            borrowernumber => $patron->{borrowernumber},
1159
            borrowernumber => $patron->{borrowernumber},
1194
            amount         => 1,
1160
            amount         => 1,
1195
            type           => q{}
1161
            type           => q{}
Lines 1198-1204 C4::Context->dbh->do("DELETE FROM accountlines"); Link Here
1198
    UpdateFine(
1164
    UpdateFine(
1199
        {
1165
        {
1200
            issue_id       => $issue->id(),
1166
            issue_id       => $issue->id(),
1201
            itemnumber     => $itemnumber,
1167
            itemnumber     => $item->itemnumber,
1202
            borrowernumber => $patron->{borrowernumber},
1168
            borrowernumber => $patron->{borrowernumber},
1203
            amount         => 2,
1169
            amount         => 2,
1204
            type           => q{}
1170
            type           => q{}
Lines 1474-1501 subtest 'MultipleReserves' => sub { Link Here
1474
1440
1475
    my $branch = $library2->{branchcode};
1441
    my $branch = $library2->{branchcode};
1476
1442
1477
    my $barcode1 = 'R00110001';
1443
    my $item_1 = $builder->gimme_an_item(
1478
    my ( $item_bibnum1, $item_bibitemnum1, $itemnumber1 ) = AddItem(
1479
        {
1444
        {
1480
            homebranch       => $branch,
1445
            biblionumber     => $biblio->biblionumber,
1481
            holdingbranch    => $branch,
1446
            library          => $branch,
1482
            barcode          => $barcode1,
1483
            replacementprice => 12.00,
1447
            replacementprice => 12.00,
1484
            itype            => $itemtype
1448
            itype            => $itemtype,
1485
        },
1449
        }
1486
        $biblio->biblionumber
1487
    );
1450
    );
1488
1451
1489
    my $barcode2 = 'R00110002';
1452
    my $item_2 = $builder->gimme_an_item(
1490
    my ( $item_bibnum2, $item_bibitemnum2, $itemnumber2 ) = AddItem(
1491
        {
1453
        {
1492
            homebranch       => $branch,
1454
            biblionumber     => $biblio->biblionumber,
1493
            holdingbranch    => $branch,
1455
            library          => $branch,
1494
            barcode          => $barcode2,
1495
            replacementprice => 12.00,
1456
            replacementprice => 12.00,
1496
            itype            => $itemtype
1457
            itype            => $itemtype,
1497
        },
1458
        }
1498
        $biblio->biblionumber
1499
    );
1459
    );
1500
1460
1501
    my $bibitems       = '';
1461
    my $bibitems       = '';
Lines 1514-1523 subtest 'MultipleReserves' => sub { Link Here
1514
    );
1474
    );
1515
    my $renewing_borrowernumber = Koha::Patron->new(\%renewing_borrower_data)->store->borrowernumber;
1475
    my $renewing_borrowernumber = Koha::Patron->new(\%renewing_borrower_data)->store->borrowernumber;
1516
    my $renewing_borrower = Koha::Patrons->find( $renewing_borrowernumber )->unblessed;
1476
    my $renewing_borrower = Koha::Patrons->find( $renewing_borrowernumber )->unblessed;
1517
    my $issue = AddIssue( $renewing_borrower, $barcode1);
1477
    my $issue = AddIssue( $renewing_borrower, $item_1->barcode);
1518
    my $datedue = dt_from_string( $issue->date_due() );
1478
    my $datedue = dt_from_string( $issue->date_due() );
1519
    is (defined $issue->date_due(), 1, "item 1 checked out");
1479
    is (defined $issue->date_due(), 1, "item 1 checked out");
1520
    my $borrowing_borrowernumber = Koha::Checkouts->find({ itemnumber => $itemnumber1 })->borrowernumber;
1480
    my $borrowing_borrowernumber = Koha::Checkouts->find({ itemnumber => $item_1->itemnumber })->borrowernumber;
1521
1481
1522
    my %reserving_borrower_data1 = (
1482
    my %reserving_borrower_data1 = (
1523
        firstname =>  'Katrin',
1483
        firstname =>  'Katrin',
Lines 1546-1569 subtest 'MultipleReserves' => sub { Link Here
1546
    );
1506
    );
1547
1507
1548
    {
1508
    {
1549
        my ( $renewokay, $error ) = CanBookBeRenewed($renewing_borrowernumber, $itemnumber1, 1);
1509
        my ( $renewokay, $error ) = CanBookBeRenewed($renewing_borrowernumber, $item_1->itemnumber, 1);
1550
        is($renewokay, 0, 'Bug 17941 - should cover the case where 2 books are both reserved, so failing');
1510
        is($renewokay, 0, 'Bug 17941 - should cover the case where 2 books are both reserved, so failing');
1551
    }
1511
    }
1552
1512
1553
    my $barcode3 = 'R00110003';
1513
    my $item_3 = $builder->gimme_an_item(
1554
    my ( $item_bibnum3, $item_bibitemnum3, $itemnumber3 ) = AddItem(
1555
        {
1514
        {
1556
            homebranch       => $branch,
1515
            biblionumber     => $biblio->biblionumber,
1557
            holdingbranch    => $branch,
1516
            library          => $branch,
1558
            barcode          => $barcode3,
1559
            replacementprice => 12.00,
1517
            replacementprice => 12.00,
1560
            itype            => $itemtype
1518
            itype            => $itemtype,
1561
        },
1519
        }
1562
        $biblio->biblionumber
1563
    );
1520
    );
1564
1521
1565
    {
1522
    {
1566
        my ( $renewokay, $error ) = CanBookBeRenewed($renewing_borrowernumber, $itemnumber1, 1);
1523
        my ( $renewokay, $error ) = CanBookBeRenewed($renewing_borrowernumber, $item_1->itemnumber, 1);
1567
        is($renewokay, 1, 'Bug 17941 - should cover the case where 2 books are reserved, but a third one is available');
1524
        is($renewokay, 1, 'Bug 17941 - should cover the case where 2 books are reserved, but a third one is available');
1568
    }
1525
    }
1569
};
1526
};
Lines 2014-2039 subtest '_FixAccountForLostAndReturned' => sub { Link Here
2014
        plan tests => 10;
1971
        plan tests => 10;
2015
1972
2016
        my $patron = $builder->build_object( { class => 'Koha::Patrons' } );
1973
        my $patron = $builder->build_object( { class => 'Koha::Patrons' } );
2017
        my $barcode = 'KD123456789';
2018
1974
2019
        my ( undef, undef, $item_id ) = AddItem(
1975
        my $item = $builder->gimme_an_item(
2020
            {   homebranch       => $library->branchcode,
1976
            {
2021
                holdingbranch    => $library->branchcode,
1977
                biblionumber     => $biblio->biblionumber,
2022
                barcode          => $barcode,
1978
                library          => $library->branchcode,
2023
                replacementprice => $replacement_amount,
1979
                replacementprice => $replacement_amount,
2024
                itype            => $item_type->itemtype
1980
                itype            => $item_type->itemtype,
2025
            },
1981
            }
2026
            $biblio->biblionumber
2027
        );
1982
        );
2028
1983
2029
        AddIssue( $patron->unblessed, $barcode );
1984
        AddIssue( $patron->unblessed, $item->barcode );
2030
1985
2031
        # Simulate item marked as lost
1986
        # Simulate item marked as lost
2032
        ModItem( { itemlost => 3 }, $biblio->biblionumber, $item_id );
1987
        ModItem( { itemlost => 3 }, $biblio->biblionumber, $item->itemnumber );
2033
        LostItem( $item_id, 1 );
1988
        LostItem( $item->itemnumber, 1 );
2034
1989
2035
        my $processing_fee_lines = Koha::Account::Lines->search(
1990
        my $processing_fee_lines = Koha::Account::Lines->search(
2036
            { borrowernumber => $patron->id, itemnumber => $item_id, accounttype => 'PF' } );
1991
            { borrowernumber => $patron->id, itemnumber => $item->itemnumber, accounttype => 'PF' } );
2037
        is( $processing_fee_lines->count, 1, 'Only one processing fee produced' );
1992
        is( $processing_fee_lines->count, 1, 'Only one processing fee produced' );
2038
        my $processing_fee_line = $processing_fee_lines->next;
1993
        my $processing_fee_line = $processing_fee_lines->next;
2039
        is( $processing_fee_line->amount + 0,
1994
        is( $processing_fee_line->amount + 0,
Lines 2042-2048 subtest '_FixAccountForLostAndReturned' => sub { Link Here
2042
            $processfee_amount, 'The right PF amountoutstanding is generated' );
1997
            $processfee_amount, 'The right PF amountoutstanding is generated' );
2043
1998
2044
        my $lost_fee_lines = Koha::Account::Lines->search(
1999
        my $lost_fee_lines = Koha::Account::Lines->search(
2045
            { borrowernumber => $patron->id, itemnumber => $item_id, accounttype => 'L' } );
2000
            { borrowernumber => $patron->id, itemnumber => $item->itemnumber, accounttype => 'L' } );
2046
        is( $lost_fee_lines->count, 1, 'Only one lost item fee produced' );
2001
        is( $lost_fee_lines->count, 1, 'Only one lost item fee produced' );
2047
        my $lost_fee_line = $lost_fee_lines->next;
2002
        my $lost_fee_line = $lost_fee_lines->next;
2048
        is( $lost_fee_line->amount + 0, $replacement_amount, 'The right L amount is generated' );
2003
        is( $lost_fee_line->amount + 0, $replacement_amount, 'The right L amount is generated' );
Lines 2060-2066 subtest '_FixAccountForLostAndReturned' => sub { Link Here
2060
        );
2015
        );
2061
        $credit->apply( { debits => $debts, offset_type => 'Writeoff' } );
2016
        $credit->apply( { debits => $debts, offset_type => 'Writeoff' } );
2062
2017
2063
        my $credit_return_id = C4::Circulation::_FixAccountForLostAndReturned( $item_id, $patron->id );
2018
        my $credit_return_id = C4::Circulation::_FixAccountForLostAndReturned( $item->itemnumber, $patron->id );
2064
        is( $credit_return_id, undef, 'No CR account line added' );
2019
        is( $credit_return_id, undef, 'No CR account line added' );
2065
2020
2066
        $lost_fee_line->discard_changes; # reload from DB
2021
        $lost_fee_line->discard_changes; # reload from DB
Lines 2076-2101 subtest '_FixAccountForLostAndReturned' => sub { Link Here
2076
        plan tests => 12;
2031
        plan tests => 12;
2077
2032
2078
        my $patron = $builder->build_object( { class => 'Koha::Patrons' } );
2033
        my $patron = $builder->build_object( { class => 'Koha::Patrons' } );
2079
        my $barcode = 'KD123456790';
2080
2034
2081
        my ( undef, undef, $item_id ) = AddItem(
2035
        my $item = $builder->gimme_an_item(
2082
            {   homebranch       => $library->branchcode,
2036
            {
2083
                holdingbranch    => $library->branchcode,
2037
                biblionumber     => $biblio->biblionumber,
2084
                barcode          => $barcode,
2038
                library          => $library->branchcode,
2085
                replacementprice => $replacement_amount,
2039
                replacementprice => $replacement_amount,
2086
                itype            => $item_type->itemtype
2040
                itype            => $item_type->itemtype
2087
            },
2041
            }
2088
            $biblio->biblionumber
2089
        );
2042
        );
2090
2043
2091
        AddIssue( $patron->unblessed, $barcode );
2044
        AddIssue( $patron->unblessed, $item->barcode );
2092
2045
2093
        # Simulate item marked as lost
2046
        # Simulate item marked as lost
2094
        ModItem( { itemlost => 1 }, $biblio->biblionumber, $item_id );
2047
        ModItem( { itemlost => 1 }, $biblio->biblionumber, $item->itemnumber );
2095
        LostItem( $item_id, 1 );
2048
        LostItem( $item->itemnumber, 1 );
2096
2049
2097
        my $processing_fee_lines = Koha::Account::Lines->search(
2050
        my $processing_fee_lines = Koha::Account::Lines->search(
2098
            { borrowernumber => $patron->id, itemnumber => $item_id, accounttype => 'PF' } );
2051
            { borrowernumber => $patron->id, itemnumber => $item->itemnumber, accounttype => 'PF' } );
2099
        is( $processing_fee_lines->count, 1, 'Only one processing fee produced' );
2052
        is( $processing_fee_lines->count, 1, 'Only one processing fee produced' );
2100
        my $processing_fee_line = $processing_fee_lines->next;
2053
        my $processing_fee_line = $processing_fee_lines->next;
2101
        is( $processing_fee_line->amount + 0,
2054
        is( $processing_fee_line->amount + 0,
Lines 2104-2110 subtest '_FixAccountForLostAndReturned' => sub { Link Here
2104
            $processfee_amount, 'The right PF amountoutstanding is generated' );
2057
            $processfee_amount, 'The right PF amountoutstanding is generated' );
2105
2058
2106
        my $lost_fee_lines = Koha::Account::Lines->search(
2059
        my $lost_fee_lines = Koha::Account::Lines->search(
2107
            { borrowernumber => $patron->id, itemnumber => $item_id, accounttype => 'L' } );
2060
            { borrowernumber => $patron->id, itemnumber => $item->itemnumber, accounttype => 'L' } );
2108
        is( $lost_fee_lines->count, 1, 'Only one lost item fee produced' );
2061
        is( $lost_fee_lines->count, 1, 'Only one lost item fee produced' );
2109
        my $lost_fee_line = $lost_fee_lines->next;
2062
        my $lost_fee_line = $lost_fee_lines->next;
2110
        is( $lost_fee_line->amount + 0, $replacement_amount, 'The right L amount is generated' );
2063
        is( $lost_fee_line->amount + 0, $replacement_amount, 'The right L amount is generated' );
Lines 2122-2128 subtest '_FixAccountForLostAndReturned' => sub { Link Here
2122
        );
2075
        );
2123
        $credit->apply( { debits => $debts, offset_type => 'Payment' } );
2076
        $credit->apply( { debits => $debts, offset_type => 'Payment' } );
2124
2077
2125
        my $credit_return_id = C4::Circulation::_FixAccountForLostAndReturned( $item_id, $patron->id );
2078
        my $credit_return_id = C4::Circulation::_FixAccountForLostAndReturned( $item->itemnumber, $patron->id );
2126
        my $credit_return = Koha::Account::Lines->find($credit_return_id);
2079
        my $credit_return = Koha::Account::Lines->find($credit_return_id);
2127
2080
2128
        is( $credit_return->accounttype, 'CR', 'An account line of type CR is added' );
2081
        is( $credit_return->accounttype, 'CR', 'An account line of type CR is added' );
Lines 2145-2170 subtest '_FixAccountForLostAndReturned' => sub { Link Here
2145
        plan tests => 10;
2098
        plan tests => 10;
2146
2099
2147
        my $patron = $builder->build_object( { class => 'Koha::Patrons' } );
2100
        my $patron = $builder->build_object( { class => 'Koha::Patrons' } );
2148
        my $barcode = 'KD123456791';
2149
2101
2150
        my ( undef, undef, $item_id ) = AddItem(
2102
        my $item = $builder->gimme_an_item(
2151
            {   homebranch       => $library->branchcode,
2103
            {
2152
                holdingbranch    => $library->branchcode,
2104
                biblionumber     => $biblio->biblionumber,
2153
                barcode          => $barcode,
2105
                library          => $library->branchcode,
2106
                replacementprice => 23.00,
2154
                replacementprice => $replacement_amount,
2107
                replacementprice => $replacement_amount,
2155
                itype            => $item_type->itemtype
2108
                itype            => $item_type->itemtype
2156
            },
2109
            }
2157
            $biblio->biblionumber
2158
        );
2110
        );
2159
2111
2160
        AddIssue( $patron->unblessed, $barcode );
2112
        AddIssue( $patron->unblessed, $item->barcode );
2161
2113
2162
        # Simulate item marked as lost
2114
        # Simulate item marked as lost
2163
        ModItem( { itemlost => 3 }, $biblio->biblionumber, $item_id );
2115
        ModItem( { itemlost => 3 }, $biblio->biblionumber, $item->itemnumber );
2164
        LostItem( $item_id, 1 );
2116
        LostItem( $item->itemnumber, 1 );
2165
2117
2166
        my $processing_fee_lines = Koha::Account::Lines->search(
2118
        my $processing_fee_lines = Koha::Account::Lines->search(
2167
            { borrowernumber => $patron->id, itemnumber => $item_id, accounttype => 'PF' } );
2119
            { borrowernumber => $patron->id, itemnumber => $item->itemnumber, accounttype => 'PF' } );
2168
        is( $processing_fee_lines->count, 1, 'Only one processing fee produced' );
2120
        is( $processing_fee_lines->count, 1, 'Only one processing fee produced' );
2169
        my $processing_fee_line = $processing_fee_lines->next;
2121
        my $processing_fee_line = $processing_fee_lines->next;
2170
        is( $processing_fee_line->amount + 0,
2122
        is( $processing_fee_line->amount + 0,
Lines 2173-2186 subtest '_FixAccountForLostAndReturned' => sub { Link Here
2173
            $processfee_amount, 'The right PF amountoutstanding is generated' );
2125
            $processfee_amount, 'The right PF amountoutstanding is generated' );
2174
2126
2175
        my $lost_fee_lines = Koha::Account::Lines->search(
2127
        my $lost_fee_lines = Koha::Account::Lines->search(
2176
            { borrowernumber => $patron->id, itemnumber => $item_id, accounttype => 'L' } );
2128
            { borrowernumber => $patron->id, itemnumber => $item->itemnumber, accounttype => 'L' } );
2177
        is( $lost_fee_lines->count, 1, 'Only one lost item fee produced' );
2129
        is( $lost_fee_lines->count, 1, 'Only one lost item fee produced' );
2178
        my $lost_fee_line = $lost_fee_lines->next;
2130
        my $lost_fee_line = $lost_fee_lines->next;
2179
        is( $lost_fee_line->amount + 0, $replacement_amount, 'The right L amount is generated' );
2131
        is( $lost_fee_line->amount + 0, $replacement_amount, 'The right L amount is generated' );
2180
        is( $lost_fee_line->amountoutstanding + 0,
2132
        is( $lost_fee_line->amountoutstanding + 0,
2181
            $replacement_amount, 'The right L amountountstanding is generated' );
2133
            $replacement_amount, 'The right L amountountstanding is generated' );
2182
2134
2183
        my $credit_return_id = C4::Circulation::_FixAccountForLostAndReturned( $item_id, $patron->id );
2135
        my $credit_return_id = C4::Circulation::_FixAccountForLostAndReturned( $item->itemnumber, $patron->id );
2184
        is( $credit_return_id, undef, 'No CR account line added' );
2136
        is( $credit_return_id, undef, 'No CR account line added' );
2185
2137
2186
        $lost_fee_line->discard_changes;
2138
        $lost_fee_line->discard_changes;
Lines 2195-2220 subtest '_FixAccountForLostAndReturned' => sub { Link Here
2195
        plan tests => 15;
2147
        plan tests => 15;
2196
2148
2197
        my $patron = $builder->build_object( { class => 'Koha::Patrons' } );
2149
        my $patron = $builder->build_object( { class => 'Koha::Patrons' } );
2198
        my $barcode = 'KD123456792';
2150
        my $item = $builder->gimme_an_item(
2199
2151
            {
2200
        my ( undef, undef, $item_id ) = AddItem(
2152
                biblionumber     => $biblio->biblionumber,
2201
            {   homebranch       => $library->branchcode,
2153
                library          => $library->branchcode,
2202
                holdingbranch    => $library->branchcode,
2203
                barcode          => $barcode,
2204
                replacementprice => $replacement_amount,
2154
                replacementprice => $replacement_amount,
2205
                itype            => $item_type->itemtype
2155
                itype            => $item_type->itemtype
2206
            },
2156
            }
2207
            $biblio->biblionumber
2208
        );
2157
        );
2209
2158
2210
        AddIssue( $patron->unblessed, $barcode );
2159
        AddIssue( $patron->unblessed, $item->barcode );
2211
2160
2212
        # Simulate item marked as lost
2161
        # Simulate item marked as lost
2213
        ModItem( { itemlost => 1 }, $biblio->biblionumber, $item_id );
2162
        ModItem( { itemlost => 1 }, $biblio->biblionumber, $item->itemnumber );
2214
        LostItem( $item_id, 1 );
2163
        LostItem( $item->itemnumber, 1 );
2215
2164
2216
        my $processing_fee_lines = Koha::Account::Lines->search(
2165
        my $processing_fee_lines = Koha::Account::Lines->search(
2217
            { borrowernumber => $patron->id, itemnumber => $item_id, accounttype => 'PF' } );
2166
            { borrowernumber => $patron->id, itemnumber => $item->itemnumber, accounttype => 'PF' } );
2218
        is( $processing_fee_lines->count, 1, 'Only one processing fee produced' );
2167
        is( $processing_fee_lines->count, 1, 'Only one processing fee produced' );
2219
        my $processing_fee_line = $processing_fee_lines->next;
2168
        my $processing_fee_line = $processing_fee_lines->next;
2220
        is( $processing_fee_line->amount + 0,
2169
        is( $processing_fee_line->amount + 0,
Lines 2223-2229 subtest '_FixAccountForLostAndReturned' => sub { Link Here
2223
            $processfee_amount, 'The right PF amountoutstanding is generated' );
2172
            $processfee_amount, 'The right PF amountoutstanding is generated' );
2224
2173
2225
        my $lost_fee_lines = Koha::Account::Lines->search(
2174
        my $lost_fee_lines = Koha::Account::Lines->search(
2226
            { borrowernumber => $patron->id, itemnumber => $item_id, accounttype => 'L' } );
2175
            { borrowernumber => $patron->id, itemnumber => $item->itemnumber, accounttype => 'L' } );
2227
        is( $lost_fee_lines->count, 1, 'Only one lost item fee produced' );
2176
        is( $lost_fee_lines->count, 1, 'Only one lost item fee produced' );
2228
        my $lost_fee_line = $lost_fee_lines->next;
2177
        my $lost_fee_line = $lost_fee_lines->next;
2229
        is( $lost_fee_line->amount + 0, $replacement_amount, 'The right L amount is generated' );
2178
        is( $lost_fee_line->amount + 0, $replacement_amount, 'The right L amount is generated' );
Lines 2257-2263 subtest '_FixAccountForLostAndReturned' => sub { Link Here
2257
            'Payment and write off applied'
2206
            'Payment and write off applied'
2258
        );
2207
        );
2259
2208
2260
        my $credit_return_id = C4::Circulation::_FixAccountForLostAndReturned( $item_id, $patron->id );
2209
        my $credit_return_id = C4::Circulation::_FixAccountForLostAndReturned( $item->itemnumber, $patron->id );
2261
        my $credit_return = Koha::Account::Lines->find($credit_return_id);
2210
        my $credit_return = Koha::Account::Lines->find($credit_return_id);
2262
2211
2263
        is( $account->balance, $processfee_amount - $payment_amount, 'Balance is PF - payment (CR)' );
2212
        is( $account->balance, $processfee_amount - $payment_amount, 'Balance is PF - payment (CR)' );
Lines 2289-2306 subtest '_FixOverduesOnReturn' => sub { Link Here
2289
2238
2290
    my $biblio = $builder->gimme_a_biblio({ author => 'Hall, Kylie' });
2239
    my $biblio = $builder->gimme_a_biblio({ author => 'Hall, Kylie' });
2291
2240
2292
    my $barcode = 'KD987654321';
2293
    my $branchcode  = $library2->{branchcode};
2241
    my $branchcode  = $library2->{branchcode};
2294
2242
2295
    my ( $item_bibnum, $item_bibitemnum, $itemnumber ) = AddItem(
2243
    my $item = $builder->gimme_an_item(
2296
        {
2244
        {
2297
            homebranch       => $branchcode,
2245
            biblionumber     => $biblio->biblionumber,
2298
            holdingbranch    => $branchcode,
2246
            library          => $branchcode,
2299
            barcode          => $barcode,
2300
            replacementprice => 99.00,
2247
            replacementprice => 99.00,
2301
            itype            => $itemtype
2248
            itype            => $itemtype,
2302
        },
2249
        }
2303
        $biblio->biblionumber
2304
    );
2250
    );
2305
2251
2306
    my $patron = $builder->build( { source => 'Borrower' } );
2252
    my $patron = $builder->build( { source => 'Borrower' } );
Lines 2310-2323 subtest '_FixOverduesOnReturn' => sub { Link Here
2310
        {
2256
        {
2311
            borrowernumber => $patron->{borrowernumber},
2257
            borrowernumber => $patron->{borrowernumber},
2312
            accounttype    => 'FU',
2258
            accounttype    => 'FU',
2313
            itemnumber     => $itemnumber,
2259
            itemnumber     => $item->itemnumber,
2314
            amount => 99.00,
2260
            amount => 99.00,
2315
            amountoutstanding => 99.00,
2261
            amountoutstanding => 99.00,
2316
            lastincrement => 9.00,
2262
            lastincrement => 9.00,
2317
        }
2263
        }
2318
    )->store();
2264
    )->store();
2319
2265
2320
    C4::Circulation::_FixOverduesOnReturn( $patron->{borrowernumber}, $itemnumber );
2266
    C4::Circulation::_FixOverduesOnReturn( $patron->{borrowernumber}, $item->itemnumber );
2321
2267
2322
    $accountline->_result()->discard_changes();
2268
    $accountline->_result()->discard_changes();
2323
2269
Lines 2333-2339 subtest '_FixOverduesOnReturn' => sub { Link Here
2333
        }
2279
        }
2334
    )->store();
2280
    )->store();
2335
2281
2336
    C4::Circulation::_FixOverduesOnReturn( $patron->{borrowernumber}, $itemnumber, 1 );
2282
    C4::Circulation::_FixOverduesOnReturn( $patron->{borrowernumber}, $item->itemnumber, 1 );
2337
2283
2338
    $accountline->_result()->discard_changes();
2284
    $accountline->_result()->discard_changes();
2339
2285
Lines 2348-2354 subtest '_FixOverduesOnReturn' => sub { Link Here
2348
        }
2294
        }
2349
    )->store();
2295
    )->store();
2350
2296
2351
    C4::Circulation::_FixOverduesOnReturn( $patron->{borrowernumber}, $itemnumber, 0, 1 );
2297
    C4::Circulation::_FixOverduesOnReturn( $patron->{borrowernumber}, $item->itemnumber, 0, 1 );
2352
2298
2353
    $accountline->_result()->discard_changes();
2299
    $accountline->_result()->discard_changes();
2354
2300
(-)a/t/db_dependent/Circulation/IsItemIssued.t (-16 / +13 lines)
Lines 53-85 my $borrower = Koha::Patrons->find( $borrowernumber )->unblessed; Link Here
53
my $record = MARC::Record->new();
53
my $record = MARC::Record->new();
54
my ( $biblionumber, $biblioitemnumber ) = AddBiblio( $record, '' );
54
my ( $biblionumber, $biblioitemnumber ) = AddBiblio( $record, '' );
55
55
56
my ( undef, undef, $itemnumber ) = AddItem(
56
my $item = $builder->gimme_an_item(
57
    {   homebranch    => $library->{branchcode},
57
    {
58
        holdingbranch => $library->{branchcode},
58
        biblionumber     => $biblionumber,
59
        barcode       => 'i_dont_exist',
59
        library          => $library->{branchcode},
60
        itype         => $itemtype
60
        itype            => $itemtype
61
    },
61
    }
62
    $biblionumber
63
);
62
);
64
63
65
my $item = GetItem( $itemnumber );
64
is ( IsItemIssued( $item->itemnumber ), 0, "item is not on loan at first" );
66
65
67
is ( IsItemIssued( $item->{itemnumber} ), 0, "item is not on loan at first" );
66
AddIssue($borrower, $item->barcode);
68
67
is ( IsItemIssued( $item->itemnumber ), 1, "item is now on loan" );
69
AddIssue($borrower, 'i_dont_exist');
70
is ( IsItemIssued( $item->{itemnumber} ), 1, "item is now on loan" );
71
68
72
is(
69
is(
73
    DelItemCheck( $biblionumber, $itemnumber),
70
    DelItemCheck( $biblionumber, $item->itemnumber),
74
    'book_on_loan',
71
    'book_on_loan',
75
    'item that is on loan cannot be deleted',
72
    'item that is on loan cannot be deleted',
76
);
73
);
77
74
78
AddReturn('i_dont_exist', $library->{branchcode});
75
AddReturn($item->barcode, $library->{branchcode});
79
is ( IsItemIssued( $item->{itemnumber} ), 0, "item has been returned" );
76
is ( IsItemIssued( $item->itemnumber ), 0, "item has been returned" );
80
77
81
is(
78
is(
82
    DelItemCheck( $biblionumber, $itemnumber),
79
    DelItemCheck( $biblionumber, $item->itemnumber),
83
    1,
80
    1,
84
    'item that is not on loan can be deleted',
81
    'item that is not on loan can be deleted',
85
);
82
);
(-)a/t/lib/TestBuilder.pm (-1 / +30 lines)
Lines 4-16 use Modern::Perl; Link Here
4
4
5
use Koha::Database;
5
use Koha::Database;
6
use C4::Biblio;
6
use C4::Biblio;
7
use C4::Items;
7
use Koha::Biblios;
8
use Koha::Biblios;
9
use Koha::Items;
8
10
9
use Bytes::Random::Secure;
11
use Bytes::Random::Secure;
10
use Carp;
12
use Carp;
11
use Module::Load;
13
use Module::Load;
12
use String::Random;
14
use String::Random;
13
15
16
use constant {
17
    SIZE_BARCODE => 20, # Not perfect but avoid to fetch the value when creating a new item
18
};
19
14
sub new {
20
sub new {
15
    my ($class) = @_;
21
    my ($class) = @_;
16
    my $self = {};
22
    my $self = {};
Lines 158-163 sub gimme_a_biblio { Link Here
158
    return Koha::Biblios->find($biblio_id);
164
    return Koha::Biblios->find($biblio_id);
159
}
165
}
160
166
167
sub gimme_an_item {
168
    my ( $self, $args ) = @_;
169
170
    my $biblionumber =
171
      delete $args->{biblionumber} || $self->gimme_a_biblio->biblionumber;
172
    my $library = delete $args->{library}
173
      || $self->build_object( { class => 'Koha::Libraries' } )->branchcode;
174
175
    my $itype = delete $args->{itype}
176
      || $self->build_object( { class => 'Koha::ItemTypes' } )->itemtype;
177
178
    my ( undef, undef, $itemnumber ) = C4::Items::AddItem(
179
        {
180
            homebranch    => $library,
181
            holdingbranch => $library,
182
            barcode       => $self->_gen_text( { info => { size => SIZE_BARCODE } } ),
183
            itype         => $itype,
184
            %$args,
185
        },
186
        $biblionumber
187
    );
188
    return Koha::Items->find($itemnumber);
189
}
190
161
# ------------------------------------------------------------------------------
191
# ------------------------------------------------------------------------------
162
# Internal helper routines
192
# Internal helper routines
163
193
164
- 

Return to bug 21971