diff --git a/Koha/Old/Biblio.pm b/Koha/Old/Biblio.pm index a8fd3be719..3bff29ff60 100644 --- a/Koha/Old/Biblio.pm +++ b/Koha/Old/Biblio.pm @@ -181,35 +181,42 @@ sub restore { $params //= {}; - my $biblio_data = $self->unblessed; - my $biblioitem = $self->biblioitem; - my $biblioitem_data = $biblioitem->unblessed; - my $metadata = $self->metadata; - my $metadata_data = $metadata->unblessed; - - my $new_biblio = Koha::Biblio->new($biblio_data)->store; - - $biblioitem_data->{biblionumber} = $new_biblio->biblionumber; - $biblioitem_data->{biblioitemnumber} = $new_biblio->biblionumber; - Koha::Biblioitem->new($biblioitem_data)->store; - - delete $metadata_data->{id}; - $metadata_data->{biblionumber} = $new_biblio->biblionumber; - Koha::Biblio::Metadata->new($metadata_data)->store; - - $metadata->delete; - $biblioitem->delete; - $self->delete; - my $patron = $params->{patron}; my $item_ids = $params->{item_ids}; my $restore_all = $params->{restore_all} // 0; + my $biblionumber = $self->biblionumber; my @restored_items; my @skipped_items; + my $new_biblio = Koha::Database->schema->txn_do( + sub { + my $biblio_data = $self->unblessed; + my $biblioitem = $self->biblioitem; + my $biblioitem_data = $biblioitem->unblessed; + my $metadata = $self->metadata; + my $metadata_data = $metadata->unblessed; + + my $biblio = Koha::Biblio->new($biblio_data)->store; + + $biblioitem_data->{biblionumber} = $biblio->biblionumber; + $biblioitem_data->{biblioitemnumber} = $biblio->biblionumber; + Koha::Biblioitem->new($biblioitem_data)->store; + + delete $metadata_data->{id}; + $metadata_data->{biblionumber} = $biblio->biblionumber; + Koha::Biblio::Metadata->new($metadata_data)->store; + + $metadata->delete; + $biblioitem->delete; + $self->delete; + + return $biblio; + } + ); + if ( $restore_all || $item_ids ) { - my $deleted_items = $self->items; + my $deleted_items = Koha::Old::Items->search( { biblionumber => $biblionumber } ); while ( my $deleted_item = $deleted_items->next ) { my $should_restore = 0; diff --git a/Koha/Old/Item.pm b/Koha/Old/Item.pm index 12b0a8b2ff..ba675f7993 100644 --- a/Koha/Old/Item.pm +++ b/Koha/Old/Item.pm @@ -23,6 +23,7 @@ use C4::Context; use C4::Log qw( logaction ); use Koha::Biblio; use Koha::Biblios; +use Koha::Database; use Koha::Exceptions; use Koha::Item; use Koha::Old::Biblios; @@ -78,12 +79,17 @@ sub restore { Koha::Exceptions::ObjectNotFound->throw("Bibliographic record not found for item") unless $biblio; - my $item_data = $self->unblessed; - delete $item_data->{deleted_on}; + my $new_item = Koha::Database->schema->txn_do( + sub { + my $item_data = $self->unblessed; + delete $item_data->{deleted_on}; - my $new_item = Koha::Item->new($item_data)->store; + my $item = Koha::Item->new($item_data)->store; + $self->delete; - $self->delete; + return $item; + } + ); my $indexer = Koha::SearchEngine::Indexer->new( { index => $Koha::SearchEngine::BIBLIOS_INDEX } ); $indexer->index_records( $new_item->biblionumber, "specialUpdate", "biblioserver" ); diff --git a/Koha/REST/V1/DeletedItems.pm b/Koha/REST/V1/DeletedItems.pm index a6f297b396..04eda65d0c 100644 --- a/Koha/REST/V1/DeletedItems.pm +++ b/Koha/REST/V1/DeletedItems.pm @@ -20,6 +20,7 @@ use Modern::Perl; use Mojo::Base 'Mojolicious::Controller'; use Koha::Exceptions; +use Koha::Exceptions::Object; use Koha::Old::Items; use Scalar::Util qw( blessed ); @@ -110,6 +111,12 @@ sub restore { } ); } + if ( blessed $_ && $_->isa('Koha::Exceptions::Object::DuplicateID') ) { + return $c->render( + status => 409, + openapi => { error => "Cannot restore item: another item with the same barcode already exists." } + ); + } $c->unhandled_exception($_); }; } diff --git a/installer/data/mysql/mandatory/userpermissions.sql b/installer/data/mysql/mandatory/userpermissions.sql index 47bd748b07..96f27765b2 100644 --- a/installer/data/mysql/mandatory/userpermissions.sql +++ b/installer/data/mysql/mandatory/userpermissions.sql @@ -133,7 +133,7 @@ INSERT INTO permissions (module_bit, code, description) VALUES (13, 'records_batchmod', 'Perform batch modification of records (biblios or authorities)'), (13, 'marc_modification_templates', 'Manage marc modification templates'), (13, 'records_batchdel', 'Perform batch deletion of records (bibliographic or authority)'), - (13, 'records_restore', 'Restore deleted records'), + (13, 'records_restore', 'Restore deleted bibliographic records and items'), (13, 'access_files', 'Access to the files stored on the server'), (13, 'upload_general_files', 'Upload any file'), (13, 'upload_manage', 'Manage uploaded files'), diff --git a/koha-tmpl/intranet-tmpl/prog/en/includes/cat-menu.inc b/koha-tmpl/intranet-tmpl/prog/en/includes/cat-menu.inc index 8839186e6e..5ebcbdc329 100644 --- a/koha-tmpl/intranet-tmpl/prog/en/includes/cat-menu.inc +++ b/koha-tmpl/intranet-tmpl/prog/en/includes/cat-menu.inc @@ -43,7 +43,7 @@ [% END %] - [% IF ( CAN_user_tools_items_batchmod || CAN_user_tools_items_batchdel || CAN_user_tools_records_batchmod || CAN_user_tools_records_batchdel || CAN_user_tools_records_restore || CAN_user_tools_marc_modification_templates || CAN_user_editcatalogue_edit_catalogue ) %] + [% IF ( CAN_user_tools_items_batchmod || CAN_user_tools_items_batchdel || CAN_user_tools_records_batchmod || CAN_user_tools_records_batchdel || CAN_user_tools_records_restore || CAN_user_tools_marc_modification_templates ) %]
Batch editing