@@ -, +, @@ $ kshell k$ prove t/db_dependent/Koha/Hold.t patron has privacy == always/2. --- Koha/Hold.pm | 8 ++++- t/db_dependent/Koha/Hold.t | 72 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 79 insertions(+), 1 deletion(-) --- a/Koha/Hold.pm +++ a/Koha/Hold.pm @@ -511,6 +511,8 @@ sub cancel { my ( $self, $params ) = @_; $self->_result->result_source->schema->txn_do( sub { + my $patron = $self->patron; + $self->cancellationdate( dt_from_string->strftime( '%Y-%m-%d %H:%M:%S' ) ); $self->priority(0); $self->cancellation_reason( $params->{cancellation_reason} ); @@ -544,7 +546,11 @@ sub cancel { } } - $self->_move_to_old; + my $old_me = $self->_move_to_old; + # anonymize if required + $old_me->anonymize + if $patron->privacy == 2; + $self->SUPER::delete(); # Do not add a DELETE log # now fix the priority on the others.... --- a/t/db_dependent/Koha/Hold.t +++ a/t/db_dependent/Koha/Hold.t @@ -24,12 +24,14 @@ use Test::More tests => 5; use Test::Exception; use Test::MockModule; +use t::lib::Mocks; use t::lib::TestBuilder; use t::lib::Mocks; use Koha::ActionLogs; use Koha::Holds; use Koha::Libraries; +use Koha::Old::Holds; my $schema = Koha::Database->new->schema; my $builder = t::lib::TestBuilder->new; @@ -336,3 +338,73 @@ subtest 'is_pickup_location_valid() tests' => sub { $schema->storage->txn_rollback; }; + +subtest 'cancel() tests' => sub { + + plan tests => 4; + + $schema->storage->txn_begin; + + my $patron = $builder->build_object( { class => 'Koha::Patrons' } ); + + # reduce the tests noise + t::lib::Mocks::mock_preference( 'HoldsLog', 0 ); + t::lib::Mocks::mock_preference( 'ExpireReservesMaxPickUpDelayCharge', + undef ); + + t::lib::Mocks::mock_preference( 'AnonymousPatron', undef ); + + # 0 == keep forever + $patron->privacy(0)->store; + my $hold = $builder->build_object( + { + class => 'Koha::Holds', + value => { borrowernumber => $patron->id, status => undef } + } + ); + $hold->cancel(); + is( Koha::Old::Holds->find( $hold->id )->borrowernumber, + $patron->borrowernumber, 'Patron link is kept' ); + + # 1 == "default", meaning it is not protected from removal + $patron->privacy(1)->store; + $hold = $builder->build_object( + { + class => 'Koha::Holds', + value => { borrowernumber => $patron->id, status => undef } + } + ); + $hold->cancel(); + is( Koha::Old::Holds->find( $hold->id )->borrowernumber, + $patron->borrowernumber, 'Patron link is kept' ); + + # 2 == delete immediately + $patron->privacy(2)->store; + $hold = $builder->build_object( + { + class => 'Koha::Holds', + value => { borrowernumber => $patron->id, status => undef } + } + ); + $hold->cancel(); + is( Koha::Old::Holds->find( $hold->id )->borrowernumber, + undef, 'Patron link is deleted immediately' ); + + my $anonymous_patron = $builder->build_object({ class => 'Koha::Patrons' }); + t::lib::Mocks::mock_preference( 'AnonymousPatron', $anonymous_patron->id ); + + $hold = $builder->build_object( + { + class => 'Koha::Holds', + value => { borrowernumber => $patron->id, status => undef } + } + ); + $hold->cancel(); + is( + Koha::Old::Holds->find( $hold->id )->borrowernumber, + $anonymous_patron->id, + 'Patron link is set to the configured anonymous patron immediately' + ); + + $schema->storage->txn_rollback; +}; --