From 0492fcf87f170846d1e6c8683916a56cb67ce9a7 Mon Sep 17 00:00:00 2001 From: Alex Buckley Date: Thu, 9 Feb 2017 17:32:29 +0100 Subject: [PATCH] Bug 17855: Onboarding tool MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Tested 3 patches together on current master - Dropped database - Recreated database - Went through installer - Language en, Marc21 - Installed mandatory data only - Went through Onboarding tool - After finishing, logged in as superlibrarian that was created by onboarding tool Everything worked fine. Signed-off-by: Marc Véron Signed-off-by: Marc Véron Signed-off-by: Jonathan Druart Signed-off-by: Kyle M Hall --- .../mysql/en/optional/patron_categories.sql | 2 +- .../mysql/en/optional/patron_categories.txt | 6 +- .../mysql/en/optional/sample_holidays.txt | 5 +- .../mysql/en/optional/sample_libraries.txt | 2 +- .../en/optional/sample_z3950_servers.txt | 1 + installer/install.pl | 357 ++++++----- installer/onboarding.pl | 603 ++++++++++++++++++ .../prog/en/includes/calendar.inc | 2 +- .../en/includes/installer-doc-head-close.inc | 15 + .../prog/en/modules/admin/categories.tt | 2 +- .../prog/en/modules/installer/step3.tt | 303 +++++---- .../prog/en/modules/intranet-main.tt | 2 - .../en/modules/onboarding/onboardingstep1.tt | 81 +++ .../en/modules/onboarding/onboardingstep2.tt | 164 +++++ .../en/modules/onboarding/onboardingstep3.tt | 196 ++++++ .../en/modules/onboarding/onboardingstep4.tt | 67 ++ .../en/modules/onboarding/onboardingstep5.tt | 127 ++++ xt/sample_notices.t | 2 +- 18 files changed, 1653 insertions(+), 284 deletions(-) create mode 100755 installer/onboarding.pl create mode 100644 koha-tmpl/intranet-tmpl/prog/en/modules/onboarding/onboardingstep1.tt create mode 100644 koha-tmpl/intranet-tmpl/prog/en/modules/onboarding/onboardingstep2.tt create mode 100644 koha-tmpl/intranet-tmpl/prog/en/modules/onboarding/onboardingstep3.tt create mode 100644 koha-tmpl/intranet-tmpl/prog/en/modules/onboarding/onboardingstep4.tt create mode 100644 koha-tmpl/intranet-tmpl/prog/en/modules/onboarding/onboardingstep5.tt diff --git a/installer/data/mysql/en/optional/patron_categories.sql b/installer/data/mysql/en/optional/patron_categories.sql index 56439b4fbb..57a00dabdb 100644 --- a/installer/data/mysql/en/optional/patron_categories.sql +++ b/installer/data/mysql/en/optional/patron_categories.sql @@ -1,4 +1,4 @@ -INSERT INTO `categories` (`categorycode`, `description`, `enrolmentperiod`, `upperagelimit`, `dateofbirthrequired`, `finetype`, `bulk`, `enrolmentfee`, `overduenoticerequired`, `issuelimit`, `reservefee`, `category_type`) VALUES +INSERT INTO `categories` (`categorycode`, `description`, `enrolmentperiod`, `upperagelimit`, `dateofbirthrequired`, `finetype`, `bulk`, `enrolmentfee`, `overduenoticerequired`, `issuelimit`, `reservefee`, `category_type`) VALUES -- Adult Patrons ('PT','Patron',99,999,18,NULL,NULL,'0.000000',1,NULL,'0.000000','A'), diff --git a/installer/data/mysql/en/optional/patron_categories.txt b/installer/data/mysql/en/optional/patron_categories.txt index b94941a31c..45102b31d5 100644 --- a/installer/data/mysql/en/optional/patron_categories.txt +++ b/installer/data/mysql/en/optional/patron_categories.txt @@ -1,6 +1,4 @@ -Sample patron types and categories: - -Type: Categories: +Sample patron types and categories. Types are currently hardcoded but you can manage categories after installation from the administration module. Adult patron - default patron type PT - Patron @@ -21,5 +19,3 @@ Professional - a member of an organization (organization is guarantor) T - Teacher S - Staff B - Board - -Types are currently hardcoded, but you can add/edit/delete categories after installation from the administration module. diff --git a/installer/data/mysql/en/optional/sample_holidays.txt b/installer/data/mysql/en/optional/sample_holidays.txt index a2d2de957a..2f478e1e91 100644 --- a/installer/data/mysql/en/optional/sample_holidays.txt +++ b/installer/data/mysql/en/optional/sample_holidays.txt @@ -1,4 +1 @@ -Sample holidays: - Sundays - Christmas - New Year's +Sample holidays: Sunday, Christmas, New Year's diff --git a/installer/data/mysql/en/optional/sample_libraries.txt b/installer/data/mysql/en/optional/sample_libraries.txt index cbaf05c37b..2a1bd9a5f2 100644 --- a/installer/data/mysql/en/optional/sample_libraries.txt +++ b/installer/data/mysql/en/optional/sample_libraries.txt @@ -1 +1 @@ -A few sample libraries. +Sample libraries. diff --git a/installer/data/mysql/en/optional/sample_z3950_servers.txt b/installer/data/mysql/en/optional/sample_z3950_servers.txt index a0bab985a3..b7a48c0f0b 100644 --- a/installer/data/mysql/en/optional/sample_z3950_servers.txt +++ b/installer/data/mysql/en/optional/sample_z3950_servers.txt @@ -1,3 +1,4 @@ +Allow access to the following servers to search and download record information: LIBRARY OF CONGRESS LIBRARY OF CONGRESS NAMES (authority records) LIBRARY OF CONGRESS SUBJECTS (authority records) diff --git a/installer/install.pl b/installer/install.pl index 6f0ffda235..83bf21303c 100755 --- a/installer/install.pl +++ b/installer/install.pl @@ -1,5 +1,22 @@ #!/usr/bin/perl +# This file is part of Koha. +# +# Copyright (C) YEAR YOURNAME-OR-YOUREMPLOYER +# +# 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 . + use strict; use warnings; use diagnostics; @@ -40,10 +57,11 @@ if ( defined($language) ) { my $installer = C4::Installer->new(); my %info; $info{'dbname'} = C4::Context->config("database"); -$info{'dbms'} = - ( C4::Context->config("db_scheme") +$info{'dbms'} = ( + C4::Context->config("db_scheme") ? C4::Context->config("db_scheme") - : "mysql" ); + : "mysql" +); $info{'hostname'} = C4::Context->config("hostname"); $info{'port'} = C4::Context->config("port"); $info{'user'} = C4::Context->config("user"); @@ -65,12 +83,14 @@ my $dbh = DBI->connect( ); if ( $step && $step == 1 ) { + #First Step (for both fresh installations and upgrades) #Checking ALL perl Modules and services needed are installed. #Whenever there is an error, adding a report to the page my $op = $query->param('op') || 'noop'; - $template->param( language => 1 ); - $template->param( 'checkmodule' => 1 ); # we start with the assumption that there are no problems and set this to 0 if there are + $template->param( language => 1 ); + $template->param( 'checkmodule' => 1 ) + ; # we start with the assumption that there are no problems and set this to 0 if there are unless ( $] >= 5.010000 ) { # Bug 7375 $template->param( problems => 1, perlversion => 1, checkmodule => 0 ); @@ -80,11 +100,11 @@ if ( $step && $step == 1 ) { $perl_modules->versions_info; my $modules = $perl_modules->get_attr('missing_pm'); - if (scalar(@$modules)) { - my @components = (); + if ( scalar(@$modules) ) { + my @components = (); my $checkmodule = 1; foreach (@$modules) { - my ($module, $stats) = each %$_; + my ( $module, $stats ) = each %$_; $checkmodule = 0 if $stats->{'required'}; push( @components, @@ -96,14 +116,18 @@ if ( $step && $step == 1 ) { } ); } - @components = sort {$a->{'name'} cmp $b->{'name'}} @components; - $template->param( missing_modules => \@components, checkmodule => $checkmodule, op => $op ); + @components = sort { $a->{'name'} cmp $b->{'name'} } @components; + $template->param( + missing_modules => \@components, + checkmodule => $checkmodule, + op => $op + ); } } elsif ( $step && $step == 2 ) { -# -#STEP 2 Check Database connection and access -# + + #STEP 2 Check Database connection and access + $template->param(%info); my $checkdb = $query->param("checkdb"); $template->param( 'dbconnection' => $checkdb ); @@ -128,7 +152,9 @@ elsif ( $step && $step == 2 ) { my $grantaccess; while ( my ($line) = $rq->fetchrow ) { my $dbname = $info{dbname}; - if ( $line =~ m/^GRANT (.*?) ON `$dbname`\.\*/ || index( $line, '*.*' ) > 0 ) { + if ( $line =~ m/^GRANT (.*?) ON `$dbname`\.\*/ + || index( $line, '*.*' ) > 0 ) + { $grantaccess = 1 if ( index( $line, 'ALL PRIVILEGES' ) > 0 @@ -163,23 +189,28 @@ elsif ( $step && $step == 2 ) { } } $template->param( "checkgrantaccess" => $grantaccess ); - } # End mysql connect check... - - elsif ( $info{dbms} eq "Pg" ) { - # Check if database has been created... - my $rv = $dbh->do( "SELECT * FROM pg_catalog.pg_database WHERE datname = \'$info{dbname}\';" ); - if ( $rv == 1 ) { - $template->param( 'checkdatabasecreated' => 1 ); - } - - # Check if user has all necessary grants on this database... - my $rq = $dbh->do( "SELECT u.usesuper - FROM pg_catalog.pg_user as u - WHERE u.usename = \'$info{user}\';" ); - if ( $rq == 1 ) { - $template->param( "checkgrantaccess" => 1 ); - } - } # End Pg connect check... + } # End mysql connect check... + + elsif ( $info{dbms} eq "Pg" ) { + + # Check if database has been created... + my $rv = $dbh->do( +"SELECT * FROM pg_catalog.pg_database WHERE datname = \'$info{dbname}\';" + ); + if ( $rv == 1 ) { + $template->param( 'checkdatabasecreated' => 1 ); + } + + # Check if user has all necessary grants on this database... + my $rq = $dbh->do( + "SELECT u.usesuper + FROM pg_catalog.pg_user as u + WHERE u.usename = \'$info{user}\';" + ); + if ( $rq == 1 ) { + $template->param( "checkgrantaccess" => 1 ); + } + } # End Pg connect check... } else { $template->param( "error" => DBI::err, "message" => DBI::errstr ); @@ -187,11 +218,9 @@ elsif ( $step && $step == 2 ) { } } elsif ( $step && $step == 3 ) { -# -# -# STEP 3 : database setup -# -# + + # STEP 3 : database setup + my $op = $query->param('op'); if ( $op && $op eq 'finished' ) { # @@ -203,18 +232,20 @@ elsif ( $step && $step == 3 ) { elsif ( $op && $op eq 'finish' ) { $installer->set_version_syspref(); - # Installation is finished. - # We just deny anybody access to install - # And we redirect people to mainpage. - # The installer will have to relogin since we do not pass cookie to redirection. +# Installation is finished. +# We just deny anybody access to install +# And we redirect people to mainpage. +# The installer will have to relogin since we do not pass cookie to redirection. $template->param( "$op" => 1 ); } + elsif ( $op && $op eq 'addframeworks' ) { - # - # 1ST install, 3rd sub-step : insert the SQL files the user has selected - # - my ($fwk_language, $list) = $installer->load_sql_in_order($all_languages, $query->param('framework')); + # 1ST install, 3rd sub-step : insert the SQL files the user has selected + + my ( $fwk_language, $list ) = + $installer->load_sql_in_order( $all_languages, + $query->param('framework') ); $template->param( "fwklanguage" => $fwk_language, "list" => $list @@ -224,42 +255,50 @@ elsif ( $step && $step == 3 ) { $template->param( "$op" => 1 ); } elsif ( $op && $op eq 'selectframeworks' ) { - # - # - # 1ST install, 2nd sub-step : show the user the sql data they can insert in the database. - # - # - # (note that the term "selectframeworks is not correct. The user can select various files, not only frameworks) - - #Framework Selection - #sql data for import are supposed to be located in installer/data// - # Where is en|fr or any international abbreviation (provided language hash is updated... This will be a problem with internationlisation.) - # Where is a category of requirement : required, recommended optional - # level should contain : - # SQL File for import With a readable name. - # txt File that explains what this SQL File is meant for. - # Could be VERY useful to have A Big file for a kind of library. - # But could also be useful to have some Authorised values data set prepared here. - # Framework Selection is achieved through checking boxes. +# +# +# 1ST install, 2nd sub-step : show the user the sql datas they can insert in the database. +# +# +# (note that the term "selectframeworks is not correct. The user can select various files, not only frameworks) + +#Framework Selection +#sql data for import are supposed to be located in installer/data// +# Where is en|fr or any international abbreviation (provided language hash is updated... This will be a problem with internationlisation.) +# Where is a category of requirement : required, recommended optional +# level should contain : +# SQL File for import With a readable name. +# txt File that explains what this SQL File is meant for. +# Could be VERY useful to have A Big file for a kind of library. +# But could also be useful to have some Authorised values data set prepared here. +# Framework Selection is achieved through checking boxes. my $langchoice = $query->param('fwklanguage'); $langchoice = $query->cookie('KohaOpacLanguage') unless ($langchoice); - $langchoice =~ s/[^a-zA-Z_-]*//g; + $langchoice =~ s/[^a-zA-Z_-]*//g; my $marcflavour = $query->param('marcflavour'); - if ($marcflavour){ + if ($marcflavour) { $installer->set_marcflavour_syspref($marcflavour); - }; - $marcflavour = C4::Context->preference('marcflavour') unless ($marcflavour); + } + $marcflavour = C4::Context->preference('marcflavour') + unless ($marcflavour); + #Insert into database the selected marcflavour undef $/; - my ($marc_defaulted_to_en, $fwklist) = $installer->marc_framework_sql_list($langchoice, $marcflavour); - $template->param('en_marc_frameworks' => $marc_defaulted_to_en); - $template->param( "frameworksloop" => $fwklist ); - $template->param( "marcflavour" => ucfirst($marcflavour)); - - my ($sample_defaulted_to_en, $levellist) = $installer->sample_data_sql_list($langchoice); - $template->param( "en_sample_data" => $sample_defaulted_to_en); - $template->param( "levelloop" => $levellist ); - $template->param( "$op" => 1 ); + my ( $marc_defaulted_to_en, $fwklist ) = + $installer->marc_framework_sql_list( $langchoice, $marcflavour ); + $template->param( 'en_marc_frameworks' => $marc_defaulted_to_en ); + $template->param( "frameworksloop" => $fwklist ); + $template->param( "marcflavour" => ucfirst($marcflavour) ); + + my ( $sample_defaulted_to_en, $levellist ) = + $installer->sample_data_sql_list($langchoice); + $template->param( "en_sample_data" => $sample_defaulted_to_en ); + $template->param( "levelloop" => $levellist ); + $template->param( "$op" => 1 ); + + my $setup = $query->param('setup'); + $template->param( "setup" => $setup ); + } elsif ( $op && $op eq 'choosemarc' ) { # @@ -268,46 +307,55 @@ elsif ( $step && $step == 3 ) { # # - #Choose Marc Flavour - #sql data are supposed to be located in installer/data///marcflavour/marcflavourname - # Where is database type according to DBD syntax - # Where is en|fr or any international abbreviation (provided language hash is updated... This will be a problem with internationlisation.) - # Where is a category of requirement : required, recommended optional - # level should contain : - # SQL File for import With a readable name. - # txt File taht explains what this SQL File is meant for. - # Could be VERY useful to have A Big file for a kind of library. - # But could also be useful to have some Authorised values data set prepared here. - # Marcflavour Selection is achieved through radiobuttons. +#Choose Marc Flavour +#sql data are supposed to be located in installer/data///marcflavour/marcflavourname +# Where is database type according to DBD syntax +# Where is en|fr or any international abbreviation (provided language hash is updated... This will be a problem with internationlisation.) +# Where is a category of requirement : required, recommended optional +# level should contain : +# SQL File for import With a readable name. +# txt File taht explains what this SQL File is meant for. +# Could be VERY useful to have A Big file for a kind of library. +# But could also be useful to have some Authorised values data set prepared here. +# Marcflavour Selection is achieved through radiobuttons. my $langchoice = $query->param('fwklanguage'); + $langchoice = $query->cookie('KohaOpacLanguage') unless ($langchoice); - $langchoice =~ s/[^a-zA-Z_-]*//g; + $langchoice =~ s/[^a-zA-Z_-]*//g; my $dir = - C4::Context->config('intranetdir') . "/installer/data/$info{dbms}/$langchoice/marcflavour"; - unless (opendir( MYDIR, $dir )) { - if ($langchoice eq 'en') { + C4::Context->config('intranetdir') + . "/installer/data/$info{dbms}/$langchoice/marcflavour"; + unless ( opendir( MYDIR, $dir ) ) { + if ( $langchoice eq 'en' ) { warn "cannot open MARC frameworks directory $dir"; - } else { + } + else { # if no translated MARC framework is available, # default to English - $dir = C4::Context->config('intranetdir') . "/installer/data/$info{dbms}/en/marcflavour"; - opendir(MYDIR, $dir) or warn "cannot open English MARC frameworks directory $dir"; + $dir = C4::Context->config('intranetdir') + . "/installer/data/$info{dbms}/en/marcflavour"; + opendir( MYDIR, $dir ) + or warn "cannot open English MARC frameworks directory $dir"; } } my @listdir = grep { !/^\./ && -d "$dir/$_" } readdir(MYDIR); closedir MYDIR; - my $marcflavour=C4::Context->preference("marcflavour"); + my $marcflavour = C4::Context->preference("marcflavour"); my @flavourlist; foreach my $marc (@listdir) { - my %cell=( - "label"=> ucfirst($marc), - "code"=>uc($marc), - "checked"=> defined($marcflavour) ? uc($marc) eq $marcflavour : 0); + my %cell = ( + "label" => ucfirst($marc), + "code" => uc($marc), + "checked" => defined($marcflavour) + ? uc($marc) eq $marcflavour + : 0 + ); + # $cell{"description"}= do { local $/ = undef; open INPUT "<$dir/$marc.txt"||""; }; push @flavourlist, \%cell; } $template->param( "flavourloop" => \@flavourlist ); - $template->param( "$op" => 1 ); + $template->param( "$op" => 1 ); } elsif ( $op && $op eq 'importdatastructure' ) { # @@ -327,7 +375,7 @@ elsif ( $step && $step == 3 ) { # #Do updatedatabase And report - if ( ! defined $ENV{PERL5LIB} ) { + if ( !defined $ENV{PERL5LIB} ) { my $find = "C4/Context.pm"; my $path = $INC{$find}; $path =~ s/\Q$find\E//; @@ -335,60 +383,77 @@ elsif ( $step && $step == 3 ) { warn "# plack? inserted PERL5LIB $ENV{PERL5LIB}\n"; } - my $now = POSIX::strftime( "%Y-%m-%dT%H:%M:%S", localtime() ); - my $logdir = C4::Context->config('logdir'); - my $dbversion = C4::Context->preference('Version'); + my $now = POSIX::strftime( "%Y-%m-%dT%H:%M:%S", localtime() ); + my $logdir = C4::Context->config('logdir'); + my $dbversion = C4::Context->preference('Version'); my $kohaversion = Koha::version; $kohaversion =~ s/(.*\..*)\.(.*)\.(.*)/$1$2$3/; my $filename_suffix = join '_', $now, $dbversion, $kohaversion; - my ( $logfilepath, $logfilepath_errors ) = ( chk_log($logdir, "updatedatabase_$filename_suffix"), chk_log($logdir, "updatedatabase-error_$filename_suffix") ); + my ( $logfilepath, $logfilepath_errors ) = ( + chk_log( $logdir, "updatedatabase_$filename_suffix" ), + chk_log( $logdir, "updatedatabase-error_$filename_suffix" ) + ); - my $cmd = C4::Context->config("intranetdir") . "/installer/data/$info{dbms}/updatedatabase.pl >> $logfilepath 2>> $logfilepath_errors"; + my $cmd = C4::Context->config("intranetdir") + . "/installer/data/$info{dbms}/updatedatabase.pl >> $logfilepath 2>> $logfilepath_errors"; system($cmd ); my $fh; - open( $fh, "<", $logfilepath ) or die "Cannot open log file $logfilepath: $!"; + open( $fh, "<", $logfilepath ) + or die "Cannot open log file $logfilepath: $!"; my @report = <$fh>; close $fh; if (@report) { - $template->param( update_report => [ map { { line => $_ } } split( /\n/, join( '', @report ) ) ] ); + $template->param( update_report => + [ map { { line => $_ } } split( /\n/, join( '', @report ) ) ] + ); $template->param( has_update_succeeds => 1 ); - } else { - eval{ `rm $logfilepath` }; } - open( $fh, "<", $logfilepath_errors ) or die "Cannot open log file $logfilepath_errors: $!"; + else { + eval { `rm $logfilepath` }; + } + open( $fh, "<", $logfilepath_errors ) + or die "Cannot open log file $logfilepath_errors: $!"; @report = <$fh>; close $fh; if (@report) { - $template->param( update_errors => [ map { { line => $_ } } split( /\n/, join( '', @report ) ) ] ); + $template->param( update_errors => + [ map { { line => $_ } } split( /\n/, join( '', @report ) ) ] + ); $template->param( has_update_errors => 1 ); - warn "The following errors were returned while attempting to run the updatedatabase.pl script:\n"; + warn +"The following errors were returned while attempting to run the updatedatabase.pl script:\n"; foreach my $line (@report) { warn "$line\n"; } - } else { - eval{ `rm $logfilepath_errors` }; + } + else { + eval { `rm $logfilepath_errors` }; } $template->param( $op => 1 ); } else { - # - # check whether it's a 1st install or an update - # - #Check if there are enough tables. - # Paul has cleaned up tables so reduced the count - #I put it there because it implied a data import if condition was not satisfied. +# +# check whether it's a 1st install or an update +# +#Check if there are enough tables. +# Paul has cleaned up tables so reduced the count +#I put it there because it implied a data import if condition was not satisfied. my $dbh = DBI->connect( "DBI:$info{dbms}:dbname=$info{dbname};host=$info{hostname}" . ( $info{port} ? ";port=$info{port}" : "" ) . ( $info{tlsoptions} ? $info{tlsoptions} : "" ), $info{'user'}, $info{'password'} ); - my $rq; - if ( $info{dbms} eq 'mysql' ) { $rq = $dbh->prepare( "SHOW TABLES" ); } - elsif ( $info{dbms} eq 'Pg' ) { $rq = $dbh->prepare( "SELECT * - FROM information_schema.tables - WHERE table_schema='public' and table_type='BASE TABLE';" ); } + my $rq; + if ( $info{dbms} eq 'mysql' ) { $rq = $dbh->prepare("SHOW TABLES"); } + elsif ( $info{dbms} eq 'Pg' ) { + $rq = $dbh->prepare( + "SELECT * + FROM information_schema.tables + WHERE table_schema='public' and table_type='BASE TABLE';" + ); + } $rq->execute; my $data = $rq->fetchall_arrayref( {} ); my $count = scalar(@$data); @@ -399,23 +464,24 @@ elsif ( $step && $step == 3 ) { $template->param( "count" => $count, "proposeimport" => 1 ); } else { - # - # we have tables, propose to select files to upload or updatedatabase - # + # + # we have tables, propose to select files to upload or updatedatabase + # $template->param( "count" => $count, "default" => 1 ); - # - # 1st part of step 3 : check if there is a databaseversion systempreference - # if there is, then we just need to upgrade - # if there is none, then we need to install the database - # - if (C4::Context->preference('Version')) { + # + # 1st part of step 3 : check if there is a databaseversion systempreference + # if there is, then we just need to upgrade + # if there is none, then we need to install the database + # + if ( C4::Context->preference('Version') ) { my $dbversion = C4::Context->preference('Version'); $dbversion =~ /(.*)\.(..)(..)(...)/; $dbversion = "$1.$2.$3.$4"; - $template->param("upgrading" => 1, - "dbversion" => $dbversion, - "kohaversion" => Koha::version(), - ); + $template->param( + "upgrading" => 1, + "dbversion" => $dbversion, + "kohaversion" => Koha::version(), + ); } } } @@ -433,7 +499,8 @@ else { if ( $rq->execute ) { my ($version) = $rq->fetchrow; if ($version) { - print $query->redirect("/cgi-bin/koha/installer/install.pl?step=3"); + print $query->redirect( + "/cgi-bin/koha/installer/install.pl?step=3"); exit; } } @@ -441,13 +508,15 @@ else { } output_html_with_http_headers $query, $cookie, $template->output; -sub chk_log { #returns a logfile in $dir or - if that failed - in temp dir - my ($dir, $name) = @_; - my $fn=$dir.'/'.$name.'.log'; - if( ! open my $fh, '>', $fn ) { - $name.= '_XXXX'; +sub chk_log { #returns a logfile in $dir or - if that failed - in temp dir + my ( $dir, $name ) = @_; + my $fn = $dir . '/' . $name . '.log'; + if ( !open my $fh, '>', $fn ) { + $name .= '_XXXX'; require File::Temp; - ($fh, $fn)= File::Temp::tempfile( $name, TMPDIR => 1, SUFFIX => '.log'); + ( $fh, $fn ) = + File::Temp::tempfile( $name, TMPDIR => 1, SUFFIX => '.log' ); + #if this should not work, let croak take over } return $fn; diff --git a/installer/onboarding.pl b/installer/onboarding.pl new file mode 100755 index 0000000000..49f4e84567 --- /dev/null +++ b/installer/onboarding.pl @@ -0,0 +1,603 @@ +#!/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 . + +#Recommended pragmas +use Modern::Perl; +use diagnostics; +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; +my $step = $input->param('step'); + +#Getting the appropriate template to display to the user +my ( $template, $loggedinuser, $cookie ) = + C4::InstallAuth::get_template_and_user( + { + template_name => "/onboarding/onboardingstep" + . ( $step ? $step : 1 ) . ".tt", + query => $input, + type => "intranet", + authnotrequired => 0, + debug => 1, + } + ); + +#Check database connection +my %info; +$info{'dbname'} = C4::Context->config("database"); +$info{'dbms'} = ( + C4::Context->config("db_scheme") + ? C4::Context->config("db_scheme") + : "mysql" +); + +$info{'hostname'} = C4::Context->config("hostname"); +$info{'port'} = C4::Context->config("port"); +$info{'user'} = C4::Context->config("user"); +$info{'password'} = C4::Context->config("pass"); +my $dbh = DBI->connect( + "DBI:$info{dbms}:dbname=$info{dbname};host=$info{hostname}" + . ( $info{port} ? ";port=$info{port}" : "" ), + $info{'user'}, $info{'password'} +); + +#Store the value of the template input name='op' in the variable $op so we can check if the user has pressed the button with the name="op" and value="finish" meaning the user has finished the onboarding tool. +my $op = $input->param('op') || ''; +$template->param( 'op' => $op ); + +my $schema = Koha::Database->new()->schema(); + +if ( $op && $op eq 'finish' ) +{ #If the value of $op equals 'finish' then redirect user to /cgi-bin/koha/mainpage.pl + print $input->redirect("/cgi-bin/koha/mainpage.pl"); + exit; +} + +my $libraries = Koha::Libraries->search( {}, { order_by => ['branchcode'] }, ); +$template->param( + libraries => $libraries, + group_types => [ + { + categorytype => 'searchdomain', + categories => [ + Koha::LibraryCategories->search( + { categorytype => 'searchdomain' } + ) + ], + }, + { + categorytype => 'properties', + categories => [ + Koha::LibraryCategories->search( + { categorytype => 'properties' } + ) + ], + }, + ] +); + + +#Select all the patron category records in the categories database table and give them to the template + my $categories = Koha::Patron::Categories->search(); + $template->param( 'categories' => $categories, ); + +#Check if the $step variable equals 1 i.e. the user has clicked to create a library in the create library screen 1 + my $itemtypes = Koha::ItemTypes->search(); + $template->param( 'itemtypes' => $itemtypes, ); + +if ( $step && $step == 1 ) { + #store inputted parameters in variables + my $branchcode = $input->param('branchcode'); + $branchcode = uc($branchcode); + my $categorycode = $input->param('categorycode'); + my $op = $input->param('op') || 'list'; + my $message; + my $library; + + #Take the text 'branchname' and store it in the @fields array + my @fields = qw( + branchname + ); + + $template->param( 'branchcode' => $branchcode ); + $branchcode =~ s|\s||g + ; # Use a regular expression to check the value of the inputted branchcode + +#Create a new library object and store the branchcode and @fields array values in this new library object + $library = Koha::Library->new( + { + branchcode => $branchcode, + ( map { $_ => scalar $input->param($_) || undef } @fields ) + } + ); + + eval { $library->store; }; #Use the eval{} function to store the library object + if ($library) { + $message = 'success_on_insert'; + } + else { + $message = 'error_on_insert'; + } + $template->param( 'message' => $message ); + +#Check if the $step variable equals 2 i.e. the user has clicked to create a patron category in the create patron category screen 1 +} +elsif ( $step && $step == 2 ) { + if ($op eq "add_validate_category"){ + #Initialising values + my $searchfield = $input->param('description') // q||; + my $categorycode = $input->param('categorycode'); + my $op = $input->param('op') // 'list'; + my $message; + my $category; + $template->param( 'categorycode' => $categorycode ); + + my ( $template, $loggedinuser, $cookie ) = + C4::InstallAuth::get_template_and_user( + { + template_name => "/onboarding/onboardingstep2.tt", + query => $input, + type => "intranet", + authnotrequired => 0, + flagsrequired => + { parameters => 'parameters_remaining_permissions' }, + debug => 1, + } + ); + + #Once the user submits the page, this code validates the input and adds it + #to the database as a new patron category + $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 => 'iso', + 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; }; + + #Error messages + if ($category) { + $message = 'success_on_insert'; + } + else { + $message = 'error_on_insert'; + } + + $template->param( 'message' => $message ); + } + #Create a patron +} +elsif ( $step && $step == 3 ) { + my $firstpassword = $input->param('password') || ''; + my $secondpassword = $input->param('password2') || ''; + + + #Find all patron records in the database and hand them to the template + my %currentpatrons = Koha::Patrons->search(); + my $currentpatrons = values %currentpatrons; + $template->param( 'patrons' =>$currentpatrons); + + +#Find all library records in the database and hand them to the template to display in the library dropdown box + my $libraries = + Koha::Libraries->search( {}, { order_by => ['branchcode'] }, ); + $template->param( + libraries => $libraries, + group_types => [ + { + categorytype => 'searchdomain', + categories => [ + Koha::LibraryCategories->search( + { categorytype => 'searchdomain' } + ) + ], + }, + { + categorytype => 'properties', + categories => [ + Koha::LibraryCategories->search( + { categorytype => 'properties' } + ) + ], + }, + ] + ); + +#Find all patron categories in the database and hand them to the template to display in the patron category dropdown box + my $categories = Koha::Patron::Categories->search(); + $template->param( 'categories' => $categories, ); + +#Incrementing the highest existing patron cardnumber to prevent duplicate cardnumber entry + + my $existing_cardnumber = $schema->resultset('Borrower')->get_column('cardnumber')->max() // 0; + + my $new_cardnumber = $existing_cardnumber + 1; + $template->param( "newcardnumber" => $new_cardnumber ); + + my $op = $input->param('op') // 'list'; + my $minpw = C4::Context->preference("minPasswordLength"); + $template->param( "minPasswordLength" => $minpw ); + my @messages; + my @errors; + my $nok = $input->param('nok'); + my $cardnumber = $input->param('cardnumber'); + my $borrowernumber = $input->param('borrowernumber'); + my $userid = $input->param('userid'); + + # function to designate mandatory fields (visually with css) + my $check_BorrowerMandatoryField = + C4::Context->preference("BorrowerMandatoryField"); + my @field_check = split( /\|/, $check_BorrowerMandatoryField ); + foreach (@field_check) { + $template->param( "mandatory$_" => 1 ); + $template->param( + BorrowerMandatoryField => + C4::Context->preference("BorrowerMandatoryField") + , #field to test with javascript + ); + } + + #If the entered cardnumber causes an error hand this error to the @errors array + if ( my $error_code = checkcardnumber( $cardnumber, $borrowernumber ) ) { + push @errors, + $error_code == 1 ? 'ERROR_cardnumber_already_exists' + : $error_code == 2 ? 'ERROR_cardnumber_length' + : (); + } + + #If the entered password causes an error hand this error to the @errors array + push @errors, "ERROR_password_mismatch" + if $firstpassword ne $secondpassword; + push @errors, "ERROR_short_password" + if ( $firstpassword + && $minpw + && $firstpassword ne '****' + && ( length($firstpassword) < $minpw ) ); + + #Passing errors to template + $nok = $nok || scalar(@errors); + +#If errors have been generated from the users inputted cardnumber or password then display the error and do not insert the patron into the borrowers table + if ($nok) { + foreach my $error (@errors) { + if ( $error eq 'ERROR_password_mismatch' ) { + $template->param( errorpasswordmismatch => 1 ); + } + if ( $error eq 'ERROR_login_exist' ) { + $template->param( errorloginexists => 1 ); + } + if ( $error eq 'ERROR_cardnumber_already_exists' ) { + $template->param( errorcardnumberexists => 1 ); + } + if ( $error eq 'ERROR_cardnumber_length' ) { + $template->param( errorcardnumberlength => 1 ); + } + if ( $error eq 'ERROR_short_password' ) { + $template->param( errorshortpassword => 1 ); + } + } + $template->param( 'nok' => 1 ); + +#Else if no errors have been caused by the users inputted card number or password then insert the patron into the borrowers table + } + else { + my ( $template, $loggedinuser, $cookie ) = + C4::InstallAuth::get_template_and_user( + { + template_name => "/onboarding/onboardingstep3.tt", + query => $input, + type => "intranet", + authnotrequired => 0, + flagsrequired => { borrowers => 1 }, + debug => 1, + } + ); + + if ( $op eq 'add_validate' ) { + my %newdata; + + #Store the template form values in the newdata hash + $newdata{borrowernumber} = $input->param('borrowernumber'); + $newdata{surname} = $input->param('surname'); + $newdata{firstname} = $input->param('firstname'); + $newdata{cardnumber} = $input->param('cardnumber'); + $newdata{branchcode} = $input->param('libraries'); + $newdata{categorycode} = $input->param('categorycode_entry'); + $newdata{userid} = $input->param('userid'); + $newdata{password} = $input->param('password'); + $newdata{password2} = $input->param('password2'); + $newdata{privacy} = "default"; + $newdata{address} = ""; + $newdata{city} = ""; + +#Hand tne the dateexpiry of the patron based on the patron category it is created from + my $patron_category = Koha::Patron::Categories->find( $newdata{categorycode} ); + $newdata{dateexpiry} = $patron_category->get_expiry_date( $newdata{dateenrolled} ); + +#Hand the newdata hash to the AddMember subroutine in the C4::Members module and it creates a patron and hands back a borrowernumber which is being stored + my $borrowernumber = &AddMember(%newdata); + +#Create a hash named member2 and fill it with the borrowernumber of the borrower that has just been created + my %member2; + $member2{'borrowernumber'} = $borrowernumber; + +#Perform data validation on the flag that has been handed to onboarding.pl by the template + my $flag = $input->param('flag'); + if ( $input->param('newflags') ) { + my $dbh = C4::Context->dbh(); + my @perms = $input->multi_param('flag'); + my %all_module_perms = (); + my %sub_perms = (); + foreach my $perm (@perms) { + if ( $perm !~ /:/ ) { + $all_module_perms{$perm} = 1; + } + else { + my ( $module, $sub_perm ) = split /:/, $perm, 2; + push @{ $sub_perms{$module} }, $sub_perm; + } + } + + # construct flags + my @userflags = $schema->resultset('Userflag')->search({},{ + order_by => { -asc =>'bit'}, + } + ); + +#Setting superlibrarian permissions for new patron + my $flags = Koha::Patrons->find($borrowernumber)->set({flags=>1})->store; + + #Error handling checking if the patron was created successfully + if ( !$borrowernumber ) { + push @messages, + { type => 'error', code => 'error_on_insert' }; + } + else { + push @messages, + { type => 'message', code => 'success_on_insert' }; + } + } + } + } +} +elsif ( $step && $step == 4 ) { + my ( $template, $borrowernumber, $cookie ) = + C4::InstallAuth::get_template_and_user( + { + template_name => "/onboarding/onboardingstep4.tt", + query => $input, + type => "intranet", + authnotrequired => 0, + flagsrequired => + { parameters => 'parameters_remaining_permissions' }, + debug => 1, + } + ); + if ($op eq "add_validate"){ + my $description = $input->param('description'); + my $itemtype_code = $input->param('itemtype'); + $itemtype_code = uc($itemtype_code); + + #Create a new itemtype object using the user inputted itemtype and description + my $itemtype = Koha::ItemType->new( + { + itemtype => $itemtype_code, + description => $description, + } + ); + eval { $itemtype->store; }; + my $message; + +#Fill the $message variable with an error if the item type object was not successfully created and inserted into the itemtypes table + if ($itemtype) { + $message = 'success_on_insert'; + } + else { + $message = 'error_on_insert'; + } + $template->param( 'message' => $message ); + } +} +elsif ( $step && $step == 5 ) { + + #Find all the existing categories to display in a dropdown box in the template + my $categories; + $categories = Koha::Patron::Categories->search(); + $template->param( categories => $categories, ); + + #Find all the exisiting item types to display in a dropdown box in the template + my $itemtypes; + $itemtypes = Koha::ItemTypes->search(); + $template->param( itemtypes => $itemtypes, ); + + #Find all the exisiting libraries to display in a dropdown box in the template + my $libraries = + Koha::Libraries->search( {}, { order_by => ['branchcode'] }, ); + $template->param( + libraries => $libraries, + group_types => [ + { + categorytype => 'searchdomain', + categories => [ + Koha::LibraryCategories->search( + { categorytype => 'searchdomain' } + ) + ], + }, + { + categorytype => 'properties', + categories => [ + Koha::LibraryCategories->search( + { categorytype => 'properties' } + ) + ], + }, + ] + ); + + my $input = CGI->new; + my $dbh = C4::Context->dbh; + + my ( $template, $loggedinuser, $cookie ) = + C4::InstallAuth::get_template_and_user( + { + template_name => "/onboarding/onboardingstep5.tt", + query => $input, + type => "intranet", + authnotrequired => 0, + flagsrequired => { parameters => 'manage_circ_rules' }, + debug => 1, + } + ); + + #If no libraries exist then set the $branch value to * + my $branch = $input->param('branch'); + unless ($branch) { + if ( C4::Context->preference('DefaultToLoggedInLibraryCircRules') ) { + $branch = + Koha::Libraries->search->count() == 1 + ? undef + : C4::Context::mybranch(); + } + else { + $branch = + C4::Context::only_my_library() + ? ( C4::Context::mybranch() || '*' ) + : '*'; + } + } + $branch = '*' if $branch eq 'NO_LIBRARY_SET'; + my $op = $input->param('op') || q{}; + + if ( $op eq 'add_validate' ) { + my $type = $input->param('type'); + my $br = $input->param('branch'); + my $bor = $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 => $br, + categorycode => $bor, + itemtype => $itemtype, + maxissueqty => $maxissueqty, + renewalsallowed => $renewalsallowed, + renewalperiod => $renewalperiod, + issuelength => $issuelength, + lengthunit => $lengthunit, + onshelfholds => $onshelfholds, + }; + + my @messages; + +#Allows for the 'All' option to work when selecting all libraries for a circulation rule to apply to. + if ( $branch eq "*" ) { + my $search_default_rules = $schema->resultset('DefaultCircRule')->count(); + my $insert_default_rules = $schema->resultset('Issuingrule')->new( + { maxissueqty => $maxissueqty, onshelfholds => $onshelfholds } + ); + } +#Allows for the 'All' option to work when selecting all patron categories for a circulation rule to apply to. + elsif ( $bor eq "*" ) { + + my $search_default_rules = $schema->resultset('DefaultCircRule')->count(); + my $insert_default_rules = $schema->resultset('Issuingrule')->new( + { maxissueqty => $maxissueqty} + ); + } + +#Allows for the 'All' option to work when selecting all itemtypes for a circulation rule to apply to + elsif ( $itemtype eq "*" ) { + my $search_default_rules = $schema->resultset('DefaultCircRule')->search({},{ + branchcode => $branch + } + + ); + + my $insert_default_rules = $schema->resultset('Issuingrule')->new( + { branchcode => $branch, onshelfholds => $onshelfholds } + ); + } + + my $issuingrule = Koha::IssuingRules->find( + { categorycode => $bor, itemtype => $itemtype, branchcode => $br } + ); + if ($issuingrule) { + $issuingrule->set($params)->store(); + push @messages, + { + type => 'error', + code => 'error_on_insert' + }; #Stops crash of the onboarding tool if someone makes a circulation rule with the same item type, library and patron categroy as an exisiting circulation rule. + + } + else { + Koha::IssuingRule->new()->set($params)->store(); + } + } +} + +output_html_with_http_headers $input, $cookie, $template->output; diff --git a/koha-tmpl/intranet-tmpl/prog/en/includes/calendar.inc b/koha-tmpl/intranet-tmpl/prog/en/includes/calendar.inc index f6d9e9b66f..a4bbe627c6 100644 --- a/koha-tmpl/intranet-tmpl/prog/en/includes/calendar.inc +++ b/koha-tmpl/intranet-tmpl/prog/en/includes/calendar.inc @@ -6,7 +6,7 @@ var debug = "[% debug %]"; var dformat = "[% dateformat %]"; var sentmsg = 0; if (debug > 1) {alert("dateformat: " + dformat + "\ndebug is on (level " + debug + ")");} -var MSG_PLEASE_ENTER_A_VALID_DATE = _("Please enter a valid date (should match %s)."); +var MSG_PLEASE_ENTER_A_VALID_DATE = (_("Please enter a valid date (should match %s).")); function is_valid_date(date) { // An empty string is considered as a valid date for convenient reasons. diff --git a/koha-tmpl/intranet-tmpl/prog/en/includes/installer-doc-head-close.inc b/koha-tmpl/intranet-tmpl/prog/en/includes/installer-doc-head-close.inc index a4b435c0fe..60d0e66bbe 100644 --- a/koha-tmpl/intranet-tmpl/prog/en/includes/installer-doc-head-close.inc +++ b/koha-tmpl/intranet-tmpl/prog/en/includes/installer-doc-head-close.inc @@ -1,5 +1,9 @@ + + + + + + + + + + + + + + + +//]]> + [% END %] + + [% IF ( finish ) %]

