From 25cd004f1cfdc781e61bddc37f7679c904833c79 Mon Sep 17 00:00:00 2001 From: Martin Renvoize Date: Mon, 10 Feb 2020 14:55:13 +0000 Subject: [PATCH] Bug 22393: Remove last remaining use of C4::Accounts::manualinvoice This patch re-arrange the manualinvoice controller script to clarify code flow, replaces the last call to C4::Accounts::manualinvoice with a call to Koha::Accounts->add_debit wrapped in a try catch block. It also adds a check on passed barcodes when the invoice type is 'LOST' so it can link the subsequently created accuntline to the item and issue. --- members/maninvoice.pl | 142 +++++++++++++++++++++++++----------------- 1 file changed, 86 insertions(+), 56 deletions(-) diff --git a/members/maninvoice.pl b/members/maninvoice.pl index f271d1f791..665bcbbf73 100755 --- a/members/maninvoice.pl +++ b/members/maninvoice.pl @@ -23,6 +23,7 @@ # along with Koha; if not, see . use Modern::Perl; +use Try::Tiny; use C4::Auth; use C4::Output; @@ -60,6 +61,17 @@ unless ($patron) { exit; } +my $logged_in_user = Koha::Patrons->find($loggedinuser); +output_and_exit_if_error( + $input, $cookie, + $template, + { + module => 'members', + logged_in_user => $logged_in_user, + current_patron => $patron + } +); + my $library_id = C4::Context->userenv->{'branch'}; my $add = $input->param('add'); @@ -72,69 +84,87 @@ if ($add) { } ); -# Note: If the logged in user is not allowed to see this patron an invoice can be forced -# Here we are trusting librarians not to hack the system + # Note: If the logged in user is not allowed to see this patron an invoice can be forced + # Here we are trusting librarians not to hack the system + my $desc = $input->param('desc'); + my $amount = $input->param('amount'); + my $note = $input->param('note'); + my $debit_type = $input->param('type'); + + # If LOST try to match barcode to Item and then try to match Item + Borrower to an Issue. + my $failed; + my $item_id; my $barcode = $input->param('barcode'); - my $itemnum; if ($barcode) { my $item = Koha::Items->find( { barcode => $barcode } ); - $itemnum = $item->itemnumber if $item; - } - my $desc = $input->param('desc'); - my $amount = $input->param('amount'); - my $type = $input->param('type'); - my $note = $input->param('note'); - my $error = - C4::Accounts::manualinvoice( $borrowernumber, $itemnum, $desc, $type, - $amount, $note ); - if ($error) { - if ( $error =~ /FOREIGN KEY/ && $error =~ /itemnumber/ ) { - $template->param( 'ITEMNUMBER' => 1 ); + if ($item) { + $item_id = $item->itemnumber; + } + else { + $template->param( error => 'itemnumber' ); + $failed = 1; } - $template->param( - csrf_token => Koha::Token->new->generate_csrf( - { session_id => scalar $input->cookie('CGISESSID') } - ) - ); - $template->param( 'ERROR' => $error ); - output_html_with_http_headers $input, $cookie, $template->output; } - else { + my $issue_id; + if ( $debit_type eq 'LOST' && $item_id ) { + my $checkouts = Koha::Checkouts->search( + { itemnumber => $item_id, borrowernumber => $borrowernumber } ); + my $checkout = + $checkouts->count + ? $checkouts->next + : Koha::Old::Checkouts->search( + { itemnumber => $item_id, borrowernumber => $borrowernumber }, + { order_by => { -desc => 'returndate' }, rows => 1 } + )->next; + $issue_id = $checkout ? $checkout->issue_id : undef; + } - if ( C4::Context->preference('AccountAutoReconcile') ) { - $patron->account->reconcile_balance; - } + unless ($failed) { + try { + $patron->account->add_debit( + { + amount => $amount, + description => $desc, + note => $note, + user_id => $logged_in_user->borrowernumber, + interface => 'intranet', + library_id => $library_id, + type => $debit_type, + item_id => $item_id, + issue_id => $issue_id + } + ); - print $input->redirect( - "/cgi-bin/koha/members/boraccount.pl?borrowernumber=$borrowernumber" - ); - exit; - } -} -else { + if ( C4::Context->preference('AccountAutoReconcile') ) { + $patron->account->reconcile_balance; + } - my $logged_in_user = Koha::Patrons->find($loggedinuser) - or die "Not logged in"; - output_and_exit_if_error( - $input, $cookie, - $template, - { - module => 'members', - logged_in_user => $logged_in_user, - current_patron => $patron + print $input->redirect( + "/cgi-bin/koha/members/boraccount.pl?borrowernumber=$borrowernumber" + ); + exit; + } + catch { + my $error = $_; + if ( ref($error) eq 'Koha::Exceptions::Object::FKConstraint' ) { + $template->param( error => $error->broken_fk ); + } else { + $template->param( error => '1' ); + } } - ); - - my @debit_types = Koha::Account::DebitTypes->search_with_library_limits( - { can_be_invoiced => 1, archived => 0 }, - {}, $library_id ); - $template->param( debit_types => \@debit_types ); - $template->param( - csrf_token => Koha::Token->new->generate_csrf( - { session_id => scalar $input->cookie('CGISESSID') } - ), - patron => $patron, - finesview => 1, - ); - output_html_with_http_headers $input, $cookie, $template->output; + } } + +my @debit_types = Koha::Account::DebitTypes->search_with_library_limits( + { can_be_invoiced => 1, archived => 0 }, + {}, $library_id ); + +$template->param( + debit_types => \@debit_types, + csrf_token => Koha::Token->new->generate_csrf( + { session_id => scalar $input->cookie('CGISESSID') } + ), + patron => $patron, + finesview => 1, +); +output_html_with_http_headers $input, $cookie, $template->output; -- 2.20.1