@@ -, +, @@ --- installer/onboarding.pl | 562 +++++++-------------- .../prog/en/includes/onboarding_messages.inc | 20 + .../prog/en/modules/onboarding/onboardingstep1.tt | 109 ++-- .../prog/en/modules/onboarding/onboardingstep2.tt | 221 ++++---- .../prog/en/modules/onboarding/onboardingstep3.tt | 216 ++++---- .../prog/en/modules/onboarding/onboardingstep4.tt | 82 +-- .../prog/en/modules/onboarding/onboardingstep5.tt | 207 ++++---- 7 files changed, 525 insertions(+), 892 deletions(-) create mode 100644 koha-tmpl/intranet-tmpl/prog/en/includes/onboarding_messages.inc --- a/installer/onboarding.pl +++ a/installer/onboarding.pl @@ -35,133 +35,66 @@ use Koha::IssuingRules; #Setting variables my $input = new CGI; -my $step = $input->param('step'); unless ( C4::Context->preference('Version') ) { print $input->redirect("/cgi-bin/koha/installer/install.pl"); exit; } -#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, - } - ); +my ( $user, $cookie, $sessionID, $flags ) = + C4::InstallAuth::checkauth( $input, 0, undef, 'intranet' ); +die "Not logged in" + unless $user + ; # Should not happen, we should be redirect if the user is not logged in. But do not trust authentication... -#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 $step = $input->param('step') || 1; +my $op = $input->param('op') || ''; + +my $template_params = {}; +$template_params->{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 @messages; -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' } - ) - ], - }, - ] -); +if ( $step == 1 ) { -#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, ); + if ( $op eq 'add_validate_library' ) { -#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 ) - } - ); + my $branchcode = $input->param('branchcode'); + $branchcode = uc($branchcode); - eval { $library->store; }; #Use the eval{} function to store the library object - if ($library) { - $message = 'success_on_insert'; - } - else { - $message = 'error_on_insert'; + $branchcode =~ s|\s||g + ; # Use a regular expression to check the value of the inputted branchcode + + my $library = Koha::Library->new( + { + branchcode => $branchcode, + branchname => scalar $input->param('branchname'), + } + ); + + eval { $library->store; }; + unless ($@) { + push @messages, + { type => 'message', code => 'success_on_insert_library' }; + } + else { + push @messages, + { type => 'message', code => 'error_on_insert_library' }; + } } - $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 + $step++ if Koha::Libraries->count; } -elsif ( $step && $step == 2 ) { +if ( $step == 2 ) { if ( $op eq "add_validate_category" ) { - #Initialising values - my $searchfield = $input->param('description') // q||; + 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, - } - ); + $template_params->{categorycode} = $categorycode; - #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'); @@ -196,210 +129,89 @@ elsif ( $step && $step == 2 ) { eval { $category->store; }; - #Error messages - if ($category) { - $message = 'success_on_insert'; + unless ($@) { + push @messages, + { type => 'message', code => 'success_on_insert_category' }; } else { - $message = 'error_on_insert'; + push @messages, + { type => 'message', code => 'error_on_insert_category' }; } - - $template->param( 'message' => $message ); } - #Create a patron + $step++ if Koha::Patron::Categories->count; } -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 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 ( $step == 3 ) { + if ( $op eq 'add_validate_patron' ) { + + #Create a patron + my $firstpassword = $input->param('password') || ''; + my $secondpassword = $input->param('password2') || ''; + my $cardnumber = $input->param('cardnumber'); + my $userid = $input->param('userid'); + + if ( my $error_code = checkcardnumber($cardnumber) ) { + if ( $error_code == 1 ) { + push @messages, + { + type => 'alert', + code => 'ERROR_cardnumber_already_exists' + }; } - 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 ); + elsif ( $error_code == 2 ) { + push @messages, + { type => 'alert', code => 'ERROR_cardnumber_length' }; } } - $template->param( 'nok' => 1 ); + elsif ( $firstpassword ne $secondpassword ) { + + push @messages, + { type => 'alert', code => 'ERROR_password_mismatch' }; + } + else { + + my $patron_data = { + surname => scalar $input->param('surname'), + firstname => scalar $input->param('firstname'), + cardnumber => scalar $input->param('cardnumber'), + branchcode => scalar $input->param('libraries'), + categorycode => scalar $input->param('categorycode_entry'), + userid => scalar $input->param('userid'), + password => scalar $input->param('password'), + password2 => scalar $input->param('password2'), + privacy => "default", + address => "", + city => "", + flags => 1, # Will be superlibrarian + }; -#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 @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; - } - } + Koha::Patron::Categories->find( $patron_data->{categorycode} ); + $patron_data->{dateexpiry} = + $patron_category->get_expiry_date( $patron_data->{dateenrolled} ); - # 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' }; - } + my $borrowernumber = C4::Members::AddMember(%$patron_data); + + #Error handling checking if the patron was created successfully + if ($borrowernumber) { + push @messages, + { type => 'message', code => 'success_on_insert_patron' }; + } + else { + push @messages, + { type => 'error', code => 'error_on_insert_patron' }; } } } + + $step++ if Koha::Patrons->search( { flags => 1 } )->count; } -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" ) { +if ( $step == 4 ) { + if ( $op eq 'add_validate_itemtype' ) { my $description = $input->param('description'); my $itemtype_code = $input->param('itemtype'); $itemtype_code = uc($itemtype_code); - #Create a new itemtype object using the user inputted itemtype and description my $itemtype = Koha::ItemType->new( { itemtype => $itemtype_code, @@ -407,67 +219,29 @@ elsif ( $step && $step == 4 ) { } ); 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'; + unless ($@) { + push @messages, + { type => 'message', code => 'success_on_insert_itemtype' }; } else { - $message = 'error_on_insert'; + push @messages, + { type => 'message', code => 'error_on_insert_itemtype' }; } - $template->param( 'message' => $message ); } + + $step++ if Koha::ItemTypes->count; } -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, ); - - my $input = CGI->new; - - 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 ( $step == 5 ) { + + if ( $op eq 'add_validate_circ_rule' ) { + + #If no libraries exist then set the $branch value to * + my $branch = $input->param('branch') || '*'; - if ( $op eq 'add_validate' ) { my $type = $input->param('type'); - my $br = $input->param('branch'); - my $bor = $input->param('categorycode'); + my $branchcode = $input->param('branch'); + my $categorycode = $input->param('categorycode'); my $itemtype = $input->param('itemtype'); my $maxissueqty = $input->param('maxissueqty'); my $issuelength = $input->param('issuelength'); @@ -480,8 +254,8 @@ elsif ( $step && $step == 5 ) { $issuelength = $issuelength eq q{} ? undef : $issuelength; my $params = { - branchcode => $br, - categorycode => $bor, + branchcode => $branchcode, + categorycode => $categorycode, itemtype => $itemtype, maxissueqty => $maxissueqty, renewalsallowed => $renewalsallowed, @@ -491,59 +265,65 @@ elsif ( $step && $step == 5 ) { 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 $issuingrule = Koha::IssuingRule->new($params); + eval { $issuingrule->store; }; - 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(); + unless ($@) { 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. - + { type => 'message', code => 'success_on_insert_circ_rule' }; } else { - Koha::IssuingRule->new()->set($params)->store(); + push @messages, + { type => 'message', code => 'error_on_insert_circ_rule' }; } } + + $step++ if Koha::IssuingRules->count; +} + +my $libraries = Koha::Libraries->search( {}, { order_by => ['branchcode'] }, ); +$template_params->{libraries} = $libraries; +$template_params->{group_types} = [ + { + categorytype => 'searchdomain', + categories => [ + Koha::LibraryCategories->search( + { categorytype => 'searchdomain' } + ) + ], + }, + { + categorytype => 'properties', + categories => [ + Koha::LibraryCategories->search( { categorytype => 'properties' } ) + ], + }, +]; + +if ( $step > 5 ) { + $template_params->{all_done} = 1; # If step 5 is complete, we are done! + $step = 5; } +#Getting the appropriate template to display to the user +my ( $template, $loggedinuser ); +( $template, $loggedinuser, $cookie ) = C4::InstallAuth::get_template_and_user( + { + template_name => "onboarding/onboardingstep${step}.tt", + query => $input, + type => "intranet", + authnotrequired => 0, + debug => 1, + } +); + +$template_params->{messages} = \@messages; +my $categories = Koha::Patron::Categories->search(); +$template_params->{categories} = $categories; + +my $itemtypes = Koha::ItemTypes->search(); +$template_params->{itemtypes} = $itemtypes; + +$template->param(%$template_params); + output_html_with_http_headers $input, $cookie, $template->output; --- a/koha-tmpl/intranet-tmpl/prog/en/includes/onboarding_messages.inc +++ a/koha-tmpl/intranet-tmpl/prog/en/includes/onboarding_messages.inc @@ -0,0 +1,20 @@ +[% FOR m IN messages %] +
The patron category you create in this form is going to be the one which the new administrator patron account will have.
- -[% END %] + +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.
+Success: patron category created!
+ To add another patron category and for more settings
+ go to:
+ More -> Administration -> Patron categories
+
+
+
+
[% INCLUDE 'intranet-bottom.inc' %]
--- a/koha-tmpl/intranet-tmpl/prog/en/modules/onboarding/onboardingstep3.tt
+++ a/koha-tmpl/intranet-tmpl/prog/en/modules/onboarding/onboardingstep3.tt
@@ -3,7 +3,6 @@
[% USE KohaDates %]
[% USE Price %]
[% INCLUDE 'doc-head-open.inc' %]
-[% IF ( finish ) %][% END%]
[% INCLUDE 'installer-doc-head-close.inc' %]
[% INCLUDE 'calendar.inc' %]
[% INCLUDE 'datatables.inc' %]
@@ -59,138 +58,95 @@ $(document).ready(function(){
+ To create another patron, go to Patrons -> New Patron.
+ More -> Set Permissions in a user page to gain superlibrarian permissions.
+
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.
Success: circulation rule created!
- To create circulation rule, go to
- More -> Administration -> Circulation and Fine Rules
-
To create circulation rule, go to
+ More -> Administration -> Circulation and Fine Rules
+