Congratulations, installation complete

-

If this page does not redirect in 5 seconds, click here.

+

If this page does not redirect in 10 seconds, click Start onboarding process.

[% END %] + + [% IF ( choosemarc ) %] -

Select your MARC flavor

+

Choose your setup

+

Basic setup selects recommended settings by default.

- -

+ + +

+ Basic
+ Advanced
+
+ +

Select your MARC flavor

+

MARC stands for Machine Readable Cataloging, containing information about a bibliographic record. MARC21 is more commonly used globally, whereas UNIMARC tends to be used in Europe.

+ [% FOREACH flavourloo IN flavourloop %]
- [% IF ( flavourloo.checked ) %] - [% flavourloo.label %]
+ [% IF ( flavourloo.label == "Unimarc") %] + [% flavourloo.label %]
[% ELSE %] - [% flavourloo.label %]
+ [% flavourloo.label %]
[% END %]
[% END %] -

-

Click 'Next' to continue

+ +

Click 'Next' to continue

+
+ [% END %] [% IF ( selectframeworks ) %] -

Selecting Default Settings

- -
- - +

[% setup %] setup

+

Selecting Default Settings

+ [% IF setup == "Advanced" %] + + [% END %] + + + [% IF ( frameworksloop ) %] -

MARC frameworks: [% marcflavour %]

