From f5d0d6dd04d7a435be296d3fd25f1f694986226d 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 --- 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.20.1