|
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 |
- |
|
|