View | Details | Raw Unified | Return to bug 28527
Collapse All | Expand All

(-)a/C4/Circulation.pm (-3 / +17 lines)
Lines 2526-2537 sub AddReturn { Link Here
2526
    }
2526
    }
2527
2527
2528
    # check if we have a transfer for this document
2528
    # check if we have a transfer for this document
2529
    my $transfer = $item->get_transfer;
2529
    my $transfers = $item->get_transfers;
2530
    my $transfer  = $transfers->next;
2530
2531
2531
    # if we have a transfer to complete, we update the line of transfers with the datearrived
2532
    # if we have a transfer to complete, we update the line of transfers with the datearrived
2532
    if ($transfer) {
2533
    if ($transfer) {
2533
        $validTransfer = 0;
2534
        $validTransfer = 0;
2534
        if ( $transfer->in_transit ) {
2535
2536
        # Catch cancelled transfers, we've found the item now
2537
        my $reverse;
2538
        while ( $transfer && $transfer->is_cancelled ) {
2539
            $transfer->receive;
2540
            $messages->{'TransferTrigger'}   = $transfer->reason;
2541
            $messages->{'WrongTransferItem'} = $item->itemnumber;
2542
            $reverse                         = $transfer->frombranch;
2543
            $transfer                        = $transfers->next;
2544
        }
2545
2546
        if ( $transfer && $transfer->in_transit ) {
2535
            if ( $transfer->tobranch eq $branch ) {
2547
            if ( $transfer->tobranch eq $branch ) {
2536
                $transfer->receive;
2548
                $transfer->receive;
2537
                $messages->{'TransferArrived'} = $transfer->frombranch;
2549
                $messages->{'TransferArrived'} = $transfer->frombranch;
Lines 2544-2550 sub AddReturn { Link Here
2544
                $messages->{'WrongTransferItem'} = $item->itemnumber;
2556
                $messages->{'WrongTransferItem'} = $item->itemnumber;
2545
                $messages->{'TransferTrigger'}   = $transfer->reason;
2557
                $messages->{'TransferTrigger'}   = $transfer->reason;
2546
            }
2558
            }
2547
        } else {
2559
        } elsif ($transfer) {
2548
            if ( $transfer->tobranch eq $branch ) {
2560
            if ( $transfer->tobranch eq $branch ) {
2549
                $transfer->receive;
2561
                $transfer->receive;
2550
                $messages->{'TransferArrived'} = $transfer->frombranch;
2562
                $messages->{'TransferArrived'} = $transfer->frombranch;
Lines 2561-2566 sub AddReturn { Link Here
2561
                    $messages->{'WrongTransferItem'} = $item->itemnumber;
2573
                    $messages->{'WrongTransferItem'} = $item->itemnumber;
2562
                }
2574
                }
2563
            }
2575
            }
2576
        } else {
2577
            $messages->{'TransferCancelled'} = $reverse;
2564
        }
2578
        }
2565
    }
2579
    }