- [% IF ( en_marc_frameworks ) %] -

No MARC frameworks are available for your language. - Defaulting to the frameworks supplied for English (en)

- [% END %] - [% FOREACH frameworksloo IN frameworksloop %] -
-

[% frameworksloo.label %]

- [% FOREACH framework IN frameworksloo.frameworks %] - - - - -
- [% IF ( framework.checked ) %] - - [% ELSE %] - - [% END %] - - -
- [% END %] -
- [% END %] +

MARC frameworks: [% marcflavour %]

+ [% IF ( en_marc_frameworks ) %] +

No MARC frameworks are available for your language. + Defaulting to the frameworks supplied for English (en)

+ [% END %] + [% FOREACH frameworksloo IN frameworksloop %] +
+

[% frameworksloo.label %]

+ [% FOREACH framework IN frameworksloo.frameworks %] + + + + + [% ELSE %] + + [% END %] + +
+ [% IF (frameworksloo.label == "Default") && (setup=="Basic") %] + + [% ELSE %] + + [% END %] + + [% IF (frameworksloo.label == "Default") && (setup=="Basic") %] +
    +
  • + +
  • +
+
+ +
+ [% END %] +
+ [% END %]

Other data

[% END %] [% IF ( en_sample_data ) %] @@ -132,27 +164,49 @@ Defaulting to the samples supplied for English (en) [% END %] [% FOREACH levelloo IN levelloop %] -
-

