View | Details | Raw Unified | Return to bug 27266
Collapse All | Expand All

(-)a/C4/Biblio.pm (-100 lines)
Lines 35-41 BEGIN { Link Here
35
        GetMarcISBN
35
        GetMarcISBN
36
        GetMarcISSN
36
        GetMarcISSN
37
        GetMarcSubjects
37
        GetMarcSubjects
38
        GetMarcAuthors
39
        GetMarcSeries
38
        GetMarcSeries
40
        GetMarcUrls
39
        GetMarcUrls
41
        GetUsedMarcStructure
40
        GetUsedMarcStructure
Lines 1620-1724 sub GetMarcSubjects { Link Here
1620
    return \@marcsubjects;
1619
    return \@marcsubjects;
1621
}    #end getMARCsubjects
1620
}    #end getMARCsubjects
1622
1621
1623
=head2 GetMarcAuthors
1624
1625
  authors = GetMarcAuthors($record,$marcflavour);
1626
1627
Get all authors from the MARC record and returns them in an array.
1628
The authors are stored in different fields depending on MARC flavour
1629
1630
=cut
1631
1632
sub GetMarcAuthors {
1633
    my ( $record, $marcflavour ) = @_;
1634
    if (!$record) {
1635
        carp 'GetMarcAuthors called on undefined record';
1636
        return;
1637
    }
1638
    my ( $mintag, $maxtag, $fields_filter );
1639
1640
    # tagslib useful only for UNIMARC author responsibilities
1641
    my $tagslib;
1642
    if ( $marcflavour eq "UNIMARC" ) {
1643
        # FIXME : we don't have the framework available, we take the default framework. May be buggy on some setups, will be usually correct.
1644
        $tagslib = GetMarcStructure( 1, '', { unsafe => 1 });
1645
        $mintag = "700";
1646
        $maxtag = "712";
1647
        $fields_filter = '7..';
1648
    } else { # marc21/normarc
1649
        $mintag = "700";
1650
        $maxtag = "720";
1651
        $fields_filter = '7..';
1652
    }
1653
1654
    my @marcauthors;
1655
    my $AuthoritySeparator = C4::Context->preference('AuthoritySeparator');
1656
1657
    foreach my $field ( $record->field($fields_filter) ) {
1658
        next unless $field->tag() >= $mintag && $field->tag() <= $maxtag;
1659
        my @subfields_loop;
1660
        my @link_loop;
1661
        my @subfields  = $field->subfields();
1662
        my $count_auth = 0;
1663
1664
        # if there is an authority link, build the link with Koha-Auth-Number: subfield9
1665
        my $subfield9 = $field->subfield('9');
1666
        if ($subfield9) {
1667
            my $linkvalue = $subfield9;
1668
            $linkvalue =~ s/(\(|\))//g;
1669
            @link_loop = ( { 'limit' => 'an', 'link' => $linkvalue } );
1670
        }
1671
1672
        # other subfields
1673
        my $unimarc3;
1674
        for my $authors_subfield (@subfields) {
1675
            next if ( $authors_subfield->[0] eq '9' );
1676
1677
            # unimarc3 contains the $3 of the author for UNIMARC.
1678
            # For french academic libraries, it's the "ppn", and it's required for idref webservice
1679
            $unimarc3 = $authors_subfield->[1] if $marcflavour eq 'UNIMARC' and $authors_subfield->[0] =~ /3/;
1680
1681
            # don't load unimarc subfields 3, 5
1682
            next if ( $marcflavour eq 'UNIMARC' and ( $authors_subfield->[0] =~ /3|5/ ) );
1683
1684
            my $code = $authors_subfield->[0];
1685
            my $value        = $authors_subfield->[1];
1686
            my $linkvalue    = $value;
1687
            $linkvalue =~ s/(\(|\))//g;
1688
            # UNIMARC author responsibility
1689
            if ( $marcflavour eq 'UNIMARC' and $code eq '4' ) {
1690
                $value = GetAuthorisedValueDesc( $field->tag(), $code, $value, '', $tagslib );
1691
                $linkvalue = "($value)";
1692
            }
1693
            # if no authority link, build a search query
1694
            unless ($subfield9) {
1695
                push @link_loop, {
1696
                    limit    => 'au',
1697
                    'link'   => $linkvalue,
1698
                    operator => (scalar @link_loop) ? ' and ' : undef
1699
                };
1700
            }
1701
            my @this_link_loop = @link_loop;
1702
            # do not display $0
1703
            unless ( $code eq '0') {
1704
                push @subfields_loop, {
1705
                    tag       => $field->tag(),
1706
                    code      => $code,
1707
                    value     => $value,
1708
                    link_loop => \@this_link_loop,
1709
                    separator => (scalar @subfields_loop) ? $AuthoritySeparator : ''
1710
                };
1711
            }
1712
        }
1713
        push @marcauthors, {
1714
            MARCAUTHOR_SUBFIELDS_LOOP => \@subfields_loop,
1715
            authoritylink => $subfield9,
1716
            unimarc3 => $unimarc3
1717
        };
1718
    }
1719
    return \@marcauthors;
1720
}
1721
1722
=head2 GetMarcUrls
1622
=head2 GetMarcUrls
1723
1623
1724
  $marcurls = GetMarcUrls($record,$marcflavour);