2566
2580
(-)a/Koha/Hold.pm (+11 lines)
Lines 867-872 sub cancel { Link Here
867
867
868
    $self->_result->result_source->schema->txn_do(
868
    $self->_result->result_source->schema->txn_do(
869
        sub {
869
        sub {
870
            # Cancel the transfer if this hold is in transit
871
            if ( $self->is_in_transit ) {
872
                my $transfer = $self->item->get_transfer;
873
874
                # Check that there is actually a transfer enqueued and in transit
875
                # before trying to cancel it
876
                if ( $transfer && $transfer->in_transit ) {
877
                    $transfer->cancel( { reason => 'CancelReserve', force => 1 } );
878
                }
879
            }
880
870
            my $patron = $self->patron;
881
            my $patron = $self->patron;
871
882
872
            $self->cancellationdate( dt_from_string->strftime('%Y-%m-%d %H:%M:%S') );
883
            $self->cancellationdate( dt_from_string->strftime('%Y-%m-%d %H:%M:%S') );
(-)a/Koha/Item.pm (-8 / +12 lines)
Lines 874-886 we still expect the item to end up at a final location eventually. Link Here
874
874
875
sub get_transfer {
875
sub get_transfer {
876
    my ($self) = @_;
876
    my ($self) = @_;
877
    my $transfers = $self->_result->current_branchtransfers->search(
878
        undef,
879
        { 'order_by' => [ { '-desc' => 'datesent' }, { '-asc' => 'daterequested' } ] }
880
    );
881
877
878
    # Get all outstanding transfers, including cancelled ones
879
    my $transfers = $self->get_transfers;
880
881
    # Skip over cancelled transfers and return the first active one
882
    my $transfer = $transfers->next;
882
    my $transfer = $transfers->next;
883
    return Koha::Item::Transfer->_new_from_dbic($transfer) if $transfer;
883
    while ( $transfer && $transfer->is_cancelled ) {
884
        $transfer = $transfers->next;
885
    }
886
887
    return $transfer;
884
}
888
}
885
889
886
=head3 transfer
890
=head3 transfer
Lines 924-932 we still expect the item to end up at a final location eventually. Link Here
924
sub get_transfers {
928
sub get_transfers {
925
    my ($self) = @_;
929
    my ($self) = @_;
926
930
927
    my $transfers_rs = $self->_result->current_branchtransfers->search(
931
    my $transfers_rs = $self->_result->branchtransfers->search(
928
        undef,
932
        { datearrived => undef },
929
        { 'order_by' => [ { '-desc' => 'datesent' }, { '-asc' => 'daterequested' } ] }
933
        { 'order_by'  => [ { '-desc' => 'datesent' }, { '-asc' => 'daterequested' } ] }
930
    );
934
    );
931
935
932
    return Koha::Item::Transfers->_new_from_dbic($transfers_rs);
936
    return Koha::Item::Transfers->_new_from_dbic($transfers_rs);
(-)a/Koha/Item/Transfer.pm (-1 / +13 lines)
Lines 157-163 Boolean returning whether the transfer is in transit or waiting Link Here
157
sub in_transit {
157
sub in_transit {
158
    my ($self) = @_;
158
    my ($self) = @_;
159
159
160
    return ( defined( $self->datesent ) && !defined( $self->datearrived ) && !defined( $self->datecancelled ) );
160
    return ( defined( $self->datesent ) && !defined( $self->datearrived ) );
161
}
162
163
=head3 is_cancelled
164
165
Boolean returning whether the transfer was cancelled or not
166
167
=cut
168
169
sub is_cancelled {
170
    my ($self) = @_;
171
172
    return defined( $self->datecancelled );
161
}
173
}
162
174
163
=head3 receive
175
=head3 receive
(-)a/circ/returns.pl (+24 lines)
Lines 550-555 if ( $messages->{'Wrongbranch'} ) { Link Here
550
    );
550
    );
551
}
551
}
552
552
553
#
554
# case of transfer cancelled whilst in transit
555
#
556
if ( $messages->{'TransferCancelled'} ) {
557
    $template->param(
558
        CancelledTransfer => 1,
559
        TransferWaitingAt => $messages->{'TransferCancelled'},
560
        trigger           => $messages->{'TransferTrigger'},
561
    );
562
563
    # Add reverse transfer to return the item to its original holdingbranch
564
    my $item         = Koha::Items->find( $messages->{'WrongTransferItem'} );
565
    my $new_transfer = $item->request_transfer(
566
        {
567
            to            => Koha::Libraries->find( $messages->{'TransferCancelled'} ),
568
            reason        => 'TransferCancellation',
569
            ignore_limits => 1
570
        }
571
    );
572
    $template->param( NewTransfer => $new_transfer->id );
573
}
574
553
# case of wrong transfer, if the document wasn't transferred to the right library (according to branchtransfer (tobranch) BDD)
575
# case of wrong transfer, if the document wasn't transferred to the right library (according to branchtransfer (tobranch) BDD)
554
576
555
if ( $messages->{'WrongTransfer'} and not $messages->{'WasTransfered'} ) {
577
if ( $messages->{'WrongTransfer'} and not $messages->{'WasTransfered'} ) {
Lines 726-731 foreach my $code ( keys %$messages ) { Link Here
726
        ;    # FIXME... anything to do here?
748
        ;    # FIXME... anything to do here?
727
    } elsif ( $code eq 'WrongTransferItem' ) {
749
    } elsif ( $code eq 'WrongTransferItem' ) {
728
        ;    # FIXME... anything to do here?
750
        ;    # FIXME... anything to do here?
751
    } elsif ( $code eq 'TransferCancelled' ) {
752
        ;    # Handled above
729
    } elsif ( $code eq 'NeedsTransfer' ) {
753
    } elsif ( $code eq 'NeedsTransfer' ) {
730
    } elsif ( $code eq 'TransferTrigger' ) {
754
    } elsif ( $code eq 'TransferTrigger' ) {
731
        ;    # Handled alongside NeedsTransfer
755
        ;    # Handled alongside NeedsTransfer
(-)a/koha-tmpl/intranet-tmpl/prog/en/modules/circ/returns.tt (-2 / +6 lines)
Lines 600-606 Link Here
600
600
601
    <!-- case of a mistake in transfer loop -->
601
    <!-- case of a mistake in transfer loop -->
602
    [% UNLESS ( hold_auto_filled && diffbranch ) %]
602
    [% UNLESS ( hold_auto_filled && diffbranch ) %]
603
        [% IF WrongTransfer && !transfertodo %]
603
        [% IF ( WrongTransfer || CancelledTransfer ) && !transfertodo %]
604
            [% IF Koha.Preference('TransfersBlockCirc') %]
604
            [% IF Koha.Preference('TransfersBlockCirc') %]
605
                [% SET div_class='block' %]
605
                [% SET div_class='block' %]
606
            [% ELSE %]
606
            [% ELSE %]
Lines 627-633 Link Here
627
                            [% END %]
627
                            [% END %]
628
628
629
                            <div class="modal-header">
629
                            <div class="modal-header">
630
                                <h1 class="modal-title"> Wrong transfer detected, please return item to: [% Branches.GetName( TransferWaitingAt ) | html %] </h1>
630
                                [% IF WrongTransfer %]
631
                                    <h1 class="modal-title"> Wrong transfer detected, please return item to: [% Branches.GetName( TransferWaitingAt ) | html %] </h1>
632
                                [% ELSE %]
633
                                    <h1 class="modal-title"> Transfer was cancelled whilst in transit, please return item to: [% Branches.GetName( TransferWaitingAt ) | html %] </h1>
634
                                [% END %]
631
                            </div>
635
                            </div>
632
636
633
                            <div class="modal-body">
637
                            <div class="modal-body">
(-)a/t/db_dependent/Koha/Item.t (-10 / +23 lines)
Lines 1220-1226 subtest 'request_transfer() tests' => sub { Link Here
1220
    ok( $original_transfer->datecancelled, "Original transfer cancelled" );
1220
    ok( $original_transfer->datecancelled, "Original transfer cancelled" );
1221
    is( $original_transfer->cancellation_reason, "WrongTransfer", "Original cancellation_reason set correctly" );
1221
    is( $original_transfer->cancellation_reason, "WrongTransfer", "Original cancellation_reason set correctly" );
1222
    $transfers = $item->get_transfers;
1222
    $transfers = $item->get_transfers;
1223
    is( $transfers->count, 1, "There is only 1 live transfer in the queue" );
1223
    is( $transfers->count, 2, "There are 2 transfers in the queue (1 cancelled, 1 active) (Bug 28527)" );
1224
    $replaced_transfer->datearrived(dt_from_string)->store();
1224
    $replaced_transfer->datearrived(dt_from_string)->store();
1225
1225
1226
    # BranchTransferLimits
1226
    # BranchTransferLimits
Lines 1850-1856 subtest 'get_transfer' => sub { Link Here
1850
};
1850
};
1851
1851
1852
subtest 'get_transfers' => sub {
1852
subtest 'get_transfers' => sub {
1853
    plan tests => 17;
1853
    plan tests => 18;
1854
    $schema->storage->txn_begin;
1854
    $schema->storage->txn_begin;
1855
1855
1856
    my $item = $builder->build_sample_item();
1856
    my $item = $builder->build_sample_item();
Lines 1977-1991 subtest 'get_transfers' => sub { Link Here
1977
1977
1978
    $transfer_1->datecancelled( \'NOW()' )->store;
1978
    $transfer_1->datecancelled( \'NOW()' )->store;
1979
    $transfers = $item->get_transfers();
1979
    $transfers = $item->get_transfers();
1980
    is( $transfers->count, 1, 'Once a transfer is cancelled, it no longer appears in the list from ->get_transfers()' );
1980
    is(
1981
        $transfers->count, 2,
1982
        'Once a transfer is cancelled, it still appears in the list from ->get_transfers() (Bug 28527)'
1983
    );
1981
    $result_1 = $transfers->next;
1984
    $result_1 = $transfers->next;
1985
    $result_2 = $transfers->next;
1982
    is(
1986
    is(
1983
        $result_1->branchtransfer_id, $transfer_3->branchtransfer_id,
1987
        $result_1->branchtransfer_id, $transfer_1->branchtransfer_id,
1984
        'Koha::Item->get_transfers returns the only transfer that remains'
1988
        'Koha::Item->get_transfers returns cancelled transfers'
1989
    );
1990
    is(
1991
        $result_2->branchtransfer_id, $transfer_3->branchtransfer_id,
1992
        'Koha::Item->get_transfers returns the active transfer'
1985
    );
1993
    );
1986
1994
1987
    subtest "Ensure prefetches don't affect the return order" => sub {
1995
    subtest "Ensure prefetches don't affect the return order" => sub {
1988
        plan tests => 13;
1996
        plan tests => 14;
1989
1997
1990
        # Reset test data
1998
        # Reset test data
1991
        $transfer_2->datesent(undef)->store;
1999
        $transfer_2->datesent(undef)->store;
Lines 2072-2084 subtest 'get_transfers' => sub { Link Here
2072
        )->next;
2080
        )->next;
2073
        $transfers = $prefetched_item->get_transfers();
2081
        $transfers = $prefetched_item->get_transfers();
2074
        is(
2082
        is(
2075
            $transfers->count, 1,
2083
            $transfers->count, 2,
2076
            'Once a transfer is cancelled, it no longer appears in the list from ->get_transfers()'
2084
            'Once a transfer is cancelled, it still appears in the list from ->get_transfers() (Bug 28527)'
2077
        );
2085
        );
2078
        $result_1 = $transfers->next;
2086
        $result_1 = $transfers->next;
2087
        $result_2 = $transfers->next;
2079
        is(
2088
        is(
2080
            $result_1->branchtransfer_id, $transfer_3->branchtransfer_id,
2089
            $result_1->branchtransfer_id, $transfer_1->branchtransfer_id,
2081
            'Koha::Item->get_transfers returns the only transfer that remains'
2090
            'Koha::Item->get_transfers returns cancelled transfers'
2091
        );
2092
        is(
2093
            $result_2->branchtransfer_id, $transfer_3->branchtransfer_id,
2094
            'Koha::Item->get_transfers returns the active transfer'
2082
        );
2095
        );
2083
    };
2096
    };
2084
2097
(-)a/t/db_dependent/Koha/Item/Transfer.t (-3 / +37 lines)
Lines 27-33 use t::lib::Mocks; Link Here
27
use t::lib::TestBuilder;
27
use t::lib::TestBuilder;
28
28
29
use Test::NoWarnings;
29
use Test::NoWarnings;
30
use Test::More tests => 9;
30
use Test::More tests => 10;
31
use Test::Exception;
31
use Test::Exception;
32
32
33
my $schema  = Koha::Database->new->schema;
33
my $schema  = Koha::Database->new->schema;
Lines 253-259 subtest 'in_transit tests' => sub { Link Here
253
    ok( !$transfer->in_transit, 'in_transit returns false when datearrived is defined' );
253
    ok( !$transfer->in_transit, 'in_transit returns false when datearrived is defined' );
254
254
255
    $transfer->set( { datearrived => undef, datecancelled => dt_from_string } )->store;
255
    $transfer->set( { datearrived => undef, datecancelled => dt_from_string } )->store;
256
    ok( !$transfer->in_transit, 'in_transit returns false when datecancelled is defined' );
256
    ok( $transfer->in_transit, 'in_transit returns true even when datecancelled is defined (Bug 28527)' );
257
258
    $schema->storage->txn_rollback;
259
};
260
261
subtest 'is_cancelled tests' => sub {
262
263
    plan tests => 3;
264
265
    $schema->storage->txn_begin;
266
267
    my $library_from = $builder->build_object( { class => 'Koha::Libraries' } );
268
    my $library_to   = $builder->build_object( { class => 'Koha::Libraries' } );
269
    my $item         = $builder->build_sample_item(
270
        {
271
            homebranch    => $library_to->branchcode,
272
            holdingbranch => $library_from->branchcode,
273
        }
274
    );
275
276
    my $transfer = Koha::Item::Transfer->new(
277
        {
278
            itemnumber    => $item->itemnumber,
279
            frombranch    => $library_from->branchcode,
280
            tobranch      => $library_to->branchcode,
281
            daterequested => dt_from_string,
282
        }
283
    )->store;
284
285
    ok( !$transfer->is_cancelled, 'is_cancelled returns false when datecancelled is not defined' );
286
287
    $transfer->datesent(dt_from_string)->store;
288
    ok( !$transfer->is_cancelled, 'is_cancelled returns false when transfer is in transit' );
289
290
    $transfer->datecancelled(dt_from_string)->store;
291
    ok( $transfer->is_cancelled, 'is_cancelled returns true when datecancelled is defined' );
257
292
258
    $schema->storage->txn_rollback;
293
    $schema->storage->txn_rollback;
259
};
294
};
260
- 

Return to bug 28527