Fix for Bug 3459, topissues doesn't take care of ccode
[koha_gimpoz] / opac / opac-MARCdetail.pl
index 1710b23..1a9dc34 100755 (executable)
@@ -13,9 +13,9 @@
 # WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
 # A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
 #
 # WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
 # A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
 #
-# You should have received a copy of the GNU General Public License along with
-# Koha; if not, write to the Free Software Foundation, Inc., 59 Temple Place,
-# Suite 330, Boston, MA  02111-1307 USA
+# You should have received a copy of the GNU General Public License along
+# with Koha; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 
 =head1 NAME
 
 
 =head1 NAME
 
@@ -23,11 +23,11 @@ MARCdetail.pl : script to show a biblio in MARC format
 
 =head1 SYNOPSIS
 
 
 =head1 SYNOPSIS
 
+=cut
 
 =head1 DESCRIPTION
 
 
 =head1 DESCRIPTION
 
-This script needs a biblionumber in bib parameter (bibnumber
-from koha style DB.  Automaticaly maps to marc biblionumber).
+This script needs a biblionumber as  parameter
 
 It shows the biblio in a (nice) MARC format depending on MARC
 parameters tables.
 
 It shows the biblio in a (nice) MARC format depending on MARC
 parameters tables.
@@ -38,186 +38,251 @@ this template must be divided into 11 "tabs".
 The first 10 tabs present the biblio, the 11th one presents
 the items attached to the biblio
 
 The first 10 tabs present the biblio, the 11th one presents
 the items attached to the biblio
 
-=head1 FUNCTIONS
-
-=over 2
-
 =cut
 
 =cut
 
-
 use strict;
 use strict;
-require Exporter;
+use warnings;
+
 use C4::Auth;
 use C4::Context;
 use C4::Output;
 use C4::Auth;
 use C4::Context;
 use C4::Output;
-use C4::Interface::CGI::Output;
 use CGI;
 use CGI;
-use C4::Search;
 use MARC::Record;
 use C4::Biblio;
 use C4::Acquisition;
 use MARC::Record;
 use C4::Biblio;
 use C4::Acquisition;
-use HTML::Template;
+use C4::Koha;
 
 
-my $query=new CGI;
+my $query = new CGI;
 
 
-my $dbh=C4::Context->dbh;
+my $dbh = C4::Context->dbh;
 
 
-my $biblionumber=$query->param('bib');
-my $bibid = $query->param('bibid');
-$bibid = &MARCfind_MARCbibid_from_oldbiblionumber($dbh,$biblionumber) unless $bibid;
-$biblionumber = &MARCfind_oldbiblionumber_from_MARCbibid($dbh,$bibid) unless $biblionumber;
-my $itemtype = &MARCfind_frameworkcode($dbh,$bibid);
-my $tagslib = &MARCgettagslib($dbh,0,$itemtype);
-
-my $record =MARCgetbiblio($dbh,$bibid);
+my $biblionumber = $query->param('biblionumber');
+my $itemtype     = &GetFrameworkCode($biblionumber);
+my $tagslib      = &GetMarcStructure( 0, $itemtype );
+my $biblio = GetBiblioData($biblionumber);
+my $record = GetMarcBiblio($biblionumber);
+if ( ! $record ) {
+    print $query->redirect("/cgi-bin/koha/errors/404.pl");
+    exit;
+}
 # open template
 # open template
-my ($template, $loggedinuser, $cookie)
-               = get_template_and_user({template_name => "opac-MARCdetail.tmpl",
-                            query => $query,
-                            type => "opac",
-                            authnotrequired => 1,
-                            debug => 1,
-                            });
-$template->param(LibraryName => C4::Context->preference("LibraryName"),
-                               suggestion => C4::Context->preference("suggestion"),
-                               virtualshelves => C4::Context->preference("virtualshelves"),
+my ( $template, $loggedinuser, $cookie ) = get_template_and_user(
+    {
+        template_name   => "opac-MARCdetail.tmpl",
+        query           => $query,
+        type            => "opac",
+        authnotrequired => 1,
+        debug           => 1,
+    }
+);
+
+$template->param(
+    bibliotitle => $biblio->{title},
 );
 
 );
 
