From 7573bc8e7345691d291312dd2b791be35a7f3383 Mon Sep 17 00:00:00 2001 From: Tomas Cohen Arazi Date: Wed, 30 Sep 2020 14:40:54 -0300 Subject: [PATCH] Bug 26582: Add Koha::Acquisition::Basket->close This patch adds two methods to Koha::Acquisition::Basket: - 'closed': that tells if the basket is closed - 'close': that closes the basket It inherits the behaviour from CloseBasket (as it actually makes sense). It improves CloseBasket by wrapping the action inside a transaction. It uses the $orders->update call with no_trigger as there's no trigger to trigger and the update can be done on a single DB call. A new exceptions file is added for basket-related exceptions. The only specific exception that gets added is Koha::Exceptions::Acquisition::Basket::AlreadyClosed To test: 1. Apply this patches 2. Run: $ kshell k$ prove t/db_dependent/Koha/Acquisition/Basket.t => SUCCESS: Tests pass! 3. Sign off :-D --- Koha/Acquisition/Basket.pm | 48 +++++++++++++++++++++++++++ Koha/Exceptions/Acquisition/Basket.pm | 47 ++++++++++++++++++++++++++ 2 files changed, 95 insertions(+) create mode 100644 Koha/Exceptions/Acquisition/Basket.pm diff --git a/Koha/Acquisition/Basket.pm b/Koha/Acquisition/Basket.pm index 4b89fd08f4..6cfa64c76f 100644 --- a/Koha/Acquisition/Basket.pm +++ b/Koha/Acquisition/Basket.pm @@ -23,6 +23,7 @@ use Koha::Database; use Koha::DateUtils qw( dt_from_string ); use Koha::Acquisition::BasketGroups; use Koha::Acquisition::Orders; +use Koha::Exceptions::Acquisition::Basket; use Koha::Patrons; use base qw( Koha::Object Koha::Object::Mixin::AdditionalFields ); @@ -155,6 +156,53 @@ sub authorizer { return scalar Koha::Patrons->find($self->authorisedby); } +=head3 closed + + if ( $basket->closed ) { ... } + +Returns a boolean value representing if the basket is closed. + +=cut + +sub closed { + my ($self) = @_; + + return ($self->closedate) ? 1 : 0; +} + +=head3 close + + $basket->close; + +Close the basket and mark all open orders as ordered. + +A I exception is thrown +if the basket is already closed. + +=cut + +sub close { + my ($self) = @_; + + Koha::Exceptions::Acquisition::Basket::AlreadyClosed->throw + if $self->closed; + + $self->_result->result_source->schema->txn_do( + sub { + my $open_orders = $self->orders->search( + { + orderstatus => { not_in => [ 'complete', 'cancelled' ] } + } + ); + # Mark open orders as ordered + $open_orders->update({ orderstatus => 'ordered' }, { no_triggers => 1 }); + # set as closed + $self->set({ closedate => \'NOW()' })->store; + } + ); + + return $self; +} =head3 to_api diff --git a/Koha/Exceptions/Acquisition/Basket.pm b/Koha/Exceptions/Acquisition/Basket.pm new file mode 100644 index 0000000000..94ca5cbf51 --- /dev/null +++ b/Koha/Exceptions/Acquisition/Basket.pm @@ -0,0 +1,47 @@ +package Koha::Exceptions::Acquisition::Basket; + +# This file is part of Koha. +# +# Koha is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# Koha is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Koha; if not, see . + +use Modern::Perl; + +use Exception::Class ( + + 'Koha::Exceptions::Acquisition::Basket' => { + description => 'Something went wrong!', + }, + 'Koha::Exceptions::Acquisition::Basket::AlreadyClosed' => { + isa => 'Koha::Exceptions::Acquisition::Basket', + description => 'Basket is already closed' + } +); + +=head1 NAME + +Koha::Exceptions::Acquisition::Basket - Base class for Basket exceptions + +=head1 Exceptions + +=head2 Koha::Exceptions::Acquisition::Basket + +Generic Nasket exception + +=head2 Koha::Exceptions::Acquisition::Basket::AlreadyClosed + +Exception to be used when an already closed basket is asked to be closed. + +=cut + +1; -- 2.28.0