1 package Koha::Exporter::Record;
5 use MARC::File::USMARC;
7 use C4::AuthoritiesMarc;
10 use Koha::CsvProfiles;
13 sub _get_record_for_export {
15 my $record_type = $params->{record_type};
16 my $record_id = $params->{record_id};
17 my $dont_export_fields = $params->{dont_export_fields};
18 my $clean = $params->{clean};
21 if ( $record_type eq 'auths' ) {
22 $record = _get_authority_for_export( { %$params, authid => $record_id } );
23 } elsif ( $record_type eq 'bibs' ) {
24 $record = _get_biblio_for_export( { %$params, biblionumber => $record_id } );
26 Koha::Logger->get->warn( "Record_type $record_type not supported." );
28 return unless $record;
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 if( !$record_type ) {
101 Koha::Logger->get->warn( "No record_type given." );
104 return unless @$record_ids;
107 if ( $output_filepath ) {
108 open $fh, '>', $output_filepath or die "Cannot open file $output_filepath ($!)";
110 binmode $fh, ':encoding(UTF-8)' unless $format eq 'csv';
112 binmode STDOUT, ':encoding(UTF-8)' unless $format eq 'csv';
115 if ( $format eq 'iso2709' ) {
116 for my $record_id (@$record_ids) {
117 my $record = _get_record_for_export( { %$params, record_id => $record_id } );
118 my $errorcount_on_decode = eval { scalar( MARC::File::USMARC->decode( $record->as_usmarc )->warnings() ) };
119 if ( $errorcount_on_decode or $@ ) {
120 my $msg = "Record $record_id could not be exported. " .
123 Koha::Logger->get->info( $msg );
126 print $record->as_usmarc();
128 } elsif ( $format eq 'xml' ) {
129 my $marcflavour = C4::Context->preference("marcflavour");
130 MARC::File::XML->default_record_format( ( $marcflavour eq 'UNIMARC' && $record_type eq 'auths' ) ? 'UNIMARCAUTH' : $marcflavour );
132 print MARC::File::XML::header();
134 for my $record_id (@$record_ids) {
135 my $record = _get_record_for_export( { %$params, record_id => $record_id } );
137 Koha::Logger->get->info( "Record $record_id could not be exported." );
140 print MARC::File::XML::record($record);
143 print MARC::File::XML::footer();
145 } elsif ( $format eq 'csv' ) {
146 unless ( $csv_profile_id ) {
147 # FIXME export_format.profile should be a unique key
148 my $csv_profiles = Koha::CsvProfiles->search({ profile => C4::Context->preference('ExportWithCsvProfile') });
149 die "The ExportWithCsvProfile system preference is not defined or does not match a valid csv profile" unless $csv_profiles->count;
150 $csv_profile_id = $csv_profiles->next->export_format_id;
152 print marc2csv( $record_ids, $csv_profile_id, $itemnumbers );
155 close $fh if $output_filepath;
164 Koha::Exporter::Records - module to export records (biblios and authorities)
168 This module provides a public subroutine to export records as xml, csv or iso2709.
174 Koha::Exporter::Record::export($params);
176 $params is a hashref with some keys:
178 It will displays on STDOUT the generated file.
184 Must be set to 'bibs' or 'auths'
188 The list of the records to export (a list of biblionumber or authid)
192 The format must be 'csv', 'xml' or 'iso2709'.
196 Generate the item infos only for these itemnumbers.
198 Must only be used with biblios.
202 If this flag is set, the items will be exported.
205 =item dont_export_fields
207 List of fields not to export.
211 If the format is csv, a csv_profile_id can be provide to overwrite the default value (syspref ExportWithCsvProfile).
219 This file is part of Koha.
221 Copyright Koha Development Team
223 Koha is free software; you can redistribute it and/or modify it
224 under the terms of the GNU General Public License as published by
225 the Free Software Foundation; either version 3 of the License, or
226 (at your option) any later version.
228 Koha is distributed in the hope that it will be useful, but
229 WITHOUT ANY WARRANTY; without even the implied warranty of
230 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
231 GNU General Public License for more details.
233 You should have received a copy of the GNU General Public License
234 along with Koha; if not, see <http://www.gnu.org/licenses>.