View | Details | Raw Unified | Return to bug 11157
Collapse All | Expand All

(-)a/C4/Items.pm (-2 / +7 lines)
Lines 1219-1225 $filter->{fromDate} = '01/01/2013'; #Filters only serial issues by the serialite Link Here
1219
$filter->{toDate} = '31/12/2014';   #Filters only serial issues by the serialitems.publisheddate
1219
$filter->{toDate} = '31/12/2014';   #Filters only serial issues by the serialitems.publisheddate
1220
                                          #The ending date in C4::Context->preference('dateformat') format
1220
                                          #The ending date in C4::Context->preference('dateformat') format
1221
$filter->{limit} = 15;              #Limits the returning set to this many items
1221
$filter->{limit} = 15;              #Limits the returning set to this many items
1222
1222
$filter->{itemnumber} = 165;        #Returns the item with this itemnumber
1223
                                          
1223
Filters are expected to be validated! If a filter is not defined, that filter is not present in the $filter-HASH
1224
Filters are expected to be validated! If a filter is not defined, that filter is not present in the $filter-HASH
1224
1225
1225
=cut
1226
=cut
Lines 1341-1347 sub GetItemsInfo { Link Here
1341
        }
1342
        }
1342
        push @$queryParams, $filter->{toDate};
1343
        push @$queryParams, $filter->{toDate};
1343
    }
1344
    }
1344
1345
    if (exists $filter->{itemnumber}) {
1346
        push @$queryParams, $filter->{itemnumber};
1347
        $query .= " AND items.itemnumber = ?";
1348
    }
1349
    
1345
    $query .= "ORDER BY home.branchname, items.enumchron, LPAD( items.copynumber, 8, '0' ), items.dateaccessioned DESC" ;
1350
    $query .= "ORDER BY home.branchname, items.enumchron, LPAD( items.copynumber, 8, '0' ), items.dateaccessioned DESC" ;
1346
    if (exists $filter->{limit}) {
1351
    if (exists $filter->{limit}) {
1347
        push @$queryParams, $filter->{limit};
1352
        push @$queryParams, $filter->{limit};
(-)a/koha-tmpl/opac-tmpl/prog/en/modules/opac-detail.tt (+9 lines)
Lines 132-137 Link Here
132
                    null,
132
                    null,
133
                [% END %]
133
                [% END %]
134
                [% IF ( ShowCourseReservesHeader ) %]null,[% END %]
134
                [% IF ( ShowCourseReservesHeader ) %]null,[% END %]
135
                [% IF ( isSerial ) %]null,[% END %]
135
            ]
136
            ]
136
        }));
137
        }));
