@@ -, +, @@
---
.../prog/en/modules/reserve/request.tt | 11 ++-
reserve/request.pl | 73 +++++++++++++-------
2 files changed, 55 insertions(+), 29 deletions(-)
--- a/koha-tmpl/intranet-tmpl/prog/en/modules/reserve/request.tt
+++ a/koha-tmpl/intranet-tmpl/prog/en/modules/reserve/request.tt
@@ -237,14 +237,14 @@ function checkMultiHold() {
[% ELSE %]
-[% IF ( maxreserves || alreadyreserved || none_available || alreadypossession ) %]
+[% IF ( exceeded_maxreserves || alreadyreserved || none_available || alreadypossession ) %]
[% UNLESS ( multi_hold ) %]
Cannot place hold
[% ELSE %]
-
Cannot place hold on some items
+
Cannot place hold on some items
+ [% IF ( exceeded_maxreserves ) %]
+
Too many holds: [% borrowerfirstname %] [% borrowersurname %] can place [% new_reserves_allowed %] of the requested [% new_reserves_count %] holds for a maximum of [% maxreserves %] total holds.
+ [% END %]
[% END %]
--- a/reserve/request.pl
+++ a/reserve/request.pl
@@ -77,9 +77,9 @@ $findborrower = '' unless defined $findborrower;
$findborrower =~ s|,| |g;
my $borrowernumber_hold = $input->param('borrowernumber') || '';
my $messageborrower;
-my $maxreserves;
my $warnings;
my $messages;
+my $exceeded_maxreserves;
my $date = C4::Dates->today('iso');
my $action = $input->param('action');
@@ -116,23 +116,46 @@ if ($findborrower) {
}
}
+my @biblionumbers = ();
+my $biblionumbers = $input->param('biblionumbers');
+if ($multihold) {
+ @biblionumbers = split '/', $biblionumbers;
+} else {
+ push @biblionumbers, $input->param('biblionumber');
+}
+
+
# If we have the borrowernumber because we've performed an action, then we
# don't want to try to place another reserve.
if ($borrowernumber_hold && !$action) {
my $borrowerinfo = GetMember( borrowernumber => $borrowernumber_hold );
my $diffbranch;
my @getreservloop;
- my $count_reserv = 0;
# we check the reserves of the borrower, and if he can reserv a document
# FIXME At this time we have a simple count of reservs, but, later, we could improve the infos "title" ...
- my $number_reserves =
+ my $reserves_count =
GetReserveCount( $borrowerinfo->{'borrowernumber'} );
- if ( C4::Context->preference('maxreserves') && ($number_reserves >= C4::Context->preference('maxreserves')) ) {
- $warnings = 1;
- $maxreserves = 1;
+ my $new_reserves_count = scalar( @biblionumbers );
+
+ my $maxreserves = C4::Context->preference('maxreserves');
+ if ( $maxreserves
+ && ( $reserves_count + $new_reserves_count > $maxreserves ) )
+ {
+ my $new_reserves_allowed =
+ $maxreserves - $reserves_count > 0
+ ? $maxreserves - $reserves_count
+ : 0;
+ $warnings = 1;
+ $exceeded_maxreserves = 1;
+ $template->param(
+ new_reserves_allowed => $new_reserves_allowed,
+ new_reserves_count => $new_reserves_count,
+ reserves_count => $reserves_count,
+ maxreserves => $maxreserves,
+ );
}
# we check the date expiry of the borrower (only if there is an expiry date, otherwise, set to 1 (warn)
@@ -161,7 +184,6 @@ if ($borrowernumber_hold && !$action) {
borroweremail => $borrowerinfo->{'email'},
borroweremailpro => $borrowerinfo->{'emailpro'},
borrowercategory => $borrowerinfo->{'category'},
- borrowerreservs => $count_reserv,
cardnumber => $borrowerinfo->{'cardnumber'},
expiry => $expiry,
diffbranch => $diffbranch,
@@ -175,14 +197,6 @@ $template->param( messageborrower => $messageborrower );
# FIXME launch another time GetMember perhaps until
my $borrowerinfo = GetMember( borrowernumber => $borrowernumber_hold );
-my @biblionumbers = ();
-my $biblionumbers = $input->param('biblionumbers');
-if ($multihold) {
- @biblionumbers = split '/', $biblionumbers;
-} else {
- push @biblionumbers, $input->param('biblionumber');
-}
-
my $itemdata_enumchron = 0;
my @biblioloop = ();
foreach my $biblionumber (@biblionumbers) {
@@ -192,7 +206,9 @@ foreach my $biblionumber (@biblionumbers) {
my $dat = GetBiblioData($biblionumber);
unless ( CanBookBeReserved($borrowerinfo->{borrowernumber}, $biblionumber) ) {
- $maxreserves = 1;
+ $exceeded_maxreserves = 1; # note that exceeding the circ policy's hold
+ # limit is not the only reason CanBookBeReserved()
+ # can return false
}
my $alreadypossession;
@@ -289,15 +305,21 @@ foreach my $biblionumber (@biblionumbers) {
my $num_override = 0;
my $hiddencount = 0;
- $biblioitem->{description} =
- $itemtypes->{ $biblioitem->{itemtype} }{description};
- if($biblioitem->{biblioitemnumber} ne $biblionumber){
- $biblioitem->{hostitemsflag}=1;
- }
+ if ( $biblioitem->{biblioitemnumber} ne $biblionumber ) {
+ $biblioitem->{hostitemsflag} = 1;
+ }
+
$biblioloopiter{description} = $biblioitem->{description};
- $biblioloopiter{itypename} = $biblioitem->{description};
- $biblioloopiter{imageurl} =
- getitemtypeimagelocation('intranet', $itemtypes->{$biblioitem->{itemtype}}{imageurl});
+ $biblioloopiter{itypename} = $biblioitem->{description};
+ if ( $biblioitem->{itemtype} ) {
+
+ $biblioitem->{description} =
+ $itemtypes->{ $biblioitem->{itemtype} }{description};
+
+ $biblioloopiter{imageurl} =
+ getitemtypeimagelocation( 'intranet',
+ $itemtypes->{ $biblioitem->{itemtype} }{imageurl} );
+ }
foreach my $itemnumber ( @{ $itemnumbers_of_biblioitem{$biblioitemnumber} } ) {
my $item = $iteminfos_of->{$itemnumber};
@@ -411,6 +433,7 @@ foreach my $biblionumber (@biblionumbers) {
if (
$policy_holdallowed
+ && !$exceeded_maxreserves
&& !$item->{cantreserve}
&& IsAvailableForItemLevelRequest($itemnumber)
&& CanItemBeReserved(
@@ -575,7 +598,7 @@ foreach my $biblionumber (@biblionumbers) {
$template->param( biblioloop => \@biblioloop );
$template->param( biblionumbers => $biblionumbers );
-$template->param( maxreserves => $maxreserves );
+$template->param( exceeded_maxreserves => $exceeded_maxreserves );
if ($multihold) {
$template->param( multi_hold => 1 );
--