Lines 33-39
use Pod::Usage;
Link Here
|
33 |
binmode(STDOUT, ":utf8"); |
33 |
binmode(STDOUT, ":utf8"); |
34 |
my ( $input_marc_file, $number, $offset) = ('',0,0); |
34 |
my ( $input_marc_file, $number, $offset) = ('',0,0); |
35 |
my ($version, $delete, $test_parameter, $skip_marc8_conversion, $char_encoding, $verbose, $commit, $fk_off,$format,$biblios,$authorities,$keepids,$match, $isbn_check, $logfile); |
35 |
my ($version, $delete, $test_parameter, $skip_marc8_conversion, $char_encoding, $verbose, $commit, $fk_off,$format,$biblios,$authorities,$keepids,$match, $isbn_check, $logfile); |
36 |
my ($sourcetag,$sourcesubfield,$idmapfl); |
36 |
my ($sourcetag,$sourcesubfield,$idmapfl, $dedup_barcode); |
37 |
|
37 |
|
38 |
$|=1; |
38 |
$|=1; |
39 |
|
39 |
|
Lines 59-64
GetOptions(
Link Here
|
59 |
'x:s' => \$sourcetag, |
59 |
'x:s' => \$sourcetag, |
60 |
'y:s' => \$sourcesubfield, |
60 |
'y:s' => \$sourcesubfield, |
61 |
'idmap:s' => \$idmapfl, |
61 |
'idmap:s' => \$idmapfl, |
|
|
62 |
'dedupbarcode' => \$dedup_barcode, |
62 |
); |
63 |
); |
63 |
$biblios=!$authorities||$biblios; |
64 |
$biblios=!$authorities||$biblios; |
64 |
|
65 |
|
Lines 344-349
RECORD: while ( ) {
Link Here
|
344 |
else{ |
345 |
else{ |
345 |
printlog({id=>$id||$originalid||$biblionumber, op=>"insert",status=>"ok"}) if ($logfile); |
346 |
printlog({id=>$id||$originalid||$biblionumber, op=>"insert",status=>"ok"}) if ($logfile); |
346 |
} |
347 |
} |
|
|
348 |
my $clone_record = $record->clone(); |
347 |
eval { ( $itemnumbers_ref, $errors_ref ) = AddItemBatchFromMarc( $record, $biblionumber, $biblioitemnumber, '' ); }; |
349 |
eval { ( $itemnumbers_ref, $errors_ref ) = AddItemBatchFromMarc( $record, $biblionumber, $biblioitemnumber, '' ); }; |
348 |
if ( $@ ) { |
350 |
if ( $@ ) { |
349 |
warn "ERROR: Adding items to bib $biblionumber failed: $@\n"; |
351 |
warn "ERROR: Adding items to bib $biblionumber failed: $@\n"; |
Lines 356-362
RECORD: while ( ) {
Link Here
|
356 |
else{ |
358 |
else{ |
357 |
printlog({id=>$id||$originalid||$biblionumber, op=>"insert",status=>"ok"}) if ($logfile); |
359 |
printlog({id=>$id||$originalid||$biblionumber, op=>"insert",status=>"ok"}) if ($logfile); |
358 |
} |
360 |
} |
359 |
if ($#{ $errors_ref } > -1) { |
361 |
if ($dedup_barcode && grep { exists $_->{error_code} && $_->{error_code} eq 'duplicate_barcode' } @$errors_ref) { |
|
|
362 |
# Find the record called 'barcode' |
363 |
my ($tag, $sub) = C4::Biblio::GetMarcFromKohaField('items.barcode', ''); |
364 |
# Now remove any items that didn't have a duplicate_barcode error, |
365 |
# erase the barcodes on items that did, and re-add those items. |
366 |
my %dupes; |
367 |
foreach my $i (0 .. $#{$errors_ref}) { |
368 |
my $ref = $errors_ref->[$i]; |
369 |
if ($ref && $ref->{error_code} eq 'duplicate_barcode') { |
370 |
$dupes{$ref->{item_sequence}} = 1; |
371 |
# Delete the error message because we're going to |
372 |
# retry this one. |
373 |
delete $errors_ref->[$i]; |
374 |
} |
375 |
} |
376 |
my $seq = 0; |
377 |
foreach my $field ($record->field($tag)) { |
378 |
$seq++; |
379 |
if ($dupes{$seq}) { |
380 |
# Here we remove the barcode |
381 |
$field->delete_subfield(code => $sub); |
382 |
} else { |
383 |
# otherwise we delete the field because we don't want |
384 |
# two of them |
385 |
$record->delete_fields($field); |
386 |
} |
387 |
} |
388 |
# Now re-add the record as before, adding errors to the prev list |
389 |
my $more_errors; |
390 |
eval { ( $itemnumbers_ref, $more_errors ) = AddItemBatchFromMarc( $record, $biblionumber, $biblioitemnumber, '' ); }; |
391 |
if ( $@ ) { |
392 |
warn "ERROR: Adding items to bib $biblionumber failed: $@\n"; |
393 |
printlog({id=>$id||$originalid||$biblionumber, op=>"insertitem",status=>"ERROR"}) if ($logfile); |
394 |
# if we failed because of an exception, assume that |
395 |
# the MARC columns in biblioitems were not set. |
396 |
ModBiblioMarc( $record, $biblionumber, '' ); |
397 |
next RECORD; |
398 |
} else { |
399 |
printlog({id=>$id||$originalid||$biblionumber, op=>"insert",status=>"ok"}) if ($logfile); |
400 |
} |
401 |
push @$errors_ref, @{ $more_errors }; |
402 |
} |
403 |
if ($#{ $errors_ref } > -1) { |
360 |
report_item_errors($biblionumber, $errors_ref); |
404 |
report_item_errors($biblionumber, $errors_ref); |
361 |
} |
405 |
} |
362 |
} |
406 |
} |
Lines 427-432
sub report_item_errors {
Link Here
|
427 |
my $errors_ref = shift; |
471 |
my $errors_ref = shift; |
428 |
|
472 |
|
429 |
foreach my $error (@{ $errors_ref }) { |
473 |
foreach my $error (@{ $errors_ref }) { |
|
|
474 |
next if !$error; |
430 |
my $msg = "Item not added (bib $biblionumber, item tag #$error->{'item_sequence'}, barcode $error->{'item_barcode'}): "; |
475 |
my $msg = "Item not added (bib $biblionumber, item tag #$error->{'item_sequence'}, barcode $error->{'item_barcode'}): "; |
431 |
my $error_code = $error->{'error_code'}; |
476 |
my $error_code = $error->{'error_code'}; |
432 |
$error_code =~ s/_/ /g; |
477 |
$error_code =~ s/_/ /g; |
Lines 558-563
Store ids in 009 (usefull for authorities, where 001 contains the authid for
Link Here
|
558 |
Koha, that can contain a very valuable info for authorities coming from LOC or |
603 |
Koha, that can contain a very valuable info for authorities coming from LOC or |
559 |
BNF. useless for biblios probably) |
604 |
BNF. useless for biblios probably) |
560 |
|
605 |
|
|
|
606 |
=item B<-dedupbarcodes> |
607 |
|
608 |
If set, whenever a duplicate barcode is detected, it is removed and the attempt |
609 |
to add the record is retried, thereby giving the record a blank barcode. This |
610 |
is useful when something has set barcodes to be a biblio ID, or similar |
611 |
(usually other software.) |
612 |
|
561 |
=back |
613 |
=back |
562 |
|
614 |
|
563 |
=cut |
615 |
=cut |
564 |
- |
|
|