View | Details | Raw Unified | Return to bug 17855
Collapse All | Expand All

(-)a/installer/data/mysql/en/optional/patron_categories.sql (-1 / +1 lines)
Lines 1-4 Link Here
1
INSERT INTO `categories` (`categorycode`, `description`, `enrolmentperiod`, `upperagelimit`, `dateofbirthrequired`, `finetype`, `bulk`, `enrolmentfee`, `overduenoticerequired`, `issuelimit`, `reservefee`, `category_type`) VALUES 
1
INSERT INTO `categories` (`categorycode`, `description`, `enrolmentperiod`, `upperagelimit`, `dateofbirthrequired`, `finetype`, `bulk`, `enrolmentfee`, `overduenoticerequired`, `issuelimit`, `reservefee`, `category_type`) VALUES
2
2
3
-- Adult Patrons
3
-- Adult Patrons
4
('PT','Patron',99,999,18,NULL,NULL,'0.000000',1,NULL,'0.000000','A'),
4
('PT','Patron',99,999,18,NULL,NULL,'0.000000',1,NULL,'0.000000','A'),
(-)a/installer/data/mysql/en/optional/patron_categories.txt (-5 / +1 lines)
Lines 1-6 Link Here
1
Sample patron types and categories: 
1
Sample patron types and categories. Types are currently hardcoded but you can manage categories after installation from the administration module.
2
3
Type:           Categories:
4
2
5
Adult patron - default patron type
3
Adult patron - default patron type
6
                PT  - Patron
4
                PT  - Patron
Lines 21-25 Professional - a member of an organization (organization is guarantor) Link Here
21
                T   - Teacher
19
                T   - Teacher
22
                S   - Staff
20
                S   - Staff
23
                B   - Board
21
                B   - Board
24
25
Types are currently hardcoded, but you can add/edit/delete categories after installation from the administration module.
(-)a/installer/data/mysql/en/optional/sample_holidays.txt (-4 / +1 lines)
Lines 1-4 Link Here
1
Sample holidays:
1
Sample holidays: Sunday, Christmas, New Year's
2
	Sundays
3
	Christmas
4
	New Year's