+$template->param( 'AllowOnShelfHolds' => C4::Context->preference('AllowOnShelfHolds') );
+$template->param( 'ItemsIssued' => CountItemsIssued( $biblionumber ) );
+
+# adding the $RequestOnOpac param
+my $RequestOnOpac;
+if (C4::Context->preference("RequestOnOpac")) {
+       $RequestOnOpac = 1;
+}
+
 # fill arrays
 # fill arrays
-my @loop_data =();
+my @loop_data = ();
 my $tag;
 my $tag;
+
 # loop through each tab 0 through 9
 # loop through each tab 0 through 9
-for (my $tabloop = 0; $tabloop<=10;$tabloop++) {
-# loop through each tag
-       my @fields = $record->fields();
-       my @loop_data =();
-#      foreach my $field (@fields) {
-       my @subfields_data;
-       for (my $x_i=0;$x_i<=$#fields;$x_i++) {
-#              warn "$tabloop => $x_i";
-               # if tag <10, there's no subfield, use the "@" trick
-               if ($fields[$x_i]->tag()<10) {
-                       next if ($tagslib->{$fields[$x_i]->tag()}->{'@'}->{tab}  ne $tabloop);
-                       next if ($tagslib->{$fields[$x_i]->tag()}->{'@'}->{hidden});
-                       my %subfield_data;
-                       $subfield_data{marc_lib}=$tagslib->{$fields[$x_i]->tag()}->{'@'}->{lib};
-                       $subfield_data{marc_value}=$fields[$x_i]->data();
-                       $subfield_data{marc_subfield}='@';
-                       $subfield_data{marc_tag}=$fields[$x_i]->tag();
-                       push(@subfields_data, \%subfield_data);
-               } else {
-                       my @subf=$fields[$x_i]->subfields;
-       # loop through each subfield
-                       for my $i (0..$#subf) {
-                               $subf[$i][0] = "@" unless $subf[$i][0];
-                               next if ($tagslib->{$fields[$x_i]->tag()}->{$subf[$i][0]}->{tab}  ne $tabloop);
-                               next if ($tagslib->{$fields[$x_i]->tag()}->{$subf[$i][0]}->{hidden});
-                               my %subfield_data;
-                               $subfield_data{marc_lib}=$tagslib->{$fields[$x_i]->tag()}->{$subf[$i][0]}->{lib};
-                               $subfield_data{link}=$tagslib->{$fields[$x_i]->tag()}->{$subf[$i][0]}->{link};
-                               if ($tagslib->{$fields[$x_i]->tag()}->{$subf[$i][0]}->{isurl}) {
-                                       $subfield_data{marc_value}="<a href=\"$subf[$i][1]\">$subf[$i][1]</a>";
-                               } else {
-                                       if ($tagslib->{$fields[$x_i]->tag()}->{$subf[$i][0]}->{authtypecode}) {
-                                               $subfield_data{authority}=$fields[$x_i]->subfield(9);
-                                       }
-                                       $subfield_data{marc_value}=get_authorised_value_desc($fields[$x_i]->tag(), $subf[$i][0], $subf[$i][1], '', $dbh);
-                               }
-                               $subfield_data{marc_subfield}=$subf[$i][0];
-                               $subfield_data{marc_tag}=$fields[$x_i]->tag();
-                               push(@subfields_data, \%subfield_data);
-                       }
-               }
-               if ($#subfields_data>=0) {
-                       my %tag_data;
-                       if ($fields[$x_i]->tag() eq $fields[$x_i-1]->tag()) {
-                               $tag_data{tag}="";
-                       } else {
-                               $tag_data{tag}=$fields[$x_i]->tag().' -'. $tagslib->{$fields[$x_i]->tag()}->{lib};
-                       }
-                       my @tmp = @subfields_data;
-                       $tag_data{subfield} = \@tmp;
-                       push (@loop_data, \%tag_data);
-                       undef @subfields_data;
-               }
-       }
-       $template->param($tabloop."XX" =>\@loop_data);
+for ( my $tabloop = 0 ; $tabloop <= 10 ; $tabloop++ ) {
+
+    # loop through each tag
+    my @loop_data = ();
+    my @subfields_data;
+
+    # deal with leader
+    unless ( $tagslib->{'000'}->{'@'}->{tab} ne $tabloop
+        or $tagslib->{'000'}->{'@'}->{hidden} > 0 )
+    {
+        my %subfield_data;
+        $subfield_data{marc_lib}      = $tagslib->{'000'}->{'@'}->{lib};
+        $subfield_data{marc_value}    = $record->leader();
+        $subfield_data{marc_subfield} = '@';
+        $subfield_data{marc_tag}      = '000';
+        push( @subfields_data, \%subfield_data );
+        my %tag_data;
+        $tag_data{tag} = '000 -' . $tagslib->{'000'}->{lib};
+        my @tmp = @subfields_data;
+        $tag_data{subfield} = \@tmp;
+        push( @loop_data, \%tag_data );
+        undef @subfields_data;
+    }
+    my @fields = $record->fields();
+    for ( my $x_i = 0 ; $x_i <= $#fields ; $x_i++ ) {
+
+        # if tag <10, there's no subfield, use the "@" trick
+        if ( $fields[$x_i]->tag() < 10 ) {
+            next
+              if (
+                $tagslib->{ $fields[$x_i]->tag() }->{'@'}->{tab} ne $tabloop );
+            next if ( $tagslib->{ $fields[$x_i]->tag() }->{'@'}->{hidden} > 0 );
+            my %subfield_data;
+            $subfield_data{marc_lib} =
+              $tagslib->{ $fields[$x_i]->tag() }->{'@'}->{lib};
+            $subfield_data{marc_value}    = $fields[$x_i]->data();
+            $subfield_data{marc_subfield} = '@';
+            $subfield_data{marc_tag}      = $fields[$x_i]->tag();
+            push( @subfields_data, \%subfield_data );
+        }
+        else {
+            my @subf = $fields[$x_i]->subfields;
+            my $previous = '';
+            # loop through each subfield
+            for my $i ( 0 .. $#subf ) {
+                $subf[$i][0] = "@" unless $subf[$i][0];
+                my $sf_def = $tagslib->{ $fields[$x_i]->tag() }->{ $subf[$i][0] };
+                next if ( $sf_def->{tab} ne $tabloop );
+                next if ( $sf_def->{hidden} > 0 ); 
+                my %subfield_data;
+                $subfield_data{marc_lib} = ($sf_def->{lib} eq $previous) ?  '--' : $sf_def->{lib};
+                $previous = $sf_def->{lib};
+                $subfield_data{link} = $sf_def->{link};
+                $subf[$i][1] =~ s/\n/<br\/>/g;
+                if ( $sf_def->{isurl} ) {
+                    $subfield_data{marc_value} = "<a href=\"$subf[$i][1]\">$subf[$i][1]</a>";
+                }
+                elsif ( defined($sf_def->{kohafield}) && $sf_def->{kohafield} eq "biblioitems.isbn" ) {
+                    $subfield_data{marc_value} = $subf[$i][1];
+                }
+                else {
+                    if ( $sf_def->{authtypecode} ) {
+                        $subfield_data{authority} = $fields[$x_i]->subfield(9);
+                    }
+                    $subfield_data{marc_value} = GetAuthorisedValueDesc( $fields[$x_i]->tag(),
+                        $subf[$i][0], $subf[$i][1], '', $tagslib, '', 'opac' );
+                }
+                $subfield_data{marc_subfield} = $subf[$i][0];
+                $subfield_data{marc_tag}      = $fields[$x_i]->tag();
+                push( @subfields_data, \%subfield_data );
+            }
+        }
+        if ( $#subfields_data >= 0 ) {
+            my %tag_data;
+            if (   ( $fields[$x_i]->tag() eq $fields[ $x_i - 1 ]->tag() )
+                && ( C4::Context->preference('LabelMARCView') eq 'economical' )
+              )
+            {
+                $tag_data{tag} = "";
+            }
+            else {
+                if ( C4::Context->preference('hide_marc') ) {
+                    $tag_data{tag} = $tagslib->{ $fields[$x_i]->tag() }->{lib};
+                }
+                else {
+                    $tag_data{tag} =
+                        $fields[$x_i]->tag() 
+                      . ' '
+                      . C4::Koha::display_marc_indicators($fields[$x_i])
+                      . ' - '
+                      . $tagslib->{ $fields[$x_i]->tag() }->{lib};
+                }
+            }
+            my @tmp = @subfields_data;
+            $tag_data{subfield} = \@tmp;
+            push( @loop_data, \%tag_data );
+            undef @subfields_data;
+        }
+    }
+    $template->param( $tabloop . "XX" => \@loop_data );
 }
 }
