From 716b34d864ad9aebb90a544302b09ef43ed5787f Mon Sep 17 00:00:00 2001
From: Alex Buckley
Date: Mon, 12 Dec 2016 22:28:01 +0000
Subject: [PATCH] Bug 17855 - onboarding.pl script has been created.
The onboarding tool has been implemented and integrated with the updated
web installer. The onboarding tool has the following functionality:
* After the user has finished the web installer they are automatically
redirected to the onboarding tool with no authentication in between
required
* Ability to create library, patron category, patron (set with
superlibrarian priviliages), item type and circulation rule.
* If the uaser installed sample libraries, patron categories and/or item
types then the step to create one in the onboarding tool will be skipped
and a skipping message will be displayed.
*HTML regxes on all text input fields in all forms in the onboarding
tool this prevents the user from writing in special characters
*Working date picker on the patron category form
Test plan:
1. Go through the web installer and onboarding tool with the same steps
as outlined in this below guide and check that the functionality
outlined in the guide exists in the patch:
https://koha-community.org/manual/installation/html/
This is a combination of 67 commits.
Initial 3 HTML screens of the onboarding tool and
the perl onboarding.pl script
---
.../en/{default => optional}/patron_categories.sql | 0
.../en/{default => optional}/patron_categories.txt | 0
.../en/{default => optional}/sample_itemtypes.sql | 0
.../en/{default => optional}/sample_itemtypes.txt | 0
installer/install.pl | 23 +
installer/onboarding.pl | 594 +++++++++++++++++++++
.../intranet-tmpl/prog/en/includes/calendar.inc | 2 +-
.../intranet-tmpl/prog/en/includes/header.inc | 2 +
.../prog/en/includes/installer-doc-head-close.inc | 15 +
.../prog/en/modules/admin/categories.tt | 2 +-
.../prog/en/modules/installer/step3.tt | 148 ++---
.../intranet-tmpl/prog/en/modules/intranet-main.tt | 2 -
.../prog/en/modules/onboarding/onboardingstep0.tt | 18 +
.../prog/en/modules/onboarding/onboardingstep1.tt | 84 +++
.../prog/en/modules/onboarding/onboardingstep2.tt | 410 ++++++++++++++
.../prog/en/modules/onboarding/onboardingstep3.tt | 206 +++++++
.../prog/en/modules/onboarding/onboardingstep4.tt | 82 +++
.../prog/en/modules/onboarding/onboardingstep5.tt | 126 +++++
koha-tmpl/intranet-tmpl/prog/en/modules/summary.tt | 41 ++
summary.pl | 58 ++
20 files changed, 1744 insertions(+), 69 deletions(-)
rename installer/data/mysql/en/{default => optional}/patron_categories.sql (100%)
rename installer/data/mysql/en/{default => optional}/patron_categories.txt (100%)
rename installer/data/mysql/en/{default => optional}/sample_itemtypes.sql (100%)
rename installer/data/mysql/en/{default => optional}/sample_itemtypes.txt (100%)
create mode 100755 installer/onboarding.pl
create mode 100644 koha-tmpl/intranet-tmpl/prog/en/modules/onboarding/onboardingstep0.tt
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
create mode 100644 koha-tmpl/intranet-tmpl/prog/en/modules/summary.tt
create mode 100755 summary.pl
diff --git a/installer/data/mysql/en/default/patron_categories.sql b/installer/data/mysql/en/optional/patron_categories.sql
similarity index 100%
rename from installer/data/mysql/en/default/patron_categories.sql
rename to installer/data/mysql/en/optional/patron_categories.sql
diff --git a/installer/data/mysql/en/default/patron_categories.txt b/installer/data/mysql/en/optional/patron_categories.txt
similarity index 100%
rename from installer/data/mysql/en/default/patron_categories.txt
rename to installer/data/mysql/en/optional/patron_categories.txt
diff --git a/installer/data/mysql/en/default/sample_itemtypes.sql b/installer/data/mysql/en/optional/sample_itemtypes.sql
similarity index 100%
rename from installer/data/mysql/en/default/sample_itemtypes.sql
rename to installer/data/mysql/en/optional/sample_itemtypes.sql
diff --git a/installer/data/mysql/en/default/sample_itemtypes.txt b/installer/data/mysql/en/optional/sample_itemtypes.txt
similarity index 100%
rename from installer/data/mysql/en/default/sample_itemtypes.txt
rename to installer/data/mysql/en/optional/sample_itemtypes.txt
diff --git a/installer/install.pl b/installer/install.pl
index 512ca3c..800e867 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;
@@ -199,6 +216,7 @@ elsif ( $step && $step == 3 ) {
# 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
@@ -250,6 +268,10 @@ elsif ( $step && $step == 3 ) {
$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' ) {
#
@@ -270,6 +292,7 @@ elsif ( $step && $step == 3 ) {
# 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;
my $dir =
diff --git a/installer/onboarding.pl b/installer/onboarding.pl
new file mode 100755
index 0000000..b269f1a
--- /dev/null
+++ b/installer/onboarding.pl
@@ -0,0 +1,594 @@
+#!/usr/bin/perl
+#Recommended pragmas
+
+# 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;
+
+use Modern::Perl;
+use C4::InstallAuth;
+use CGI qw ( -utf8 );
+use List::MoreUtils qw/uniq/;
+use Digest::MD5 qw(md5_base64);
+use Encode qw( encode );
+use C4::Koha;
+use C4::Auth;
+use C4::Context;
+use C4::Output;
+use C4::Form::MessagingPreferences;
+use C4::Members;
+use C4::Members::Attributes;
+use C4::Members::AttributeTypes;
+use C4::Log;
+use C4::Letters;
+use C4::Form::MessagingPreferences;
+use Koha::AuthorisedValues;
+use Koha::Patron::Debarments;
+use Koha::Cities;
+use Koha::Patrons;
+use Koha::Items;
+use Koha::Libraries;
+use Koha::LibraryCategories;
+use Koha::Database;
+use Koha::DateUtils;
+use Koha::Patron::Categories;
+use Koha::Patron::HouseboundRole;
+use Koha::Patron::HouseboundRoles;
+use Koha::Token;
+use Email::Valid;
+use Module::Load;
+use Koha::ItemTypes;
+use Koha::IssuingRule;
+use Koha::IssuingRules;
+
+#Setting variables
+my $input = new CGI;
+my $query = new CGI;
+my $step = $query->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 : 0 ) . ".tt",
+ query => $query,
+ 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 = $query->param('op');
+$template->param('op'=>$op);
+if ( $op && $op eq 'finish' ) { #If the value of $op equals 'finish' then redirect user to /cgi-bin/koha/mainpage.pl
+ print $query->redirect("/cgi-bin/koha/mainpage.pl");
+ exit;
+}
+
+
+#Store the value of the template input name='start' in the variable $start so we can check if the user has pressed this button and started the onboarding tool process
+my $start = $query->param('start');
+$template->param('start'=>$start);
+
+if ( $start && $start eq 'Start setting up my Koha' ){
+ 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' } ) ],
+ },
+ ]
+ );
+
+
+}elsif ( $start && $start eq 'Add a patron category' ){
+#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
+}elsif ( $step && $step == 1 ) {
+ my $createlibrary = $query->param('createlibrary'); #Store the inputted library branch code and name in $createlibrary variable
+ $template->param('createlibrary'=>$createlibrary); # Hand the library values back to the template in the createlibrary variable
+
+ #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
+ my $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 ){
+ my $createcat = $query->param('createcat'); #Store the inputted category code and name in $createcat
+ $template->param('createcat'=>$createcat);
+
+ #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 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 $exisiting_cardnumber = my $sth_search = $dbh->prepare("SELECT MAX(cardnumber) FROM borrowers");
+ my $new_cardnumber = $exisiting_cardnumber + 1;
+ warn $new_cardnumber;
+ $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 $firstpassword = $input->param('password');
+ my $secondpassword = $input->param('password2');
+ my $cardnumber= $input->param('cardnumber');
+ my $borrowernumber= $input->param('borrowernumber');
+ my $userid=$input->param('userid');
+
+#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{dateexpiry} = '12/10/2016';
+ $newdata{privacy} = "default";
+
+
+#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 $module_flags = 0;
+ my $sth=$dbh->prepare("SELECT bit,flag FROM userflags ORDER BY bit");
+ $sth->execute();
+ while (my ($bit, $flag) = $sth->fetchrow_array) {
+ if (exists $all_module_perms{$flag}) {
+ $module_flags += 2**$bit;
+ }
+ }
+
+#Set the superlibrarian permission of the newly created patron to superlibrarian
+ $sth = $dbh->prepare("UPDATE borrowers SET flags=? WHERE borrowernumber=?");
+ $sth->execute($module_flags, $borrowernumber);
+
+
+ #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 $createitemtype = $input->param('createitemtype');
+ $template->param('createitemtype'=> $createitemtype );
+
+
+ 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;
+
+#New code from smart-rules.tt starts here. Needs to be added to library
+#Allows for the 'All' option to work when selecting all libraries for a circulation rule to apply to.
+ if ($branch eq "*") {
+ my $sth_search = $dbh->prepare("SELECT count(*) AS total
+ FROM default_circ_rules");
+ my $sth_insert = $dbh->prepare("INSERT INTO default_circ_rules
+ (maxissueqty, onshelfholds)
+ VALUES (?, ?)");
+ my $sth_update = $dbh->prepare("UPDATE default_circ_rules
+ SET maxissueqty = ?, onshelfholds = ?");
+
+ $sth_search->execute();
+ my $res = $sth_search->fetchrow_hashref();
+ if ($res->{total}) {
+ $sth_update->execute($maxissueqty, $onshelfholds);
+ } else {
+ $sth_insert->execute($maxissueqty, $onshelfholds);
+ }
+ }
+
+
+#Allows for the 'All' option to work when selecting all patron categories for a circulation rule to apply to.
+ if ($bor eq "*") {
+ my $sth_search = $dbh->prepare("SELECT count(*) AS total
+ FROM default_circ_rules");
+ my $sth_insert = $dbh->prepare(q|
+ INSERT INTO default_circ_rules
+ (maxissueqty)
+ VALUES (?)
+ |);
+ my $sth_update = $dbh->prepare(q|
+ UPDATE default_circ_rules
+ SET maxissueqty = ?
+ |);
+
+ $sth_search->execute();
+ my $res = $sth_search->fetchrow_hashref();
+ if ($res->{total}) {
+ $sth_update->execute($maxissueqty);
+ } else {
+ $sth_insert->execute($maxissueqty);
+ }
+ }
+#Allows for the 'All' option to work when selecting all itemtypes for a circulation rule to apply to
+ if ($itemtype eq "*") {
+ my $sth_search = $dbh->prepare("SELECT count(*) AS total
+ FROM default_branch_circ_rules
+ WHERE branchcode = ?");
+ my $sth_insert = $dbh->prepare("INSERT INTO default_branch_circ_rules
+ (branchcode, onshelfholds)
+ VALUES (?, ?)");
+ my $sth_update = $dbh->prepare("UPDATE default_branch_circ_rules
+ SET onshelfholds = ?
+ WHERE branchcode = ?");
+ $sth_search->execute($branch);
+ my $res = $sth_search->fetchrow_hashref();
+ if ($res->{total}) {
+ $sth_update->execute($onshelfholds, $branch);
+ } else {
+ $sth_insert->execute($branch, $onshelfholds);
+ }
+ }
+#End new code
+
+ 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 f6d9e9b..a4bbe62 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/header.inc b/koha-tmpl/intranet-tmpl/prog/en/includes/header.inc
index 193bcc1..9e56f71 100644
--- a/koha-tmpl/intranet-tmpl/prog/en/includes/header.inc
+++ b/koha-tmpl/intranet-tmpl/prog/en/includes/header.inc
@@ -42,6 +42,8 @@
+
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 a4b435c..60d0e66 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 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+function Hide(link)
+{
+ // Toggle the display of a given element on the page.
+ //
+ subfield = document.getElementById('bloc'+link);
+ var initstyle = subfield.style.display;
+ if (initstyle == 'block') subfield.style.display = 'none' ;
+ if (initstyle == 'none') subfield.style.display = 'block' ;
+}
+
+//]]>
+
[% END %]
+
+
[% IF ( finish ) %]
Congratulations, installation complete
-
If this page does not redirect in 5 seconds, click here.
+
If this page does not redirect in 5 seconds, click here.
[% END %]
+
+
[% IF ( choosemarc ) %]
-
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.
+
Choose your setup
+
Basic setup selects recommended settings by default.
-
Click 'Next' to continue
+
+
+
Click 'Next' to continue
+
+
[% END %]
+
[% IF ( selectframeworks ) %]
+
[% setup %] setup
Selecting Default Settings
+
+
+
+
+
+
+
+
+
+
Welcome to Koha
+
+
+
+
+[% IF categories.count > 0 %]
+
+
You do not need to create a patron category as you have already installed the sample patron categories data previously
+[% INCLUDE 'intranet-bottom.inc' %]
diff --git a/summary.pl b/summary.pl
new file mode 100755
index 0000000..992e487
--- /dev/null
+++ b/summary.pl
@@ -0,0 +1,58 @@
+#!/usr/bin/perl
+
+# Copyright Pat Eyler 2003
+# Copyright Biblibre 2006
+# Parts Copyright Liblime 2008
+# Parts Copyright Chris Nighswonger 2010
+#
+# 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 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 Modern::Perl;
+
+use CGI qw ( -utf8 );
+use List::MoreUtils qw/ any /;
+use LWP::Simple;
+use XML::Simple;
+use Config;
+
+use C4::Output;
+use C4::Auth;
+use C4::Context;
+use C4::Installer;
+
+use Koha;
+use Koha::Acquisition::Currencies;
+use Koha::Patrons;
+use Koha::Caches;
+use Koha::Config::SysPrefs;
+use C4::Members::Statistics;
+
+#use Smart::Comments '####';
+
+my $query = new CGI;
+my ( $template, $loggedinuser, $cookie ) = get_template_and_user(
+ {
+ template_name => "summary.tt",
+ query => $query,
+ type => "intranet",
+ authnotrequired => 0,
+ flagsrequired => { catalogue => 1 },
+ debug => 1,
+ }
+);
+
+
+output_html_with_http_headers $query, $cookie, $template->output;
--
2.1.4