Koha/installer/onboarding.pl
Jonathan Druart 45a35f1ecc Bug 17855: Simplify the onboarding tool
This patch should not modify a lot the behaviours of the onboarding
tool.
Its goal is mainly to remove duplicated as well as useless (because
copy/pasted from existing script files) code.

It assumes that the onboarding tool will be done on an empty database
and will skip steps that are not needed. For instance if a library
already exists, the first step will be skipped.

One of the main problem was the lack of feedback messages sent to the
user when something wrong/ok happened.

Explanation on main changes:
1. Use checkauth first, then get_template_and_user
=> As we do not know the template to use, it's better to use checkauth
first to know if the user is logged in, then retrieve the template we
need, depending on the success or the failure of the action
2. Create a @messages variables
Pushing messages to this variable and handling the messages via an
include files (onboarding_messages.inc) simplify error handling. Note
that we could remove this include file if we merge all the
onboardingstepX.tt files altogether
3. Simplify creation of the admnistrator user
This patch removes some unecessary checks done on the user's info
(passwd to short, mandatory fields

Todo (minor): Add style to feedback messages

Signed-off-by: Alex Buckley <alexbuckley@catalyst.net.nz>

Signed-off-by: Jonathan Druart <jonathan.druart@bugs.koha-community.org>

Signed-off-by: Kyle M Hall <kyle@bywatersolutions.com>
2017-04-28 08:36:20 -04:00

329 lines
11 KiB
Perl
Executable file

#!/usr/bin/perl
# This file is part of Koha.
#
# Copyright (C) 2017 Catalyst IT
#
# 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.
#
# You should have received a copy of the GNU General Public License
# along with Koha; if not, see <http://www.gnu.org/licenses>.
use Modern::Perl;
use C4::Context;
use C4::InstallAuth;
use CGI qw ( -utf8 );
use C4::Output;
use C4::Members;
use Koha::Patrons;
use Koha::Libraries;
use Koha::Database;
use Koha::DateUtils;
use Koha::Patron::Categories;
use Koha::Patron::Category;
use Koha::ItemTypes;
use Koha::IssuingRule;
use Koha::IssuingRules;
#Setting variables
my $input = new CGI;
unless ( C4::Context->preference('Version') ) {
print $input->redirect("/cgi-bin/koha/installer/install.pl");
exit;
}
my ( $user, $cookie, $sessionID, $flags ) =
C4::InstallAuth::checkauth( $input, 0, undef, 'intranet' );
die "Not logged in"
unless $user
; # Should not happen, we should be redirect if the user is not logged in. But do not trust authentication...
my $step = $input->param('step') || 1;
my $op = $input->param('op') || '';
my $template_params = {};
$template_params->{op} = $op;
my $schema = Koha::Database->new()->schema();
my @messages;
if ( $step == 1 ) {
if ( $op eq 'add_validate_library' ) {
my $branchcode = $input->param('branchcode');
$branchcode = uc($branchcode);
$branchcode =~ s|\s||g
; # Use a regular expression to check the value of the inputted branchcode
my $library = Koha::Library->new(
{
branchcode => $branchcode,
branchname => scalar $input->param('branchname'),
}
);
eval { $library->store; };
unless ($@) {
push @messages,
{ type => 'message', code => 'success_on_insert_library' };
}
else {
push @messages,
{ type => 'message', code => 'error_on_insert_library' };
}
}
$step++ if Koha::Libraries->count;
}
if ( $step == 2 ) {
if ( $op eq "add_validate_category" ) {
my $searchfield = $input->param('description') // q||;
my $categorycode = $input->param('categorycode');
my $category;
$template_params->{categorycode} = $categorycode;
$categorycode = $input->param('categorycode');
my $description = $input->param('description');
my $overduenoticerequired = $input->param('overduenoticerequired');
my $category_type = $input->param('category_type');
my $default_privacy = $input->param('default_privacy');
my $enrolmentperiod = $input->param('enrolmentperiod');
my $enrolmentperioddate = $input->param('enrolmentperioddate') || undef;
#Converts the string into a date format
if ($enrolmentperioddate) {
$enrolmentperioddate = output_pref(
{
dt => dt_from_string($enrolmentperioddate),
dateformat => 'DateTime',
dateonly => 1,
}
);
}
#Adds a new patron category to the database
$category = Koha::Patron::Category->new(
{
categorycode => $categorycode,
description => $description,
overduenoticerequired => $overduenoticerequired,
category_type => $category_type,
default_privacy => $default_privacy,
enrolmentperiod => $enrolmentperiod,
enrolmentperioddate => $enrolmentperioddate
}
);
eval { $category->store; };
unless ($@) {
push @messages,
{ type => 'message', code => 'success_on_insert_category' };
}
else {
push @messages,
{ type => 'message', code => 'error_on_insert_category' };
}
}
$step++ if Koha::Patron::Categories->count;
}
if ( $step == 3 ) {
if ( $op eq 'add_validate_patron' ) {
#Create a patron
my $firstpassword = $input->param('password') || '';
my $secondpassword = $input->param('password2') || '';
my $cardnumber = $input->param('cardnumber');
my $userid = $input->param('userid');
if ( my $error_code = checkcardnumber($cardnumber) ) {
if ( $error_code == 1 ) {
push @messages,
{
type => 'alert',
code => 'ERROR_cardnumber_already_exists'
};
}
elsif ( $error_code == 2 ) {
push @messages,
{ type => 'alert', code => 'ERROR_cardnumber_length' };
}
}
elsif ( $firstpassword ne $secondpassword ) {
push @messages,
{ type => 'alert', code => 'ERROR_password_mismatch' };
}
else {
my $patron_data = {
surname => scalar $input->param('surname'),
firstname => scalar $input->param('firstname'),
cardnumber => scalar $input->param('cardnumber'),
branchcode => scalar $input->param('libraries'),
categorycode => scalar $input->param('categorycode_entry'),
userid => scalar $input->param('userid'),
password => scalar $input->param('password'),
password2 => scalar $input->param('password2'),
privacy => "default",
address => "",
city => "",
flags => 1, # Will be superlibrarian
};
my $patron_category =
Koha::Patron::Categories->find( $patron_data->{categorycode} );
$patron_data->{dateexpiry} =
$patron_category->get_expiry_date( $patron_data->{dateenrolled} );
my $borrowernumber = C4::Members::AddMember(%$patron_data);
#Error handling checking if the patron was created successfully
if ($borrowernumber) {
push @messages,
{ type => 'message', code => 'success_on_insert_patron' };
}
else {
push @messages,
{ type => 'error', code => 'error_on_insert_patron' };
}
}
}
$step++ if Koha::Patrons->search( { flags => 1 } )->count;
}
if ( $step == 4 ) {
if ( $op eq 'add_validate_itemtype' ) {
my $description = $input->param('description');
my $itemtype_code = $input->param('itemtype');
$itemtype_code = uc($itemtype_code);
my $itemtype = Koha::ItemType->new(
{
itemtype => $itemtype_code,
description => $description,
}
);
eval { $itemtype->store; };
unless ($@) {
push @messages,
{ type => 'message', code => 'success_on_insert_itemtype' };
}
else {
push @messages,
{ type => 'message', code => 'error_on_insert_itemtype' };
}
}
$step++ if Koha::ItemTypes->count;
}
if ( $step == 5 ) {
if ( $op eq 'add_validate_circ_rule' ) {
#If no libraries exist then set the $branch value to *
my $branch = $input->param('branch') || '*';
my $type = $input->param('type');
my $branchcode = $input->param('branch');
my $categorycode = $input->param('categorycode');
my $itemtype = $input->param('itemtype');
my $maxissueqty = $input->param('maxissueqty');
my $issuelength = $input->param('issuelength');
my $lengthunit = $input->param('lengthunit');
my $renewalsallowed = $input->param('renewalsallowed');
my $renewalperiod = $input->param('renewalperiod');
my $onshelfholds = $input->param('onshelfholds') || 0;
$maxissueqty =~ s/\s//g;
$maxissueqty = undef if $maxissueqty !~ /^\d+/;
$issuelength = $issuelength eq q{} ? undef : $issuelength;
my $params = {
branchcode => $branchcode,
categorycode => $categorycode,
itemtype => $itemtype,
maxissueqty => $maxissueqty,
renewalsallowed => $renewalsallowed,
renewalperiod => $renewalperiod,
issuelength => $issuelength,
lengthunit => $lengthunit,
onshelfholds => $onshelfholds,
};
my $issuingrule = Koha::IssuingRule->new($params);
eval { $issuingrule->store; };
unless ($@) {
push @messages,
{ type => 'message', code => 'success_on_insert_circ_rule' };
}
else {
push @messages,
{ type => 'message', code => 'error_on_insert_circ_rule' };
}
}
$step++ if Koha::IssuingRules->count;
}
my $libraries = Koha::Libraries->search( {}, { order_by => ['branchcode'] }, );
$template_params->{libraries} = $libraries;
$template_params->{group_types} = [
{
categorytype => 'searchdomain',
categories => [
Koha::LibraryCategories->search(
{ categorytype => 'searchdomain' }
)
],
},
{
categorytype => 'properties',
categories => [
Koha::LibraryCategories->search( { categorytype => 'properties' } )
],
},
];
if ( $step > 5 ) {
$template_params->{all_done} = 1; # If step 5 is complete, we are done!
$step = 5;
}
#Getting the appropriate template to display to the user
my ( $template, $loggedinuser );
( $template, $loggedinuser, $cookie ) = C4::InstallAuth::get_template_and_user(
{
template_name => "onboarding/onboardingstep${step}.tt",
query => $input,
type => "intranet",
authnotrequired => 0,
debug => 1,
}
);
$template_params->{messages} = \@messages;
my $categories = Koha::Patron::Categories->search();
$template_params->{categories} = $categories;
my $itemtypes = Koha::ItemTypes->search();
$template_params->{itemtypes} = $itemtypes;
$template->param(%$template_params);
output_html_with_http_headers $input, $cookie, $template->output;