+
+
 # now, build item tab !
 # the main difference is that datas are in lines and not in columns : thus, we build the <th> first, then the values...
 # loop through each tag
 # warning : we may have differents number of columns in each row. Thus, we first build a hash, complete it if necessary
 # then construct template.
 my @fields = $record->fields();
 # now, build item tab !
 # the main difference is that datas are in lines and not in columns : thus, we build the <th> first, then the values...
 # loop through each tag
 # warning : we may have differents number of columns in each row. Thus, we first build a hash, complete it if necessary
 # then construct template.
 my @fields = $record->fields();
-my %witness; #---- stores the list of subfields used at least once, with the "meaning" of the code
+my %witness
+  ; #---- stores the list of subfields used at least once, with the "meaning" of the code
 my @big_array;
 foreach my $field (@fields) {
 my @big_array;
 foreach my $field (@fields) {
-       next if ($field->tag()<10);
-       my @subf=$field->subfields;
-       my %this_row;
-# loop through each subfield
-       for my $i (0..$#subf) {
-               next if ($tagslib->{$field->tag()}->{$subf[$i][0]}->{tab}  ne 10);
-               $witness{$subf[$i][0]} = $tagslib->{$field->tag()}->{$subf[$i][0]}->{lib};
-               $this_row{$subf[$i][0]} =$subf[$i][1];
-       }
-       if (%this_row) {
-               push(@big_array, \%this_row);
-       }
+    next if ( $field->tag() < 10 );
+    my @subf = $field->subfields;
+    my %this_row;
+
+    # loop through each subfield
+    for my $i ( 0 .. $#subf ) {
+        my $sf_def = $tagslib->{ $field->tag() }->{ $subf[$i][0] };
+        next if ( $sf_def->{tab} ne 10 );
+               next if ( $sf_def->{hidden} > 0 );
+        $witness{ $subf[$i][0] } = $sf_def->{lib};
+
+        if ( $sf_def->{isurl} ) {
+            $this_row{ $subf[$i][0] } = "<a href=\"$subf[$i][1]\">$subf[$i][1]</a>";
+        }
+        elsif ( $sf_def->{kohafield} eq "biblioitems.isbn" ) {
+            $this_row{ $subf[$i][0] } = $subf[$i][1];
+        }
+        else {
+            $this_row{ $subf[$i][0] } = GetAuthorisedValueDesc( $field->tag(), $subf[$i][0],
+                $subf[$i][1], '', $tagslib, '', 'opac' );
+        }
+    }
+    if (%this_row) {
+        push( @big_array, \%this_row );
+    }
 }
 }
