@@ -, +, @@ basket/list by email --- a/C4/Biblio.pm +++ a/C4/Biblio.pm @@ -93,6 +93,7 @@ use C4::Charset; use C4::Linker; use C4::OAI::Sets; use C4::Debug; +use C4::Ris; use Koha::Caches; use Koha::Authority::Types; @@ -3216,6 +3217,88 @@ sub RemoveAllNsb { return $record; } +=head2 BuildBiblioDataForExport + + my $data = BuildBiblioDataForExport({ + biblionumbers => \@biblionumbers, + format => $format, + template => $template, # Only used for ISBD format + csv_profile_id => $csv_profile_id, # Only used for CSV format + +Returns a hashref with the following keys: + +=over + +=item * records_file A string containing the export file contents + +=item * records_data An array of hashrefs for all biblio records + +=back + +=cut + +sub BuildBiblioDataForExport { + my ( $params ) = @_; + my $biblionumbers = $params->{biblionumbers}; + my $format = $params->{format}; + my $template = $params->{template}; # Only used for ISBD + my ( @records_data, $records_file ); + + # CSV + if ($format eq 'csv' ) { + + # FIXME should be used at the beginning of this module + # But compilation explodes... + require C4::Record; + $records_file = C4::Record::marc2csv($biblionumbers, $params->{csv_profile_id}); + + # Other formats + } else { + # retrieve biblios from shelf + my $marcflavour = C4::Context->preference('marcflavour'); + foreach my $biblionumber (@$biblionumbers) { + my $dat = GetBiblioData($biblionumber); + next unless $dat; + my $record = GetMarcBiblio({ biblionumber => $biblionumber, embed_items => 1 }); + my $marcauthorsarray = GetMarcAuthors( $record, $marcflavour ); + my $marcsubjctsarray = GetMarcSubjects( $record, $marcflavour ); + my $fw = GetFrameworkCode($biblionumber); + + my @items = C4::Items::GetItemsInfo( $biblionumber ); + + my $hasauthors = 0; + if($dat->{'author'} || @$marcauthorsarray) { + $hasauthors = 1; + } + + $dat->{MARCSUBJCTS} = $marcsubjctsarray; + $dat->{MARCAUTHORS} = $marcauthorsarray; + $dat->{HASAUTHORS} = $hasauthors; + $dat->{biblionumber} = $biblionumber; + $dat->{ITEM_RESULTS} = \@items; + + if ($format eq 'iso2709') { + $records_file .= $record->as_usmarc(); + } + elsif ($format eq 'ris') { + $records_file .= C4::Ris::marc2ris($record); + } + elsif ($format eq 'bibtex') { + require C4::Record; + $records_file .= C4::Record::marc2bibtex($record, $biblionumber); + } + elsif ( $format eq 'isbd' ) { + # Only called from the OPAC at the moment + $records_file .= C4::Biblio::GetISBDView($biblionumber, $template); + } + + push( @records_data, $dat ); + } + } + + return { records_file => $records_file, records_data => \@records_data }; +} + 1; --- a/C4/Ris.pm +++ a/C4/Ris.pm @@ -439,6 +439,8 @@ sub print_typetag { sub normalize_author { my($rawauthora, $rawauthorb, $rawauthorc, $nametype) = @_; + $nametype //= 0; + if ($nametype == 0) { # ToDo: convert every input to Last[,(F.|First)[ (M.|Middle)[,Suffix]]] warn("name >>$rawauthora<< in direct order - leave as is") if $marcprint; @@ -831,7 +833,7 @@ sub get_keywords { ## loop over all 6XX fields foreach my $kwfield (@keywords) { - if ($kwfield != undef) { + if (defined $kwfield) { ## authornames get special treatment if ($fieldname eq "600") { my $val = normalize_author($kwfield->subfield('a'), $kwfield->subfield('b'), $kwfield->subfield('c'), $kwfield->indicator('1')); --- a/basket/sendbasket.pl +++ a/basket/sendbasket.pl @@ -29,6 +29,7 @@ use C4::Output; use C4::Templates (); use Koha::Email; use Koha::Token; +use Koha::CsvProfiles; my $query = CGI->new; @@ -43,6 +44,7 @@ my ( $template, $borrowernumber, $cookie ) = get_template_and_user ( my $bib_list = $query->param('bib_list') || ''; my $email_add = $query->param('email_add'); +my $format = $query->param('format') || 'iso2709'; my $dbh = C4::Context->dbh; @@ -60,43 +62,24 @@ if ( $email_add ) { 'basket/sendbasket.tt', 'intranet', $query, ); - my @bibs = split( /\//, $bib_list ); - my @results; - my $iso2709; - my $marcflavour = C4::Context->preference('marcflavour'); - foreach my $biblionumber (@bibs) { - $template2->param( biblionumber => $biblionumber ); - - my $dat = GetBiblioData($biblionumber); - next unless $dat; - my $record = GetMarcBiblio({ - biblionumber => $biblionumber, - embed_items => 1 }); - my $marcauthorsarray = GetMarcAuthors( $record, $marcflavour ); - my $marcsubjctsarray = GetMarcSubjects( $record, $marcflavour ); - - my @items = GetItemsInfo( $biblionumber ); - - my $hasauthors = 0; - if($dat->{'author'} || @$marcauthorsarray) { - $hasauthors = 1; - } - - - $dat->{MARCSUBJCTS} = $marcsubjctsarray; - $dat->{MARCAUTHORS} = $marcauthorsarray; - $dat->{HASAUTHORS} = $hasauthors; - $dat->{'biblionumber'} = $biblionumber; - $dat->{ITEM_RESULTS} = \@items; - - $iso2709 .= $record->as_usmarc(); - - push( @results, $dat ); + my $csv_profile_id; + if ( $format =~ m|^\d+$| ) { + $csv_profile_id = $format; + $format = 'csv'; } + my @biblionumbers = split( /\//, $bib_list ); + my $data = C4::Biblio::BuildBiblioDataForExport( + { + biblionumbers => \@biblionumbers, + format => $format, + csv_profile_id => $csv_profile_id + } + ); + my $records_file = $data->{records_file}; + my $records_data = $data->{records_data}; - my $resultsarray = \@results; $template2->param( - BIBLIO_RESULTS => $resultsarray, + BIBLIO_RESULTS => $records_data, comment => $comment ); @@ -141,9 +124,9 @@ END_OF_BODY $email->text_body( $THE_body ); $email->attach( - Encode::encode( "UTF-8", $iso2709 ), + Encode::encode( "UTF-8", $records_file ), content_type => 'application/octet-stream', - name => 'basket.iso2709', + name => "basket.$format", disposition => 'attachment', ); @@ -166,6 +149,7 @@ else { suggestion => C4::Context->preference("suggestion"), virtualshelves => C4::Context->preference("virtualshelves"), csrf_token => Koha::Token->new->generate_csrf({ session_id => scalar $query->cookie('CGISESSID'), }), + csv_profiles => [ Koha::CsvProfiles->search({ type => 'marc' }) ], ); output_html_with_http_headers $query, $cookie, $template->output; } --- a/koha-tmpl/intranet-tmpl/prog/en/includes/download-export-available-formats.inc +++ a/koha-tmpl/intranet-tmpl/prog/en/includes/download-export-available-formats.inc @@ -0,0 +1,9 @@ + --- a/koha-tmpl/intranet-tmpl/prog/en/modules/basket/downloadcart.tt +++ a/koha-tmpl/intranet-tmpl/prog/en/modules/basket/downloadcart.tt @@ -9,18 +9,11 @@
Download cart -
  1. - -
  2. +
      +
    1. + + [% INCLUDE 'download-export-available-formats.inc' %] +
--- a/koha-tmpl/intranet-tmpl/prog/en/modules/basket/sendbasket.tt +++ a/koha-tmpl/intranet-tmpl/prog/en/modules/basket/sendbasket.tt @@ -32,7 +32,11 @@ Your cart
  • [% BIBLIO_RESULT.title | $raw %] - [% IF ( BIBLIO_RESULT.subtitle ) %] [% BIBLIO_RESULT.subtitle | $raw %][% END %] + [% IF ( BIBLIO_RESULT.subtitle.size ) %] + [% FOREACH subtitle IN BIBLIO_RESULT.subtitle %] + [% subtitle.subfield | $raw %] + [% END %] + [% END %] [% BIBLIO_RESULT.part_number | $raw %] [% BIBLIO_RESULT.part_name | $raw %] --- a/koha-tmpl/intranet-tmpl/prog/en/modules/basket/sendbasketform.tt +++ a/koha-tmpl/intranet-tmpl/prog/en/modules/basket/sendbasketform.tt @@ -18,18 +18,22 @@ [% INCLUDE 'blocking_errors.inc' %] - -
    -Sending your cart -
    1. - - -
    2. -
    3. - - -
    4. -
    +
    + Sending your cart +
      +
    1. + + +
    2. +
    3. + + +
    4. +
    5. + + [% INCLUDE 'download-export-available-formats.inc' %] +
    6. +
    Cancel
    --- a/koha-tmpl/intranet-tmpl/prog/en/modules/virtualshelves/downloadshelf.tt +++ a/koha-tmpl/intranet-tmpl/prog/en/modules/virtualshelves/downloadshelf.tt @@ -26,18 +26,12 @@
    Download list -
    1. - - -
    +
      +
    1. + + [% INCLUDE 'download-export-available-formats.inc' %] +
    2. +
    Cancel --- a/koha-tmpl/intranet-tmpl/prog/en/modules/virtualshelves/sendshelfform.tt +++ a/koha-tmpl/intranet-tmpl/prog/en/modules/virtualshelves/sendshelfform.tt @@ -27,6 +27,10 @@
  • +
  • + + [% INCLUDE 'download-export-available-formats.inc' %] +
  • --- a/koha-tmpl/opac-tmpl/bootstrap/en/includes/download-export-available-formats.inc +++ a/koha-tmpl/opac-tmpl/bootstrap/en/includes/download-export-available-formats.inc @@ -0,0 +1,10 @@ + --- a/koha-tmpl/opac-tmpl/bootstrap/en/modules/opac-downloadcart.tt +++ a/koha-tmpl/opac-tmpl/bootstrap/en/modules/opac-downloadcart.tt @@ -11,16 +11,7 @@

    Download cart

    - + [% INCLUDE 'download-export-available-formats.inc' %]
    --- a/koha-tmpl/opac-tmpl/bootstrap/en/modules/opac-downloadshelf.tt +++ a/koha-tmpl/opac-tmpl/bootstrap/en/modules/opac-downloadshelf.tt @@ -56,16 +56,7 @@

    Download list [% shelf.shelfname | html %]

    - + [% INCLUDE 'download-export-available-formats.inc' %] Required
    --- a/koha-tmpl/opac-tmpl/bootstrap/en/modules/opac-sendbasketform.tt +++ a/koha-tmpl/opac-tmpl/bootstrap/en/modules/opac-sendbasketform.tt @@ -36,6 +36,8 @@ + + [% INCLUDE 'download-export-available-formats.inc' %]
    [% IF Koha.Preference('RequestOnOpac') || Koha.Preference('OpacRenewalAllowed') %]

    Please do not use this mail to request or renew books.

    [% END %]
    --- a/koha-tmpl/opac-tmpl/bootstrap/en/modules/opac-sendshelfform.tt +++ a/koha-tmpl/opac-tmpl/bootstrap/en/modules/opac-sendshelfform.tt @@ -39,6 +39,9 @@ + + [% INCLUDE 'download-export-available-formats.inc' %] +
    [% IF Koha.Preference('RequestOnOpac') || Koha.Preference('OpacRenewalAllowed') %]

    Please do not use this mail to request or renew books.

    [% END %] --- a/opac/opac-downloadcart.pl +++ a/opac/opac-downloadcart.pl @@ -63,7 +63,7 @@ if ($bib_list && $format) { my $extension; my $type; - # CSV + # CSV if ($format =~ /^\d+$/) { my $csv_profile = Koha::CsvProfiles->find($format); @@ -73,8 +73,9 @@ if ($bib_list && $format) { } $output = marc2csv(\@bibs, $format); + $format = 'csv'; - # Other formats + # Other formats } else { my $record_processor = Koha::RecordProcessor->new({ filters => 'ViewPolicy' @@ -119,9 +120,6 @@ if ($bib_list && $format) { } } - # If it was a CSV export we change the format after the export so the file extension is fine - $format = "csv" if ($format =~ m/^\d+$/); - print $query->header( -type => ($type) ? $type : 'application/octet-stream', -'Content-Transfer-Encoding' => 'binary', --- a/opac/opac-downloadshelf.pl +++ a/opac/opac-downloadshelf.pl @@ -87,6 +87,9 @@ if ( $shelf and $shelf->can_be_viewed( $borrowernumber ) ) { push @biblios, $content->biblionumber; } $output = marc2csv(\@biblios, $format); + + $format = 'csv'; + # Other formats } else { my $record_processor = Koha::RecordProcessor->new({ @@ -129,9 +132,6 @@ if ( $shelf and $shelf->can_be_viewed( $borrowernumber ) ) { } } - # If it was a CSV export we change the format after the export so the file extension is fine - $format = "csv" if ($format =~ m/^\d+$/); - print $query->header( -type => ($type) ? $type : 'application/octet-stream', -'Content-Transfer-Encoding' => 'binary', --- a/opac/opac-sendbasket.pl +++ a/opac/opac-sendbasket.pl @@ -33,6 +33,7 @@ use C4::Templates (); use Koha::Email; use Koha::Patrons; use Koha::Token; +use Koha::CsvProfiles; my $query = CGI->new; @@ -46,6 +47,7 @@ my ( $template, $borrowernumber, $cookie ) = get_template_and_user ( my $bib_list = $query->param('bib_list') || ''; my $email_add = $query->param('email_add'); +my $format = $query->param('format') || 'iso2709'; my $dbh = C4::Context->dbh; @@ -68,46 +70,25 @@ if ( $email_add ) { 'opac-sendbasket.tt', 'opac', $query, ); - my @bibs = split( /\//, $bib_list ); - my @results; - my $iso2709; - my $marcflavour = C4::Context->preference('marcflavour'); - foreach my $biblionumber (@bibs) { - $template2->param( biblionumber => $biblionumber ); - - my $dat = GetBiblioData($biblionumber); - next unless $dat; - my $record = GetMarcBiblio({ - biblionumber => $biblionumber, - embed_items => 1, - opac => 1, - borcat => $borcat }); - my $marcauthorsarray = GetMarcAuthors( $record, $marcflavour ); - my $marcsubjctsarray = GetMarcSubjects( $record, $marcflavour ); - - my @items = GetItemsInfo( $biblionumber ); - - my $hasauthors = 0; - if($dat->{'author'} || @$marcauthorsarray) { - $hasauthors = 1; - } - - - $dat->{MARCSUBJCTS} = $marcsubjctsarray; - $dat->{MARCAUTHORS} = $marcauthorsarray; - $dat->{HASAUTHORS} = $hasauthors; - $dat->{'biblionumber'} = $biblionumber; - $dat->{ITEM_RESULTS} = \@items; - - $iso2709 .= $record->as_usmarc(); - - push( @results, $dat ); + my $csv_profile_id; + if ( $format =~ m|^\d+$| ) { + $csv_profile_id = $format; + $format = 'csv'; } + my @biblionumbers = split( /\//, $bib_list ); + my $data = C4::Biblio::BuildBiblioDataForExport( + { + biblionumbers => \@biblionumbers, + format => $format, + csv_profile_id => $csv_profile_id, + template => 'opac', + } + ); + my $records_file = $data->{records_file}; + my $records_data = $data->{records_data}; - my $resultsarray = \@results; - $template2->param( - BIBLIO_RESULTS => $resultsarray, + BIBLIO_RESULTS => $records_data, comment => $comment, firstname => $patron->firstname, surname => $patron->surname, @@ -143,7 +124,7 @@ $email_header $body END_OF_BODY - if ( !defined $iso2709 ) { + if ( !defined $records_file ) { carp "Error sending mail: empty basket"; $template->param( error => 1 ); } @@ -158,9 +139,9 @@ END_OF_BODY $email->header( 'X-Abuse-Report' => C4::Context->preference('KohaAdminEmailAddress') ); $email->text_body( $THE_body ); $email->attach( - Encode::encode( "UTF-8", $iso2709 ), + Encode::encode( "UTF-8", $records_file ), content_type => 'application/octet-stream', - name => 'basket.iso2709', + name => "basket.$format", disposition => 'attachment', ); my $library = $patron->library; @@ -186,6 +167,7 @@ else { virtualshelves => C4::Context->preference("virtualshelves"), csrf_token => Koha::Token->new->generate_csrf( { session_id => $new_session_id, } ), + csv_profiles => [ Koha::CsvProfiles->search({ type => 'marc' }) ], ); output_html_with_http_headers $query, $cookie, $template->output, undef, { force_no_caching => 1 }; } --- a/opac/opac-sendshelf.pl +++ a/opac/opac-sendshelf.pl @@ -32,6 +32,7 @@ use C4::Members; use Koha::Email; use Koha::Patrons; use Koha::Virtualshelves; +use Koha::CsvProfiles; my $query = CGI->new; @@ -51,6 +52,7 @@ my ( $template, $borrowernumber, $cookie ) = get_template_and_user ( my $shelfid = $query->param('shelfid'); my $email = $query->param('email'); +my $format = $query->param('format') || 'iso2709'; my $dbh = C4::Context->dbh; @@ -74,40 +76,31 @@ if ( $email ) { my $shelf = Koha::Virtualshelves->find( $shelfid ); my $contents = $shelf->get_contents; - my $marcflavour = C4::Context->preference('marcflavour'); - my $iso2709; - my @results; + my @biblionumbers; while ( my $content = $contents->next ) { my $biblionumber = $content->biblionumber; - my $record = GetMarcBiblio({ - biblionumber => $biblionumber, - embed_items => 1, - opac => 1, - borcat => $borcat }); - next unless $record; - my $fw = GetFrameworkCode($biblionumber); - my $dat = GetBiblioData($biblionumber); - - my $marcauthorsarray = GetMarcAuthors( $record, $marcflavour ); - my $marcsubjctsarray = GetMarcSubjects( $record, $marcflavour ); - - my @items = GetItemsInfo( $biblionumber ); - - $dat->{ISBN} = GetMarcISBN($record, $marcflavour); - $dat->{MARCSUBJCTS} = $marcsubjctsarray; - $dat->{MARCAUTHORS} = $marcauthorsarray; - $dat->{'biblionumber'} = $biblionumber; - $dat->{ITEM_RESULTS} = \@items; - $dat->{HASAUTHORS} = $dat->{'author'} || @$marcauthorsarray; - - $iso2709 .= $record->as_usmarc(); - - push( @results, $dat ); + push @biblionumbers, $biblionumber; } + my $csv_profile_id; + if ( $format =~ m|^\d+$| ) { + $csv_profile_id = $format; + $format = 'csv'; + } + my $data = C4::Biblio::BuildBiblioDataForExport( + { + biblionumbers => \@biblionumbers, + format => $format, + csv_profile_id => $csv_profile_id, + template => 'opac', + } + ); + my $records_file = $data->{records_file}; + my $records_data = $data->{records_data}; + $template2->param( - BIBLIO_RESULTS => \@results, + BIBLIO_RESULTS => $records_data, comment => $comment, shelfname => $shelf->shelfname, firstname => $patron->firstname, @@ -153,9 +146,9 @@ END_OF_BODY ); $email->text_body( $THE_body ); $email->attach( - Encode::encode( "UTF-8", $iso2709 ), + Encode::encode( "UTF-8", $records_file ), content_type => 'application/octet-stream', - name => 'list.iso2709', + name => "list.$format", disposition => 'attachment', ); my $library = Koha::Patrons->find( $borrowernumber )->library; @@ -178,6 +171,7 @@ END_OF_BODY }else{ $template->param( shelfid => $shelfid, url => "/cgi-bin/koha/opac-sendshelf.pl", + csv_profiles => [ Koha::CsvProfiles->search({ type => 'marc' }) ], ); output_html_with_http_headers $query, $cookie, $template->output, undef, { force_no_caching => 1 }; } --- a/t/db_dependent/Biblio/BuildBiblioDataForExport.t +++ a/t/db_dependent/Biblio/BuildBiblioDataForExport.t @@ -0,0 +1,120 @@ +use Modern::Perl; +use Test::More tests => 4; + +use Test::MockModule; +use MARC::Record; +use MARC::Field; + +use C4::Biblio; +use C4::Context; +use C4::Items; +use C4::Record; +use Koha::DateUtils; +use Koha::Item; + +use t::lib::TestBuilder; + +my $schema = Koha::Database->new()->schema(); +$schema->storage->txn_begin(); + +my $builder = t::lib::TestBuilder->new(); + +my $title = q|The art of computer programming|; +my $author = 'Knuth, Donald Ervin'; +my $biblio = $builder->build_sample_biblio({ title => $title, author => $author }); +my $record = $biblio->metadata->record; +if (C4::Context->preference('marcflavour') eq 'UNIMARC') { + $record->append_fields( + MARC::Field->new(200, ' ', ' ', a => 'The art of another title', f => 'Donald E. Knuth. II'), + MARC::Field->new(700, '0', '0', a => 'Knuth,Donald Ervin'), + ); +} else { + $record->field(245)->update(c => $author); + $record->append_fields( + MARC::Field->new(245, ' ', ' ', a => 'The art of another title', f => 'Donald E. Knuth. II'), + ); +} +$record->append_fields( + MARC::Field->new( + 600, ' ', '1', + a => 'Computer programming.', + 9 => '462', + ), + MARC::Field->new( + 600, ' ', '0', + a => 'Computer algorithms.', + 9 => '499', + ), +); +$biblio->metadata->update({ metadata => $record->as_xml() }); +my $biblionumber = $biblio->biblionumber; +my $item = $builder->build_sample_item({ biblionumber => $biblionumber, library => 'CPL', itype => 'CANNOT', barcode => 'my new barcode' }); + +subtest 'csv' => sub { + plan tests => 1; + my $csv_content = C4::Context->preference('marcflavour') eq 'UNIMARC' + ? 'Title=200$a|Subject=600$a' + : 'Title=245$a|Subject=600$a'; + my $csv_profile_id = insert_csv_profile({ csv_content => $csv_content }); + + my $csv_data = C4::Biblio::BuildBiblioDataForExport({ + biblionumbers => [ $biblionumber ], + format => 'csv', + csv_profile_id => $csv_profile_id, + }); + + is_deeply( $csv_data, { records_data => [], records_file => qq{Title|Subject +"$title,The art of another title"|"Computer programming.,Computer algorithms." +}}, 'BuildBiblioDataForExport should return correct values in csv' ); +}; + +subtest 'iso2709' => sub { + plan tests => 7; + my $iso2709_data = C4::Biblio::BuildBiblioDataForExport({ + biblionumbers => [ $biblionumber ], + format => 'iso2709', + }); + + my $today = output_pref({ dt => dt_from_string, dateformat => 'iso', dateonly => 1}); + + like( $iso2709_data->{records_file}, qr{00467nam a2200121 a \d+140211b xxu||||| |||| 00| 0 eng d1 aKnuth, Donald Ervind193814a$titlecDonald E. Knuth.9014aThe art of another titlecDonald E. Knuth. II91 1aComputer programming.9462 0aComputer algorithms.9499 c57d57 00104070910aCPLbCPLd$todaypmy new barcoder$todayw$todayyCANNOT}, 'BuildBiblioDataForExport should return a correct records file in iso2709' ); + + my $first_biblio_data = @{ $iso2709_data->{records_data} }[0]; + is( $first_biblio_data->{HASAUTHORS}, 1 ); + is( scalar( @{ $first_biblio_data->{MARCSUBJCTS} } ), 2, '499 and 462' ); + is( $first_biblio_data->{title}, $title ); + is( scalar( @{ $first_biblio_data->{ITEM_RESULTS} } ), 1, '1 item' ); + is( scalar( @{ $first_biblio_data->{MARCAUTHORS} } ), 1, '1 author' ); + is( $first_biblio_data->{biblionumber}, $biblionumber, 'bibionumber is correct' ); +}; + +subtest 'ris' => sub { + plan tests => 1; + my $ris_data = C4::Biblio::BuildBiblioDataForExport({ + biblionumbers => [ $biblionumber ], + format => 'ris', + }); + is( $ris_data->{records_file}, qq|TY - GEN\r\nAU - Knuth,Donald Ervin\r\nTI - $title\r\nKW - Computer programming.\r\nKW - Computer algorithms.\r\nER - \r\n|,); +}; + +subtest 'bibtex' => sub { + plan tests => 1; + my $bibtex_data = C4::Biblio::BuildBiblioDataForExport({ + biblionumbers => [ $biblionumber ], + format => 'bibtex', + }); + my $expected = qq|\@book{$biblionumber,\n\tauthor = {Knuth,Donald Ervin},\n\ttitle = {The art of computer programming}\n}\n|; + is( $bibtex_data->{records_file}, $expected); +}; + +sub insert_csv_profile { + my ( $params ) = @_; + my $dbh = C4::Context->dbh; + $dbh->do(q| + INSERT INTO export_format(profile, description, content, csv_separator, field_separator, subfield_separator, encoding, type) VALUES (?, ?, ?, ?, ?, ?, ?, ?) + |, {}, ("TEST_PROFILE4", "my desc", $params->{csv_content}, '|', ';', ',', 'utf8', 'marc') + ); + return $dbh->last_insert_id( undef, undef, 'export_format', undef ); +} + +$schema->storage->txn_rollback(); --- a/virtualshelves/sendshelf.pl +++ a/virtualshelves/sendshelf.pl @@ -30,6 +30,7 @@ use C4::Items; use C4::Output; use Koha::Email; use Koha::Virtualshelves; +use Koha::CsvProfiles; my $query = CGI->new; @@ -44,6 +45,7 @@ my ( $template, $borrowernumber, $cookie ) = get_template_and_user( my $shelfid = $query->param('shelfid'); my $to_address = $query->param('email'); +my $format = $query->param('format') || 'iso2709'; my $dbh = C4::Context->dbh; @@ -61,35 +63,30 @@ if ($to_address) { my $shelf = Koha::Virtualshelves->find( $shelfid ); my $contents = $shelf->get_contents; - my $marcflavour = C4::Context->preference('marcflavour'); - my $iso2709; - my @results; + my @biblionumbers; while ( my $content = $contents->next ) { my $biblionumber = $content->biblionumber; - my $dat = GetBiblioData($biblionumber); - my $record = GetMarcBiblio({ - biblionumber => $biblionumber, - embed_items => 1 }); - my $marcauthorsarray = GetMarcAuthors( $record, $marcflavour ); - my $marcsubjctsarray = GetMarcSubjects( $record, $marcflavour ); - - my @items = GetItemsInfo($biblionumber); - - $dat->{ISBN} = GetMarcISBN($record, $marcflavour); - $dat->{MARCSUBJCTS} = $marcsubjctsarray; - $dat->{MARCAUTHORS} = $marcauthorsarray; - $dat->{'biblionumber'} = $biblionumber; - $dat->{ITEM_RESULTS} = \@items; - $dat->{HASAUTHORS} = $dat->{'author'} || @$marcauthorsarray; - - $iso2709 .= $record->as_usmarc(); + push @biblionumbers, $biblionumber; + } - push( @results, $dat ); + my $csv_profile_id; + if ( $format =~ m|^\d+$| ) { + $csv_profile_id = $format; + $format = 'csv'; } + my $data = C4::Biblio::BuildBiblioDataForExport( + { + biblionumbers => \@biblionumbers, + format => $format, + csv_profile_id => $csv_profile_id + } + ); + my $records_file = $data->{records_file}; + my $records_data = $data->{records_data}; $template2->param( - BIBLIO_RESULTS => \@results, + BIBLIO_RESULTS => $records_data, comment => $comment, shelfname => $shelf->shelfname, ); @@ -133,9 +130,9 @@ END_OF_BODY ); $email->text_body( $THE_body ); $email->attach( - Encode::encode("UTF-8", $iso2709), + Encode::encode("UTF-8", $records_file), content_type => 'application/octet-stream', - name => 'shelf.iso2709', + name => "shelf.$format", disposition => 'attachment', ); @@ -156,6 +153,7 @@ else { $template->param( shelfid => $shelfid, url => "/cgi-bin/koha/virtualshelves/sendshelf.pl", + csv_profiles => [ Koha::CsvProfiles->search({ type => 'marc' }) ], ); output_html_with_http_headers $query, $cookie, $template->output; } --