#! /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 C4::Auth;
+use Modern::Perl;
+use CGI qw ( -utf8 );
+use C4::Auth qw( get_template_and_user );
use C4::Context;
-use C4::Output;
-use C4::Koha;
-use C4::ClassSource;
-use C4::ClassSortRoutine;
+use C4::Output qw( output_html_with_http_headers );
+use C4::ClassSortRoutine qw( GetSortRoutineNames );
+use C4::ClassSplitRoutine qw( GetSplitRoutineNames );
+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.tt",
- 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 = CGI->new;
+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",
+ flagsrequired => { parameters => 'manage_classifications' },
+ }
+);
-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 => Koha::ClassSortRules->search,
+ split_rules => 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;
}