1 package Koha::BackgroundJob::BatchDeleteBiblio;
7 use Koha::BackgroundJob::BatchUpdateBiblioHoldsQueue;
8 use Koha::SearchEngine;
9 use Koha::SearchEngine::Indexer;
11 use base 'Koha::BackgroundJob';
15 Koha::BackgroundJob::BatchDeleteBiblio - Batch delete bibliographic records
17 This is a subclass of Koha::BackgroundJob.
25 Define the job type of this job: batch_biblio_record_deletion
30 return 'batch_biblio_record_deletion';
40 my ( $self, $args ) = @_;
42 if ( $self->status eq 'cancelled' ) {
46 # FIXME If the job has already been started, but started again (worker has been restart for instance)
47 # Then we will start from scratch and so double delete the same records
51 my $mmtid = $args->{mmtid};
52 my @record_ids = @{ $args->{record_ids} };
55 total_records => scalar @record_ids,
59 my $schema = Koha::Database->new->schema;
60 RECORD_IDS: for my $record_id ( sort { $a <=> $b } @record_ids ) {
62 last if $self->get_from_storage->status eq 'cancelled';
64 next unless $record_id;
66 $schema->storage->txn_begin;
68 my $biblionumber = $record_id;
69 # First, checking if issues exist.
70 # If yes, nothing to do
71 my $biblio = Koha::Biblios->find( $biblionumber );
73 # TODO Replace with $biblio->get_issues->count
74 if ( C4::Biblio::CountItemsIssued( $biblionumber ) ) {
77 code => 'item_issued',
78 biblionumber => $biblionumber,
80 $schema->storage->txn_rollback;
87 my $holds = $biblio->holds;
88 while ( my $hold = $holds->next ) {
90 $hold->cancel({ skip_holds_queue => 1 });
95 code => 'reserve_not_cancelled',
96 biblionumber => $biblionumber,
97 reserve_id => $hold->reserve_id,
100 $schema->storage->txn_rollback;
108 my $items = Koha::Items->search({ biblionumber => $biblionumber });
109 while ( my $item = $items->next ) {
110 my $deleted = $item->safe_delete({ skip_record_index => 1, skip_holds_queue => 1 });
111 unless ( $deleted ) {
114 code => 'item_not_deleted',
115 biblionumber => $biblionumber,
116 itemnumber => $item->itemnumber,
117 error => @{$deleted->messages}[0]->message,
119 $schema->storage->txn_rollback;
126 # Finally, delete the biblio
128 C4::Biblio::DelBiblio( $biblionumber, { skip_record_index => 1, skip_holds_queue => 1 } );
130 if ( $error or $@ ) {
133 code => 'biblio_not_deleted',
134 biblionumber => $biblionumber,
135 error => ($@ ? $@ : $error),
137 $schema->storage->txn_rollback;
145 code => 'biblio_deleted',
146 biblionumber => $biblionumber,
148 $report->{total_success}++;
149 $schema->storage->txn_commit;
154 my @deleted_biblionumbers =
155 map { $_->{code} eq 'biblio_deleted' ? $_->{biblionumber} : () }
158 if ( @deleted_biblionumbers ) {
159 my $indexer = Koha::SearchEngine::Indexer->new({ index => $Koha::SearchEngine::BIBLIOS_INDEX });
160 $indexer->index_records( \@deleted_biblionumbers, "recordDelete", "biblioserver" );
162 Koha::BackgroundJob::BatchUpdateBiblioHoldsQueue->new->enqueue(
164 biblio_ids => \@deleted_biblionumbers
166 ) if C4::Context->preference('RealTimeHoldsQueue');
169 my $data = $self->decoded_data;
170 $data->{messages} = \@messages;
171 $data->{report} = $report;
173 $self->finish( $data );
183 my ( $self, $args) = @_;
185 # TODO Raise exception instead
186 return unless exists $args->{record_ids};
188 my @record_ids = @{ $args->{record_ids} };
190 $self->SUPER::enqueue({
191 job_size => scalar @record_ids,
192 job_args => {record_ids => \@record_ids,},
193 job_queue => 'long_tasks',