X-Git-Url: http://git.rot13.org/?a=blobdiff_plain;f=opac%2Fopac-detail.pl;h=1fad0ab5f4b26c8245c3b366b0f9059855478182;hb=5c7ff786d5e755ff2452ec41c4385150b93d3ea9;hp=c83a76c3221554399021545ef6ee41e5f4f1ffb5;hpb=54044e05c56580d34473887f46385aca008200c5;p=koha.git diff --git a/opac/opac-detail.pl b/opac/opac-detail.pl index c83a76c322..1fad0ab5f4 100755 --- a/opac/opac-detail.pl +++ b/opac/opac-detail.pl @@ -32,7 +32,7 @@ use C4::Biblio; use C4::Items; use C4::Circulation; use C4::Tags qw(get_tags); -use C4::XISBN qw(get_xisbns get_biblionumber_from_isbn); +use C4::XISBN qw(get_xisbns); use C4::External::Amazon; use C4::External::Syndetics qw(get_syndetics_index get_syndetics_summary get_syndetics_toc get_syndetics_excerpt get_syndetics_reviews get_syndetics_anotes ); use C4::Members; @@ -40,6 +40,7 @@ use C4::XSLT; use C4::ShelfBrowser; use C4::Reserves; use C4::Charset; +use C4::Letters; use MARC::Record; use MARC::Field; use List::MoreUtils qw/any none/; @@ -47,8 +48,16 @@ use C4::Images; use Koha::DateUtils; use C4::HTML5Media; use C4::CourseReserves qw(GetItemCourseReservesInfo); + +use Koha::Biblios; use Koha::RecordProcessor; +use Koha::AuthorisedValues; +use Koha::IssuingRules; +use Koha::Items; +use Koha::ItemTypes; +use Koha::Acquisition::Orders; use Koha::Virtualshelves; +use Koha::Patrons; use Koha::Ratings; use Koha::Reviews; @@ -83,11 +92,13 @@ if (scalar @all_items >= 1) { } } -my $record = GetMarcBiblio($biblionumber); +my $record = GetMarcBiblio({ biblionumber => $biblionumber }); if ( ! $record ) { print $query->redirect("/cgi-bin/koha/errors/404.pl"); # escape early exit; } + +my $biblio = Koha::Biblios->find( $biblionumber ); my $framework = &GetFrameworkCode( $biblionumber ); my $record_processor = Koha::RecordProcessor->new({ filters => 'ViewPolicy', @@ -129,7 +140,7 @@ if (C4::Context->preference('OpacSuppression')) { } } -$template->param( biblionumber => $biblionumber ); +$template->param( biblio => $biblio ); # get biblionumbers stored in the cart my @cart_list; @@ -189,6 +200,7 @@ if ($session->param('busc')) { } } else { for my $value (@{$arrParamsBusc->{$_}}) { + next if !defined($value); $pasarParams .= '&' if ($j); $pasarParams .= $_ . '=' . Encode::decode('UTF-8', uri_escape_utf8($value)); $j++; @@ -204,7 +216,7 @@ if ($session->param('busc')) { my ($arrParamsBusc, $offset, $results_per_page) = @_; my $expanded_facet = $arrParamsBusc->{'expand'}; - my $itemtypes = GetItemTypes; + my $itemtypes = { map { $_->{itemtype} => $_ } @{ Koha::ItemTypes->search_with_localization->unblessed } }; my @servers; @servers = @{$arrParamsBusc->{'server'}} if $arrParamsBusc->{'server'}; @servers = ("biblioserver") unless (@servers); @@ -429,32 +441,31 @@ if ($session->param('busc')) { $numberBiblioPaging = $paging{'previous'}->{biblionumber}; if ($numberBiblioPaging) { $template->param( 'previousBiblionumber' => $numberBiblioPaging ); - $dataBiblioPaging = GetBiblioData($numberBiblioPaging); - $template->param('previousTitle' => $dataBiblioPaging->{'title'}) if ($dataBiblioPaging); + $dataBiblioPaging = Koha::Biblios->find( $numberBiblioPaging ); + $template->param('previousTitle' => $dataBiblioPaging->title) if $dataBiblioPaging; } # Next biblio $numberBiblioPaging = $paging{'next'}->{biblionumber}; if ($numberBiblioPaging) { $template->param( 'nextBiblionumber' => $numberBiblioPaging ); - $dataBiblioPaging = GetBiblioData($numberBiblioPaging); - $template->param('nextTitle' => $dataBiblioPaging->{'title'}) if ($dataBiblioPaging); + $dataBiblioPaging = Koha::Biblios->find( $numberBiblioPaging ); + $template->param('nextTitle' => $dataBiblioPaging->title) if $dataBiblioPaging; } # Partial list of biblio results my @listResults; for (my $j = 0; $j < @arrBiblios; $j++) { next unless ($arrBiblios[$j]); - $dataBiblioPaging = GetBiblioData($arrBiblios[$j]) if ($arrBiblios[$j] != $biblionumber); - push @listResults, {index => $j + 1 + $offset, biblionumber => $arrBiblios[$j], title => ($arrBiblios[$j] == $biblionumber)?'':$dataBiblioPaging->{title}, author => ($arrBiblios[$j] != $biblionumber && $dataBiblioPaging->{author})?$dataBiblioPaging->{author}:'', url => ($arrBiblios[$j] == $biblionumber)?'':'opac-detail.pl?biblionumber=' . $arrBiblios[$j]}; + $dataBiblioPaging = Koha::Biblios->find( $arrBiblios[$j] ) if ($arrBiblios[$j] != $biblionumber); + push @listResults, {index => $j + 1 + $offset, biblionumber => $arrBiblios[$j], title => ($arrBiblios[$j] == $biblionumber)?'':$dataBiblioPaging->title, author => ($arrBiblios[$j] != $biblionumber && $dataBiblioPaging->author)?$dataBiblioPaging->author:'', url => ($arrBiblios[$j] == $biblionumber)?'':'opac-detail.pl?biblionumber=' . $arrBiblios[$j]}; } $template->param('listResults' => \@listResults) if (@listResults); $template->param('indexPag' => 1 + $offset, 'totalPag' => $arrParamsBusc{'total'}, 'indexPagEnd' => scalar(@arrBiblios) + $offset); } } - -$template->param( 'ItemsIssued' => CountItemsIssued( $biblionumber ) ); -$template->param('OPACShowCheckoutName' => C4::Context->preference("OPACShowCheckoutName") ); -$template->param('OPACShowBarcode' => C4::Context->preference("OPACShowBarcode") ); +$template->param( + OPACShowCheckoutName => C4::Context->preference("OPACShowCheckoutName"), +); # adding items linked via host biblios @@ -536,16 +547,20 @@ my $HideMARC = $record_processor->filters->[0]->should_hide_marc( interface => 'opac', } ); -my $itemtypes = GetItemTypes(); +my $itemtypes = { map { $_->{itemtype} => $_ } @{ Koha::ItemTypes->search_with_localization->unblessed } }; # imageurl: my $itemtype = $dat->{'itemtype'}; if ( $itemtype ) { $dat->{'imageurl'} = getitemtypeimagelocation( 'opac', $itemtypes->{$itemtype}->{'imageurl'} ); $dat->{'description'} = $itemtypes->{$itemtype}->{translated_description}; } -my $shelflocations =GetKohaAuthorisedValues('items.location',$dat->{'frameworkcode'}, 'opac'); -my $collections = GetKohaAuthorisedValues('items.ccode',$dat->{'frameworkcode'}, 'opac'); -my $copynumbers = GetKohaAuthorisedValues('items.copynumber',$dat->{'frameworkcode'}, 'opac'); + +my $shelflocations = + { map { $_->{authorised_value} => $_->{opac_description} } Koha::AuthorisedValues->get_descriptions_by_koha_field( { frameworkcode => $dat->{frameworkcode}, kohafield => 'items.location' } ) }; +my $collections = + { map { $_->{authorised_value} => $_->{opac_description} } Koha::AuthorisedValues->get_descriptions_by_koha_field( { frameworkcode => $dat->{frameworkcode}, kohafield => 'items.ccode' } ) }; +my $copynumbers = + { map { $_->{authorised_value} => $_->{opac_description} } Koha::AuthorisedValues->get_descriptions_by_koha_field( { frameworkcode => $dat->{frameworkcode}, kohafield => 'items.copynumber' } ) }; #coping with subscriptions my $subscriptionsnumber = CountSubscriptionFromBiblionumber($biblionumber); @@ -563,15 +578,21 @@ foreach my $subscription (@subscriptions) { $cell{histstartdate} = $subscription->{histstartdate}; $cell{histenddate} = $subscription->{histenddate}; $cell{branchcode} = $subscription->{branchcode}; - $cell{hasalert} = $subscription->{hasalert}; $cell{callnumber} = $subscription->{callnumber}; $cell{closed} = $subscription->{closed}; + $cell{letter} = $subscription->{letter}; + $cell{biblionumber} = $subscription->{biblionumber}; #get the three latest serials. $serials_to_display = $subscription->{opacdisplaycount}; $serials_to_display = C4::Context->preference('OPACSerialIssueDisplayCount') unless $serials_to_display; $cell{opacdisplaycount} = $serials_to_display; $cell{latestserials} = GetLatestSerials( $subscription->{subscriptionid}, $serials_to_display ); + if ( $borrowernumber ) { + my $subscription_object = Koha::Subscriptions->find( $subscription->{subscriptionid} ); + my $subscriber = $subscription_object->subscribers->find( $borrowernumber ); + $cell{hasalert} = 1 if $subscriber; + } push @subs, \%cell; } @@ -586,15 +607,15 @@ for ( C4::Context->preference("OPACShowHoldQueueDetails") ) { } my $has_hold; if ( $show_holds_count || $show_priority) { - my $reserves = GetReservesFromBiblionumber({ biblionumber => $biblionumber, all_dates => 1 }); - $template->param( holds_count => scalar( @$reserves ) ) if $show_holds_count; - foreach (@$reserves) { - $item_reserves{ $_->{itemnumber} }++ if $_->{itemnumber}; - if ($show_priority && $_->{borrowernumber} == $borrowernumber) { + my $holds = $biblio->holds; + $template->param( holds_count => $holds->count ); + while ( my $hold = $holds->next ) { + $item_reserves{ $hold->itemnumber }++ if $hold->itemnumber; + if ($show_priority && $hold->borrowernumber == $borrowernumber) { $has_hold = 1; - $_->{itemnumber} - ? ($priority{ $_->{itemnumber} } = $_->{priority}) - : ($template->param( priority => $_->{priority} )); + $hold->itemnumber + ? ($priority{ $hold->itemnumber } = $hold->priority) + : ($template->param( priority => $hold->priority )); } } } @@ -620,7 +641,8 @@ if ( C4::Context->preference('OPACAcquisitionDetails' ) ) { }); my $total_quantity = 0; for my $order ( @$orders ) { - if ( C4::Context->preference('AcqCreateItem') eq 'ordering' ) { + my $basket = Koha::Acquisition::Orders->find( $order->{ordernumber} )->basket; + if ( $basket->effective_create_items eq 'ordering' ) { for my $itemnumber ( C4::Acquisition::GetItemnumbersFromOrder( $order->{ordernumber} ) ) { push @itemnumbers_on_order, $itemnumber; } @@ -632,15 +654,16 @@ if ( C4::Context->preference('OPACAcquisitionDetails' ) ) { }; } +my $allow_onshelf_holds; if ( not $viewallitems and @items > $max_items_to_display ) { $template->param( too_many_items => 1, items_count => scalar( @items ), ); } else { - my $allow_onshelf_holds; - my $borrower = GetMember( 'borrowernumber' => $borrowernumber ); + my $patron = Koha::Patrons->find( $borrowernumber ); for my $itm (@items) { + my $item = Koha::Items->find( $itm->{itemnumber} ); $itm->{holds_count} = $item_reserves{ $itm->{itemnumber} }; $itm->{priority} = $priority{ $itm->{itemnumber} }; $norequests = 0 @@ -651,7 +674,7 @@ if ( not $viewallitems and @items > $max_items_to_display ) { && !$itemtypes->{$itm->{'itype'}}->{notforloan} && $itm->{'itemnumber'}; - $allow_onshelf_holds = C4::Reserves::OnShelfHoldsAllowed( $itm, $borrower ) + $allow_onshelf_holds = Koha::IssuingRules->get_onshelfholds_policy( { item => $item, patron => $patron } ) unless $allow_onshelf_holds; # get collection code description, too @@ -666,7 +689,7 @@ if ( not $viewallitems and @items > $max_items_to_display ) { $itm->{'imageurl'} = getitemtypeimagelocation( 'opac', $itemtypes->{ $itm->{itype} }->{'imageurl'} ); $itm->{'description'} = $itemtypes->{ $itm->{itype} }->{translated_description}; } - foreach (qw(ccode enumchron copynumber itemnotes uri)) { + foreach (qw(ccode enumchron copynumber itemnotes location_description uri)) { $itemfields{$_} = 1 if ($itm->{$_}); } @@ -681,9 +704,7 @@ if ( not $viewallitems and @items > $max_items_to_display ) { $itm->{transfertto} = $transfertto; } - if ( C4::Context->preference('OPACAcquisitionDetails') - and C4::Context->preference('AcqCreateItem') eq 'ordering' ) - { + if ( C4::Context->preference('OPACAcquisitionDetails') ) { $itm->{on_order} = 1 if grep /^$itm->{itemnumber}$/, @itemnumbers_on_order; } @@ -699,7 +720,10 @@ if ( not $viewallitems and @items > $max_items_to_display ) { push @itemloop, $itm; } } - $template->param( 'AllowOnShelfHolds' => $allow_onshelf_holds ); +} + +if( $allow_onshelf_holds || CountItemsIssued($biblionumber) || $biblio->has_items_waiting_or_intransit ) { + $template->param( ReservableItems => 1 ); } # Display only one tab if one items list is empty @@ -740,7 +764,8 @@ my $subtitle = GetRecordValue('subtitle', $record, GetFrameworkCode($bib itemdata_enumchron => $itemfields{enumchron}, itemdata_uri => $itemfields{uri}, itemdata_copynumber => $itemfields{copynumber}, - itemdata_itemnotes => $itemfields{itemnotes}, + itemdata_itemnotes => $itemfields{itemnotes}, + itemdata_location => $itemfields{location_description}, subtitle => $subtitle, OpacStarRatings => C4::Context->preference("OpacStarRatings"), ); @@ -823,21 +848,18 @@ if ( C4::Context->preference('reviewson') ) { } } for my $review (@$reviews) { - my $borrowerData = GetMember( 'borrowernumber' => $review->{borrowernumber} ); + my $patron = Koha::Patrons->find( $review->{borrowernumber} ); # FIXME Should be Koha::Review->reviewer or similar # setting some borrower info into this hash - $review->{title} = $borrowerData->{'title'}; - $review->{surname} = $borrowerData->{'surname'}; - $review->{firstname} = $borrowerData->{'firstname'}; - if ( $libravatar_enabled and $borrowerData->{'email'} ) { - $review->{avatarurl} = libravatar_url( email => $borrowerData->{'email'}, https => $ENV{HTTPS} ); - } - $review->{userid} = $borrowerData->{'userid'}; - $review->{cardnumber} = $borrowerData->{'cardnumber'}; + if ( $patron ) { + $review->{patron} = $patron; + if ( $libravatar_enabled and $patron->email ) { + $review->{avatarurl} = libravatar_url( email => $patron->email, https => $ENV{HTTPS} ); + } - if ( $borrowerData->{'borrowernumber'} eq $borrowernumber ) { - $review->{your_comment} = 1; - $loggedincommenter = 1; + if ( $patron->borrowernumber eq $borrowernumber ) { + $loggedincommenter = 1; + } } } } @@ -849,7 +871,6 @@ if ( C4::Context->preference("OPACISBD") ) { $template->param( itemloop => \@itemloop, otheritemloop => \@otheritemloop, - subscriptionsnumber => $subscriptionsnumber, biblionumber => $biblionumber, subscriptions => \@subs, subscriptionsnumber => $subscriptionsnumber, @@ -875,7 +896,7 @@ if (C4::Context->preference("virtualshelves") ) { if (C4::Context->preference("OPACFRBRizeEditions")==1) { eval { $template->param( - XISBNS => get_xisbns($isbn) + XISBNS => scalar get_xisbns($isbn) ); }; if ($@) { warn "XISBN Failed $@"; } @@ -1085,13 +1106,14 @@ if (C4::Context->preference("OPACURLOpenInNewWindow")) { $template->param(covernewwindow => 'false'); } +$template->param(borrowernumber => $borrowernumber); + if ( C4::Context->preference('OpacStarRatings') !~ /disable/ ) { my $ratings = Koha::Ratings->search({ biblionumber => $biblionumber }); my $my_rating = $borrowernumber ? $ratings->search({ borrowernumber => $borrowernumber })->next : undef; $template->param( ratings => $ratings, my_rating => $my_rating, - borrowernumber => $borrowernumber ); } @@ -1134,12 +1156,16 @@ if ( C4::Context->preference("IDREF") ) { # the user wants, and what's available for display my $opac_serial_default = C4::Context->preference('opacSerialDefaultTab'); my $defaulttab = + $viewallitems + ? 'holdings' : $opac_serial_default eq 'subscriptions' && $subscriptionsnumber ? 'subscriptions' : $opac_serial_default eq 'serialcollection' && @serialcollections > 0 ? 'serialcollection' : $opac_serial_default eq 'holdings' && scalar (@itemloop) > 0 ? 'holdings' : + scalar (@itemloop) == 0 + ? 'media' : $subscriptionsnumber ? 'subscriptions' : @serialcollections > 0 @@ -1168,8 +1194,7 @@ if ( C4::Context->preference('UseCourseReserves') ) { } $template->param( - 'OpacLocationBranchToDisplay' => C4::Context->preference('OpacLocationBranchToDisplay') , - 'OpacLocationBranchToDisplayShelving' => C4::Context->preference('OpacLocationBranchToDisplayShelving'), + 'OpacLocationBranchToDisplay' => C4::Context->preference('OpacLocationBranchToDisplay'), ); output_html_with_http_headers $query, $cookie, $template->output;