From 59fdbd618cfc67b1e1cdd76f36af166f25c274ac Mon Sep 17 00:00:00 2001
From: Jonathan Druart <jonathan.druart@bugs.koha-community.org>
Date: Mon, 1 Aug 2022 08:59:53 +0200
Subject: [PATCH] Bug 27272: Fix availability - OPAC

Has to move some code to a method
---
 Koha/Item.pm                                  | 21 +++++++++++++++++++
 .../en/includes/item-status-schema-org.inc    |  2 +-
 .../bootstrap/en/includes/item-status.inc     |  9 ++++----
 .../bootstrap/en/modules/opac-detail.tt       |  2 +-
 opac/opac-detail.pl                           | 12 +----------
 t/db_dependent/Koha/Item.t                    |  5 ++++-
 6 files changed, 33 insertions(+), 18 deletions(-)

diff --git a/Koha/Item.pm b/Koha/Item.pm
index b3ac362334..e2822cf7da 100644
--- a/Koha/Item.pm
+++ b/Koha/Item.pm
@@ -44,6 +44,7 @@ use Koha::ItemTypes;
 use Koha::Libraries;
 use Koha::Patrons;
 use Koha::Plugins;
+use Koha::Recalls;
 use Koha::Result::Boolean;
 use Koha::SearchEngine::Indexer;
 use Koha::StockRotationItem;
@@ -925,6 +926,26 @@ sub has_pending_hold {
     return $pending_hold->count ? 1: 0;
 }
 
