diff --git a/Koha/Exceptions/Patron.pm b/Koha/Exceptions/Patron.pm index 1eb7fc5789..6b607a23f1 100644 --- a/Koha/Exceptions/Patron.pm +++ b/Koha/Exceptions/Patron.pm @@ -15,6 +15,10 @@ use Exception::Class ( isa => 'Koha::Exceptions::Patron', description => "Deleting patron failed" }, + 'Koha::Exceptions::Patron::FailedAnonymizing' => { + isa => 'Koha::Exceptions::Patron', + description => "Anonymizing patron reading history failed" + }, 'Koha::Exceptions::Patron::FailedDeleteAnonymousPatron' => { isa => 'Koha::Exceptions::Patron', description => "Deleting patron failed, AnonymousPatron is not deleteable" diff --git a/Koha/Patron.pm b/Koha/Patron.pm index dae2d9fd21..e6e4fca942 100644 --- a/Koha/Patron.pm +++ b/Koha/Patron.pm @@ -298,6 +298,22 @@ sub store { Koha::Exceptions::Patron::InvalidUserid->throw( userid => $self->userid ) unless $self->has_valid_userid; + # If a borrower has set their privacy to never we should immediately anonymize + # their checkouts + if( $self->privacy() == 2 && $self_from_storage->privacy() != 2 ){ + try{ + my $schema = Koha::Database->new()->schema(); + $schema->txn_do( + sub { $self->old_checkouts->anonymize; } + ); + } + catch { + Koha::Exceptions::Patron::FailedAnonymizing->throw( + error => @_ + ); + }; + } + # Password must be updated using $self->set_password $self->password($self_from_storage->password); diff --git a/t/db_dependent/Koha/Patron.t b/t/db_dependent/Koha/Patron.t index eee0ec9527..6007589ae9 100755 --- a/t/db_dependent/Koha/Patron.t +++ b/t/db_dependent/Koha/Patron.t @@ -19,7 +19,7 @@ use Modern::Perl; -use Test::More tests => 20; +use Test::More tests => 21; use Test::Exception; use Test::Warn; @@ -1398,3 +1398,35 @@ subtest 'get_savings tests' => sub { $schema->storage->txn_rollback; }; + +subtest 'update privacy tests' => sub { + + plan tests => 5; + + my $patron = $builder->build_object({ class => 'Koha::Patrons', value => { privacy => 1 } }); + + my $old_checkout = $builder->build_object({ class => 'Koha::Old::Checkouts', value => { borrowernumber => $patron->id } }); + + t::lib::Mocks::mock_preference( 'AnonymousPatron', '0' ); + + $patron->privacy(2); #set to never + + throws_ok{ $patron->store } 'Koha::Exceptions::Patron::FailedAnonymizing', 'We throw an exception when anonymizing fails'; + + $old_checkout->discard_changes; #refresh from db + $patron->discard_changes; + + is( $old_checkout->borrowernumber, $patron->id, "When anonymizing fails, we don't clear the checkouts"); + is( $patron->privacy(), 1, "When anonymizing fails, we don't chaneg the privacy"); + + my $anon_patron = $builder->build_object({ class => 'Koha::Patrons'}); + t::lib::Mocks::mock_preference( 'AnonymousPatron', $anon_patron->id ); + + $patron->privacy(2)->store(); #set to never + + $old_checkout->discard_changes; #refresh from db + $patron->discard_changes; + + is( $old_checkout->borrowernumber, $anon_patron->id, "Checkout is successfully anonymized"); + is( $patron->privacy(), 2, "Patron privacy is successfully updated"); +};