From 8bee07c58bf547caa2079a2b38376a37bb075eee Mon Sep 17 00:00:00 2001
From: Jonathan Druart <jonathan.druart@bugs.koha-community.org>
Date: Tue, 28 Apr 2020 11:23:02 +0200
Subject: [PATCH] Bug 17355: Override delete methods

Signed-off-by: Victor Grousset/tuxayo <victor@tuxayo.net>
---
 Koha/AuthorisedValueCategories.pm | 20 ++++++++++++++++++++
 Koha/AuthorisedValueCategory.pm   | 15 +++++++++++++++
 t/db_dependent/AuthorisedValues.t | 27 +++++++++++++++++++++++++--
 3 files changed, 60 insertions(+), 2 deletions(-)

diff --git a/Koha/AuthorisedValueCategories.pm b/Koha/AuthorisedValueCategories.pm
index afe6692a25..2d36352c88 100644
--- a/Koha/AuthorisedValueCategories.pm
+++ b/Koha/AuthorisedValueCategories.pm
@@ -20,6 +20,7 @@ use Modern::Perl;
 use Carp;
 
 use Koha::Database;
+use Koha::Exceptions::CannotDeleteDefault;
 
 use Koha::AuthorisedValueCategory;
 
@@ -35,6 +36,25 @@ Koha::AuthorisedValueCategories - Koha AuthorisedValueCategory Object set class
 
 =cut
 
+=head3 delete
+
+Overridden delete method to prevent system default deletions
+
+=cut
+
+sub delete {
+    my ($self) = @_;
+
+    my @set = $self->as_list;
+    for my $type (@set) {
+        if ( $type->is_system ) {
+            Koha::Exceptions::CannotDeleteDefault->throw;
+        }
+    }
+
+    return $self->SUPER::delete;
+}
+
 =head3 type
 
 =cut
diff --git a/Koha/AuthorisedValueCategory.pm b/Koha/AuthorisedValueCategory.pm
index 14eb91db25..d2c196dadf 100644
--- a/Koha/AuthorisedValueCategory.pm
+++ b/Koha/AuthorisedValueCategory.pm
@@ -20,6 +20,7 @@ use Modern::Perl;
 use Carp;
 
 use Koha::Database;
+use Koha::Exceptions::CannotDeleteDefault;
 
 use base qw(Koha::Object);
 
@@ -33,6 +34,20 @@ Koha::AuthorisedValueCategory - Koha AuthorisedValueCategory Object class
 
 =cut
 
+=head3 delete
+
+Overridden delete method to prevent system default deletions
+
+=cut
+
+sub delete {
+    my ($self) = @_;
+
+    Koha::Exceptions::CannotDeleteDefault->throw if $self->is_system;
+
+    return $self->SUPER::delete;
+}
+
 =head3 type
 
 =cut
diff --git a/t/db_dependent/AuthorisedValues.t b/t/db_dependent/AuthorisedValues.t
index d16d282731..860e97baef 100644
--- a/t/db_dependent/AuthorisedValues.t
+++ b/t/db_dependent/AuthorisedValues.t
@@ -1,7 +1,8 @@
 #!/usr/bin/perl
 
 use Modern::Perl;
-use Test::More tests => 15;
+use Test::More tests => 17;
+use Try::Tiny;
 
 use t::lib::TestBuilder;
 
@@ -20,7 +21,7 @@ Koha::AuthorisedValues->delete;
 Koha::AuthorisedValueCategories->delete;
 
 # insert
-Koha::AuthorisedValueCategory->new({ category_name => 'av_for_testing' })->store;
+Koha::AuthorisedValueCategory->new({ category_name => 'av_for_testing', is_system => 1 })->store;
 Koha::AuthorisedValueCategory->new({ category_name => 'aaav_for_testing' })->store;
 Koha::AuthorisedValueCategory->new({ category_name => 'restricted_for_testing' })->store;
 my $av1 = Koha::AuthorisedValue->new(
@@ -84,6 +85,28 @@ ok( $av2->id(), 'AV 2 is inserted' );
 ok( $av3->id(), 'AV 3 is inserted' );
 ok( $av4->id(), 'AV 4 is inserted' );
 
+{ # delete is_system AV categories
+    try {
+        Koha::AuthorisedValueCategories->find('av_for_testing')->delete
+    }
+    catch {
+        ok(
+            $_->isa('Koha::Exceptions::CannotDeleteDefault'),
+            'A system AV category cannot be deleted'
+        );
+    };
+
+    try {
+        Koha::AuthorisedValueCategories->search->delete
+    }
+    catch {
+        ok(
+            $_->isa('Koha::Exceptions::CannotDeleteDefault'),
+            'system AV categories cannot be deleted'
+        );
+    };
+}
+
 is( $av3->opac_description, 'opac display value 3', 'Got correction opac description if lib_opac is set' );
 $av3->lib_opac('');
 is( $av3->opac_description, 'display value 3', 'Got correction opac description if lib_opac is *not* set' );
-- 
2.26.2