Bug 22020: (bug 21777 follow-up) Fix columns visibility for circulation.pl
[koha.git] / admin / classsources.pl
index e7f6c9a..697db41 100755 (executable)
 #! /usr/bin/perl
 #
 # Copyright 2007 LibLime
+# Copyright 2018 Koha Development Team
 #
 # This file is part of Koha.
 #
-# Koha is free software; you can redistribute it and/or modify it under the
-# terms of the GNU General Public License as published by the Free Software
-# Foundation; either version 2 of the License, or (at your option) any later
-# version.
+# Koha is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
 #
-# Koha is distributed in the hope that it will be useful, but WITHOUT ANY
-# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
-# A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
+# Koha is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
 #
-# You should have received a copy of the GNU General Public License along
-# with Koha; if not, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# You should have received a copy of the GNU General Public License
+# along with Koha; if not, see <http://www.gnu.org/licenses>.
 #
 
-use strict;
-#use warnings; FIXME - Bug 2505
-use CGI;
+use Modern::Perl;
+use CGI qw ( -utf8 );
 use C4::Auth;
 use C4::Context;
 use C4::Output;
 use C4::Koha;
-use C4::ClassSource;
 use C4::ClassSortRoutine;
+use C4::ClassSplitRoutine;
+use Koha::ClassSources;
+use Koha::ClassSortRules;
+use Koha::ClassSplitRules;
 
 my $script_name = "/cgi-bin/koha/admin/classsources.pl";
 
-my $input = new CGI;
-my $op          = $input->param('op') || '';
-my $source_code = $input->param('class_source');
-my $rule_code   = $input->param('sort_rule');
-
-my ($template, $loggedinuser, $cookie)
-    = get_template_and_user({template_name => "admin/classsources.tmpl",
-                 query => $input,
-                 type => "intranet",
-                 authnotrequired => 0,
-                 flagsrequired => {parameters => 'parameters_remaining_permissions'},
-                 debug => 1,
-                 });
-
-$template->param(script_name => $script_name);
-$template->param($op => 1) if $op;
-
-my $display_lists = 0;
-if ($op eq "add_source") {
-    add_class_source_form($template);
-} elsif ($op eq "add_source_confirmed") {
-    add_class_source($template,
-                     $source_code,
-                     $input->param('description'),
-                     $input->param('used') eq "used" ? 1 : 0,
-                     $rule_code);
-    $display_lists = 1;
-} elsif ($op eq "delete_source") {
-    delete_class_source_form($template);
-} elsif ($op eq "delete_source_confirmed") {
-    delete_class_source($template, $source_code);
-    $display_lists = 1;
-} elsif ($op eq "edit_source") {
-    edit_class_source_form($template, $source_code);
-} elsif ($op eq "edit_source_confirmed") {
-    edit_class_source($template,
-                     $source_code,
-                     $input->param('description'),
-                     $input->param('used') eq "used" ? 1 : 0,
-                     $rule_code);
-    $display_lists = 1;
-} elsif ($op eq "add_sort_rule") {
-    add_class_sort_rule_form($template);
-} elsif ($op eq "add_sort_rule_confirmed") {
-    add_class_sort_rule($template,
-                        $rule_code,
-                        $input->param('description'),
-                        $input->param('sort_routine'));
-    $display_lists = 1;
-} elsif ($op eq "delete_sort_rule") {
-    delete_sort_rule_form($template, $rule_code);
-} elsif ($op eq "delete_sort_rule_confirmed") { 
-    delete_sort_rule($template, $rule_code);
-    $display_lists = 1;
-} elsif ($op eq "edit_sort_rule") { 
-    edit_class_sort_rule_form($template, $rule_code);
-} elsif ($op eq "edit_sort_rule_confirmed") {
-    edit_class_sort_rule($template,
-                         $rule_code,
-                         $input->param('description'),
-                         $input->param('sort_routine'));
-    $display_lists = 1;
-} else {
-    $display_lists = 1;
-}
-
-if ($display_lists) {
-    $template->param(display_lists => 1);
-    class_source_list($template);
-    class_sort_rule_list($template);
-}
-
-output_html_with_http_headers $input, $cookie, $template->output;
+my $input            = new CGI;
+my $op               = $input->param('op') || 'list';
+my $cn_source        = $input->param('cn_source');
+my $class_sort_rule  = $input->param('class_sort_rule');
+my $class_split_rule = $input->param('class_split_rule');
+my $sort_routine     = $input->param('sort_routine');
+my $split_routine    = $input->param('split_routine');
+my @split_regex      = $input->multi_param('split_regex');
+my $description      = $input->param('description');
+my $used             = $input->param('used');
+
+my ( $template, $loggedinuser, $cookie ) = get_template_and_user(
+    {
+        template_name   => "admin/classsources.tt",
+        query           => $input,
+        type            => "intranet",
+        authnotrequired => 0,
+        flagsrequired   => { parameters => 'manage_classifications' },
+        debug           => 1,
+    }
+);
 
