@@ -, +, @@ and that the checkout length is not reduced --- C4/Circulation.pm | 30 +++++++++--- circ/circulation.pl | 18 ++++++- .../prog/en/modules/circ/circulation.tt | 49 +++++++++++++++++-- .../{ => Circulation}/DecreaseLoanHighHolds.t | 22 +++++++-- 4 files changed, 100 insertions(+), 19 deletions(-) rename t/db_dependent/{ => Circulation}/DecreaseLoanHighHolds.t (85%) --- a/C4/Circulation.pm +++ a/C4/Circulation.pm @@ -657,7 +657,7 @@ sub itemissues { =head2 CanBookBeIssued ( $issuingimpossible, $needsconfirmation ) = CanBookBeIssued( $borrower, - $barcode, $duedatespec, $inprocess, $ignore_reserves ); + $barcode, $duedatespec, $inprocess, $ignore_reserves, $params ); Check if a book can be issued. @@ -674,6 +674,12 @@ C<$issuingimpossible> and C<$needsconfirmation> are some hashref. =item C<$inprocess> boolean switch =item C<$ignore_reserves> boolean switch +=item C<$params> Hashref of additional parameters + +Available keys: + override_high_holds - Ignore high holds + onsite_checkout - Checkout is an onsite checkout that will not leave the library + =back Returns : @@ -754,7 +760,8 @@ sub CanBookBeIssued { my %issuingimpossible; # filled with problems that causes the issue to be IMPOSSIBLE my %alerts; # filled with messages that shouldn't stop issuing, but the librarian should be aware of. - my $onsite_checkout = $params->{onsite_checkout} || 0; + my $onsite_checkout = $params->{onsite_checkout} || 0; + my $override_high_holds = $params->{override_high_holds} || 0; my $item = GetItem(GetItemnumberFromBarcode( $barcode )); my $issue = GetItemIssue($item->{itemnumber}); @@ -1068,11 +1075,20 @@ sub CanBookBeIssued { my $check = checkHighHolds( $item, $borrower ); if ( $check->{exceeded} ) { - $needsconfirmation{HIGHHOLDS} = { - num_holds => $check->{outstanding}, - duration => $check->{duration}, - returndate => output_pref( $check->{due_date} ), - }; + if ($override_high_holds) { + $alerts{HIGHHOLDS} = { + num_holds => $check->{outstanding}, + duration => $check->{duration}, + returndate => output_pref( $check->{due_date} ), + }; + } + else { + $needsconfirmation{HIGHHOLDS} = { + num_holds => $check->{outstanding}, + duration => $check->{duration}, + returndate => output_pref( $check->{due_date} ), + }; + } } } --- a/circ/circulation.pl +++ a/circ/circulation.pl @@ -65,6 +65,10 @@ my $query = new CGI; my $sessionID = $query->cookie("CGISESSID") ; my $session = get_session($sessionID); +my $override_high_holds = $query->param('override_high_holds'); +warn "OVER: $override_high_holds"; +my $override_high_holds_tmp = $query->param('override_high_holds_tmp'); + # branch and printer are now defined by the userenv # but first we have to check if someone has tried to change them @@ -300,8 +304,17 @@ if ($borrowernumber) { # if ($barcode) { # always check for blockers on issuing - my ( $error, $question, $alerts ) = - CanBookBeIssued( $borrower, $barcode, $datedue , $inprocess, undef, { onsite_checkout => $onsite_checkout } ); + my ( $error, $question, $alerts ) = CanBookBeIssued( + $borrower, + $barcode, $datedue, + $inprocess, + undef, + { + onsite_checkout => $onsite_checkout, + override_high_holds => $override_high_holds || $override_high_holds_tmp || 0, + } + ); + my $blocker = $invalidduedate ? 1 : 0; $template->param( alert => $alerts ); @@ -573,6 +586,7 @@ $template->param( canned_bor_notes_loop => $canned_notes, debarments => GetDebarments({ borrowernumber => $borrowernumber }), todaysdate => output_pref( { dt => dt_from_string()->set(hour => 23)->set(minute => 59), dateformat => 'sql' } ), + override_high_holds => $override_high_holds, ); output_html_with_http_headers $query, $cookie, $template->output; --- a/koha-tmpl/intranet-tmpl/prog/en/modules/circ/circulation.tt +++ a/koha-tmpl/intranet-tmpl/prog/en/modules/circ/circulation.tt @@ -206,6 +206,10 @@ $(document).ready(function() {
The patron has unpaid charges for reserves, rentals etc of [% alert.OTHER_CHARGES %]
[% END %] +[% IF alert.HIGHHOLDS %] +
High demand item. Loan period not shortened to [% alert.HIGHHOLDS.duration %] days (due [% alert.HIGHHOLDS.returndate %]) due to override.
+[% END %] + [% IF ( NEEDSCONFIRMATION ) %]
@@ -298,7 +302,7 @@ $(document).ready(function() { [% END %] -[% IF HIGHHOLDS %] +[% IF HIGHHOLDS %]
  • High demand item. Loan period shortened to [% HIGHHOLDS.duration %] days (due [% HIGHHOLDS.returndate %]). Check out anyway?
  • [% END %] @@ -313,11 +317,19 @@ $(document).ready(function() { [% IF HIGHHOLDS %] - + [% END %] [% IF CAN_user_circulate_force_checkout or HIGHHOLDS %] @@ -325,6 +337,13 @@ $(document).ready(function() { [% IF (forceallow) %][% END %] +[% IF HIGHHOLDS %] +

    + + +

    +[% END %] + [% IF ( RESERVED ) %]

    @@ -344,6 +363,7 @@ $(document).ready(function() { + [% IF ( DEBT ) %][% END %] [% IF ( INVALID_DATE ) %]

    @@ -636,6 +656,23 @@ No patron matched [% message %] [% END %] + + [% IF Koha.Preference('decreaseLoanHighHolds') %] + [% IF NEEDSCONFIRMATION %] + [% IF override_high_holds %] + + [% ELSE %] + + [% END %] + [% ELSE %] + [% IF override_high_holds %] + + [% ELSE %] + + [% END %] + [% END %] + + [% END %]

    [% UNLESS ( noissues && Koha.Preference('OnSiteCheckoutsForce') ) %] --- a/t/db_dependent/DecreaseLoanHighHolds.t +++ a/t/db_dependent/DecreaseLoanHighHolds.t @@ -27,7 +27,7 @@ use Koha::Item; use Koha::Holds; use Koha::Hold; -use Test::More tests => 12; +use Test::More tests => 14; my $dbh = C4::Context->dbh; my $schema = Koha::Database->new()->schema(); @@ -60,7 +60,13 @@ my $biblioitem = my @items; for my $i ( 1 .. 10 ) { - my $item = Koha::Item->new( { biblionumber => $biblio->id(), biblioitemnumber => $biblioitem->id(), } )->store(); + my $item = Koha::Item->new( + { + biblionumber => $biblio->id(), + biblioitemnumber => $biblioitem->id(), + barcode => $i, + } + )->store(); push( @items, $item ); } @@ -88,7 +94,7 @@ C4::Context->set_preference( 'decreaseLoanHighHoldsValue', 1 ); C4::Context->set_preference( 'decreaseLoanHighHoldsControl', 'static' ); C4::Context->set_preference( 'decreaseLoanHighHoldsIgnoreStatuses', 'damaged,itemlost,notforloan,withdrawn' ); -my $item_hr = { itemnumber => $item->id, biblionumber => $biblio->id, homebranch => 'MPL', holdingbranch => 'MPL' }; +my $item_hr = { itemnumber => $item->id, biblionumber => $biblio->id, homebranch => 'MPL', holdingbranch => 'MPL', barcode => $item->barcode }; my $patron_hr = { borrower => $patron->id, branchcode => 'MPL' }; my $data = C4::Circulation::checkHighHolds( $item_hr, $patron_hr ); @@ -101,7 +107,7 @@ C4::Context->set_preference( 'decreaseLoanHighHoldsControl', 'dynamic' ); $data = C4::Circulation::checkHighHolds( $item_hr, $patron_hr ); is( $data->{exceeded}, 0, "Should not exceed threshold" ); -for my $i ( 5 .. 10 ) { +for my $i ( 5 .. 11 ) { my $patron = $patrons[$i]; my $hold = Koha::Hold->new( { @@ -147,5 +153,13 @@ $unholdable->store(); $data = C4::Circulation::checkHighHolds( $item_hr, $patron_hr ); is( $data->{exceeded}, 1, "Should exceed threshold" ); +C4::Context->set_preference('CircControl', 'PatronLibrary'); + +my ( undef, $needsconfirmation ) = CanBookBeIssued( $patron_hr, $item->barcode ); +ok( $needsconfirmation->{HIGHHOLDS}, "High holds checkout needs confirmation" ); + +( undef, $needsconfirmation ) = CanBookBeIssued( $patron_hr, $item->barcode, undef, undef, undef, { override_high_holds => 1 } ); +ok( !$needsconfirmation->{HIGHHOLDS}, "High holds checkout does not need confirmation" ); + $schema->storage->txn_rollback(); 1; --