From a9de5bd0eef958291a9a51cca2de9aa49a248b77 Mon Sep 17 00:00:00 2001 From: Tomas Cohen Arazi Date: Wed, 23 Sep 2020 11:36:21 -0300 Subject: [PATCH] Bug 26515: Add Koha::Acquisition::Order->cancel This patch introduces an OO replacement for DelOrder. It does the same thing. It doesn't die when trying to delete items or biblio. It sets an error message on the order object so the caller knows what happened. To test: 1. Apply this patches 2. Run: $ kshell k$ prove t/db_dependent/Koha/Acquisition/Order.t => SUCCESS: Tests pass! 3. Read the tests carefully to understand how they cover all use cases. 4- Sign off :-D Sponsored-by: ByWater Solutions Signed-off-by: Martin Renvoize Signed-off-by: Kyle M Hall Signed-off-by: Jonathan Druart --- Koha/Acquisition/Order.pm | 70 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) diff --git a/Koha/Acquisition/Order.pm b/Koha/Acquisition/Order.pm index 2747a78fc5..dbb04f9afc 100644 --- a/Koha/Acquisition/Order.pm +++ b/Koha/Acquisition/Order.pm @@ -18,6 +18,9 @@ package Koha::Acquisition::Order; use Modern::Perl; use Carp qw( croak ); +use Try::Tiny; + +use C4::Biblio qw(DelBiblio); use Koha::Acquisition::Baskets; use Koha::Acquisition::Funds; @@ -25,6 +28,7 @@ use Koha::Acquisition::Invoices; use Koha::Acquisition::Order::Claims; use Koha::Database; use Koha::DateUtils qw( dt_from_string output_pref ); +use Koha::Exceptions::Object; use Koha::Biblios; use Koha::Holds; use Koha::Items; @@ -97,6 +101,72 @@ sub store { return $self; } +=head3 cancel + + $order->cancel( + { [ reason => $reason, + delete_biblio => $delete_biblio ] + } + ); + +This method marks an order as cancelled, optionally using the I parameter. +As the order is cancelled, the (eventual) items linked to it are removed. +If I is passed, it will try to remove the linked biblio. + +If either the items or biblio removal fails, an error message is added to the object +so the caller can take appropriate actions. + +=cut + +sub cancel { + my ($self, $params) = @_; + + my $delete_biblio = $params->{delete_biblio}; + my $reason = $params->{reason}; + + try { + # Delete the related items + $self->items->safe_delete; + + my $biblio = $self->biblio; + if ( $biblio and $delete_biblio ) { + + if ( $biblio->active_orders->count == 0 + and $biblio->subscriptions->count == 0 + and $biblio->items->count == 0 ) + { + + my $error = DelBiblio( $biblio->id ); + $self->add_message({ message => 'error_delbiblio', error => $error }) + if $error; + } + else { + + $self->add_message({ message => 'error_delbiblio' }); + } + } + } + catch { + if ( ref($_) eq 'Koha::Exceptions::Object::CannotBeDeleted' ) { + my $object = $_->object; + if ( ref($object) eq 'Koha::Item' ) { + $self->add_message({ message => 'error_delitem' }); + } + } + }; + + # Update order status + $self->set( + { + cancellationreason => $reason, + datecancellationprinted => \'NOW()', + orderstatus => 'cancelled', + } + )->store; + + return $self; +} + =head3 add_item $order->add_item( $itemnumber ); -- 2.39.5