+my ( $holdingbrtagf, $holdingbrtagsubf ) =
+  &GetMarcFromKohaField( "items.holdingbranch", $itemtype );
+@big_array =
+  sort { $a->{$holdingbrtagsubf} cmp $b->{$holdingbrtagsubf} } @big_array;
+
 #fill big_row with missing datas
 #fill big_row with missing datas
-foreach my $subfield_code  (keys(%witness)) {
-       for (my $i=0;$i<=$#big_array;$i++) {
-               $big_array[$i]{$subfield_code}="&nbsp;" unless ($big_array[$i]{$subfield_code});
-       }
+foreach my $subfield_code ( keys(%witness) ) {
+    for ( my $i = 0 ; $i <= $#big_array ; $i++ ) {
+        $big_array[$i]{$subfield_code} = "&nbsp;"
+          unless ( $big_array[$i]{$subfield_code} );
+    }
 }
 }
+
 # now, construct template !
 my @item_value_loop;
 my @header_value_loop;
 # now, construct template !
 my @item_value_loop;
 my @header_value_loop;
-for (my $i=0;$i<=$#big_array; $i++) {
-       my $items_data;
-       foreach my $subfield_code (keys(%witness)) {
-               $items_data .="<td>".$big_array[$i]{$subfield_code}."</td>";
-       }
-       my %row_data;
-       $row_data{item_value} = $items_data;
-       push(@item_value_loop,\%row_data);
-}
-foreach my $subfield_code (keys(%witness)) {
-       my %header_value;
-       $header_value{header_value} = $witness{$subfield_code};
-       push(@header_value_loop, \%header_value);
+for ( my $i = 0 ; $i <= $#big_array ; $i++ ) {
+    my $items_data;
+    foreach my $subfield_code ( keys(%witness) ) {
+        $items_data .= "<td>" . $big_array[$i]{$subfield_code} . "</td>";
+    }
+    my %row_data;
+    $row_data{item_value} = $items_data;
+    push( @item_value_loop, \%row_data );
 }
 
 }
 