(-)a/installer/data/mysql/en/optional/sample_libraries.txt (-1 / +1 lines)
Line 1 Link Here
1
A few sample libraries.
1
Sample libraries.
(-)a/installer/data/mysql/en/optional/sample_z3950_servers.txt (+1 lines)
Lines 1-3 Link Here
1
Allow access to the following servers to search and download record information:
1
LIBRARY OF CONGRESS
2
LIBRARY OF CONGRESS
2
LIBRARY OF CONGRESS NAMES (authority records)
3
LIBRARY OF CONGRESS NAMES (authority records)
3
LIBRARY OF CONGRESS SUBJECTS (authority records)
4
LIBRARY OF CONGRESS SUBJECTS (authority records)
(-)a/installer/install.pl (-144 / +213 lines)
Lines 1-5 Link Here
1
#!/usr/bin/perl
1
#!/usr/bin/perl
2
2
3
# This file is part of Koha.
4
#
5
# Copyright (C) YEAR  YOURNAME-OR-YOUREMPLOYER
6
#
7
# Koha is free software; you can redistribute it and/or modify it
8
# under the terms of the GNU General Public License as published by
9
# the Free Software Foundation; either version 3 of the License, or
10
# (at your option) any later version.
11
#
12
# Koha is distributed in the hope that it will be useful, but
13
# WITHOUT ANY WARRANTY; without even the implied warranty of
14
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
# GNU General Public License for more details.
16
#
17
# You should have received a copy of the GNU General Public License
18
# along with Koha; if not, see <http://www.gnu.org/licenses>.
19
3
use strict;
20
use strict;
4
use warnings;
21
use warnings;
5
use diagnostics;
22
use diagnostics;
Lines 40-49 if ( defined($language) ) { Link Here
40
my $installer = C4::Installer->new();
57
my $installer = C4::Installer->new();
41
my %info;
58
my %info;
42
$info{'dbname'} = C4::Context->config("database");
59
$info{'dbname'} = C4::Context->config("database");
43
$info{'dbms'} =
60
$info{'dbms'}   = (
44
  (   C4::Context->config("db_scheme")
61
      C4::Context->config("db_scheme")
45
    ? C4::Context->config("db_scheme")
62
    ? C4::Context->config("db_scheme")
46
    : "mysql" );
63
    : "mysql"
64
);
47
$info{'hostname'} = C4::Context->config("hostname");
65
$info{'hostname'} = C4::Context->config("hostname");
48
$info{'port'}     = C4::Context->config("port");
66
$info{'port'}     = C4::Context->config("port");
49
$info{'user'}     = C4::Context->config("user");
67
$info{'user'}     = C4::Context->config("user");
Lines 65-76 my $dbh = DBI->connect( Link Here
65
);
83
);
66
84
67
if ( $step && $step == 1 ) {
85
if ( $step && $step == 1 ) {
86
68
    #First Step (for both fresh installations and upgrades)
87
    #First Step (for both fresh installations and upgrades)
69
    #Checking ALL perl Modules and services needed are installed.
88
    #Checking ALL perl Modules and services needed are installed.
70
    #Whenever there is an error, adding a report to the page
89
    #Whenever there is an error, adding a report to the page
71
    my $op = $query->param('op') || 'noop';
90
    my $op = $query->param('op') || 'noop';
72
    $template->param( language => 1 );
91
    $template->param( language      => 1 );
73
    $template->param( 'checkmodule' => 1 ); # we start with the assumption that there are no problems and set this to 0 if there are
92
    $template->param( 'checkmodule' => 1 )
93
      ; # we start with the assumption that there are no problems and set this to 0 if there are
74
94
75
    unless ( $] >= 5.010000 ) {    # Bug 7375
95
    unless ( $] >= 5.010000 ) {    # Bug 7375
76
        $template->param( problems => 1, perlversion => 1, checkmodule => 0 );
96
        $template->param( problems => 1, perlversion => 1, checkmodule => 0 );
Lines 80-90 if ( $step && $step == 1 ) { Link Here
80
    $perl_modules->versions_info;
100
    $perl_modules->versions_info;
81
101
82
    my $modules = $perl_modules->get_attr('missing_pm');
102
    my $modules = $perl_modules->get_attr('missing_pm');
83
    if (scalar(@$modules)) {
103
    if ( scalar(@$modules) ) {
84
        my @components = ();
104
        my @components  = ();
85
        my $checkmodule = 1;
105
        my $checkmodule = 1;
86
        foreach (@$modules) {
106
        foreach (@$modules) {
87
            my ($module, $stats) = each %$_;
107
            my ( $module, $stats ) = each %$_;
88
            $checkmodule = 0 if $stats->{'required'};
108
            $checkmodule = 0 if $stats->{'required'};
89
            push(
109
            push(
90
                @components,
110
                @components,
Lines 96-109 if ( $step && $step == 1 ) { Link Here
96
                }
116
                }
97
            );
117
            );
98
        }
118
        }
99
        @components = sort {$a->{'name'} cmp $b->{'name'}} @components;
119
        @components = sort { $a->{'name'} cmp $b->{'name'} } @components;
100
        $template->param( missing_modules => \@components, checkmodule => $checkmodule, op => $op );
120
        $template->param(
121
            missing_modules => \@components,
122
            checkmodule     => $checkmodule,
123
            op              => $op
124
        );
101
    }
125
    }
102
}
126
}
103
elsif ( $step && $step == 2 ) {
127
elsif ( $step && $step == 2 ) {
104
#
128
105
#STEP 2 Check Database connection and access
129
    #STEP 2 Check Database connection and access
106
#
130
107
    $template->param(%info);
131
    $template->param(%info);
108
    my $checkdb = $query->param("checkdb");
132
    my $checkdb = $query->param("checkdb");
109
    $template->param( 'dbconnection' => $checkdb );
133
    $template->param( 'dbconnection' => $checkdb );
Lines 128-134 elsif ( $step && $step == 2 ) { Link Here
128
                my $grantaccess;
152
                my $grantaccess;
129
                while ( my ($line) = $rq->fetchrow ) {
153
                while ( my ($line) = $rq->fetchrow ) {
130
                    my $dbname = $info{dbname};
154
                    my $dbname = $info{dbname};
131
                    if ( $line =~ m/^GRANT (.*?) ON `$dbname`\.\*/ || index( $line, '*.*' ) > 0 ) {
155
                    if ( $line =~ m/^GRANT (.*?) ON `$dbname`\.\*/
156
                        || index( $line, '*.*' ) > 0 )
157
                    {
132
                        $grantaccess = 1
158
                        $grantaccess = 1
133
                          if (
159
                          if (
134
                            index( $line, 'ALL PRIVILEGES' ) > 0
160
                            index( $line, 'ALL PRIVILEGES' ) > 0
Lines 163-185 elsif ( $step && $step == 2 ) { Link Here
163
                    }
189
                    }
164
                }
190
                }
165
                $template->param( "checkgrantaccess" => $grantaccess );
191
                $template->param( "checkgrantaccess" => $grantaccess );
166
            }	# End mysql connect check...
192
            }    # End mysql connect check...
167
193
168
	    elsif ( $info{dbms} eq "Pg" ) {
194
            elsif ( $info{dbms} eq "Pg" ) {
169
		# Check if database has been created...
195
170
		my $rv = $dbh->do( "SELECT * FROM pg_catalog.pg_database WHERE datname = \'$info{dbname}\';" );
196
                # Check if database has been created...
171
		if ( $rv == 1 )	{
197
                my $rv = $dbh->do(
172
			$template->param( 'checkdatabasecreated' => 1 );
198
"SELECT * FROM pg_catalog.pg_database WHERE datname = \'$info{dbname}\';"
173
		}
199
                );
174
200
                if ( $rv == 1 ) {
175
		# Check if user has all necessary grants on this database...
201
                    $template->param( 'checkdatabasecreated' => 1 );
176
		my $rq = $dbh->do( "SELECT u.usesuper
202
                }
177
				    FROM pg_catalog.pg_user as u
203
178
				    WHERE u.usename = \'$info{user}\';" );
204
                # Check if user has all necessary grants on this database...
179
		if ( $rq == 1 ) {
205
                my $rq = $dbh->do(
180
			$template->param( "checkgrantaccess" => 1 );
206
                    "SELECT u.usesuper
181
		}
207
            FROM pg_catalog.pg_user as u
182
            }	# End Pg connect check...
208
            WHERE u.usename = \'$info{user}\';"
209
                );
210
                if ( $rq == 1 ) {
211
                    $template->param( "checkgrantaccess" => 1 );
212
                }
213
            }    # End Pg connect check...
183
        }
214
        }
184
        else {
215
        else {
185
            $template->param( "error" => DBI::err, "message" => DBI::errstr );
216
            $template->param( "error" => DBI::err, "message" => DBI::errstr );
Lines 187-197 elsif ( $step && $step == 2 ) { Link Here
187
    }
218
    }
188
}
219
}
189
elsif ( $step && $step == 3 ) {
220
elsif ( $step && $step == 3 ) {
190
#
221
191
#
222
    # STEP 3 : database setup
192
# STEP 3 : database setup
223
193
#
194
#
195
    my $op = $query->param('op');
224
    my $op = $query->param('op');
196
    if ( $op && $op eq 'finished' ) {
225
    if ( $op && $op eq 'finished' ) {
197
        #
226
        #
Lines 203-220 elsif ( $step && $step == 3 ) { Link Here
203
    elsif ( $op && $op eq 'finish' ) {
232
    elsif ( $op && $op eq 'finish' ) {
204
        $installer->set_version_syspref();
233
        $installer->set_version_syspref();
205
234
206
        # Installation is finished.
235
# Installation is finished.
207
        # We just deny anybody access to install
236
# We just deny anybody access to install
208
        # And we redirect people to mainpage.
237
# And we redirect people to mainpage.
209
        # The installer will have to relogin since we do not pass cookie to redirection.
238
# The installer will have to relogin since we do not pass cookie to redirection.
210
        $template->param( "$op" => 1 );
239
        $template->param( "$op" => 1 );
211
    }
240
    }
241
212
    elsif ( $op && $op eq 'addframeworks' ) {
242
    elsif ( $op && $op eq 'addframeworks' ) {
213
    #
214
    # 1ST install, 3rd sub-step : insert the SQL files the user has selected
215
    #
216
243
217
        my ($fwk_language, $list) = $installer->load_sql_in_order($all_languages, $query->param('framework'));
244
        # 1ST install, 3rd sub-step : insert the SQL files the user has selected
245
246
        my ( $fwk_language, $list ) =
247
          $installer->load_sql_in_order( $all_languages,
248
            $query->param('framework') );
218
        $template->param(
249
        $template->param(
219
            "fwklanguage" => $fwk_language,
250
            "fwklanguage" => $fwk_language,
220
            "list"        => $list
251
            "list"        => $list
Lines 224-265 elsif ( $step && $step == 3 ) { Link Here
224
        $template->param( "$op" => 1 );
255
        $template->param( "$op" => 1 );
225
    }
256
    }
226
    elsif ( $op && $op eq 'selectframeworks' ) {
257
    elsif ( $op && $op eq 'selectframeworks' ) {
227
        #
258
#
228
        #
259
#
229
        # 1ST install, 2nd sub-step : show the user the sql datas he can insert in the database.
260
# 1ST install, 2nd sub-step : show the user the sql datas he can insert in the database.
230
        #
261
#
231
        #
262
#
232
        # (note that the term "selectframeworks is not correct. The user can select various files, not only frameworks)
263
# (note that the term "selectframeworks is not correct. The user can select various files, not only frameworks)
233
264
234
        #Framework Selection
265
#Framework Selection
235
        #sql data for import are supposed to be located in installer/data/<language>/<level>
266
#sql data for import are supposed to be located in installer/data/<language>/<level>
236
        # Where <language> is en|fr or any international abbreviation (provided language hash is updated... This will be a problem with internationlisation.)
267
# Where <language> is en|fr or any international abbreviation (provided language hash is updated... This will be a problem with internationlisation.)
237
        # Where <level> is a category of requirement : required, recommended optional
268
# Where <level> is a category of requirement : required, recommended optional
238
        # level should contain :
269
# level should contain :
239
        #   SQL File for import With a readable name.
270
#   SQL File for import With a readable name.
240
        #   txt File that explains what this SQL File is meant for.
271
#   txt File that explains what this SQL File is meant for.
241
        # Could be VERY useful to have A Big file for a kind of library.
272
# Could be VERY useful to have A Big file for a kind of library.
242
        # But could also be useful to have some Authorised values data set prepared here.
273
# But could also be useful to have some Authorised values data set prepared here.
243
        # Framework Selection is achieved through checking boxes.
274
# Framework Selection is achieved through checking boxes.
244
        my $langchoice = $query->param('fwklanguage');
275
        my $langchoice = $query->param('fwklanguage');
245
        $langchoice = $query->cookie('KohaOpacLanguage') unless ($langchoice);
276
        $langchoice = $query->cookie('KohaOpacLanguage') unless ($langchoice);
246
	$langchoice =~ s/[^a-zA-Z_-]*//g;
277
        $langchoice =~ s/[^a-zA-Z_-]*//g;
247
        my $marcflavour = $query->param('marcflavour');
278
        my $marcflavour = $query->param('marcflavour');
248
        if ($marcflavour){
279
        if ($marcflavour) {
249
            $installer->set_marcflavour_syspref($marcflavour);
280
            $installer->set_marcflavour_syspref($marcflavour);
250
        };
281
        }
251
        $marcflavour = C4::Context->preference('marcflavour') unless ($marcflavour);
282
        $marcflavour = C4::Context->preference('marcflavour')
283
          unless ($marcflavour);
284
252
        #Insert into database the selected marcflavour
285
        #Insert into database the selected marcflavour
253
        undef $/;
286
        undef $/;
254
        my ($marc_defaulted_to_en, $fwklist) = $installer->marc_framework_sql_list($langchoice, $marcflavour);
287
        my ( $marc_defaulted_to_en, $fwklist ) =
255
        $template->param('en_marc_frameworks' => $marc_defaulted_to_en);
288
          $installer->marc_framework_sql_list( $langchoice, $marcflavour );
256
        $template->param( "frameworksloop" => $fwklist );
289
        $template->param( 'en_marc_frameworks' => $marc_defaulted_to_en );
257
        $template->param( "marcflavour" => ucfirst($marcflavour));
290
        $template->param( "frameworksloop"     => $fwklist );
258
291
        $template->param( "marcflavour"        => ucfirst($marcflavour) );
259
        my ($sample_defaulted_to_en, $levellist) = $installer->sample_data_sql_list($langchoice);
292
260
        $template->param( "en_sample_data" => $sample_defaulted_to_en);
293
        my ( $sample_defaulted_to_en, $levellist ) =
261
        $template->param( "levelloop" => $levellist );
294
          $installer->sample_data_sql_list($langchoice);
262
        $template->param( "$op"       => 1 );
295
        $template->param( "en_sample_data" => $sample_defaulted_to_en );
296
        $template->param( "levelloop"      => $levellist );
297
        $template->param( "$op"            => 1 );
298
299
        my $setup = $query->param('setup');
300
        $template->param( "setup" => $setup );
301
263
    }
302
    }
264
    elsif ( $op && $op eq 'choosemarc' ) {
303
    elsif ( $op && $op eq 'choosemarc' ) {
265
        #
304
        #
Lines 268-313 elsif ( $step && $step == 3 ) { Link Here
268
        #
307
        #
269
        #
308
        #
270
309
271
        #Choose Marc Flavour
310
#Choose Marc Flavour
272
        #sql data are supposed to be located in installer/data/<dbms>/<language>/marcflavour/marcflavourname
311
#sql data are supposed to be located in installer/data/<dbms>/<language>/marcflavour/marcflavourname
273
	# Where <dbms> is database type according to DBD syntax
312
# Where <dbms> is database type according to DBD syntax
274
        # Where <language> is en|fr or any international abbreviation (provided language hash is updated... This will be a problem with internationlisation.)
313
# Where <language> is en|fr or any international abbreviation (provided language hash is updated... This will be a problem with internationlisation.)
275
        # Where <level> is a category of requirement : required, recommended optional
314
# Where <level> is a category of requirement : required, recommended optional
276
        # level should contain :
315
# level should contain :
277
        #   SQL File for import With a readable name.
316
#   SQL File for import With a readable name.
278
        #   txt File taht explains what this SQL File is meant for.
317
#   txt File taht explains what this SQL File is meant for.
279
        # Could be VERY useful to have A Big file for a kind of library.
318
# Could be VERY useful to have A Big file for a kind of library.
280
        # But could also be useful to have some Authorised values data set prepared here.
319
# But could also be useful to have some Authorised values data set prepared here.
281
        # Marcflavour Selection is achieved through radiobuttons.
320
# Marcflavour Selection is achieved through radiobuttons.
282
        my $langchoice = $query->param('fwklanguage');
321
        my $langchoice = $query->param('fwklanguage');
322
283
        $langchoice = $query->cookie('KohaOpacLanguage') unless ($langchoice);
323
        $langchoice = $query->cookie('KohaOpacLanguage') unless ($langchoice);
284
	$langchoice =~ s/[^a-zA-Z_-]*//g;
324
        $langchoice =~ s/[^a-zA-Z_-]*//g;
285
        my $dir =
325
        my $dir =
286
          C4::Context->config('intranetdir') . "/installer/data/$info{dbms}/$langchoice/marcflavour";
326
          C4::Context->config('intranetdir')
287
        unless (opendir( MYDIR, $dir )) {
327
          . "/installer/data/$info{dbms}/$langchoice/marcflavour";
288
            if ($langchoice eq 'en') {
328
        unless ( opendir( MYDIR, $dir ) ) {
329
            if ( $langchoice eq 'en' ) {
289
                warn "cannot open MARC frameworks directory $dir";
330
                warn "cannot open MARC frameworks directory $dir";
290
            } else {
331
            }
332
            else {
291
                # if no translated MARC framework is available,
333
                # if no translated MARC framework is available,
292
                # default to English
334
                # default to English
293
                $dir = C4::Context->config('intranetdir') . "/installer/data/$info{dbms}/en/marcflavour";
335
                $dir = C4::Context->config('intranetdir')
294
                opendir(MYDIR, $dir) or warn "cannot open English MARC frameworks directory $dir";
336
                  . "/installer/data/$info{dbms}/en/marcflavour";
337
                opendir( MYDIR, $dir )
338
                  or warn "cannot open English MARC frameworks directory $dir";
295
            }
339
            }
296
        }
340
        }
297
        my @listdir = grep { !/^\./ && -d "$dir/$_" } readdir(MYDIR);
341
        my @listdir = grep { !/^\./ && -d "$dir/$_" } readdir(MYDIR);
298
        closedir MYDIR;
342
        closedir MYDIR;
299
        my $marcflavour=C4::Context->preference("marcflavour");
343
        my $marcflavour = C4::Context->preference("marcflavour");
300
        my @flavourlist;
344
        my @flavourlist;
301
        foreach my $marc (@listdir) {
345
        foreach my $marc (@listdir) {
302
            my %cell=(
346
            my %cell = (
303
            "label"=> ucfirst($marc),
347
                "label"   => ucfirst($marc),
304
            "code"=>uc($marc),
348
                "code"    => uc($marc),
305
            "checked"=> defined($marcflavour) ? uc($marc) eq $marcflavour : 0);
349
                "checked" => defined($marcflavour)
350
                ? uc($marc) eq $marcflavour
351
                : 0
352
            );
353
306
#             $cell{"description"}= do { local $/ = undef; open INPUT "<$dir/$marc.txt"||"";<INPUT> };
354
#             $cell{"description"}= do { local $/ = undef; open INPUT "<$dir/$marc.txt"||"";<INPUT> };
307
            push @flavourlist, \%cell;
355
            push @flavourlist, \%cell;
308
        }
356
        }
309
        $template->param( "flavourloop" => \@flavourlist );
357
        $template->param( "flavourloop" => \@flavourlist );
310
        $template->param( "$op"       => 1 );
358
        $template->param( "$op"         => 1 );
311
    }
359
    }
312
    elsif ( $op && $op eq 'importdatastructure' ) {
360
    elsif ( $op && $op eq 'importdatastructure' ) {
313
        #
361
        #
Lines 327-333 elsif ( $step && $step == 3 ) { Link Here
327
        #
375
        #
328
        #Do updatedatabase And report
376
        #Do updatedatabase And report
329
377
330
        if ( ! defined $ENV{PERL5LIB} ) {
378
        if ( !defined $ENV{PERL5LIB} ) {
331
            my $find = "C4/Context.pm";
379
            my $find = "C4/Context.pm";
332
            my $path = $INC{$find};
380
            my $path = $INC{$find};
333
            $path =~ s/\Q$find\E//;
381
            $path =~ s/\Q$find\E//;
Lines 335-394 elsif ( $step && $step == 3 ) { Link Here
335
            warn "# plack? inserted PERL5LIB $ENV{PERL5LIB}\n";
383
            warn "# plack? inserted PERL5LIB $ENV{PERL5LIB}\n";
336
        }
384
        }
337
385
338
        my $now = POSIX::strftime( "%Y-%m-%dT%H:%M:%S", localtime() );
386
        my $now         = POSIX::strftime( "%Y-%m-%dT%H:%M:%S", localtime() );
339
        my $logdir = C4::Context->config('logdir');
387
        my $logdir      = C4::Context->config('logdir');
340
        my $dbversion = C4::Context->preference('Version');
388
        my $dbversion   = C4::Context->preference('Version');
341
        my $kohaversion = Koha::version;
389
        my $kohaversion = Koha::version;
342
        $kohaversion =~ s/(.*\..*)\.(.*)\.(.*)/$1$2$3/;
390
        $kohaversion =~ s/(.*\..*)\.(.*)\.(.*)/$1$2$3/;
343
391
344
        my $filename_suffix = join '_', $now, $dbversion, $kohaversion;
392
        my $filename_suffix = join '_', $now, $dbversion, $kohaversion;
345
        my ( $logfilepath, $logfilepath_errors ) = ( chk_log($logdir, "updatedatabase_$filename_suffix"), chk_log($logdir, "updatedatabase-error_$filename_suffix") );
393
        my ( $logfilepath, $logfilepath_errors ) = (
394
            chk_log( $logdir, "updatedatabase_$filename_suffix" ),
395
            chk_log( $logdir, "updatedatabase-error_$filename_suffix" )
396
        );
346
397
347
        my $cmd = C4::Context->config("intranetdir") . "/installer/data/$info{dbms}/updatedatabase.pl >> $logfilepath 2>> $logfilepath_errors";
398
        my $cmd = C4::Context->config("intranetdir")
399
          . "/installer/data/$info{dbms}/updatedatabase.pl >> $logfilepath 2>> $logfilepath_errors";
348
400
349
        system($cmd );
401
        system($cmd );
350
402
351
        my $fh;
403
        my $fh;
352
        open( $fh, "<", $logfilepath ) or die "Cannot open log file $logfilepath: $!";
404
        open( $fh, "<", $logfilepath )
405
          or die "Cannot open log file $logfilepath: $!";
353
        my @report = <$fh>;
406
        my @report = <$fh>;
354
        close $fh;
407
        close $fh;
355
        if (@report) {
408
        if (@report) {
356
            $template->param( update_report => [ map { { line => $_ } } split( /\n/, join( '', @report ) ) ] );
409
            $template->param( update_report =>
410
                  [ map { { line => $_ } } split( /\n/, join( '', @report ) ) ]
411
            );
357
            $template->param( has_update_succeeds => 1 );
412
            $template->param( has_update_succeeds => 1 );
358
        } else {
359
            eval{ `rm $logfilepath` };
360
        }
413
        }
361
        open( $fh, "<", $logfilepath_errors ) or die "Cannot open log file $logfilepath_errors: $!";
414
        else {
415
            eval { `rm $logfilepath` };
416
        }
417
        open( $fh, "<", $logfilepath_errors )
418
          or die "Cannot open log file $logfilepath_errors: $!";
362
        @report = <$fh>;
419
        @report = <$fh>;
363
        close $fh;
420
        close $fh;
364
        if (@report) {
421
        if (@report) {
365
            $template->param( update_errors => [ map { { line => $_ } } split( /\n/, join( '', @report ) ) ] );
422
            $template->param( update_errors =>
423
                  [ map { { line => $_ } } split( /\n/, join( '', @report ) ) ]
424
            );
366
            $template->param( has_update_errors => 1 );
425
            $template->param( has_update_errors => 1 );
367
            warn "The following errors were returned while attempting to run the updatedatabase.pl script:\n";
426
            warn
427
"The following errors were returned while attempting to run the updatedatabase.pl script:\n";
368
            foreach my $line (@report) { warn "$line\n"; }
428
            foreach my $line (@report) { warn "$line\n"; }
369
        } else {
429
        }
370
            eval{ `rm $logfilepath_errors` };
430
        else {
431
            eval { `rm $logfilepath_errors` };
371
        }
432
        }
372
        $template->param( $op => 1 );
433
        $template->param( $op => 1 );
373
    }
434
    }
374
    else {
435
    else {
375
        #
436
#
376
        # check whether it's a 1st install or an update
437
# check whether it's a 1st install or an update
377
        #
438
#
378
        #Check if there are enough tables.
439
#Check if there are enough tables.
379
        # Paul has cleaned up tables so reduced the count
440
# Paul has cleaned up tables so reduced the count
380
        #I put it there because it implied a data import if condition was not satisfied.
441
#I put it there because it implied a data import if condition was not satisfied.
381
        my $dbh = DBI->connect(
442
        my $dbh = DBI->connect(
382
    		"DBI:$info{dbms}:dbname=$info{dbname};host=$info{hostname}"
443
    		"DBI:$info{dbms}:dbname=$info{dbname};host=$info{hostname}"
383
		. ( $info{port} ? ";port=$info{port}" : "" )
444
		. ( $info{port} ? ";port=$info{port}" : "" )
384
                . ( $info{tlsoptions} ? $info{tlsoptions} : "" ),
445
                . ( $info{tlsoptions} ? $info{tlsoptions} : "" ),
385
            	$info{'user'}, $info{'password'}
446
            	$info{'user'}, $info{'password'}
386
        );
447
        );
387
	my $rq;
448
        my $rq;
388
        if ( $info{dbms} eq 'mysql' ) { $rq = $dbh->prepare( "SHOW TABLES" ); }
449
        if ( $info{dbms} eq 'mysql' ) { $rq = $dbh->prepare("SHOW TABLES"); }
389
	elsif ( $info{dbms} eq 'Pg' ) { $rq = $dbh->prepare( "SELECT *
450
        elsif ( $info{dbms} eq 'Pg' ) {
390
								FROM information_schema.tables
451
            $rq = $dbh->prepare(
391
								WHERE table_schema='public' and table_type='BASE TABLE';" ); }
452
                "SELECT *
453
                FROM information_schema.tables
454
                WHERE table_schema='public' and table_type='BASE TABLE';"
455
            );
456
        }
392
        $rq->execute;
457
        $rq->execute;
393
        my $data = $rq->fetchall_arrayref( {} );
458
        my $data = $rq->fetchall_arrayref( {} );
394
        my $count = scalar(@$data);
459
        my $count = scalar(@$data);
Lines 399-421 elsif ( $step && $step == 3 ) { Link Here
399
            $template->param( "count" => $count, "proposeimport" => 1 );
464
            $template->param( "count" => $count, "proposeimport" => 1 );
400
        }
465
        }
401
        else {
466
        else {
402
            #
467
           #
403
            # we have tables, propose to select files to upload or updatedatabase
468
           # we have tables, propose to select files to upload or updatedatabase
404
            #
469
           #
405
            $template->param( "count" => $count, "default" => 1 );
470
            $template->param( "count" => $count, "default" => 1 );
406
            #
471
     #
407
            # 1st part of step 3 : check if there is a databaseversion systempreference
472
     # 1st part of step 3 : check if there is a databaseversion systempreference
408
            # if there is, then we just need to upgrade
473
     # if there is, then we just need to upgrade
409
            # if there is none, then we need to install the database
474
     # if there is none, then we need to install the database
410
            #
475
     #
411
            if (C4::Context->preference('Version')) {
476
            if ( C4::Context->preference('Version') ) {
412
                my $dbversion = C4::Context->preference('Version');
477
                my $dbversion = C4::Context->preference('Version');
413
                $dbversion =~ /(.*)\.(..)(..)(...)/;
478
                $dbversion =~ /(.*)\.(..)(..)(...)/;
414
                $dbversion = "$1.$2.$3.$4";
479
                $dbversion = "$1.$2.$3.$4";
415
                $template->param("upgrading" => 1,
480
                $template->param(
416
                                "dbversion" => $dbversion,
481
                    "upgrading"   => 1,
417
                                "kohaversion" => Koha::version(),
482
                    "dbversion"   => $dbversion,
418
                                );
483
                    "kohaversion" => Koha::version(),
484
                );
419
            }
485
            }
420
        }
486
        }
421
    }
487
    }
Lines 433-439 else { Link Here
433
        if ( $rq->execute ) {
499
        if ( $rq->execute ) {
434
            my ($version) = $rq->fetchrow;
500
            my ($version) = $rq->fetchrow;
435
            if ($version) {
501
            if ($version) {
436
                print $query->redirect("/cgi-bin/koha/installer/install.pl?step=3");
502
                print $query->redirect(
503
                    "/cgi-bin/koha/installer/install.pl?step=3");
437
                exit;
504
                exit;
438
            }
505
            }
439
        }
506
        }
Lines 441-453 else { Link Here
441
}
508
}
442
output_html_with_http_headers $query, $cookie, $template->output;
509
output_html_with_http_headers $query, $cookie, $template->output;
443
510
444
sub chk_log { #returns a logfile in $dir or - if that failed - in temp dir
511
sub chk_log {    #returns a logfile in $dir or - if that failed - in temp dir
445
    my ($dir, $name) = @_;
512
    my ( $dir, $name ) = @_;
446
    my $fn=$dir.'/'.$name.'.log';
513
    my $fn = $dir . '/' . $name . '.log';
447
    if( ! open my $fh, '>', $fn ) {
514
    if ( !open my $fh, '>', $fn ) {
448
        $name.= '_XXXX';
515
        $name .= '_XXXX';
449
        require File::Temp;
516
        require File::Temp;
450
        ($fh, $fn)= File::Temp::tempfile( $name, TMPDIR => 1, SUFFIX => '.log');
517
        ( $fh, $fn ) =
518
          File::Temp::tempfile( $name, TMPDIR => 1, SUFFIX => '.log' );
519
451
        #if this should not work, let croak take over
520
        #if this should not work, let croak take over
452
    }
521
    }
453
    return $fn;
522
    return $fn;
(-)a/installer/onboarding.pl (+603 lines)
Line 0 Link Here
1
#!/usr/bin/perl
2
3
# This file is part of Koha.
4
#
5
# Copyright (C) 2017 Catalyst IT
6
#
7
# Koha is free software; you can redistribute it and/or modify it
8
# under the terms of the GNU General Public License as published by
9
# the Free Software Foundation; either version 3 of the License, or
10
# (at your option) any later version.
11
#
12
# Koha is distributed in the hope that it will be useful, but
13
# WITHOUT ANY WARRANTY; without even the implied warranty of
14
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
# GNU General Public License for more details.
16
#
17
# You should have received a copy of the GNU General Public License
18
# along with Koha; if not, see <http://www.gnu.org/licenses>.
19
20
#Recommended pragmas
21
use Modern::Perl;
22
use diagnostics;
23
use C4::InstallAuth;
24
use CGI qw ( -utf8 );
25
use C4::Output;
26
use C4::Members;
27
use Koha::Patrons;
28
use Koha::Libraries;
29
use Koha::Database;
30
use Koha::DateUtils;
31
use Koha::Patron::Categories;
32
use Koha::Patron::Category;
33
use Koha::ItemTypes;
34
use Koha::IssuingRule;
35
use Koha::IssuingRules;
36
37
#Setting variables
38
my $input = new CGI;
39
my $step  = $input->param('step');
40
41
#Getting the appropriate template to display to the user
42
my ( $template, $loggedinuser, $cookie ) =
43
  C4::InstallAuth::get_template_and_user(
44
    {
45
        template_name => "/onboarding/onboardingstep"
46
          . ( $step ? $step : 1 ) . ".tt",
47
        query           => $input,
48
        type            => "intranet",
49
        authnotrequired => 0,
50
        debug           => 1,
51
    }
52
  );
53
54
#Check database connection
55
my %info;
56
$info{'dbname'} = C4::Context->config("database");
57
$info{'dbms'}   = (
58
      C4::Context->config("db_scheme")
59
    ? C4::Context->config("db_scheme")
60
    : "mysql"
61
);
62
63
$info{'hostname'} = C4::Context->config("hostname");
64
$info{'port'}     = C4::Context->config("port");
65
$info{'user'}     = C4::Context->config("user");
66
$info{'password'} = C4::Context->config("pass");
67
my $dbh = DBI->connect(
68
    "DBI:$info{dbms}:dbname=$info{dbname};host=$info{hostname}"
69
      . ( $info{port} ? ";port=$info{port}" : "" ),
70
    $info{'user'}, $info{'password'}
71
);
72
73
#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.
74
my $op = $input->param('op') || '';
75
$template->param( 'op' => $op );
76
77
my $schema = Koha::Database->new()->schema();
78
79
if ( $op && $op eq 'finish' )
80
{ #If the value of $op equals 'finish' then redirect user to /cgi-bin/koha/mainpage.pl
81
    print $input->redirect("/cgi-bin/koha/mainpage.pl");
82
    exit;
83
}
84
85
my $libraries = Koha::Libraries->search( {}, { order_by => ['branchcode'] }, );
86
$template->param(
87
     libraries   => $libraries,
88
     group_types => [
89
     {
90
            categorytype => 'searchdomain',
91
            categories   => [
92
               Koha::LibraryCategories->search(
93
                   { categorytype => 'searchdomain' }
94
               )
95
            ],
96
     },
97
     {
98
            categorytype => 'properties',
99
            categories   => [
100
               Koha::LibraryCategories->search(
101
                   { categorytype => 'properties' }
102
               )
103
            ],
104
     },
105
     ]
106
);
107
108
109
#Select all the patron category records in the categories database table and give them to the template
110
    my $categories = Koha::Patron::Categories->search();
111
    $template->param( 'categories' => $categories, );
112
113
#Check if the $step variable equals 1 i.e. the user has clicked to create a library in the create library screen 1
114
    my $itemtypes = Koha::ItemTypes->search();
115
    $template->param( 'itemtypes' => $itemtypes, );
116
117
if ( $step && $step == 1 ) {
118
    #store inputted parameters in variables
119
    my $branchcode = $input->param('branchcode');
120
    $branchcode = uc($branchcode);
121
    my $categorycode = $input->param('categorycode');
122
    my $op = $input->param('op') || 'list';
123
    my $message;
124
    my $library;
125
126
    #Take the text 'branchname' and store it in the @fields array
127
    my @fields = qw(
128
      branchname
129
    );
130
131
    $template->param( 'branchcode' => $branchcode );
132
    $branchcode =~ s|\s||g
133
      ; # Use a regular expression to check the value of the inputted branchcode
134
135
#Create a new library object and store the branchcode and @fields array values in this new library object
136
    $library = Koha::Library->new(
137
        {
138
            branchcode => $branchcode,
139
            ( map { $_ => scalar $input->param($_) || undef } @fields )
140
        }
141
    );
142
143
    eval { $library->store; }; #Use the eval{} function to store the library object
144
    if ($library) {
145
        $message = 'success_on_insert';
146
    }
147
    else {
148
        $message = 'error_on_insert';
149
    }
150
    $template->param( 'message' => $message );
151
152
#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
153
}
154
elsif ( $step && $step == 2 ) {
155
    if ($op eq "add_validate_category"){
156
        #Initialising values
157
        my $searchfield  = $input->param('description') // q||;
158
        my $categorycode = $input->param('categorycode');
159
        my $op           = $input->param('op') // 'list';
160
        my $message;
161
        my $category;
162
        $template->param( 'categorycode' => $categorycode );
163
164
        my ( $template, $loggedinuser, $cookie ) =
165
            C4::InstallAuth::get_template_and_user(
166
            {
167
                template_name   => "/onboarding/onboardingstep2.tt",
168
                query           => $input,
169
                type            => "intranet",
170
                authnotrequired => 0,
171
                flagsrequired =>
172
                { parameters => 'parameters_remaining_permissions' },
173
                debug => 1,
174
            }
175
            );
176
177
        #Once the user submits the page, this code validates the input and adds it
178
        #to the database as a new patron category
179
        $categorycode = $input->param('categorycode');
180
        my $description           = $input->param('description');
181
        my $overduenoticerequired = $input->param('overduenoticerequired');
182
        my $category_type         = $input->param('category_type');
183
        my $default_privacy       = $input->param('default_privacy');
184
        my $enrolmentperiod       = $input->param('enrolmentperiod');
185
        my $enrolmentperioddate   = $input->param('enrolmentperioddate') || undef;
186
187
        #Converts the string into a date format
188
        if ($enrolmentperioddate) {
189
            $enrolmentperioddate = output_pref(
190
                {
191
                    dt         => dt_from_string($enrolmentperioddate),
192
                    dateformat => 'iso',
193
                    dateonly   => 1,
194
                }
195
            );
196
        }
197
198
        #Adds a new patron category to the database
199
        $category = Koha::Patron::Category->new(
200
            {
201
                categorycode          => $categorycode,
202
                description           => $description,
203
                overduenoticerequired => $overduenoticerequired,
204
                category_type         => $category_type,
205
                default_privacy       => $default_privacy,
206
                enrolmentperiod       => $enrolmentperiod,
207
                enrolmentperioddate   => $enrolmentperioddate,
208
            }
209
        );
210
211
        eval { $category->store; };
212
213
        #Error messages
214
        if ($category) {
215
            $message = 'success_on_insert';
216
        }
217
        else {
218
            $message = 'error_on_insert';
219
        }
220
221
        $template->param( 'message' => $message );
222
    }
223
    #Create a patron
224
}
225
elsif ( $step && $step == 3 ) {
226
    my $firstpassword  = $input->param('password') || '';
227
    my $secondpassword = $input->param('password2') || '';
228
229
230
    #Find all patron records in the database and hand them to the template
231
    my %currentpatrons = Koha::Patrons->search();
232
    my $currentpatrons = values %currentpatrons;
233
    $template->param( 'patrons' =>$currentpatrons);
234
235
236
#Find all library records in the database and hand them to the template to display in the library dropdown box
237
    my $libraries =
238
      Koha::Libraries->search( {}, { order_by => ['branchcode'] }, );
239
    $template->param(
240
        libraries   => $libraries,
241
        group_types => [
242
            {
243
                categorytype => 'searchdomain',
244
                categories   => [
245
                    Koha::LibraryCategories->search(
246
                        { categorytype => 'searchdomain' }
247
                    )
248
                ],
249
            },
250
            {
251
                categorytype => 'properties',
252
                categories   => [
253
                    Koha::LibraryCategories->search(
254
                        { categorytype => 'properties' }
255
                    )
256
                ],
257
            },
258
        ]
259
    );
260
261
#Find all patron categories in the database and hand them to the template to display in the patron category dropdown box
262
    my $categories = Koha::Patron::Categories->search();
263
    $template->param( 'categories' => $categories, );
264
265
#Incrementing the highest existing patron cardnumber to prevent duplicate cardnumber entry
266
267
    my $existing_cardnumber = $schema->resultset('Borrower')->get_column('cardnumber')->max() // 0;
268
269
    my $new_cardnumber = $existing_cardnumber + 1;
270
    $template->param( "newcardnumber" => $new_cardnumber );
271
272
    my $op = $input->param('op') // 'list';
273
    my $minpw = C4::Context->preference("minPasswordLength");
274
    $template->param( "minPasswordLength" => $minpw );
275
    my @messages;
276
    my @errors;
277
    my $nok            = $input->param('nok');
278
    my $cardnumber     = $input->param('cardnumber');
279
    my $borrowernumber = $input->param('borrowernumber');
280
    my $userid         = $input->param('userid');
281
282
    # function to designate mandatory fields (visually with css)
283
    my $check_BorrowerMandatoryField =
284
      C4::Context->preference("BorrowerMandatoryField");
285
    my @field_check = split( /\|/, $check_BorrowerMandatoryField );
286
    foreach (@field_check) {
287
        $template->param( "mandatory$_" => 1 );
288
        $template->param(
289
            BorrowerMandatoryField =>
290
              C4::Context->preference("BorrowerMandatoryField")
291
            ,    #field to test with javascript
292
        );
293
    }
294
295
 #If the entered cardnumber causes an error hand this error to the @errors array
296
    if ( my $error_code = checkcardnumber( $cardnumber, $borrowernumber ) ) {
297
        push @errors,
298
            $error_code == 1 ? 'ERROR_cardnumber_already_exists'
299
          : $error_code == 2 ? 'ERROR_cardnumber_length'
300
          :                    ();
301
    }
302
303
   #If the entered password causes an error hand this error to the @errors array
304
    push @errors, "ERROR_password_mismatch"
305
      if $firstpassword ne $secondpassword;
306
    push @errors, "ERROR_short_password"
307
      if ( $firstpassword
308
        && $minpw
309
        && $firstpassword ne '****'
310
        && ( length($firstpassword) < $minpw ) );
311
312
    #Passing errors to template
313
    $nok = $nok || scalar(@errors);
314
315
#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
316
    if ($nok) {
317
        foreach my $error (@errors) {
318
            if ( $error eq 'ERROR_password_mismatch' ) {
319
                $template->param( errorpasswordmismatch => 1 );
320
            }
321
            if ( $error eq 'ERROR_login_exist' ) {
322
                $template->param( errorloginexists => 1 );
323
            }
324
            if ( $error eq 'ERROR_cardnumber_already_exists' ) {
325
                $template->param( errorcardnumberexists => 1 );
326
            }
327
            if ( $error eq 'ERROR_cardnumber_length' ) {
328
                $template->param( errorcardnumberlength => 1 );
329
            }
330
            if ( $error eq 'ERROR_short_password' ) {
331
                $template->param( errorshortpassword => 1 );
332
            }
333
        }
334
        $template->param( 'nok' => 1 );
335
336
#Else if no errors have been caused by the users inputted card number or password then insert the patron into the borrowers table
337
    }
338
    else {
339
        my ( $template, $loggedinuser, $cookie ) =
340
          C4::InstallAuth::get_template_and_user(
341
            {
342
                template_name   => "/onboarding/onboardingstep3.tt",
343
                query           => $input,
344
                type            => "intranet",
345
                authnotrequired => 0,
346
                flagsrequired   => { borrowers => 1 },
347
                debug           => 1,
348
            }
349
          );
350
351
        if ( $op eq 'add_validate' ) {
352
            my %newdata;
353
354
            #Store the template form values in the newdata hash
355
            $newdata{borrowernumber} = $input->param('borrowernumber');
356
            $newdata{surname}        = $input->param('surname');
357
            $newdata{firstname}      = $input->param('firstname');
358
            $newdata{cardnumber}     = $input->param('cardnumber');
359
            $newdata{branchcode}     = $input->param('libraries');
360
            $newdata{categorycode}   = $input->param('categorycode_entry');
361
            $newdata{userid}         = $input->param('userid');
362
            $newdata{password}       = $input->param('password');
363
            $newdata{password2}      = $input->param('password2');
364
            $newdata{privacy}        = "default";
365
            $newdata{address}        = "";
366
            $newdata{city}           = "";
367
368
#Hand tne the dateexpiry of the patron based on the patron category it is created from
369
            my $patron_category = Koha::Patron::Categories->find( $newdata{categorycode} );
370
            $newdata{dateexpiry} = $patron_category->get_expiry_date( $newdata{dateenrolled} );
371
372
#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
373
            my $borrowernumber = &AddMember(%newdata);
374
375
#Create a hash named member2 and fill it with the borrowernumber of the borrower that has just been created
376
            my %member2;
377
            $member2{'borrowernumber'} = $borrowernumber;
378
379
#Perform data validation on the flag that has been handed to onboarding.pl by the template
380
            my $flag = $input->param('flag');
381
            if ( $input->param('newflags') ) {
382
                my $dbh              = C4::Context->dbh();
383
                my @perms            = $input->multi_param('flag');
384
                my %all_module_perms = ();
385
                my %sub_perms        = ();
386
                foreach my $perm (@perms) {
387
                    if ( $perm !~ /:/ ) {
388
                        $all_module_perms{$perm} = 1;
389
                    }
390
                    else {
391
                        my ( $module, $sub_perm ) = split /:/, $perm, 2;
392
                        push @{ $sub_perms{$module} }, $sub_perm;
393
                    }
394
                }
395
396
                # construct flags
397
                my @userflags = $schema->resultset('Userflag')->search({},{
398
                        order_by => { -asc =>'bit'},
399
                        }
400
                );
401
402
#Setting superlibrarian permissions for new patron
403
                my $flags = Koha::Patrons->find($borrowernumber)->set({flags=>1})->store;
404
405
                #Error handling checking if the patron was created successfully
406
                if ( !$borrowernumber ) {
407
                    push @messages,
408
                      { type => 'error', code => 'error_on_insert' };
409
                }
410
                else {
411
                    push @messages,
412
                      { type => 'message', code => 'success_on_insert' };
413
                }
414
            }
415
        }
416
    }
417
}
418
elsif ( $step && $step == 4 ) {
419
    my ( $template, $borrowernumber, $cookie ) =
420
      C4::InstallAuth::get_template_and_user(
421
        {
422
            template_name   => "/onboarding/onboardingstep4.tt",
423
            query           => $input,
424
            type            => "intranet",
425
            authnotrequired => 0,
426
            flagsrequired =>
427
              { parameters => 'parameters_remaining_permissions' },
428
            debug => 1,
429
        }
430
    );
431
  if ($op eq "add_validate"){
432
        my $description   = $input->param('description');
433
        my $itemtype_code = $input->param('itemtype');
434
        $itemtype_code = uc($itemtype_code);
435
436
  #Create a new itemtype object using the user inputted itemtype and description
437
        my $itemtype = Koha::ItemType->new(
438
            {
439
                itemtype    => $itemtype_code,
440
                description => $description,
441
            }
442
        );
443
        eval { $itemtype->store; };
444
        my $message;
445
446
#Fill the $message variable with an error if the item type object was not successfully created and inserted into the itemtypes table
447
        if ($itemtype) {
448
            $message = 'success_on_insert';
449
        }
450
        else {
451
            $message = 'error_on_insert';
452
        }
453
        $template->param( 'message' => $message );
454
    }
455
}
456
elsif ( $step && $step == 5 ) {
457
458
  #Find all the existing categories to display in a dropdown box in the template
459
    my $categories;
460
    $categories = Koha::Patron::Categories->search();
461
    $template->param( categories => $categories, );
462
463
 #Find all the exisiting item types to display in a dropdown box in the template
464
    my $itemtypes;
465
    $itemtypes = Koha::ItemTypes->search();
466
    $template->param( itemtypes => $itemtypes, );
467
468
  #Find all the exisiting libraries to display in a dropdown box in the template
469
    my $libraries =
470
      Koha::Libraries->search( {}, { order_by => ['branchcode'] }, );
471
    $template->param(
472
        libraries   => $libraries,
473
        group_types => [
474
            {
475
                categorytype => 'searchdomain',
476
                categories   => [
477
                    Koha::LibraryCategories->search(
478
                        { categorytype => 'searchdomain' }
479
                    )
480
                ],
481
            },
482
            {
483
                categorytype => 'properties',
484
                categories   => [
485
                    Koha::LibraryCategories->search(
486
                        { categorytype => 'properties' }
487
                    )
488
                ],
489
            },
490
        ]
491
    );
492
493
    my $input = CGI->new;
494
    my $dbh   = C4::Context->dbh;
495
496
    my ( $template, $loggedinuser, $cookie ) =
497
      C4::InstallAuth::get_template_and_user(
498
        {
499
            template_name   => "/onboarding/onboardingstep5.tt",
500
            query           => $input,
501
            type            => "intranet",
502
            authnotrequired => 0,
503
            flagsrequired   => { parameters => 'manage_circ_rules' },
504
            debug           => 1,
505
        }
506
      );
507
508
    #If no libraries exist then set the $branch value to *
509
    my $branch = $input->param('branch');
510
    unless ($branch) {
511
        if ( C4::Context->preference('DefaultToLoggedInLibraryCircRules') ) {
512
            $branch =
513
              Koha::Libraries->search->count() == 1
514
              ? undef
515
              : C4::Context::mybranch();
516
        }
517
        else {
518
            $branch =
519
              C4::Context::only_my_library()
520
              ? ( C4::Context::mybranch() || '*' )
521
              : '*';
522
        }
523
    }
524
    $branch = '*' if $branch eq 'NO_LIBRARY_SET';
525
    my $op = $input->param('op') || q{};
526
527
    if ( $op eq 'add_validate' ) {
528
        my $type            = $input->param('type');
529
        my $br              = $input->param('branch');
530
        my $bor             = $input->param('categorycode');
531
        my $itemtype        = $input->param('itemtype');
532
        my $maxissueqty     = $input->param('maxissueqty');
533
        my $issuelength     = $input->param('issuelength');
534
        my $lengthunit      = $input->param('lengthunit');
535
        my $renewalsallowed = $input->param('renewalsallowed');
536
        my $renewalperiod   = $input->param('renewalperiod');
537
        my $onshelfholds    = $input->param('onshelfholds') || 0;
538
        $maxissueqty =~ s/\s//g;
539
        $maxissueqty = undef if $maxissueqty !~ /^\d+/;
540
        $issuelength = $issuelength eq q{} ? undef : $issuelength;
541
542
        my $params = {
543
            branchcode      => $br,
544
            categorycode    => $bor,
545
            itemtype        => $itemtype,
546
            maxissueqty     => $maxissueqty,
547
            renewalsallowed => $renewalsallowed,
548
            renewalperiod   => $renewalperiod,
549
            issuelength     => $issuelength,
550
            lengthunit      => $lengthunit,
551
            onshelfholds    => $onshelfholds,
552
        };
553
554
        my @messages;
555
556
#Allows for the 'All' option to work when selecting all libraries for a circulation rule to apply to.
557
        if ( $branch eq "*" ) {
558
            my $search_default_rules = $schema->resultset('DefaultCircRule')->count();
559
            my $insert_default_rules = $schema->resultset('Issuingrule')->new(
560
                    { maxissueqty => $maxissueqty, onshelfholds => $onshelfholds }
561
                );
562
        }
563
#Allows for the 'All' option to work when selecting all patron categories for a circulation rule to apply to.
564
        elsif ( $bor eq "*" ) {
565
566
            my $search_default_rules = $schema->resultset('DefaultCircRule')->count();
567
            my $insert_default_rules = $schema->resultset('Issuingrule')->new(
568
                        { maxissueqty => $maxissueqty}
569
            );
570
        }
571
572
#Allows for the 'All' option to work when selecting all itemtypes for a circulation rule to apply to
573
        elsif ( $itemtype eq "*" ) {
574
            my $search_default_rules = $schema->resultset('DefaultCircRule')->search({},{
575
                    branchcode => $branch
576
                    }
577
578
            );
579
580
            my $insert_default_rules = $schema->resultset('Issuingrule')->new(
581
                           { branchcode => $branch, onshelfholds => $onshelfholds }
582
            );
583
        }
584
585
        my $issuingrule = Koha::IssuingRules->find(
586
            { categorycode => $bor, itemtype => $itemtype, branchcode => $br }
587
        );
588
        if ($issuingrule) {
589
            $issuingrule->set($params)->store();
590
            push @messages,
591
              {
592
                type => 'error',
593
                code => 'error_on_insert'
594
              }; #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.
595
596
        }
597
        else {
598
            Koha::IssuingRule->new()->set($params)->store();
599
        }
600
    }
601
}
602
603
output_html_with_http_headers $input, $cookie, $template->output;
(-)a/koha-tmpl/intranet-tmpl/prog/en/includes/calendar.inc (-1 / +1 lines)
Lines 6-12 var debug = "[% debug %]"; Link Here
6
var dformat  = "[% dateformat %]";
6
var dformat  = "[% dateformat %]";
7
var sentmsg = 0;
7
var sentmsg = 0;
8
if (debug > 1) {alert("dateformat: " + dformat + "\ndebug is on (level " + debug + ")");}
8
if (debug > 1) {alert("dateformat: " + dformat + "\ndebug is on (level " + debug + ")");}
9
var MSG_PLEASE_ENTER_A_VALID_DATE = _("Please enter a valid date (should match %s).");
9
var MSG_PLEASE_ENTER_A_VALID_DATE = (_("Please enter a valid date (should match %s)."));
10
10
11
function is_valid_date(date) {
11
function is_valid_date(date) {
12
    // An empty string is considered as a valid date for convenient reasons.
12
    // An empty string is considered as a valid date for convenient reasons.
(-)a/koha-tmpl/intranet-tmpl/prog/en/includes/installer-doc-head-close.inc (+15 lines)
Lines 1-5 Link Here
1
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
1
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
2
<link rel="shortcut icon" href="/favicon.ico" type="image/x-icon" />
2
<link rel="shortcut icon" href="/favicon.ico" type="image/x-icon" />
3
<link rel="stylesheet" type="text/css" href="[% interface %]/lib/jquery/jquery-ui-1.11.4.min.css" />
4
<link rel="stylesheet" type="text/css" href="[% interface %]/lib/bootstrap/bootstrap.min.css" />
5
<link rel="stylesheet" type="text/css" href="[% interface %]/lib/font-awesome/css/font-awesome.min.css" />
6
<link rel="stylesheet" type="text/css" media="print" href="[% interface %]/[% theme %]/css/print.css" />
3
<style type="text/css" media="screen">
7
<style type="text/css" media="screen">
4
8
5
[% IF ( login ) %]
9
[% IF ( login ) %]
Lines 69-74 td input { font-size: 1.5em; } Link Here
69
73
70
</style>
74
</style>
71
75
76
<script type="text/javascript" src="[% interface %]/lib/jquery/jquery-2.2.3.min.js"></script>
77
<script type="text/javascript" src="[% interface %]/lib/jquery/jquery-migrate-1.3.0.min.js"></script>
78
<script type="text/javascript" src="[% interface %]/lib/jquery/jquery-ui-1.11.4.min.js"></script>
79
<script type="text/javascript" src="[% interface %]/lib/shortcut/shortcut.js"></script>
80
<script type="text/javascript" src="[% interface %]/lib/jquery/plugins/jquery.cookie.min.js"></script>
81
<script type="text/javascript" src="[% interface %]/lib/jquery/plugins/jquery.highlight-3.js"></script>
82
<script type="text/javascript" src="[% interface %]/lib/bootstrap/bootstrap.min.js"></script>
83
<script type="text/javascript" src="[% interface %]/lib/jquery/plugins/jquery.validate.min.js"></script>
84
<!-- koha core js -->
85
<script type="text/javascript" src="[% interface %]/[% theme %]/js/staff-global.js"></script>
86
72
<script type="text/javascript">
87
<script type="text/javascript">
73
    //<![CDATA[
88
    //<![CDATA[
74
        function _(s) { return s } // dummy function for gettext
89
        function _(s) { return s } // dummy function for gettext
(-)a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/categories.tt (-1 / +1 lines)
Lines 93-99 Link Here
93
                            </li>
93
                            </li>
94
                            <li>
94
                            <li>
95
                                <label for="enrolmentperioddate" style="width:6em;">Until date: </label>
95
                                <label for="enrolmentperioddate" style="width:6em;">Until date: </label>
96
                                <input type="text" class="enrollmentperiod" name="enrolmentperioddate" id="enrolmentperioddate" value="[% category.enrolmentperioddate | $KohaDates %]" />
96
                                <input type="text" class="enrollmentperiod datepicker" name="enrolmentperioddate" id="enrolmentperioddate" value="[% category.enrolmentperioddate | $KohaDates %]" />
97
                            </li>
97
                            </li>
98
                        </ol>
98
                        </ol>
99
                    </fieldset>
99
                    </fieldset>
(-)a/koha-tmpl/intranet-tmpl/prog/en/modules/installer/step3.tt (-124 / +179 lines)
Lines 1-130 Link Here
1
[% INCLUDE 'doc-head-open.inc' %]<title>Koha &rsaquo; Web installer &rsaquo; Step 3</title>
1
[% INCLUDE 'doc-head-open.inc' %]<title>Koha &rsaquo; Web installer &rsaquo; Step 3</title>
2
[% IF ( finish ) %]<meta http-equiv="refresh" content="10; url=/cgi-bin/koha/mainpage.pl">[% END %]
2
[% IF ( finish ) %]<meta http-equiv="refresh" content="10; url=/cgi-bin/koha/installer/onboarding.pl">[% END %]
3
[% INCLUDE 'installer-doc-head-close.inc' %]
3
[% INCLUDE 'installer-doc-head-close.inc' %]
4
<div>
4
<div>
5
<h1 id="logo"><img alt="Koha" src="[% interface %]/[% theme %]/img/koha.org-logo.gif" /> Web installer &rsaquo; Step 3</h1>
5
<h1 id="logo"><img alt="Koha" src="[% interface %]/[% theme %]/img/koha.org-logo.gif" /> Koha web  installer &rsaquo; Step 3</h1>
6
6
7
[% IF ( selectframeworks ) %]
7
[% IF ( selectframeworks ) %]
8
    <script type="text/javascript">
8
    <script type="text/javascript">
9
    //<![CDATA[
9
//<![CDATA[
10
10
11
    var surl = unescape(window.location.pathname);
11
var surl = unescape(window.location.pathname);
12
12
13
    function doLoad()
13
function doLoad()
14
    {
14
{
15
        // the timeout value should be the same as in the "refresh" meta-tag
15
    // the timeout value should be the same as in the "refresh" meta-tag
16
        setTimeout( "refresh()", 2*1000 );
16
    setTimeout( "refresh()", 2*1000 );
17
    }
17
}
18
18
19
    function refresh(value)
19
function refresh(value)
20
    {
20
{
21
        //  The argument to the location.reload function determines
21
    //  The argument to the location.reload function determines
22
        //  if the browser should retrieve the document from the
22
    //  if the browser should retrieve the document from the
23
        //  web-server.  In our example all we need to do is cause
23
    //  web-server.  In our example all we need to do is cause
24
        //  the JavaScript block in the document body to be
24
    //  the JavaScript block in the document body to be
25
        //  re-evaluated.  If we needed to pull the document from
25
    //  re-evaluated.  If we needed to pull the document from
26
        //  the web-server again (such as where the document contents
26
    //  the web-server again (such as where the document contents
27
        //  change dynamically) we would pass the argument as 'true'.
27
    //  change dynamically) we would pass the argument as 'true'.
28
        //
28
    //
29
        surl=surl+'?step=3&op=selectframeworks&fwklanguage='+value;
29
    surl=surl+'?step=3&op=selectframeworks&fwklanguage='+value;
30
30
31
        window.location.replace( surl );
31
    window.location.replace( surl );
32
    }
32
}
33
33
34
    function selectAllFrameworks()
34
function selectAllFrameworks()
35
{
36
    //  A handy short link that selects all available checkboxes
37
    //  on the page.
38
    //
39
    var checkboxes = document.getElementsByTagName("input");
40
    for (var i = 0; i < checkboxes.length; i++)
35
    {
41
    {
36
        //  A handy short link that selects all available checkboxes
42
        if (checkboxes[i].type == 'checkbox')
37
        //  on the page.
38
        //
39
        var checkboxes = document.getElementsByTagName("input");
40
        for (var i = 0; i < checkboxes.length; i++)
41
        {
43
        {
42
            if (checkboxes[i].type == 'checkbox')
44
            checkboxes[i].checked = true;
43
            {
44
                checkboxes[i].checked = true;
45
            }
46
        }
45
        }
47
48
        //  Prevent event propergation.
49
        return false;
50
    }
46
    }
51
47
52
    function Hide(link)
48
    //  Prevent event propergation.
53
    {
49
    return false;
54
        //  Toggle the display of a given element on the page.
50
}
55
        //
51
56
        subfield = document.getElementById('bloc'+link);
52
function Hide(link)
57
        var initstyle = subfield.style.display;
53
{
58
        if (initstyle == 'block') subfield.style.display = 'none' ;
54
    //  Toggle the display of a given element on the page.
59
        if (initstyle == 'none') subfield.style.display = 'block' ;
55
    //
60
    }
56
    subfield = document.getElementById('bloc'+link);
57
    var initstyle = subfield.style.display;
58
    if (initstyle == 'block') subfield.style.display = 'none' ;
59
    if (initstyle == 'none') subfield.style.display = 'block' ;
60
}
61
61
62
    //]]>
62
//]]>
63
    </script>
63
</script>
64
[% END %]
64
[% END %]
65
66
65
[% IF ( finish ) %]
67
[% IF ( finish ) %]
66
    <h1>Congratulations, installation complete</h1>
68
    <h1>Congratulations, installation complete</h1>
67
    <p>If this page does not redirect in 5 seconds, click <a href="/">here</a>.</p>
69
    <p>If this page does not redirect in 10 seconds, click <a href="/cgi-bin/koha/installer/onboarding.pl">Start onboarding process</a>.</p>
68
[% END %]
70
[% END %]
71
72
69
[% IF ( choosemarc ) %]
73
[% IF ( choosemarc ) %]
70
    <h2 align="center">Select your MARC flavor</h2>
74
    <h2 align="center">Choose your setup</h2>
75
    <p>Basic setup selects recommended settings by default.</p>
71
    <form name="frameworkselection" method="post" action="install.pl">
76
    <form name="frameworkselection" method="post" action="install.pl">
72
    <input type="hidden" name="step" value="3" />
77
    <input type="hidden" name="step" value="3" />
73
    <input type="hidden" name="op" value="selectframeworks" />
78
    <input type="hidden" name="op" value="selectframeworks"/>
74
    <p>
79
80
    <div>
81
        <input type="radio" name="setup" value="Basic" checked="checked">Basic<br/>
82
        <input type="radio" name="setup" value="Advanced"/>Advanced<br/>
83
    </div>
84
85
    <h2 align="center">Select your MARC flavor</h2>
86
    <p>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. </p>
87
75
    [% FOREACH flavourloo IN flavourloop %]
88
    [% FOREACH flavourloo IN flavourloop %]
76
    <div>
89
    <div>
77
            [% IF ( flavourloo.checked ) %]
90
            [% IF ( flavourloo.label == "Unimarc") %]
78
                <input type="radio" name="marcflavour" value="[% flavourloo.code %]" checked /> [% flavourloo.label %] <br/>
91
                 <input type="radio" name="marcflavour" value="[% flavourloo.code %]" /> [% flavourloo.label %]<br/>
79
            [% ELSE %]
92
            [% ELSE %]
80
                <input type="radio" name="marcflavour" value="[% flavourloo.code %]" /> [% flavourloo.label %] <br/>
93
                 <input type="radio" name="marcflavour" value="[% flavourloo.code %]" checked="checked" /> [% flavourloo.label %] <br/>
81
            [% END %]
94
            [% END %]
82
    </div>
95
    </div>
83
    [% END %]
96
    [% END %]
84
    </p>
97
85
    <p> Click 'Next' to continue <input value="Next &gt;&gt;" type="submit" /></p>
98
        <p>Click 'Next' to continue <input value="Next &gt;&gt;" type="submit" /></p>
99
86
    </form>
100
    </form>
101
87
[% END %]
102
[% END %]
88
103
89
[% IF ( selectframeworks ) %]
104
[% IF ( selectframeworks ) %]
90
    <h2 align="center">Selecting Default Settings</h2>
105
        <h2 align= "center"> [% setup %] setup</h2>
91
    <script type="text/javascript">
106
        <h2 align="center">Selecting Default Settings</h2>
92
        var linklabel = _("Select all sample data");
93
        document.write('<p><a href="#" onclick="return selectAllFrameworks();">'+linklabel+'</a></p>');
94
    </script>
95
    <form name="frameworkselection" method="post" action="install.pl">
96
    <input type="hidden" name="step" value="3" />
97
    <input type="hidden" name="op" value="addframeworks" />
98
107
108
        [% IF setup == "Advanced" %]
109
            <script type="text/javascript">
110
                var linklabel = _("Select all options");
111
                document.write('<p><a href="#" onclick="return selectAllFrameworks();"><button>'+linklabel+'</button></a></p>');
112
            </script>
113
        [% END %]
114
        <form name="frameworkselection" method="post" action="install.pl">
115
            <input type="hidden" name="step" value="3" />
116
            <input type="hidden" name="op" value="addframeworks" />
99
    [% IF ( frameworksloop ) %]
117
    [% IF ( frameworksloop ) %]
100
    <h2>MARC frameworks: [% marcflavour %]</h2>
118
        <h2>MARC frameworks: [% marcflavour %]</h2>
101
    [% IF ( en_marc_frameworks ) %]
119
        [% IF ( en_marc_frameworks ) %]
102
        <h4><span class="error">No MARC frameworks are available for your language.
120
            <h4><span class="error">No MARC frameworks are available for your language.
103
                Defaulting to the frameworks supplied for English (en)<span></h4>
121
                    Defaulting to the frameworks supplied for English (en)<span></h4>
104
    [% END %]
122
        [% END %]
105
    [% FOREACH frameworksloo IN frameworksloop %]
123
        [% FOREACH frameworksloo IN frameworksloop %]
106
    <div>
124
           <div>
107
    <h3>[% frameworksloo.label %]</h3>
125
           <h3>[% frameworksloo.label %]</h3>
108
    [% FOREACH framework IN frameworksloo.frameworks %]
126
           [% FOREACH framework IN frameworksloo.frameworks %]
109
        <table style="border:1px;vertical-align:top;">
127
                <table style="border:1px;vertical-align:top;">
110
        <tr>
128
                <tr>
111
        <td style="vertical-align:top;">
129
                    <td style = "border:1px; vertical-align:top;">
112
            [% IF ( framework.checked ) %]
130
                        [% IF (frameworksloo.label == "Default") && (setup=="Basic") %]
113
                <input type="checkbox" name="framework" value="[% framework.fwkfile %]" checked="checked" id="[% framework.fwkname %]" />
131
                            <input type="hidden" name="framework" value="[% framework.fwkfile %]" id ="[%framework.fwkname%]" />
114
            [% ELSE %]
132
                        [% ELSE %]
115
                <input type="checkbox" name="framework" value="[% framework.fwkfile %]" id="[% framework.fwkname %]" />
133
                            <input type="checkbox" name="framework" value="[% framework.fwkfile %]" id ="[%framework.fwkname%]" />
116
            [% END %]
134
                        [% END %]
117
        </td>
135
                    </td>
118
        <td>
136
                    <td>
119
            <label for="[% framework.fwkname %]">
137
                    [% IF (frameworksloo.label == "Default") && (setup=="Basic") %]
120
                [% framework.fwkdescription %]
138
                        <ul>
121
                <em>([% framework.fwkname %])</em>
139
                            <li>
122
            </label>
140
                                <label for="[% framework.fwkname %]">
123
        </td>
141
                                    [% framework.fwkdescription %]
124
        </table>
142
                                    <em>([% framework.fwkname %])</em>
125
    [% END %]
143
                                </label>
126
    </div>
144
                            </li>
127
    [% END %]
145
                        </ul>
146
                    </td>
147
                    [% ELSE %]
148
                    <td>
149
                        <label for= "[% framework.fwkname %]">
150
                            [% framework.fwkdescription %]
151
                            <em>([% framework.fwkname %])</em>
152
                        </label>
153
                    </td>
154
                    [% END %]
155
                </tr>
156
                </table>
157
           [% END %]
158
           </div>
159
        [% END %]
128
    <h2>Other data</h2>
160
    <h2>Other data</h2>
129
    [% END %]
161
    [% END %]
130
    [% IF ( en_sample_data ) %]
162
    [% IF ( en_sample_data ) %]
Lines 132-158 Link Here
132
                Defaulting to the samples supplied for English (en)<span></h4>
164
                Defaulting to the samples supplied for English (en)<span></h4>
133
    [% END %]
165
    [% END %]
134
    [% FOREACH levelloo IN levelloop %]
166
    [% FOREACH levelloo IN levelloop %]
135
    <div>
167
        <div>
136
    <h3>[% levelloo.label %]</h3>
168
        <h3>[% levelloo.label %]</h3>
137
    [% FOREACH framework IN levelloo.frameworks %]
169
138
        <table style="border:1px;vertical-align:top;">
170
        [% IF (setup == "Basic" && levelloo.label == "Optional") %]
139
        <tr>
171
            <script type="text/javascript">
140
        <td style="vertical-align:top;">
172
                var linklabel = _("Select all options");
141
            [% IF ( framework.checked ) %]
173
                document.write('<p><a href="#" onclick="return selectAllFrameworks();"><button>'+linklabel+'</button></a></p>');
142
                <input type="checkbox" name="framework" value="[% framework.fwkfile %]" checked="checked" id="[% framework.fwkname %]" />
174
            </script>
143
            [% ELSE %]
175
        [% END %]
144
                <input type="checkbox" name="framework" value="[% framework.fwkfile %]" id="[% framework.fwkname %]" />
176
145
            [% END %]
177
        [% FOREACH framework IN levelloo.frameworks %]
146
        </td>
178
            <table style="border:1px;vertical-align:top;">
147
        <td>
179
            <tr>
148
            <label for="[% framework.fwkname %]">
180
                <td style="vertical-align:top;">
149
                [% framework.fwkdescription %]
181
                [% IF (levelloo.label == "Default" ) && (setup=="Basic")%]
150
                <em>([% framework.fwkname %])</em>
182
                     <input type="hidden" name="framework" value="[% framework.fwkfile %]" id="[%framework.fwkname %]" />
151
            </label>
183
                [% ELSE %]
152
        </td>
184
                     <input type="checkbox" name="framework" value="[%framework.fwkfile %]" id="[%framework.fwkname%]"/>
153
        </table>
185
                [% END %]
154
    [% END %]
186
                </td>
155
    </div>
187
                <td>
188
                [% IF (levelloo.label == "Default") && (setup=="Basic")%]
189
                <ul>
190
                    <li>
191
                        <label for="[% framework.fwkname %]">
192
                            [% framework.fwkdescription %]
193
                            <em>([% framework.fwkname %])</em>
194
                        </label>
195
                    </li>
196
                </ul>
197
                </td>
198
                [% ELSE %]
199
                <td>
200
                    <label for= "[% framework.fwkname %]">
201
                        [% framework.fwkdescription %]
202
                        <em>([% framework.fwkname %])</em>
203
                    </label>
204
                </td>
205
                [% END %]
206
            </tr>
207
            </table>
208
        [% END %]
209
        </div>
156
    [% END %]
210
    [% END %]
157
    <p>When you've made your selections, please click 'Import' below to begin the process. It may take a while to complete,
211
    <p>When you've made your selections, please click 'Import' below to begin the process. It may take a while to complete,
158
    please be patient.</p>
212
    please be patient.</p>
Lines 177-187 Link Here
177
            You can help the Koha community by sharing your statistics with us.
231
            You can help the Koha community by sharing your statistics with us.
178
            <br>If you wish to share some of your data, please enable the functionality in the "Share your usage statistics" section of the admin module.
232
            <br>If you wish to share some of your data, please enable the functionality in the "Share your usage statistics" section of the admin module.
179
        </p>
233
        </p>
180
        <p>Click on 'Finish' to complete and load the Koha Staff Interface.
234
        <p>Click on 'Set up Koha with the onboarding tool' to complete and load the Koha onboarding tool.
181
        <form name="finish">
235
        <form name="finish">
182
        <input type="hidden" name="step" value="3" />
236
        <input type="hidden" name="step" value="3" />
183
        <input type="hidden" name="op" value="finish" />
237
        <input type="hidden" name="op" value="finish" />
184
        <input type="submit" value="Finish" /></form>
238
        <input type="submit" value="Set up Koha with the onboarding tool"/>
239
        </form>
185
        </p>
240
        </p>
186
    </p>
241
    </p>
187
[% END %]
242
[% END %]
Lines 214-235 Link Here
214
    </form>
269
    </form>
215
[% END %]
270
[% END %]
216
271
217
218
[% IF ( default ) %]
272
[% IF ( default ) %]
219
    [% IF ( upgrading ) %]
273
    [% IF ( upgrading ) %]
220
        <p>
274
        <p>
221
            We are upgrading from Koha [% dbversion %] to [% kohaversion %], you must <a href="install.pl?step=3&amp;op=updatestructure" class="button">update your database</a>
275
            We are upgrading from Koha [% dbversion %] to [% kohaversion %], you must update your database.
276
        <br>
277
        <a href="install.pl?step=3&amp;op=updatestructure" class="button"><button>Update Database</button></a>
222
        </p>
278
        </p>
223
    [% ELSE %]
279
    [% ELSE %]
224
        <p>We are ready to do some basic configuration. Please
280
        <p>We are ready to do some basic configuration. Please install some basic configuration settings to continue the installation:
225
            <a href="install.pl?step=3&amp;op=choosemarc" class="button">install basic configuration settings</a>
281
        <br>
226
            to continue the installation.
282
        <br>
227
        </p>
283
            <a href="install.pl?step=3&amp;op=choosemarc" class="button"><button>Install Basic Configuration Settings</button></a>
284
228
    [% END %]
285
    [% END %]
229
[% END %]
286
[% END %]
230
287
231
232
233
[% IF ( updatestructure ) %]
288
[% IF ( updatestructure ) %]
234
  <div><h2 align="center">Updating database structure</h2>
289
  <div><h2 align="center">Updating database structure</h2>
235
  [% IF ( has_update_succeeds ) %]
290
  [% IF ( has_update_succeeds ) %]
Lines 251-257 Link Here
251
 [% UNLESS ( has_update_errors ) %]
306
 [% UNLESS ( has_update_errors ) %]
252
    <p>Everything went OK, update done.</p>
307
    <p>Everything went OK, update done.</p>
253
  [% END %]
308
  [% END %]
254
<a href="install.pl?step=3&amp;op=finished" class="button">Continue to log in to Koha</a>
309
<a href="install.pl?step=3&amp;op=choosemarc" class="button"><button>Back to Installation</button></a>
255
  </div>
310
  </div>
256
[% END %]
311
[% END %]
257
312
(-)a/koha-tmpl/intranet-tmpl/prog/en/modules/intranet-main.tt (-2 lines)
Lines 1-5 Link Here
1
[% USE Koha %]
2
[% SET footerjs = 1 %]
3
[% INCLUDE 'doc-head-open.inc' %]
1
[% INCLUDE 'doc-head-open.inc' %]
4
<title>Koha staff client</title>
2
<title>Koha staff client</title>
5
<link rel="stylesheet" type="text/css" href="[% interface %]/[% theme %]/css/mainpage.css" />
3
<link rel="stylesheet" type="text/css" href="[% interface %]/[% theme %]/css/mainpage.css" />
(-)a/koha-tmpl/intranet-tmpl/prog/en/modules/onboarding/onboardingstep1.tt (+81 lines)
Line 0 Link Here
1
<!--Includes for creating library-->
2
[% INCLUDE 'doc-head-open.inc' %]
3
<link rel="stylesheet" type="text/css" href="[% interface %]/[% theme %]/css/datatables.css" />
4
[% INCLUDE 'installer-doc-head-close.inc' %]
5
[% INCLUDE 'datatables.inc' %]
6
7
[% IF (libraries && libraries.count > 1) %]
8
    <meta http-equiv="refresh" content="0; url=/cgi-bin/koha/installer/onboarding.pl?step=2">
9
10
[% ELSIF (op == "add_validate_library") %]
11
    <head>
12
        <title>Welcome &rsaquo; to  &rsaquo; Koha</title>
13
    </head>
14
15
    <!--Header for the koha onboarding tool-->
16
    <div>
17
        <h1 id="logo"><img alt="Koha" src="[% interface %]/[% theme %]/img/koha.org-logo.gif"/> Welcome to Koha</h1>
18
    </div>
19
20
<!--New Library created-->
21
       [% IF message == "success_on_insert" %]
22
            <form name="createlibrary" method="post" action="onboarding.pl" >
23
                <input type="hidden" name="step" value="2"/>
24
                <h1 align="left"> New library</h1>
25
                <div>
26
                    <p> Success: library created!
27
                    </p>
28
                    <p> To add another library and for more settings, <br>
29
                    go to:<br>
30
                    More -> Administration -> Libraries and groups<br>
31
                    </p>
32
                </div>
33
                Next up:
34
                <input type="submit" name="start" value="Minimal patron category setup"/>
35
            </form>
36
37
        [%ELSE %]
38
            <form name="retrylibrary" method="post" action="onboarding.pl">
39
                <input type="hidden" name="step" value="1"/>
40
                <h1 align="left">Failed </h1>
41
                <div>
42
                    <p> Library was not successfully created</br>
43
                    Please try again or contact your system administrator. </p>
44
                </div>
45
                <input type="submit" value="Try again"/>
46
            </form>
47
        [%END%]
48
49
[% ELSE %]
50
    <head>
51
        <title>Welcome &rsaquo; to  &rsaquo; Koha</title>
52
    </head>
53
54
    <!--Header for the koha onboarding tool-->
55
    <div>
56
        <h1 id="logo"><img alt="Koha" src="[% interface %]/[% theme %]/img/koha.org-logo.gif"/> Welcome to Koha</h1>
57
    </div>
58
59
<!--Create a library screen 1-->
60
        <form name="LibraryCreation" method="post" action="onboarding.pl">
61
            <fieldset class="rows" >
62
                 <h2>Create a library</h2>
63
                 <input type="hidden" name="step" value="1"/>
64
                 <input type="hidden" name="op" value="add_validate_library"/>
65
                 <ol>
66
                     <li>
67
                        <label for="branchcode" class="required">Library code: </label>
68
                        <input type="text"  pattern="[0-9A-Za-z]{1,10}" title="Please enter up to 10 letters and/or numbers" name="branchcode" id="branchcode" size="10" maxlength="10" value="[% library.branchcode |html %]" class="required" required="required" />
69
                        <span class="required">Required</span>
70
                    </li>
71
                    <li>
72
                        <label for="branchname" class="required">Name: </label>
73
                        <input type="text" name="branchname" id="branchname" title="Please enter the name of your institution" size="42" value="[% library.branchname |html %]" class="    required" required="required" style="width:200px;">
74
                        <span class="required">Required</span>
75
                    </li>
76
                 </ol>
77
             <br>
78
             <input type="submit" class="action" value="Submit"/>
79
            </fieldset>
80
     </form>
81
[% END %]
(-)a/koha-tmpl/intranet-tmpl/prog/en/modules/onboarding/onboardingstep2.tt (+164 lines)
Line 0 Link Here
1
[% USE Koha %]
2
[% USE KohaDates %]
3
[% USE Price %]
4
[% INCLUDE 'doc-head-open.inc' %]
5
<title> Add a patron category</title>
6
[% INCLUDE 'installer-doc-head-close.inc' %]
7
[% INCLUDE 'calendar.inc' %]
8
[% INCLUDE 'js_includes.inc' %]
9
[% INCLUDE 'datatables.inc' %]
10
<script type="text/javascript">
11
    var MSG_CATEGORYCODE_CHARS=(_("Please only enter letters into this field."));
12
    var MSG_ONE_ENROLLMENTPERIOD =(_("Please choose an enrollment period in months OR by date."));
13
    var MSG_ONLY_ONE_ENROLLMENTPERIOD=(_("Please only choose one enrolment period."));
14
15
jQuery.validator.addMethod( "enrollment_period", function(){
16
      enrolmentperiod = $("#enrolmentperiod").val();
17
      enrolmentperioddate = $("#enrolmentperioddate").val();
18
      if (( $("#enrolmentperiod").val() == "" && $("#enrolmentperioddate").val() == "") || ($("#enrolmentperiod").val() !== "" && $("#enrolmentperioddate").val() !== "")) {
19
             return false;
20
      } else {
21
             return true;
22
      }
23
    }, MSG_ONE_ENROLLMENTPERIOD
24
);
25
</script>
26
<script type="text/javascript" src="[% themelang %]/js/categories.js"></script>
27
</head>
28
29
[% IF (categories && categories.count > 1 ) %] <!--This if statement checks if the categories variable handed to this template by onboarding.pl has data in it. If the categories variable does have data in it this means that the user has previously imported sample patron category data and so we do not need to show them the create patron category screen 1, instead we can display a screen with ubtton redirecting the user to step 3-->
30
31
32
     <meta http-equiv="refresh" content="0; url=/cgi-bin/koha/installer/onboarding.pl?step=3">
33
34
[% ELSIF (op == "add_validate_category") %]
35
<!--else if the user has not previously imported sample patron categories check if the user has pressed the button name="add_validate" in the create patron category screen 1, and if they have pressed that button then display the below screen with a button to redirect the user to step 3-->
36
37
    <div> <!-- Header that appears at the top of every screen in the koha onboarding tool-->
38
        <h1 id="logo"><img alt="Koha" src="[% interface %]/[% theme %]/img/koha.org-logo.gif"/> Welcome to Koha</h1>
39
    </div>
40
41
    [% IF message != "error_on_insert" %]
42
     <form name="createcat" method="post" action="onboarding.pl">
43
            <input type="hidden" name="step" value="3"/>
44
             <h1 align="left">  New patron category</h1>
45
             <div>
46
                 <p> Success: patron category created! </p>
47
                 <p> To add another patron category and for more settings<br>
48
                 go to:<br>
49
                 More -> Administration -> Patron categories<br>
50
             </div>
51
             Next up:<br>
52
             <input type="submit" name="start" value="Add a patron"><!-- When the user clicks on this button then redirect them to step 3 of the onboarding tool-->
53
     </form>
54
     [% ELSE %]
55
        <form name="retrypatcat" method="post" action="onboarding.pl">
56
        Message is [% message %]
57
        <input type="hidden" name="step" value="2"/>
58
            <h1 align="left">Failed</h1>
59
            <div>Patron category was not successfully created.</br>
60
            Please try again or contact your system administrator.</p>
61
            </div>
62
            <input type="submit" value="Try again"/>
63
        </form>
64
    [% END %]
65
66
67
[% ELSE %] <!--Else display create patron category screen 1 where the user can input values to create their first patron category-->
68
    <div> <!-- Header that appears at the top of every screen in the koha onboarding tool-->
69
        <h1 id="logo"><img alt="Koha" src="[% interface %]/[% theme %]/img/koha.org-logo.gif"/> Welcome to Koha</h1>
70
    </div>
71
72
    <h1 align="left"> Create a new patron category</h1>
73
    <p> The patron category you create in this form is going to be the one which the new administrator patron account will have.</p>
74
       <form id="category_form" method="post" action="onboarding.pl">
75
       <fieldset class="rows">
76
            <input type="hidden" name="step" value="2"/>
77
            <input type="hidden" name="op" value="add_validate_category" />
78
                <ol>
79
                    <li>
80
                        <label for="categorycode" class="required">Category code: </label>
81
                        <input type="text" pattern="[0-9A-Za-z]{1,10}" title="Please enter up to 10 letters and/or numbers" id="categorycode" name="categorycode" value="[% category.categorycode |html %]" size="10" maxlength="10" class="required" required="required" />
82
                        <span class="required">Required</span>
83
                    </li>
84
85
                    <li>
86
                        <label for="description" class="required">Description: </label>
87
                        <input type="text" name="description" title="Please enter a description of the category" size="40" maxlength="80" class="required" required="required" value="[% category.description |html%]" />
88
                        <span class="required">Required</span>
89
                    </li>
90
91
                    <li>
92
                        <label for="overduenoticerequired">Overdue notice required: </label>
93
                        <select name="overduenoticerequired" value="overduenoticerequired">
94
                            [% IF category.overduenoticerequired %]
95
                                <option value="0">No</option>
96
                                <option value="1" selected="selected">Yes</option>
97
                            [% ELSE %]
98
                                <option value="0" selected="selected">No</option>
99
                                <option value="1">Yes</option>
100
                            [% END %]
101
                        </select>
102
                    </li>
103
104
                    <li>
105
                        <label for="category_type" class="required">Category type: </label>
106
                        <select name="category_type" value="category_type" class='required' required='required'>
107
                            [% IF category and category.category_type == 'S' %]
108
                                <option value="S" selected="selected">Staff</option>
109
                            [% ELSE %]
110
                                <option value="S">Staff</option>
111
                            [% END %]
112
                        </select>
113
                        <span class="required">Required</span>
114
                    </li>
115
116
                    <li>
117
                        <label for="default_privacy">Default privacy: </label>
118
                        <select value="default_privacy" name="default_privacy" required="required">
119
                            [% SET default_privacy = 'default' %]
120
121
                            [% IF category %]
122
                               [% SET default_privacy = category.default_privacy %]
123
                            [% END %]
124
125
                            [% SWITCH default_privacy %]
126
                            [% CASE 'forever' %]
127
                                <option value="default">Default</option>
128
                                <option value="never">Never</option>
129
                                <option value="forever" selected="selected">Forever</option>
130
                            [% CASE 'never' %]
131
                                <option value="default">Default</option>
132
                                <option value="never" selected="selected">Never</option>
133
                                <option value="forever">Forever</option>
134
                            [% CASE %]
135
                                <option value="default" selected="selected">Default</option>
136
                                <option value="never">Never</option>
137
                                <option value="forever">Forever</option>
138
                            [% END %]
139
                        </select>
140
                        <p>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 <i>batch_anonymise.pl</i> which should be set up by your system administrator.</p>
141
                    </li>
142
            </ol>
143
            <span class="label">Enrolment period: </span>
144
            </br>
145
                    <fieldset>
146
                    <legend>Choose one</legend>
147
                            <ol>
148
                                <li>
149
                                    <label for="enrolmentperiod" style="width:6em;">In months: </label>
150
                                    <input type="number" class="enrolmentperiod" name="enrolmentperiod" id="enrolmentperiod" size="3" maxlength="3" value="[% IF category.enrolmentperiod %][% category.enrolmentperiod %][% END %]" /> months
151
                                </li>
152
                                <li>
153
                                    <label for="enrolmentperioddate" style="width:6em;">Until date: </label>
154
                                    <input type="text" class="enrolmentperioddate datepicker" name="enrolmentperioddate" id="enrolmentperioddate" value="[% category.enrolmentperioddate | $KohaDates %]" />
155
                                </li>
156
                            </ol>
157
                     </fieldset>
158
                    <br>
159
                    <input type="submit" class="action" value="Submit" />
160
    </fieldset>
161
    </form>
162
[% END %]
163
164
[% INCLUDE 'intranet-bottom.inc' %]
(-)a/koha-tmpl/intranet-tmpl/prog/en/modules/onboarding/onboardingstep3.tt (+196 lines)
Line 0 Link Here
1
<!--Includes for creating patron-->
2
[% USE Koha %]
3
[% USE KohaDates %]
4
[% USE Price %]
5
[% INCLUDE 'doc-head-open.inc' %]
6
[% IF ( finish ) %]<meta http-equiv="refresh" content="10; url=/cgi-bin/koha/mainpage.pl">[% END%]
7
[% INCLUDE 'installer-doc-head-close.inc' %]
8
[% INCLUDE 'calendar.inc' %]
9
[% INCLUDE 'datatables.inc' %]
10
[% INCLUDE 'js_includes.inc' %]
11
12
<head>
13
<title>Create Koha administrator patron</title>
14
<!--jQuery scripts for creating patron-->
15
<script type="text/javascript" src="[% interface %]/lib/jquery/plugins/jquery.fixFloat.js"></script>
16
<script type="text/javascript">
17
     var MSG_PASSWORD_MISMATCH=(_("The entered passwords do not match, please rewrite them"));
18
     jQuery.validator.addMethod( "password_match", function(value,element){
19
        var password = document.getElementById('password').value
20
        var confirmpassword = document.getElementById('password2').value
21
        if ( password != confirmpassword ){
22
                return false;
23
        }
24
        else{
25
                return true
26
        }
27
     },  MSG_PASSWORD_MISMATCH
28
);
29
30
$(document).ready(function(){
31
   $("#Submit").click(function(){
32
      $("#createpatron").validate({
33
        rules: {
34
            surname: {
35
                required: true,
36
            },
37
            firstname: {
38
                required: true,
39
            },
40
            cardnumber: {
41
                required: true,
42
            },
43
            password: {
44
                 password_match:true
45
            }
46
        },
47
        messages: {
48
           password: {
49
                 required: MSG_PASSWORD_MISMATCH
50
           },
51
        }
52
      });
53
   });
54
});
55
</script>
56
</head>
57
58
<div>
59
    <h1 id="logo"><img alt="Koha" src="[% interface %]/[% theme %]/img/koha.org-logo.gif"/> Welcome to Koha</h1>
60
</div>
61
62
63
[%  IF (nok) %]
64
        <form name="errors" method="post" action="onboarding.pl">
65
            <input type="hidden" name="step" value="3"/>
66
            <h1 align="left">There was an error</h1>
67
            <p>Try again </p>
68
            <div>
69
            <ul>
70
            [% IF errorloginexists %]
71
                <li id="ERROR_login_exist">Username/password already exists.</li>
72
            [% END %]
73
            [% IF errorcardnumberexists %]
74
                <li id="ERROR_cardnumber">Cardnumber already in use.</li>
75
            [% END %]
76
            [% IF errorcardnumberlength %]
77
                <li id="ERROR_cardnumber">Cardnumber length is incorrect</li>
78
            [% END %]
79
            [% IF errorshortpassword %]
80
                <li id="ERROR_short_password">Password length is incorrect, must be at least [% minPasswordLength %] characters long.</li>
81
            [% END %]
82
            [% IF errorpasswordmismatch %]
83
                <li id="ERROR_password_mismatch">Passwords do not match.</li>
84
            [% END %]
85
            </ul>
86
87
            </div>
88
            <input type="submit" name="step" value="Try again"/>
89
        </form>
90
91
92
<!--Create a patron screen 2-->
93
[% ELSIF op == 'add_validate' %]
94
          <!--New patron created-->
95
        <form name="patrondone" method="post" action="onboarding.pl">
96
            <input type="hidden" name="step" value="4"/>
97
            <h1 align="left"> Koha administrator patron </h1>
98
            <div>
99
                 <p> Success: administrator patron created!</p>
100
                 <p> To create another patron, go to Patrons -> New Patron. <br>
101
                More -> Set Permissions in a user page to gain superlibrarian permissions.
102
            </div>
103
            Next up:
104
            <input type="submit" name="start" value="Minimal item type setup"/>
105
        </form>
106
[% ELSE %]
107
<!--Create a patron screen 1-->
108
       <h1 align="left"> Create koha administrator patron</h1>
109
        <p>
110
        Now we will create a patron with superlibrarian permissions. Login with this to access Koha as a staff member will all permissions.
111
        </p>
112
        <form name="createpatron" id="createpatron" method="post" action="onboarding.pl">
113
            <fieldset class="rows">
114
                 <input type="hidden" name="step" value="3"/>
115
                 <input type="hidden" name="op" value="add_validate" />
116
                    <legend id="library_management_lgd">Library management</legend>
117
                    <ol>
118
                    <h3>Patron identity</h3>
119
                        <li>
120
                            <label for="surname" class="required">Surname: </label>
121
                            <input type="text" id="surname" name="surname" title="Please only enter letters in the surname field" value="[% surname |html %]" class="required" required="required" />
122
                            <span class="required">Required</span>
123
                        </li>
124
                        <li>
125
                            <label for="firstname" class="required">First name: </label>
126
                            <input  type="text" name="firstname" title="Please only enter letters in the first name field" id="firstname" size="20" value="[% firstname |html %]" class="required" required="required">
127
                            <span class="required">Required</span>
128
                        </li>
129
                    </ol>
130
131
                    <ol>
132
                        <li>
133
                            <label for="cardnumber" class="required">Card number: </label>
134
                            [% IF patrons && patrons > 1 %]
135
                                <input type="text" id="cardnumber" title="Please enter a cardnumber" class="noEnterSubmit valid" name="cardnumber" value="[% newcardnumber | html %]" class="required" required="required">
136
                            [% ELSE %]
137
                                <input type="text" id="cardnumber" title="Please enter a cardnumber" name="cardnumber" value="[% cardnumber | html %]" class="required" required="required">
138
                            [% END %]
139
                            <span class="required">Required</span>
140
                        </li>
141
                        <li>
142
143
                        <!--require a foreach loop to get all the values for the library that the user has either imported (in web installer) or created in the first step of this onboarding tool-->
144
                            <label for="libraries" class="required"> Library: </label>
145
                            <select name="libraries" size="1" id="libraries">
146
147
                             [% FOREACH library IN libraries %]
148
                                  <option name="libraries" value="[% library.branchcode %]"> [% library.branchname %]
149
                             [% END %]
150
151
                                </select>
152
                            <span class="required"> Required</span>
153
                        </li>
154
                        <li>
155
                            <label for="categorycode_entry" class="required"> Patron category</label>
156
                            <select id="categorycode_entry" name="categorycode_entry" onchange="update_category_code(this);">
157
                            [% FOREACH category IN categories %]
158
                                <option name="categorycode_entry" value = "[% category.categorycode %]">[%category.description %]</option>
159
                            [% END %]
160
                            </select>
161
                            <span class="required">Required</span><br><br>
162
                            <b>Note:</b> If you installed sample patron categories please select the "Staff" option in the patron categories dropdown box.
163
                        </li>
164
                    </ol>
165
166
                    <ol>
167
                            <h3> Koha administrator patron permissions</h3>
168
                            <input type="hidden" name="newflags" value="1"/>
169
                            <li>
170
                                <input type="hidden" class="flag parent" id="flag-0" name="flag" value="superlibrarian"/>
171
                                <label name="permissioncode" for="flag-0"> superlibrarian</label>
172
                            </li>
173
                    </ol>
174
                    <ol>
175
                    <h3>OPAC/Staff Login</h3>
176
                        <li>
177
                            <input type="hidden" name="BorrowerMandatoryField" value = "[% BorrowerMandatoryField %]" />
178
                            <label for="userid" class="required">Username: </label>
179
                            <input type="text" name="userid" id ="userid" size="20" title="Please only enter a username of letters and numbers" value="[% userid |html %]" class="required" required="required" />
180
                            <span class="required">Required</span>
181
                        </li>
182
                        <li>
183
                            <label for="passwordlabel" class="required">Password: </label>
184
                            <input type="password" name="password" id="password" size="20" value="[% member.password |html %]" class="required" required="required">
185
                            <span class="required">Required</span>
186
                        </li>
187
                        <li>
188
                            <label for="password2" class="required">Confirm password: </label>
189
                            <input type="password" id="password2" name="password2" size="20" value="" class="required" required="required">
190
                            <span class="required">Required</span>
191
                        </li>
192
                    </ol>
193
             </fieldset><br>
194
                <input type="submit" id="Submit" class="action" value="Submit"/>
195
     </form>
196
[% END %]
(-)a/koha-tmpl/intranet-tmpl/prog/en/modules/onboarding/onboardingstep4.tt (+67 lines)
Line 0 Link Here
1
<!-- includes for creating item type-->
2
[% INCLUDE 'doc-head-open.inc' %]
3
[% IF ( finish ) %]<meta http-equiv="refresh" content="10; url=/cgi-bin/koha/mainpage.pl">[% END%]
4
[% INCLUDE 'installer-doc-head-close.inc' %]
5
<head>
6
    <title>Create item type</title>
7
</head>
8
<div>
9
    <h1 id="logo"><img alt="Koha" src="[% interface %]/[% theme %]/img/koha.org-logo.gif"/> Welcome to Koha</h1>
10
</div>
11
12
[% IF (itemtypes && itemtypes.count >1) %]
13
14
     <meta http-equiv="refresh" content="0; url=/cgi-bin/koha/installer/onboarding.pl?step=5">
15
16
[% ELSIF op == "add_validate" %]
17
        [% IF message != "error_on_insert" %]
18
            <form name="createitemtype" method="post" action="onboarding.pl">
19
                <input type="hidden" name="step" value="5"/>
20
                <h1 align="left"> New Item type </h1>
21
                <div>
22
                    <p> Success: New item type created!</p>
23
                    <p> To create another item type later and for more settings <br>
24
                    go to: <br>
25
                    More -> Administration -> Item types <br>
26
                </div>
27
                Next up:
28
                <input type="submit" value="Add a circulation rule"/>
29
            </form>
30
        [% ELSE %]
31
        <form name="retryitem" method="post" action="onboarding.pl">
32
            <input type="hidden" name="step" value="4"/>
33
            <h1 align="left">Failed </h1>
34
            <div>
35
                <p>Item type was not successfully created. </br>
36
                Please try again or contact your system administrator.
37
                </p>
38
            </div>
39
        </form>
40
        <!--Implement a if statement to check if the item type was successfully created or not -->
41
        [% END %]
42
[% ELSE %]
43
    <!--Create a item type screen 1-->
44
        <h1 align="center"> Create a new Item type </h1>
45
        <p> Item types are used to group related items. Examples of item types are books, cds, and DVDs. <br><br> When adding to your institutions catalogue you will create an item of a particular item type. <br><br> 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.</p>
46
        <form name="createitemform" method="post" action="onboarding.pl">
47
            <fieldset class="rows">
48
                <input type="hidden" name="step" value="4"/>
49
                <input type="hidden" name="op" value="add_validate" />
50
                <ol>
51
                    <li>
52
                        <label for="itemtype" class="required">Item type code: </label>
53
                        <input type="text" name="itemtype" pattern="[0-9A-Za-z]{1,10}" title="Please enter up to 10 letters and/or numbers" id="itemtype" size="10" maxlength="10"  class="required" required="required" value="[% itemtype.itemtype |html %]" />
54
                        <span class="required">Required</span>
55
                    </li>
56
57
                    <li>
58
                        <label for="description" class="required">Description: </label>
59
                        <input type="text" name="description" id="description" title="Please only enter letters and/or numbers into this item type description" size="42" value="[% itemtype.description |html %]" class="required" required="required">
60
                        <span class="required">Required</span>
61
                    </li>
62
                </ol>
63
            <br>
64
            <input type="submit" class="action" value="Submit"/>
65
        </fieldset>
66
        </form>
67
[% END %]
(-)a/koha-tmpl/intranet-tmpl/prog/en/modules/onboarding/onboardingstep5.tt (+127 lines)
Line 0 Link Here
1
[% INCLUDE 'doc-head-open.inc' %]
2
<title>Create Circulation rule</title>
3
[% IF ( finish ) %]<meta http-equiv="refresh" content="10; url=/cgi-bin/koha/mainpage.pl">[% END %]
4
[% INCLUDE 'installer-doc-head-close.inc' %]
5
6
<div>
7
    <h1 id="logo"><img alt="Koha" src="[% interface %]/[% theme %]/img/koha.org-logo.gif"/> Welcome to Koha</h1>
8
</div>
9
10
[% IF (finish) %]
11
<h1>Congratulations you have finished and ready to use Koha</h1>
12
<a href="/cgi-bin/koha/mainpage.pl">Start using Koha</a>
13
14
[% END %]
15
16
<!--Create a circulation rule screen 2-->
17
[% IF op == "add_validate" %]
18
        <!--New circulation rule created-->
19
        <form name="finish" method="post" action="onboarding.pl">
20
            <input type="hidden" name="op" value="finish" />
21
            <h1 align="left"> New circulation rule </h1>
22
            <div>
23
                 <p> Success: circulation rule created!</p>
24
                 <p> To create circulation rule, go to <br>
25
                 More -> Administration -> Circulation and Fine Rules
26
            </div>
27
                 Next up:
28
                 <input type="submit" name="op" value="Finish"/>
29
        </form>
30
[% ELSE %]
31
<!--Create a circulation rule screen 1-->
32
       <h1 align="left"> Create a new circulation rule </h1>
33
       <form name="createcirculationrule" method="post" action="onboarding.pl">
34
            <fieldset class="rows">
35
                 <input type="hidden" name="step" value="5"/>
36
                 <input type="hidden" name="op" value="add_validate" />
37
                    <ol>
38
                    <li>
39
                        <label for="branch" class="required"> Library branch</label>
40
                        <select name="branch" id="branchname" required="required">
41
                        <option value""> Choose</option>
42
                        <option value="*" selected="selected">All</option>
43
                        [% FOREACH library IN libraries %]
44
                            <option id="branch" value="[% library.branchcode %]"> [% library.branchname %]</option>
45
                        [% END %]
46
                        </select>
47
                        <span class="required">Required</span>
48
                    </li>
49
                    <li>
50
                        <label for="categorycode" class="required">Patron category: </label>
51
                        <select name="categorycode" id="categorycodeselection" required="required" onchange = "update_categorycode(this);">
52
                            <option value=""> Choose</option>
53
                            <option value="*" selected="selected">All</option>
54
                            [% FOREACH category IN categories %]
55
                                <option id="categorycode" value = "[% category.categorycode %]"> [%category.description %]</option>
56
                            [%END%]
57
                        </select>
58
                        <span class="required">Required</span>
59
                    </li>
60
61
                    <li>
62
                        <label for="itemtype"> Item type: </label>
63
                        <select id="itemtype" name="itemtype" required="required">
64
                        <option value""> Choose </option>
65
                        <option value="*" selected="selected">All</option>
66
                            [% FOREACH item IN itemtypes %]
67
                                <option name="itemtype" value = "[% item.itemtype %]"> [% item.itemtype %]
68
                            [%END%]
69
                        </select>
70
                        <span class="required"> Required</span>
71
                    </li>
72
                    <li>
73
                        <label for="maxissueqty" class="required">Current checkouts allowed: </label>
74
                        <input type="number" min="0" name="maxissueqty" title="Please only enter numbers" id="maxissueqty" size="10" max="10" value="" class="required" required="required" />
75
                        <span class="required">Required</span>
76
                    </li>
77
78
                    <li>
79
                        <label for="issuelength" class="required">Loan period: </label>
80
                        <input type="number" min="0" name="issuelength" title="Please only enter numbers" id="issuelength" size="10" max="10" value="" class="required" required="required" />
81
                        <span class="required">Required</span>
82
                   </li>
83
                   <li>
84
                        <label for="lengthunit">Units: </label>
85
                        <select name="lengthunit" id="lengthunit" required="required">
86
                        <option value=""> Choose </option>
87
                        [% SET units = 'days' %]
88
                        [% IF category %]
89
                            [% SET default_privacy = category.default_privacy %]
90
                        [% END %]
91
92
                        [% SWITCH units %]
93
                             [% CASE 'days' %]
94
                                   <option value="days" selected="selected">Days</option>
95
                                   <option value="hours">Hours</option>
96
                             [% CASE 'hours' %]
97
                                   <option value="days">Days</option>
98
                                   <option value="hours" selected="selected">Hours</option>
99
                        [% END %]
100
                        </select>
101
                     </li>
102
                     <li>
103
                        <label for="renewalsallowed" class="required">Renewals allowed: </label>
104
                        <input type="number" min="0" name="renewalsallowed" title="Please only enter numbers" id="renewalsallowed" size="10" max="10" value="" class="required" required="required" />
105
                        <span class="required">Required</span>
106
                     </li>
107
108
                     <li>
109
                        <label for="renewalperiod" class="required">Renewals period: </label>
110
                        <input type="number" min="0" name="renewalperiod" title="Please only enter numbers" id="renewalperiod" size="10" max="10" value="" class="required" required="required" />
111
                        <span class="required">Required</span>
112
                     </li>
113
114
                     <li>
115
                        <label for="onshelfholds">On shelf holds allowed: </label>
116
                        <select name="onshelfholds" id="onshelfholds" required="required">
117
                              <option value="">Choose</option>
118
                              <option value="1" selected="selected">Yes</option>
119
                              <option value="0">If any unavailable</option>
120
                              <option value="2">If all unavailable</option>
121
                        </select>
122
                     </li>
123
                  </ol>
124
            </fieldset><br>
125
                <input type="submit" class="action" value="Submit"/>
126
     </form>
127
[% END %]
(-)a/xt/sample_notices.t (-2 / +1 lines)
Lines 22-28 use Test::More qw(no_plan); Link Here
22
22
23
23
24
my $root_dir = 'installer/data/mysql';
24
my $root_dir = 'installer/data/mysql';
25
my $base_notices_file = "en/mandatory/sample_notices.sql";
25
my $base_notices_file = "en/default/sample_notices.sql";
26
my @trans_notices_files = qw(
26
my @trans_notices_files = qw(
27
    fr-FR/1-Obligatoire/sample_notices.sql
27
    fr-FR/1-Obligatoire/sample_notices.sql
28
    fr-CA/obligatoire/sample_notices.sql
28
    fr-CA/obligatoire/sample_notices.sql
29
- 

Return to bug 17855