1 package Koha::Exporter::Record;
5 use MARC::File::USMARC;
7 use C4::AuthoritiesMarc;
10 use Koha::CsvProfiles;
12 sub _get_record_for_export {
14 my $record_type = $params->{record_type};
15 my $record_id = $params->{record_id};
16 my $dont_export_fields = $params->{dont_export_fields};
17 my $clean = $params->{clean};
20 if ( $record_type eq 'auths' ) {
21 $record = _get_authority_for_export( { %$params, authid => $record_id } );
22 } elsif ( $record_type eq 'bibs' ) {
23 $record = _get_biblio_for_export( { %$params, biblionumber => $record_id } );
26 # TODO log "record_type not supported"
30 if ($dont_export_fields) {
31 for my $f ( split / /, $dont_export_fields ) {
32 if ( $f =~ m/^(\d{3})(.)?$/ ) {
33 my ( $field, $subfield ) = ( $1, $2 );
35 # skip if this record doesn't have this field
36 if ( defined $record->field($field) ) {
37 if ( defined $subfield ) {
38 my @tags = $record->field($field);
39 foreach my $t (@tags) {
40 $t->delete_subfields($subfield);
43 $record->delete_fields( $record->field($field) );
49 C4::Biblio::RemoveAllNsb($record) if $clean;
53 sub _get_authority_for_export {
55 my $authid = $params->{authid} || return;
56 my $authority = Koha::MetadataRecord::Authority->get_from_authid($authid);
57 return unless $authority;
58 return $authority->record;
61 sub _get_biblio_for_export {
63 my $biblionumber = $params->{biblionumber};
64 my $itemnumbers = $params->{itemnumbers};
65 my $export_items = $params->{export_items} // 1;
66 my $only_export_items_for_branch = $params->{only_export_items_for_branch};
68 my $record = eval { C4::Biblio::GetMarcBiblio($biblionumber); };
70 return if $@ or not defined $record;
73 C4::Biblio::EmbedItemsInMarcBiblio( $record, $biblionumber, $itemnumbers );
74 if ($only_export_items_for_branch) {
75 my ( $homebranchfield, $homebranchsubfield ) = GetMarcFromKohaField( 'items.homebranch', '' ); # Should be GetFrameworkCode( $biblionumber )?
77 for my $itemfield ( $record->field($homebranchfield) ) {
78 my $homebranch = $itemfield->subfield($homebranchsubfield);
79 if ( $only_export_items_for_branch ne $homebranch ) {
80 $record->delete_field($itemfield);
91 my $record_type = $params->{record_type};
92 my $record_ids = $params->{record_ids} || [];
93 my $format = $params->{format};
94 my $itemnumbers = $params->{itemnumbers} || []; # Does not make sense with record_type eq auths
95 my $export_items = $params->{export_items};
96 my $dont_export_fields = $params->{dont_export_fields};
97 my $csv_profile_id = $params->{csv_profile_id};
98 my $output_filepath = $params->{output_filepath};
100 return unless $record_type;
101 return unless @$record_ids;
104 if ( $output_filepath ) {
105 open $fh, '>', $output_filepath or die "Cannot open file $output_filepath ($!)";
107 binmode $fh, ':encoding(UTF-8)' unless $format eq 'csv';
109 binmode STDOUT, ':encoding(UTF-8)' unless $format eq 'csv';
112 if ( $format eq 'iso2709' ) {
113 for my $record_id (@$record_ids) {
114 my $record = _get_record_for_export( { %$params, record_id => $record_id } );
115 my $errorcount_on_decode = eval { scalar( MARC::File::USMARC->decode( $record->as_usmarc )->warnings() ) };
116 if ( $errorcount_on_decode or $@ ) {
118 warn "record (number $record_id) is invalid and therefore not exported because its reopening generates warnings above";
121 print $record->as_usmarc();
123 } elsif ( $format eq 'xml' ) {
124 my $marcflavour = C4::Context->preference("marcflavour");
125 MARC::File::XML->default_record_format( ( $marcflavour eq 'UNIMARC' && $record_type eq 'auths' ) ? 'UNIMARCAUTH' : $marcflavour );
127 print MARC::File::XML::header();
129 for my $record_id (@$record_ids) {
130 my $record = _get_record_for_export( { %$params, record_id => $record_id } );
131 print MARC::File::XML::record($record);
134 print MARC::File::XML::footer();
136 } elsif ( $format eq 'csv' ) {
137 $csv_profile_id ||= Koha::CsvProfiles->search({ profile => C4::Context->preference('ExportWithCsvProfile') })->export_format_id;
138 print marc2csv( $record_ids, $csv_profile_id, $itemnumbers );
141 close $fh if $output_filepath;
150 Koha::Exporter::Records - module to export records (biblios and authorities)
154 This module provides a public subroutine to export records as xml, csv or iso2709.
160 Koha::Exporter::Record::export($params);
162 $params is a hashref with some keys:
164 It will displays on STDOUT the generated file.
170 Must be set to 'bibs' or 'auths'
174 The list of the records to export (a list of biblionumber or authid)
178 The format must be 'csv', 'xml' or 'iso2709'.
182 Generate the item infos only for these itemnumbers.
184 Must only be used with biblios.
188 If this flag is set, the items will be exported.
191 =item dont_export_fields
193 List of fields not to export.
197 If the format is csv, a csv_profile_id can be provide to overwrite the default value (syspref ExportWithCsvProfile).
205 This file is part of Koha.
207 Copyright Koha Development Team
209 Koha is free software; you can redistribute it and/or modify it
210 under the terms of the GNU General Public License as published by
211 the Free Software Foundation; either version 3 of the License, or
212 (at your option) any later version.
214 Koha is distributed in the hope that it will be useful, but
215 WITHOUT ANY WARRANTY; without even the implied warranty of
216 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
217 GNU General Public License for more details.
219 You should have received a copy of the GNU General Public License
220 along with Koha; if not, see <http://www.gnu.org/licenses>.