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

(-)a/C4/Circulation.pm (-3 / +17 lines)
Lines 2496-2507 sub AddReturn { Link Here
2496
    }
2496
    }
2497
2497
2498
    # check if we have a transfer for this document
2498
    # check if we have a transfer for this document
2499
    my $transfer = $item->get_transfer;
2499
    my $transfers = $item->get_transfers;
2500
    my $transfer  = $transfers->next;
2500
2501
2501
    # if we have a transfer to complete, we update the line of transfers with the datearrived
2502
    # if we have a transfer to complete, we update the line of transfers with the datearrived
2502
    if ($transfer) {
2503
    if ($transfer) {
2503
        $validTransfer = 0;
2504
        $validTransfer = 0;
2504
        if ( $transfer->in_transit ) {
2505
2506
        # Catch cancelled transfers, we've found the item now
2507
        my $reverse;
2508
        while ( $transfer && $transfer->is_cancelled ) {
2509
            $transfer->receive;
2510
            $messages->{'TransferTrigger'}   = $transfer->reason;
2511
            $messages->{'WrongTransferItem'} = $item->itemnumber;
2512
            $reverse                         = $transfer->frombranch;
2513
            $transfer                        = $transfers->next;
2514
        }
2515
2516
        if ( $transfer && $transfer->in_transit ) {
2505
            if ( $transfer->tobranch eq $branch ) {
2517
            if ( $transfer->tobranch eq $branch ) {
2506
                $transfer->receive;
2518
                $transfer->receive;
2507
                $messages->{'TransferArrived'} = $transfer->frombranch;
2519
                $messages->{'TransferArrived'} = $transfer->frombranch;
Lines 2514-2520 sub AddReturn { Link Here
2514
                $messages->{'WrongTransferItem'} = $item->itemnumber;
2526
                $messages->{'WrongTransferItem'} = $item->itemnumber;
2515
                $messages->{'TransferTrigger'}   = $transfer->reason;
2527
                $messages->{'TransferTrigger'}   = $transfer->reason;
2516
            }
2528
            }
2517
        } else {
2529
        } elsif ($transfer) {
2518
            if ( $transfer->tobranch eq $branch ) {
2530
            if ( $transfer->tobranch eq $branch ) {
2519
                $transfer->receive;
2531
                $transfer->receive;
2520
                $messages->{'TransferArrived'} = $transfer->frombranch;
2532
                $messages->{'TransferArrived'} = $transfer->frombranch;
Lines 2531-2536 sub AddReturn { Link Here
2531
                    $messages->{'WrongTransferItem'} = $item->itemnumber;
2543
                    $messages->{'WrongTransferItem'} = $item->itemnumber;
2532
                }
2544
                }
2533
            }
2545
            }
2546
        } else {
2547
            $messages->{'TransferCancelled'} = $reverse;
2534
        }
2548
        }
2535
    }
2549
    }
