+ my $recall;
+ # CHECK IF ITEM HAS BEEN RECALLED BY ANOTHER PATRON
+ # Only bother doing this if UseRecalls is enabled and the item is recallable
+ # Don't look at recalls that are in transit
+ if ( C4::Context->preference('UseRecalls') and $item_object->can_be_waiting_recall ) {
+ my @recalls = $biblio->recalls({},{ order_by => { -asc => 'created_date' } })->filter_by_current->as_list;
+
+ foreach my $r ( @recalls ) {
+ if ( $r->item_id and
+ $r->item_id == $item_object->itemnumber and
+ $r->patron_id == $patron->borrowernumber and
+ ( $r->waiting or $r->requested ) ) {
+ $messages{RECALLED} = $r->id;
+ $recall = $r;
+ # this item is recalled by or already waiting for this borrower and the recall can be fulfilled
+ last;
+ }
+ elsif ( $r->item_id and
+ $r->item_id == $item_object->itemnumber and
+ $r->in_transit ) {
+ # recalled item is in transit
+ $issuingimpossible{RECALLED_INTRANSIT} = $r->pickup_library_id;
+ }
+ elsif ( $r->item_level and
+ $r->item_id == $item_object->itemnumber and
+ $r->patron_id != $patron->borrowernumber and
+ !$r->in_transit ) {
+ # this specific item has been recalled by a different patron
+ $needsconfirmation{RECALLED} = $r;
+ $recall = $r;
+ last;
+ }
+ elsif ( !$r->item_level and
+ $r->patron_id != $patron->borrowernumber and
+ !$r->in_transit ) {
+ # a different patron has placed a biblio-level recall and this item is eligible to fill it
+ $needsconfirmation{RECALLED} = $r;
+ $recall = $r;
+ last;
+ }
+ }
+ }
+
+ unless ( $ignore_reserves and defined $recall ) {