+=head3 has_pending_recall {
+
+  my $has_pending_recall
+
+Return if whether has pending recall of not.
+
+=cut
+
+sub has_pending_recall {
+    my ( $self ) = @_;
+
+    # FIXME Must be moved to $self->recalls
+    return Koha::Recalls->search(
+        {
+            item_id   => $self->itemnumber,
+            status    => 'waiting',
+        }
+    )->count;
+}
+
 =head3 as_marc_field
 
     my $field = $item->as_marc_field;
diff --git a/koha-tmpl/opac-tmpl/bootstrap/en/includes/item-status-schema-org.inc b/koha-tmpl/opac-tmpl/bootstrap/en/includes/item-status-schema-org.inc
index cd01e72fb6..66e4f3656e 100644
--- a/koha-tmpl/opac-tmpl/bootstrap/en/includes/item-status-schema-org.inc
+++ b/koha-tmpl/opac-tmpl/bootstrap/en/includes/item-status-schema-org.inc
@@ -1,4 +1,4 @@
-[% IF ( item.damaged or item.datedue or item.itemlost or item.transfertwhen or item.waiting ) %]
+[% IF ( item.damaged or item.checkout.date_due or item.itemlost or item.transfertwhen or item.waiting ) %]
     <link property="availability" href="http://schema.org/OutOfStock" />
 [% ELSIF ( item.withdrawn ) %]
     <link property="availability" href="http://schema.org/Discontinued" />
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 314798f928..febdda5a15 100644
--- a/koha-tmpl/opac-tmpl/bootstrap/en/includes/item-status.inc
+++ b/koha-tmpl/opac-tmpl/bootstrap/en/includes/item-status.inc
@@ -18,8 +18,8 @@
 [% END %]
 
 [% IF item.isa('Koha::Item') %]
-    [% SET datedue = issue.date_due %]
-    [% SET onsite_checkout = issue.onsite_checkout %]
+    [% SET datedue = item.checkout.date_due %]
+    [% SET onsite_checkout = item.checkout.onsite_checkout %]
 [% ELSE %]
     [% SET datedue = item.datedue || issue.date_due %]
     [% SET onsite_checkout = item.onsite_checkout %]
@@ -39,7 +39,8 @@
             <span class="item-status checkedout">Checked out</span>
         [% END %]
     [% END %]
-    [% IF item.avail_for_recall %]<a href="/cgi-bin/koha/opac-recall.pl?biblionumber=[% item.biblionumber | uri %]" class="btn btn-default btn-xs">Recall</a>[% END %]
+    [%# FIXME We should move avail_for_recall to a Koha::Item method %]
+    [% IF !item.isa('Koha::Item') AND item.avail_for_recall %]<a href="/cgi-bin/koha/opac-recall.pl?biblionumber=[% item.biblionumber | uri %]" class="btn btn-default btn-xs">Recall</a>[% END %]
 [% END %]
 
 [% IF NOT ( item.isa('Koha::Item') ) AND item.transfertwhen %] [%# transfertwhen is set in C4::Search, do not have it for course reserves %]
@@ -100,7 +101,7 @@
     <span class="item-status pendinghold">Pending hold</span>
 [% END %]
 
-[% IF item.has_pending_recall %]
+[% IF Koha.Preference('UseRecalls') && item.has_pending_recall %]
     [% SET itemavailable = 0 %]
     <span class="item-status pendingrecall">Pending recall</span>
 [% END %]
diff --git a/koha-tmpl/opac-tmpl/bootstrap/en/modules/opac-detail.tt b/koha-tmpl/opac-tmpl/bootstrap/en/modules/opac-detail.tt
index 673bc22c0d..26e38a5729 100644
--- a/koha-tmpl/opac-tmpl/bootstrap/en/modules/opac-detail.tt
+++ b/koha-tmpl/opac-tmpl/bootstrap/en/modules/opac-detail.tt
@@ -1342,7 +1342,7 @@
                     </td>
                 [% END # /IF itemdata_uri %]
                 [% IF ( itemdata_copynumber ) %]<td class="copynumber">[% ITEM_RESULT.copynumber | html %]</td>[% END %]
-                <td class="status">[% INCLUDE 'item-status-schema-org.inc' item = ITEM_RESULT %][% INCLUDE 'item-status.inc' item = ITEM_RESULT %]</td>
+                <td class="status">[% INCLUDE 'item-status-schema-org.inc' item = ITEM_RESULT.object %][% INCLUDE 'item-status.inc' item = ITEM_RESULT.object %]</td>
                 [% IF ( itemdata_itemnotes ) %]<td class="notes" property="description">[% ITEM_RESULT.itemnotes | $raw %]</td>[% END %]
                 [% IF ITEM_RESULT.checkout %]
                     <td class="date_due" data-order="[% ITEM_RESULT.checkout.date_due | html %]">[% ITEM_RESULT.checkout.date_due | $KohaDates as_due_date => 1 %]</td>
diff --git a/opac/opac-detail.pl b/opac/opac-detail.pl
index 4590c1dbdc..7bb7f192eb 100755
--- a/opac/opac-detail.pl
+++ b/opac/opac-detail.pl
@@ -79,7 +79,6 @@ use Koha::Virtualshelves;
 use Koha::Patrons;
 use Koha::Plugins;
 use Koha::Ratings;
-use Koha::Recalls;
 use Koha::Reviews;
 use Koha::Serial::Items;
 use Koha::SearchEngine::Search;
@@ -729,22 +728,13 @@ else {
         }
 
         $item_info->{checkout} = $item->checkout;
+        $item_info->{object} = $item;
 
         my $reserve_status =
           C4::Reserves::GetReserveStatus( $item->itemnumber );
         if ( $reserve_status eq "Waiting"  ) { $item_info->{'waiting'} = 1; }
         if ( $reserve_status eq "Reserved" ) { $item_info->{'onhold'}  = 1; }
 
-        if ( C4::Context->preference('UseRecalls') ) {
-            my $pending_recall_count = Koha::Recalls->search(
-                {
-                    item_id   => $item->itemnumber,
-                    status    => 'waiting',
-                }
-            )->count;
-            if ( $pending_recall_count ) { $item_info->has_pending_recall = 1; }
-        }
-
         my ( $transfertwhen, $transfertfrom, $transfertto ) =
           GetTransfers( $item->itemnumber );
         if ( defined($transfertwhen) && $transfertwhen ne '' ) {
diff --git a/t/db_dependent/Koha/Item.t b/t/db_dependent/Koha/Item.t
index 55cface4cf..4ad1604f60 100755
--- a/t/db_dependent/Koha/Item.t
+++ b/t/db_dependent/Koha/Item.t
@@ -1483,7 +1483,7 @@ subtest 'store() tests' => sub {
 
 subtest 'Recalls tests' => sub {
 
-    plan tests => 20;
+    plan tests => 22;
 
     $schema->storage->txn_begin;
 
@@ -1654,6 +1654,7 @@ subtest 'Recalls tests' => sub {
         }
     )->store;
     $recall2->set_waiting( { item => $item1 } );
+    is( $item1->has_pending_recall, 1, 'Item has pending recall' );
 
     # return a waiting recall
     my $check_recall = $item1->check_recalls;
@@ -1661,6 +1662,8 @@ subtest 'Recalls tests' => sub {
 
     $recall2->revert_waiting;
 
+    is( $item1->has_pending_recall, 0, 'Item does not have pending recall' );
+
     # return recall based on recalldate
     $check_recall = $item1->check_recalls;
     is( $check_recall->patron_id, $patron1->borrowernumber, "No waiting recall, so oldest recall is returned" );
-- 
2.37.1