@@ -, +, @@
---
Koha/Exporter/Record.pm | 84 ++++++++++---
.../prog/en/modules/tools/export.tt | 9 +-
misc/export_records.pl | 15 ++-
misc/migration_tools/bulkmarcimport.pl | 62 ++++++++--
t/db_dependent/Exporter/Record.t | 116 +++++++++++++++++-
tools/export.pl | 3 +
6 files changed, 262 insertions(+), 27 deletions(-)
--- a/Koha/Exporter/Record.pm
+++ a/Koha/Exporter/Record.pm
@@ -82,27 +82,31 @@ sub _get_record_for_export {
}
}
- if ($dont_export_fields) {
- for my $f ( split / /, $dont_export_fields ) {
- if ( $f =~ m/^(\d{3})(.)?$/ ) {
- my ( $field, $subfield ) = ( $1, $2 );
-
- # skip if this record doesn't have this field
- if ( defined $record->field($field) ) {
- if ( defined $subfield ) {
- my @tags = $record->field($field);
- foreach my $t (@tags) {
- $t->delete_subfields($subfield);
- }
- } else {
- $record->delete_fields( $record->field($field) );
+ _strip_unwanted_fields($record, $dont_export_fields) if $dont_export_fields;
+ C4::Biblio::RemoveAllNsb($record) if $clean;
+ return $record;
+}
+
+sub _strip_unwanted_fields {
+ my ($record, $dont_export_fields) = @_;
+
+ for my $f ( split / /, $dont_export_fields ) {
+ if ( $f =~ m/^(\d{3})(.)?$/ ) {
+ my ( $field, $subfield ) = ( $1, $2 );
+
+ # skip if this record doesn't have this field
+ if ( defined $record->field($field) ) {
+ if ( defined $subfield ) {
+ my @tags = $record->field($field);
+ foreach my $t (@tags) {
+ $t->delete_subfields($subfield);
}
+ } else {
+ $record->delete_fields( $record->field($field) );
}
}
}
}
- C4::Biblio::RemoveAllNsb($record) if $clean;
- return $record;
}
sub _get_authority_for_export {
@@ -128,7 +132,8 @@ sub _get_biblio_for_export {
C4::Biblio::EmbedItemsInMarcBiblio({
marc_record => $record,
biblionumber => $biblionumber,
- item_numbers => $itemnumbers });
+ item_numbers => $itemnumbers,
+ skip_holdings => 1 });
if ($only_export_items_for_branches && @$only_export_items_for_branches) {
my %export_items_for_branches = map { $_ => 1 } @$only_export_items_for_branches;
my ( $homebranchfield, $homebranchsubfield ) = GetMarcFromKohaField( 'items.homebranch' );
@@ -144,6 +149,29 @@ sub _get_biblio_for_export {
return $record;
}
+sub _get_holdings_for_export {
+ my ($params) = @_;
+ my $dont_export_fields = $params->{dont_export_fields};
+ my $clean = $params->{clean};
+ my $biblionumber = $params->{biblionumber};
+
+ my @records;
+ my $holdings = Koha::Holdings->search({ biblionumber => $biblionumber, deleted_on => undef });
+ while (my $holding = $holdings->next()) {
+ my $record = $holding->metadata()->record();
+ _strip_unwanted_fields($record, $dont_export_fields) if $dont_export_fields;
+ C4::Biblio::RemoveAllNsb($record) if $clean;
+ C4::Biblio::UpsertMarcControlField($record, '004', $biblionumber);
+ my $leader = $record->leader();
+ if ($leader !~ /^.{6}[uvxy]/) {
+ $leader =~ s/^(.{6})./$1u/;
+ $record->leader($leader);
+ }
+ push @records, $record;
+ }
+ return \@records;
+}
+
sub export {
my ($params) = @_;
@@ -155,6 +183,7 @@ sub export {
my $dont_export_fields = $params->{dont_export_fields};
my $csv_profile_id = $params->{csv_profile_id};
my $output_filepath = $params->{output_filepath};
+ my $export_holdings = $params->{export_holdings} // 0;
if( !$record_type ) {
Koha::Logger->get->warn( "No record_type given." );
@@ -184,6 +213,20 @@ sub export {
next;
}
print $record->as_usmarc();
+ if ($export_holdings && $record_type eq 'bibs') {
+ my $holdings = _get_holdings_for_export( { %$params, biblionumber => $record_id } );
+ foreach my $holding (@$holdings) {
+ my $errorcount_on_decode = eval { scalar( MARC::File::USMARC->decode( $holding->as_usmarc )->warnings() ) };
+ if ( $errorcount_on_decode or $@ ) {
+ my $msg = "Holdings record for biblio $record_id could not be exported. " .
+ ( $@ // '' );
+ chomp $msg;
+ Koha::Logger->get->info( $msg );
+ next;
+ }
+ print $holding->as_usmarc();
+ }
+ }
}
} elsif ( $format eq 'xml' ) {
my $marcflavour = C4::Context->preference("marcflavour");
@@ -196,6 +239,13 @@ sub export {
next unless $record;
print MARC::File::XML::record($record);
print "\n";
+ if ($export_holdings && $record_type eq 'bibs') {
+ my $holdings = _get_holdings_for_export( { %$params, biblionumber => $record_id } );
+ foreach my $holding (@$holdings) {
+ print MARC::File::XML::record($holding);
+ print "\n";
+ }
+ }
}
print MARC::File::XML::footer();
print "\n";
--- a/koha-tmpl/intranet-tmpl/prog/en/modules/tools/export.tt
+++ a/koha-tmpl/intranet-tmpl/prog/en/modules/tools/export.tt
@@ -117,7 +117,14 @@