Bug 18001 - LocalHoldsPriority can cause multiple holds queue lines for same hold...
authorKyle M Hall <kyle@bywatersolutions.com>
Thu, 26 Jan 2017 14:31:35 +0000 (14:31 +0000)
committerKyle M Hall <kyle@bywatersolutions.com>
Fri, 21 Apr 2017 11:16:25 +0000 (07:16 -0400)
If LocalHoldsPriority is enabled, and a record level request has more
than one item that could fill that hold, there is a possibility that a
holds queue row will be generated for the request for each of the
available items!

Signed-off-by: Kyle M Hall <kyle@bywatersolutions.com>
Signed-off-by: Joel Sasse <jsasse@plumcreeklibrary.net>
Signed-off-by: Jonathan Druart <jonathan.druart@bugs.koha-community.org>
Signed-off-by: Kyle M Hall <kyle@bywatersolutions.com>
C4/HoldsQueue.pm

index e5f29c7..0f2ad22 100755 (executable)
@@ -397,6 +397,7 @@ sub MapItemsToHoldRequests {
           C4::Context->preference('LocalHoldsPriorityItemControl');
 
         foreach my $request (@$hold_requests) {
+            next if (defined($request->{itemnumber})); #skip item level holds in local priority checking
             last if $num_items_remaining == 0;
 
             my $local_hold_match;
@@ -422,7 +423,8 @@ sub MapItemsToHoldRequests {
 
                 if ($local_hold_match) {
                     if ( exists $items_by_itemnumber{ $item->{itemnumber} }
-                        and not exists $allocated_items{ $item->{itemnumber} } )
+                        and not exists $allocated_items{ $item->{itemnumber} }
+                        and not $request->{allocated})
                     {
                         $item_map{ $item->{itemnumber} } = {
                             borrowernumber => $request->{borrowernumber},
@@ -435,6 +437,7 @@ sub MapItemsToHoldRequests {
                             reservenotes => $request->{reservenotes},
                         };
                         $allocated_items{ $item->{itemnumber} }++;
+                        $request->{allocated} = 1;
                         $num_items_remaining--;
                     }
                 }
@@ -444,6 +447,7 @@ sub MapItemsToHoldRequests {
 
     foreach my $request (@$hold_requests) {
         last if $num_items_remaining == 0;
+        next if $request->{allocated};
 
         # is this an item-level request?
         if (defined($request->{itemnumber})) {
@@ -494,6 +498,7 @@ sub MapItemsToHoldRequests {
     my $pull_branches;
     foreach my $request (@$hold_requests) {
         last if $num_items_remaining == 0;
+        next if $request->{allocated};
         next if defined($request->{itemnumber}); # already handled these
 
         # look for local match first