a09a926458
When we set up a circulation rule where 'On shelf holds allowed' is 'If any unavailable' and we have a record with one 'Ordered' item, we cannot place this item on hold. This patch allows placing hold on item with negative not for loan values, when using rule with 'On shelf holds allowed' set to 'If any unavailable' To test: 1. Set up a circulation rule where on shelf holds are not allowed and force the choosing of an item (to facilitate the test) 1.1. Go to Administration > Circulation and fines rules 1.2. In the matrix, add a circulation like this - Patron category: All - Item type: Books - Current checkouts allowed: 10 - Current on-site checkouts allowed: 10 - Loan period: 21 - Holds allowed (total): 10 - Holds allowed (daily): 10 - Holds per record (count): 10 - On shelf holds allowed: If any unavailable - OPAC item level holds: Force 1.3. Click Save 2. Create a record with one 'Ordered' item (or any negative value not for loan status) 2.1. Go to Cataloging 2.2. Click New record 2.3. Fill out the mandatory fields (by default in MARC21: 000, 003, 005, 008, 040, 245, and 942 (942 should be set to Books)) 2.4. Click Save 2.5. Fill out the following item fields - Not for loan: Ordered - Koha item type: Books 2.6. Click Add item 2.7. Click Normal to go to the detailed record 3. Try to place a hold on the 'Ordered' item 3.1. From the detailed record, click OPAC view: Open in new window. --> Note that the 'Place hold' option is not present 4. Add a second 'Available' item 4.1. Back in the staff interface tab with the detailed record, click New > New item 4.2. Make sure the item type is set to Books 4.3. Add a barcode in p 4.4. Click Add item 5. Try again to place a hold on the 'Ordered' item 5.1. Go back to the OPAC tab and refresh the page --> Note that the 'Place hold' option is still not present 6. Check out the available item to a patron 6.1. In the staff interface tab, copy the barcode from the available item 6.2. Go to Patrons 6.3. Click on Search 6.4. Click Check out next to one of the patrons 6.5. Paste the barcode in the box and click Check out 7. Try again to place a hold on the 'Ordered' item 7.1. Go back to the OPAC tab and refresh the page --> Note that the 'Place hold' option is now present 7.2. Click Place hold --> Note that only the checked out item is available to place on hold, if you click Show unholdable items, it will show the Ordered item, but you can't place a hold on it. 8. Apply the patch 9. Go to the OPAC tab and click on the book title right next to 'Place a hold on' checkbox to go back to the record details. --> Note that the 'Place hold' option is still present 9.1. Click Place hold --> Note that you can now place a hold on the 'Checked out' or the 'Ordered' item. 10. Check in the item to make it available again 10.1. In the staff interface tab, click on 'Show checkouts' button 10.2. Select the Checked out item and click on 'Renew or check in selected items' button. 11. Try again to place a hold on the 'Ordered' item 11.1. Go back to the OPAC tab and click on the book title right next to 'Place a hold on' checkbox to go back to the record details. --> Note that the 'Place hold' option is still present 11.2. Click Place hold --> Note that only the 'Ordered' item is available to place on hold, if you click Show unholdable items, it will show the Available item and you can't place a hold on it. 12. Delete the available item to keep only the Ordered item 12.1 in the staff interface tab, click on 'Search catalog' and search for the record 12.2 click on 'Edit' then 'Edit items' 12.3 Delete the available item 13. Try to place a hold on the remain 'Ordered' item 13.1 Go back to the OPAC tab and click on the book title right next to 'Place a hold on' checkbox to go back to the record details. --> Note that the 'Place hold' option is present 13.2. Click Place hold --> Note that you can place a hold on the Ordered item. Signed-off-by: Amaury GAU <amaury.gau@bulac.fr> Signed-off-by: Sam Lau <samalau@gmail.com> Signed-off-by: Tomas Cohen Arazi <tomascohen@theke.io>
230 lines
7.1 KiB
Perl
Executable file
230 lines
7.1 KiB
Perl
Executable file
#!/usr/bin/perl
|
|
|
|
# Copyright 2000-2002 Katipo Communications
|
|
# parts copyright 2010 BibLibre
|
|
#
|
|
# 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 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.
|
|
#
|
|
# You should have received a copy of the GNU General Public License
|
|
# along with Koha; if not, see <http://www.gnu.org/licenses>.
|
|
|
|
|
|
=head1 NAME
|
|
|
|
opac-ISBDdetail.pl - script to show a biblio in ISBD format
|
|
|
|
=head1 DESCRIPTION
|
|
|
|
This script needs a biblionumber as parameter
|
|
|
|
It shows the biblio
|
|
|
|
The template is in <templates_dir>/catalogue/ISBDdetail.tt.
|
|
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
|
|
|
|
=head1 FUNCTIONS
|
|
|
|
=cut
|
|
|
|
use Modern::Perl;
|
|
|
|
use C4::Auth qw( get_template_and_user );
|
|
use C4::Context;
|
|
use C4::Output qw( parametrized_url output_html_with_http_headers );
|
|
use CGI qw ( -utf8 );
|
|
use C4::Biblio qw(
|
|
CountItemsIssued
|
|
GetISBDView
|
|
GetMarcControlnumber
|
|
GetMarcISSN
|
|
TransformMarcToKoha
|
|
);
|
|
use C4::Reserves qw( IsAvailableForItemLevelRequest );
|
|
use C4::Serials qw( CountSubscriptionFromBiblionumber SearchSubscriptions GetLatestSerials );
|
|
use C4::Koha qw(
|
|
GetNormalizedEAN
|
|
GetNormalizedISBN
|
|
GetNormalizedOCLCNumber
|
|
GetNormalizedUPC
|
|
);
|
|
use Koha::CirculationRules;
|
|
use Koha::ItemTypes;
|
|
use Koha::Patrons;
|
|
use Koha::RecordProcessor;
|
|
use Koha::Biblios;
|
|
use Koha::Util::MARC;
|
|
|
|
my $query = CGI->new();
|
|
my $biblionumber = $query->param('biblionumber');
|
|
my $biblio;
|
|
$biblio = Koha::Biblios->find( $biblionumber, { prefetch => [ 'metadata', 'items' ] } ) if $biblionumber;
|
|
if( !$biblio ) {
|
|
print $query->redirect('/cgi-bin/koha/errors/404.pl');
|
|
exit;
|
|
}
|
|
|
|
#open template
|
|
my ( $template, $loggedinuser, $cookie ) = get_template_and_user(
|
|
{
|
|
template_name => "opac-ISBDdetail.tt",
|
|
query => $query,
|
|
type => "opac",
|
|
authnotrequired => ( C4::Context->preference("OpacPublic") ? 1 : 0 ),
|
|
}
|
|
);
|
|
|
|
my $patron = Koha::Patrons->find($loggedinuser);
|
|
|
|
my $opachiddenitems_rules = C4::Context->yaml_preference('OpacHiddenItems');
|
|
|
|
unless ( $patron and $patron->category->override_hidden_items ) {
|
|
# only skip this check if there's a logged in user
|
|
# and its category overrides OpacHiddenItems
|
|
if ( $biblio->hidden_in_opac({ rules => $opachiddenitems_rules }) ) {
|
|
print $query->redirect('/cgi-bin/koha/errors/404.pl'); # escape early
|
|
exit;
|
|
}
|
|
}
|
|
|
|
my $record = $biblio->metadata->record;
|
|
my @items = $biblio->items->filter_by_visible_in_opac({ patron => $patron })->as_list;
|
|
|
|
my $record_processor = Koha::RecordProcessor->new(
|
|
{ filters => [ 'EmbedItems', 'ViewPolicy' ],
|
|
options => {
|
|
interface => 'opac',
|
|
frameworkcode => $biblio->frameworkcode,
|
|
items => \@items
|
|
}
|
|
}
|
|
);
|
|
$record_processor->process($record);
|
|
|
|
# get biblionumbers stored in the cart
|
|
if(my $cart_list = $query->cookie("bib_list")){
|
|
my @cart_list = split(/\//, $cart_list);
|
|
if ( grep {$_ eq $biblionumber} @cart_list) {
|
|
$template->param( incart => 1 );
|
|
}
|
|
}
|
|
|
|
my $marcflavour = C4::Context->preference("marcflavour");
|
|
# some useful variables for enhanced content;
|
|
# in each case, we're grabbing the first value we find in
|
|
# the record and normalizing it
|
|
my $upc = GetNormalizedUPC( $record, $marcflavour );
|
|
my $ean = GetNormalizedEAN( $record, $marcflavour );
|
|
my $oclc = GetNormalizedOCLCNumber( $record, $marcflavour );
|
|
my $isbn = GetNormalizedISBN( undef, $record, $marcflavour );
|
|
my $content_identifier_exists;
|
|
if ( $isbn or $ean or $oclc or $upc ) {
|
|
$content_identifier_exists = 1;
|
|
}
|
|
$template->param(
|
|
normalized_upc => $upc,
|
|
normalized_ean => $ean,
|
|
normalized_oclc => $oclc,
|
|
normalized_isbn => $isbn,
|
|
content_identifier_exists => $content_identifier_exists,
|
|
);
|
|
|
|
#coping with subscriptions
|
|
my $subscriptionsnumber = CountSubscriptionFromBiblionumber($biblionumber);
|
|
my $dat = TransformMarcToKoha({ record => $record });
|
|
|
|
my @subscriptions = SearchSubscriptions({ biblionumber => $biblionumber, orderby => 'title' });
|
|
my @subs;
|
|
foreach my $subscription (@subscriptions) {
|
|
my %cell;
|
|
my $serials_to_display;
|
|
$cell{subscriptionid} = $subscription->{subscriptionid};
|
|
$cell{subscriptionnotes} = $subscription->{notes};
|
|
$cell{branchcode} = $subscription->{branchcode};
|
|
|
|
#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 );
|
|
push @subs, \%cell;
|
|
}
|
|
|
|
$template->param(
|
|
subscriptions => \@subs,
|
|
subscriptionsnumber => $subscriptionsnumber,
|
|
);
|
|
|
|
my $can_item_be_reserved = 0;
|
|
my $res = GetISBDView({
|
|
'record' => $record,
|
|
'template' => 'opac',
|
|
'framework' => $biblio->frameworkcode
|
|
});
|
|
|
|
my $items = $biblio->items;
|
|
while ( my $item = $items->next ) {
|
|
|
|
$can_item_be_reserved = $can_item_be_reserved || IsAvailableForItemLevelRequest($item, $patron, undef);
|
|
}
|
|
|
|
if( $can_item_be_reserved || CountItemsIssued($biblionumber) || $biblio->has_items_waiting_or_intransit ) {
|
|
$template->param( ReservableItems => 1 );
|
|
}
|
|
|
|
my $norequests = ! $items->filter_by_for_hold->count;
|
|
|
|
$template->param(
|
|
norequests => $norequests,
|
|
ISBD => $res,
|
|
biblio => $biblio,
|
|
);
|
|
|
|
#Search for title in links
|
|
my $marccontrolnumber = GetMarcControlnumber ($record, $marcflavour);
|
|
my $marcissns = GetMarcISSN ( $record, $marcflavour );
|
|
my $issn = $marcissns->[0] || '';
|
|
|
|
if (my $search_for_title = C4::Context->preference('OPACSearchForTitleIn')){
|
|
$dat->{title} =~ s/\/+$//; # remove trailing slash
|
|
$dat->{title} =~ s/\s+$//; # remove trailing space
|
|
my $oclc_no = Koha::Util::MARC::oclc_number( $record );
|
|
$search_for_title = parametrized_url(
|
|
$search_for_title,
|
|
{
|
|
TITLE => $dat->{title},
|
|
AUTHOR => $dat->{author},
|
|
ISBN => $isbn,
|
|
ISSN => $issn,
|
|
CONTROLNUMBER => $marccontrolnumber,
|
|
BIBLIONUMBER => $biblionumber,
|
|
OCLC_NO => $oclc_no,
|
|
}
|
|
);
|
|
$template->param('OPACSearchForTitleIn' => $search_for_title);
|
|
}
|
|
|
|
if( C4::Context->preference('ArticleRequests') ) {
|
|
my $itemtype = Koha::ItemTypes->find($biblio->itemtype);
|
|
my $artreqpossible = $patron
|
|
? $biblio->can_article_request( $patron )
|
|
: $itemtype
|
|
? $itemtype->may_article_request
|
|
: q{};
|
|
$template->param( artreqpossible => $artreqpossible );
|
|
}
|
|
|
|
output_html_with_http_headers $query, $cookie, $template->output;
|