@@ -, +, @@ --- C4/Acquisition.pm | 2 +- C4/Biblio.pm | 22 ++++++++++++++++++++++ C4/Items.pm | 2 +- cataloguing/additem.pl | 2 +- t/db_dependent/Biblio.t | 22 +++++++++++++++++++++- tools/batchMod.pl | 2 +- 6 files changed, 47 insertions(+), 5 deletions(-) --- a/C4/Acquisition.pm +++ a/C4/Acquisition.pm @@ -2996,7 +2996,7 @@ sub FillWithDefaultValues { next unless $tag; next if $tag == $itemfield; for my $subfield ( sort keys %{ $tagslib->{$tag} } ) { - next unless ref $tagslib->{$tag}{$subfield}; # Not a valid subfield (mandatory, tab, lib) + next if IsMarcStructureInternal($tagslib->{$tag}{$subfield}); my $defaultvalue = $tagslib->{$tag}{$subfield}{defaultvalue}; if ( defined $defaultvalue and $defaultvalue ne '' ) { my @fields = $record->field($tag); --- a/C4/Biblio.pm +++ a/C4/Biblio.pm @@ -92,6 +92,7 @@ BEGIN { &GetAuthorisedValueDesc &GetMarcStructure + &IsMarcStructureInternal &GetMarcFromKohaField &GetMarcSubfieldStructureFromKohaField &GetFrameworkCode @@ -1081,6 +1082,27 @@ sub GetBiblioItemInfosOf { =head1 FUNCTIONS FOR HANDLING MARC MANAGEMENT +=head2 IsMarcStructureInternal + + my $tagslib = C4::Biblio::GetMarcStructure(); + for my $tag ( sort keys %$tagslib ) { + next unless $tag; + for my $subfield ( sort keys %{ $tagslib->{$tag} } ) { + next if IsMarcStructureInternal($tagslib->{$tag}{$subfield}); + } + # Process subfield + } + +GetMarcStructure creates keys (lib, tab, mandatory, repeatable) for a display purpose. +These different values should not be processed as valid subfields. + +=cut + +sub IsMarcStructureInternal { + my ( $subfield ) = @_; + return ref $subfield ? 0 : 1; +} + =head2 GetMarcStructure $res = GetMarcStructure($forlibrarian,$frameworkcode); --- a/C4/Items.pm +++ a/C4/Items.pm @@ -2943,7 +2943,7 @@ sub PrepareItemrecordDisplay { # loop through each subfield my $cntsubf; foreach my $subfield ( sort keys %{ $tagslib->{$tag} } ) { - next unless ref $tagslib->{$tag}{$subfield}; # Not a valid subfield (mandatory, tab, lib) + next if IsMarcStructureInternal($tagslib->{$tag}{$subfield}); next if ( $tagslib->{$tag}->{$subfield}->{'tab'} ne "10" ); my %subfield_data; $subfield_data{tag} = $tag; --- a/cataloguing/additem.pl +++ a/cataloguing/additem.pl @@ -890,7 +890,7 @@ $itemrecord = $cookieitemrecord if ($prefillitem and not $justaddeditem and $op # We generate form, and fill with values if defined foreach my $tag ( keys %{$tagslib}){ foreach my $subtag (keys %{$tagslib->{$tag}}){ - next unless ref $tagslib->{$tag}{$subtag}; # Not a valid subfield (mandatory, tab, lib) + next if IsMarcStructureInternal($tagslib->{$tag}{$subtag}); next if ($tagslib->{$tag}->{$subtag}->{'tab'} ne "10"); next if any { /^$tag$subtag$/ } @fields; --- a/t/db_dependent/Biblio.t +++ a/t/db_dependent/Biblio.t @@ -17,9 +17,10 @@ use Modern::Perl; -use Test::More tests => 5; +use Test::More tests => 6; use Test::MockModule; +use List::MoreUtils qw( uniq ); use MARC::Record; use t::lib::Mocks qw( mock_preference ); @@ -323,4 +324,23 @@ subtest 'GetMarcSubfieldStructureFromKohaField' => sub { is($marc_subfield_structure, undef, "invalid kohafield returns undef"); }; +subtest 'IsMarcStructureInternal' => sub { + plan tests => 6; + my $tagslib = GetMarcStructure(); + my @internals; + for my $tag ( sort keys %$tagslib ) { + next unless $tag; + for my $subfield ( sort keys %{ $tagslib->{$tag} } ) { + push @internals, $subfield if IsMarcStructureInternal($tagslib->{$tag}{$subfield}); + } + } + @internals = uniq @internals; + is( scalar(@internals), 4, ''); + is( grep( /^lib$/, @internals ), 1, '' ); + is( grep( /^tab$/, @internals ), 1, '' ); + is( grep( /^mandatory$/, @internals ), 1, '' ); + is( grep( /^repeatable$/, @internals ), 1, '' ); + is( grep( /^a$/, @internals ), 0, '' ); +}; + 1; --- a/tools/batchMod.pl +++ a/tools/batchMod.pl @@ -308,7 +308,7 @@ my @subfieldsToAllow = split(/ /, $subfieldsToAllowForBatchmod); foreach my $tag (sort keys %{$tagslib}) { # loop through each subfield foreach my $subfield (sort keys %{$tagslib->{$tag}}) { - next unless ref $tagslib->{$tag}{$subfield}; # Not a valid subfield (mandatory, tab, lib) + next if IsMarcStructureInternal( $tagslib->{$tag}{$subfield} ); next if (not $allowAllSubfields and $restrictededition && !grep { $tag . '$' . $subfield eq $_ } @subfieldsToAllow ); next if ($tagslib->{$tag}->{$subfield}->{'tab'} ne "10"); # barcode and stocknumber are not meant to be batch-modified --