Bug 15505: Mark Hold Items 'On hold' instead of 'Available'
authorNick Clemens <nick@bywatersolutions.com>
Tue, 27 Dec 2016 17:07:20 +0000 (17:07 +0000)
committerNick Clemens <nick@bywatersolutions.com>
Fri, 19 Apr 2019 14:30:39 +0000 (14:30 +0000)
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

Signed-off-by: Liz Rea <wizzyrea@gmail.com>
Signed-off-by: Martin Renvoize <martin.renvoize@ptfs-europe.com>

Signed-off-by: Nick Clemens <nick@bywatersolutions.com>

C4/Items.pm
C4/XSLT.pm
koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/circulation.pref
koha-tmpl/opac-tmpl/bootstrap/en/includes/item-status.inc
koha-tmpl/opac-tmpl/bootstrap/en/xslt/MARC21slim2OPACResults.xsl
t/db_dependent/Items.t

index fdf262f..14fcdcf 100644 (file)
@@ -963,6 +963,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
@@ -975,6 +976,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'
index f434fa4..2d499cb 100644 (file)
@@ -293,10 +293,10 @@ 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";
-            } 
+            }
             if ( $item->{itemnotforloan} && $item->{itemnotforloan} > 0 || $item->{notforloan} && $item->{notforloan} > 0 || $item->{itype} && $itemtypes->{ $item->{itype} }->{notforloan} && $itemtypes->{ $item->{itype} }->{notforloan} == 1 ) {
                 $status = "reference";
             }
@@ -318,6 +318,9 @@ sub buildKohaItemsNamespace {
             if (defined $reservestatus && $reservestatus eq "Waiting") {
                 $status = 'Waiting';
             }
+            if ($item->{pending_hold}) {
+                $status = 'Pending hold';
+            }
         } else {
             $status = "available";
         }
index 1228077..41c7d77 100644 (file)
@@ -202,7 +202,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:
index 1fb9278..6b8dadc 100644 (file)
     <span class="item-status onorder">On order</span>
 [% END %]
 
+[% IF item.pending_hold %]
+    [% SET itemavailable = 0 %]
+    <span class="item-status pendinghold">Pending hold</span>
+[% END %]
+
 [% IF ( itemavailable ) %]
     [% IF NOT item.isa('Koha::Item') %][% SET restrictedvalueopac = item.restrictedvalueopac %][% END %]
     <span class="item-status available">Available [% IF restrictedvalueopac %]<span class="restricted">([% restrictedvalueopac | html %])</span>[% END %]</span>
index 7b858e1..7635c07 100644 (file)
                        <xsl:value-of select="count(key('item-by-status', 'On order'))"/>
                        <xsl:text>). </xsl:text>                   </span>
                    </xsl:if>
+                    <xsl:if test="count(key('item-by-status', 'Pending hold'))>0">
+                   <span class="unavailable">
+                       <xsl:text>Pending hold (</xsl:text>
+                       <xsl:value-of select="count(key('item-by-status', 'Pending hold'))"/>
+                       <xsl:text>). </xsl:text>                   </span>
+                   </xsl:if>
                     <xsl:if test="count(key('item-by-status', 'In transit'))>0">
                    <span class="unavailable">
                        <xsl:text>In transit (</xsl:text>
index 4744cff..aeb968f 100755 (executable)
@@ -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;
 };