Koha-clms/Koha/Preservation/Train.pm

159 lines
4.5 KiB
Perl

package Koha::Preservation::Train;
# 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 <https://www.gnu.org/licenses>.
use Modern::Perl;
use JSON qw( to_json );
use Try::Tiny;
use Koha::Database;
use base qw(Koha::Object);
use Koha::Preservation::Processings;
use Koha::Preservation::Train::Items;
use Koha::Exceptions::Preservation;
=head1 NAME
Koha::Preservation::Train - Koha Train Object class
=head1 API
=head2 Class methods
=cut
=head3 default_processing
Return the default processing object for this train
=cut
sub default_processing {
my ($self) = @_;
my $rs = $self->_result->default_processing;
return unless $rs;
return Koha::Preservation::Processing->_new_from_dbic($rs);
}
=head3 add_item
Add item to this train
my $train_item = $train->add_item({item_id => $itemnumber, processing_id => $processing_id}, { skip_waiting_list_check => 0|1 });
my $train_item = $train->add_item({barcode => $barcode, processing_id => $processing_id, { skip_waiting_list_check => 0|1 });
skip_waitin_list_check can be set to true if the item can be added to the train even if the item is not in the waiting list.
=cut
sub add_item {
my ( $self, $train_item, $params ) = @_;
Koha::Exceptions::Preservation::CannotAddItemToClosedTrain->throw if $self->closed_on;
my $skip_waiting_list_check = $params->{skip_waiting_list_check} || 0;
my $not_for_loan = C4::Context->preference('PreservationNotForLoanWaitingListIn');
my $key = exists $train_item->{item_id} ? 'itemnumber' : 'barcode';
my $item = Koha::Items->find( { $key => $train_item->{item_id} || $train_item->{barcode} } );
Koha::Exceptions::Preservation::ItemNotFound->throw unless $item;
Koha::Exceptions::Preservation::ItemNotInWaitingList->throw
if !$skip_waiting_list_check && $item->notforloan != $not_for_loan;
my $already_in_train = Koha::Preservation::Train::Items->search(
{ item_id => $train_item->{item_id}, 'train.received_on' => undef },
{ join => 'train' }
);
if ( $already_in_train->count ) {
my $train_id = $already_in_train->next->train_id;
Koha::Exceptions::Preservation::ItemAlreadyInAnotherTrain->throw( train_id => $train_id );
}
# FIXME We need a LOCK here
# Not important for now as we have add_items
# Note that there are several other places in Koha with this max+1 problem
my $max = $self->items->search->_resultset->get_column("user_train_item_id")->max || 0;
my $train_item_object = Koha::Preservation::Train::Item->new(
{
train_id => $self->train_id,
item_id => $item->itemnumber,
processing_id => $train_item->{processing_id} || $self->default_processing_id,
user_train_item_id => $max + 1,
added_on => \'NOW()',
}
)->store;
$item->notforloan( $self->not_for_loan )->store;
return $train_item_object->get_from_storage;
}
=head3 add_items
my $train_items = $train->add_items([$item_1, $item_2]);
Add items in batch.
=cut
sub add_items {
my ( $self, $train_items ) = @_;
my @added_items;
for my $train_item (@$train_items) {
try {
my $added_item = $self->add_item($train_item);
$added_item->attributes( $train_item->{attributes} );
push @added_items, $added_item;
} catch {
# FIXME Do we rollback and raise an error or just skip it?
# FIXME See status code 207 partial success
warn "Item not added to train: " . $_;
};
}
return Koha::Preservation::Train::Items->search( { train_item_id => [ map { $_->train_item_id } @added_items ] } );
}
=head3 items
my $items = $train->items;
Return the items in this train.
=cut
sub items {
my ($self) = @_;
my $items_rs = $self->_result->preservation_trains_items;
return Koha::Preservation::Train::Items->_new_from_dbic($items_rs);
}
=head2 Internal methods
=head3 _type
=cut
sub _type {
return 'PreservationTrain';
}
1;