Bug 32247: Exit holds queue builder if there are no holds on the biblio
authorNick Clemens <nick@bywatersolutions.com>
Thu, 17 Nov 2022 13:38:58 +0000 (13:38 +0000)
committerLucas Gass <lucas@bywatersolutions.com>
Thu, 19 Jan 2023 23:16:00 +0000 (23:16 +0000)
update_queue_for_biblio currently
1 - gets the holds on a bib
2 - gets the items available to fill any holds
3 - combines these to build the queue, exiting if there are no holds or items

If there are no holds at step 1, we don't need to do step 2 or 3
This patch simply deletes the queue for this biblio, then exits if there are no holds

To test:
prove -v t/db_dependent/Reserves.t t/db_dependent/Koha/Item.t t/db_dependent/Koha/Hold.t t/db_dependent/Koha/BackgroundJobs/BatchDeleteItem.t t/db_dependent/Koha/BackgroundJobs/BatchDeleteBiblio.t t/db_dependent/HoldsQueue.t t/db_dependent/Circulation_holdsqueue.t t/db_dependent/Biblio_holdsqueue.t t/db_dependent/Biblio.t

Signed-off-by: David Nind <david@davidnind.com>
Signed-off-by: Tomas Cohen Arazi <tomascohen@theke.io>
(cherry picked from commit 7502f520a4fbb71fc63e76307d1ad67f059dd213)
Signed-off-by: Martin Renvoize <martin.renvoize@ptfs-europe.com>
(cherry picked from commit d71eceba98866a99a6860f65fcd90ae6c23207cf)

Signed-off-by: Lucas Gass <lucas@bywatersolutions.com>
C4/HoldsQueue.pm

index f2eb1ee..4df3af9 100644 (file)
@@ -895,8 +895,21 @@ are allowed to be passed to avoid calculating them many times inside loops.
 
 sub update_queue_for_biblio {
     my ($args) = @_;
-
     my $biblio_id = $args->{biblio_id};
+    my $result;
+
+    # We need to empty the queue for this biblio unless CreateQueue has emptied the entire queue for rebuilding
+    if ( $args->{delete} ) {
+        my $dbh = C4::Context->dbh;
+
+        $dbh->do("DELETE FROM tmp_holdsqueue WHERE biblionumber=$biblio_id");
+        $dbh->do("DELETE FROM hold_fill_targets WHERE biblionumber=$biblio_id");
+    }
+
+    my $hold_requests   = GetPendingHoldRequestsForBib($biblio_id);
+    $result->{requests} = scalar( @{$hold_requests} );
+    # No need to check anything else if there are no holds to fill
+    return $result unless $result->{requests};
 
     my $branches_to_use = $args->{branches_to_use} // load_branches_to_pull_from( C4::Context->preference('UseTransportCostMatrix') );
     my $transport_cost_matrix;
@@ -908,20 +921,9 @@ sub update_queue_for_biblio {
         $transport_cost_matrix = $args->{transport_cost_matrix};
     }
 
-    if ( $args->{delete} ) {
-        my $dbh = C4::Context->dbh;
-
-        $dbh->do("DELETE FROM tmp_holdsqueue WHERE biblionumber=$biblio_id");
-        $dbh->do("DELETE FROM hold_fill_targets WHERE biblionumber=$biblio_id");
-    }
-
-    my $hold_requests   = GetPendingHoldRequestsForBib($biblio_id);
     my $available_items = GetItemsAvailableToFillHoldRequestsForBib( $biblio_id, $branches_to_use );
 
-    my $result = {
-        requests        => scalar( @{$hold_requests} ),
-        available_items => scalar( @{$available_items} ),
-    };
+    $result->{available_items}  = scalar( @{$available_items} );
 
     my $item_map = MapItemsToHoldRequests( $hold_requests, $available_items, $branches_to_use, $transport_cost_matrix );
     $result->{mapped_items} = scalar( keys %{$item_map} );