@@ -, +, @@ --- C4/Reserves.pm | 2 ++ Koha/Holds.pm | 12 +++--------- koha-tmpl/intranet-tmpl/prog/en/modules/circ/returns.tt | 2 -- .../intranet-tmpl/prog/en/modules/reserve/request.tt | 6 +++--- t/db_dependent/Holds.t | 15 ++++++++++++++- 5 files changed, 22 insertions(+), 15 deletions(-) --- a/C4/Reserves.pm +++ a/C4/Reserves.pm @@ -2332,6 +2332,8 @@ sub GetReserveId { my $hold = Koha::Holds->search( $params )->next(); + return unless $hold; + return $hold->id(); } --- a/Koha/Holds.pm +++ a/Koha/Holds.pm @@ -71,15 +71,9 @@ that would prevent one or the other. sub forced_hold_level { my ($self) = @_; - my $force_hold_level; - - if ( $self->count() ) { - my $has_item_level_holds; - map { $has_item_level_holds ||= $_->itemnumber } $self->as_list(); - $force_hold_level = $has_item_level_holds ? 'item' : 'record'; - } - - return $force_hold_level; + return $self->search( { itemnumber => { '!=' => undef } } )->count() + ? 'item' + : 'record'; } =head3 type --- a/koha-tmpl/intranet-tmpl/prog/en/modules/circ/returns.tt +++ a/koha-tmpl/intranet-tmpl/prog/en/modules/circ/returns.tt @@ -309,7 +309,6 @@ $(document).ready(function () { - @@ -526,7 +525,6 @@ $(document).ready(function () { - --- a/koha-tmpl/intranet-tmpl/prog/en/modules/reserve/request.tt +++ a/koha-tmpl/intranet-tmpl/prog/en/modules/reserve/request.tt @@ -276,13 +276,13 @@ function checkMultiHold() { [% ELSIF ( exceeded_holds_per_record ) %]
  • Too many holds for this record: [% borrowerfirstname %] [% borrowersurname %] can only place a maximum of [% max_holds_for_record %] hold(s) on this record.
  • [% ELSIF ( alreadypossession ) %] -
  • [% borrowerfirstname %] [% borrowersurname %] is already in possession of one item [% borrowerfirstname %] [% borrowersurname %] is already in possession of one item.
  • [% ELSIF ( alreadyreserved ) %] -
  • [% borrowerfirstname %] [% borrowersurname %] already has a hold on this item
  • +
  • [% borrowerfirstname %] [% borrowersurname %] already has a hold on this item.
  • [% ELSIF ( ageRestricted ) %]
  • Age restricted
  • [% ELSIF ( none_available ) %] -
  • No items are available to be placed on hold
  • +
  • No items are available to be placed on hold.
  • [% ELSIF ( maxreserves ) %]
  • Too many holds: [% borrowerfirstname %] [% borrowersurname %] has too many holds.
  • [% END %] --- a/t/db_dependent/Holds.t +++ a/t/db_dependent/Holds.t @@ -8,7 +8,7 @@ use t::lib::TestBuilder; use C4::Context; use C4::Branch; -use Test::More tests => 60; +use Test::More tests => 61; use MARC::Record; use C4::Biblio; use C4::Items; @@ -339,6 +339,19 @@ ModItem({ damaged => 1 }, $item_bibnum, $itemnumber); t::lib::Mocks::mock_preference( 'AllowHoldsOnDamagedItems', 1 ); is( CanItemBeReserved( $borrowernumbers[0], $itemnumber), 'OK', "Patron can reserve damaged item with AllowHoldsOnDamagedItems enabled" ); ok( defined( ( CheckReserves($itemnumber) )[1] ), "Hold can be trapped for damaged item with AllowHoldsOnDamagedItems enabled" ); + +$hold = Koha::Hold->new( + { + borrowernumber => $borrowernumbers[0], + itemnumber => $itemnumber, + biblionumber => $item_bibnum, + } +)->store(); +is( CanItemBeReserved( $borrowernumbers[0], $itemnumber ), + 'itemAlreadyOnHold', + "Patron cannot place a second item level hold for a given item" ); +$hold->delete(); + t::lib::Mocks::mock_preference( 'AllowHoldsOnDamagedItems', 0 ); ok( CanItemBeReserved( $borrowernumbers[0], $itemnumber) eq 'damaged', "Patron cannot reserve damaged item with AllowHoldsOnDamagedItems disabled" ); ok( !defined( ( CheckReserves($itemnumber) )[1] ), "Hold cannot be trapped for damaged item with AllowHoldsOnDamagedItems disabled" ); --