[% levelloo.label %]

- [% FOREACH framework IN levelloo.frameworks %] - - - - -
- [% IF ( framework.checked ) %] - - [% ELSE %] - - [% END %] - - -
- [% END %] -
+
+

[% levelloo.label %]

+ + [% IF (setup == "Basic" && levelloo.label == "Optional") %] + + [% END %] + + [% FOREACH framework IN levelloo.frameworks %] + + + + + [% ELSE %] + + [% END %] + +
+ [% IF (levelloo.label == "Default" ) && (setup=="Basic")%] + + [% ELSE %] + + [% END %] + + [% IF (levelloo.label == "Default") && (setup=="Basic")%] +
    +
  • + +
  • +
+
+ +
+ [% END %] +
[% END %]

When you've made your selections, please click 'Import' below to begin the process. It may take a while to complete, please be patient.

@@ -177,11 +231,12 @@ You can help the Koha community by sharing your statistics with us.
If you wish to share some of your data, please enable the functionality in the "Share your usage statistics" section of the admin module.

-

Click on 'Finish' to complete and load the Koha Staff Interface. +

Click on 'Set up Koha with the onboarding tool' to complete and load the Koha onboarding tool. -

+ +

[% END %] @@ -214,22 +269,22 @@ [% END %] - [% IF ( default ) %] [% IF ( upgrading ) %]