1624
  $marcurls = GetMarcUrls($record,$marcflavour);
(-)a/Koha/Biblio.pm (+97 lines)
Lines 852-857 sub get_marc_notes { Link Here
852
    return \@marcnotes;
852
    return \@marcnotes;
853
}
853
}
854
854
855
=head3 get_authors_from_MARC
856
857
    my $authors = $biblio->get_authors_from_MARC;
858
859
Get all authors from the MARC record and returns them in an array.
860
The authors are stored in different fields depending on MARC flavour
861
862
=cut
863
864
sub get_authors_from_MARC {
865
    my ( $self, $params ) = @_;
866
867
    my ( $mintag, $maxtag, $fields_filter );
868
    my $marcflavour = C4::Context->preference('marcflavour');
869
870
    # tagslib useful only for UNIMARC author responsibilities
871
    my $tagslib;
872
    if ( $marcflavour eq "UNIMARC" ) {
873
        # FIXME : we don't have the framework available, we take the default framework. May be buggy on some setups, will be usually correct.
874
        $tagslib = C4::Biblio::GetMarcStructure( 1, '', { unsafe => 1 });
875
        $mintag = "700";
876
        $maxtag = "712";
877
        $fields_filter = '7..';
878
    } else { # marc21/normarc
879
        $mintag = "700";
880
        $maxtag = "720";
881
        $fields_filter = '7..';
882
    }
883
884
    my @marcauthors;
885
    my $AuthoritySeparator = C4::Context->preference('AuthoritySeparator');
886
887
    foreach my $field ( $self->metadata->record->field($fields_filter) ) {
888
        next unless $field->tag() >= $mintag && $field->tag() <= $maxtag;
889
        my @subfields_loop;
890
        my @link_loop;
891
        my @subfields  = $field->subfields();
892
        my $count_auth = 0;
893
894
        # if there is an authority link, build the link with Koha-Auth-Number: subfield9
895
        my $subfield9 = $field->subfield('9');
896
        if ($subfield9) {
897
            my $linkvalue = $subfield9;
898
            $linkvalue =~ s/(\(|\))//g;
899
            @link_loop = ( { 'limit' => 'an', 'link' => $linkvalue } );
900
        }
901
902
        # other subfields
903
        my $unimarc3;
904
        for my $authors_subfield (@subfields) {
905
            next if ( $authors_subfield->[0] eq '9' );
906
907
            # unimarc3 contains the $3 of the author for UNIMARC.
908
            # For french academic libraries, it's the "ppn", and it's required for idref webservice
909
            $unimarc3 = $authors_subfield->[1] if $marcflavour eq 'UNIMARC' and $authors_subfield->[0] =~ /3/;
910
911
            # don't load unimarc subfields 3, 5
912
            next if ( $marcflavour eq 'UNIMARC' and ( $authors_subfield->[0] =~ /3|5/ ) );
913
914
            my $code = $authors_subfield->[0];
915
            my $value        = $authors_subfield->[1];
916
            my $linkvalue    = $value;
917
            $linkvalue =~ s/(\(|\))//g;
918
            # UNIMARC author responsibility
919
            if ( $marcflavour eq 'UNIMARC' and $code eq '4' ) {
920
                $value = C4::Biblio::GetAuthorisedValueDesc( $field->tag(), $code, $value, '', $tagslib );
921
                $linkvalue = "($value)";
922
            }
923
            # if no authority link, build a search query
924
            unless ($subfield9) {
925
                push @link_loop, {
926
                    limit    => 'au',
927
                    'link'   => $linkvalue,
928
                    operator => (scalar @link_loop) ? ' and ' : undef
929
                };
930
            }
931
            my @this_link_loop = @link_loop;
932
            # do not display $0
933
            unless ( $code eq '0') {
934
                push @subfields_loop, {
935
                    tag       => $field->tag(),
936
                    code      => $code,
937
                    value     => $value,
938
                    link_loop => \@this_link_loop,
939
                    separator => (scalar @subfields_loop) ? $AuthoritySeparator : ''
940
                };
941
            }
942
        }
943
        push @marcauthors, {
944
            MARCAUTHOR_SUBFIELDS_LOOP => \@subfields_loop,
945
            authoritylink => $subfield9,
946
            unimarc3 => $unimarc3
947
        };
948
    }
949
    return \@marcauthors;
950
}
951
855
=head3 to_api
952
=head3 to_api
856
953
857
    my $json = $biblio->to_api;
