From 5f7b2632d74d926deba136340e57654f36bf3787 Mon Sep 17 00:00:00 2001 From: Kyle M Hall Date: Wed, 12 Jun 2019 15:08:08 -0400 Subject: [PATCH] Bug 23103: Cannot checkin items lost by deleted patrons with fines attached Test Plan: 1) Checkout an item to a patron 2) Ensure the item has a replacement cost (or itemtype has default) 3) Ensure patrons are charged when items lost 4) Mark the item lost 5) Confirm patron has a fine 6) Write off the fine 7) Delete the patron 8) Check in the item 9) Note the internal server error 10) Apply this patch 11) Repeat steps 1-8 12) Note there is no internal server error! 13) prove t/db_dependent/Circulation.t Signed-off-by: Martin Renvoize Signed-off-by: Marcel de Rooy Signed-off-by: Martin Renvoize (cherry picked from commit d2a2e4a8d52c2098dd183e6714b03aed5b6a84bb) Signed-off-by: Fridolin Somers (cherry picked from commit 5451e33184f7e8ac84a60ec36d377dd75d222fa2) Signed-off-by: Lucas Gass --- C4/Circulation.pm | 7 +++++- t/db_dependent/Circulation.t | 43 +++++++++++++++++++++++++++++++++++- 2 files changed, 48 insertions(+), 2 deletions(-) diff --git a/C4/Circulation.pm b/C4/Circulation.pm index f708550a2b..432dae55b7 100644 --- a/C4/Circulation.pm +++ b/C4/Circulation.pm @@ -2406,7 +2406,12 @@ sub _FixAccountForLostAndReturned { return unless $accountlines->count > 0; my $accountline = $accountlines->next; my $total_to_refund = 0; - my $account = Koha::Patrons->find( $accountline->borrowernumber )->account; + + return unless $accountline->borrowernumber; + my $patron = Koha::Patrons->find( $accountline->borrowernumber ); + return undef unless $patron; # Patron has been deleted, nobody to credit the return to + + my $account = $patron->account; # Use cases if ( $accountline->amount > $accountline->amountoutstanding ) { diff --git a/t/db_dependent/Circulation.t b/t/db_dependent/Circulation.t index eca86fd357..e224ad3028 100755 --- a/t/db_dependent/Circulation.t +++ b/t/db_dependent/Circulation.t @@ -18,7 +18,7 @@ use Modern::Perl; use utf8; -use Test::More tests => 40; +use Test::More tests => 41; use Test::MockModule; use Data::Dumper; @@ -2433,6 +2433,47 @@ subtest '_FixOverduesOnReturn' => sub { is( $offset->amount, '-9.000000', "Amount of offset is correct" ); }; +subtest '_FixAccountForLostAndReturned returns undef if patron is deleted' => sub { + plan tests => 1; + + my $manager = $builder->build_object({ class => "Koha::Patrons" }); + t::lib::Mocks::mock_userenv({ patron => $manager, branchcode => $manager->branchcode }); + + my $biblio = $builder->build_sample_biblio({ author => 'Hall, Kylie' }); + + my $branchcode = $library2->{branchcode}; + + my $item = $builder->build_sample_item( + { + biblionumber => $biblio->biblionumber, + library => $branchcode, + replacementprice => 99.00, + itype => $itemtype, + } + ); + + my $patron = $builder->build_object( { class => 'Koha::Patrons' } ); + + ## Start with basic call, should just close out the open fine + my $accountline = Koha::Account::Line->new( + { + borrowernumber => $patron->id, + accounttype => 'L', + status => undef, + itemnumber => $item->itemnumber, + amount => 99.00, + amountoutstanding => 99.00, + } + )->store(); + + $patron->delete(); + + my $return_value = C4::Circulation::_FixAccountForLostAndReturned( $patron->id, $item->itemnumber ); + + is( $return_value, undef, "_FixAccountForLostAndReturned returns undef if patron is deleted" ); + +}; + subtest 'Set waiting flag' => sub { plan tests => 4; -- 2.39.5