137
138
Lines 1550-1555 YAHOO.util.Event.onContentReady("furtherm", function () { Link Here
1550
            <th>Item hold queue priority</th>
1551
            <th>Item hold queue priority</th>
1551
        [% END %]
1552
        [% END %]
1552
        [% IF ( ShowCourseReservesHeader ) %]<th id="item_coursereserves">Course reserves</th>[% END %]
1553
        [% IF ( ShowCourseReservesHeader ) %]<th id="item_coursereserves">Course reserves</th>[% END %]
1554
        [% IF ( isSerial ) %]<th id="placeItemLevelHoldTh">Reserve</th>[% END %]
1553
        </tr></thead>
1555
        </tr></thead>
1554
	    <tbody>[% FOREACH ITEM_RESULT IN items %]
1556
	    <tbody>[% FOREACH ITEM_RESULT IN items %]
1555
      [% IF ITEM_RESULT.this_branch %]
1557
      [% IF ITEM_RESULT.this_branch %]
Lines 1630-1635 YAHOO.util.Event.onContentReady("furtherm", function () { Link Here
1630
                [% END %]
1632
                [% END %]
1631
            </td>
1633
            </td>
1632
        [% END %]
1634
        [% END %]
1635
        [% IF isSerial %]
1636
            <td>
1637
                <a href="opac-reserve.pl?biblionumber=[% biblionumber %]&itemnumber=[% ITEM_RESULT.itemnumber %]">
1638
                    Place hold
1639
                </a>
1640
            </td>
1641
        [% END %]
1633
	    </tr>
1642
	    </tr>
1634
	    [% END %]</tbody>
1643
	    [% END %]</tbody>
1635
	</table>
1644
	</table>
(-)a/koha-tmpl/opac-tmpl/prog/en/modules/opac-reserve.tt (-2 / +7 lines)
Lines 425-430 Link Here
425
                            <!-- ITEM HOLDS -->
425
                            <!-- ITEM HOLDS -->
426
426
427
                                <li class="radio">
427
                                <li class="radio">
428
                                 [% UNLESS singleItemLevelHold %]
428
                                  [% UNLESS ( bibitemloo.holdable ) %]
429
                                  [% UNLESS ( bibitemloo.holdable ) %]
429
                                    <input type="radio" name="reqtype_[% bibitemloo.biblionumber %]"
430
                                    <input type="radio" name="reqtype_[% bibitemloo.biblionumber %]"
430
                                           id="reqany_[% bibitemloo.biblionumber %]"
431
                                           id="reqany_[% bibitemloo.biblionumber %]"
Lines 437-447 Link Here
437
                                           id="reqany_[% bibitemloo.biblionumber %]"
438
                                           id="reqany_[% bibitemloo.biblionumber %]"
438
                                           class="selectany"
439
                                           class="selectany"
439
                                           value="Any"
440
                                           value="Any"
440
                                           checked="checked"
441
                                           [% UNLESS singleItemLevelHold %] checked="checked" [% END %]
441
                                    />
442
                                    />
442
                                  [% END %]
443
                                  [% END %]
443
444
444
                                  <label for="reqany_[% bibitemloo.biblionumber %]">Next available copy</label>
445
                                  <label for="reqany_[% bibitemloo.biblionumber %]">Next available copy</label>
446
                                 [% END %][%# IF singleItemLevelHold %]
445
                                  [% UNLESS ( bibitemloo.holdable ) %]
447
                                  [% UNLESS ( bibitemloo.holdable ) %]
446
                                    <input type="radio" name="reqtype_[% bibitemloo.biblionumber %]"
448
                                    <input type="radio" name="reqtype_[% bibitemloo.biblionumber %]"
447
                                           id="reqspecific_[% bibitemloo.biblionumber %]"
449
                                           id="reqspecific_[% bibitemloo.biblionumber %]"
Lines 454-459 Link Here
454
                                           id="reqspecific_[% bibitemloo.biblionumber %]"
456
                                           id="reqspecific_[% bibitemloo.biblionumber %]"
455
                                           class="selectspecific"
457
                                           class="selectspecific"
456
                                           value="Specific"
458
                                           value="Specific"
459
                                           [% IF singleItemLevelHold %] checked="checked" [% END %]
457
                                    />
460
                                    />
458
                                  [% END %]
461
                                  [% END %]
459
                                  <label for="reqspecific_[% bibitemloo.biblionumber %]">A specific copy</label>
462
                                  <label for="reqspecific_[% bibitemloo.biblionumber %]">A specific copy</label>
Lines 489-495 Link Here
489
                              <td class="copy">
492
                              <td class="copy">
490
                                [% IF ( itemLoo.available ) %]
493
                                [% IF ( itemLoo.available ) %]
491
                                  <input type="radio" class="checkitem checkitem_[% bibitemloo.biblionumber %]" name="checkitem_[% bibitemloo.biblionumber %]"
494
                                  <input type="radio" class="checkitem checkitem_[% bibitemloo.biblionumber %]" name="checkitem_[% bibitemloo.biblionumber %]"
492
                                         value="[% itemLoo.itemnumber %]" />
495
                                         value="[% itemLoo.itemnumber %]"
496
                                         [% IF singleItemLevelHold %] checked="checked" [% END %]
497
                                         />
493
                                [% ELSE %]
498
                                [% ELSE %]
494
                                  <input disabled="disabled" type="radio" class="checkitem" name="checkitem" value="[% itemLoo.itemnumber %]" />
499
                                  <input disabled="disabled" type="radio" class="checkitem" name="checkitem" value="[% itemLoo.itemnumber %]" />
495
                                  <img src="/opac-tmpl/lib/famfamfam/silk/cross.png" alt="Cannot be put on hold" title="Cannot be put on hold" />
500
                                  <img src="/opac-tmpl/lib/famfamfam/silk/cross.png" alt="Cannot be put on hold" title="Cannot be put on hold" />
(-)a/opac/opac-detail.pl (-1 / +6 lines)
Lines 704-710 if ( $show_holds_count || $show_priority) { Link Here
704
}
704
}
705
$template->param( show_priority => $has_hold ) ;
705
$template->param( show_priority => $has_hold ) ;
706
706
707
my $norequests = 1;
707
my $norequests = 1; #"No requests"-flag hides the "Place hold"-link in opac-detail-sidebar.inc
708
my %itemfields;
708
my %itemfields;
709
my (@itemloop, @otheritemloop);
709
my (@itemloop, @otheritemloop);
710
my $currentbranch = C4::Context->userenv ? C4::Context->userenv->{branch} : undef;
710
my $currentbranch = C4::Context->userenv ? C4::Context->userenv->{branch} : undef;
Lines 769-774 for my $itm (@items) { Link Here
769
    }
769
    }
770
}
770
}
771
771
772
#There is no point in enabling "Place hold" for Serials.
773
# Placing a title-level hold for a Serial is crazy since we don't want "any" item but instead the specific volume and number.
774
# Also choosing an item-level hold from opac-reserve.pl is problematic since there could be thousands of items.
775
$norequests = 1 if $template->{VARS}->{'isSerial'};
776
772
# Display only one tab if one items list is empty
777
# Display only one tab if one items list is empty
773
if (scalar(@itemloop) == 0 || scalar(@otheritemloop) == 0) {
778
if (scalar(@itemloop) == 0 || scalar(@otheritemloop) == 0) {
774
    $template->param(SeparateHoldings => 0);
779
    $template->param(SeparateHoldings => 0);
(-)a/opac/opac-reserve.pl (-3 / +11 lines)
Lines 73-80 if ($borr->{reservefee} > 0){ Link Here
73
my $branches = GetBranches();
73
my $branches = GetBranches();
74
my $itemTypes = GetItemTypes();
74
my $itemTypes = GetItemTypes();
75
75
76
# There are two ways of calling this script, with a single biblio num
76
# There are three ways of calling this script, with a single biblio num
77
# or multiple biblio nums.
77
# or multiple biblio nums or as a itemhold, where the target item has already been chosen.
78
my $targetItemnumber = $query->param('itemnumber') ? $query->param('itemnumber') : undef;
79
$template->param('singleItemLevelHold' => 1);
78
my $biblionumbers = $query->param('biblionumbers');
80
my $biblionumbers = $query->param('biblionumbers');
79
my $reserveMode = $query->param('reserve_mode');
81
my $reserveMode = $query->param('reserve_mode');
80
if ($reserveMode && ($reserveMode eq 'single')) {
82
if ($reserveMode && ($reserveMode eq 'single')) {
Lines 127-134 foreach my $biblioNumber (@biblionumbers) { Link Here
127
129
128
    my $biblioData = GetBiblioData($biblioNumber);
130
    my $biblioData = GetBiblioData($biblioNumber);
129
    $biblioDataHash{$biblioNumber} = $biblioData;
131
    $biblioDataHash{$biblioNumber} = $biblioData;
132
    my @itemInfos;
130
133
131
    my @itemInfos = GetItemsInfo($biblioNumber);
134
    if ($targetItemnumber) { #We just want the one item so use the filters to find it!
135
        @itemInfos = GetItemsInfo($biblioNumber, {itemnumber => $targetItemnumber});
136
    }
137
    else {
138
        @itemInfos = GetItemsInfo($biblioNumber);
139
    }
132
140
133
    my $marcrecord= GetMarcBiblio($biblioNumber);
141
    my $marcrecord= GetMarcBiblio($biblioNumber);
134
142
(-)a/t/db_dependent/Items.t (-2 / +10 lines)
Lines 145-151 subtest 'GetHiddenItemnumbers tests' => sub { Link Here
145
145
146
subtest 'Filter items tests' => sub {
146
subtest 'Filter items tests' => sub {
147
147
148
    plan tests => 3;
148
    plan tests => 4;
149
149
150
    # Start transaction
150
    # Start transaction
151
    $dbh->{AutoCommit} = 0;
151
    $dbh->{AutoCommit} = 0;
Lines 165-170 subtest 'Filter items tests' => sub { Link Here
165
              holdingbranch => 'MPL', },
165
              holdingbranch => 'MPL', },
166
            $biblionumber
166
            $biblionumber
167
    );
167
    );
168
    my ($item3_bibnum, $item3_bibitemnum, $item3_itemnumber) = AddItem(
169
            { homebranch => 'IPT',
170
              holdingbranch => 'IPT', },
171
            $biblionumber
172
    );
168
173
169
    # Testing the branch filter
174
    # Testing the branch filter
170
    my @shouldBeItem2 = C4::Items::GetItemsInfo($biblionumber, {branch => 'MPL'});
175
    my @shouldBeItem2 = C4::Items::GetItemsInfo($biblionumber, {branch => 'MPL'});
Lines 177-182 subtest 'Filter items tests' => sub { Link Here
177
    # Testing the limit filter
182
    # Testing the limit filter
178
    @shouldBeEmpty = C4::Items::GetItemsInfo($biblionumber, {limit => 0});
183
    @shouldBeEmpty = C4::Items::GetItemsInfo($biblionumber, {limit => 0});
179
    is( scalar(@shouldBeEmpty), 0, "Filtering by limit");
184
    is( scalar(@shouldBeEmpty), 0, "Filtering by limit");
185
186
    # Testing the itemnumber filter
187
    my @shouldBeItem3 = C4::Items::GetItemsInfo($biblionumber, {itemnumber => $item3_itemnumber});
188
    is( $shouldBeItem3[0]->{itemnumber}, $item3_itemnumber, "Filtering by itemnumber");
180
};
189
};
181
190
182
# Helper method to set up a Biblio.
191
# Helper method to set up a Biblio.
183
- 

Return to bug 11157