Bug 11529: Use new biblio fields whenever possible
authorEre Maijala <ere.maijala@helsinki.fi>
Mon, 5 Nov 2018 12:22:27 +0000 (14:22 +0200)
committerMartin Renvoize <martin.renvoize@ptfs-europe.com>
Mon, 5 Aug 2019 14:03:17 +0000 (15:03 +0100)
Signed-off-by: Michal Denar <black23@gmail.com>
Signed-off-by: Michal Denar <black23@gmail.com>
Signed-off-by: Josef Moravec <josef.moravec@gmail.com>
Signed-off-by: Nick Clemens <nick@bywatersolutions.com>
Signed-off-by: Martin Renvoize <martin.renvoize@ptfs-europe.com>

34 files changed:
C4/Biblio.pm
C4/HoldsQueue.pm
C4/Overdues.pm
C4/Search.pm
C4/ShelfBrowser.pm
Koha/Biblio.pm
acqui/neworderbiblio.pl
basket/basket.pl
catalogue/detail.pl
catalogue/moredetail.pl
circ/branchoverdues.pl
circ/pendingreserves.pl
circ/reserveratios.pl
circ/transferstoreceive.pl
koha-tmpl/intranet-tmpl/prog/en/includes/waiting_holds.inc
koha-tmpl/intranet-tmpl/prog/en/modules/circ/pendingreserves.tt
koha-tmpl/intranet-tmpl/prog/en/modules/circ/view_holdsqueue.tt
opac/opac-basket.pl
opac/opac-detail.pl
opac/opac-readingrecord.pl
opac/opac-reserve.pl
opac/opac-sendshelf.pl
opac/opac-shelves.pl
opac/opac-showreviews.pl
opac/opac-tags.pl
opac/opac-user.pl
svc/checkouts
svc/holds
t/Biblio.t
t/Biblio2.t
tags/list.pl
tools/batch_delete_records.pl
virtualshelves/sendshelf.pl
virtualshelves/shelves.pl

index 35b8fbb..e039fe7 100644 (file)
@@ -67,6 +67,7 @@ BEGIN {
         TransformHtmlToMarc
         TransformHtmlToXml
         prepare_host_field
+        SplitSubtitle
     );
 
     # Internal functions
