Bug 29525: Make Koha::Hold->cancel anonymize if required

This patch makes cancelling a hold anonymize it on the same call, if
settings require it (i.e. if borrowers.privacy is set to 2).

To test:
1. Apply this patch
2. Run:
   $ kshell
  k$ prove t/db_dependent/Koha/Hold.t
=> SUCCESS: The code actually does what it is meant to
3. Try on the UI, cancelling a hold, noticing it gets anonymized if the
   patron has privacy == always/2.
4. Sign off :-D

Note: AnonymousPatron should be set. Otherwise it would set NULL. But
that's fine, that's what Koha does already.

Signed-off-by: Andrew Fuerste-Henry <andrew@bywatersolutions.com>
Signed-off-by: Martin Renvoize <martin.renvoize@ptfs-europe.com>
Signed-off-by: Fridolin Somers <fridolin.somers@biblibre.com>
This commit is contained in:
Tomás Cohen Arazi 2022-01-12 16:32:24 -03:00 committed by Fridolin Somers
parent c96977ede2
commit 2f3926965f
2 changed files with 79 additions and 1 deletions

View file

@ -517,6 +517,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} );
@ -550,7 +552,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....

View file

@ -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;
@ -382,3 +384,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;
};