2536
2550
(-)a/Koha/Hold.pm (+11 lines)
Lines 768-773 sub cancel { Link Here
768
768
769
    $self->_result->result_source->schema->txn_do(
769
    $self->_result->result_source->schema->txn_do(
770
        sub {
770
        sub {
771
            # Cancel the transfer if this hold is in transit
772
            if ( $self->is_in_transit ) {
773
                my $transfer = $self->item->get_transfer;
774
775
                # Check that there is actually a transfer enqueued and in transit
776
                # before trying to cancel it
777
                if ( $transfer && $transfer->in_transit ) {
778
                    $transfer->cancel( { reason => 'CancelReserve', force => 1 } );
779
                }
780
            }
781
771
            my $patron = $self->patron;
782
            my $patron = $self->patron;
772
783
773
            $self->cancellationdate( dt_from_string->strftime('%Y-%m-%d %H:%M:%S') );
784
            $self->cancellationdate( dt_from_string->strftime('%Y-%m-%d %H:%M:%S') );
(-)a/Koha/Item.pm (-8 / +12 lines)
Lines 869-881 we still expect the item to end up at a final location eventually. Link Here
869
869
870
sub get_transfer {
870
sub get_transfer {
871
    my ($self) = @_;
871
    my ($self) = @_;
872
    my $transfers = $self->_result->current_branchtransfers->search(
873
        undef,
874
        { 'order_by' => [ { '-desc' => 'datesent' }, { '-asc' => 'daterequested' } ] }
875
    );
876
872
873
    # Get all outstanding transfers, including cancelled ones
874
    my $transfers = $self->get_transfers;
875
876
    # Skip over cancelled transfers and return the first active one
877
    my $transfer = $transfers->next;
877
    my $transfer = $transfers->next;
878
    return Koha::Item::Transfer->_new_from_dbic($transfer) if $transfer;
878
    while ( $transfer && $transfer->is_cancelled ) {
879
        $transfer = $transfers->next;
880
    }
881
882
    return $transfer;
879
}
883
}
880
884
881
=head3 transfer
885
=head3 transfer
Lines 919-927 we still expect the item to end up at a final location eventually. Link Here
919
sub get_transfers {
923
sub get_transfers {
920
    my ($self) = @_;
924
    my ($self) = @_;
921
925
922
    my $transfers_rs = $self->_result->current_branchtransfers->search(
926
    my $transfers_rs = $self->_result->branchtransfers->search(
923
        undef,
927
        { datearrived => undef },
924
        { 'order_by' => [ { '-desc' => 'datesent' }, { '-asc' => 'daterequested' } ] }
928
        { 'order_by'  => [ { '-desc' => 'datesent' }, { '-asc' => 'daterequested' } ] }
925
    );
929
    );
926
930
927
    return Koha::Item::Transfers->_new_from_dbic($transfers_rs);
931
    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 549-554 if ( $messages->{'Wrongbranch'} ) { Link Here
549
    );
549
    );
550
}
550
}
551
551
552
#
553
# case of transfer cancelled whilst in transit
554
#
555
if ( $messages->{'TransferCancelled'} ) {
556
    $template->param(
557
        CancelledTransfer => 1,
558
        TransferWaitingAt => $messages->{'TransferCancelled'},
559
        trigger           => $messages->{'TransferTrigger'},
560
    );
561
562
    # Add reverse transfer to return the item to its original holdingbranch
563
    my $item         = Koha::Items->find( $messages->{'WrongTransferItem'} );
564
    my $new_transfer = $item->request_transfer(
565
        {
566
            to            => Koha::Libraries->find( $messages->{'TransferCancelled'} ),
567
            reason        => 'TransferCancellation',
568
            ignore_limits => 1
569
        }
570
    );
571
    $template->param( NewTransfer => $new_transfer->id );
572
}
573
552
# case of wrong transfer, if the document wasn't transferred to the right library (according to branchtransfer (tobranch) BDD)
574
# case of wrong transfer, if the document wasn't transferred to the right library (according to branchtransfer (tobranch) BDD)
553
575
554
if ( $messages->{'WrongTransfer'} and not $messages->{'WasTransfered'} ) {
576
if ( $messages->{'WrongTransfer'} and not $messages->{'WasTransfered'} ) {
Lines 725-730 foreach my $code ( keys %$messages ) { Link Here
725
        ;    # FIXME... anything to do here?
747
        ;    # FIXME... anything to do here?
726
    } elsif ( $code eq 'WrongTransferItem' ) {
748
    } elsif ( $code eq 'WrongTransferItem' ) {
727
        ;    # FIXME... anything to do here?
749
        ;    # FIXME... anything to do here?
750
    } elsif ( $code eq 'TransferCancelled' ) {
751
        ;    # Handled above
728
    } elsif ( $code eq 'NeedsTransfer' ) {
752
    } elsif ( $code eq 'NeedsTransfer' ) {
729
    } elsif ( $code eq 'TransferTrigger' ) {
753
    } elsif ( $code eq 'TransferTrigger' ) {
730
        ;    # Handled alongside NeedsTransfer
754
        ;    # Handled alongside NeedsTransfer
(-)a/koha-tmpl/intranet-tmpl/prog/en/modules/circ/returns.tt (-2 / +6 lines)
Lines 598-604 Link Here
598
598
599
    <!-- case of a mistake in transfer loop -->
599
    <!-- case of a mistake in transfer loop -->
600
    [% UNLESS ( hold_auto_filled && diffbranch ) %]
600
    [% UNLESS ( hold_auto_filled && diffbranch ) %]
601
        [% IF WrongTransfer && !transfertodo %]
601
        [% IF ( WrongTransfer || CancelledTransfer ) && !transfertodo %]
602
            [% IF Koha.Preference('TransfersBlockCirc') %]
602
            [% IF Koha.Preference('TransfersBlockCirc') %]
603
                [% SET div_class='block' %]
603
                [% SET div_class='block' %]
604
            [% ELSE %]
604
            [% ELSE %]
Lines 625-631 Link Here
625
                            [% END %]
625
                            [% END %]
626
626
627
                            <div class="modal-header">
627
                            <div class="modal-header">
628
                                <h1 class="modal-title"> Wrong transfer detected, please return item to: [% Branches.GetName( TransferWaitingAt ) | html %] </h1>
628
                                [% IF WrongTransfer %]
629
                                    <h1 class="modal-title"> Wrong transfer detected, please return item to: [% Branches.GetName( TransferWaitingAt ) | html %] </h1>
630
                                [% ELSE %]
631
                                    <h1 class="modal-title"> Transfer was cancelled whilst in transit, please return item to: [% Branches.GetName( TransferWaitingAt ) | html %] </h1>
632
                                [% END %]
629
                            </div>
633
                            </div>
630
634
631
                            <div class="modal-body">
635
                            <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 1827-1833 subtest 'get_transfer' => sub { Link Here
1827
};
1827
};
1828
1828
1829
subtest 'get_transfers' => sub {
1829
subtest 'get_transfers' => sub {
1830
    plan tests => 17;
1830
    plan tests => 18;
1831
    $schema->storage->txn_begin;
1831
    $schema->storage->txn_begin;
1832
1832
1833
    my $item = $builder->build_sample_item();
1833
    my $item = $builder->build_sample_item();
Lines 1954-1968 subtest 'get_transfers' => sub { Link Here
1954
1954
1955
    $transfer_1->datecancelled( \'NOW()' )->store;
1955
    $transfer_1->datecancelled( \'NOW()' )->store;
1956
    $transfers = $item->get_transfers();
1956
    $transfers = $item->get_transfers();
1957
    is( $transfers->count, 1, 'Once a transfer is cancelled, it no longer appears in the list from ->get_transfers()' );
1957
    is(
1958
        $transfers->count, 2,
1959
        'Once a transfer is cancelled, it still appears in the list from ->get_transfers() (Bug 28527)'
1960
    );
1958
    $result_1 = $transfers->next;
1961
    $result_1 = $transfers->next;
1962
    $result_2 = $transfers->next;
1959
    is(
1963
    is(
1960
        $result_1->branchtransfer_id, $transfer_3->branchtransfer_id,
1964
        $result_1->branchtransfer_id, $transfer_1->branchtransfer_id,
1961
        'Koha::Item->get_transfers returns the only transfer that remains'
1965
        'Koha::Item->get_transfers returns cancelled transfers'
1966
    );
1967
    is(
1968
        $result_2->branchtransfer_id, $transfer_3->branchtransfer_id,
1969
        'Koha::Item->get_transfers returns the active transfer'
1962
    );
1970
    );
1963
1971
1964
    subtest "Ensure prefetches don't affect the return order" => sub {
1972
    subtest "Ensure prefetches don't affect the return order" => sub {
1965
        plan tests => 13;
1973
        plan tests => 14;
1966
1974
1967
        # Reset test data
1975
        # Reset test data
1968
        $transfer_2->datesent(undef)->store;
1976
        $transfer_2->datesent(undef)->store;
Lines 2049-2061 subtest 'get_transfers' => sub { Link Here
2049
        )->next;
2057
        )->next;
2050
        $transfers = $prefetched_item->get_transfers();
2058
        $transfers = $prefetched_item->get_transfers();
2051
        is(
2059
        is(
2052
            $transfers->count, 1,
2060
            $transfers->count, 2,
2053
            'Once a transfer is cancelled, it no longer appears in the list from ->get_transfers()'
2061
            'Once a transfer is cancelled, it still appears in the list from ->get_transfers() (Bug 28527)'
2054
        );
2062
        );
2055
        $result_1 = $transfers->next;
2063
        $result_1 = $transfers->next;
2064
        $result_2 = $transfers->next;
2056
        is(
2065
        is(
2057
            $result_1->branchtransfer_id, $transfer_3->branchtransfer_id,
2066
            $result_1->branchtransfer_id, $transfer_1->branchtransfer_id,
2058
            'Koha::Item->get_transfers returns the only transfer that remains'
2067
            'Koha::Item->get_transfers returns cancelled transfers'
2068
        );
2069
        is(
2070
            $result_2->branchtransfer_id, $transfer_3->branchtransfer_id,
2071
            'Koha::Item->get_transfers returns the active transfer'
2059
        );
2072
        );
2060
    };
2073
    };
2061
2074
(-)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