@@ -, +, @@ --- C4/Acquisition.pm | 53 ++++++++++++++- acqui/addorder.pl | 2 + t/db_dependent/Acquisition/FillWithDefaultValues.t | 79 ++++++++++++++++++++++ 3 files changed, 133 insertions(+), 1 deletion(-) create mode 100755 t/db_dependent/Acquisition/FillWithDefaultValues.t --- a/C4/Acquisition.pm +++ a/C4/Acquisition.pm @@ -23,7 +23,6 @@ use Carp; use C4::Context; use C4::Debug; use C4::Dates qw(format_date format_date_in_iso); -use MARC::Record; use C4::Suggestions; use C4::Biblio; use C4::Contract; @@ -34,6 +33,11 @@ use Koha::Acquisition::Order; use Koha::Acquisition::Bookseller; use Koha::Number::Price; +use C4::Koha qw( subfield_is_koha_internal_p ); + +use MARC::Field; +use MARC::Record; + use Time::localtime; use HTML::Entities; @@ -86,6 +90,8 @@ BEGIN { &GetOrderUsers &ModOrderUsers &NotifyOrderUsers + + &FillWithDefaultValues ); } @@ -2986,6 +2992,51 @@ sub NotifyOrderUsers { } } +=head3 FillWithDefaultValues + +FillWithDefaultValues( $marc_record ); + +This will update the record with default value defined in the ACQ framework. +For all existing fields, if a default value exists and there are no subfield, it will be created. +If the field does not exist, it will be created too. + +=cut + +sub FillWithDefaultValues { + my ($record) = @_; + my $tagslib = C4::Biblio::GetMarcStructure( 1, 'ACQ' ); + if ($tagslib) { + my ($itemfield) = + C4::Biblio::GetMarcFromKohaField( 'items.itemnumber', '' ); + for my $tag ( sort keys %$tagslib ) { + next unless $tag; + next if $tag == $itemfield; + for my $subfield ( sort keys %{ $tagslib->{$tag} } ) { + next if ( subfield_is_koha_internal_p($subfield) ); + my $defaultvalue = $tagslib->{$tag}{$subfield}{defaultvalue}; + if ( defined $defaultvalue and $defaultvalue ne '' ) { + my @fields = $record->field($tag); + if (@fields) { + for my $field (@fields) { + unless ( defined $field->subfield($subfield) ) { + $field->add_subfields( + $subfield => $defaultvalue ); + } + } + } + else { + $record->insert_fields_ordered( + MARC::Field->new( + $tag, '', '', $subfield => $defaultvalue + ) + ); + } + } + } + } + } +} + 1; __END__ --- a/acqui/addorder.pl +++ a/acqui/addorder.pl @@ -250,6 +250,8 @@ if ( $orderinfo->{quantity} ne '0' ) { "biblioitems.editionstatement"=> $$orderinfo{editionstatement} ? $$orderinfo{editionstatement} : "", }); + C4::Acquisition::FillWithDefaultValues( $record ); + # create the record in catalogue, with framework '' my ($biblionumber,$bibitemnum) = AddBiblio($record,''); # change suggestion status if applicable --- a/t/db_dependent/Acquisition/FillWithDefaultValues.t +++ a/t/db_dependent/Acquisition/FillWithDefaultValues.t @@ -0,0 +1,79 @@ +use Modern::Perl; +use Test::More tests => 5; +use Test::MockModule; + +use MARC::Record; +use MARC::Field; + +use C4::Context; +use C4::Acquisition qw( FillWithDefaultValues ); + +my $dbh = C4::Context->dbh; +$dbh->{AutoCommit} = 0; +$dbh->{RaiseError} = 1; + +my $biblio_module = Test::MockModule->new('C4::Biblio'); +my $default_author = 'default author'; +my $default_x = 'my default value'; +$biblio_module->mock( + 'GetMarcStructure', + sub { + { + # default value for an existing field + '245' => { + c => { defaultvalue => $default_author }, + }, + + # default for a nonexisting field + '099' => { + x => { defaultvalue => $default_x }, + }, + }; + } +); + +my $record = MARC::Record->new; +$record->leader('03174nam a2200445 a 4500'); +my @fields = ( + MARC::Field->new( + 100, '1', ' ', + a => 'Knuth, Donald Ervin', + d => '1938', + ), + MARC::Field->new( + 245, '1', '4', + a => 'The art of computer programming', + c => 'Donald E. Knuth.', + ), + MARC::Field->new( + 245, '1', '4', a => 'my second title', + ), +); + +$record->append_fields(@fields); + +C4::Acquisition::FillWithDefaultValues($record); + +my @fields_245 = $record->field(245); +is( scalar(@fields_245), 2, 'No new 245 field has been created' ); +my @subfields_245_0 = $fields_245[0]->subfields; +my @subfields_245_1 = $fields_245[1]->subfields; +is_deeply( + \@subfields_245_0, + [ [ 'a', 'The art of computer programming' ], [ 'c', 'Donald E. Knuth.' ] ], + 'first 245 field has not been updated' +); +is_deeply( + \@subfields_245_1, + [ [ 'a', 'my second title' ], [ 'c', $default_author ] ], + 'second 245 field has a new subfield c with a default value' +); + +my @fields_099 = $record->field('099'); +is( scalar(@fields_099), 1, '1 new 099 field has been created' ); +my @subfields_099 = $fields_099[0]->subfields; +is_deeply( + \@subfields_099, + [ [ 'x', $default_x ] ], + '099$x contains the default value' +); --