@@ -, +, @@ an alert pops up warning the you've reached the maximum. Confirm that when you close the alert, the checkbox unchecks itself. --- .../prog/en/modules/reserve/request.tt | 45 ++++++++++++++++---- reserve/placerequest.pl | 48 +++++++++++++--------- reserve/request.pl | 30 ++++++++++++-- 3 files changed, 91 insertions(+), 32 deletions(-) --- a/koha-tmpl/intranet-tmpl/prog/en/modules/reserve/request.tt +++ a/koha-tmpl/intranet-tmpl/prog/en/modules/reserve/request.tt @@ -471,10 +471,10 @@ - [% IF remaining_holds_for_record > 1 %] + [% IF lowest_value > 1 %]
  • - +
  • [% ELSE %] @@ -559,9 +559,9 @@ Hold must be record level [% ELSIF ( itemloo.available ) %] - + [% ELSIF ( itemloo.override ) %] - + [% ELSE %] @@ -1015,6 +1015,8 @@ cannotBeTransferred: _("Cannot be transferred to pickup library") } columns_settings_borrowers_table = [% TablesSettings.GetColumns( 'circ', 'circulation', 'table_borrowers', 'json' ) | $raw %]; + var MSG_EXCEEDED_MAX_HOLDS = __("Patron reached the maximum number of holds."); + var max_holds = "[% lowest_value | $raw %]"; $(document).ready(function() { $('#cancellation-reason-fieldset').hide(); @@ -1273,23 +1275,48 @@ if(this.checked){ $("input[name=checkitem]").each(function() { $(this).prop("checked", false); + $("#holds_to_place_count").val('1'); }); } }); $("input[name=checkitem]").click(function() { - onechecked = 0; + numchecked = 0; $("input[name=checkitem]").each(function() { if(this.checked){ - onechecked = 1; + numchecked++; } }); - if(onechecked == 1){ - $("#requestany").prop("checked", false); - $("#holds_to_place_count").prop('disabled', true); + if(numchecked > 0){ + if ( numchecked > max_holds ) { + alert(MSG_EXCEEDED_MAX_HOLDS); + $(this).prop('checked',false); + } else { + $("#requestany").prop("checked", false); + $("#holds_to_place_count").prop('disabled', true); + $("#holds_to_place_count").val(numchecked); + } } else { $("#requestany").prop("checked",true); $("#holds_to_place_count").prop('disabled', false); } + if ( remainingHold - numchecked <= 0 ) { + alert(MSG_EXCEEDED_HOLDS_PER_RECORD); + [% IF !Koha.Preference('AllowHoldPolicyOverride') %] + $('input[name=checkitem]:not(:checked)').attr('disabled','disabled'); + [% END %] + } + if ( remainingHoldsToday - numchecked <= 0 ) { + alert(MSG_EXCEEDED_HOLDS_PER_DAY); + [% IF !Koha.Preference('AllowHoldPolicyOverride') %] + $('input[name=checkitem]:not(:checked)').attr('disabled','disabled'); + [% END %] + } + if ( maxreserves - numchecked <= 0 ) { + alert(MSG_EXCEEDED_MAXRESERVES_SYSPREF); + [% IF !Koha.Preference('AllowHoldPolicyOverride') %] + $('input[name=checkitem]:not(:checked)').attr('disabled','disabled'); + [% END %] + } }); var prev_rank_request; $("select[name=rank-request]").on("focus", function() { --- a/reserve/placerequest.pl +++ a/reserve/placerequest.pl @@ -49,7 +49,7 @@ my $startdate = $input->param('reserve_date') || ''; my @rank = $input->multi_param('rank-request'); my $type = $input->param('type'); my $title = $input->param('title'); -my $checkitem = $input->param('checkitem'); +my @checkitems = $input->multi_param('checkitem'); my $expirationdate = $input->param('expiration_date'); my $itemtype = $input->param('itemtype') || undef; my $non_priority = $input->param('non_priority'); @@ -62,6 +62,7 @@ $biblionumbers ||= $biblionumber . '/'; my $bad_bibs = $input->param('bad_bibs'); my $holds_to_place_count = $input->param('holds_to_place_count') || 1; +$holds_to_place_count = scalar( @checkitems ) if @checkitems; my %bibinfos = (); my @biblionumbers = split '/', $biblionumbers; @@ -72,7 +73,16 @@ foreach my $bibnum (@biblionumbers) { $bibinfos{$bibnum} = \%bibinfo; } -my $found; +my @found; +unless ( C4::Context->preference('ReservesNeedReturns') ) { + foreach my $checkitem ( @checkitems ) { + # if we have an item selected, and the pickup branch is the same as + # the holdingbranch of the doc, we force the value $rank and $found + $rank[0] = '0'; + my $item = Koha::Items->find( $checkitem ); + push @found, ( $item->holdingbranch eq $branch ? 'W' : undef ); + } +} if ( $type eq 'str8' && $borrower ) { @@ -91,14 +101,9 @@ if ( $type eq 'str8' && $borrower ) { } my $can_override = C4::Context->preference('AllowHoldPolicyOverride'); - if ( defined $checkitem && $checkitem ne '' ) { - - my $item = Koha::Items->find($checkitem); - - if ( $item->biblionumber ne $biblionumber ) { - $biblionumber = $item->biblionumber; - } - + if ( @checkitems and @checkitems == 1 ) { + # item-level hold + my $item = Koha::Items->find( $checkitems[0] ); my $can_item_be_reserved = CanItemBeReserved($borrower->{'borrowernumber'}, $item->itemnumber, $branch)->{status}; if ( $can_item_be_reserved eq 'OK' || ( $can_item_be_reserved ne 'itemAlreadyOnHold' && $can_override ) ) { @@ -112,8 +117,8 @@ if ( $type eq 'str8' && $borrower ) { expiration_date => $expirationdate, notes => $notes, title => $title, - itemnumber => $checkitem, - found => $found, + itemnumber => $checkitems[0], + found => $found[0], itemtype => $itemtype, non_priority => $non_priority, } @@ -121,7 +126,8 @@ if ( $type eq 'str8' && $borrower ) { } - } elsif (@biblionumbers > 1) { + } elsif ( @biblionumbers > 1 ) { + # hold on multiple titles (multi-hold) my $bibinfo = $bibinfos{$biblionumber}; if ( $can_override || CanBookBeReserved($borrower->{'borrowernumber'}, $biblionumber)->{status} eq 'OK' ) { AddReserve( @@ -134,8 +140,8 @@ if ( $type eq 'str8' && $borrower ) { expiration_date => $expirationdate, notes => $notes, title => $bibinfo->{title}, - itemnumber => $checkitem, - found => $found, + itemnumber => undef, + found => undef, itemtype => $itemtype, non_priority => $non_priority, } @@ -144,20 +150,24 @@ if ( $type eq 'str8' && $borrower ) { } else { # place a request on 1st available for ( my $i = 0 ; $i < $holds_to_place_count ; $i++ ) { + my $item; + if ( $checkitems[$i] ) { + $item = Koha::Items->find( $checkitems[$i] ); + } if ( $can_override || CanBookBeReserved($borrower->{'borrowernumber'}, $biblionumber)->{status} eq 'OK' ) { AddReserve( { branchcode => $branch, borrowernumber => $borrower->{'borrowernumber'}, - biblionumber => $biblionumber, + biblionumber => ( $item ? $item->biblionumber : $biblionumber ), priority => $rank[0], reservation_date => $startdate, expiration_date => $expirationdate, notes => $notes, title => $title, - itemnumber => $checkitem, - found => $found, - itemtype => $itemtype, + itemnumber => $checkitems[$i], + found => $found[$i], + itemtype => ( $item ? $item->effective_itemtype : undef ), non_priority => $non_priority, } ); --- a/reserve/request.pl +++ a/reserve/request.pl @@ -30,6 +30,7 @@ use Modern::Perl; use CGI qw ( -utf8 ); use List::MoreUtils qw/uniq/; +use List::Util qw[min max]; use Date::Calc qw/Date_to_Days/; use C4::Output; use C4::Auth; @@ -343,11 +344,32 @@ foreach my $biblionumber (@biblionumbers) { # we must find out what the maximum number of holds they can place for the patron is my $max_holds_for_record = GetMaxPatronHoldsForRecord( $patron->borrowernumber, $biblionumber ); my $remaining_holds_for_record = $max_holds_for_record - $holds->count(); - $biblioloopiter{remaining_holds_for_record} = $max_holds_for_record; - $template->param( max_holds_for_record => $max_holds_for_record ); - $template->param( remaining_holds_for_record => $remaining_holds_for_record ); - } + # Determine how many holds the patron can place per day on this biblio record. + # Then calculate how many holds the patron can place subtracting holds already placed today + my $today_holds = Koha::Holds->search({ + borrowernumber => $patron->borrowernumber, + reservedate => dt_from_string->date, + })->count; + + my $biblio_obj = Koha::Biblios->find( $biblionumber ); + my $holds_allowed_on_record_today = $biblio_obj->allowed_holds( $patron ); + my $remaining_holds_allowed_today = $holds_allowed_on_record_today - $today_holds; + my $maxreserves = C4::Context->preference('maxreserves'); + + $biblioloopiter{remaining_holds_for_record} = $remaining_holds_for_record; + $biblioloopiter{remaining_holds_allowed_today} = $remaining_holds_allowed_today; + + # Determine what is the lowest value + my $lowestvalue = min( $maxreserves, $remaining_holds_for_record, $remaining_holds_allowed_today ); + + $template->param( + max_holds_for_record => $max_holds_for_record, + remaining_holds_for_record => $remaining_holds_for_record, + lowest_value => $lowestvalue, + remaining_holds_allowed_today => $remaining_holds_allowed_today, + ); + } my $count = Koha::Holds->search( { biblionumber => $biblionumber } )->count(); my $totalcount = $count; --