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

Signed-off-by: Martin Renvoize <martin.renvoize@ptfs-europe.com>

Signed-off-by: Katrin Fischer <katrin.fischer.83@web.de>

Signed-off-by: Jonathan Druart <jonathan.druart@bugs.koha-community.org>
This commit is contained in:
Tomás Cohen Arazi 2020-09-30 14:40:54 -03:00 committed by Jonathan Druart
parent bea89005ca
commit ddf8dfcad0
2 changed files with 95 additions and 0 deletions

View file

@ -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<Koha::Exceptions::Acquisition::Basket::AlreadyClosed> 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

View file

@ -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 <http://www.gnu.org/licenses>.
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;