@@ -644,39 +645,33 @@ sub _check_valid_auth_link {
 
 =head2 GetRecordValue
 
-  my $values = GetRecordValue($field, $record, $frameworkcode);
+  my $values = GetRecordValue($field, $record);
 
-Get MARC fields from a keyword defined in fieldmapping table.
+Get MARC fields from the record using the framework mappings for biblio fields.
 
 =cut
 
 sub GetRecordValue {
-    my ( $field, $record, $frameworkcode ) = @_;
+    my ( $field, $record ) = @_;
 
     if (!$record) {
         carp 'GetRecordValue called with undefined record';
         return;
     }
-    my $dbh = C4::Context->dbh;
-
-    my $sth = $dbh->prepare('SELECT fieldcode, subfieldcode FROM fieldmapping WHERE frameworkcode = ? AND field = ?');
-    $sth->execute( $frameworkcode, $field );
-
-    my @result = ();
-
-    while ( my $row = $sth->fetchrow_hashref ) {
-        foreach my $field ( $record->field( $row->{fieldcode} ) ) {
-            if ( ( $row->{subfieldcode} ne "" && $field->subfield( $row->{subfieldcode} ) ) ) {
-                foreach my $subfield ( $field->subfield( $row->{subfieldcode} ) ) {
-                    push @result, { 'subfield' => $subfield };
-                }
 
-            } elsif ( $row->{subfieldcode} eq "" ) {
-                push @result, { 'subfield' => $field->as_string() };
+    my @result;
+    my @mss = GetMarcSubfieldStructureFromKohaField("biblio.$field");
+    foreach my $fldhash ( @mss ) {
+        my $tag = $fldhash->{tagfield};
+        my $sub = $fldhash->{tagsubfield};
+        foreach my $fld ( $record->field($tag) ) {
+            if( $sub eq '@' || $fld->is_control_field ) {
+                push @result, $fld->data if $fld->data;
+            } else {
+                push @result, grep { $_ } $fld->subfield($sub);
             }
         }
     }
-
     return \@result;
 }
 
@@ -3458,6 +3453,22 @@ sub RemoveAllNsb {
     return $record;
 }
 
+=head2 SplitSubtitle
+
+    $subtitles = SplitSubtitle($subtitle);
+
+Splits a subtitle field to an array of hashes like the one GetRecordValue returns
+
+=cut
+
+sub SplitSubtitle {
+    my $subtitle = shift;
+
+    my @subtitles = map( { 'subfield' => $_ }, split(/ \| /, $subtitle // '' ) );
+
+    return \@subtitles;
+}
+
 1;
 
 
index d55e7e3..650f179 100755 (executable)
@@ -132,7 +132,12 @@ sub GetHoldsQueueItems {
     my $dbh   = C4::Context->dbh;
 
     my @bind_params = ();
-    my $query = q/SELECT tmp_holdsqueue.*, biblio.author, items.ccode, items.itype, biblioitems.itemtype, items.location, items.enumchron, items.cn_sort, biblioitems.publishercode,biblio.copyrightdate,biblioitems.publicationyear,biblioitems.pages,biblioitems.size,biblioitems.publicationyear,biblioitems.isbn,items.copynumber
+    my $query = q/SELECT tmp_holdsqueue.*, biblio.author, items.ccode, items.itype, biblioitems.itemtype, items.location,
+                         items.enumchron, items.cn_sort, biblioitems.publishercode,
+                         biblio.copyrightdate, biblio.subtitle, biblio.part_number,
+                         biblio.part_name,
+                         biblioitems.publicationyear, biblioitems.pages, biblioitems.size, biblioitems.publicationyear,
+                         biblioitems.isbn, items.copynumber
                   FROM tmp_holdsqueue
                        JOIN biblio      USING (biblionumber)
                   LEFT JOIN biblioitems USING (biblionumber)
@@ -147,19 +152,15 @@ sub GetHoldsQueueItems {
     $sth->execute(@bind_params);
     my $items = [];
     while ( my $row = $sth->fetchrow_hashref ){
-        my $record = GetMarcBiblio({ biblionumber => $row->{biblionumber} });
-        if ($record){
-            $row->{subtitle} = [ map { $_->{subfield} } @{ GetRecordValue( 'subtitle', $record, '' ) } ];
-            $row->{parts} = GetRecordValue('parts',$record,'')->[0]->{subfield};
-            $row->{numbers} = GetRecordValue('numbers',$record,'')->[0]->{subfield};
-        }
-
         # return the bib-level or item-level itype per syspref
         if (!C4::Context->preference('item-level_itypes')) {
             $row->{itype} = $row->{itemtype};
         }
         delete $row->{itemtype};
 
+        my @subtitles = split(/ \| /, $row->{'subtitle'} // '' );
+        $row->{'subtitle'} = \@subtitles;
+
         push @$items, $row;
     }
     return $items;
index 2a61733..fa8d6e6 100644 (file)
@@ -701,6 +701,10 @@ sub GetOverduesForBranch {
             borrowers.phone,
             borrowers.email,
                biblio.title,
+               biblio.subtitle,
+               biblio.medium,
+               biblio.part_number,
+               biblio.part_name,
                biblio.author,
                biblio.biblionumber,
                issues.date_due,
index 91af94c..6d7157c 100644 (file)
@@ -1938,7 +1938,7 @@ sub searchResults {
 
         SetUTF8Flag($marcrecord);
         my $oldbiblio = TransformMarcToKoha( $marcrecord, $fw );
-        $oldbiblio->{subtitle} = GetRecordValue('subtitle', $marcrecord, $fw);
+        $oldbiblio->{subtitle} = GetRecordValue('subtitle', $marcrecord);
         $oldbiblio->{result_number} = $i + 1;
 
         # add imageurl to itemtype if there is one
index ee551d2..b5d1979 100644 (file)
@@ -223,12 +223,15 @@ sub GetShelfInfo {
         my $this_biblio = GetBibData($item->{biblionumber});
         next unless defined $this_biblio;
         $item->{'title'} = $this_biblio->{'title'};
+        $item->{'subtitle'} = C4::Biblio::SplitSubtitle($this_biblio->{'subtitle'}),
+        $item->{'medium'} = $this_biblio->{'medium'};
+        $item->{'part_number'} = $this_biblio->{'part_number'};
+        $item->{'part_name'} = $this_biblio->{'part_name'};
         my $this_record = GetMarcBiblio({ biblionumber => $this_biblio->{'biblionumber'} });
         $item->{'browser_normalized_upc'} = GetNormalizedUPC($this_record,$marcflavour);
         $item->{'browser_normalized_oclc'} = GetNormalizedOCLCNumber($this_record,$marcflavour);
         $item->{'browser_normalized_isbn'} = GetNormalizedISBN(undef,$this_record,$marcflavour);
         $item->{'browser_normalized_ean'} = GetNormalizedEAN($this_record,$marcflavour);
-        $item->{'subtitle'} = GetRecordValue('subtitle', $this_record, GetFrameworkCode( $item->{biblionumber} ));
         push @valid_items, $item;
     }
     return @valid_items;
@@ -239,7 +242,7 @@ sub GetBibData {
        my ($bibnum) = @_;
 
     my $dbh         = C4::Context->dbh;
-    my $sth = $dbh->prepare("SELECT biblionumber, title FROM biblio WHERE biblionumber=?");
+    my $sth = $dbh->prepare("SELECT biblionumber, title, subtitle, medium, part_number, part_name FROM biblio WHERE biblionumber=?");
     $sth->execute($bibnum);
     my $bib = $sth->fetchrow_hashref();
     return $bib;
index f38a101..d944cb0 100644 (file)
@@ -84,20 +84,15 @@ sub metadata {
 
 my @subtitles = $biblio->subtitles();
 
-Returns list of subtitles for a record.
-
-Keyword to MARC mapping for subtitle must be set for this method to return any possible values.
+Returns list of subtitles for a record according to the framework.
 
 =cut
 
 sub subtitles {
     my ( $self ) = @_;
 
-    return map { $_->{subfield} } @{
-        C4::Biblio::GetRecordValue(
-            'subtitle',
-            C4::Biblio::GetMarcBiblio({ biblionumber => $self->id }),
-            $self->frameworkcode ) };
+    my @subtitles = split( / \| /, $self->subtitle // '' );
+    return @subtitles;
 }
 
 =head3 can_article_request
index b48737d..8333b47 100755 (executable)
@@ -129,8 +129,8 @@ my @results;
 foreach my $result ( @{$marcresults} ) {
     my $marcrecord = C4::Search::new_record_from_zebra( 'biblioserver', $result );
     my $biblio = TransformMarcToKoha( $marcrecord, '' );
-    $biblio->{subtitles} = GetRecordValue( 'subtitle', GetMarcBiblio({ biblionumber => $biblio->{biblionumber} }),  GetFrameworkCode( $biblio->{biblionumber} ) );
 
+    $biblio->{subtitles} = C4::Biblio::SplitSubtitle($biblio->{'subtitle'});
     $biblio->{booksellerid} = $booksellerid;
     push @results, $biblio;
 
index 4318a95..c6d3170 100755 (executable)
@@ -59,12 +59,10 @@ if (C4::Context->preference('TagsEnabled')) {
 foreach my $biblionumber ( @bibs ) {
     $template->param( biblionumber => $biblionumber );
 
-    my $fw = GetFrameworkCode($biblionumber);
-
     my $dat              = &GetBiblioData($biblionumber);
     next unless $dat;
     my $record           = &GetMarcBiblio({ biblionumber => $biblionumber });
-    $dat->{subtitle}     = GetRecordValue('subtitle', $record, $fw);
+    $dat->{subtitle}     = GetRecordValue('subtitle', $record);
     my $marcnotesarray   = GetMarcNotes( $record, $marcflavour );
     my $marcauthorsarray = GetMarcAuthors( $record, $marcflavour );
     my $marcsubjctsarray = GetMarcSubjects( $record, $marcflavour );
index b7e4d6e..4284635 100755 (executable)
@@ -142,7 +142,7 @@ my $marcsubjctsarray = GetMarcSubjects( $record, $marcflavour );
 my $marcseriesarray  = GetMarcSeries($record,$marcflavour);
 my $marcurlsarray    = GetMarcUrls    ($record,$marcflavour);
 my $marchostsarray  = GetMarcHosts($record,$marcflavour);
-my $subtitle         = GetRecordValue('subtitle', $record, $fw);
+my $subtitle         = GetRecordValue('subtitle', $record);
 
 my $itemtypes = { map { $_->{itemtype} => $_ } @{ Koha::ItemTypes->search->unblessed } };
 
index 57647ed..a4152b4 100755 (executable)
@@ -110,7 +110,7 @@ if (@hostitems){
         push (@items,@hostitems);
 }
 
-my $subtitle = GetRecordValue('subtitle', $record, $fw);
+my $subtitle = GetRecordValue('subtitle', $record);
 
 my $totalcount=@all_items;
 my $showncount=@items;
index 577ec2a..e696d77 100755 (executable)
@@ -76,13 +76,13 @@ if ($tagslib->{$tag}->{$subfield}->{authorised_value}) {
 # now display infos
 foreach my $num (@getoverdues) {
     my %overdueforbranch;
-    my $record = GetMarcBiblio({ biblionumber => $num->{biblionumber} });
-    if ($record){
-        $overdueforbranch{'subtitle'} = GetRecordValue('subtitle',$record,'')->[0]->{subfield};
-    }
     my $dt = dt_from_string($num->{date_due}, 'sql');
     $overdueforbranch{'date_due'}          = output_pref($dt);
     $overdueforbranch{'title'}             = $num->{'title'};
+    $overdueforbranch{'subtitle'}          = $num->{'subtitle'};
+    $overdueforbranch{'medium'}            = $num->{'medium'};
+    $overdueforbranch{'part_number'}       = $num->{'part_number'};
+    $overdueforbranch{'part_name'}         = $num->{'part_name'};
     $overdueforbranch{'description'}       = $num->{'description'};
     $overdueforbranch{'barcode'}           = $num->{'barcode'};
     $overdueforbranch{'biblionumber'}      = $num->{'biblionumber'};
index 4fdfdac..d890673 100755 (executable)
@@ -198,6 +198,10 @@ my $strsth =
             GROUP_CONCAT(DISTINCT items.copynumber
                     ORDER BY items.itemnumber SEPARATOR '|') l_copynumber,
             biblio.title,
+            biblio.subtitle,
+            biblio.medium,
+            biblio.part_number,
+            biblio.part_name,
             biblio.author,
             count(DISTINCT items.itemnumber) as icount,
             count(DISTINCT reserves.borrowernumber) as rcount,
@@ -237,10 +241,6 @@ my $sth = $dbh->prepare($strsth);
 $sth->execute(@query_params);
 
 while ( my $data = $sth->fetchrow_hashref ) {
-    my $record = Koha::Biblios->find($data->{biblionumber});
-    if ($record){
-        $data->{subtitle} = [ $record->subtitles ];
-    }
     push(
         @reservedata, {
             reservedate     => $data->{l_reservedate},
@@ -248,6 +248,9 @@ while ( my $data = $sth->fetchrow_hashref ) {
             surname         => $data->{surname},
             title           => $data->{title},
             subtitle        => $data->{subtitle},
+            medium          => $data->{medium},
+            part_number     => $data->{part_number},
+            part_name       => $data->{part_name},
             author          => $data->{author},
             borrowernumber  => $data->{borrowernumber},
             biblionumber    => $data->{biblionumber},
index 104928a..15e6895 100755 (executable)
@@ -27,7 +27,6 @@ use C4::Context;
 use C4::Output;
 use C4::Auth;
 use C4::Debug;
-use C4::Biblio qw/GetMarcBiblio GetRecordValue GetFrameworkCode/;
 use C4::Acquisition qw/GetOrdersByBiblionumber/;
 use Koha::DateUtils;
 use Koha::Acquisition::Baskets;
@@ -125,6 +124,10 @@ my $strsth =
 
         reserves.found,
         biblio.title,
+        biblio.subtitle,
+        biblio.medium,
+        biblio.part_number,
+        biblio.part_name,
         biblio.author,
         count(DISTINCT reserves.borrowernumber) as reservecount, 
         count(DISTINCT items.itemnumber) $include_aqorders_qty as itemcount
@@ -154,8 +157,6 @@ while ( my $data = $sth->fetchrow_hashref ) {
     my $thisratio = $data->{reservecount} / $data->{itemcount};
     my $ratiocalc = ($thisratio / $ratio);
     ($thisratio / $ratio) >= 1 or next;  # TODO: tighter targeting -- get ratio limit into SQL using HAVING clause
-    my $record = GetMarcBiblio({ biblionumber => $data->{biblionumber} });
-    $data->{subtitle} = GetRecordValue('subtitle', $record, GetFrameworkCode($data->{biblionumber}));
     push(
         @reservedata,
         {
@@ -163,7 +164,7 @@ while ( my $data = $sth->fetchrow_hashref ) {
             priority           => $data->{priority},
             name               => $data->{borrower},
             title              => $data->{title},
-            subtitle           => $data->{subtitle},
+            subtitle           => C4::Biblio::SplitSubtitle($data->{'subtitle'});
             author             => $data->{author},
             itemnum            => $data->{itemnumber},
             biblionumber       => $data->{biblionumber},
index a727dda..f1c09ef 100755 (executable)
@@ -99,6 +99,10 @@ while ( my $library = $libraries->next ) {
             %getransf = (
                 %getransf,
                 title          => $biblio->title,
+                subtitle       => C4::Biblio::SplitSubtitle($biblio->{'subtitle'}),
+                medium         => $biblio->medium,
+                part_number    => $biblio->part_number,
+                part_name      => $biblio->part_name,
                 author         => $biblio->author,
                 biblionumber   => $biblio->biblionumber,
                 itemnumber     => $item->itemnumber,
@@ -108,9 +112,6 @@ while ( my $library = $libraries->next ) {
                 itemcallnumber => $item->itemcallnumber,
             );
 
-            my $record = GetMarcBiblio({ biblionumber => $biblio->biblionumber });
-            $getransf{'subtitle'} = GetRecordValue('subtitle', $record, $biblio->frameworkcode);
-
             # we check if we have a reserv for this transfer
             my $holds = $item->current_holds;
             if ( my $first_hold = $holds->next ) {
index b635e03..f4606ac 100644 (file)
@@ -22,7 +22,7 @@
                 <td><span title="[% reserveloo.waitingdate | html %]">[% reserveloo.waitingdate | $KohaDates %]</span></td>
                 <td><span title="[% reserveloo.reservedate | html %]">[% reserveloo.reservedate | $KohaDates %]</span></td>
                 <td>[% INCLUDE 'biblio-default-view.inc' biblionumber = reserveloo.biblionumber %]
-                    [% reserveloo.biblio.title | html %] [% FOREACH subtitl IN reserveloo.biblio.subtitles %] [% subtitl.subfield | html %][% END %]
+                    [% reserveloo.biblio.title | html %] [% FOREACH subtitl IN reserveloo.biblio.subtitles %] [% subtitl | html %] [% reserveloo.biblio.part_number | html %] [% reserveloo.biblio.part_name | html %][% END %]
                     </a>
                         [% UNLESS ( item_level_itypes ) %]
                             [% IF ( ItemTypes.GetDescription(reserveloo.item.effective_itemtype) ) %]&nbsp; (<b>[% ItemTypes.GetDescription(reserveloo.item.effective_itemtype) | html %]</b>)
index 331e0a1..edf9d32 100644 (file)
@@ -77,7 +77,7 @@
             <td>
             <p>
                 [% INCLUDE 'biblio-default-view.inc' biblionumber = reserveloo.biblionumber %]
-                [% reserveloo.title | html %] [% FOREACH s IN reserveloo.subtitle %] [% s | html %][% END %]</a></p>
+                [% reserveloo.title | html %] [% FOREACH s IN reserveloo.subtitle %] [% s | html %][% END %] [% reserveloo.part_number | html %] [% reserveloo.part_name | html %]</a></p>
                 [% IF ( reserveloo.author ) %]<p> by [% reserveloo.author | html %]</p>[% END %]
             </td>
         [% ELSE %]
index 691b631..cd7c0df 100644 (file)
      <tbody>[% FOREACH itemsloo IN itemsloop %]
         <tr>
             <td class="hq-title">
-                <p><a href="/cgi-bin/koha/catalogue/detail.pl?biblionumber=[% itemsloo.biblionumber | uri %]"><strong>[% itemsloo.title | html %]</strong> [% FOREACH s IN itemsloo.subtitle %] [% s | html %][% END %]</a></p>
+                <p>
+                    <a href="/cgi-bin/koha/catalogue/detail.pl?biblionumber=[% itemsloo.biblionumber | uri %]">
+                        <strong>[% itemsloo.title | html %]</strong> [% FOREACH s IN itemsloo.subtitle %] [% s | html %][% END %] [% itemsloo.part_number | html %] [% itemsloo.part_name | html %]
+                    </a>
+                </p>
                 <p>
                     <div class="hq-biblionumber content_hidden">[% itemsloo.biblionumber | html %]</div>
                     <div class="hq-author">[% itemsloo.author | html %]</div>
index c2d57f2..7d7baf1 100755 (executable)
@@ -108,7 +108,7 @@ foreach my $biblionumber ( @bibs ) {
         }
     }
 
-    my $subtitle         = GetRecordValue('subtitle', $record, GetFrameworkCode($biblionumber));
+    my $subtitle         = GetRecordValue('subtitle', $record);
 
     my $hasauthors = 0;
     if($dat->{'author'} || @$marcauthorsarray) {
index 8f044f5..dfa4598 100755 (executable)
@@ -767,7 +767,7 @@ if (!C4::Context->preference("OPACXSLTDetailsDisplay") ) {
 }
 
 my $marcnotesarray   = GetMarcNotes   ($record,$marcflavour);
-my $subtitle         = GetRecordValue('subtitle', $record, GetFrameworkCode($biblionumber));
+my $subtitle         = GetRecordValue('subtitle', $record);
 
 if( C4::Context->preference('ArticleRequests') ) {
     my $patron = $borrowernumber ? Koha::Patrons->find($borrowernumber) : undef;
index c01409a..00c7c43 100755 (executable)
@@ -98,8 +98,7 @@ foreach my $issue ( @{$issues} ) {
         my $marc_rec =
           MARC::Record::new_from_xml( $marcxml, 'utf8',
             C4::Context->preference('marcflavour') );
-        $issue->{subtitle} =
-          GetRecordValue( 'subtitle', $marc_rec, $issue->{frameworkcode} );
+        $issue->{subtitle} = GetRecordValue( 'subtitle', $marc_rec );
         $issue->{normalized_upc} = GetNormalizedUPC( $marc_rec, C4::Context->preference('marcflavour') );
     }
     # My Summary HTML
index 472d0f5..a7631d3 100755 (executable)
@@ -400,7 +400,6 @@ $template->param('item_level_itypes' => $itemLevelTypes);
 
 foreach my $biblioNum (@biblionumbers) {
 
-    my $record = GetMarcBiblio({ biblionumber => $biblioNum });
     # Init the bib item with the choices for branch pickup
     my %biblioLoopIter;
 
@@ -420,7 +419,10 @@ foreach my $biblioNum (@biblionumbers) {
     my $frameworkcode = GetFrameworkCode( $biblioData->{biblionumber} );
     $biblioLoopIter{biblionumber} = $biblioData->{biblionumber};
     $biblioLoopIter{title} = $biblioData->{title};
-    $biblioLoopIter{subtitle} = GetRecordValue('subtitle', $record, $frameworkcode);
+    $biblioLoopIter{subtitle} = C4::Biblio::SplitSubtitle($biblioData->{'subtitle'});
+    $biblioLoopIter{medium} = $biblioData->{medium};
+    $biblioLoopIter{part_number} = $biblioData->{part_number};
+    $biblioLoopIter{part_name} = $biblioData->{part_name};
     $biblioLoopIter{author} = $biblioData->{author};
     $biblioLoopIter{rank} = $biblioData->{rank};
     $biblioLoopIter{reservecount} = $biblioData->{reservecount};
index 1df7a67..0b115ec 100755 (executable)
@@ -101,7 +101,7 @@ if ( $email ) {
 
         my $marcauthorsarray = GetMarcAuthors( $record, $marcflavour );
         my $marcsubjctsarray = GetMarcSubjects( $record, $marcflavour );
-        my $subtitle         = GetRecordValue('subtitle', $record, $fw);
+        my $subtitle         = GetRecordValue('subtitle', $record);
 
         my @items = GetItemsInfo( $biblionumber );
 
index cca12f2..2a391a0 100755 (executable)
@@ -295,7 +295,7 @@ if ( $op eq 'view' ) {
                     $this_item->{notforloan}        = $itemtype->notforloan;
                 }
                 $this_item->{'coins'}           = $biblio->get_coins;
-                $this_item->{'subtitle'}        = GetRecordValue( 'subtitle', $record, GetFrameworkCode( $biblionumber ) );
+                $this_item->{'subtitle'}        = GetRecordValue( 'subtitle', $record ),
                 $this_item->{'normalized_upc'}  = GetNormalizedUPC( $record, $marcflavour );
                 $this_item->{'normalized_ean'}  = GetNormalizedEAN( $record, $marcflavour );
                 $this_item->{'normalized_oclc'} = GetNormalizedOCLCNumber( $record, $marcflavour );
index fc6dc6c..05432a6 100755 (executable)
@@ -91,13 +91,15 @@ for my $result (@$reviews){
     my $biblio = Koha::Biblios->find( $biblionumber );
     my $biblioitem = $biblio->biblioitem;
     my $record = GetMarcBiblio({ biblionumber => $biblionumber });
-    my $frameworkcode = GetFrameworkCode($biblionumber);
        $result->{normalized_upc} = GetNormalizedUPC($record,$marcflavour);
        $result->{normalized_ean} = GetNormalizedEAN($record,$marcflavour);
        $result->{normalized_oclc} = GetNormalizedOCLCNumber($record,$marcflavour);
        $result->{normalized_isbn} = GetNormalizedISBN(undef,$record,$marcflavour);
     $result->{title} = $biblio->title;
-       $result->{subtitle} = GetRecordValue('subtitle', $record, $frameworkcode);
+    $result->{subtitle} = GetRecordValue('subtitle', $record );
+    $result->{medium} = $biblio->medium;
+    $result->{part_number} = $biblio->part_number;
+    $result->{part_name} = $biblio->part_name;
     $result->{author} = $biblio->author;
     $result->{place} = $biblioitem->place;
     $result->{publishercode} = $biblioitem->publishercode;
index d9c5add..2d7dfae 100755 (executable)
@@ -256,8 +256,11 @@ if ($loggedinuser) {
             $hidden_items = \@hidden_itemnumbers;
         }
         next if ( $should_hide && scalar @all_items == scalar @hidden_itemnumbers );
-        $tag->{subtitle} = GetRecordValue( 'subtitle', $record, GetFrameworkCode( $tag->{biblionumber} ) );
         $tag->{title} = $biblio->title;
+        $tag->{subtitle} = C4::Biblio::SplitSubtitle($biblio->subtitle);
+        $tag->{medium} = $biblio->medium;
+        $tag->{part_number} = $biblio->part_number;
+        $tag->{part_name} = $biblio->part_name;
         $tag->{author} = $biblio->author;
 
         my $xslfile = C4::Context->preference('OPACXSLTResultsDisplay');
index d7b1355..56ae5ad 100755 (executable)
@@ -201,12 +201,8 @@ if ( $pending_checkouts->count ) { # Useless test
         );
         $issue->{rentalfines} = $rental_fines->total_outstanding;
 
-        my $marcrecord = GetMarcBiblio({
-            biblionumber => $issue->{'biblionumber'},
-            embed_items  => 1,
-            opac         => 1,
-            borcat       => $borcat });
-        $issue->{'subtitle'} = GetRecordValue('subtitle', $marcrecord, GetFrameworkCode($issue->{'biblionumber'}));
+        $issue->{'subtitle'} = C4::Biblio::SplitSubtitle($issue->{'subtitle'});
+
         # check if item is renewable
         my ($status,$renewerror) = CanBookBeRenewed( $borrowernumber, $issue->{'itemnumber'} );
         ($issue->{'renewcount'},$issue->{'renewsallowed'},$issue->{'renewsleft'}) = GetRenewCount($borrowernumber, $issue->{'itemnumber'});
@@ -258,6 +254,11 @@ if ( $pending_checkouts->count ) { # Useless test
 
         my $isbn = GetNormalizedISBN($issue->{'isbn'});
         $issue->{normalized_isbn} = $isbn;
+        my $marcrecord = GetMarcBiblio({
+            biblionumber => $issue->{'biblionumber'},
+            embed_items  => 1,
+            opac         => 1,
+            borcat       => $borcat });
         $issue->{normalized_upc} = GetNormalizedUPC( $marcrecord, C4::Context->preference('marcflavour') );
 
                 # My Summary HTML
index 9a1b3a5..8aecac1 100755 (executable)
@@ -23,7 +23,7 @@ use CGI;
 use JSON qw(to_json);
 
 use C4::Auth qw(check_cookie_auth haspermission get_session);
-use C4::Biblio qw(GetMarcBiblio GetFrameworkCode GetRecordValue );
+use C4::Biblio qw(SplitSubtitle);
 use C4::Circulation qw(GetIssuingCharges CanBookBeRenewed GetRenewCount GetSoonestRenewDate);
 use C4::Overdues qw(GetFine);
 use C4::Context;
@@ -74,6 +74,10 @@ my $sql = '
 
         biblionumber,
         biblio.title,
+        biblio.subtitle,
+        biblio.medium,
+        biblio.part_number,
+        biblio.part_name,
         author,
 
         itemnumber,
@@ -174,6 +178,10 @@ while ( my $c = $sth->fetchrow_hashref() ) {
     my $checkout = {
         DT_RowId             => $c->{itemnumber} . '-' . $c->{borrowernumber},
         title                => $c->{title},
+        subtitle             => C4::Biblio::SplitSubtitle($c->{'subtitle'}),
+        medium               => $c->{medium} // '',
+        part_number          => $c->{part_number} // '',
+        part_name            => $c->{part_name} // '',
         author               => $c->{author},
         barcode              => $c->{barcode},
         itemtype             => $item_level_itypes ? $c->{itype} : $c->{itemtype},
@@ -216,10 +224,6 @@ while ( my $c = $sth->fetchrow_hashref() ) {
                 as_due_date => 1
             }
         ),
-        subtitle => GetRecordValue(
-            'subtitle',
-            GetMarcBiblio({ biblionumber => $c->{biblionumber} }),
-            GetFrameworkCode( $c->{biblionumber} ) ),
         lost    => $lost,
         damaged => $damaged,
         borrower => {
index 062109d..8b9a27b 100755 (executable)
--- a/svc/holds
+++ b/svc/holds
@@ -23,7 +23,7 @@ use CGI;
 use JSON qw(to_json);
 
 use C4::Auth qw(check_cookie_auth);
-use C4::Biblio qw(GetMarcBiblio GetFrameworkCode GetRecordValue );
+use C4::Biblio qw(SplitSubtitle);
 use C4::Charset;
 use C4::Circulation qw(GetTransfers);
 use C4::Context;
@@ -84,11 +84,17 @@ while ( my $h = $holds_rs->next() ) {
     for my $library ( @$libraries ) {
         $library->{selected} = 1 if $library->{branchcode} eq $h->branchcode();
     }
+
+    my $biblio = $h->biblio();
     my $hold = {
         DT_RowId       => $h->reserve_id(),
         biblionumber   => $biblionumber,
-        title          => $h->biblio()->title(),
-        author         => $h->biblio()->author(),
+        title          => $biblio->title(),
+        subtitle       => $biblio->subtitle() // '',
+        medium         => $biblio->medium() // '',
+        part_number    => $biblio->part_number() // '',
+        part_name      => $biblio->part_name() // '',
+        author         => $biblio->author(),
         reserve_id     => $h->reserve_id(),
         branchcode     => $h->branch()->branchname(),
         branches       => $libraries,
@@ -102,11 +108,6 @@ while ( my $h = $holds_rs->next() ) {
         waiting_here   => $h->branch()->branchcode() eq $branch,
         priority       => $h->priority(),
         itemtype_limit => $itemtype_limit,
-        subtitle       => GetRecordValue(
-            'subtitle',
-            GetMarcBiblio({ biblionumber => $biblionumber }),
-            GetFrameworkCode($biblionumber)
-        ),
         reservedate_formatted => $h->reservedate() ? output_pref(
             { dt => dt_from_string( $h->reservedate() ), dateonly => 1 }
           )
index da34dca..4400017 100755 (executable)
@@ -51,7 +51,7 @@ warning_is { $ret = BiblioAutoLink(undef, q{}) }
 
 is( $ret, 0, 'BiblioAutoLink returns zero if not passed rec');
 
-warning_is { $ret = GetRecordValue('100', undef, q{}) }
+warning_is { $ret = GetRecordValue('100', undef) }
            { carped => 'GetRecordValue called with undefined record'},
            "GetRecordValue returns carped warning on undef record";
 
index 3cb0cb0..21354eb 100644 (file)
@@ -52,4 +52,20 @@ sub _koha_marc_update_bib_ids_control {
     is($r->field('004')->data(), 20, 'Biblioitemnumber to control field');
 }
 
+subtest 'SplitSubtitle' => sub {
+    plan tests => 4;
+
+    my $res = C4::Biblio::SplitSubtitle(undef);
+    is_deeply($res, [], 'undef returned as an array');
+
+    $res = C4::Biblio::SplitSubtitle('');
+    is_deeply($res, [], 'Empty string returned as an array');
+
+    $res = C4::Biblio::SplitSubtitle('Single');
+    is_deeply($res, [{'subfield' => 'Single'}], 'Single subtitle returns an array');
+
+    $res = C4::Biblio::SplitSubtitle('First | Second');
+    is_deeply($res, [{'subfield' => 'First'}, {'subfield' => 'Second'}], 'Two subtitles returns an array');
+};
+
 done_testing();
index 8623278..6f39da5 100755 (executable)
@@ -61,10 +61,7 @@ else {
         my $taglist = get_tag_rows( { term => $tag } );
         for ( @{$taglist} ) {
             my $dat    = &GetBiblioData( $_->{biblionumber} );
-            my $record = &GetMarcBiblio({ biblionumber => $_->{biblionumber} });
-            $dat->{'subtitle'} =
-              GetRecordValue( 'subtitle', $record,
-                GetFrameworkCode( $_->{biblionumber} ) );
+            $dat->{'subtitle'} = C4::Biblio::SplitSubtitles($dat->{'subtitle'}),
             my @items = GetItemsInfo( $_->{biblionumber} );
             $dat->{biblionumber} = $_->{biblionumber};
             $dat->{tag_id}       = $_->{tag_id};
index 34c6b5a..9eba735 100755 (executable)
@@ -94,7 +94,7 @@ if ( $op eq 'form' ) {
             my $holds_count = $biblio->holds->count;
             $biblio = $biblio->unblessed;
             my $record = &GetMarcBiblio({ biblionumber => $record_id });
-            $biblio->{subtitle} = GetRecordValue( 'subtitle', $record, GetFrameworkCode( $record_id ) );
+            $biblio->{subtitle} = C4::Biblio::SplitSubtitle( $biblio->{subtitle} );
             $biblio->{itemnumbers} = [Koha::Items->search({ biblionumber => $record_id })->get_column('itemnumber')];
             $biblio->{holds_count} = $holds_count;
             $biblio->{issues_count} = C4::Biblio::CountItemsIssued( $record_id );
index 3c077ef..c8d3cab 100755 (executable)
@@ -77,14 +77,13 @@ if ($email) {
 
     while ( my $content = $contents->next ) {
         my $biblionumber     = $content->biblionumber;
-        my $fw               = GetFrameworkCode($biblionumber);
         my $dat              = GetBiblioData($biblionumber);
         my $record           = GetMarcBiblio({
             biblionumber => $biblionumber,
             embed_items  => 1 });
         my $marcauthorsarray = GetMarcAuthors( $record, $marcflavour );
         my $marcsubjctsarray = GetMarcSubjects( $record, $marcflavour );
-        my $subtitle         = GetRecordValue( 'subtitle', $record, $fw );
+        my $subtitle         = GetRecordValue( 'subtitle', $record );
 
         my @items = GetItemsInfo($biblionumber);
 
index 5fddf37..49e7d5c 100755 (executable)
@@ -280,7 +280,7 @@ if ( $op eq 'view' ) {
                 $this_item->{description}       = $itemtype ? $itemtype->description : q{}; #FIXME Should this be translated_description ?
                 $this_item->{notforloan}        = $itemtype->notforloan if $itemtype;
                 $this_item->{'coins'}           = $biblio->get_coins;
-                $this_item->{'subtitle'}        = GetRecordValue( 'subtitle', $record, GetFrameworkCode( $biblionumber ) );
+                $this_item->{'subtitle'}        = GetRecordValue( 'subtitle', $record );
                 $this_item->{'normalized_upc'}  = GetNormalizedUPC( $record, $marcflavour );
                 $this_item->{'normalized_ean'}  = GetNormalizedEAN( $record, $marcflavour );
                 $this_item->{'normalized_oclc'} = GetNormalizedOCLCNumber( $record, $marcflavour );