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 JSON qw( encode_json decode_json );
26 use List::MoreUtils qw( uniq );
29 use Koha::DateUtils qw( dt_from_string );
32 use base 'Koha::BackgroundJob';
40 Return the job type 'batch_item_record_deletion'.
45 return 'batch_item_record_deletion';
50 Koha::BackgroundJobs->find($id)->process(
52 record_ids => \@itemnumbers,
53 deleted_biblios => 0|1,
57 Will delete all the items that have been passed for deletion.
59 When deleted_biblios is passed, if we deleted the last item of a biblio,
60 the bibliographic record will be deleted as well.
62 The search engine's index will be updated according to the changes made
63 to the deleted bibliographic recods.
65 The generated report will be:
67 deleted_itemnumbers => \@list_of_itemnumbers,
68 not_deleted_itemnumbers => \@list_of_itemnumbers,
69 deleted_biblionumbers=> \@list_of_biblionumbers,
75 my ( $self, $args ) = @_;
77 if ( $self->status eq 'cancelled' ) {
81 # FIXME If the job has already been started, but started again (worker has been restart for instance)
82 # Then we will start from scratch and so double delete the same records
85 $self->started_on(dt_from_string)->progress($job_progress)
86 ->status('started')->store;
88 my @record_ids = @{ $args->{record_ids} };
89 my $delete_biblios = $args->{delete_biblios};
92 total_records => scalar @record_ids,
96 my $schema = Koha::Database->new->schema;
97 my ( @deleted_itemnumbers, @not_deleted_itemnumbers,
98 @deleted_biblionumbers );
101 my $schema = Koha::Database->new->schema;
105 for my $record_id ( sort { $a <=> $b } @record_ids ) {
107 last if $self->get_from_storage->status eq 'cancelled';
109 my $item = Koha::Items->find($record_id) || next;
111 my $return = $item->safe_delete;
114 # FIXME Do we need to rollback the whole transaction if a deletion failed?
115 push @not_deleted_itemnumbers, $item->itemnumber;
119 code => 'item_not_deleted',
120 itemnumber => $item->itemnumber,
121 biblionumber => $item->biblionumber,
122 barcode => $item->barcode,
123 title => $item->biblio->title,
124 reason => @{$return->messages}[0]->message,
130 push @deleted_itemnumbers, $item->itemnumber;
131 push @biblionumbers, $item->biblionumber;
133 $report->{total_success}++;
134 $self->progress( ++$job_progress )->store;
137 # If there are no items left, delete the biblio
138 if ( $delete_biblios && @biblionumbers ) {
139 for my $biblionumber ( uniq @biblionumbers ) {
141 Koha::Biblios->find($biblionumber)->items->count;
142 if ( $items_count == 0 ) {
143 my $error = C4::Biblio::DelBiblio( $biblionumber,
144 { skip_record_index => 1 } );
146 push @deleted_biblionumbers, $biblionumber;
151 if (@deleted_biblionumbers) {
152 my $indexer = Koha::SearchEngine::Indexer->new(
153 { index => $Koha::SearchEngine::BIBLIOS_INDEX } );
155 $indexer->index_records( \@deleted_biblionumbers,
156 'recordDelete', "biblioserver", undef );
173 die "Something terrible has happened!"
174 if ( $_ =~ /Rollback failed/ ); # Rollback failed
177 $report->{deleted_itemnumbers} = \@deleted_itemnumbers;
178 $report->{not_deleted_itemnumbers} = \@not_deleted_itemnumbers;
179 $report->{deleted_biblionumbers} = \@deleted_biblionumbers;
181 my $job_data = decode_json $self->data;
182 $job_data->{messages} = \@messages;
183 $job_data->{report} = $report;
185 $self->ended_on(dt_from_string)->data( encode_json $job_data);
186 $self->status('finished') if $self->status ne 'cancelled';
192 Koha::BackgroundJob::BatchDeleteItem->new->enqueue(
194 record_ids => \@itemnumbers,
195 deleted_biblios => 0|1,
204 my ( $self, $args ) = @_;
206 # TODO Raise exception instead
207 return unless exists $args->{record_ids};
209 my @record_ids = @{ $args->{record_ids} };
210 my $delete_biblios = $args->{delete_biblios} || 0;
212 $self->SUPER::enqueue(
214 job_size => scalar @record_ids,
216 record_ids => \@record_ids,
217 delete_biblios => $delete_biblios,
219 queue => 'long_tasks',