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 @@
  • Administration
  • [% END %]
  • About Koha
  • +
  • Summary
  • + 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.

    + +
    + 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 %]

    @@ -82,13 +95,19 @@ [% END %]
    [% END %] -

    -

    Click 'Next' to continue

    + +

    +

    Click 'Next' to continue

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

    [% setup %] setup

    Selecting Default Settings

    + + + + + + + + +
    +

    Welcome to Koha

    +

    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

    +
    + +
    + +
    +
    + + +[% ELSIF createcat %] + [% 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
    + OR
    + 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 %] +

    Create a new Patron Category

    +
    +
    + + +
      +
    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 0000000..31848b1 --- /dev/null +++ b/koha-tmpl/intranet-tmpl/prog/en/modules/onboarding/onboardingstep3.tt @@ -0,0 +1,206 @@ + +[% 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' %] + + + +Create Patron + + + + + + + +
      +

      Welcome to Koha

      +

      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' %] + +
      + +

      New Patron

      +
      +

      Success: New 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 a new Patron

      + Library Management +

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

      +
      +
      + + + Library Management +

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

      + +
        +

        Patron Identity

        +
      1. + + + + Required +
      2. +
      3. + + + Required +
      4. +
      + +
        +
      1. + + + 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. +
      + +
        +

        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 0000000..cc58704 --- /dev/null +++ b/koha-tmpl/intranet-tmpl/prog/en/modules/onboarding/onboardingstep4.tt @@ -0,0 +1,82 @@ + +[% INCLUDE 'doc-head-open.inc' %] + +[% IF ( finish ) %][% END %] +[% INCLUDE 'installer-doc-head-close.inc' %] + + +Create item type + + + + + + + +
      +

      Welcome to Koha

      +

      Koha

      +
      + +[% IF itemtypes.count > 0 %] +
      +

      You do not need to create a item type as you have already installed the sample item type data previously

      +
      + +
      + +
      +
      + + + +[% 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 setttings
      + 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

      +
      +
      + + +
        +
      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 0000000..0c65810 --- /dev/null +++ b/koha-tmpl/intranet-tmpl/prog/en/modules/onboarding/onboardingstep5.tt @@ -0,0 +1,126 @@ +[% INCLUDE 'doc-head-open.inc' %] +Create Circulation rule +[% IF ( finish ) %][% END %] +[% INCLUDE 'installer-doc-head-close.inc' %] + + +
      +

      Welcome to Koha

      +

      Koha

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

      Congratulations you have finished and ready to use Koha

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

      New Circulation rule

      +
      +

      Success: New 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/koha-tmpl/intranet-tmpl/prog/en/modules/summary.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/summary.tt new file mode 100644 index 0000000..53a749e --- /dev/null +++ b/koha-tmpl/intranet-tmpl/prog/en/modules/summary.tt @@ -0,0 +1,41 @@ +[% USE Koha %] +[% INCLUDE 'doc-head-open.inc' %] +Koha Tutorial Summary +[% INCLUDE 'doc-head-close.inc' %] + + +[% INCLUDE 'header.inc' %] +[% INCLUDE 'cat-search.inc' %] + + + +
      +
      +
      +

      Tutorial Summary Page

      +
      +

      Library

      +

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

      + +

      Patron Category

      +

      To add another patron category and for more settings, go to
      + More > Administration > Patrons and Circulation > Patron Categories

      + +

      Patron

      +

      To create another patron, go to Patrons > New Patron. To set the
      + permissions of the patron, go to the patron's page and More > Set Permissions

      + +

      Item Type

      +

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

      + +

      Circulation Rule

      +

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

      +
      +
      +[% 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