@@ -, +, @@ enqueueing --- Koha/Item.pm | 21 +++++++++++++++++---- Koha/Item/Transfer.pm | 12 ++++++++++++ 2 files changed, 29 insertions(+), 4 deletions(-) --- a/Koha/Item.pm +++ a/Koha/Item.pm @@ -452,13 +452,20 @@ sub request_transfer { unless ( $params->{ignore_limits} || $self->can_be_transferred( { to => $params->{to} } ) ); - my $request = $self->get_transfer; + # check for active, uncancelled transfers + my $requests = $self->get_transfers; + my $request = $requests->next; + while ( $request && $request->is_cancelled ) { + $request = $requests->next; + } Koha::Exceptions::Item::Transfer::InQueue->throw( transfer => $request ) if ( $request && !$params->{enqueue} && !$params->{replace} ); + # cancel next transfer in the queue if we're replacing it $request->cancel( { reason => $params->{reason}, force => 1 } ) - if ( defined($request) && $params->{replace} ); + if ( $request && $params->{replace} ); + # add transfer to the queue my $transfer = Koha::Item::Transfer->new( { itemnumber => $self->itemnumber, @@ -493,8 +500,14 @@ sub get_transfer { my ($self) = @_; my $transfer_rs = $self->_result->branchtransfers->search( { - datearrived => undef, - datecancelled => undef + datearrived => undef, + [ + { datesent => undef, datecancelled => { '!=' => undef } }, + { + datesent => { '!=' => undef }, + datecancelled => { '!=' => undef } + } + ] }, { order_by => --- a/Koha/Item/Transfer.pm +++ a/Koha/Item/Transfer.pm @@ -126,6 +126,18 @@ sub in_transit { && !defined( $self->datearrived ) ); } +=head3 is_cancelled + +Boolean returning whether the transfer was cancelled or not + +=cut + +sub is_cancelled { + my ($self) = @_; + + return defined($self->datecancelled); +} + =head3 receive Receive the transfer by setting the datearrived time. --