- We are upgrading from Koha [% dbversion %] to [% kohaversion %], you must update your database + We are upgrading from Koha [% dbversion %] to [% kohaversion %], you must update your database. +
+

[% ELSE %] -

We are ready to do some basic configuration. Please - install basic configuration settings - to continue the installation. -

+

We are ready to do some basic configuration. Please install some basic configuration settings to continue the installation: +
+
+ + [% END %] [% END %] - - [% IF ( updatestructure ) %]

Updating database structure

[% IF ( has_update_succeeds ) %] @@ -251,7 +306,7 @@ [% UNLESS ( has_update_errors ) %]

Everything went OK, update done.

[% END %] -Continue to log in to Koha +
[% END %] diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/intranet-main.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/intranet-main.tt index fa5cde8c96..a09657735a 100644 --- a/koha-tmpl/intranet-tmpl/prog/en/modules/intranet-main.tt +++ b/koha-tmpl/intranet-tmpl/prog/en/modules/intranet-main.tt @@ -1,5 +1,3 @@ -[% USE Koha %] -[% SET footerjs = 1 %] [% INCLUDE 'doc-head-open.inc' %] Koha staff client diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/onboarding/onboardingstep1.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/onboarding/onboardingstep1.tt new file mode 100644 index 0000000000..b295fc9cea --- /dev/null +++ b/koha-tmpl/intranet-tmpl/prog/en/modules/onboarding/onboardingstep1.tt @@ -0,0 +1,81 @@ + +[% INCLUDE 'doc-head-open.inc' %] + +[% INCLUDE 'installer-doc-head-close.inc' %] +[% INCLUDE 'datatables.inc' %] + +[% IF (libraries && libraries.count > 1) %] + + +[% ELSIF (op == "add_validate_library") %] + + Welcome › to › Koha + + + +
+

