@@ -, +, @@
---
C4/Items.pm | 9 +++++++--
koha-tmpl/opac-tmpl/prog/en/modules/opac-detail.tt | 9 +++++++++
koha-tmpl/opac-tmpl/prog/en/modules/opac-reserve.tt | 9 +++++++--
opac/opac-detail.pl | 7 ++++++-
opac/opac-reserve.pl | 14 +++++++++++---
t/db_dependent/Items.t | 11 ++++++++++-
6 files changed, 50 insertions(+), 9 deletions(-)
--- a/C4/Items.pm
+++ a/C4/Items.pm
@@ -1219,7 +1219,8 @@ $filter->{fromDate} = '01/01/2013'; #Filters only serial issues by the serialite
$filter->{toDate} = '31/12/2014'; #Filters only serial issues by the serialitems.publisheddate
#The ending date in C4::Context->preference('dateformat') format
$filter->{limit} = 15; #Limits the returning set to this many items
-
+$filter->{itemnumber} = 165; #Returns the item with this itemnumber
+
Filters are expected to be validated! If a filter is not defined, that filter is not present in the $filter-HASH
=cut
@@ -1341,7 +1342,11 @@ sub GetItemsInfo {
}
push @$queryParams, $filter->{toDate};
}
-
+ if (exists $filter->{itemnumber}) {
+ push @$queryParams, $filter->{itemnumber};
+ $query .= " AND items.itemnumber = ?";
+ }
+
$query .= "ORDER BY home.branchname, items.enumchron, LPAD( items.copynumber, 8, '0' ), items.dateaccessioned DESC" ;
if (exists $filter->{limit}) {
push @$queryParams, $filter->{limit};
--- a/koha-tmpl/opac-tmpl/prog/en/modules/opac-detail.tt
+++ a/koha-tmpl/opac-tmpl/prog/en/modules/opac-detail.tt
@@ -132,6 +132,7 @@
null,
[% END %]
[% IF ( ShowCourseReservesHeader ) %]null,[% END %]
+ [% IF ( isSerial ) %]null,[% END %]
]
}));
@@ -1550,6 +1551,7 @@ YAHOO.util.Event.onContentReady("furtherm", function () {
Item hold queue priority
[% END %]
[% IF ( ShowCourseReservesHeader ) %]
Course reserves
[% END %]
+ [% IF ( isSerial ) %]
Reserve
[% END %]
[% FOREACH ITEM_RESULT IN items %]
[% IF ITEM_RESULT.this_branch %]
@@ -1630,6 +1632,13 @@ YAHOO.util.Event.onContentReady("furtherm", function () {
[% END %]
[% END %]
+ [% IF isSerial %]
+
+ [% END %]
[% END %]
--- a/koha-tmpl/opac-tmpl/prog/en/modules/opac-reserve.tt
+++ a/koha-tmpl/opac-tmpl/prog/en/modules/opac-reserve.tt
@@ -425,6 +425,7 @@
+ [% UNLESS singleItemLevelHold %]
[% UNLESS ( bibitemloo.holdable ) %]
[% END %]
+ [% END %][%# IF singleItemLevelHold %]
[% UNLESS ( bibitemloo.holdable ) %]
[% END %]
@@ -489,7 +492,9 @@
[% IF ( itemLoo.available ) %]
+ value="[% itemLoo.itemnumber %]"
+ [% IF singleItemLevelHold %] checked="checked" [% END %]
+ />
[% ELSE %]
--- a/opac/opac-detail.pl
+++ a/opac/opac-detail.pl
@@ -704,7 +704,7 @@ if ( $show_holds_count || $show_priority) {
}
$template->param( show_priority => $has_hold ) ;
-my $norequests = 1;
+my $norequests = 1; #"No requests"-flag hides the "Place hold"-link in opac-detail-sidebar.inc
my %itemfields;
my (@itemloop, @otheritemloop);
my $currentbranch = C4::Context->userenv ? C4::Context->userenv->{branch} : undef;
@@ -769,6 +769,11 @@ for my $itm (@items) {
}
}
+#There is no point in enabling "Place hold" for Serials.
+# Placing a title-level hold for a Serial is crazy since we don't want "any" item but instead the specific volume and number.
+# Also choosing an item-level hold from opac-reserve.pl is problematic since there could be thousands of items.
+$norequests = 1 if $template->{VARS}->{'isSerial'};
+
# Display only one tab if one items list is empty
if (scalar(@itemloop) == 0 || scalar(@otheritemloop) == 0) {
$template->param(SeparateHoldings => 0);
--- a/opac/opac-reserve.pl
+++ a/opac/opac-reserve.pl
@@ -73,8 +73,10 @@ if ($borr->{reservefee} > 0){
my $branches = GetBranches();
my $itemTypes = GetItemTypes();
-# There are two ways of calling this script, with a single biblio num
-# or multiple biblio nums.
+# There are three ways of calling this script, with a single biblio num
+# or multiple biblio nums or as a itemhold, where the target item has already been chosen.
+my $targetItemnumber = $query->param('itemnumber') ? $query->param('itemnumber') : undef;
+$template->param('singleItemLevelHold' => 1);
my $biblionumbers = $query->param('biblionumbers');
my $reserveMode = $query->param('reserve_mode');
if ($reserveMode && ($reserveMode eq 'single')) {
@@ -127,8 +129,14 @@ foreach my $biblioNumber (@biblionumbers) {
my $biblioData = GetBiblioData($biblioNumber);
$biblioDataHash{$biblioNumber} = $biblioData;
+ my @itemInfos;
- my @itemInfos = GetItemsInfo($biblioNumber);
+ if ($targetItemnumber) { #We just want the one item so use the filters to find it!
+ @itemInfos = GetItemsInfo($biblioNumber, {itemnumber => $targetItemnumber});
+ }
+ else {
+ @itemInfos = GetItemsInfo($biblioNumber);
+ }
my $marcrecord= GetMarcBiblio($biblioNumber);
--- a/t/db_dependent/Items.t
+++ a/t/db_dependent/Items.t
@@ -145,7 +145,7 @@ subtest 'GetHiddenItemnumbers tests' => sub {
subtest 'Filter items tests' => sub {
- plan tests => 3;
+ plan tests => 4;
# Start transaction
$dbh->{AutoCommit} = 0;
@@ -165,6 +165,11 @@ subtest 'Filter items tests' => sub {
holdingbranch => 'MPL', },
$biblionumber
);
+ my ($item3_bibnum, $item3_bibitemnum, $item3_itemnumber) = AddItem(
+ { homebranch => 'IPT',
+ holdingbranch => 'IPT', },
+ $biblionumber
+ );
# Testing the branch filter
my @shouldBeItem2 = C4::Items::GetItemsInfo($biblionumber, {branch => 'MPL'});
@@ -177,6 +182,10 @@ subtest 'Filter items tests' => sub {
# Testing the limit filter
@shouldBeEmpty = C4::Items::GetItemsInfo($biblionumber, {limit => 0});
is( scalar(@shouldBeEmpty), 0, "Filtering by limit");
+
+ # Testing the itemnumber filter
+ my @shouldBeItem3 = C4::Items::GetItemsInfo($biblionumber, {itemnumber => $item3_itemnumber});
+ is( $shouldBeItem3[0]->{itemnumber}, $item3_itemnumber, "Filtering by itemnumber");
};
# Helper method to set up a Biblio.
--