d030aca6a9
This patch adds the following fields to the circ rule step in the onboarding tool: - holds allowed (total) - holds allowed (daily) - holds per record (count) To test: 1) Apply patch, drop and recreate database, restart memcached and refresh page 2) Go through the installer and get to the final step of the onboarding tool 3) Confirm the above fields are now available to set in your circulation rule 4) Save and log in to Koha 5) Go to Admin -> Circ and fines rules 6) Confirm the fields saved correctly Sponsored-by: Catalyst IT Signed-off-by: Owen Leonard <oleonard@myacpl.org> Signed-off-by: Martin Renvoize <martin.renvoize@ptfs-europe.com>
374 lines
13 KiB
Perl
Executable file
374 lines
13 KiB
Perl
Executable file
#!/usr/bin/perl
|
|
|
|
# This file is part of Koha.
|
|
#
|
|
# Copyright (C) 2017 Catalyst IT
|
|
#
|
|
# Koha is free software; you can redistribute it and/or modify it
|
|
# under the terms of the GNU General Public License as published by
|
|
# the Free Software Foundation; either version 3 of the License, or
|
|
# (at your option) any later version.
|
|
#
|
|
# Koha is distributed in the hope that it will be useful, but
|
|
# WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
# GNU General Public License for more details.
|
|
#
|
|
# You should have received a copy of the GNU General Public License
|
|
# along with Koha; if not, see <http://www.gnu.org/licenses>.
|
|
|
|
use Modern::Perl;
|
|
use C4::Context;
|
|
use C4::InstallAuth;
|
|
use CGI qw ( -utf8 );
|
|
use C4::Output;
|
|
use C4::Members qw(checkcardnumber);
|
|
use Koha::Patrons;
|
|
use Koha::Libraries;
|
|
use Koha::Database;
|
|
use Koha::DateUtils;
|
|
use Koha::Patrons;
|
|
use Koha::Patron::Categories;
|
|
use Koha::ItemTypes;
|
|
use Koha::CirculationRules;
|
|
|
|
#Setting variables
|
|
my $input = new CGI;
|
|
|
|
unless ( C4::Context->preference('Version') ) {
|
|
print $input->redirect("/cgi-bin/koha/installer/install.pl");
|
|
exit;
|
|
}
|
|
|
|
my ( $user, $cookie, $sessionID, $flags ) =
|
|
C4::InstallAuth::checkauth( $input, 0, undef, 'intranet' );
|
|
die "Not logged in"
|
|
unless $user
|
|
; # Should not happen, we should be redirect if the user is not logged in. But do not trust authentication...
|
|
|
|
my $step = $input->param('step') || 1;
|
|
my $op = $input->param('op') || '';
|
|
|
|
my $template_params = {};
|
|
$template_params->{op} = $op;
|
|
|
|
my $schema = Koha::Database->new()->schema();
|
|
|
|
my @messages;
|
|
|
|
if ( $step == 1 ) {
|
|
|
|
if ( $op eq 'add_validate_library' ) {
|
|
|
|
my $branchcode = $input->param('branchcode');
|
|
$branchcode = uc($branchcode);
|
|
|
|
$branchcode =~ s|\s||g
|
|
; # Use a regular expression to check the value of the inputted branchcode
|
|
|
|
my $library = Koha::Library->new(
|
|
{
|
|
branchcode => $branchcode,
|
|
branchname => scalar $input->param('branchname'),
|
|
}
|
|
);
|
|
|
|
eval { $library->store; };
|
|
unless ($@) {
|
|
push @messages, { code => 'success_on_insert_library' };
|
|
}
|
|
else {
|
|
push @messages, { code => 'error_on_insert_library' };
|
|
}
|
|
}
|
|
|
|
$step++ if Koha::Libraries->count;
|
|
}
|
|
if ( $step == 2 ) {
|
|
if ( $op eq "add_validate_category" ) {
|
|
|
|
my $searchfield = $input->param('description') // q||;
|
|
my $categorycode = $input->param('categorycode');
|
|
my $category;
|
|
$template_params->{categorycode} = $categorycode;
|
|
|
|
$categorycode = $input->param('categorycode');
|
|
my $description = $input->param('description');
|
|
my $overduenoticerequired = $input->param('overduenoticerequired');
|
|
my $category_type = $input->param('category_type');
|
|
my $default_privacy = $input->param('default_privacy');
|
|
my $enrolmentperiod = $input->param('enrolmentperiod');
|
|
my $enrolmentperioddate = $input->param('enrolmentperioddate') || undef;
|
|
|
|
#Converts the string into a date format
|
|
if ($enrolmentperioddate) {
|
|
$enrolmentperioddate = output_pref(
|
|
{
|
|
dt => dt_from_string($enrolmentperioddate),
|
|
dateformat => 'DateTime',
|
|
dateonly => 1,
|
|
}
|
|
);
|
|
}
|
|
|
|
#Adds a new patron category to the database
|
|
$category = Koha::Patron::Category->new(
|
|
{
|
|
categorycode => $categorycode,
|
|
description => $description,
|
|
overduenoticerequired => $overduenoticerequired,
|
|
category_type => $category_type,
|
|
default_privacy => $default_privacy,
|
|
enrolmentperiod => $enrolmentperiod,
|
|
enrolmentperioddate => $enrolmentperioddate
|
|
}
|
|
);
|
|
|
|
eval { $category->store; };
|
|
|
|
unless ($@) {
|
|
push @messages, { code => 'success_on_insert_category' };
|
|
}
|
|
else {
|
|
push @messages, { code => 'error_on_insert_category' };
|
|
}
|
|
}
|
|
|
|
$step++ if Koha::Patron::Categories->count;
|
|
}
|
|
if ( $step == 3 ) {
|
|
if ( $op eq 'add_validate_patron' ) {
|
|
|
|
#Create a patron
|
|
my $firstpassword = $input->param('password') || '';
|
|
my $secondpassword = $input->param('password2') || '';
|
|
my $cardnumber = $input->param('cardnumber');
|
|
my $userid = $input->param('userid');
|
|
|
|
my ( $is_valid, $passworderror) = Koha::AuthUtils::is_password_valid( $firstpassword );
|
|
|
|
if ( my $error_code = checkcardnumber($cardnumber) ) {
|
|
if ( $error_code == 1 ) {
|
|
push @messages, { code => 'ERROR_cardnumber_already_exists' };
|
|
}
|
|
elsif ( $error_code == 2 ) {
|
|
push @messages, { code => 'ERROR_cardnumber_length' };
|
|
}
|
|
}
|
|
elsif ( $firstpassword ne $secondpassword ) {
|
|
|
|
push @messages, { code => 'ERROR_password_mismatch' };
|
|
}
|
|
elsif ( $passworderror) {
|
|
push @messages, { code => 'ERROR_password_too_short'} if $passworderror eq 'too_short';
|
|
push @messages, { code => 'ERROR_password_too_weak'} if $passworderror eq 'too_weak';
|
|
push @messages, { code => 'ERROR_password_has_whitespaces'} if $passworderror eq 'has_whitespaces';
|
|
|
|
}
|
|
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'),
|
|
privacy => "default",
|
|
address => "",
|
|
city => "",
|
|
flags => 1, # Will be superlibrarian
|
|
};
|
|
|
|
my $patron_category =
|
|
Koha::Patron::Categories->find( $patron_data->{categorycode} );
|
|
$patron_data->{dateexpiry} =
|
|
$patron_category->get_expiry_date( $patron_data->{dateenrolled} );
|
|
|
|
eval {
|
|
my $patron = Koha::Patron->new($patron_data)->store;
|
|
$patron->set_password({ password => $firstpassword });
|
|
};
|
|
|
|
#Error handling checking if the patron was created successfully
|
|
unless ($@) {
|
|
push @messages, { code => 'success_on_insert_patron' };
|
|
}
|
|
else {
|
|
warn $@;
|
|
push @messages, { code => 'error_on_insert_patron' };
|
|
}
|
|
}
|
|
}
|
|
|
|
$step++ if Koha::Patrons->search( { flags => 1 } )->count;
|
|
}
|
|
if ( $step == 4 ) {
|
|
if ( $op eq 'add_validate_itemtype' ) {
|
|
my $description = $input->param('description');
|
|
my $itemtype_code = $input->param('itemtype');
|
|
$itemtype_code = uc($itemtype_code);
|
|
|
|
my $itemtype = Koha::ItemType->new(
|
|
{
|
|
itemtype => $itemtype_code,
|
|
description => $description,
|
|
}
|
|
);
|
|
eval { $itemtype->store; };
|
|
|
|
unless ($@) {
|
|
push @messages, { code => 'success_on_insert_itemtype' };
|
|
}
|
|
else {
|
|
push @messages, { code => 'error_on_insert_itemtype' };
|
|
}
|
|
}
|
|
|
|
$step++ if Koha::ItemTypes->count;
|
|
}
|
|
if ( $step == 5 ) {
|
|
|
|
if ( $op eq 'add_validate_circ_rule' ) {
|
|
|
|
#If no libraries exist then set the $branch value to *
|
|
my $branch = $input->param('branch') || '*';
|
|
|
|
my $type = $input->param('type');
|
|
my $branchcode = $input->param('branch');
|
|
my $categorycode = $input->param('categorycode');
|
|
my $itemtype = $input->param('itemtype');
|
|
my $maxissueqty = $input->param('maxissueqty');
|
|
my $issuelength = $input->param('issuelength');
|
|
my $lengthunit = $input->param('lengthunit');
|
|
my $renewalsallowed = $input->param('renewalsallowed');
|
|
my $renewalperiod = $input->param('renewalperiod');
|
|
my $reservesallowed = $input->param('reservesallowed');
|
|
my $holds_per_day = $input->param('holds_per_day');
|
|
my $holds_per_record = $input->param('holds_per_record');
|
|
my $onshelfholds = $input->param('onshelfholds') || 0;
|
|
$maxissueqty =~ s/\s//g;
|
|
$maxissueqty = undef if $maxissueqty !~ /^\d+/;
|
|
$issuelength = $issuelength eq q{} ? undef : $issuelength;
|
|
|
|
my $params = {
|
|
branchcode => $branchcode,
|
|
categorycode => $categorycode,
|
|
itemtype => $itemtype,
|
|
rules => {
|
|
renewalsallowed => $renewalsallowed,
|
|
renewalperiod => $renewalperiod,
|
|
issuelength => $issuelength,
|
|
lengthunit => $lengthunit,
|
|
onshelfholds => $onshelfholds,
|
|
article_requests => "no",
|
|
auto_renew => 0,
|
|
cap_fine_to_replacement_price => 0,
|
|
chargeperiod => 0,
|
|
chargeperiod_charge_at => 0,
|
|
fine => 0,
|
|
finedays => 0,
|
|
firstremind => 0,
|
|
hardduedate => "",
|
|
hardduedatecompare => -1,
|
|
holds_per_day => $holds_per_day,
|
|
holds_per_record => $holds_per_record,
|
|
maxissueqty => "",
|
|
maxonsiteissueqty => "",
|
|
maxsuspensiondays => "",
|
|
no_auto_renewal_after => "",
|
|
no_auto_renewal_after_hard_limit => "",
|
|
norenewalbefore => "",
|
|
opacitemholds => "N",
|
|
overduefinescap => "",
|
|
rentaldiscount => 0,
|
|
reservesallowed => $reservesallowed,
|
|
suspension_chargeperiod => undef,
|
|
}
|
|
};
|
|
|
|
my $params_2 = {
|
|
branchcode => $branchcode,
|
|
categorycode => $categorycode,
|
|
rules => {
|
|
patron_maxissueqty => "",
|
|
patron_maxonsiteissueqty => "",
|
|
max_holds => "",
|
|
}
|
|
};
|
|
|
|
my $params_3 = {
|
|
branchcode => $branchcode,
|
|
itemtype => $itemtype,
|
|
rules => {
|
|
holdallowed => "",
|
|
hold_fulfillment_policy => "",
|
|
returnbranch => "",
|
|
}
|
|
};
|
|
|
|
eval {
|
|
Koha::CirculationRules->set_rules($params);
|
|
Koha::CirculationRules->set_rules($params_2);
|
|
Koha::CirculationRules->set_rules($params_3);
|
|
};
|
|
|
|
if ($@) {
|
|
warn $@;
|
|
push @messages, { code => 'error_on_insert_circ_rule' };
|
|
} else {
|
|
|
|
eval {
|
|
Koha::CirculationRules->set_rules(
|
|
{
|
|
categorycode => $categorycode,
|
|
itemtype => $itemtype,
|
|
branchcode => $branchcode,
|
|
rules => {
|
|
maxissueqty => $maxissueqty,
|
|
}
|
|
}
|
|
);
|
|
};
|
|
|
|
unless ($@) {
|
|
push @messages, { code => 'success_on_insert_circ_rule' };
|
|
}
|
|
else {
|
|
push @messages, { code => 'error_on_insert_circ_rule' };
|
|
}
|
|
}
|
|
}
|
|
|
|
$step++ if Koha::CirculationRules->count;
|
|
}
|
|
|
|
my $libraries = Koha::Libraries->search( {}, { order_by => ['branchcode'] }, );
|
|
$template_params->{libraries} = $libraries;
|
|
|
|
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;
|