954
    my $json = $biblio->to_api;
(-)a/basket/basket.pl (-1 / +1 lines)
Lines 72-78 foreach my $biblionumber ( @bibs ) { Link Here
72
    my $biblio           = Koha::Biblios->find( $biblionumber );
72
    my $biblio           = Koha::Biblios->find( $biblionumber );
73
    my $record           = &GetMarcBiblio({ biblionumber => $biblionumber });
73
    my $record           = &GetMarcBiblio({ biblionumber => $biblionumber });
74
    my $marcnotesarray   = $biblio->get_marc_notes({ marcflavour => $marcflavour });
74
    my $marcnotesarray   = $biblio->get_marc_notes({ marcflavour => $marcflavour });
75
    my $marcauthorsarray = GetMarcAuthors( $record, $marcflavour );
75
    my $marcauthorsarray = $biblio->get_authors_from_MARC;
76
    my $marcsubjctsarray = GetMarcSubjects( $record, $marcflavour );
76
    my $marcsubjctsarray = GetMarcSubjects( $record, $marcflavour );
77
    my $marcseriesarray  = GetMarcSeries  ($record,$marcflavour);
77
    my $marcseriesarray  = GetMarcSeries  ($record,$marcflavour);
78
    my $marcurlsarray    = GetMarcUrls    ($record,$marcflavour);
78
    my $marcurlsarray    = GetMarcUrls    ($record,$marcflavour);
(-)a/basket/sendbasket.pl (-1 / +2 lines)
Lines 74-83 if ( $email_add ) { Link Here
74
74
75
        my $dat              = GetBiblioData($biblionumber);
75
        my $dat              = GetBiblioData($biblionumber);
76
        next unless $dat;
76
        next unless $dat;
77
        my $biblio           = Koha::Biblios->find( $biblionumber );
77
        my $record           = GetMarcBiblio({
78
        my $record           = GetMarcBiblio({
78
            biblionumber => $biblionumber,
79
            biblionumber => $biblionumber,
79
            embed_items => 1 });
80
            embed_items => 1 });
80
        my $marcauthorsarray = GetMarcAuthors( $record, $marcflavour );
81
        my $marcauthorsarray = $biblio->get_authors_from_MARC;
81
        my $marcsubjctsarray = GetMarcSubjects( $record, $marcflavour );
82
        my $marcsubjctsarray = GetMarcSubjects( $record, $marcflavour );
82
83
83
        my @items = GetItemsInfo( $biblionumber );
84
        my @items = GetItemsInfo( $biblionumber );
(-)a/opac/opac-basket.pl (-1 / +1 lines)
Lines 94-100 foreach my $biblionumber ( @bibs ) { Link Here
94
    $record_processor->process($record);
94
    $record_processor->process($record);
95
    next unless $record;
95
    next unless $record;
96
    my $marcnotesarray   = $biblio->get_marc_notes({ marcflavour => $marcflavour, opac => 1 });
96
    my $marcnotesarray   = $biblio->get_marc_notes({ marcflavour => $marcflavour, opac => 1 });
97
    my $marcauthorsarray = GetMarcAuthors( $record, $marcflavour );
97
    my $marcauthorsarray = $biblio->get_authors_from_MARC;
98
    my $marcsubjctsarray = GetMarcSubjects( $record, $marcflavour );
98
    my $marcsubjctsarray = GetMarcSubjects( $record, $marcflavour );
99
    my $marcseriesarray  = GetMarcSeries  ($record,$marcflavour);
99
    my $marcseriesarray  = GetMarcSeries  ($record,$marcflavour);
100
    my $marcurlsarray    = GetMarcUrls    ($record,$marcflavour);
100
    my $marcurlsarray    = GetMarcUrls    ($record,$marcflavour);
(-)a/opac/opac-detail.pl (+2 lines)
Lines 793-798 if (scalar(@itemloop) == 0 || scalar(@otheritemloop) == 0) { Link Here
793
}
793
}
794
794
795
my $marcnotesarray = $biblio->get_marc_notes({ marcflavour => $marcflavour, opac => 1 });
795
my $marcnotesarray = $biblio->get_marc_notes({ marcflavour => $marcflavour, opac => 1 });
796
my $marcauthorsarray = $biblio->get_authors_from_MARC;
796
797
797
if( C4::Context->preference('ArticleRequests') ) {
798
if( C4::Context->preference('ArticleRequests') ) {
798
    my $patron = $borrowernumber ? Koha::Patrons->find($borrowernumber) : undef;
799
    my $patron = $borrowernumber ? Koha::Patrons->find($borrowernumber) : undef;
Lines 807-812 if( C4::Context->preference('ArticleRequests') ) { Link Here
807
808
808
    $template->param(
809
    $template->param(
809
                     MARCNOTES               => $marcnotesarray,
810
                     MARCNOTES               => $marcnotesarray,
811
                     MARCAUTHORS             => $marcauthorsarray,
810
                     norequests              => $norequests,
812
                     norequests              => $norequests,
811
                     RequestOnOpac           => C4::Context->preference("RequestOnOpac"),
813
                     RequestOnOpac           => C4::Context->preference("RequestOnOpac"),
812
                     itemdata_ccode          => $itemfields{ccode},
814
                     itemdata_ccode          => $itemfields{ccode},
(-)a/opac/opac-sendbasket.pl (-1 / +2 lines)
Lines 81-92 if ( $email_add ) { Link Here
81
81
82
        my $dat              = GetBiblioData($biblionumber);
82
        my $dat              = GetBiblioData($biblionumber);
83
        next unless $dat;
83
        next unless $dat;
84
        my $biblio           = Koha::Biblios->find( $biblionumber );
84
        my $record           = GetMarcBiblio({
85
        my $record           = GetMarcBiblio({
85
            biblionumber => $biblionumber,
86
            biblionumber => $biblionumber,
86
            embed_items  => 1,
87
            embed_items  => 1,
87
            opac         => 1,
88
            opac         => 1,
88
            borcat       => $borcat });
89
            borcat       => $borcat });
89
        my $marcauthorsarray = GetMarcAuthors( $record, $marcflavour );
90
        my $marcauthorsarray = $biblio->get_authors_from_MARC;
90
        my $marcsubjctsarray = GetMarcSubjects( $record, $marcflavour );
91
        my $marcsubjctsarray = GetMarcSubjects( $record, $marcflavour );
91
92
92
        my @items = GetItemsInfo( $biblionumber );
93
        my @items = GetItemsInfo( $biblionumber );
(-)a/opac/opac-sendshelf.pl (-1 / +2 lines)
Lines 92-101 if ( $email ) { Link Here
92
            opac         => 1,
92
            opac         => 1,
93
            borcat       => $borcat });
93
            borcat       => $borcat });
94
        next unless $record;
94
        next unless $record;
95
        my $biblio           = Koha::Biblios->find( $biblionumber );
95
        my $fw               = GetFrameworkCode($biblionumber);
96
        my $fw               = GetFrameworkCode($biblionumber);
96
        my $dat              = GetBiblioData($biblionumber);
97
        my $dat              = GetBiblioData($biblionumber);
97
98
98
        my $marcauthorsarray = GetMarcAuthors( $record, $marcflavour );
99
        my $marcauthorsarray = $biblio->get_authors_from_MARC;
99
        my $marcsubjctsarray = GetMarcSubjects( $record, $marcflavour );
100
        my $marcsubjctsarray = GetMarcSubjects( $record, $marcflavour );
100
101
101
        my @items = GetItemsInfo( $biblionumber );
102
        my @items = GetItemsInfo( $biblionumber );
(-)a/t/Biblio.t (-7 / +1 lines)
Lines 21-27 use Test::More; Link Here
21
use Test::MockModule;
21
use Test::MockModule;
22
use Test::Warn;
22
use Test::Warn;
23
23
24
plan tests => 39;
24
plan tests => 37;
25
25
26
26
27
use_ok('C4::Biblio', qw( AddBiblio ModBiblio BiblioAutoLink LinkBibHeadingsToAuthorities GetMarcPrice GetMarcQuantity GetMarcControlnumber GetMarcISBN GetMarcISSN GetMarcSubjects GetMarcAuthors GetMarcUrls GetMarcSeries TransformMarcToKoha ModBiblioMarc RemoveAllNsb GetMarcBiblio UpdateTotalIssues ));
27
use_ok('C4::Biblio', qw( AddBiblio ModBiblio BiblioAutoLink LinkBibHeadingsToAuthorities GetMarcPrice GetMarcQuantity GetMarcControlnumber GetMarcISBN GetMarcISSN GetMarcSubjects GetMarcAuthors GetMarcUrls GetMarcSeries TransformMarcToKoha ModBiblioMarc RemoveAllNsb GetMarcBiblio UpdateTotalIssues ));
Lines 94-105 warning_is { $ret = GetMarcSubjects() } Link Here
94
94
95
ok( !defined $ret, 'GetMarcSubjects returns undef if not passed rec');
95
ok( !defined $ret, 'GetMarcSubjects returns undef if not passed rec');
96
96
97
warning_is { $ret = GetMarcAuthors() }
98
           { carped => 'GetMarcAuthors called on undefined record'},
99
           "GetMarcAuthors returns carped warning on undef record";
100
101
ok( !defined $ret, 'GetMarcAuthors returns undef if not passed rec');
102
103
warning_is { $ret = GetMarcUrls() }
97
warning_is { $ret = GetMarcUrls() }
104
           { carped => 'GetMarcUrls called on undefined record'},
98
           { carped => 'GetMarcUrls called on undefined record'},
105
           "GetMarcUrls returns carped warning on undef record";
99
           "GetMarcUrls returns carped warning on undef record";
(-)a/t/db_dependent/Koha/Biblio.t (-1 / +29 lines)
Lines 17-23 Link Here
17
17
18
use Modern::Perl;
18
use Modern::Perl;
19
19
20
use Test::More tests => 14;
20
use Test::More tests => 15;
21
21
22
use C4::Biblio qw( AddBiblio ModBiblio );
22
use C4::Biblio qw( AddBiblio ModBiblio );
23
use Koha::Database;
23
use Koha::Database;
Lines 637-639 subtest 'get_marc_notes() UNIMARC tests' => sub { Link Here
637
637
638
    $schema->storage->txn_rollback;
638
    $schema->storage->txn_rollback;
639
};
639
};
640
641
subtest 'get_authors_from_MARC() tests' => sub {
642
643
    plan tests => 1;
644
645
    $schema->storage->txn_begin;
646
647
    my $biblio = $builder->build_sample_biblio;
648
    my $record = $biblio->metadata->record;
649
650
    # add author information
651
    my $field = MARC::Field->new('700','1','','a' => 'Jefferson, Thomas');
652
    $record->append_fields($field);
653
    $field = MARC::Field->new('700','1','','d' => '1743-1826');
654
    $record->append_fields($field);
655
    $field = MARC::Field->new('700','1','','e' => 'former owner.');
656
    $record->append_fields($field);
657
    $field = MARC::Field->new('700','1','','5' => 'MH');
658
    $record->append_fields($field);
659
660
    # get record
661
    C4::Biblio::ModBiblio( $record, $biblio->biblionumber );
662
    $biblio = Koha::Biblios->find( $biblio->biblionumber );
663
664
    is( 4, @{$biblio->get_authors_from_MARC}, 'get_authors_from_MARC retrieves correct number of author subfields' );
665
666
    $schema->storage->txn_rollback;
667
};
(-)a/virtualshelves/sendshelf.pl (-2 / +2 lines)
Lines 73-83 if ($to_address) { Link Here
73
73
74
    while ( my $content = $contents->next ) {
74
    while ( my $content = $contents->next ) {
75
        my $biblionumber     = $content->biblionumber;
75
        my $biblionumber     = $content->biblionumber;
76
        my $biblio           = Koha::Biblios->find( $biblionumber );
76
        my $dat              = GetBiblioData($biblionumber);
77
        my $dat              = GetBiblioData($biblionumber);
77
        my $record           = GetMarcBiblio({
78
        my $record           = GetMarcBiblio({
78
            biblionumber => $biblionumber,
79
            biblionumber => $biblionumber,
79
            embed_items  => 1 });
80
            embed_items  => 1 });
80
        my $marcauthorsarray = GetMarcAuthors( $record, $marcflavour );
81
        my $marcauthorsarray = $biblio->get_authors_from_MARC;
81
        my $marcsubjctsarray = GetMarcSubjects( $record, $marcflavour );
82
        my $marcsubjctsarray = GetMarcSubjects( $record, $marcflavour );
82
83
83
        my @items = GetItemsInfo($biblionumber);
84
        my @items = GetItemsInfo($biblionumber);
84
- 

Return to bug 27266