Lines 20-25
package Koha::Items;
Link Here
|
20 |
use Modern::Perl; |
20 |
use Modern::Perl; |
21 |
use Array::Utils qw( array_minus ); |
21 |
use Array::Utils qw( array_minus ); |
22 |
use List::MoreUtils qw( uniq ); |
22 |
use List::MoreUtils qw( uniq ); |
|
|
23 |
use Try::Tiny; |
23 |
|
24 |
|
24 |
use C4::Context; |
25 |
use C4::Context; |
25 |
use C4::Biblio qw( GetMarcStructure GetMarcFromKohaField ); |
26 |
use C4::Biblio qw( GetMarcStructure GetMarcFromKohaField ); |
Lines 242-339
sub batch_update {
Link Here
|
242 |
|
243 |
|
243 |
my (@modified_itemnumbers, $modified_fields); |
244 |
my (@modified_itemnumbers, $modified_fields); |
244 |
my $i; |
245 |
my $i; |
|
|
246 |
my $schema = Koha::Database->new->schema; |
245 |
while ( my $item = $self->next ) { |
247 |
while ( my $item = $self->next ) { |
246 |
|
248 |
|
247 |
my $modified_holds_priority = 0; |
249 |
try {$schema->txn_do(sub { |
248 |
if ( defined $exclude_from_local_holds_priority ) { |
250 |
my $modified_holds_priority = 0; |
249 |
if(!defined $item->exclude_from_local_holds_priority || $item->exclude_from_local_holds_priority != $exclude_from_local_holds_priority) { |
251 |
if ( defined $exclude_from_local_holds_priority ) { |
250 |
$item->exclude_from_local_holds_priority($exclude_from_local_holds_priority)->store; |
252 |
if(!defined $item->exclude_from_local_holds_priority || $item->exclude_from_local_holds_priority != $exclude_from_local_holds_priority) { |
251 |
$modified_holds_priority = 1; |
253 |
$item->exclude_from_local_holds_priority($exclude_from_local_holds_priority)->store; |
|
|
254 |
$modified_holds_priority = 1; |
255 |
} |
252 |
} |
256 |
} |
253 |
} |
|
|
254 |
|
255 |
my $modified = 0; |
256 |
my $new_values = {%$new_values}; # Don't modify the original |
257 |
|
258 |
my $old_values = $item->unblessed; |
259 |
if ( $item->more_subfields_xml ) { |
260 |
$old_values = { |
261 |
%$old_values, |
262 |
%{$item->additional_attributes->to_hashref}, |
263 |
}; |
264 |
} |
265 |
|
257 |
|
266 |
for my $attr ( keys %$regex_mod ) { |
258 |
my $modified = 0; |
267 |
my $old_value = $old_values->{$attr}; |
259 |
my $new_values = {%$new_values}; # Don't modify the original |
268 |
|
260 |
|
269 |
next unless $old_value; |
261 |
my $old_values = $item->unblessed; |
|
|
262 |
if ( $item->more_subfields_xml ) { |
263 |
$old_values = { |
264 |
%$old_values, |
265 |
%{$item->additional_attributes->to_hashref}, |
266 |
}; |
267 |
} |
270 |
|
268 |
|
271 |
my $value = apply_regex( |
269 |
for my $attr ( keys %$regex_mod ) { |
272 |
{ |
270 |
my $old_value = $old_values->{$attr}; |
273 |
%{ $regex_mod->{$attr} }, |
|
|
274 |
value => $old_value, |
275 |
} |
276 |
); |
277 |
|
271 |
|
278 |
$new_values->{$attr} = $value; |
272 |
next unless $old_value; |
279 |
} |
|
|
280 |
|
273 |
|
281 |
for my $attribute ( keys %$new_values ) { |
274 |
my $value = apply_regex( |
282 |
next if $attribute eq 'more_subfields_xml'; # Already counted before |
275 |
{ |
|
|
276 |
%{ $regex_mod->{$attr} }, |
277 |
value => $old_value, |
278 |
} |
279 |
); |
283 |
|
280 |
|
284 |
my $old = $old_values->{$attribute}; |
281 |
$new_values->{$attr} = $value; |
285 |
my $new = $new_values->{$attribute}; |
282 |
} |
286 |
$modified++ |
|
|
287 |
if ( defined $old xor defined $new ) |
288 |
|| ( defined $old && defined $new && $new ne $old ); |
289 |
} |
290 |
|
283 |
|
291 |
{ # Dealing with more_subfields_xml |
284 |
for my $attribute ( keys %$new_values ) { |
292 |
|
285 |
next if $attribute eq 'more_subfields_xml'; # Already counted before |
293 |
my $frameworkcode = $item->biblio->frameworkcode; |
|
|
294 |
my $tagslib = C4::Biblio::GetMarcStructure( 1, $frameworkcode, { unsafe => 1 }); |
295 |
my ( $itemtag, $itemsubfield ) = C4::Biblio::GetMarcFromKohaField( "items.itemnumber" ); |
296 |
|
297 |
my @more_subfield_tags = map { |
298 |
( |
299 |
ref($_) |
300 |
&& %$_ |
301 |
&& !$_->{kohafield} # Get subfields that are not mapped |
302 |
) |
303 |
? $_->{tagsubfield} |
304 |
: () |
305 |
} values %{ $tagslib->{$itemtag} }; |
306 |
|
307 |
my $more_subfields_xml = Koha::Item::Attributes->new( |
308 |
{ |
309 |
map { |
310 |
exists $new_values->{$_} ? ( $_ => $new_values->{$_} ) |
311 |
: exists $old_values->{$_} |
312 |
? ( $_ => $old_values->{$_} ) |
313 |
: () |
314 |
} @more_subfield_tags |
315 |
} |
316 |
)->to_marcxml($frameworkcode); |
317 |
|
286 |
|
318 |
$new_values->{more_subfields_xml} = $more_subfields_xml; |
287 |
my $old = $old_values->{$attribute}; |
|
|
288 |
my $new = $new_values->{$attribute}; |
289 |
$modified++ |
290 |
if ( defined $old xor defined $new ) |
291 |
|| ( defined $old && defined $new && $new ne $old ); |
292 |
} |
319 |
|
293 |
|
320 |
delete $new_values->{$_} for @more_subfield_tags; # Clean the hash |
294 |
{ # Dealing with more_subfields_xml |
|
|
295 |
|
296 |
my $frameworkcode = $item->biblio->frameworkcode; |
297 |
my $tagslib = C4::Biblio::GetMarcStructure( 1, $frameworkcode, { unsafe => 1 }); |
298 |
my ( $itemtag, $itemsubfield ) = C4::Biblio::GetMarcFromKohaField( "items.itemnumber" ); |
299 |
|
300 |
my @more_subfield_tags = map { |
301 |
( |
302 |
ref($_) |
303 |
&& %$_ |
304 |
&& !$_->{kohafield} # Get subfields that are not mapped |
305 |
) |
306 |
? $_->{tagsubfield} |
307 |
: () |
308 |
} values %{ $tagslib->{$itemtag} }; |
309 |
|
310 |
my $more_subfields_xml = Koha::Item::Attributes->new( |
311 |
{ |
312 |
map { |
313 |
exists $new_values->{$_} ? ( $_ => $new_values->{$_} ) |
314 |
: exists $old_values->{$_} |
315 |
? ( $_ => $old_values->{$_} ) |
316 |
: () |
317 |
} @more_subfield_tags |
318 |
} |
319 |
)->to_marcxml($frameworkcode); |
320 |
|
321 |
$new_values->{more_subfields_xml} = $more_subfields_xml; |
322 |
|
323 |
delete $new_values->{$_} for @more_subfield_tags; # Clean the hash |
321 |
|
324 |
|
322 |
} |
325 |
} |
323 |
|
326 |
|
324 |
if ( $modified ) { |
327 |
if ( $modified ) { |
325 |
my $itemlost_pre = $item->itemlost; |
328 |
my $itemlost_pre = $item->itemlost; |
326 |
$item->set($new_values)->store({skip_record_index => 1}); |
329 |
$item->set($new_values)->store({skip_record_index => 1}); |
327 |
|
330 |
|
328 |
LostItem( |
331 |
LostItem( |
329 |
$item->itemnumber, 'batchmod', undef, |
332 |
$item->itemnumber, 'batchmod', undef, |
330 |
{ skip_record_index => 1 } |
333 |
{ skip_record_index => 1 } |
331 |
) if $item->itemlost |
334 |
) if $item->itemlost |
332 |
and not $itemlost_pre; |
335 |
and not $itemlost_pre; |
333 |
|
336 |
|
334 |
push @modified_itemnumbers, $item->itemnumber if $modified || $modified_holds_priority; |
337 |
push @modified_itemnumbers, $item->itemnumber if $modified || $modified_holds_priority; |
335 |
$modified_fields += $modified + $modified_holds_priority; |
338 |
$modified_fields += $modified + $modified_holds_priority; |
336 |
} |
339 |
} |
|
|
340 |
})}; |
337 |
|
341 |
|
338 |
if ( $callback ) { |
342 |
if ( $callback ) { |
339 |
$callback->(++$i); |
343 |
$callback->(++$i); |
340 |
- |
|
|