-$template->param(item_loop => \@item_value_loop,
-                                               item_header_loop => \@header_value_loop,
-                                               biblionumber => $biblionumber,
-                                               bibid => $bibid,
-                                               biblionumber => $biblionumber);
-output_html_with_http_headers $query, $cookie, $template->output;
+foreach my $subfield_code ( keys(%witness) ) {
+    my %header_value;
+    $header_value{header_value} = $witness{$subfield_code};
+    push( @header_value_loop, \%header_value );
+}
 
 
-sub get_authorised_value_desc ($$$$$) {
-   my($tag, $subfield, $value, $framework, $dbh) = @_;
+if(C4::Context->preference("ISBD")) {
+       $template->param(ISBD => 1);
+}
 
 
-   #---- branch
-    if ($tagslib->{$tag}->{$subfield}->{'authorised_value'} eq "branches" ) {
-       return getbranchname($value);
-    }
+#Search for title in links
+if (my $search_for_title = C4::Context->preference('OPACSearchForTitleIn')){
+    $biblio->{author} ? $search_for_title =~ s/{AUTHOR}/$biblio->{author}/g : $search_for_title =~ s/{AUTHOR}//g;
+    $biblio->{title} =~ s/\/+$//; # remove trailing slash
+    $biblio->{title} =~ s/\s+$//; # remove trailing space
+    $biblio->{title} ? $search_for_title =~ s/{TITLE}/$biblio->{title}/g : $search_for_title =~ s/{TITLE}//g;
+    $biblio->{isbn} ? $search_for_title =~ s/{ISBN}/$biblio->{isbn}/g : $search_for_title =~ s/{ISBN}//g;
+ $template->param('OPACSearchForTitleIn' => $search_for_title);
+}
 
 
-   #---- itemtypes
-   if ($tagslib->{$tag}->{$subfield}->{'authorised_value'} eq "itemtypes" ) {
-       return ItemType($value);
-    }
+$template->param(
+    item_loop        => \@item_value_loop,
+    item_header_loop => \@header_value_loop,
+    biblionumber     => $biblionumber,
+);
 
 
-   #---- "true" authorized value
-   my $category = $tagslib->{$tag}->{$subfield}->{'authorised_value'};
-
-   if ($category ne "") {
-       my $sth = $dbh->prepare("select lib from authorised_values where category = ? and authorised_value = ?");
-       $sth->execute($category, $value);
-       my $data = $sth->fetchrow_hashref;
-       return $data->{'lib'};
-   } else {
-       return $value; # if nothing is found return the original value
-   }
-}
+output_html_with_http_headers $query, $cookie, $template->output;