Koha Welcome to Koha

+
+ + + [% IF message == "success_on_insert" %] +
+ +

New library

+
+

Success: library created! +

+

To add another library and for more settings,
+ go to:
+ More -> Administration -> Libraries and groups
+

+
+ Next up: + +
+ + [%ELSE %] +
+ +

Failed

+
+

Library was not successfully created
+ Please try again or contact your system administrator.

+
+ +
+ [%END%] + +[% ELSE %] + + Welcome › to › Koha + + + +
+

Koha Welcome to Koha

+
+ + +
+
+

Create a library

+ + +
    +
  1. + + + Required +
  2. +
  3. + + + Required +
  4. +
+
+ +
+
+[% END %] diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/onboarding/onboardingstep2.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/onboarding/onboardingstep2.tt new file mode 100644 index 0000000000..f0e90aafed --- /dev/null +++ b/koha-tmpl/intranet-tmpl/prog/en/modules/onboarding/onboardingstep2.tt @@ -0,0 +1,164 @@ +[% USE Koha %] +[% USE KohaDates %] +[% USE Price %] +[% INCLUDE 'doc-head-open.inc' %] + Add a patron category +[% INCLUDE 'installer-doc-head-close.inc' %] +[% INCLUDE 'calendar.inc' %] +[% INCLUDE 'js_includes.inc' %] +[% INCLUDE 'datatables.inc' %] + + + + +[% IF (categories && categories.count > 1 ) %] + + + + +[% ELSIF (op == "add_validate_category") %] + + +
+

