Lines 20-25
Link Here
|
20 |
|
20 |
|
21 |
use CGI qw ( -utf8 ); |
21 |
use CGI qw ( -utf8 ); |
22 |
use Modern::Perl; |
22 |
use Modern::Perl; |
|
|
23 |
use Try::Tiny; |
24 |
|
23 |
use C4::Auth; |
25 |
use C4::Auth; |
24 |
use C4::Output; |
26 |
use C4::Output; |
25 |
use C4::Biblio; |
27 |
use C4::Biblio; |
Lines 34-39
use C4::Members;
Link Here
|
34 |
use MARC::File::XML; |
36 |
use MARC::File::XML; |
35 |
use List::MoreUtils qw/uniq/; |
37 |
use List::MoreUtils qw/uniq/; |
36 |
|
38 |
|
|
|
39 |
use Koha::Database; |
40 |
use Koha::Exceptions::Exception; |
37 |
use Koha::AuthorisedValues; |
41 |
use Koha::AuthorisedValues; |
38 |
use Koha::Biblios; |
42 |
use Koha::Biblios; |
39 |
use Koha::DateUtils; |
43 |
use Koha::DateUtils; |
Lines 181-287
if ($op eq "action") {
Link Here
|
181 |
} |
185 |
} |
182 |
} |
186 |
} |
183 |
|
187 |
|
184 |
# For each item |
188 |
try { |
185 |
my $i = 1; |
189 |
my $schema = Koha::Database->new->schema; |
186 |
foreach my $itemnumber(@itemnumbers){ |
190 |
$schema->txn_do( |
187 |
|
191 |
sub { |
188 |
$job->progress($i) if $runinbackground; |
192 |
# For each item |
189 |
my $item = Koha::Items->find($itemnumber); |
193 |
my $i = 1; |
190 |
next unless $item; # Should have been tested earlier, but just in case... |
194 |
foreach my $itemnumber (@itemnumbers) { |
191 |
my $itemdata = $item->unblessed; |
195 |
$job->progress($i) if $runinbackground; |
192 |
if ( $del ){ |
196 |
my $item = Koha::Items->find($itemnumber); |
193 |
my $return = $item->safe_delete; |
197 |
next |
194 |
if (ref($return)) { |
198 |
unless $item |
195 |
$deleted_items++; |
199 |
; # Should have been tested earlier, but just in case... |
196 |
} else { |
200 |
my $itemdata = $item->unblessed; |
197 |
$not_deleted_items++; |
201 |
if ($del) { |
198 |
push @not_deleted, |
202 |
my $return = $item->safe_delete; |
199 |
{ biblionumber => $itemdata->{'biblionumber'}, |
203 |
if ( ref( $return ) ) { |
200 |
itemnumber => $itemdata->{'itemnumber'}, |
204 |
$deleted_items++; |
201 |
barcode => $itemdata->{'barcode'}, |
205 |
} |
202 |
title => $itemdata->{'title'}, |
206 |
else { |
203 |
$return => 1 |
207 |
$not_deleted_items++; |
204 |
}; |
208 |
push @not_deleted, |
205 |
} |
209 |
{ |
|
|
210 |
biblionumber => $itemdata->{'biblionumber'}, |
211 |
itemnumber => $itemdata->{'itemnumber'}, |
212 |
barcode => $itemdata->{'barcode'}, |
213 |
title => $itemdata->{'title'}, |
214 |
reason => $return, |
215 |
}; |
216 |
} |
206 |
|
217 |
|
207 |
# If there are no items left, delete the biblio |
218 |
# If there are no items left, delete the biblio |
208 |
if ($del_records) { |
219 |
if ($del_records) { |
209 |
my $itemscount = Koha::Biblios->find( $itemdata->{'biblionumber'} )->items->count; |
220 |
my $itemscount = Koha::Biblios->find( $itemdata->{'biblionumber'} )->items->count; |
210 |
if ( $itemscount == 0 ) { |
221 |
if ( $itemscount == 0 ) { |
211 |
my $error = DelBiblio( $itemdata->{'biblionumber'} ); |
222 |
my $error = DelBiblio( $itemdata->{'biblionumber'} ); |
212 |
unless ($error) { |
223 |
unless ($error) { |
213 |
$deleted_records++; |
224 |
$deleted_records++; |
214 |
if ( $src eq 'CATALOGUING' ) { |
225 |
if ( $src eq 'CATALOGUING' ) { |
215 |
# We are coming catalogue/detail.pl, there were items from a single bib record |
226 |
# We are coming catalogue/detail.pl, there were items from a single bib record |
216 |
$template->param( biblio_deleted => 1 ); |
227 |
$template->param( biblio_deleted => 1 ); |
|
|
228 |
} |
229 |
} |
230 |
} |
217 |
} |
231 |
} |
218 |
} |
232 |
} |
219 |
} |
233 |
else { |
220 |
} |
234 |
if ( $values_to_modify || $values_to_blank ) { |
221 |
} else { |
235 |
my $localmarcitem = Item2Marc($itemdata); |
222 |
if ($values_to_modify || $values_to_blank) { |
236 |
my $modified = 0; |
223 |
my $localmarcitem = Item2Marc($itemdata); |
237 |
|
224 |
my $modified = 0; |
238 |
for ( my $i = 0 ; $i < @tags ; $i++ ) { |
225 |
|
239 |
my $search = $searches[$i]; |
226 |
for ( my $i = 0 ; $i < @tags ; $i++ ) { |
240 |
next unless $search; |
227 |
my $search = $searches[$i]; |
241 |
|
228 |
next unless $search; |
242 |
my $tag = $tags[$i]; |
229 |
|
243 |
my $subfield = $subfields[$i]; |
230 |
my $tag = $tags[$i]; |
244 |
my $replace = $replaces[$i]; |
231 |
my $subfield = $subfields[$i]; |
245 |
|
232 |
my $replace = $replaces[$i]; |
246 |
my $value = $localmarcitem->field( $tag )->subfield( $subfield ); |
233 |
|
247 |
my $old_value = $value; |
234 |
my $value = $localmarcitem->field( $tag )->subfield( $subfield ); |
248 |
|
235 |
my $old_value = $value; |
249 |
my @available_modifiers = qw( i g ); |
236 |
|
250 |
my $retained_modifiers = q||; |
237 |
my @available_modifiers = qw( i g ); |
251 |
for my $modifier ( split //, $modifiers[$i] ) { |
238 |
my $retained_modifiers = q||; |
252 |
$retained_modifiers .= $modifier |
239 |
for my $modifier ( split //, $modifiers[$i] ) { |
253 |
if grep {/$modifier/} @available_modifiers; |
240 |
$retained_modifiers .= $modifier |
254 |
} |
241 |
if grep {/$modifier/} @available_modifiers; |
255 |
if ( $retained_modifiers =~ m/^(ig|gi)$/ ) { |
242 |
} |
256 |
$value =~ s/$search/$replace/ig; |
243 |
if ( $retained_modifiers =~ m/^(ig|gi)$/ ) { |
257 |
} |
244 |
$value =~ s/$search/$replace/ig; |
258 |
elsif ( $retained_modifiers eq 'i' ) { |
245 |
} |
259 |
$value =~ s/$search/$replace/i; |
246 |
elsif ( $retained_modifiers eq 'i' ) { |
260 |
} |
247 |
$value =~ s/$search/$replace/i; |
261 |
elsif ( $retained_modifiers eq 'g' ) { |
248 |
} |
262 |
$value =~ s/$search/$replace/g; |
249 |
elsif ( $retained_modifiers eq 'g' ) { |
263 |
} |
250 |
$value =~ s/$search/$replace/g; |
264 |
else { |
251 |
} |
265 |
$value =~ s/$search/$replace/; |
252 |
else { |
266 |
} |
253 |
$value =~ s/$search/$replace/; |
267 |
|
254 |
} |
268 |
my @fields_to = $localmarcitem->field($tag); |
255 |
|
269 |
foreach my $field_to_update ( @fields_to ) { |
256 |
my @fields_to = $localmarcitem->field($tag); |
270 |
unless ( $old_value eq $value ) { |
257 |
foreach my $field_to_update ( @fields_to ) { |
271 |
$modified++; |
258 |
unless ( $old_value eq $value ) { |
272 |
$field_to_update->update( $subfield => $value ); |
259 |
$modified++; |
273 |
} |
260 |
$field_to_update->update( $subfield => $value ); |
274 |
} |
|
|
275 |
} |
276 |
|
277 |
$modified += UpdateMarcWith( $marcitem, $localmarcitem ); |
278 |
if ($modified) { |
279 |
eval { |
280 |
if ( |
281 |
my $item = ModItemFromMarc( |
282 |
$localmarcitem, |
283 |
$itemdata->{biblionumber}, |
284 |
$itemnumber |
285 |
) |
286 |
) |
287 |
{ |
288 |
LostItem( $itemnumber, 'batchmod' ) |
289 |
if $item->{itemlost} |
290 |
and not $itemdata->{itemlost}; |
291 |
} |
292 |
}; |
293 |
} |
294 |
if ($runinbackground) { |
295 |
$modified_items++ if $modified; |
296 |
$modified_fields += $modified; |
297 |
$job->set( |
298 |
{ |
299 |
modified_items => $modified_items, |
300 |
modified_fields => $modified_fields, |
301 |
} |
302 |
); |
303 |
} |
304 |
} |
261 |
} |
305 |
} |
|
|
306 |
$i++; |
307 |
} |
308 |
if (@not_deleted) { |
309 |
Koha::Exceptions::Exception->throw( |
310 |
'Some items have not been deleted, rolling back'); |
262 |
} |
311 |
} |
263 |
} |
312 |
} |
264 |
|
313 |
); |
265 |
$modified += UpdateMarcWith( $marcitem, $localmarcitem ); |
314 |
} |
266 |
if ( $modified ) { |
315 |
catch { |
267 |
eval { |
316 |
if ( $_->isa('Koha::Exceptions::Exception') ) { |
268 |
if ( my $item = ModItemFromMarc( $localmarcitem, $itemdata->{biblionumber}, $itemnumber ) ) { |
317 |
$template->param( deletion_failed => 1 ); |
269 |
LostItem($itemnumber, 'batchmod') if $item->{itemlost} and not $itemdata->{itemlost}; |
318 |
} |
270 |
} |
319 |
die "Something terrible has happened!" |
271 |
}; |
320 |
if ($_ =~ /Rollback failed/); # Rollback failed |
272 |
} |
321 |
} |
273 |
if ( $runinbackground ) { |
|
|
274 |
$modified_items++ if $modified; |
275 |
$modified_fields += $modified; |
276 |
$job->set({ |
277 |
modified_items => $modified_items, |
278 |
modified_fields => $modified_fields, |
279 |
}); |
280 |
} |
281 |
} |
282 |
} |
283 |
$i++; |
284 |
} |
285 |
} |
322 |
} |
286 |
} |
323 |
} |
287 |
# |
324 |
# |
288 |
- |
|
|