X-Git-Url: http://koha-dev.rot13.org:8081/gitweb/?a=blobdiff_plain;f=catalogue%2Fdetail.pl;h=4db82fc8364d1f3509fddaf013c930ac99b77db0;hb=34977ae300cc54bc15e2bbeceee36a385ce4d108;hp=967d71dd32d06c1419f35b3c46b634ddf1aa3e53;hpb=afd2418d7387dc2a50835128e24840686600ef4b;p=koha_ffzg diff --git a/catalogue/detail.pl b/catalogue/detail.pl index 967d71dd32..4db82fc836 100755 --- a/catalogue/detail.pl +++ b/catalogue/detail.pl @@ -2,48 +2,51 @@ # This file is part of Koha. # -# Koha is free software; you can redistribute it and/or modify it under the -# terms of the GNU General Public License as published by the Free Software -# Foundation; either version 2 of the License, or (at your option) any later -# version. +# Koha is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. # -# Koha is distributed in the hope that it will be useful, but WITHOUT ANY -# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR -# A PARTICULAR PURPOSE. See the GNU General Public License for more details. +# Koha is distributed in the hope that it will be useful, but +# WITHOUT ANY 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, see . -use strict; -use warnings; +use Modern::Perl; -use CGI; -use C4::Acquisition qw( GetHistory ); +use CGI qw ( -utf8 ); +use HTML::Entities; use C4::Auth; -use C4::Dates qw/format_date/; +use C4::Context; use C4::Koha; use C4::Serials; #uses getsubscriptionfrom biblionumber use C4::Output; use C4::Biblio; use C4::Items; use C4::Circulation; -use C4::Branch; use C4::Reserves; -use C4::Members; # to use GetMember use C4::Serials; -use C4::XISBN qw(get_xisbns get_biblionumber_from_isbn); +use C4::XISBN qw(get_xisbns); use C4::External::Amazon; -use C4::Search; # enabled_staff_search_views +use C4::Search; # enabled_staff_search_views use C4::Tags qw(get_tags); -use C4::VirtualShelves; use C4::XSLT; use C4::Images; use Koha::DateUtils; use C4::HTML5Media; use C4::CourseReserves qw(GetItemCourseReservesInfo); use C4::Acquisition qw(GetOrdersByBiblionumber); +use Koha::AuthorisedValues; +use Koha::Biblios; +use Koha::Items; +use Koha::ItemTypes; +use Koha::Patrons; +use Koha::Virtualshelves; +use Koha::Plugins; my $query = CGI->new(); @@ -59,8 +62,21 @@ my ( $template, $borrowernumber, $cookie, $flags ) = get_template_and_user( } ); +# Determine if we should be offering any enhancement plugin buttons +if ( C4::Context->preference('UseKohaPlugins') && + C4::Context->config('enable_plugins') ) { + # Only pass plugins that can offer a toolbar button + my @plugins = Koha::Plugins->new()->GetPlugins({ + method => 'intranet_catalog_biblio_enhancements_toolbar_button' + }); + $template->param( + plugins => \@plugins + ); +} + my $biblionumber = $query->param('biblionumber'); -my $record = GetMarcBiblio($biblionumber); +$biblionumber = HTML::Entities::encode($biblionumber); +my $record = GetMarcBiblio({ biblionumber => $biblionumber }); if ( not defined $record ) { # biblionumber invalid -> report and exit @@ -71,12 +87,13 @@ if ( not defined $record ) { } if($query->cookie("holdfor")){ - my $holdfor_patron = GetMember('borrowernumber' => $query->cookie("holdfor")); + my $holdfor_patron = Koha::Patrons->find( $query->cookie("holdfor") ); $template->param( + # FIXME Should pass the patron object holdfor => $query->cookie("holdfor"), - holdfor_surname => $holdfor_patron->{'surname'}, - holdfor_firstname => $holdfor_patron->{'firstname'}, - holdfor_cardnumber => $holdfor_patron->{'cardnumber'}, + holdfor_surname => $holdfor_patron->surname, + holdfor_firstname => $holdfor_patron->firstname, + holdfor_cardnumber => $holdfor_patron->cardnumber, ); } @@ -85,9 +102,18 @@ my $showallitems = $query->param('showallitems'); my $marcflavour = C4::Context->preference("marcflavour"); # XSLT processing of some stuff -if (C4::Context->preference("XSLTDetailsDisplay") ) { - $template->param('XSLTDetailsDisplay' =>'1', - 'XSLTBloc' => XSLTParse4Display($biblionumber, $record, "XSLTDetailsDisplay") ); +my $xslfile = C4::Context->preference('XSLTDetailsDisplay'); +my $lang = $xslfile ? C4::Languages::getlanguage() : undef; +my $sysxml = $xslfile ? C4::XSLT::get_xslt_sysprefs() : undef; + +if ( $xslfile ) { + $template->param( + XSLTDetailsDisplay => '1', + XSLTBloc => XSLTParse4Display( + $biblionumber, $record, "XSLTDetailsDisplay", + 1, undef, $sysxml, $xslfile, $lang + ) + ); } $template->param( 'SpineLabelShowPrintOnBibDetails' => C4::Context->preference("SpineLabelShowPrintOnBibDetails") ); @@ -117,15 +143,26 @@ my $marcurlsarray = GetMarcUrls ($record,$marcflavour); my $marchostsarray = GetMarcHosts($record,$marcflavour); my $subtitle = GetRecordValue('subtitle', $record, $fw); -# Get Branches, Itemtypes and Locations -my $branches = GetBranches(); -my $itemtypes = GetItemTypes(); +# FFZG +my $partnum = GetRecordValue('partnum', $record, $fw); +my $partname = GetRecordValue('partname', $record, $fw); +my $medium = GetRecordValue('medium', $record, $fw); +my $responsibility = GetRecordValue('responsibility', $record, $fw); +my $impressum = GetRecordValue('impressum', $record, $fw); +my $oldcall = GetRecordValue('oldcall', $record, $fw); +my $udc = GetRecordValue('udc', $record, $fw); +my $textholding = GetRecordValue('textholding', $record, $fw); +# /FFZG + +my $itemtypes = { map { $_->{itemtype} => $_ } @{ Koha::ItemTypes->search->unblessed } }; + my $dbh = C4::Context->dbh; my @all_items = GetItemsInfo( $biblionumber ); my @items; +my $patron = Koha::Patrons->find( $borrowernumber ); for my $itm (@all_items) { - push @items, $itm unless ( $itm->{itemlost} && GetHideLostItemsPreference($borrowernumber) && !$showallitems); + push @items, $itm unless ( $itm->{itemlost} && $patron->category->hidelostitems && !$showallitems); } # flag indicating existence of at least one item linked via a host record @@ -133,33 +170,33 @@ my $hostrecords; # adding items linked via host biblios my @hostitems = GetHostItemsInfo($record); if (@hostitems){ - $hostrecords =1; - push (@items,@hostitems); + $hostrecords =1; + push (@items,@hostitems); } my $dat = &GetBiblioData($biblionumber); #coping with subscriptions my $subscriptionsnumber = CountSubscriptionFromBiblionumber($biblionumber); -my @subscriptions = GetSubscriptions( $dat->{title}, $dat->{issn}, undef, $biblionumber ); +my @subscriptions = SearchSubscriptions({ biblionumber => $biblionumber, orderby => 'title' }); my @subs; foreach my $subscription (@subscriptions) { my %cell; - my $serials_to_display; + my $serials_to_display; $cell{subscriptionid} = $subscription->{subscriptionid}; $cell{subscriptionnotes} = $subscription->{internalnotes}; $cell{missinglist} = $subscription->{missinglist}; $cell{librariannote} = $subscription->{librariannote}; $cell{branchcode} = $subscription->{branchcode}; - $cell{branchname} = GetBranchName($subscription->{branchcode}); $cell{hasalert} = $subscription->{hasalert}; $cell{callnumber} = $subscription->{callnumber}; + $cell{location} = $subscription->{location}; $cell{closed} = $subscription->{closed}; #get the three latest serials. - $serials_to_display = $subscription->{staffdisplaycount}; - $serials_to_display = C4::Context->preference('StaffSerialIssueDisplayCount') unless $serials_to_display; - $cell{staffdisplaycount} = $serials_to_display; + $serials_to_display = $subscription->{staffdisplaycount}; + $serials_to_display = C4::Context->preference('StaffSerialIssueDisplayCount') unless $serials_to_display; + $cell{staffdisplaycount} = $serials_to_display; $cell{latestserials} = GetLatestSerials( $subscription->{subscriptionid}, $serials_to_display ); push @subs, \%cell; @@ -168,7 +205,14 @@ foreach my $subscription (@subscriptions) { # Get acquisition details if ( C4::Context->preference('AcquisitionDetails') ) { - my ( $orders, $qty, $price, $received ) = C4::Acquisition::GetHistory( biblionumber => $biblionumber, get_canceled_order => 1 ); + my $orders = Koha::Acquisition::Orders->search( + { biblionumber => $biblionumber }, + { + join => 'basketno', + order_by => 'basketno.booksellerid' + } + ); # GetHistory sorted by aqbooksellerid, but does it make sense? + $template->param( orders => $orders, ); @@ -182,13 +226,38 @@ $dat->{'count'} = scalar @all_items + @hostitems; $dat->{'showncount'} = scalar @items + @hostitems; $dat->{'hiddencount'} = scalar @all_items + @hostitems - scalar @items; -my $shelflocations = GetKohaAuthorisedValues('items.location', $fw); -my $collections = GetKohaAuthorisedValues('items.ccode' , $fw); -my $copynumbers = GetKohaAuthorisedValues('items.copynumber', $fw); +my $shelflocations = + { map { $_->{authorised_value} => $_->{lib} } Koha::AuthorisedValues->get_descriptions_by_koha_field( { frameworkcode => $fw, kohafield => 'items.location' } ) }; +my $collections = + { map { $_->{authorised_value} => $_->{lib} } Koha::AuthorisedValues->get_descriptions_by_koha_field( { frameworkcode => $fw, kohafield => 'items.ccode' } ) }; +my $copynumbers = + { map { $_->{authorised_value} => $_->{lib} } Koha::AuthorisedValues->get_descriptions_by_koha_field( { frameworkcode => $fw, kohafield => 'items.copynumber' } ) }; my (@itemloop, @otheritemloop, %itemfields); my $norequests = 1; -my $authvalcode_items_itemlost = GetAuthValCode('items.itemlost',$fw); -my $authvalcode_items_damaged = GetAuthValCode('items.damaged', $fw); + +my $mss = Koha::MarcSubfieldStructures->search({ frameworkcode => $fw, kohafield => 'items.itemlost', authorised_value => [ -and => {'!=' => undef }, {'!=' => ''}] }); +if ( $mss->count ) { + $template->param( itemlostloop => GetAuthorisedValues( $mss->next->authorised_value ) ); +} +$mss = Koha::MarcSubfieldStructures->search({ frameworkcode => $fw, kohafield => 'items.damaged', authorised_value => [ -and => {'!=' => undef }, {'!=' => ''}] }); +if ( $mss->count ) { + $template->param( itemdamagedloop => GetAuthorisedValues( $mss->next->authorised_value ) ); +} +$mss = Koha::MarcSubfieldStructures->search({ frameworkcode => $fw, kohafield => 'items.withdrawn', authorised_value => { not => undef } }); +if ( $mss->count ) { + $template->param( itemwithdrawnloop => GetAuthorisedValues( $mss->next->authorised_value) ); +} + +$mss = Koha::MarcSubfieldStructures->search({ frameworkcode => $fw, kohafield => 'items.materials', authorised_value => [ -and => {'!=' => undef }, {'!=' => ''}] }); +my %materials_map; +if ($mss->count) { + my $materials_authvals = GetAuthorisedValues($mss->next->authorised_value); + if ($materials_authvals) { + foreach my $value (@$materials_authvals) { + $materials_map{$value->{authorised_value}} = $value->{lib}; + } + } +} my $analytics_flag; my $materials_flag; # set this if the items have anything in the materials field @@ -199,7 +268,6 @@ if ($currentbranch and C4::Context->preference('SeparateHoldings')) { my $separatebranch = C4::Context->preference('SeparateHoldingsBranch') || 'homebranch'; foreach my $item (@items) { my $itembranchcode = $item->{$separatebranch}; - $item->{homebranch} = GetBranchName($item->{homebranch}); # can place holds defaults to yes $norequests = 0 unless ( ( $item->{'notforloan'} > 0 ) || ( $item->{'itemnotforloan'} > 0 ) ); @@ -207,15 +275,8 @@ foreach my $item (@items) { $item->{imageurl} = defined $item->{itype} ? getitemtypeimagelocation('intranet', $itemtypes->{ $item->{itype} }{imageurl}) : ''; - foreach (qw(datelastseen onloan)) { - $item->{$_} = format_date($item->{$_}); - } $item->{datedue} = format_sqldatetime($item->{datedue}); - # item damaged, lost, withdrawn loops - $item->{itemlostloop} = GetAuthorisedValues($authvalcode_items_itemlost, $item->{itemlost}) if $authvalcode_items_itemlost; - if ($item->{damaged}) { - $item->{itemdamagedloop} = GetAuthorisedValues($authvalcode_items_damaged, $item->{damaged}) if $authvalcode_items_damaged; - } + #get shelf location and collection code description if they are authorised value. # same thing for copy number my $shelfcode = $item->{'location'}; @@ -224,61 +285,80 @@ foreach my $item (@items) { $item->{'ccode'} = $collections->{$ccode} if ( defined( $ccode ) && defined($collections) && exists( $collections->{$ccode} ) ); my $copynumber = $item->{'copynumber'}; $item->{'copynumber'} = $copynumbers->{$copynumber} if ( defined($copynumber) && defined($copynumbers) && exists( $copynumbers->{$copynumber} ) ); - foreach (qw(ccode enumchron copynumber itemnotes uri)) { + foreach (qw(ccode enumchron copynumber stocknumber itemnotes itemnotes_nonpublic uri)) { $itemfields{$_} = 1 if ( $item->{$_} ); } # checking for holds - my ($reservedate,$reservedfor,$expectedAt,undef,$wait) = GetReservesFromItemnumber($item->{itemnumber}); - my $ItemBorrowerReserveInfo = GetMemberDetails( $reservedfor, 0); - - if (C4::Context->preference('HidePatronName')){ - $item->{'hidepatronname'} = 1; - } - - if ( defined $reservedate ) { + my $item_object = Koha::Items->find( $item->{itemnumber} ); + my $holds = $item_object->current_holds; + if ( my $first_hold = $holds->next ) { + my $patron = Koha::Patrons->find( $first_hold->borrowernumber ); $item->{backgroundcolor} = 'reserved'; - $item->{reservedate} = format_date($reservedate); - $item->{ReservedForBorrowernumber} = $reservedfor; - $item->{ReservedForSurname} = $ItemBorrowerReserveInfo->{'surname'}; - $item->{ReservedForFirstname} = $ItemBorrowerReserveInfo->{'firstname'}; - $item->{ExpectedAtLibrary} = $branches->{$expectedAt}{branchname}; - $item->{Reservedcardnumber} = $ItemBorrowerReserveInfo->{'cardnumber'}; + $item->{reservedate} = $first_hold->reservedate; + $item->{ReservedFor} = $patron, + $item->{ExpectedAtLibrary} = $first_hold->branchcode; # Check waiting status - $item->{waitingdate} = $wait; + $item->{waitingdate} = $first_hold->waitingdate; } + if ( my $checkout = $item_object->checkout ) { + $item->{CheckedOutFor} = $checkout->patron; + } - # Check the transit status + # Check the transit status my ( $transfertwhen, $transfertfrom, $transfertto ) = GetTransfers($item->{itemnumber}); if ( defined( $transfertwhen ) && ( $transfertwhen ne '' ) ) { - $item->{transfertwhen} = format_date($transfertwhen); - $item->{transfertfrom} = $branches->{$transfertfrom}{branchname}; - $item->{transfertto} = $branches->{$transfertto}{branchname}; + $item->{transfertwhen} = $transfertwhen; + $item->{transfertfrom} = $transfertfrom; + $item->{transfertto} = $transfertto; $item->{nocancel} = 1; } - # item has a host number if its biblio number does not match the current bib + foreach my $f (qw( itemnotes )) { + if ($item->{$f}) { + $item->{$f} =~ s|\n|
|g; + $itemfields{$f} = 1; + } + } + + #item has a host number if its biblio number does not match the current bib + if ($item->{biblionumber} ne $biblionumber){ $item->{hostbiblionumber} = $item->{biblionumber}; - $item->{hosttitle} = GetBiblioData($item->{biblionumber})->{title}; + $item->{hosttitle} = GetBiblioData($item->{biblionumber})->{title}; } - #count if item is used in analytical bibliorecords - my $countanalytics= GetAnalyticsCount($item->{itemnumber}); - if ($countanalytics > 0){ - $analytics_flag=1; - $item->{countanalytics} = $countanalytics; + + if ( $analyze ) { + # count if item is used in analytical bibliorecords + # The 'countanalytics' flag is only used in the templates if analyze is set + my $countanalytics = C4::Context->preference('EasyAnalyticalRecords') ? GetAnalyticsCount($item->{itemnumber}) : 0; + if ($countanalytics > 0){ + $analytics_flag=1; + $item->{countanalytics} = $countanalytics; + } } if (defined($item->{'materials'}) && $item->{'materials'} =~ /\S/){ - $materials_flag = 1; + $materials_flag = 1; + if (defined $materials_map{ $item->{materials} }) { + $item->{materials} = $materials_map{ $item->{materials} }; + } } if ( C4::Context->preference('UseCourseReserves') ) { $item->{'course_reserves'} = GetItemCourseReservesInfo( itemnumber => $item->{'itemnumber'} ); } + if ( C4::Context->preference('IndependentBranches') ) { + my $userenv = C4::Context->userenv(); + if ( not C4::Context->IsSuperLibrarian() + and $userenv->{branch} ne $item->{homebranch} ) { + $item->{cannot_be_edited} = 1; + } + } + if ($currentbranch and $currentbranch ne "NO_LIBRARY_SET" and C4::Context->preference('SeparateHoldings')) { if ($itembranchcode and $itembranchcode eq $currentbranch) { @@ -301,24 +381,36 @@ if (scalar(@itemloop) == 0 || scalar(@otheritemloop) == 0) { $template->param( norequests => $norequests ); $template->param( - MARCNOTES => $marcnotesarray, - MARCSUBJCTS => $marcsubjctsarray, - MARCAUTHORS => $marcauthorsarray, - MARCSERIES => $marcseriesarray, - MARCURLS => $marcurlsarray, + MARCNOTES => $marcnotesarray, + MARCSUBJCTS => $marcsubjctsarray, + MARCAUTHORS => $marcauthorsarray, + MARCSERIES => $marcseriesarray, + MARCURLS => $marcurlsarray, MARCISBNS => $marcisbnsarray, - MARCHOSTS => $marchostsarray, - subtitle => $subtitle, - itemdata_ccode => $itemfields{ccode}, - itemdata_enumchron => $itemfields{enumchron}, - itemdata_uri => $itemfields{uri}, - itemdata_copynumber => $itemfields{copynumber}, - volinfo => $itemfields{enumchron}, - itemdata_itemnotes => $itemfields{itemnotes}, - z3950_search_params => C4::Search::z3950_search_args($dat), + MARCHOSTS => $marchostsarray, + subtitle => $subtitle, + # FFZG -- added + partnum => $partnum, + partname => $partname, + medium => $medium, + responsibility => $responsibility, + impressum => $impressum, + oldcall => $oldcall, + udc => $udc, + textholding => $textholding, + # /FFZG + itemdata_ccode => $itemfields{ccode}, + itemdata_enumchron => $itemfields{enumchron}, + itemdata_uri => $itemfields{uri}, + itemdata_copynumber => $itemfields{copynumber}, + itemdata_stocknumber => $itemfields{stocknumber}, + volinfo => $itemfields{enumchron}, + itemdata_itemnotes => $itemfields{itemnotes}, + itemdata_nonpublicnotes => $itemfields{itemnotes_nonpublic}, + z3950_search_params => C4::Search::z3950_search_args($dat), hostrecords => $hostrecords, - analytics_flag => $analytics_flag, - C4::Search::enabled_staff_search_views, + analytics_flag => $analytics_flag, + C4::Search::enabled_staff_search_views, materials => $materials_flag, ); @@ -365,7 +457,7 @@ $template->param( subscriptions => \@subs, subscriptionsnumber => $subscriptionsnumber, subscriptiontitle => $dat->{title}, - searchid => $query->param('searchid'), + searchid => scalar $query->param('searchid'), ); # $debug and $template->param(debug_display => 1); @@ -373,14 +465,23 @@ $template->param( # Lists if (C4::Context->preference("virtualshelves") ) { - $template->param( 'GetShelves' => GetBibliosShelves( $biblionumber ) ); + my $shelves = Koha::Virtualshelves->search( + { + biblionumber => $biblionumber, + category => 2, + }, + { + join => 'virtualshelfcontents', + } + ); + $template->param( 'shelves' => $shelves ); } # XISBN Stuff if (C4::Context->preference("FRBRizeEditions")==1) { eval { $template->param( - XISBNS => get_xisbns($isbn) + XISBNS => scalar get_xisbns($isbn) ); }; if ($@) { warn "XISBN Failed $@"; } @@ -396,12 +497,6 @@ if ( (C4::Context->preference("HTML5MediaEnabled") eq 'both') or (C4::Context->p $template->param( C4::HTML5Media->gethtml5media($record)); } - -# Get OPAC URL -if (C4::Context->preference('OPACBaseURL')){ - $template->param( OpacUrl => C4::Context->preference('OPACBaseURL') ); -} - # Displaying tags my $tag_quantity; @@ -415,8 +510,9 @@ if (C4::Context->preference('TagsEnabled') and $tag_quantity = C4::Context->pref } #we only need to pass the number of holds to the template -my $holds = C4::Reserves::GetReservesFromBiblionumber({ biblionumber => $biblionumber, all_dates => 1 }); -$template->param( holdcount => scalar ( @$holds ) ); +my $biblio = Koha::Biblios->find( $biblionumber ); +my $holds = $biblio->holds; +$template->param( holdcount => $holds->count ); my $StaffDetailItemSelection = C4::Context->preference('StaffDetailItemSelection'); if ($StaffDetailItemSelection) {