Koha Welcome to Koha

+
+ + [% IF message != "error_on_insert" %] +
+ +

New patron category

+
+

Success: patron category created!

+

To add another patron category and for more settings
+ go to:
+ More -> Administration -> Patron categories
+

+ Next up:
+ +
+ [% ELSE %] +
+ Message is [% message %] + +

Failed

+
Patron category was not successfully created.
+ Please try again or contact your system administrator.

+
+ +
+ [% END %] + + +[% ELSE %] +
+

Koha Welcome to Koha

+
+ +

Create a new patron category

+

The patron category you create in this form is going to be the one which the new administrator patron account will have.

+
+
+ + +
    +
  1. + + + Required +
  2. + +
  3. + + + Required +
  4. + +
  5. + + +
  6. + +
  7. + + + Required +
  8. + +
  9. + + +

    Controls how long a patrons checkout history is kept for new patrons of this category. "Never" anonymizes checkouts on return, and "Forever" keeps a patron's checkout history indefinitely. When set to "Default", the amount of history kept is controlled by the cronjob batch_anonymise.pl which should be set up by your system administrator.

    +
  10. +
+ Enrolment period: +
+
+ Choose one +
    +
  1. + + months +
  2. +
  3. + + +
  4. +
+
+
+ +
+
+[% END %] + +[% INCLUDE 'intranet-bottom.inc' %] diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/onboarding/onboardingstep3.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/onboarding/onboardingstep3.tt new file mode 100644 index 0000000000..de2e595647 --- /dev/null +++ b/koha-tmpl/intranet-tmpl/prog/en/modules/onboarding/onboardingstep3.tt @@ -0,0 +1,196 @@ + +[% USE Koha %] +[% USE KohaDates %] +[% USE Price %] +[% INCLUDE 'doc-head-open.inc' %] +[% IF ( finish ) %][% END%] +[% INCLUDE 'installer-doc-head-close.inc' %] +[% INCLUDE 'calendar.inc' %] +[% INCLUDE 'datatables.inc' %] +[% INCLUDE 'js_includes.inc' %] + + +Create Koha administrator patron + + + + + +
+

