From 0098f1c29c3cef76a1e5c710b9b37fc716d86575 Mon Sep 17 00:00:00 2001 From: Aleisha Amohia Date: Tue, 12 Sep 2017 05:15:36 +0000 Subject: [PATCH] [SIGNED-OFF] Bug 19293: Prevent error when receiving shipment with order with deleted biblio MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This patch checks if the biblio exists when receiving a shipment, and will skip the order if the biblio does not exist. To test: 1) Find or create a basket 2) Add TWO items to it 3) Find the record for one item in a separate tab, delete the record 4) Notice the order in the basket for that item now says 'deleted bibliographic record' 5) close the basket and receive the shipment 6) After entering an invoice number and clicking next, you'll see the error: Can't call method "subscriptions" on an undefined value at /home/vagrant/kohaclone/acqui/parcel.pl line 245. 7) Apply the patch and go back to the basket to receive the shipment 8) Put in an invoice number and click next 9) This should now work as expected, skipping the deleted biblio, and the other item should show as ready to receive Sponsored-by: Catalyst IT Patch applies and works as described when test plan is followed. Signed-off-by: Dilan Johnpullé --- acqui/parcel.pl | 88 +++++++++++++++++++++++++++++---------------------------- 1 file changed, 45 insertions(+), 43 deletions(-) diff --git a/acqui/parcel.pl b/acqui/parcel.pl index 5c73d97..15c04ea 100755 --- a/acqui/parcel.pl +++ b/acqui/parcel.pl @@ -225,50 +225,52 @@ unless( defined $invoice->{closedate} ) { for (my $i = 0 ; $i < $countpendings ; $i++) { my $order = $pendingorders->[$i]; - if ( $bookseller->invoiceincgst ) { - $order->{ecost} = $order->{ecost_tax_included}; - } else { - $order->{ecost} = $order->{ecost_tax_excluded}; + unless( !defined $order->{biblionumber} ){ # if this biblio has been deleted and the orderline hasn't been cancelled + if ( $bookseller->invoiceincgst ) { + $order->{ecost} = $order->{ecost_tax_included}; + } else { + $order->{ecost} = $order->{ecost_tax_excluded}; + } + $order->{total} = $order->{ecost} * $order->{quantity}; + + my %line = %$order; + + $line{invoice} = $invoice; + $line{booksellerid} = $booksellerid; + + my $biblionumber = $line{'biblionumber'}; + my $biblio = Koha::Biblios->find( $biblionumber ); + my $countbiblio = CountBiblioInOrders($biblionumber); + my $ordernumber = $line{'ordernumber'}; + my $cnt_subscriptions = $biblio->subscriptions->count; + my $itemcount = $biblio->items->count; + my $holds_count = $biblio->holds->count; + my @items = GetItemnumbersFromOrder( $ordernumber ); + my $itemholds = $biblio ? $biblio->holds->search({ itemnumber => { -in => \@items } })->count : 0; + + my $suggestion = GetSuggestionInfoFromBiblionumber($line{biblionumber}); + $line{suggestionid} = $suggestion->{suggestionid}; + $line{surnamesuggestedby} = $suggestion->{surnamesuggestedby}; + $line{firstnamesuggestedby} = $suggestion->{firstnamesuggestedby}; + + # if the biblio is not in other orders and if there is no items elsewhere and no subscriptions and no holds we can then show the link "Delete order and Biblio" see bug 5680 + $line{can_del_bib} = 1 if $countbiblio <= 1 && $itemcount == scalar @items && !($cnt_subscriptions) && !($holds_count); + $line{items} = ($itemcount) - (scalar @items); + $line{left_item} = 1 if $line{items} >= 1; + $line{left_biblio} = 1 if $countbiblio > 1; + $line{biblios} = $countbiblio - 1; + $line{left_subscription} = 1 if $cnt_subscriptions; + $line{subscriptions} = $cnt_subscriptions; + $line{left_holds} = ($holds_count >= 1) ? 1 : 0; + $line{left_holds_on_order} = 1 if $line{left_holds}==1 && ($line{items} == 0 || $itemholds ); + $line{holds} = $holds_count; + $line{holds_on_order} = $itemholds?$itemholds:$holds_count if $line{left_holds_on_order}; + + my $budget_name = GetBudgetName( $line{budget_id} ); + $line{budget_name} = $budget_name; + + push @loop_orders, \%line; } - $order->{total} = $order->{ecost} * $order->{quantity}; - - my %line = %$order; - - $line{invoice} = $invoice; - $line{booksellerid} = $booksellerid; - - my $biblionumber = $line{'biblionumber'}; - my $biblio = Koha::Biblios->find( $biblionumber ); - my $countbiblio = CountBiblioInOrders($biblionumber); - my $ordernumber = $line{'ordernumber'}; - my $cnt_subscriptions = $biblio->subscriptions->count; - my $itemcount = $biblio->items->count; - my $holds_count = $biblio->holds->count; - my @items = GetItemnumbersFromOrder( $ordernumber ); - my $itemholds = $biblio ? $biblio->holds->search({ itemnumber => { -in => \@items } })->count : 0; - - my $suggestion = GetSuggestionInfoFromBiblionumber($line{biblionumber}); - $line{suggestionid} = $suggestion->{suggestionid}; - $line{surnamesuggestedby} = $suggestion->{surnamesuggestedby}; - $line{firstnamesuggestedby} = $suggestion->{firstnamesuggestedby}; - - # if the biblio is not in other orders and if there is no items elsewhere and no subscriptions and no holds we can then show the link "Delete order and Biblio" see bug 5680 - $line{can_del_bib} = 1 if $countbiblio <= 1 && $itemcount == scalar @items && !($cnt_subscriptions) && !($holds_count); - $line{items} = ($itemcount) - (scalar @items); - $line{left_item} = 1 if $line{items} >= 1; - $line{left_biblio} = 1 if $countbiblio > 1; - $line{biblios} = $countbiblio - 1; - $line{left_subscription} = 1 if $cnt_subscriptions; - $line{subscriptions} = $cnt_subscriptions; - $line{left_holds} = ($holds_count >= 1) ? 1 : 0; - $line{left_holds_on_order} = 1 if $line{left_holds}==1 && ($line{items} == 0 || $itemholds ); - $line{holds} = $holds_count; - $line{holds_on_order} = $itemholds?$itemholds:$holds_count if $line{left_holds_on_order}; - - my $budget_name = GetBudgetName( $line{budget_id} ); - $line{budget_name} = $budget_name; - - push @loop_orders, \%line; } $template->param( -- 2.1.4