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 unless ( $csv_profile_id ) {
138 # FIXME export_format.profile should be a unique key
139 my $csv_profiles = Koha::CsvProfiles->search({ profile => C4::Context->preference('ExportWithCsvProfile') });
140 die "The ExportWithCsvProfile system preference is not defined or does not match a valid csv profile" unless $csv_profiles->count;
141 $csv_profile_id = $csv_profiles->next->export_format_id;
143 print marc2csv( $record_ids, $csv_profile_id, $itemnumbers );
146 close $fh if $output_filepath;
155 Koha::Exporter::Records - module to export records (biblios and authorities)
159 This module provides a public subroutine to export records as xml, csv or iso2709.
165 Koha::Exporter::Record::export($params);
167 $params is a hashref with some keys:
169 It will displays on STDOUT the generated file.
175 Must be set to 'bibs' or 'auths'
179 The list of the records to export (a list of biblionumber or authid)
183 The format must be 'csv', 'xml' or 'iso2709'.
187 Generate the item infos only for these itemnumbers.
189 Must only be used with biblios.
193 If this flag is set, the items will be exported.
196 =item dont_export_fields
198 List of fields not to export.
202 If the format is csv, a csv_profile_id can be provide to overwrite the default value (syspref ExportWithCsvProfile).
210 This file is part of Koha.
212 Copyright Koha Development Team
214 Koha is free software; you can redistribute it and/or modify it
215 under the terms of the GNU General Public License as published by
216 the Free Software Foundation; either version 3 of the License, or
217 (at your option) any later version.
219 Koha is distributed in the hope that it will be useful, but
220 WITHOUT ANY WARRANTY; without even the implied warranty of
221 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
222 GNU General Public License for more details.
224 You should have received a copy of the GNU General Public License
225 along with Koha; if not, see <http://www.gnu.org/licenses>.