Koha Welcome to Koha

+
+ + +[% IF (nok) %] +
+ +

There was an error

+

Try again

+
+
    + [% IF errorloginexists %] +
  • Username/password already exists.
  • + [% END %] + [% IF errorcardnumberexists %] +
  • Cardnumber already in use.
  • + [% END %] + [% IF errorcardnumberlength %] +
  • Cardnumber length is incorrect
  • + [% END %] + [% IF errorshortpassword %] +
  • Password length is incorrect, must be at least [% minPasswordLength %] characters long.
  • + [% END %] + [% IF errorpasswordmismatch %] +
  • Passwords do not match.
  • + [% END %] +
+ +
+ +
+ + + +[% ELSIF op == 'add_validate' %] + +
+ +

Koha administrator patron

+
+

Success: administrator patron created!

+

To create another patron, go to Patrons -> New Patron.
+ More -> Set Permissions in a user page to gain superlibrarian permissions. +

+ Next up: + +
+[% ELSE %] + +

Create koha administrator patron

+

+ Now we will create a patron with superlibrarian permissions. Login with this to access Koha as a staff member will all permissions. +

+
+
+ + + Library management +
    +

    Patron identity

    +
  1. + + + Required +
  2. +
  3. + + + Required +
  4. +
+ +
    +
  1. + + [% IF patrons && patrons > 1 %] + + [% ELSE %] + + [% END %] + Required +
  2. +
  3. + + + + + Required +
  4. +
  5. + + + Required

    + Note: If you installed sample patron categories please select the "Staff" option in the patron categories dropdown box. +
  6. +
+ +
    +

    Koha administrator patron permissions

    + +
  1. + + +
  2. +
+
    +

    OPAC/Staff Login

    +
  1. + + + + Required +
  2. +
  3. + + + Required +
  4. +
  5. + + + Required +
  6. +
+

+ +
+[% END %] diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/onboarding/onboardingstep4.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/onboarding/onboardingstep4.tt new file mode 100644 index 0000000000..6176fb4c70 --- /dev/null +++ b/koha-tmpl/intranet-tmpl/prog/en/modules/onboarding/onboardingstep4.tt @@ -0,0 +1,67 @@ + +[% INCLUDE 'doc-head-open.inc' %] +[% IF ( finish ) %][% END%] +[% INCLUDE 'installer-doc-head-close.inc' %] + + Create item type + +
+

Koha Welcome to Koha

+
+ +[% IF (itemtypes && itemtypes.count >1) %] + + + +[% ELSIF op == "add_validate" %] + [% IF message != "error_on_insert" %] +
+ +

New Item type

+
+

Success: New item type created!

+

To create another item type later and for more settings
+ go to:
+ More -> Administration -> Item types
+

+ Next up: + +
+ [% ELSE %] +
+ +

Failed

+
+

Item type was not successfully created.
+ Please try again or contact your system administrator. +

+
+
+ + [% END %] +[% ELSE %] + +

Create a new Item type

+

Item types are used to group related items. Examples of item types are books, cds, and DVDs.

When adding to your institutions catalogue you will create an item of a particular item type.

Importantly item types are what you apply circulation rules to. Circulation rules govern how your institution will lend its items, for example a circulation rule applied to the DVD item type may enforce a payment of $1.00 for borrowing any DVD.

+
+
+ + +
    +
  1. + + + Required +
  2. + +
  3. + + + Required +
  4. +
+
+ +
+
+[% END %] diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/onboarding/onboardingstep5.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/onboarding/onboardingstep5.tt new file mode 100644 index 0000000000..81ba89c0b3 --- /dev/null +++ b/koha-tmpl/intranet-tmpl/prog/en/modules/onboarding/onboardingstep5.tt @@ -0,0 +1,127 @@ +[% INCLUDE 'doc-head-open.inc' %] +Create Circulation rule +[% IF ( finish ) %][% END %] +[% INCLUDE 'installer-doc-head-close.inc' %] + +
+

Koha Welcome to Koha

+
+ +[% IF (finish) %] +

Congratulations you have finished and ready to use Koha

+Start using Koha + +[% END %] + + +[% IF op == "add_validate" %] + +
+ +

New circulation rule

+
+

Success: circulation rule created!

+

To create circulation rule, go to
+ More -> Administration -> Circulation and Fine Rules +

+ Next up: + +
+[% ELSE %] + +

Create a new circulation rule

+
+
+ + +
    +
  1. + + + Required +
  2. +
  3. + + + Required +
  4. + +
  5. + + + Required +
  6. +
  7. + + + Required +
  8. + +
  9. + + + Required +
  10. +
  11. + + +
  12. +
  13. + + + Required +
  14. + +
  15. + + + Required +
  16. + +
  17. + + +
  18. +
+

+ +
+[% END %] diff --git a/xt/sample_notices.t b/xt/sample_notices.t index 26534077ea..39e3ab20cc 100755 --- a/xt/sample_notices.t +++ b/xt/sample_notices.t @@ -22,7 +22,7 @@ use Test::More qw(no_plan); my $root_dir = 'installer/data/mysql'; -my $base_notices_file = "en/mandatory/sample_notices.sql"; +my $base_notices_file = "en/default/sample_notices.sql"; my @trans_notices_files = qw( fr-FR/1-Obligatoire/sample_notices.sql fr-CA/obligatoire/sample_notices.sql -- 2.39.5