From c37a22766c3e7df4af124b245493e72c07539431 Mon Sep 17 00:00:00 2001 From: Nick Clemens Date: Tue, 27 Dec 2016 17:07:20 +0000 Subject: [PATCH] Bug 15505 - Mark Hold Items 'On hold' instead of 'Available' This patch adds a 'pending hold' column to C4::Items:GetItemsInfo to allow for displaying status of an item when it has been selected for a hold by the holdsqueue and AllowItemsOnHoldCheckout is set to 'Don't allow' To test: 00 - Set AllowItemsOnHoldCheckout to 'Allow' 01 - Place a hold on an item 02 - Build the holdsqueue (kohadevbox example below) sudo koha-shell kohadev perl misc/cronjobs/holds/build_holds_queue.pl 03 - Search for the item on the OPAC 04 - Note item shows as 'Available' in results and details 05 - Toggle AllowItemsOnHOldCheckout to 'Don't allow' 06 - Repeat search, note there is no change 06 - Apply Patch 07 - Search for the item on the OPAC 08 - Note that item now shows as 'Pending hold' 09 - Toggle AllowItemsOnHoldCheckout to Allow 10 - Note item shows as available 11 - prove -v t/db_dependent/Items.t --- C4/Items.pm | 3 +++ C4/XSLT.pm | 6 +++++- .../prog/en/modules/admin/preferences/circulation.pref | 2 +- koha-tmpl/opac-tmpl/bootstrap/en/includes/item-status.inc | 5 +++++ .../bootstrap/en/xslt/MARC21slim2OPACResults.xsl | 6 ++++++ t/db_dependent/Items.t | 15 ++++++++++++++- 6 files changed, 34 insertions(+), 3 deletions(-) diff --git a/C4/Items.pm b/C4/Items.pm index d6d0a8093c..a91a6f51ef 100644 --- a/C4/Items.pm +++ b/C4/Items.pm @@ -1008,6 +1008,7 @@ sub GetItemsInfo { holding.opac_info as holding_branch_opac_info, home.opac_info as home_branch_opac_info "; + $query .= ",IF(tmp_holdsqueue.itemnumber,1,0) AS pending_hold" if !C4::Context->preference('AllowItemsOnHoldCheckout'); $query .= " FROM items LEFT JOIN branches AS holding ON items.holdingbranch = holding.branchcode @@ -1020,6 +1021,8 @@ sub GetItemsInfo { LEFT JOIN serial USING (serialid) LEFT JOIN itemtypes ON itemtypes.itemtype = " . (C4::Context->preference('item-level_itypes') ? 'items.itype' : 'biblioitems.itemtype'); + $query .= " + LEFT JOIN tmp_holdsqueue USING (itemnumber)" if !C4::Context->preference('AllowItemsOnHoldCheckout'); $query .= q| LEFT JOIN localization ON itemtypes.itemtype = localization.code AND localization.entity = 'itemtypes' diff --git a/C4/XSLT.pm b/C4/XSLT.pm index bf2647ab74..f2b4385c7f 100644 --- a/C4/XSLT.pm +++ b/C4/XSLT.pm @@ -27,6 +27,7 @@ use C4::Context; use C4::Items; use C4::Koha; use C4::Biblio; +use C4::HoldsQueue; use C4::Circulation; use C4::Reserves; use Koha::AuthorisedValues; @@ -293,7 +294,7 @@ sub buildKohaItemsNamespace { my $reservestatus = C4::Reserves::GetReserveStatus( $item->{itemnumber} ); if ( ( $item->{itype} && $itemtypes->{ $item->{itype} }->{notforloan} ) || $item->{notforloan} || $item->{onloan} || $item->{withdrawn} || $item->{itemlost} || $item->{damaged} || - (defined $transfertwhen && $transfertwhen ne '') || $item->{itemnotforloan} || (defined $reservestatus && $reservestatus eq "Waiting") ){ + (defined $transfertwhen && $transfertwhen ne '') || $item->{itemnotforloan} || (defined $reservestatus && $reservestatus eq "Waiting") || $item->{pending_hold} ){ if ( $item->{notforloan} < 0) { $status = "On order"; } @@ -318,6 +319,9 @@ sub buildKohaItemsNamespace { if (defined $reservestatus && $reservestatus eq "Waiting") { $status = 'Waiting'; } + if ($item->{pending_hold}) { + $status = 'Pending hold'; + } } else { $status = "available"; } diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/circulation.pref b/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/circulation.pref index 2d80bdd5c7..2b7073a181 100644 --- a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/circulation.pref +++ b/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/circulation.pref @@ -196,7 +196,7 @@ Circulation: choices: yes: Allow no: "Don't allow" - - checkouts of items reserved to someone else. If allowed do not generate RESERVE_WAITING and RESERVED warning. This allows self checkouts for those items. + - checkouts of items reserved to someone else. If allowed do not generate RESERVE_WAITING and RESERVED warning. This allows self checkouts for those items. If using the holds queue items with pending holds will be marked as "unavailable" if this set to "Don't Allow". - - pref: AllowItemsOnHoldCheckoutSCO choices: diff --git a/koha-tmpl/opac-tmpl/bootstrap/en/includes/item-status.inc b/koha-tmpl/opac-tmpl/bootstrap/en/includes/item-status.inc index 1fb9278da7..6b8dadcf4b 100644 --- a/koha-tmpl/opac-tmpl/bootstrap/en/includes/item-status.inc +++ b/koha-tmpl/opac-tmpl/bootstrap/en/includes/item-status.inc @@ -89,6 +89,11 @@ On order [% END %] +[% IF item.pending_hold %] + [% SET itemavailable = 0 %] + Pending hold +[% END %] + [% IF ( itemavailable ) %] [% IF NOT item.isa('Koha::Item') %][% SET restrictedvalueopac = item.restrictedvalueopac %][% END %] Available [% IF restrictedvalueopac %]([% restrictedvalueopac | html %])[% END %] diff --git a/koha-tmpl/opac-tmpl/bootstrap/en/xslt/MARC21slim2OPACResults.xsl b/koha-tmpl/opac-tmpl/bootstrap/en/xslt/MARC21slim2OPACResults.xsl index abaf7dd5f9..028bc21759 100644 --- a/koha-tmpl/opac-tmpl/bootstrap/en/xslt/MARC21slim2OPACResults.xsl +++ b/koha-tmpl/opac-tmpl/bootstrap/en/xslt/MARC21slim2OPACResults.xsl @@ -1299,6 +1299,12 @@ ). + + + Pending hold ( + + ). + In transit ( diff --git a/t/db_dependent/Items.t b/t/db_dependent/Items.t index e761db5afe..9f67c99521 100755 --- a/t/db_dependent/Items.t +++ b/t/db_dependent/Items.t @@ -251,7 +251,7 @@ subtest 'GetHiddenItemnumbers tests' => sub { subtest 'GetItemsInfo tests' => sub { - plan tests => 7; + plan tests => 9; $schema->storage->txn_begin; @@ -313,6 +313,19 @@ subtest 'GetItemsInfo tests' => sub { is( $results[0]->{ restrictedvalueopac }, "Restricted Access OPAC", 'GetItemsInfo returns a restricted value description (OPAC)' ); + t::lib::Mocks::mock_preference( 'AllowItemsOnHoldCheckout', 0 ); + #place item into holds queue + my $dbh = C4::Context->dbh; + $dbh->do(q{INSERT INTO tmp_holdsqueue (biblionumber, itemnumber, surname, borrowernumber ) VALUES (?, ?, "Zorro", 42)}, undef, $item_bibnum, $itemnumber); + @results = GetItemsInfo( $biblio->biblionumber ); + is( $results[0]->{ pending_hold }, "1", + 'Hold marked as pending/unavailable if not AllowItemsOnHoldCheckout' ); + t::lib::Mocks::mock_preference( 'AllowItemsOnHoldCheckout', 1 ); + @results = GetItemsInfo( $biblio->biblionumber ); + is( $results[0]->{ pending_hold }, undef, + 'Hold not marked as pending/unavailable if AllowItemsOnHoldCheckout' ); + + $schema->storage->txn_rollback; }; -- 2.11.0