1 package Koha::BackgroundJob::BatchDeleteItem;
3 # This file is part of Koha.
5 # Koha is free software; you can redistribute it and/or modify it
6 # under the terms of the GNU General Public License as published by
7 # the Free Software Foundation; either version 3 of the License, or
8 # (at your option) any later version.
10 # Koha is distributed in the hope that it will be useful, but
11 # WITHOUT ANY WARRANTY; without even the implied warranty of
12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 # GNU General Public License for more details.
15 # You should have received a copy of the GNU General Public License
16 # along with Koha; if not, see <http://www.gnu.org/licenses>.
20 Koha::BackgroundJob::BatchDeleteItem - Background job derived class to process item deletion in batch
25 use List::MoreUtils qw( uniq );
28 use Koha::DateUtils qw( dt_from_string );
31 use base 'Koha::BackgroundJob';
39 Return the job type 'batch_item_record_deletion'.
44 return 'batch_item_record_deletion';
49 Koha::BackgroundJobs->find($id)->process(
51 record_ids => \@itemnumbers,
52 deleted_biblios => 0|1,
56 Will delete all the items that have been passed for deletion.
58 When deleted_biblios is passed, if we deleted the last item of a biblio,
59 the bibliographic record will be deleted as well.
61 The search engine's index will be updated according to the changes made
62 to the deleted bibliographic recods.
64 The generated report will be:
66 deleted_itemnumbers => \@list_of_itemnumbers,
67 not_deleted_itemnumbers => \@list_of_itemnumbers,
68 deleted_biblionumbers=> \@list_of_biblionumbers,
74 my ( $self, $args ) = @_;
76 if ( $self->status eq 'cancelled' ) {
80 # FIXME If the job has already been started, but started again (worker has been restart for instance)
81 # Then we will start from scratch and so double delete the same records
84 $self->started_on(dt_from_string)->progress($job_progress)
85 ->status('started')->store;
87 my @record_ids = @{ $args->{record_ids} };
88 my $delete_biblios = $args->{delete_biblios};
91 total_records => scalar @record_ids,
95 my $schema = Koha::Database->new->schema;
96 my ( @deleted_itemnumbers, @not_deleted_itemnumbers,
97 @deleted_biblionumbers );
100 my $schema = Koha::Database->new->schema;
104 for my $record_id ( sort { $a <=> $b } @record_ids ) {
106 last if $self->get_from_storage->status eq 'cancelled';
108 my $item = Koha::Items->find($record_id) || next;
110 my $return = $item->safe_delete({ skip_record_index => 1, skip_holds_queue => 1 });
113 # FIXME Do we need to rollback the whole transaction if a deletion failed?
114 push @not_deleted_itemnumbers, $item->itemnumber;
118 code => 'item_not_deleted',
119 itemnumber => $item->itemnumber,
120 biblionumber => $item->biblionumber,
121 barcode => $item->barcode,
122 title => $item->biblio->title,
123 reason => @{$return->messages}[0]->message,
129 push @deleted_itemnumbers, $item->itemnumber;
130 push @biblionumbers, $item->biblionumber;
132 $report->{total_success}++;
133 $self->progress( ++$job_progress )->store;
136 # If there are no items left, delete the biblio
137 my @updated_biblionumbers;
138 for my $biblionumber ( uniq @biblionumbers ) {
140 Koha::Biblios->find($biblionumber)->items->count;
141 if ( $delete_biblios && $items_count == 0 ) {
142 my $error = C4::Biblio::DelBiblio( $biblionumber,
143 { skip_record_index => 1, skip_holds_queue => 1 } );
145 push @deleted_biblionumbers, $biblionumber;
148 push @updated_biblionumbers, $biblionumber;
152 if (@deleted_biblionumbers) {
153 my $indexer = Koha::SearchEngine::Indexer->new(
154 { index => $Koha::SearchEngine::BIBLIOS_INDEX } );
156 $indexer->index_records( \@deleted_biblionumbers,
157 'recordDelete', "biblioserver", undef );
159 Koha::BackgroundJob::BatchUpdateBiblioHoldsQueue->new->enqueue(
161 biblio_ids => \@deleted_biblionumbers
163 ) if C4::Context->preference('RealTimeHoldsQueue');
166 if (@updated_biblionumbers) {
167 my $indexer = Koha::SearchEngine::Indexer->new(
168 { index => $Koha::SearchEngine::BIBLIOS_INDEX } );
170 $indexer->index_records( \@updated_biblionumbers,
171 'specialUpdate', "biblioserver", undef );
173 Koha::BackgroundJob::BatchUpdateBiblioHoldsQueue->new->enqueue(
175 biblio_ids => \@updated_biblionumbers
177 ) if C4::Context->preference('RealTimeHoldsQueue');
193 die "Something terrible has happened!"
194 if ( $_ =~ /Rollback failed/ ); # Rollback failed
197 $report->{deleted_itemnumbers} = \@deleted_itemnumbers;
198 $report->{not_deleted_itemnumbers} = \@not_deleted_itemnumbers;
199 $report->{deleted_biblionumbers} = \@deleted_biblionumbers;
201 my $json = $self->json;
202 my $job_data = $json->decode($self->data);
203 $job_data->{messages} = \@messages;
204 $job_data->{report} = $report;
206 $self->ended_on(dt_from_string)->data( $json->encode($job_data));
207 $self->status('finished') if $self->status ne 'cancelled';
213 Koha::BackgroundJob::BatchDeleteItem->new->enqueue(
215 record_ids => \@itemnumbers,
216 deleted_biblios => 0|1,
225 my ( $self, $args ) = @_;
227 # TODO Raise exception instead
228 return unless exists $args->{record_ids};
230 my @record_ids = @{ $args->{record_ids} };
231 my $delete_biblios = $args->{delete_biblios} || 0;
233 $self->SUPER::enqueue(
235 job_size => scalar @record_ids,
237 record_ids => \@record_ids,
238 delete_biblios => $delete_biblios,
240 queue => 'long_tasks',