-exit 0;
+my @messages;
+$template->param( script_name => $script_name );
 
-sub add_class_source_form {
-    my ($template) = @_;
+if ( $op eq "add_source" ) {
+    my $class_source =
+      $cn_source ? Koha::ClassSources->find($cn_source) : undef;
     $template->param(
-        class_source_form => 1,
-        confirm_op => "add_source_confirmed",
-        used => 0
+        class_source => $class_source,
+        sort_rules   => scalar Koha::ClassSortRules->search,
+        split_rules  => scalar Koha::ClassSplitRules->search,
     );
-    get_sort_rule_codes($template, '');
-}
-
-sub add_class_source {
-    my ($template, $source_code, $description, $used, $sort_rule) = @_;
-    AddClassSource($source_code, $description, $used, $sort_rule);
-    $template->param(added_source => $source_code);
 }
+elsif ( $op eq "add_source_validate" ) {
+    my $class_source = Koha::ClassSources->find($cn_source);
+    if ($class_source) {
+        $class_source->set(
+            {
+                description      => $description,
+                used             => ( $used eq 'used' ? 1 : 0 ),
+                class_sort_rule  => $class_sort_rule,
+                class_split_rule => $class_split_rule,
+            }
+        );
+        eval { $class_source->store; };
+        if ($@) {
+            push @messages,
+              { type => 'error', code => 'error_on_update_source' };
+        }
+        else {
+            push @messages,
+              { type => 'message', code => 'success_on_update_source' };
+        }
 
-sub edit_class_source_form {
-    my ($template, $source_code) = @_;
-
-    my $source = GetClassSource($source_code);
-    $template->param(
-        class_source_form => 1,
-        edit_class_source => 1,
-        class_source => $source_code,
-        confirm_op => "edit_source_confirmed",
-        description => $source->{'description'},
-        used => $source->{'used'},
-    );
+    }
+    else {
+        $class_source = Koha::ClassSource->new(
+            {
+                cn_source        => $cn_source,
+                description      => $description,
+                used             => ( $used eq 'used' ? 1 : 0 ),
+                class_sort_rule  => $class_sort_rule,
+                class_split_rule => $class_split_rule,
+            }
+        );
+        eval { $class_source->store; };
+        if ($@) {
+            push @messages,
+              { type => 'error', code => 'error_on_insert_source' };
+        }
+        else {
+            push @messages,
+              { type => 'message', code => 'success_on_insert_source' };
+        }
+    }
 
-    get_sort_rule_codes($template, $source->{'class_sort_rule'});
+    $op = 'list';
 }
+elsif ( $op eq "delete_source_confirmed" ) {
+    my $class_source = Koha::ClassSources->find($cn_source);
+    my $deleted = eval { $class_source->delete };
+    if ( $@ or not $deleted ) {
+        push @messages, { type => 'error', code => 'error_on_delete_source' };
+    }
+    else {
+        push @messages,
+          { type => 'message', code => 'success_on_delete_source' };
+    }
 
-sub edit_class_source {
-    my ($template, $source_code, $description, $used, $sort_rule) = @_;
-    ModClassSource($source_code, $description, $used, $sort_rule);
-    $template->param(edited_source => $source_code);
+    $op = 'list';
 }
-
-
-sub delete_class_source_form {
-    my ($template) = @_;
+elsif ( $op eq "add_sort_rule" ) {
+    my $sort_rule =
+      $class_sort_rule ? Koha::ClassSortRules->find($class_sort_rule) : undef;
     $template->param(
-        delete_class_source_form => 1,
-        confirm_op   => "delete_source_confirmed",
-        class_source => $source_code,
+        sort_rule     => $sort_rule,
+        sort_routines => get_class_sort_routines(),
     );
 }
+elsif ( $op eq "add_sort_rule_validate" ) {
+    my $sort_rule = Koha::ClassSortRules->find($class_sort_rule);
+    if ($sort_rule) {
+        $sort_rule->set(
+            { description => $description, sort_routine => $sort_routine } );
+        eval { $sort_rule->store; };
+        if ($@) {
+            push @messages,
+              { type => 'error', code => 'error_on_update_sort_rule' };
+        }
+        else {
+            push @messages,
+              { type => 'message', code => 'success_on_update_sort_rule' };
+        }
 
-sub delete_class_source { 
-    my ($template, $source_code) = @_;
-    DelClassSource($source_code);
-    $template->param(deleted_source => $source_code);
+    }
+    else {
+        $sort_rule = Koha::ClassSortRule->new(
+            {
+                class_sort_rule => $class_sort_rule,
+                description     => $description,
+                sort_routine    => $sort_routine,
+            }
+        );
+        eval { $sort_rule->store; };
+        if ($@) {
+            push @messages,
+              { type => 'error', code => 'error_on_insert_sort_rule' };
+        }
+        else {
+            push @messages,
+              { type => 'message', code => 'success_on_insert_sort_rule' };
+        }
+    }
+    $op = 'list';
 }
-
-sub get_sort_rule_codes {
-    my ($template, $current_rule) = @_;
-
-    my $sort_rules = GetClassSortRules();
-
-    my @sort_rules = ();
-    foreach my $sort_rule (sort keys %$sort_rules) {
-        my $sort_rule = $sort_rules->{$sort_rule};
-        push @sort_rules, {
-            rule        => $sort_rule->{'class_sort_rule'},
-            description => $sort_rule->{'description'},
-            selected    => $sort_rule->{'class_sort_rule'} eq $current_rule ? 1 : 0
-        };
+elsif ( $op eq "delete_sort_rule" ) {
+    my $sort_rule = Koha::ClassSortRules->find($class_sort_rule);
+    my $deleted = eval { $sort_rule->delete };
+    if ( $@ or not $deleted ) {
+        push @messages,
+          { type => 'error', code => 'error_on_delete_sort_rule' };
+    }
+    else {
+        push @messages,
+          { type => 'message', code => 'success_on_delete_sort_rule' };
     }
-    $template->param(rules_dropdown => \@sort_rules);
+    $op = 'list';
 }
-
-sub add_class_sort_rule_form {
-    my ($template) = @_;
+elsif ( $op eq "add_split_rule" ) {
+    my $split_rule =
+      $class_split_rule
+      ? Koha::ClassSplitRules->find($class_split_rule)
+      : undef;
     $template->param(
-        sort_rule_form => 1,
-        confirm_op => "add_sort_rule_confirmed"
+        split_rule     => $split_rule,
+        split_routines => get_class_split_routines(),
     );
-    get_class_sort_routines($template, "");
-}
-
-sub add_class_sort_rule {
-    my ($template, $rule_code, $description, $sort_routine) = @_;
-    AddClassSortRule($rule_code, $description, $sort_routine);
-    $template->param(added_rule => $rule_code);
 }
-
-sub delete_sort_rule_form {
-    my ($template, $rule_code) = @_;
-
-    my @sources = GetSourcesForSortRule($rule_code);
-    if ($#sources == -1) {
-        $template->param(
-            delete_sort_rule_form => 1,
-            confirm_op => "delete_sort_rule_confirmed",
-            sort_rule  => $rule_code,
+elsif ( $op eq "add_split_rule_validate" ) {
+    my $split_rule = Koha::ClassSplitRules->find($class_split_rule);
+
+    @split_regex =  grep {!/^$/} @split_regex; # Remove empty
+    if ($split_rule) {
+        $split_rule->set(
+            {
+                description   => $description,
+                split_routine => $split_routine,
+            }
         );
-    } else {
-        $template->param(
-            delete_sort_rule_impossible => 1,
-            sort_rule => $rule_code
+        eval {
+            $split_rule->regexs(\@split_regex)
+                if $split_routine eq 'RegEx';
+            $split_rule->store;
+        };
+        if ($@) {
+            push @messages,
+              { type => 'error', code => 'error_on_update_split_rule' };
+        }
+        else {
+            push @messages,
+              { type => 'message', code => 'success_on_update_split_rule' };
+        }
+
+    }
+    else {
+        $split_rule = Koha::ClassSplitRule->new(
+            {
+                class_split_rule => $class_split_rule,
+                description      => $description,
+                split_routine    => $split_routine,
+                regexs           => \@split_regex,
+            }
         );
+        eval { $split_rule->store; };
+        if ($@) {
+            warn $@;
+            push @messages,
+              { type => 'error', code => 'error_on_insert_split_rule' };
+        }
+        else {
+            push @messages,
+              { type => 'message', code => 'success_on_insert_split_rule' };
+        }
     }
+    $op = 'list';
 }
-
-sub delete_sort_rule { 
-    my ($template, $rule_code) = @_;
-    DelClassSortRule($rule_code);
-    $template->param(deleted_rule => $rule_code);
+elsif ( $op eq "delete_split_rule" ) {
+    my $split_rule = Koha::ClassSplitRules->find($class_split_rule);
+    my $deleted = eval { $split_rule->delete };
+    if ( $@ or not $deleted ) {
+        push @messages,
+          { type => 'error', code => 'error_on_delete_split_rule' };
+    }
+    else {
+        push @messages,
+          { type => 'message', code => 'success_on_delete_split_rule' };
+    }
+    $op = 'list';
 }
 
-sub edit_class_sort_rule_form {
-    my ($template, $rule_code) = @_;
-
-    my $rule = GetClassSortRule($rule_code);
+if ( $op eq 'list' ) {
+    my $class_sources = Koha::ClassSources->search;
+    my $sort_rules    = Koha::ClassSortRules->search;
+    my $split_rules   = Koha::ClassSplitRules->search;
     $template->param(
-        sort_rule_form => 1,
-        edit_sort_rule => 1,
-        confirm_op   => "edit_sort_rule_confirmed",
-        sort_rule    => $rule_code,
-        description  => $rule->{'description'},
-        sort_routine => $rule->{'sort_routine'}
+        class_sources => $class_sources,
+        sort_rules    => $sort_rules,
+        split_rules   => $split_rules,
     );
+}
 
-    get_class_sort_routines($template, $rule->{'sort_routine'});
+$template->param( op => $op, messages => \@messages, );
+output_html_with_http_headers $input, $cookie, $template->output;
 
-}
+exit 0;
 
 sub get_class_sort_routines {
-    my ($template, $current_routine) = @_;
-
     my @sort_routines = GetSortRoutineNames();
-    my @sort_form = ();
-
-    foreach my $sort_routine (sort @sort_routines) {    
-        push @sort_form, {
-            routine  => $sort_routine,
-            selected => $sort_routine eq $current_routine ? 1 : 0
-        };
-    }
-    $template->param(routines_dropdown => \@sort_form);
-
+    return \@sort_routines;
 }
 
-sub edit_class_sort_rule {
-    my ($template, $rule_code, $description, $sort_routine) = @_;
-    ModClassSortRule($rule_code, $description, $sort_routine);
-    $template->param(edited_rule => $rule_code);
-} 
-
-sub class_source_list {
-    my ($template) = @_;
-    my $sources = GetClassSources();
-
-    my @sources = ();
-    foreach my $cn_source (sort keys %$sources) {
-        my $source = $sources->{$cn_source};
-        push @sources, {
-            code        => $source->{'cn_source'},
-            description => $source->{'description'},
-            used        => $source->{'used'},
-            sortrule    => $source->{'class_sort_rule'}
-        };
-    }
-    $template->param(class_sources => \@sources);
-}
-
-sub class_sort_rule_list {
-
-    my ($template) = @_;
-    my $sort_rules = GetClassSortRules();
-
-    my @sort_rules = ();
-    foreach my $sort_rule (sort keys %$sort_rules) {
-        my $sort_rule = $sort_rules->{$sort_rule};
-        push @sort_rules, {
-            rule        => $sort_rule->{'class_sort_rule'},
-            description => $sort_rule->{'description'},
-            sort_routine    => $sort_rule->{'sort_routine'}
-        }; 
-    }
-    $template->param(class_sort_rules => \@sort_rules);
+sub get_class_split_routines {
+    my @split_routines = GetSplitRoutineNames();
+    return \@split_routines;
 }