From b408c1cf93e7d41c15d603f12b21989199b2fae4 Mon Sep 17 00:00:00 2001
From: Thibaud Guillot <thibaud.guillot@biblibre.com>
Date: Fri, 9 Jun 2023 12:31:23 +0200
Subject: [PATCH] Bug 13870: Add warn about linked order or/and subscription on
 batch item table

When you try to manage/delete/edit items I added an info about linked
order or/and linked subscription.

Test plan :

1) Apply this patch
2) Restart_all
3) Be sure to have item with order or can concern by a subscription
4) On biblio record page click on Edit -> Manage items
5) See the yellow triangle next to the 'delete' action in 'actions'
dropdown menu (with subscription id or ordernumber hover the symbol)
6) When you edit or delete items (batch mode) you can see two new
columns about orders and subscriptions linked.

Sponsored by: BibLibre
---
 cataloguing/additem.pl                        | 20 ++++++++++++---
 .../prog/en/includes/html_helpers.inc         | 20 ++++++++++++++-
 .../prog/en/modules/cataloguing/additem.tt    | 13 +++++++++-
 tools/batchMod.pl                             | 25 ++++++++++++++++---
 4 files changed, 70 insertions(+), 8 deletions(-)

diff --git a/cataloguing/additem.pl b/cataloguing/additem.pl
index 3d361ec1e63..c965811e4b5 100755
--- a/cataloguing/additem.pl
+++ b/cataloguing/additem.pl
@@ -30,8 +30,9 @@ use C4::Biblio      qw( GetFrameworkCode GetMarcFromKohaField GetMarcStructure I
 use C4::Circulation qw( barcodedecode LostItem );
 use C4::Context;
 use C4::Members;
-use C4::Output qw( output_and_exit_if_error output_and_exit output_html_with_http_headers );
-use C4::Search qw( enabled_staff_search_views );
+use C4::Output      qw( output_and_exit_if_error output_and_exit output_html_with_http_headers );
+use C4::Search      qw( enabled_staff_search_views );
+use C4::Acquisition qw( GetOrderFromItemnumber );
 use Koha::Biblios;
 use Koha::Item::Templates;
 use Koha::ItemTypes;
@@ -42,6 +43,8 @@ use Koha::Patrons;
 use Koha::SearchEngine::Indexer;
 use Koha::UI::Form::Builder::Item;
 use Koha::Result::Boolean;
+use Koha::Serial::Items;
+use Koha::Subscriptions;
 
 use Encode          qw( encode_utf8 );
 use List::MoreUtils qw( any uniq );
@@ -680,8 +683,18 @@ if ($op) {
 # now, build existiing item list
 
 my @items;
+my %warning_messages;
 for my $item ( $biblio->items->as_list, $biblio->host_items->as_list ) {
-    my $i = $item->columns_to_str;
+    my $i          = $item->columns_to_str;
+    my $i_order    = GetOrderFromItemnumber( $i->{itemnumber} );
+    my $i_serialid = Koha::Serial::Items->find( { itemnumber => $i->{itemnumber} }, { prefetch => 'serialid' } );
+    if ($i_order) {
+        $warning_messages{ $i->{itemnumber} } =
+            sprintf( 'There is an order (ordernumber %s) on this item', $i_order->{ordernumber} );
+    }
+    if ($i_serialid) {
+        $warning_messages{ $i->{itemnumber} } = 'A subscription is linked to this item';
+    }
     $i->{nomod} = 1 unless $patron->can_edit_items_from( $item->homebranch );
     push @items, $i;
 }
@@ -807,6 +820,7 @@ $template->param(
     barcode          => $current_item->{barcode},
     op               => $nextop,
     popup            => scalar $input->param('popup') ? 1 : 0,
+    warning_messages => \%warning_messages,
     C4::Search::enabled_staff_search_views,
 );
 $template->{'VARS'}->{'searchid'} = $searchid;
diff --git a/koha-tmpl/intranet-tmpl/prog/en/includes/html_helpers.inc b/koha-tmpl/intranet-tmpl/prog/en/includes/html_helpers.inc
index fc0f4cae1e7..92fd9031638 100644
--- a/koha-tmpl/intranet-tmpl/prog/en/includes/html_helpers.inc
+++ b/koha-tmpl/intranet-tmpl/prog/en/includes/html_helpers.inc
@@ -324,6 +324,8 @@
                     [% END %]
                     <th class="anti-the">Title</th>
                     <th class="holds_count" title="Item holds / Total holds">Holds</th>
+                    <th class="linked_order" title="Linked order">Linked order</th>
+                    <th class="linked_subscription" title="Linked subscription">Linked subscription</th>
                     [% FOREACH item_header IN headers %]
                         [% IF item_header.column_name %]
                             <th data-colname="[% item_header.column_name | html %]"> [% item_header.header_value | html %] </th>
@@ -336,7 +338,9 @@
             <tbody>
                 [% FOREACH item IN items %]
                     [% SET can_be_edited = !item.nomod && !( Koha.Preference('IndependentBranches') && ! logged_in_user && item.homebranch != Branches.GetLoggedInBranchname() ) %]
-
+                    [% SET current_itemnumber = item.itemnumber %]
+                    [% SET linked_order = linked_orders_subscriptions.$current_itemnumber %]
+                    [% SET linked_subscription = linked_orders_subscriptions.$current_itemnumber.subscription %]
                     <tr>
                         <td>[% item.index + 1 | html %]</td>
                         [% IF checkboxes_edit %]
@@ -410,6 +414,20 @@
                                 [% END %]
                             </a>
                         </td>
+                        <td class="linked_order">
+                            [% IF linked_order.ordernumber %]
+                                <a href="/cgi-bin/koha/acqui/basket.pl?basketno=[% linked_order.basket | uri %]" title="See basket details">[% linked_order.ordernumber | html %]</a>
+                            [% ELSE %]
+                                <span>None</span>
+                            [% END %]
+                        </td>
+                        <td class="linked_subscription">
+                            [% IF linked_subscription %]
+                                <a href="/cgi-bin/koha/serials/subscription-detail.pl?subscriptionid=[% linked_subscription | uri %]" title="Subscription id [% linked_subscription | html %]">Subscription details</a>
+                            [% ELSE %]
+                                <span>None</span>
+                            [% END %]
+                        </td>
                         [% FOREACH header IN headers %]
                             [% SET attribute = header.attribute %]
                             [% IF header.attribute AND date_fields.grep('^' _ attribute _ '$').size %]
diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/cataloguing/additem.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/cataloguing/additem.tt
index 90fe28057ea..5b1f9a8f834 100644
--- a/koha-tmpl/intranet-tmpl/prog/en/modules/cataloguing/additem.tt
+++ b/koha-tmpl/intranet-tmpl/prog/en/modules/cataloguing/additem.tt
@@ -117,6 +117,8 @@
                         [% FOREACH item IN items %]
                             [% SET can_be_edited = ! ( Koha.Preference('IndependentBranches') && ! logged_in_user.is_superlibrarian && item.homebranch != Branches.GetLoggedInBranchname() ) %]
                             [% SET tr_class = '' %]
+                            [% SET current_itemnumber = item.itemnumber %]
+                            [% SET warn_message = warning_messages.$current_itemnumber %]
                             [% IF item.itemnumber == itemnumber %]
                                 [% UNLESS can_be_edited %]
                                     [% SET tr_class='active' %]
@@ -184,7 +186,16 @@
                                                                 <input type="hidden" name="itemnumber" value="[% item.itemnumber | html %]" />
                                                                 <input type="hidden" name="searchid" value="[% searchid | html %]" />
                                                             </form>
-                                                            <a class="dropdown-item delete" data-item="[% item.itemnumber | html %]" href="#">Delete</a>
+                                                            <a
+                                                                class="dropdown-item delete"
+                                                                data-item="[% item.itemnumber | html %]"
+                                                                href="/cgi-bin/koha/cataloguing/additem.pl?op=delitem&amp;biblionumber=[% item.biblionumber | html %]&amp;itemnumber=[% item.itemnumber | html %]&amp;searchid=[% searchid | html %]"
+                                                                onclick="return confirm_deletion();"
+                                                                >Delete
+                                                                [% IF warn_message %]
+                                                                    <i class="fa fa-warning warn" Title="[% warn_message | html %]"></i>
+                                                                [% END %]
+                                                            </a>
                                                         </li>
                                                     [% END %]
                                                 [% END %]
diff --git a/tools/batchMod.pl b/tools/batchMod.pl
index 92f19d29298..3ea19b52ccf 100755
--- a/tools/batchMod.pl
+++ b/tools/batchMod.pl
@@ -25,6 +25,7 @@ use C4::Auth        qw( get_template_and_user haspermission );
 use C4::Output      qw( output_html_with_http_headers );
 use C4::Circulation qw( barcodedecode );
 use C4::Context;
+use C4::Acquisition qw( GetOrderFromItemnumber );
 use MARC::File::XML;
 use List::MoreUtils qw( uniq );
 use Encode          qw( encode_utf8 );
@@ -39,6 +40,8 @@ use Koha::BackgroundJob::BatchDeleteItem;
 use Koha::BackgroundJob::BatchUpdateItem;
 use Koha::UI::Form::Builder::Item;
 use Koha::UI::Table::Builder::Items;
+use Koha::Serial::Items;
+use Koha::Serials;
 
 my $input                             = CGI->new;
 my $dbh                               = C4::Context->dbh;
@@ -87,6 +90,7 @@ my $nextop = "";
 my $display_items;
 
 my @messages;
+my %linked_orders_subscriptions;
 
 if ( $op eq "cud-action" ) {
 
@@ -232,6 +236,20 @@ if ( $op eq "cud-show" || $op eq "show" ) {
         if ( defined $biblionumber && !@itemnumbers ) {
             my $biblio = Koha::Biblios->find($biblionumber);
             @itemnumbers = $biblio ? $biblio->items->get_column('itemnumber') : ();
+            foreach my $itemnumber (@itemnumbers) {
+                $linked_orders_subscriptions{$itemnumber} = [];
+                my $order     = GetOrderFromItemnumber($itemnumber);
+                my $serial_id = Koha::Serial::Items->search( { itemnumber => $itemnumber } )->get_column('serialid');
+                if ($order) {
+                    $linked_orders_subscriptions{$itemnumber} =
+                        { ordernumber => $order->{ordernumber}, basket => $order->{basketno} };
+                }
+                if ($serial_id) {
+                    my $subscription_id =
+                        Koha::Serials->search( { serialid => $serial_id } )->get_column('subscriptionid');
+                    $linked_orders_subscriptions{$itemnumber} = { subscription => $subscription_id };
+                }
+            }
         }
         if ( my $list = $input->param('barcodelist') ) {
             my @barcodelist = grep /\S/, ( split /[$split_chars]/, $list );
@@ -295,9 +313,10 @@ if ( $op eq "cud-show" || $op eq "show" ) {
 
     # what's the next op ? it's what we are not in : an add if we're editing, otherwise, and edit.
     $template->param(
-        subfields           => $subfields,
-        notfoundbarcodes    => \@notfoundbarcodes,
-        notfounditemnumbers => \@notfounditemnumbers
+        subfields                   => $subfields,
+        notfoundbarcodes            => \@notfoundbarcodes,
+        notfounditemnumbers         => \@notfounditemnumbers,
+        linked_orders_subscriptions => \%linked_orders_subscriptions,
     );
     $nextop = "cud-action";
     $template->param( show => 1 );
-- 
2.39.5