From a243f978e9a027720f100eb0a4c9fce6c16e7751 Mon Sep 17 00:00:00 2001
From: Christopher Brannon <cbrannon@cdalibrary.org>
Date: Tue, 4 Dec 2018 16:38:34 +0000
Subject: [PATCH] Bug 21944: Reroute waiting hold from wrong branch

To Test:
1) Place a hold on an item.
2) Check in the item to trigger the hold.  Item is now listed as
waiting.
3) Set branch to a different library.
4) Check in the item to trigger the hold.  Notice that nothing but a
local use is recorded.
5) Apply the patch.
6) Repeat steps 1-4.  Notice that the hold is triggered around routed to
its original pickup location.  A transfer is set and the hold status
is changed from waiting to correctly showing the item as in transit.
---
 C4/Circulation.pm | 9 ++++++++-
 1 file changed, 8 insertions(+), 1 deletion(-)

diff --git a/C4/Circulation.pm b/C4/Circulation.pm
index fb798c8ba9..fba9569985 100644
--- a/C4/Circulation.pm
+++ b/C4/Circulation.pm
@@ -2056,10 +2056,17 @@ sub AddReturn {
     }
 
     # find reserves.....
-    # if we don't have a reserve with the status W, we launch the Checkreserves routine
+    # launch the Checkreserves routine to find any holds
     my ($resfound, $resrec);
     my $lookahead= C4::Context->preference('ConfirmFutureHolds'); #number of days to look for future holds
     ($resfound, $resrec, undef) = C4::Reserves::CheckReserves( $item->itemnumber, undef, $lookahead ) unless ( $item->withdrawn );
+    # if a hold is found and is waiting at another branch, change the priority back to 1 and trigger the hold (this will trigger a transfer and update the hold status properly)
+    if ( $resfound eq "Waiting" and $branch ne $resrec->{branchcode} ) {
+        C4::Reserves::RevertWaitingStatus( { itemnumber => $item->itemnumber } );
+        #If the hold is reverted we need to refetch for the return values
+        ($resfound, $resrec, undef) = C4::Reserves::CheckReserves( $item->itemnumber, undef, $lookahead ) unless ( $item->withdrawn );
+    }
+    ($resfound, $resrec, undef) = C4::Reserves::CheckReserves( $item->itemnumber, undef, $lookahead ) unless ( $item->withdrawn );
     if ($resfound) {
           $resrec->{'ResFound'} = $resfound;
         $messages->{'ResFound'} = $resrec;
-- 
2.11.0