Bug 28931: Use EXPORT_OK from Koha::DateUtils
[koha.git] / installer / data / mysql / updatedatabase.pl
1 #!/usr/bin/perl
2
3 # Database Updater
4 # This script checks for required updates to the database.
5
6 # Parts copyright Catalyst IT 2011
7
8 # Part of the Koha Library Software www.koha-community.org
9 # Koha is free software; you can redistribute it and/or modify it
10 # under the terms of the GNU General Public License as published by
11 # the Free Software Foundation; either version 3 of the License, or
12 # (at your option) any later version.
13 #
14 # Koha is distributed in the hope that it will be useful, but
15 # WITHOUT ANY WARRANTY; without even the implied warranty of
16 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 # GNU General Public License for more details.
18 #
19 # You should have received a copy of the GNU General Public License
20 # along with Koha; if not, see <http://www.gnu.org/licenses>.
21 #
22
23 # Bugs/ToDo:
24 # - Would also be a good idea to offer to do a backup at this time...
25
26 # NOTE:  If you do something more than once in here, make it table driven.
27
28 # NOTE: Please keep the version in kohaversion.pl up-to-date!
29
30 use Modern::Perl;
31
32 use feature 'say';
33
34 # CPAN modules
35 use DBI;
36 use Getopt::Long;
37 use Encode qw( encode_utf8 );
38 # Koha modules
39 use C4::Context;
40 use C4::Installer;
41 use Koha::Database;
42 use Koha;
43 use Koha::DateUtils qw( dt_from_string output_pref );
44
45 use MARC::Record;
46 use MARC::File::XML ( BinaryEncoding => 'utf8' );
47
48 use File::Path qw[remove_tree]; # perl core module
49
50 # FIXME - The user might be installing a new database, so can't rely
51 # on /etc/koha.conf anyway.
52
53 my (
54     $sth,
55     $query,
56     $table,
57     $type,
58 );
59
60 my $schema = Koha::Database->new()->schema();
61
62 my ( $silent, $force );
63 GetOptions(
64     's'     => \$silent,
65     'force' => \$force,
66 );
67 my $dbh = C4::Context->dbh;
68 $|=1; # flushes output
69
70 local $dbh->{RaiseError} = 0;
71
72 # Record the version we are coming from
73
74 my $original_version = C4::Context->preference("Version");
75
76 # Deal with virtualshelves
77 my $DBversion = "3.00.00.001";
78 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
79     # update virtualshelves table to
80     #
81     $dbh->do("ALTER TABLE `bookshelf` RENAME `virtualshelves`");
82     $dbh->do("ALTER TABLE `shelfcontents` RENAME `virtualshelfcontents`");
83     $dbh->do("ALTER TABLE `virtualshelfcontents` ADD `biblionumber` INT( 11 ) NOT NULL default '0' AFTER shelfnumber");
84     $dbh->do("UPDATE `virtualshelfcontents` SET biblionumber=(SELECT biblionumber FROM items WHERE items.itemnumber=virtualshelfcontents.itemnumber)");
85     # drop all foreign keys : otherwise, we can't drop itemnumber field.
86     DropAllForeignKeys('virtualshelfcontents');
87     $dbh->do("ALTER TABLE `virtualshelfcontents` ADD KEY biblionumber (biblionumber)");
88     # create the new foreign keys (on biblionumber)
89     $dbh->do("ALTER TABLE `virtualshelfcontents` ADD CONSTRAINT `virtualshelfcontents_ibfk_1` FOREIGN KEY (`shelfnumber`) REFERENCES `virtualshelves` (`shelfnumber`) ON DELETE CASCADE ON UPDATE CASCADE");
90     # re-create the foreign key on virtualshelf
91     $dbh->do("ALTER TABLE `virtualshelfcontents` ADD CONSTRAINT `shelfcontents_ibfk_2` FOREIGN KEY (`biblionumber`) REFERENCES `biblio` (`biblionumber`) ON DELETE CASCADE ON UPDATE CASCADE");
92     $dbh->do("ALTER TABLE `virtualshelfcontents` DROP `itemnumber`");
93     print "Upgrade to $DBversion done (virtualshelves)\n";
94     SetVersion ($DBversion);
95 }
96
97
98 $DBversion = "3.00.00.002";
99 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
100     $dbh->do("DROP TABLE sessions");
101     $dbh->do("CREATE TABLE `sessions` (
102   `id` varchar(32) NOT NULL,
103   `a_session` text NOT NULL,
104   UNIQUE KEY `id` (`id`)
105 ) ENGINE=InnoDB DEFAULT CHARSET=utf8;");
106     print "Upgrade to $DBversion done (sessions uses CGI::session, new table structure for sessions)\n";
107     SetVersion ($DBversion);
108 }
109
110
111 $DBversion = "3.00.00.003";
112 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
113     if (C4::Context->preference("opaclanguages") eq "fr") {
114         $dbh->do("INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES('ReservesNeedReturns','0','Si ce paramètre est mis à 1, une réservation posée sur un exemplaire présent sur le site devra être passée en retour pour être disponible. Sinon, elle sera automatiquement disponible, Koha considère que le bibliothécaire place la réservation en ayant le document en mains','','YesNo')");
115     } else {
116         $dbh->do("INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES('ReservesNeedReturns','0','If set, a reserve done on an item available in this branch need a check-in, otherwise, a reserve on a specific item, that is on the branch & available is considered as available','','YesNo')");
117     }
118     print "Upgrade to $DBversion done (adding ReservesNeedReturns systempref, in circulation)\n";
119     SetVersion ($DBversion);
120 }
121
122
123 $DBversion = "3.00.00.004";
124 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
125     $dbh->do("INSERT INTO `systempreferences` VALUES ('DebugLevel','2','set the level of error info sent to the browser. 0=none, 1=some, 2=most','0|1|2','Choice')");
126     print "Upgrade to $DBversion done (adding DebugLevel systempref, in 'Admin' tab)\n";
127     SetVersion ($DBversion);
128 }
129
130 $DBversion = "3.00.00.005";
131 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
132     $dbh->do("CREATE TABLE `tags` (
133                     `entry` varchar(255) NOT NULL default '',
134                     `weight` bigint(20) NOT NULL default 0,
135                     PRIMARY KEY  (`entry`)
136                     ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
137                 ");
138         $dbh->do("CREATE TABLE `nozebra` (
139                 `server` varchar(20)     NOT NULL,
140                 `indexname` varchar(40)  NOT NULL,
141                 `value` varchar(250)     NOT NULL,
142                 `biblionumbers` longtext NOT NULL,
143                 KEY `indexname` (`server`,`indexname`),
144                 KEY `value` (`server`,`value`))
145                 ENGINE=InnoDB DEFAULT CHARSET=utf8;
146                 ");
147     print "Upgrade to $DBversion done (adding tags and nozebra tables )\n";
148     SetVersion ($DBversion);
149 }
150
151 $DBversion = "3.00.00.006";
152 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
153     sanitize_zero_date('issues', 'issuedate');
154     print "Upgrade to $DBversion done (filled issues.issuedate with timestamp)\n";
155     SetVersion ($DBversion);
156 }
157
158 $DBversion = "3.00.00.007";
159 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
160     $dbh->do("INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES ('SessionStorage','mysql','Use mysql or a temporary file for storing session data','mysql|tmp','Choice')");
161     print "Upgrade to $DBversion done (set SessionStorage variable)\n";
162     SetVersion ($DBversion);
163 }
164
165 $DBversion = "3.00.00.008";
166 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
167     $dbh->do("ALTER TABLE `biblio` ADD `datecreated` DATE NOT NULL AFTER `timestamp` ;");
168     $dbh->do("UPDATE biblio SET datecreated=timestamp");
169     print "Upgrade to $DBversion done (biblio creation date)\n";
170     SetVersion ($DBversion);
171 }
172
173 $DBversion = "3.00.00.009";
174 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
175
176     # Create backups of call number columns
177     # in case default migration needs to be customized
178     #
179     # UPGRADE NOTE: temp_upg_biblioitems_call_num should be dropped
180     #               after call numbers have been transformed to the new structure
181     #
182     # Not bothering to do the same with deletedbiblioitems -- assume
183     # default is good enough.
184     $dbh->do("CREATE TABLE `temp_upg_biblioitems_call_num` AS
185               SELECT `biblioitemnumber`, `biblionumber`,
186                      `classification`, `dewey`, `subclass`,
187                      `lcsort`, `ccode`
188               FROM `biblioitems`");
189
190     # biblioitems changes
191     $dbh->do("ALTER TABLE `biblioitems` CHANGE COLUMN `volumeddesc` `volumedesc` TEXT,
192                                     ADD `cn_source` VARCHAR(10) DEFAULT NULL AFTER `ccode`,
193                                     ADD `cn_class` VARCHAR(30) DEFAULT NULL AFTER `cn_source`,
194                                     ADD `cn_item` VARCHAR(10) DEFAULT NULL AFTER `cn_class`,
195                                     ADD `cn_suffix` VARCHAR(10) DEFAULT NULL AFTER `cn_item`,
196                                     ADD `cn_sort` VARCHAR(30) DEFAULT NULL AFTER `cn_suffix`,
197                                     ADD `totalissues` INT(10) AFTER `cn_sort`");
198
199     # default mapping of call number columns:
200     #   cn_class = concatentation of classification + dewey,
201     #              trimmed to fit -- assumes that most users do not
202     #              populate both classification and dewey in a single record
203     #   cn_item  = subclass
204     #   cn_source = left null
205     #   cn_sort = lcsort
206     #
207     # After upgrade, cn_sort will have to be set based on whatever
208     # default call number scheme user sets as a preference.  Misc
209     # script will be added at some point to do that.
210     #
211     $dbh->do("UPDATE `biblioitems`
212               SET cn_class = SUBSTR(TRIM(CONCAT_WS(' ', `classification`, `dewey`)), 1, 30),
213                     cn_item = subclass,
214                     `cn_sort` = `lcsort`
215             ");
216
217     # Now drop the old call number columns
218     $dbh->do("ALTER TABLE `biblioitems` DROP COLUMN `classification`,
219                                         DROP COLUMN `dewey`,
220                                         DROP COLUMN `subclass`,
221                                         DROP COLUMN `lcsort`,
222                                         DROP COLUMN `ccode`");
223
224     # deletedbiblio changes
225     $dbh->do("ALTER TABLE `deletedbiblio` ALTER COLUMN `frameworkcode` SET DEFAULT '',
226                                         DROP COLUMN `marc`,
227                                         ADD `datecreated` DATE NOT NULL AFTER `timestamp`");
228     $dbh->do("UPDATE deletedbiblio SET datecreated = timestamp");
229
230     # deletedbiblioitems changes
231     $dbh->do("ALTER TABLE `deletedbiblioitems`
232                         MODIFY `publicationyear` TEXT,
233                         CHANGE `volumeddesc` `volumedesc` TEXT,
234                         MODIFY `collectiontitle` MEDIUMTEXT DEFAULT NULL AFTER `volumedesc`,
235                         MODIFY `collectionissn` TEXT DEFAULT NULL AFTER `collectiontitle`,
236                         MODIFY `collectionvolume` MEDIUMTEXT DEFAULT NULL AFTER `collectionissn`,
237                         MODIFY `editionstatement` TEXT DEFAULT NULL AFTER `collectionvolume`,
238                         MODIFY `editionresponsibility` TEXT DEFAULT NULL AFTER `editionstatement`,
239                         MODIFY `place` VARCHAR(255) DEFAULT NULL AFTER `size`,
240                         MODIFY `marc` LONGBLOB,
241                         ADD `cn_source` VARCHAR(10) DEFAULT NULL AFTER `url`,
242                         ADD `cn_class` VARCHAR(30) DEFAULT NULL AFTER `cn_source`,
243                         ADD `cn_item` VARCHAR(10) DEFAULT NULL AFTER `cn_class`,
244                         ADD `cn_suffix` VARCHAR(10) DEFAULT NULL AFTER `cn_item`,
245                         ADD `cn_sort` VARCHAR(30) DEFAULT NULL AFTER `cn_suffix`,
246                         ADD `totalissues` INT(10) AFTER `cn_sort`,
247                         ADD `marcxml` LONGTEXT NOT NULL AFTER `totalissues`,
248                         ADD KEY `isbn` (`isbn`),
249                         ADD KEY `publishercode` (`publishercode`)
250                     ");
251
252     $dbh->do("UPDATE `deletedbiblioitems`
253                 SET `cn_class` = SUBSTR(TRIM(CONCAT_WS(' ', `classification`, `dewey`)), 1, 30),
254                `cn_item` = `subclass`,
255                 `cn_sort` = `lcsort`
256             ");
257     $dbh->do("ALTER TABLE `deletedbiblioitems`
258                         DROP COLUMN `classification`,
259                         DROP COLUMN `dewey`,
260                         DROP COLUMN `subclass`,
261                         DROP COLUMN `lcsort`,
262                         DROP COLUMN `ccode`
263             ");
264
265     # deleteditems changes
266     $dbh->do("ALTER TABLE `deleteditems`
267                         MODIFY `barcode` VARCHAR(20) DEFAULT NULL,
268                         MODIFY `price` DECIMAL(8,2) DEFAULT NULL,
269                         MODIFY `replacementprice` DECIMAL(8,2) DEFAULT NULL,
270                         DROP `bulk`,
271                         MODIFY `itemcallnumber` VARCHAR(30) DEFAULT NULL AFTER `wthdrawn`,
272                         MODIFY `holdingbranch` VARCHAR(10) DEFAULT NULL,
273                         DROP `interim`,
274                         MODIFY `timestamp` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP AFTER `paidfor`,
275                         DROP `cutterextra`,
276                         ADD `cn_source` VARCHAR(10) DEFAULT NULL AFTER `onloan`,
277                         ADD `cn_sort` VARCHAR(30) DEFAULT NULL AFTER `cn_source`,
278                         ADD `ccode` VARCHAR(10) DEFAULT NULL AFTER `cn_sort`,
279                         ADD `materials` VARCHAR(10) DEFAULT NULL AFTER `ccode`,
280                         ADD `uri` VARCHAR(255) DEFAULT NULL AFTER `materials`,
281                         MODIFY `marc` LONGBLOB AFTER `uri`,
282                         DROP KEY `barcode`,
283                         DROP KEY `itembarcodeidx`,
284                         DROP KEY `itembinoidx`,
285                         DROP KEY `itembibnoidx`,
286                         ADD UNIQUE KEY `delitembarcodeidx` (`barcode`),
287                         ADD KEY `delitembinoidx` (`biblioitemnumber`),
288                         ADD KEY `delitembibnoidx` (`biblionumber`),
289                         ADD KEY `delhomebranch` (`homebranch`),
290                         ADD KEY `delholdingbranch` (`holdingbranch`)");
291     $dbh->do("UPDATE deleteditems SET `ccode` = `itype`");
292     $dbh->do("ALTER TABLE deleteditems DROP `itype`");
293     $dbh->do("UPDATE `deleteditems` SET `cn_sort` = `itemcallnumber`");
294
295     # items changes
296     $dbh->do("ALTER TABLE `items` ADD `cn_source` VARCHAR(10) DEFAULT NULL AFTER `onloan`,
297                                 ADD `cn_sort` VARCHAR(30) DEFAULT NULL AFTER `cn_source`,
298                                 ADD `ccode` VARCHAR(10) DEFAULT NULL AFTER `cn_sort`,
299                                 ADD `materials` VARCHAR(10) DEFAULT NULL AFTER `ccode`,
300                                 ADD `uri` VARCHAR(255) DEFAULT NULL AFTER `materials`
301             ");
302     $dbh->do("ALTER TABLE `items`
303                         DROP KEY `itembarcodeidx`,
304                         ADD UNIQUE KEY `itembarcodeidx` (`barcode`)");
305
306     # map items.itype to items.ccode and
307     # set cn_sort to itemcallnumber -- as with biblioitems.cn_sort,
308     # will have to be subsequently updated per user's default
309     # classification scheme
310     $dbh->do("UPDATE `items` SET `cn_sort` = `itemcallnumber`,
311                             `ccode` = `itype`");
312
313     $dbh->do("ALTER TABLE `items` DROP `cutterextra`,
314                                 DROP `itype`");
315
316     print "Upgrade to $DBversion done (major changes to biblio, biblioitems, items, and deleted* versions of same\n";
317     SetVersion ($DBversion);
318 }
319
320 $DBversion = "3.00.00.010";
321 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
322     $dbh->do("CREATE INDEX `userid` ON borrowers (`userid`) ");
323     print "Upgrade to $DBversion done (userid index added)\n";
324     SetVersion ($DBversion);
325 }
326
327 $DBversion = "3.00.00.011";
328 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
329     $dbh->do("ALTER TABLE `branchcategories` CHANGE `categorycode` `categorycode` varchar(10) ");
330     $dbh->do("ALTER TABLE `branchcategories` CHANGE `categoryname` `categoryname` varchar(32) ");
331     $dbh->do("ALTER TABLE `branchcategories` ADD COLUMN `categorytype` varchar(16) ");
332     $dbh->do("UPDATE `branchcategories` SET `categorytype` = 'properties'");
333     $dbh->do("ALTER TABLE `branchrelations` CHANGE `categorycode` `categorycode` varchar(10) ");
334     print "Upgrade to $DBversion done (added branchcategory type)\n";
335     SetVersion ($DBversion);
336 }
337
338 $DBversion = "3.00.00.012";
339 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
340     $dbh->do("CREATE TABLE `class_sort_rules` (
341                                `class_sort_rule` varchar(10) NOT NULL default '',
342                                `description` mediumtext,
343                                `sort_routine` varchar(30) NOT NULL default '',
344                                PRIMARY KEY (`class_sort_rule`),
345                                UNIQUE KEY `class_sort_rule_idx` (`class_sort_rule`)
346                              ) ENGINE=InnoDB DEFAULT CHARSET=utf8");
347     $dbh->do("CREATE TABLE `class_sources` (
348                                `cn_source` varchar(10) NOT NULL default '',
349                                `description` mediumtext,
350                                `used` tinyint(4) NOT NULL default 0,
351                                `class_sort_rule` varchar(10) NOT NULL default '',
352                                PRIMARY KEY (`cn_source`),
353                                UNIQUE KEY `cn_source_idx` (`cn_source`),
354                                KEY `used_idx` (`used`),
355                                CONSTRAINT `class_source_ibfk_1` FOREIGN KEY (`class_sort_rule`)
356                                           REFERENCES `class_sort_rules` (`class_sort_rule`)
357                              ) ENGINE=InnoDB DEFAULT CHARSET=utf8");
358     $dbh->do("INSERT INTO `systempreferences` (variable,value,explanation,options,type)
359               VALUES('DefaultClassificationSource','ddc',
360                      'Default classification scheme used by the collection. E.g., Dewey, LCC, etc.', NULL,'free')");
361     $dbh->do("INSERT INTO `class_sort_rules` (`class_sort_rule`, `description`, `sort_routine`) VALUES
362                                ('dewey', 'Default filing rules for DDC', 'Dewey'),
363                                ('lcc', 'Default filing rules for LCC', 'LCC'),
364                                ('generic', 'Generic call number filing rules', 'Generic')");
365     $dbh->do("INSERT INTO `class_sources` (`cn_source`, `description`, `used`, `class_sort_rule`) VALUES
366                             ('ddc', 'Dewey Decimal Classification', 1, 'dewey'),
367                             ('lcc', 'Library of Congress Classification', 1, 'lcc'),
368                             ('udc', 'Universal Decimal Classification', 0, 'generic'),
369                             ('sudocs', 'SuDoc Classification (U.S. GPO)', 0, 'generic'),
370                             ('z', 'Other/Generic Classification Scheme', 0, 'generic')");
371     print "Upgrade to $DBversion done (classification sources added)\n";
372     SetVersion ($DBversion);
373 }
374
375 $DBversion = "3.00.00.013";
376 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
377     $dbh->do("CREATE TABLE `import_batches` (
378               `import_batch_id` int(11) NOT NULL auto_increment,
379               `template_id` int(11) default NULL,
380               `branchcode` varchar(10) default NULL,
381               `num_biblios` int(11) NOT NULL default 0,
382               `num_items` int(11) NOT NULL default 0,
383               `upload_timestamp` timestamp NOT NULL default CURRENT_TIMESTAMP,
384               `overlay_action` enum('replace', 'create_new', 'use_template') NOT NULL default 'create_new',
385               `import_status` enum('staging', 'staged', 'importing', 'imported', 'reverting', 'reverted', 'cleaned') NOT NULL default 'staging',
386               `batch_type` enum('batch', 'z3950') NOT NULL default 'batch',
387               `file_name` varchar(100),
388               `comments` mediumtext,
389               PRIMARY KEY (`import_batch_id`),
390               KEY `branchcode` (`branchcode`)
391               ) ENGINE=InnoDB DEFAULT CHARSET=utf8");
392     $dbh->do("CREATE TABLE `import_records` (
393               `import_record_id` int(11) NOT NULL auto_increment,
394               `import_batch_id` int(11) NOT NULL,
395               `branchcode` varchar(10) default NULL,
396               `record_sequence` int(11) NOT NULL default 0,
397               `upload_timestamp` timestamp NOT NULL default CURRENT_TIMESTAMP,
398               `import_date` DATE default NULL,
399               `marc` longblob NOT NULL,
400               `marcxml` longtext NOT NULL,
401               `marcxml_old` longtext NOT NULL,
402               `record_type` enum('biblio', 'auth', 'holdings') NOT NULL default 'biblio',
403               `overlay_status` enum('no_match', 'auto_match', 'manual_match', 'match_applied') NOT NULL default 'no_match',
404               `status` enum('error', 'staged', 'imported', 'reverted', 'items_reverted') NOT NULL default 'staged',
405               `import_error` mediumtext,
406               `encoding` varchar(40) NOT NULL default '',
407               `z3950random` varchar(40) default NULL,
408               PRIMARY KEY (`import_record_id`),
409               CONSTRAINT `import_records_ifbk_1` FOREIGN KEY (`import_batch_id`)
410                           REFERENCES `import_batches` (`import_batch_id`) ON DELETE CASCADE ON UPDATE CASCADE,
411               KEY `branchcode` (`branchcode`),
412               KEY `batch_sequence` (`import_batch_id`, `record_sequence`)
413               ) ENGINE=InnoDB DEFAULT CHARSET=utf8");
414     $dbh->do("CREATE TABLE `import_record_matches` (
415               `import_record_id` int(11) NOT NULL,
416               `candidate_match_id` int(11) NOT NULL,
417               `score` int(11) NOT NULL default 0,
418               CONSTRAINT `import_record_matches_ibfk_1` FOREIGN KEY (`import_record_id`)
419                           REFERENCES `import_records` (`import_record_id`) ON DELETE CASCADE ON UPDATE CASCADE,
420               KEY `record_score` (`import_record_id`, `score`)
421               ) ENGINE=InnoDB DEFAULT CHARSET=utf8");
422     $dbh->do("CREATE TABLE `import_biblios` (
423               `import_record_id` int(11) NOT NULL,
424               `matched_biblionumber` int(11) default NULL,
425               `control_number` varchar(25) default NULL,
426               `original_source` varchar(25) default NULL,
427               `title` varchar(128) default NULL,
428               `author` varchar(80) default NULL,
429               `isbn` varchar(14) default NULL,
430               `issn` varchar(9) default NULL,
431               `has_items` tinyint(1) NOT NULL default 0,
432               CONSTRAINT `import_biblios_ibfk_1` FOREIGN KEY (`import_record_id`)
433                           REFERENCES `import_records` (`import_record_id`) ON DELETE CASCADE ON UPDATE CASCADE,
434               KEY `matched_biblionumber` (`matched_biblionumber`),
435               KEY `title` (`title`),
436               KEY `isbn` (`isbn`)
437               ) ENGINE=InnoDB DEFAULT CHARSET=utf8");
438     $dbh->do("CREATE TABLE `import_items` (
439               `import_items_id` int(11) NOT NULL auto_increment,
440               `import_record_id` int(11) NOT NULL,
441               `itemnumber` int(11) default NULL,
442               `branchcode` varchar(10) default NULL,
443               `status` enum('error', 'staged', 'imported', 'reverted') NOT NULL default 'staged',
444               `marcxml` longtext NOT NULL,
445               `import_error` mediumtext,
446               PRIMARY KEY (`import_items_id`),
447               CONSTRAINT `import_items_ibfk_1` FOREIGN KEY (`import_record_id`)
448                           REFERENCES `import_records` (`import_record_id`) ON DELETE CASCADE ON UPDATE CASCADE,
449               KEY `itemnumber` (`itemnumber`),
450               KEY `branchcode` (`branchcode`)
451               ) ENGINE=InnoDB DEFAULT CHARSET=utf8");
452
453     $dbh->do("INSERT INTO `import_batches`
454                 (`overlay_action`, `import_status`, `batch_type`, `file_name`)
455               SELECT distinct 'create_new', 'staged', 'z3950', `file`
456               FROM   `marc_breeding`");
457
458     $dbh->do("INSERT INTO `import_records`
459                 (`import_batch_id`, `import_record_id`, `record_sequence`, `marc`, `record_type`, `status`,
460                 `encoding`, `z3950random`, `marcxml`, `marcxml_old`)
461               SELECT `import_batch_id`, `id`, 1, `marc`, 'biblio', 'staged', `encoding`, `z3950random`, '', ''
462               FROM `marc_breeding`
463               JOIN `import_batches` ON (`file_name` = `file`)");
464
465     $dbh->do("INSERT INTO `import_biblios`
466                 (`import_record_id`, `title`, `author`, `isbn`)
467               SELECT `import_record_id`, `title`, `author`, `isbn`
468               FROM   `marc_breeding`
469               JOIN   `import_records` ON (`import_record_id` = `id`)");
470
471     $dbh->do("UPDATE `import_batches`
472               SET `num_biblios` = (
473               SELECT COUNT(*)
474               FROM `import_records`
475               WHERE `import_batch_id` = `import_batches`.`import_batch_id`
476               )");
477
478     $dbh->do("DROP TABLE `marc_breeding`");
479
480     print "Upgrade to $DBversion done (import_batches et al. added)\n";
481     SetVersion ($DBversion);
482 }
483
484 $DBversion = "3.00.00.014";
485 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
486     $dbh->do("ALTER TABLE subscription ADD lastbranch VARCHAR(4)");
487     print "Upgrade to $DBversion done (userid index added)\n";
488     SetVersion ($DBversion);
489 }
490
491 $DBversion = "3.00.00.015";
492 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
493     $dbh->do("CREATE TABLE `saved_sql` (
494            `id` int(11) NOT NULL auto_increment,
495            `borrowernumber` int(11) default NULL,
496            `date_created` datetime default NULL,
497            `last_modified` datetime default NULL,
498            `savedsql` text,
499            `last_run` datetime default NULL,
500            `report_name` varchar(255) default NULL,
501            `type` varchar(255) default NULL,
502            `notes` text,
503            PRIMARY KEY  (`id`),
504            KEY boridx (`borrowernumber`)
505         ) ENGINE=InnoDB DEFAULT CHARSET=utf8;");
506     $dbh->do("CREATE TABLE `saved_reports` (
507            `id` int(11) NOT NULL auto_increment,
508            `report_id` int(11) default NULL,
509            `report` longtext,
510            `date_run` datetime default NULL,
511            PRIMARY KEY  (`id`)
512         ) ENGINE=InnoDB DEFAULT CHARSET=utf8;");
513     print "Upgrade to $DBversion done (saved_sql and saved_reports added)\n";
514     SetVersion ($DBversion);
515 }
516
517 $DBversion = "3.00.00.016";
518 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
519     $dbh->do(" CREATE TABLE reports_dictionary (
520           id int(11) NOT NULL auto_increment,
521           name varchar(255) default NULL,
522           description text,
523           date_created datetime default NULL,
524           date_modified datetime default NULL,
525           saved_sql text,
526           area int(11) default NULL,
527           PRIMARY KEY  (id)
528         ) ENGINE=InnoDB DEFAULT CHARSET=utf8 ");
529     print "Upgrade to $DBversion done (reports_dictionary) added)\n";
530     SetVersion ($DBversion);
531 }
532
533 $DBversion = "3.00.00.017";
534 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
535     $dbh->do("ALTER TABLE action_logs DROP PRIMARY KEY");
536     $dbh->do("ALTER TABLE action_logs ADD KEY  timestamp (timestamp,user)");
537     $dbh->do("ALTER TABLE action_logs ADD action_id INT(11) NOT NULL FIRST");
538     $dbh->do("UPDATE action_logs SET action_id = if (\@a, \@a:=\@a+1, \@a:=1)");
539     $dbh->do("ALTER TABLE action_logs MODIFY action_id INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY");
540     print "Upgrade to $DBversion done (added column to action_logs)\n";
541     SetVersion ($DBversion);
542 }
543
544 $DBversion = "3.00.00.018";
545 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
546     $dbh->do("ALTER TABLE `zebraqueue`
547                     ADD `done` INT NOT NULL DEFAULT '0',
548                     ADD `time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ;
549             ");
550     print "Upgrade to $DBversion done (adding timestamp and done columns to zebraque table to improve problem tracking) added)\n";
551     SetVersion ($DBversion);
552 }
553
554 $DBversion = "3.00.00.019";
555 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
556     $dbh->do("ALTER TABLE biblio MODIFY biblionumber INT(11) NOT NULL AUTO_INCREMENT");
557     $dbh->do("ALTER TABLE biblioitems MODIFY biblioitemnumber INT(11) NOT NULL AUTO_INCREMENT");
558     $dbh->do("ALTER TABLE items MODIFY itemnumber INT(11) NOT NULL AUTO_INCREMENT");
559     print "Upgrade to $DBversion done (made bib/item PKs auto_increment)\n";
560     SetVersion ($DBversion);
561 }
562
563 $DBversion = "3.00.00.020";
564 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
565     $dbh->do("ALTER TABLE deleteditems
566               DROP KEY `delitembarcodeidx`,
567               ADD KEY `delitembarcodeidx` (`barcode`)");
568     print "Upgrade to $DBversion done (dropped uniqueness of key on deleteditems.barcode)\n";
569     SetVersion ($DBversion);
570 }
571
572 $DBversion = "3.00.00.021";
573 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
574     $dbh->do("ALTER TABLE items CHANGE homebranch homebranch VARCHAR(10)");
575     $dbh->do("ALTER TABLE deleteditems CHANGE homebranch homebranch VARCHAR(10)");
576     $dbh->do("ALTER TABLE statistics CHANGE branch branch VARCHAR(10)");
577     $dbh->do("ALTER TABLE subscription CHANGE lastbranch lastbranch VARCHAR(10)");
578     print "Upgrade to $DBversion done (extended missed branchcode columns to 10 chars)\n";
579     SetVersion ($DBversion);
580 }
581
582 $DBversion = "3.00.00.022";
583 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
584     $dbh->do("ALTER TABLE items
585                 ADD `damaged` tinyint(1) default NULL AFTER notforloan");
586     $dbh->do("ALTER TABLE deleteditems
587                 ADD `damaged` tinyint(1) default NULL AFTER notforloan");
588     print "Upgrade to $DBversion done (adding damaged column to items table)\n";
589     SetVersion ($DBversion);
590 }
591
592 $DBversion = "3.00.00.023";
593 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
594      $dbh->do("INSERT INTO `systempreferences` (variable,value,options,explanation,type)
595          VALUES ('yuipath','http://yui.yahooapis.com/2.3.1/build','Insert the path to YUI libraries','','free')");
596     print "Upgrade to $DBversion done (adding new system preference for controlling YUI path)\n";
597     SetVersion ($DBversion);
598 }
599 $DBversion = "3.00.00.024";
600 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
601     $dbh->do("ALTER TABLE biblioitems CHANGE  itemtype itemtype VARCHAR(10)");
602     print "Upgrade to $DBversion done (changing itemtype to (10))\n";
603     SetVersion ($DBversion);
604 }
605
606 $DBversion = "3.00.00.025";
607 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
608     $dbh->do("ALTER TABLE items ADD COLUMN itype VARCHAR(10)");
609     $dbh->do("ALTER TABLE deleteditems ADD COLUMN itype VARCHAR(10) AFTER uri");
610     if(C4::Context->preference('item-level_itypes')){
611         $dbh->do('update items,biblioitems set items.itype=biblioitems.itemtype where items.biblionumber=biblioitems.biblionumber and itype is null');
612     }
613     print "Upgrade to $DBversion done (reintroduce items.itype - fill from itemtype)\n ";
614     SetVersion ($DBversion);
615 }
616
617 $DBversion = "3.00.00.026";
618 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
619     $dbh->do("INSERT INTO `systempreferences` (variable,value,options,explanation,type)
620        VALUES ('HomeOrHoldingBranch','homebranch','homebranch|holdingbranch','With independent branches turned on this decides whether to check the items holdingbranch or homebranch at circulatilon','choice')");
621     print "Upgrade to $DBversion done (adding new system preference for choosing whether homebranch or holdingbranch is checked in circulation)\n";
622     SetVersion ($DBversion);
623 }
624
625 $DBversion = "3.00.00.027";
626 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
627     $dbh->do("CREATE TABLE `marc_matchers` (
628                 `matcher_id` int(11) NOT NULL auto_increment,
629                 `code` varchar(10) NOT NULL default '',
630                 `description` varchar(255) NOT NULL default '',
631                 `record_type` varchar(10) NOT NULL default 'biblio',
632                 `threshold` int(11) NOT NULL default 0,
633                 PRIMARY KEY (`matcher_id`),
634                 KEY `code` (`code`),
635                 KEY `record_type` (`record_type`)
636               ) ENGINE=InnoDB DEFAULT CHARSET=utf8");
637     $dbh->do("CREATE TABLE `matchpoints` (
638                 `matcher_id` int(11) NOT NULL,
639                 `matchpoint_id` int(11) NOT NULL auto_increment,
640                 `search_index` varchar(30) NOT NULL default '',
641                 `score` int(11) NOT NULL default 0,
642                 PRIMARY KEY (`matchpoint_id`),
643                 CONSTRAINT `matchpoints_ifbk_1` FOREIGN KEY (`matcher_id`)
644                            REFERENCES `marc_matchers` (`matcher_id`) ON DELETE CASCADE ON UPDATE CASCADE
645               ) ENGINE=InnoDB DEFAULT CHARSET=utf8");
646     $dbh->do("CREATE TABLE `matchpoint_components` (
647                 `matchpoint_id` int(11) NOT NULL,
648                 `matchpoint_component_id` int(11) NOT NULL auto_increment,
649                 sequence int(11) NOT NULL default 0,
650                 tag varchar(3) NOT NULL default '',
651                 subfields varchar(40) NOT NULL default '',
652                 offset int(4) NOT NULL default 0,
653                 length int(4) NOT NULL default 0,
654                 PRIMARY KEY (`matchpoint_component_id`),
655                 KEY `by_sequence` (`matchpoint_id`, `sequence`),
656                 CONSTRAINT `matchpoint_components_ifbk_1` FOREIGN KEY (`matchpoint_id`)
657                            REFERENCES `matchpoints` (`matchpoint_id`) ON DELETE CASCADE ON UPDATE CASCADE
658               ) ENGINE=InnoDB DEFAULT CHARSET=utf8");
659     $dbh->do("CREATE TABLE `matchpoint_component_norms` (
660                 `matchpoint_component_id` int(11) NOT NULL,
661                 `sequence`  int(11) NOT NULL default 0,
662                 `norm_routine` varchar(50) NOT NULL default '',
663                 KEY `matchpoint_component_norms` (`matchpoint_component_id`, `sequence`),
664                 CONSTRAINT `matchpoint_component_norms_ifbk_1` FOREIGN KEY (`matchpoint_component_id`)
665                            REFERENCES `matchpoint_components` (`matchpoint_component_id`) ON DELETE CASCADE ON UPDATE CASCADE
666               ) ENGINE=InnoDB DEFAULT CHARSET=utf8");
667     $dbh->do("CREATE TABLE `matcher_matchpoints` (
668                 `matcher_id` int(11) NOT NULL,
669                 `matchpoint_id` int(11) NOT NULL,
670                 CONSTRAINT `matcher_matchpoints_ifbk_1` FOREIGN KEY (`matcher_id`)
671                            REFERENCES `marc_matchers` (`matcher_id`) ON DELETE CASCADE ON UPDATE CASCADE,
672                 CONSTRAINT `matcher_matchpoints_ifbk_2` FOREIGN KEY (`matchpoint_id`)
673                            REFERENCES `matchpoints` (`matchpoint_id`) ON DELETE CASCADE ON UPDATE CASCADE
674               ) ENGINE=InnoDB DEFAULT CHARSET=utf8");
675     $dbh->do("CREATE TABLE `matchchecks` (
676                 `matcher_id` int(11) NOT NULL,
677                 `matchcheck_id` int(11) NOT NULL auto_increment,
678                 `source_matchpoint_id` int(11) NOT NULL,
679                 `target_matchpoint_id` int(11) NOT NULL,
680                 PRIMARY KEY (`matchcheck_id`),
681                 CONSTRAINT `matcher_matchchecks_ifbk_1` FOREIGN KEY (`matcher_id`)
682                            REFERENCES `marc_matchers` (`matcher_id`) ON DELETE CASCADE ON UPDATE CASCADE,
683                 CONSTRAINT `matcher_matchchecks_ifbk_2` FOREIGN KEY (`source_matchpoint_id`)
684                            REFERENCES `matchpoints` (`matchpoint_id`) ON DELETE CASCADE ON UPDATE CASCADE,
685                 CONSTRAINT `matcher_matchchecks_ifbk_3` FOREIGN KEY (`target_matchpoint_id`)
686                            REFERENCES `matchpoints` (`matchpoint_id`) ON DELETE CASCADE ON UPDATE CASCADE
687               ) ENGINE=InnoDB DEFAULT CHARSET=utf8");
688     print "Upgrade to $DBversion done (added C4::Matcher serialization tables)\n ";
689     SetVersion ($DBversion);
690 }
691
692 $DBversion = "3.00.00.028";
693 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
694     $dbh->do("INSERT INTO `systempreferences` (variable,value,options,explanation,type)
695        VALUES ('canreservefromotherbranches','1','','With Independent branches on, can a user from one library reserve an item from another library','YesNo')");
696     print "Upgrade to $DBversion done (adding new system preference for changing reserve/holds behaviour with independent branches)\n";
697     SetVersion ($DBversion);
698 }
699
700
701 $DBversion = "3.00.00.029";
702 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
703     $dbh->do("ALTER TABLE `import_batches` ADD `matcher_id` int(11) NULL AFTER `import_batch_id`");
704     print "Upgrade to $DBversion done (adding matcher_id to import_batches)\n";
705     SetVersion ($DBversion);
706 }
707
708 $DBversion = "3.00.00.030";
709 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
710     $dbh->do("
711 CREATE TABLE services_throttle (
712   service_type varchar(10) NOT NULL default '',
713   service_count varchar(45) default NULL,
714   PRIMARY KEY  (service_type)
715 ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
716 ");
717     $dbh->do("INSERT INTO `systempreferences` (variable,value,options,explanation,type)
718        VALUES ('FRBRizeEditions',0,'','If ON, Koha will query one or more ISBN web services for associated ISBNs and display an Editions tab on the details pages','YesNo')");
719  $dbh->do("INSERT INTO `systempreferences` (variable,value,options,explanation,type)
720        VALUES ('XISBN',0,'','Use with FRBRizeEditions. If ON, Koha will use the OCLC xISBN web service in the Editions tab on the detail pages. See: http://www.worldcat.org/affiliate/webservices/xisbn/app.jsp','YesNo')");
721  $dbh->do("INSERT INTO `systempreferences` (variable,value,options,explanation,type)
722        VALUES ('OCLCAffiliateID','','','Use with FRBRizeEditions and XISBN. You can sign up for an AffiliateID here: http://www.worldcat.org/wcpa/do/AffiliateUserServices?method=initSelfRegister','free')");
723  $dbh->do("INSERT INTO `systempreferences` (variable,value,options,explanation,type)
724        VALUES ('XISBNDailyLimit',499,'','The xISBN Web service is free for non-commercial use when usage does not exceed 500 requests per day','free')");
725  $dbh->do("INSERT INTO `systempreferences` (variable,value,options,explanation,type)
726        VALUES ('PINESISBN',0,'','Use with FRBRizeEditions. If ON, Koha will use PINES OISBN web service in the Editions tab on the detail pages.','YesNo')");
727  $dbh->do("INSERT INTO `systempreferences` (variable,value,options,explanation,type)
728        VALUES ('ThingISBN',0,'','Use with FRBRizeEditions. If ON, Koha will use the ThingISBN web service in the Editions tab on the detail pages.','YesNo')");
729     print "Upgrade to $DBversion done (adding services throttle table and sysprefs for xISBN)\n";
730     SetVersion ($DBversion);
731 }
732
733 $DBversion = "3.00.00.031";
734 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
735
736 $dbh->do("INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES('QueryStemming',1,'If ON, enables query stemming',NULL,'YesNo')");
737 $dbh->do("INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES('QueryFuzzy',1,'If ON, enables fuzzy option for searches',NULL,'YesNo')");
738 $dbh->do("INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES('QueryWeightFields',1,'If ON, enables field weighting',NULL,'YesNo')");
739 $dbh->do("INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES('WebBasedSelfCheck',0,'If ON, enables the web-based self-check system',NULL,'YesNo')");
740 $dbh->do("INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES('numSearchResults',20,'Specify the maximum number of results to display on a page of results',NULL,'free')");
741 $dbh->do("INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES('OPACnumSearchResults',20,'Specify the maximum number of results to display on a page of results',NULL,'free')");
742 $dbh->do("INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES('maxItemsInSearchResults',20,'Specify the maximum number of items to display for each result on a page of results',NULL,'free')");
743 $dbh->do("INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES('defaultSortField',NULL,'Specify the default field used for sorting','relevance|popularity|call_number|pubdate|acqdate|title|author','Choice')");
744 $dbh->do("INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES('defaultSortOrder',NULL,'Specify the default sort order','asc|dsc|az|za','Choice')");
745 $dbh->do("INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES('OPACdefaultSortField',NULL,'Specify the default field used for sorting','relevance|popularity|call_number|pubdate|acqdate|title|author','Choice')");
746 $dbh->do("INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES('OPACdefaultSortOrder',NULL,'Specify the default sort order','asc|dsc|za|az','Choice')");
747 $dbh->do("INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES('staffClientBaseURL','','Specify the base URL of the staff client',NULL,'free')");
748 $dbh->do("INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES('minPasswordLength',3,'Specify the minimum length of a patron/staff password',NULL,'free')");
749 $dbh->do("INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES('noItemTypeImages',0,'If ON, disables item-type images',NULL,'YesNo')");
750 $dbh->do("INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES('emailLibrarianWhenHoldIsPlaced',0,'If ON, emails the librarian whenever a hold is placed',NULL,'YesNo')");
751 $dbh->do("INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES('holdCancelLength','','Specify how many days before a hold is canceled',NULL,'free')");
752 $dbh->do("INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES('libraryAddress','','The address to use for printing receipts, overdues, etc. if different than physical address',NULL,'free')");
753 $dbh->do("INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES('finesMode','test','Choose the fines mode, test or production','test|production','Choice')");
754 $dbh->do("INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES('globalDueDate','','If set, allows a global static due date for all checkouts',NULL,'free')");
755 $dbh->do("INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES('itemBarcodeInputFilter','','If set, allows specification of a item barcode input filter','cuecat','Choice')");
756 $dbh->do("INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES('singleBranchMode',0,'Operate in Single-branch mode, hide branch selection in the OPAC',NULL,'YesNo')");
757 $dbh->do("INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES('URLLinkText','','Text to display as the link anchor in the OPAC',NULL,'free')");
758 $dbh->do("INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES('OPACSubscriptionDisplay','economical','Specify how to display subscription information in the OPAC','economical|off|full','Choice')");
759 $dbh->do("INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES('OPACDisplayExtendedSubInfo',1,'If ON, extended subscription information is displayed in the OPAC',NULL,'YesNo')");
760 $dbh->do("INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES('OPACViewOthersSuggestions',0,'If ON, allows all suggestions to be displayed in the OPAC',NULL,'YesNo')");
761 $dbh->do("INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES('OPACURLOpenInNewWindow',0,'If ON, URLs in the OPAC open in a new window',NULL,'YesNo')");
762 $dbh->do("INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES('OPACUserCSS',0,'Add CSS to be included in the OPAC',NULL,'free')");
763
764     print "Upgrade to $DBversion done (adding additional system preference)\n";
765     SetVersion ($DBversion);
766 }
767
768 $DBversion = "3.00.00.032";
769 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
770     $dbh->do("UPDATE `marc_subfield_structure` SET `kohafield` = 'items.wthdrawn' WHERE `kohafield` = 'items.withdrawn'");
771     print "Upgrade to $DBversion done (fixed MARC framework references to items.withdrawn)\n";
772     SetVersion ($DBversion);
773 }
774
775 $DBversion = "3.00.00.033";
776 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
777     $dbh->do("INSERT INTO `userflags` VALUES(17,'staffaccess','Modify login / permissions for staff users',0)");
778     print "Upgrade to $DBversion done (Adding permissions flag for staff member access modification.  )\n";
779     SetVersion ($DBversion);
780 }
781
782 $DBversion = "3.00.00.034";
783 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
784     $dbh->do("ALTER TABLE `virtualshelves` ADD COLUMN `sortfield` VARCHAR(16) ");
785     print "Upgrade to $DBversion done (Adding sortfield for Virtual Shelves.  )\n";
786     SetVersion ($DBversion);
787 }
788
789 $DBversion = "3.00.00.035";
790 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
791     $dbh->do("UPDATE marc_subfield_structure
792               SET authorised_value = 'cn_source'
793               WHERE kohafield IN ('items.cn_source', 'biblioitems.cn_source')
794               AND (authorised_value is NULL OR authorised_value = '')");
795     print "Upgrade to $DBversion done (MARC frameworks: make classification source a drop-down)\n";
796     SetVersion ($DBversion);
797 }
798
799 $DBversion = "3.00.00.036";
800 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
801     $dbh->do("INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES('OPACItemsResultsDisplay','statuses','statuses : show only the status of items in result list. itemdisplay : show full location of items (branch+location+callnumber) as in staff interface','statuses|itemdetails','Choice');");
802     print "Upgrade to $DBversion done (OPACItemsResultsDisplay systempreference added)\n";
803     SetVersion ($DBversion);
804 }
805
806 $DBversion = "3.00.00.037";
807 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
808     $dbh->do("ALTER TABLE `borrowers` ADD COLUMN `altcontactfirstname` varchar(255)");
809     $dbh->do("ALTER TABLE `borrowers` ADD COLUMN `altcontactsurname` varchar(255)");
810     $dbh->do("ALTER TABLE `borrowers` ADD COLUMN `altcontactaddress1` varchar(255)");
811     $dbh->do("ALTER TABLE `borrowers` ADD COLUMN `altcontactaddress2` varchar(255)");
812     $dbh->do("ALTER TABLE `borrowers` ADD COLUMN `altcontactaddress3` varchar(255)");
813     $dbh->do("ALTER TABLE `borrowers` ADD COLUMN `altcontactzipcode` varchar(50)");
814     $dbh->do("ALTER TABLE `borrowers` ADD COLUMN `altcontactphone` varchar(50)");
815     print "Upgrade to $DBversion done (Adding Alternative Contact Person information to borrowers table)\n";
816     SetVersion ($DBversion);
817 }
818
819 $DBversion = "3.00.00.038";
820 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
821     $dbh->do("UPDATE `systempreferences` set explanation='Choose the fines mode, off, test (emails admin report) or production (accrue overdue fines).  Requires fines cron script' , options='off|test|production' where variable='finesMode'");
822     $dbh->do("DELETE FROM `systempreferences` WHERE variable='hideBiblioNumber'");
823     print "Upgrade to $DBversion done ('alter finesMode systempreference, remove superfluous syspref.')\n";
824     SetVersion ($DBversion);
825 }
826
827 $DBversion = "3.00.00.039";
828 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
829     $dbh->do("INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES('uppercasesurnames',0,'If ON, surnames are converted to upper case in patron entry form',NULL,'YesNo')");
830     $dbh->do("INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES('CircControl','ItemHomeLibrary','Specify the agency that controls the circulation and fines policy','PickupLibrary|PatronLibrary|ItemHomeLibrary','Choice')");
831     $dbh->do("INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES('finesCalendar','noFinesWhenClosed','Specify whether to use the Calendar in calculating duedates and fines','ignoreCalendar|noFinesWhenClosed','Choice')");
832     # $dbh->do("DELETE FROM `systempreferences` WHERE variable='HomeOrHoldingBranch'"); # Bug #2752
833     print "Upgrade to $DBversion done ('add circ sysprefs CircControl, finesCalendar, and uppercasesurnames, and delete HomeOrHoldingBranch.')\n";
834     SetVersion ($DBversion);
835 }
836
837 $DBversion = "3.00.00.040";
838 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
839         $dbh->do("INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES('previousIssuesDefaultSortOrder','asc','Specify the sort order of Previous Issues on the circulation page','asc|desc','Choice')");
840         $dbh->do("INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES('todaysIssuesDefaultSortOrder','desc','Specify the sort order of Todays Issues on the circulation page','asc|desc','Choice')");
841         print "Upgrade to $DBversion done ('add circ sysprefs todaysIssuesDefaultSortOrder and previousIssuesDefaultSortOrder.')\n";
842     SetVersion ($DBversion);
843 }
844
845
846 $DBversion = "3.00.00.041";
847 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
848     # Strictly speaking it is not necessary to explicitly change
849     # NULL values to 0, because the ALTER TABLE statement will do that.
850     # However, setting them first avoids a warning.
851     $dbh->do("UPDATE items SET notforloan = 0 WHERE notforloan IS NULL");
852     $dbh->do("UPDATE items SET damaged = 0 WHERE damaged IS NULL");
853     $dbh->do("UPDATE items SET itemlost = 0 WHERE itemlost IS NULL");
854     $dbh->do("UPDATE items SET wthdrawn = 0 WHERE wthdrawn IS NULL");
855     $dbh->do("ALTER TABLE items
856                 MODIFY notforloan tinyint(1) NOT NULL default 0,
857                 MODIFY damaged    tinyint(1) NOT NULL default 0,
858                 MODIFY itemlost   tinyint(1) NOT NULL default 0,
859                 MODIFY wthdrawn   tinyint(1) NOT NULL default 0");
860     $dbh->do("UPDATE deleteditems SET notforloan = 0 WHERE notforloan IS NULL");
861     $dbh->do("UPDATE deleteditems SET damaged = 0 WHERE damaged IS NULL");
862     $dbh->do("UPDATE deleteditems SET itemlost = 0 WHERE itemlost IS NULL");
863     $dbh->do("UPDATE deleteditems SET wthdrawn = 0 WHERE wthdrawn IS NULL");
864     $dbh->do("ALTER TABLE deleteditems
865                 MODIFY notforloan tinyint(1) NOT NULL default 0,
866                 MODIFY damaged    tinyint(1) NOT NULL default 0,
867                 MODIFY itemlost   tinyint(1) NOT NULL default 0,
868                 MODIFY wthdrawn   tinyint(1) NOT NULL default 0");
869         print "Upgrade to $DBversion done (disallow NULL in several item status columns)\n";
870     SetVersion ($DBversion);
871 }
872
873 $DBversion = "3.00.00.04";
874 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
875     $dbh->do("ALTER TABLE aqbooksellers CHANGE name name mediumtext NOT NULL");
876         print "Upgrade to $DBversion done (disallow NULL in aqbooksellers.name; part of fix for bug 1251)\n";
877     SetVersion ($DBversion);
878 }
879
880 $DBversion = "3.00.00.043";
881 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
882     $dbh->do("ALTER TABLE `currency` ADD `symbol` varchar(5) default NULL AFTER currency, ADD `timestamp` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP AFTER symbol");
883         print "Upgrade to $DBversion done (currency table: add symbol and timestamp columns)\n";
884     SetVersion ($DBversion);
885 }
886
887 $DBversion = "3.00.00.044";
888 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
889     $dbh->do("ALTER TABLE deletedborrowers
890   ADD `altcontactfirstname` varchar(255) default NULL,
891   ADD `altcontactsurname` varchar(255) default NULL,
892   ADD `altcontactaddress1` varchar(255) default NULL,
893   ADD `altcontactaddress2` varchar(255) default NULL,
894   ADD `altcontactaddress3` varchar(255) default NULL,
895   ADD `altcontactzipcode` varchar(50) default NULL,
896   ADD `altcontactphone` varchar(50) default NULL
897   ");
898   $dbh->do("INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES
899 ('OPACBaseURL',NULL,'Specify the Base URL of the OPAC, e.g., opac.mylibrary.com, the http:// will be added automatically by Koha.',NULL,'Free'),
900 ('language','en','Set the default language in the staff client.',NULL,'Languages'),
901 ('QueryAutoTruncate',1,'If ON, query truncation is enabled by default',NULL,'YesNo'),
902 ('QueryRemoveStopwords',0,'If ON, stopwords listed in the Administration area will be removed from queries',NULL,'YesNo')
903   ");
904         print "Upgrade to $DBversion done (syncing deletedborrowers table with borrowers table)\n";
905     SetVersion ($DBversion);
906 }
907
908 #-- http://www.w3.org/International/articles/language-tags/
909
910 #-- RFC4646
911 $DBversion = "3.00.00.045";
912 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
913     $dbh->do("
914 CREATE TABLE language_subtag_registry (
915         subtag varchar(25),
916         type varchar(25), -- language-script-region-variant-extension-privateuse
917         description varchar(25), -- only one of the possible descriptions for ease of reference, see language_descriptions for the complete list
918         added date,
919         KEY `subtag` (`subtag`)
920 ) ENGINE=InnoDB DEFAULT CHARSET=utf8");
921
922 #-- TODO: add suppress_scripts
923 #-- this maps three letter codes defined in iso639.2 back to their
924 #-- two letter equivilents in rfc4646 (LOC maintains iso639+)
925  $dbh->do("CREATE TABLE language_rfc4646_to_iso639 (
926         rfc4646_subtag varchar(25),
927         iso639_2_code varchar(25),
928         KEY `rfc4646_subtag` (`rfc4646_subtag`)
929 ) ENGINE=InnoDB DEFAULT CHARSET=utf8");
930
931  $dbh->do("CREATE TABLE language_descriptions (
932         subtag varchar(25),
933         type varchar(25),
934         lang varchar(25),
935         description varchar(255),
936         KEY `lang` (`lang`)
937 ) ENGINE=InnoDB DEFAULT CHARSET=utf8");
938
939 #-- bi-directional support, keyed by script subcode
940  $dbh->do("CREATE TABLE language_script_bidi (
941         rfc4646_subtag varchar(25), -- script subtag, Arab, Hebr, etc.
942         bidi varchar(3), -- rtl ltr
943         KEY `rfc4646_subtag` (`rfc4646_subtag`)
944 ) ENGINE=InnoDB DEFAULT CHARSET=utf8");
945
946 #-- BIDI Stuff, Arabic and Hebrew
947  $dbh->do("INSERT INTO language_script_bidi(rfc4646_subtag,bidi)
948 VALUES( 'Arab', 'rtl')");
949  $dbh->do("INSERT INTO language_script_bidi(rfc4646_subtag,bidi)
950 VALUES( 'Hebr', 'rtl')");
951
952 #-- TODO: need to map language subtags to script subtags for detection
953 #-- of bidi when script is not specified (like ar, he)
954  $dbh->do("CREATE TABLE language_script_mapping (
955         language_subtag varchar(25),
956         script_subtag varchar(25),
957         KEY `language_subtag` (`language_subtag`)
958 ) ENGINE=InnoDB DEFAULT CHARSET=utf8");
959
960 #-- Default mappings between script and language subcodes
961  $dbh->do("INSERT INTO language_script_mapping(language_subtag,script_subtag)
962 VALUES( 'ar', 'Arab')");
963  $dbh->do("INSERT INTO language_script_mapping(language_subtag,script_subtag)
964 VALUES( 'he', 'Hebr')");
965
966         print "Upgrade to $DBversion done (adding language subtag registry and basic BiDi support NOTE: You should import the subtag registry SQL)\n";
967     SetVersion ($DBversion);
968 }
969
970 $DBversion = "3.00.00.046";
971 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
972     $dbh->do("ALTER TABLE `subscription` CHANGE `numberlength` `numberlength` int(11) default '0' ,
973                  CHANGE `weeklength` `weeklength` int(11) default '0'");
974     $dbh->do("CREATE TABLE `serialitems` (`serialid` int(11) NOT NULL, `itemnumber` int(11) NOT NULL, UNIQUE KEY `serialididx` (`serialid`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8");
975     $dbh->do("INSERT INTO `serialitems` SELECT `serialid`,`itemnumber` from serial where NOT ISNULL(itemnumber) && itemnumber <> '' && itemnumber NOT LIKE '%,%'");
976         print "Upgrade to $DBversion done (Add serialitems table to link serial issues to items. )\n";
977     SetVersion ($DBversion);
978 }
979
980 $DBversion = "3.00.00.047";
981 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
982     $dbh->do("INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES('OpacRenewalAllowed',0,'If ON, users can renew their issues directly from their OPAC account',NULL,'YesNo');");
983         print "Upgrade to $DBversion done ( Added OpacRenewalAllowed syspref )\n";
984     SetVersion ($DBversion);
985 }
986
987 $DBversion = "3.00.00.048";
988 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
989     $dbh->do("ALTER TABLE `items` ADD `more_subfields_xml` longtext default NULL AFTER `itype`");
990         print "Upgrade to $DBversion done (added items.more_subfields_xml)\n";
991     SetVersion ($DBversion);
992 }
993
994 $DBversion = "3.00.00.049";
995 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
996         $dbh->do("ALTER TABLE `z3950servers` ADD `encoding` text default NULL AFTER type ");
997         print "Upgrade to $DBversion done ( Added encoding field to z3950servers table )\n";
998     SetVersion ($DBversion);
999 }
1000
1001 $DBversion = "3.00.00.050";
1002 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
1003     $dbh->do("INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES('OpacHighlightedWords','0','If Set, query matched terms are highlighted in OPAC',NULL,'YesNo');");
1004         print "Upgrade to $DBversion done ( Added OpacHighlightedWords syspref )\n";
1005     SetVersion ($DBversion);
1006 }
1007
1008 $DBversion = "3.00.00.051";
1009 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
1010     $dbh->do("UPDATE systempreferences SET explanation = 'Define the current theme for the OPAC interface.' WHERE variable = 'opacthemes';");
1011         print "Upgrade to $DBversion done ( Corrected opacthemes explanation. )\n";
1012     SetVersion ($DBversion);
1013 }
1014
1015 $DBversion = "3.00.00.052";
1016 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
1017     $dbh->do("ALTER TABLE `deleteditems` ADD `more_subfields_xml` LONGTEXT DEFAULT NULL AFTER `itype`");
1018         print "Upgrade to $DBversion done ( Adding missing column to deleteditems table. )\n";
1019     SetVersion ($DBversion);
1020 }
1021
1022 $DBversion = "3.00.00.053";
1023 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
1024     $dbh->do("CREATE TABLE `printers_profile` (
1025             `prof_id` int(4) NOT NULL auto_increment,
1026             `printername` varchar(40) NOT NULL,
1027             `tmpl_id` int(4) NOT NULL,
1028             `paper_bin` varchar(20) NOT NULL,
1029             `offset_horz` float default NULL,
1030             `offset_vert` float default NULL,
1031             `creep_horz` float default NULL,
1032             `creep_vert` float default NULL,
1033             `unit` char(20) NOT NULL default 'POINT',
1034             PRIMARY KEY  (`prof_id`),
1035             UNIQUE KEY `printername` (`printername`,`tmpl_id`,`paper_bin`),
1036             CONSTRAINT `printers_profile_pnfk_1` FOREIGN KEY (`tmpl_id`) REFERENCES `labels_templates` (`tmpl_id`) ON DELETE CASCADE ON UPDATE CASCADE
1037             ) ENGINE=InnoDB DEFAULT CHARSET=utf8 ");
1038     $dbh->do("CREATE TABLE `labels_profile` (
1039             `tmpl_id` int(4) NOT NULL,
1040             `prof_id` int(4) NOT NULL,
1041             UNIQUE KEY `tmpl_id` (`tmpl_id`),
1042             UNIQUE KEY `prof_id` (`prof_id`)
1043             ) ENGINE=InnoDB DEFAULT CHARSET=utf8 ");
1044     print "Upgrade to $DBversion done ( Printer Profile tables added )\n";
1045     SetVersion ($DBversion);
1046 }
1047
1048 $DBversion = "3.00.00.054";
1049 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
1050     $dbh->do("UPDATE systempreferences SET options = 'incremental|annual|hbyymmincr|OFF', explanation = 'Used to autogenerate a barcode: incremental will be of the form 1, 2, 3; annual of the form 2007-0001, 2007-0002; hbyymmincr of the form HB08010001 where HB = Home Branch' WHERE variable = 'autoBarcode';");
1051         print "Upgrade to $DBversion done ( Added another barcode autogeneration sequence to barcode.pl. )\n";
1052     SetVersion ($DBversion);
1053 }
1054
1055 $DBversion = "3.00.00.055";
1056 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
1057     $dbh->do("ALTER TABLE `zebraqueue` ADD KEY `zebraqueue_lookup` (`server`, `biblio_auth_number`, `operation`, `done`)");
1058         print "Upgrade to $DBversion done ( Added index on zebraqueue. )\n";
1059     SetVersion ($DBversion);
1060 }
1061 $DBversion = "3.00.00.056";
1062 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
1063     if (C4::Context->preference("marcflavour") eq 'UNIMARC') {
1064         $dbh->do("INSERT INTO `marc_subfield_structure` (`tagfield`, `tagsubfield`, `liblibrarian`, `libopac`, `repeatable`, `mandatory`, `kohafield`, `tab`, `authorised_value` , `authtypecode`, `value_builder`, `isurl`, `hidden`, `frameworkcode`, `seealso`, `link`, `defaultvalue`) VALUES ('995', 'v', 'Note sur le N° de périodique','Note sur le N° de périodique', 0, 0, 'items.enumchron', 10, '', '', '', 0, 0, '', '', '', NULL) ");
1065     } else {
1066         $dbh->do("INSERT INTO `marc_subfield_structure` (`tagfield`, `tagsubfield`, `liblibrarian`, `libopac`, `repeatable`, `mandatory`, `kohafield`, `tab`, `authorised_value` , `authtypecode`, `value_builder`, `isurl`, `hidden`, `frameworkcode`, `seealso`, `link`, `defaultvalue`) VALUES ('952', 'h', 'Serial Enumeration / chronology','Serial Enumeration / chronology', 0, 0, 'items.enumchron', 10, '', '', '', 0, 0, '', '', '', NULL) ");
1067     }
1068     $dbh->do("ALTER TABLE `items` ADD `enumchron` VARCHAR(80) DEFAULT NULL;");
1069     print "Upgrade to $DBversion done ( Added item.enumchron column, and framework map to 952h )\n";
1070     SetVersion ($DBversion);
1071 }
1072
1073 $DBversion = "3.00.00.057";
1074 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
1075     $dbh->do("INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES('OAI-PMH','0','if ON, OAI-PMH server is enabled',NULL,'YesNo');");
1076     $dbh->do("INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES('OAI-PMH:archiveID','KOHA-OAI-TEST','OAI-PMH archive identification',NULL,'Free');");
1077     $dbh->do("INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES('OAI-PMH:MaxCount','50','OAI-PMH maximum number of records by answer to ListRecords and ListIdentifiers queries',NULL,'Integer');");
1078     $dbh->do("INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES('OAI-PMH:Set','SET,Experimental set\r\nSET:SUBSET,Experimental subset','OAI-PMH exported set, the set name is followed by a comma and a short description, one set by line',NULL,'Free');");
1079     $dbh->do("INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES('OAI-PMH:Subset',\"itemtype='BOOK'\",'Restrict answer to matching raws of the biblioitems table (experimental)',NULL,'Free');");
1080     SetVersion ($DBversion);
1081 }
1082
1083 $DBversion = "3.00.00.058";
1084 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
1085     $dbh->do("ALTER TABLE `opac_news`
1086                 CHANGE `lang` `lang` VARCHAR( 25 )
1087                 CHARACTER SET utf8
1088                 COLLATE utf8_general_ci
1089                 NOT NULL default ''");
1090         print "Upgrade to $DBversion done ( lang field in opac_news made longer )\n";
1091     SetVersion ($DBversion);
1092 }
1093
1094 $DBversion = "3.00.00.059";
1095 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
1096
1097     $dbh->do("CREATE TABLE IF NOT EXISTS `labels_templates` (
1098             `tmpl_id` int(4) NOT NULL auto_increment,
1099             `tmpl_code` char(100)  default '',
1100             `tmpl_desc` char(100) default '',
1101             `page_width` float default '0',
1102             `page_height` float default '0',
1103             `label_width` float default '0',
1104             `label_height` float default '0',
1105             `topmargin` float default '0',
1106             `leftmargin` float default '0',
1107             `cols` int(2) default '0',
1108             `rows` int(2) default '0',
1109             `colgap` float default '0',
1110             `rowgap` float default '0',
1111             `active` int(1) default NULL,
1112             `units` char(20)  default 'PX',
1113             `fontsize` int(4) NOT NULL default '3',
1114             PRIMARY KEY  (`tmpl_id`)
1115             ) ENGINE=InnoDB DEFAULT CHARSET=utf8;");
1116     $dbh->do("CREATE TABLE  IF NOT EXISTS `printers_profile` (
1117             `prof_id` int(4) NOT NULL auto_increment,
1118             `printername` varchar(40) NOT NULL,
1119             `tmpl_id` int(4) NOT NULL,
1120             `paper_bin` varchar(20) NOT NULL,
1121             `offset_horz` float default NULL,
1122             `offset_vert` float default NULL,
1123             `creep_horz` float default NULL,
1124             `creep_vert` float default NULL,
1125             `unit` char(20) NOT NULL default 'POINT',
1126             PRIMARY KEY  (`prof_id`),
1127             UNIQUE KEY `printername` (`printername`,`tmpl_id`,`paper_bin`),
1128             CONSTRAINT `printers_profile_pnfk_1` FOREIGN KEY (`tmpl_id`) REFERENCES `labels_templates` (`tmpl_id`) ON DELETE CASCADE ON UPDATE CASCADE
1129             ) ENGINE=InnoDB DEFAULT CHARSET=utf8 ");
1130     print "Upgrade to $DBversion done ( Added labels_templates table if it did not exist. )\n";
1131     SetVersion ($DBversion);
1132 }
1133
1134 $DBversion = "3.00.00.060";
1135 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
1136     $dbh->do("CREATE TABLE IF NOT EXISTS `patronimage` (
1137             `cardnumber` varchar(16) NOT NULL,
1138             `mimetype` varchar(15) NOT NULL,
1139             `imagefile` mediumblob NOT NULL,
1140             PRIMARY KEY  (`cardnumber`),
1141             CONSTRAINT `patronimage_fk1` FOREIGN KEY (`cardnumber`) REFERENCES `borrowers` (`cardnumber`) ON DELETE CASCADE ON UPDATE CASCADE
1142             ) ENGINE=InnoDB DEFAULT CHARSET=utf8;");
1143         print "Upgrade to $DBversion done ( Added patronimage table. )\n";
1144     SetVersion ($DBversion);
1145 }
1146
1147 $DBversion = "3.00.00.061";
1148 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
1149     $dbh->do("ALTER TABLE labels_templates ADD COLUMN font char(10) NOT NULL DEFAULT 'TR';");
1150         print "Upgrade to $DBversion done ( Added font column to labels_templates )\n";
1151     SetVersion ($DBversion);
1152 }
1153
1154 $DBversion = "3.00.00.062";
1155 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
1156     $dbh->do("CREATE TABLE `old_issues` (
1157                 `borrowernumber` int(11) default NULL,
1158                 `itemnumber` int(11) default NULL,
1159                 `date_due` date default NULL,
1160                 `branchcode` varchar(10) default NULL,
1161                 `issuingbranch` varchar(18) default NULL,
1162                 `returndate` date default NULL,
1163                 `lastreneweddate` date default NULL,
1164                 `return` varchar(4) default NULL,
1165                 `renewals` tinyint(4) default NULL,
1166                 `timestamp` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
1167                 `issuedate` date default NULL,
1168                 KEY `old_issuesborridx` (`borrowernumber`),
1169                 KEY `old_issuesitemidx` (`itemnumber`),
1170                 KEY `old_bordate` (`borrowernumber`,`timestamp`),
1171                 CONSTRAINT `old_issues_ibfk_1` FOREIGN KEY (`borrowernumber`) REFERENCES `borrowers` (`borrowernumber`)
1172                     ON DELETE SET NULL ON UPDATE SET NULL,
1173                 CONSTRAINT `old_issues_ibfk_2` FOREIGN KEY (`itemnumber`) REFERENCES `items` (`itemnumber`)
1174                     ON DELETE SET NULL ON UPDATE SET NULL
1175                 ) ENGINE=InnoDB DEFAULT CHARSET=utf8");
1176     $dbh->do("CREATE TABLE `old_reserves` (
1177                 `borrowernumber` int(11) default NULL,
1178                 `reservedate` date default NULL,
1179                 `biblionumber` int(11) default NULL,
1180                 `constrainttype` varchar(1) default NULL,
1181                 `branchcode` varchar(10) default NULL,
1182                 `notificationdate` date default NULL,
1183                 `reminderdate` date default NULL,
1184                 `cancellationdate` date default NULL,
1185                 `reservenotes` mediumtext,
1186                 `priority` smallint(6) default NULL,
1187                 `found` varchar(1) default NULL,
1188                 `timestamp` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
1189                 `itemnumber` int(11) default NULL,
1190                 `waitingdate` date default NULL,
1191                 KEY `old_reserves_borrowernumber` (`borrowernumber`),
1192                 KEY `old_reserves_biblionumber` (`biblionumber`),
1193                 KEY `old_reserves_itemnumber` (`itemnumber`),
1194                 KEY `old_reserves_branchcode` (`branchcode`),
1195                 CONSTRAINT `old_reserves_ibfk_1` FOREIGN KEY (`borrowernumber`) REFERENCES `borrowers` (`borrowernumber`)
1196                     ON DELETE SET NULL ON UPDATE SET NULL,
1197                 CONSTRAINT `old_reserves_ibfk_2` FOREIGN KEY (`biblionumber`) REFERENCES `biblio` (`biblionumber`)
1198                     ON DELETE SET NULL ON UPDATE SET NULL,
1199                 CONSTRAINT `old_reserves_ibfk_3` FOREIGN KEY (`itemnumber`) REFERENCES `items` (`itemnumber`)
1200                     ON DELETE SET NULL ON UPDATE SET NULL
1201                 ) ENGINE=InnoDB DEFAULT CHARSET=utf8");
1202
1203     # move closed transactions to old_* tables
1204     $dbh->do("INSERT INTO old_issues SELECT * FROM issues WHERE returndate IS NOT NULL");
1205     $dbh->do("DELETE FROM issues WHERE returndate IS NOT NULL");
1206     $dbh->do("INSERT INTO old_reserves SELECT * FROM reserves WHERE cancellationdate IS NOT NULL OR found = 'F'");
1207     $dbh->do("DELETE FROM reserves WHERE cancellationdate IS NOT NULL OR found = 'F'");
1208
1209         print "Upgrade to $DBversion done ( Added old_issues and old_reserves tables )\n";
1210     SetVersion ($DBversion);
1211 }
1212
1213 $DBversion = "3.00.00.063";
1214 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
1215     $dbh->do("ALTER TABLE deleteditems
1216                 CHANGE COLUMN booksellerid booksellerid MEDIUMTEXT DEFAULT NULL,
1217                 ADD COLUMN enumchron VARCHAR(80) DEFAULT NULL AFTER more_subfields_xml,
1218                 ADD COLUMN copynumber SMALLINT(6) DEFAULT NULL AFTER enumchron;");
1219     $dbh->do("ALTER TABLE items
1220                 CHANGE COLUMN booksellerid booksellerid MEDIUMTEXT,
1221                 ADD COLUMN copynumber SMALLINT(6) DEFAULT NULL AFTER enumchron;");
1222         print "Upgrade to $DBversion done ( Changed items.booksellerid and deleteditems.booksellerid to MEDIUMTEXT and added missing items.copynumber and deleteditems.copynumber to fix Bug 1927)\n";
1223     SetVersion ($DBversion);
1224 }
1225
1226 $DBversion = "3.00.00.064";
1227 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
1228     $dbh->do("INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES('AmazonLocale','US','Use to set the Locale of your Amazon.com Web Services','US|CA|DE|FR|JP|UK','Choice');");
1229     $dbh->do("INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES('AWSAccessKeyID','','See:  http://aws.amazon.com','','free');");
1230     $dbh->do("DELETE FROM `systempreferences` WHERE variable='AmazonDevKey';");
1231     $dbh->do("DELETE FROM `systempreferences` WHERE variable='XISBNAmazonSimilarItems';");
1232     $dbh->do("DELETE FROM `systempreferences` WHERE variable='OPACXISBNAmazonSimilarItems';");
1233     print "Upgrade to $DBversion done (IMPORTANT: Upgrading to Amazon.com Associates Web Service 4.0 ) \n";
1234     SetVersion ($DBversion);
1235 }
1236
1237 $DBversion = "3.00.00.065";
1238 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
1239     $dbh->do("CREATE TABLE `patroncards` (
1240                 `cardid` int(11) NOT NULL auto_increment,
1241                 `batch_id` varchar(10) NOT NULL default '1',
1242                 `borrowernumber` int(11) NOT NULL,
1243                 `timestamp` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
1244                 PRIMARY KEY  (`cardid`),
1245                 KEY `patroncards_ibfk_1` (`borrowernumber`),
1246                 CONSTRAINT `patroncards_ibfk_1` FOREIGN KEY (`borrowernumber`) REFERENCES `borrowers` (`borrowernumber`) ON DELETE CASCADE ON UPDATE CASCADE
1247                 ) ENGINE=InnoDB DEFAULT CHARSET=utf8;");
1248     print "Upgrade to $DBversion done (Adding patroncards table for patroncards generation feature. ) \n";
1249     SetVersion ($DBversion);
1250 }
1251
1252 $DBversion = "3.00.00.066";
1253 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
1254     $dbh->do("ALTER TABLE `virtualshelfcontents` MODIFY `dateadded` timestamp NOT NULL
1255 DEFAULT CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP;
1256 ");
1257     print "Upgrade to $DBversion done (fix for bug 1873: virtualshelfcontents dateadded column empty. ) \n";
1258     SetVersion ($DBversion);
1259 }
1260
1261 $DBversion = "3.00.00.067";
1262 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
1263     $dbh->do("UPDATE systempreferences SET explanation = 'Enable patron images for the Staff Client', type = 'YesNo' WHERE variable = 'patronimages'");
1264     print "Upgrade to $DBversion done (Updating patronimages syspref to reflect current kohastructure.sql. ) \n";
1265     SetVersion ($DBversion);
1266 }
1267
1268 $DBversion = "3.00.00.068";
1269 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
1270     $dbh->do("CREATE TABLE `permissions` (
1271                 `module_bit` int(11) NOT NULL DEFAULT 0,
1272                 `code` varchar(30) DEFAULT NULL,
1273                 `description` varchar(255) DEFAULT NULL,
1274                 PRIMARY KEY  (`module_bit`, `code`),
1275                 CONSTRAINT `permissions_ibfk_1` FOREIGN KEY (`module_bit`) REFERENCES `userflags` (`bit`)
1276                     ON DELETE CASCADE ON UPDATE CASCADE
1277               ) ENGINE=InnoDB DEFAULT CHARSET=utf8");
1278     $dbh->do("CREATE TABLE `user_permissions` (
1279                 `borrowernumber` int(11) NOT NULL DEFAULT 0,
1280                 `module_bit` int(11) NOT NULL DEFAULT 0,
1281                 `code` varchar(30) DEFAULT NULL,
1282                 CONSTRAINT `user_permissions_ibfk_1` FOREIGN KEY (`borrowernumber`) REFERENCES `borrowers` (`borrowernumber`)
1283                     ON DELETE CASCADE ON UPDATE CASCADE,
1284                 CONSTRAINT `user_permissions_ibfk_2` FOREIGN KEY (`module_bit`, `code`)
1285                     REFERENCES `permissions` (`module_bit`, `code`)
1286                     ON DELETE CASCADE ON UPDATE CASCADE
1287               ) ENGINE=InnoDB DEFAULT CHARSET=utf8");
1288
1289     $dbh->do("INSERT INTO permissions (module_bit, code, description) VALUES
1290     (13, 'edit_news', 'Write news for the OPAC and staff interfaces'),
1291     (13, 'label_creator', 'Create printable labels and barcodes from catalog and patron data'),
1292     (13, 'edit_calendar', 'Define days when the library is closed'),
1293     (13, 'moderate_comments', 'Moderate patron comments'),
1294     (13, 'edit_notices', 'Define notices'),
1295     (13, 'edit_notice_status_triggers', 'Set notice/status triggers for overdue items'),
1296     (13, 'view_system_logs', 'Browse the system logs'),
1297     (13, 'inventory', 'Perform inventory (stocktaking) of your catalogue'),
1298     (13, 'stage_marc_import', 'Stage MARC records into the reservoir'),
1299     (13, 'manage_staged_marc', 'Managed staged MARC records, including completing and reversing imports'),
1300     (13, 'export_catalog', 'Export bibliographic and holdings data'),
1301     (13, 'import_patrons', 'Import patron data'),
1302     (13, 'delete_anonymize_patrons', 'Delete old borrowers and anonymize circulation history (deletes borrower reading history)'),
1303     (13, 'batch_upload_patron_images', 'Upload patron images in batch or one at a time'),
1304     (13, 'schedule_tasks', 'Schedule tasks to run')");
1305
1306     $dbh->do("INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES('GranularPermissions','0','Use detailed staff user permissions',NULL,'YesNo')");
1307
1308     print "Upgrade to $DBversion done (adding permissions and user_permissions tables and GranularPermissions syspref) \n";
1309     SetVersion ($DBversion);
1310 }
1311 $DBversion = "3.00.00.069";
1312 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
1313     $dbh->do("ALTER TABLE labels_conf CHANGE COLUMN class classification int(1) DEFAULT NULL;");
1314         print "Upgrade to $DBversion done ( Correcting columname in labels_conf )\n";
1315     SetVersion ($DBversion);
1316 }
1317
1318 $DBversion = "3.00.00.070";
1319 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
1320     $sth = $dbh->prepare("SELECT value FROM systempreferences WHERE variable='yuipath'");
1321     $sth->execute;
1322     my ($value) = $sth->fetchrow;
1323     $value =~ s/2.3.1/2.5.1/;
1324     $dbh->do("UPDATE systempreferences SET value='$value' WHERE variable='yuipath';");
1325         print "Update yuipath syspref to 2.5.1 if necessary\n";
1326     SetVersion ($DBversion);
1327 }
1328
1329 $DBversion = "3.00.00.071";
1330 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
1331     $dbh->do(" ALTER TABLE `subscription` ADD `serialsadditems` TINYINT( 1 ) NOT NULL DEFAULT '0';");
1332     # fill the new field with the previous systempreference value, then drop the syspref
1333     my $sth = $dbh->prepare("SELECT value FROM systempreferences WHERE variable='serialsadditems'");
1334     $sth->execute;
1335     my ($serialsadditems) = $sth->fetchrow();
1336     $dbh->do("UPDATE subscription SET serialsadditems=$serialsadditems");
1337     $dbh->do("DELETE FROM systempreferences WHERE variable='serialsadditems'");
1338     print "Upgrade to $DBversion done ( moving serialsadditems from syspref to subscription )\n";
1339     SetVersion ($DBversion);
1340 }
1341
1342 $DBversion = "3.00.00.072";
1343 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
1344     $dbh->do("ALTER TABLE labels_conf ADD COLUMN formatstring mediumtext DEFAULT NULL AFTER printingtype");
1345         print "Upgrade to $DBversion done ( Adding format string to labels generator. )\n";
1346     SetVersion ($DBversion);
1347 }
1348
1349 $DBversion = "3.00.00.073";
1350 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
1351         $dbh->do("DROP TABLE IF EXISTS `tags_all`;");
1352         $dbh->do(q#
1353         CREATE TABLE `tags_all` (
1354           `tag_id`         int(11) NOT NULL auto_increment,
1355           `borrowernumber` int(11) NOT NULL,
1356           `biblionumber`   int(11) NOT NULL,
1357           `term`      varchar(255) NOT NULL,
1358           `language`       int(4) default NULL,
1359           `date_created` datetime  NOT NULL,
1360           PRIMARY KEY  (`tag_id`),
1361           KEY `tags_borrowers_fk_1` (`borrowernumber`),
1362           KEY `tags_biblionumber_fk_1` (`biblionumber`),
1363           CONSTRAINT `tags_borrowers_fk_1` FOREIGN KEY (`borrowernumber`)
1364                 REFERENCES `borrowers` (`borrowernumber`) ON DELETE CASCADE ON UPDATE CASCADE,
1365           CONSTRAINT `tags_biblionumber_fk_1` FOREIGN KEY (`biblionumber`)
1366                 REFERENCES `biblio`     (`biblionumber`)  ON DELETE CASCADE ON UPDATE CASCADE
1367         ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
1368         #);
1369         $dbh->do("DROP TABLE IF EXISTS `tags_approval`;");
1370         $dbh->do(q#
1371         CREATE TABLE `tags_approval` (
1372           `term`   varchar(255) NOT NULL,
1373           `approved`     int(1) NOT NULL default '0',
1374           `date_approved` datetime       default NULL,
1375           `approved_by` int(11)          default NULL,
1376           `weight_total` int(9) NOT NULL default '1',
1377           PRIMARY KEY  (`term`),
1378           KEY `tags_approval_borrowers_fk_1` (`approved_by`),
1379           CONSTRAINT `tags_approval_borrowers_fk_1` FOREIGN KEY (`approved_by`)
1380                 REFERENCES `borrowers` (`borrowernumber`) ON DELETE CASCADE ON UPDATE CASCADE
1381         ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
1382         #);
1383         $dbh->do("DROP TABLE IF EXISTS `tags_index`;");
1384         $dbh->do(q#
1385         CREATE TABLE `tags_index` (
1386           `term`    varchar(255) NOT NULL,
1387           `biblionumber` int(11) NOT NULL,
1388           `weight`        int(9) NOT NULL default '1',
1389           PRIMARY KEY  (`term`,`biblionumber`),
1390           KEY `tags_index_biblionumber_fk_1` (`biblionumber`),
1391           CONSTRAINT `tags_index_term_fk_1` FOREIGN KEY (`term`)
1392                 REFERENCES `tags_approval` (`term`)  ON DELETE CASCADE ON UPDATE CASCADE,
1393           CONSTRAINT `tags_index_biblionumber_fk_1` FOREIGN KEY (`biblionumber`)
1394                 REFERENCES `biblio` (`biblionumber`) ON DELETE CASCADE ON UPDATE CASCADE
1395         ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
1396         #);
1397         $dbh->do(q#
1398         INSERT INTO `systempreferences` VALUES
1399                 ('BakerTaylorBookstoreURL','','','URL template for \"My Libary Bookstore\" links, to which the \"key\" value is appended, and \"https://\" is prepended.  It should include your hostname and \"Parent Number\".  Make this variable empty to turn MLB links off.  Example: ocls.mylibrarybookstore.com/MLB/actions/searchHandler.do?nextPage=bookDetails&parentNum=10923&key=',''),
1400                 ('BakerTaylorEnabled','0','','Enable or disable all Baker & Taylor features.','YesNo'),
1401                 ('BakerTaylorPassword','','','Baker & Taylor Password for Content Cafe (external content)','Textarea'),
1402                 ('BakerTaylorUsername','','','Baker & Taylor Username for Content Cafe (external content)','Textarea'),
1403                 ('TagsEnabled','1','','Enables or disables all tagging features.  This is the main switch for tags.','YesNo'),
1404                 ('TagsExternalDictionary',NULL,'','Path on server to local ispell executable, used to set $Lingua::Ispell::path  This dictionary is used as a \"whitelist\" of pre-allowed tags.',''),
1405                 ('TagsInputOnDetail','1','','Allow users to input tags from the detail page.',         'YesNo'),
1406                 ('TagsInputOnList',  '0','','Allow users to input tags from the search results list.', 'YesNo'),
1407                 ('TagsModeration',  NULL,'','Require tags from patrons to be approved before becoming visible.','YesNo'),
1408                 ('TagsShowOnDetail','10','','Number of tags to display on detail page.  0 is off.',        'Integer'),
1409                 ('TagsShowOnList',   '6','','Number of tags to display on search results list.  0 is off.','Integer')
1410         #);
1411         print "Upgrade to $DBversion done (Baker/Taylor,Tags: sysprefs and tables (tags_all, tags_index, tags_approval)) \n";
1412         SetVersion ($DBversion);
1413 }
1414
1415 $DBversion = "3.00.00.074";
1416 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
1417     $dbh->do( q(update itemtypes set imageurl = concat( 'npl/', imageurl )
1418                   where imageurl not like 'http%'
1419                     and imageurl is not NULL
1420                     and imageurl != '') );
1421     print "Upgrade to $DBversion done (updating imagetype.imageurls to reflect new icon locations.)\n";
1422     SetVersion ($DBversion);
1423 }
1424
1425 $DBversion = "3.00.00.075";
1426 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
1427     $dbh->do( q(alter table authorised_values add imageurl varchar(200) default NULL) );
1428     print "Upgrade to $DBversion done (adding imageurl field to authorised_values table)\n";
1429     SetVersion ($DBversion);
1430 }
1431
1432 $DBversion = "3.00.00.076";
1433 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
1434     $dbh->do("ALTER TABLE import_batches
1435               ADD COLUMN nomatch_action enum('create_new', 'ignore') NOT NULL default 'create_new' AFTER overlay_action");
1436     $dbh->do("ALTER TABLE import_batches
1437               ADD COLUMN item_action enum('always_add', 'add_only_for_matches', 'add_only_for_new', 'ignore')
1438                   NOT NULL default 'always_add' AFTER nomatch_action");
1439     $dbh->do("ALTER TABLE import_batches
1440               MODIFY overlay_action  enum('replace', 'create_new', 'use_template', 'ignore')
1441                   NOT NULL default 'create_new'");
1442     $dbh->do("ALTER TABLE import_records
1443               MODIFY status  enum('error', 'staged', 'imported', 'reverted', 'items_reverted',
1444                                   'ignored') NOT NULL default 'staged'");
1445     $dbh->do("ALTER TABLE import_items
1446               MODIFY status enum('error', 'staged', 'imported', 'reverted', 'ignored') NOT NULL default 'staged'");
1447
1448         print "Upgrade to $DBversion done (changes to import_batches and import_records)\n";
1449         SetVersion ($DBversion);
1450 }
1451
1452 $DBversion = "3.00.00.077";
1453 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
1454     # drop these tables only if they exist and none of them are empty
1455     # these tables are not defined in the packaged 2.2.9, but since it is believed
1456     # that at least one library may be using them in a post-2.2.9 but pre-3.0 Koha,
1457     # some care is taken.
1458     my ($print_error) = $dbh->{PrintError};
1459     $dbh->{PrintError} = 0;
1460     my ($raise_error) = $dbh->{RaiseError};
1461     $dbh->{RaiseError} = 1;
1462
1463     my $count = 0;
1464     my $do_drop = 1;
1465     eval { $count = $dbh->do("SELECT 1 FROM categorytable"); };
1466     if ($count > 0) {
1467         $do_drop = 0;
1468     }
1469     eval { $count = $dbh->do("SELECT 1 FROM mediatypetable"); };
1470     if ($count > 0) {
1471         $do_drop = 0;
1472     }
1473     eval { $count = $dbh->do("SELECT 1 FROM subcategorytable"); };
1474     if ($count > 0) {
1475         $do_drop = 0;
1476     }
1477
1478     if ($do_drop) {
1479         $dbh->do("DROP TABLE IF EXISTS `categorytable`");
1480         $dbh->do("DROP TABLE IF EXISTS `mediatypetable`");
1481         $dbh->do("DROP TABLE IF EXISTS `subcategorytable`");
1482     }
1483
1484     $dbh->{PrintError} = $print_error;
1485     $dbh->{RaiseError} = $raise_error;
1486         print "Upgrade to $DBversion done (drop categorytable, subcategorytable, and mediatypetable)\n";
1487         SetVersion ($DBversion);
1488 }
1489
1490 $DBversion = "3.00.00.078";
1491 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
1492     my ($print_error) = $dbh->{PrintError};
1493     $dbh->{PrintError} = 0;
1494
1495     unless ($dbh->do("SELECT 1 FROM browser")) {
1496         $dbh->{PrintError} = $print_error;
1497         $dbh->do("CREATE TABLE `browser` (
1498                     `level` int(11) NOT NULL,
1499                     `classification` varchar(20) NOT NULL,
1500                     `description` varchar(255) NOT NULL,
1501                     `number` bigint(20) NOT NULL,
1502                     `endnode` tinyint(4) NOT NULL
1503                   ) ENGINE=InnoDB DEFAULT CHARSET=utf8");
1504     }
1505     $dbh->{PrintError} = $print_error;
1506         print "Upgrade to $DBversion done (add browser table if not already present)\n";
1507         SetVersion ($DBversion);
1508 }
1509
1510 $DBversion = "3.00.00.079";
1511 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
1512  my ($print_error) = $dbh->{PrintError};
1513     $dbh->{PrintError} = 0;
1514
1515     $dbh->do("INSERT INTO `systempreferences` (variable, value,options,type, explanation)VALUES
1516         ('AddPatronLists','categorycode','categorycode|category_type','Choice','Allow user to choose what list to pick up from when adding patrons')");
1517     print "Upgrade to $DBversion done (add browser table if not already present)\n";
1518         SetVersion ($DBversion);
1519 }
1520
1521 $DBversion = "3.00.00.080";
1522 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
1523     $dbh->do("ALTER TABLE subscription CHANGE monthlength monthlength int(11) default '0'");
1524     $dbh->do("ALTER TABLE deleteditems MODIFY marc LONGBLOB AFTER copynumber");
1525     $dbh->do("ALTER TABLE aqbooksellers CHANGE name name mediumtext NOT NULL");
1526         print "Upgrade to $DBversion done (catch up on DB schema changes since alpha and beta)\n";
1527         SetVersion ($DBversion);
1528 }
1529
1530 $DBversion = "3.00.00.081";
1531 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
1532     $dbh->do("CREATE TABLE `borrower_attribute_types` (
1533                 `code` varchar(10) NOT NULL,
1534                 `description` varchar(255) NOT NULL,
1535                 `repeatable` tinyint(1) NOT NULL default 0,
1536                 `unique_id` tinyint(1) NOT NULL default 0,
1537                 `opac_display` tinyint(1) NOT NULL default 0,
1538                 `password_allowed` tinyint(1) NOT NULL default 0,
1539                 `staff_searchable` tinyint(1) NOT NULL default 0,
1540                 `authorised_value_category` varchar(10) default NULL,
1541                 PRIMARY KEY  (`code`)
1542               ) ENGINE=InnoDB DEFAULT CHARSET=utf8");
1543     $dbh->do("CREATE TABLE `borrower_attributes` (
1544                 `borrowernumber` int(11) NOT NULL,
1545                 `code` varchar(10) NOT NULL,
1546                 `attribute` varchar(30) default NULL,
1547                 `password` varchar(30) default NULL,
1548                 KEY `borrowernumber` (`borrowernumber`),
1549                 KEY `code_attribute` (`code`, `attribute`),
1550                 CONSTRAINT `borrower_attributes_ibfk_1` FOREIGN KEY (`borrowernumber`) REFERENCES `borrowers` (`borrowernumber`)
1551                     ON DELETE CASCADE ON UPDATE CASCADE,
1552                 CONSTRAINT `borrower_attributes_ibfk_2` FOREIGN KEY (`code`) REFERENCES `borrower_attribute_types` (`code`)
1553                     ON DELETE CASCADE ON UPDATE CASCADE
1554             ) ENGINE=InnoDB DEFAULT CHARSET=utf8");
1555     $dbh->do("INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES('ExtendedPatronAttributes','0','Use extended patron IDs and attributes',NULL,'YesNo')");
1556     print "Upgrade to $DBversion done (added borrower_attributes and  borrower_attribute_types)\n";
1557  SetVersion ($DBversion);
1558 }
1559
1560 $DBversion = "3.00.00.082";
1561 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
1562     $dbh->do( q(alter table accountlines add column lastincrement decimal(28,6) default NULL) );
1563     print "Upgrade to $DBversion done (adding lastincrement column to accountlines table)\n";
1564     SetVersion ($DBversion);
1565 }
1566
1567 $DBversion = "3.00.00.083";
1568 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
1569     $dbh->do( qq(UPDATE systempreferences SET value='local' where variable='yuipath' and value like "%/intranet-tmpl/prog/%"));
1570     print "Upgrade to $DBversion done (Changing yuipath behaviour in managing a local value)\n";
1571     SetVersion ($DBversion);
1572 }
1573 $DBversion = "3.00.00.084";
1574     if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
1575     $dbh->do("INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES('RenewSerialAddsSuggestion','0','if ON, adds a new suggestion at serial subscription renewal',NULL,'YesNo')");
1576     $dbh->do("INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES('GoogleJackets','0','if ON, displays jacket covers from Google Books API',NULL,'YesNo')");
1577     print "Upgrade to $DBversion done (add new sysprefs)\n";
1578     SetVersion ($DBversion);
1579 }
1580
1581 $DBversion = "3.00.00.085";
1582 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
1583     if (C4::Context->preference("marcflavour") eq 'MARC21') {
1584         $dbh->do("UPDATE marc_subfield_structure SET tab = 0 WHERE tab =  9 AND tagfield = '037'");
1585         $dbh->do("UPDATE marc_subfield_structure SET tab = 1 WHERE tab =  6 AND tagfield in ('100', '110', '111', '130')");
1586         $dbh->do("UPDATE marc_subfield_structure SET tab = 2 WHERE tab =  6 AND tagfield in ('240', '243')");
1587         $dbh->do("UPDATE marc_subfield_structure SET tab = 4 WHERE tab =  6 AND tagfield in ('400', '410', '411', '440')");
1588         $dbh->do("UPDATE marc_subfield_structure SET tab = 5 WHERE tab =  9 AND tagfield = '584'");
1589         $dbh->do("UPDATE marc_subfield_structure SET tab = 7 WHERE tab = -6 AND tagfield = '760'");
1590     }
1591     print "Upgrade to $DBversion done (move editing tab of various MARC21 subfields)\n";
1592     SetVersion ($DBversion);
1593 }
1594
1595 $DBversion = "3.00.00.086";
1596 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
1597         $dbh->do(
1598         "CREATE TABLE `tmp_holdsqueue` (
1599         `biblionumber` int(11) default NULL,
1600         `itemnumber` int(11) default NULL,
1601         `barcode` varchar(20) default NULL,
1602         `surname` mediumtext NOT NULL,
1603         `firstname` text,
1604         `phone` text,
1605         `borrowernumber` int(11) NOT NULL,
1606         `cardnumber` varchar(16) default NULL,
1607         `reservedate` date default NULL,
1608         `title` mediumtext,
1609         `itemcallnumber` varchar(30) default NULL,
1610         `holdingbranch` varchar(10) default NULL,
1611         `pickbranch` varchar(10) default NULL,
1612         `notes` text
1613         ) ENGINE=InnoDB DEFAULT CHARSET=utf8");
1614
1615         $dbh->do("INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES('RandomizeHoldsQueueWeight','0','if ON, the holds queue in circulation will be randomized, either based on all location codes, or by the location codes specified in StaticHoldsQueueWeight',NULL,'YesNo')");
1616         $dbh->do("INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES('StaticHoldsQueueWeight','0','Specify a list of library location codes separated by commas -- the list of codes will be traversed and weighted with first values given higher weight for holds fulfillment -- alternatively, if RandomizeHoldsQueueWeight is set, the list will be randomly selective',NULL,'TextArea')");
1617
1618         print "Upgrade to $DBversion done (Table structure for table `tmp_holdsqueue`)\n";
1619         SetVersion ($DBversion);
1620 }
1621
1622 $DBversion = "3.00.00.087";
1623 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
1624     $dbh->do("INSERT INTO `systempreferences` VALUES ('AutoEmailOpacUser','0','','Sends notification emails containing new account details to patrons - when account is created.','YesNo')" );
1625     $dbh->do("INSERT INTO `systempreferences` VALUES ('AutoEmailPrimaryAddress','OFF','email|emailpro|B_email|cardnumber|OFF','Defines the default email address where Account Details emails are sent.','Choice')");
1626     print "Upgrade to $DBversion done (added 2 new 'AutoEmailOpacUser' sysprefs)\n";
1627     SetVersion ($DBversion);
1628 }
1629
1630 $DBversion = "3.00.00.088";
1631 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
1632         $dbh->do("INSERT INTO `systempreferences` (variable,value,options,explanation,type) VALUES ('OPACShelfBrowser','1','','Enable/disable Shelf Browser on item details page','YesNo')");
1633         $dbh->do("INSERT INTO `systempreferences` (variable,value,options,explanation,type) VALUES ('OPACItemHolds','1','Allow OPAC users to place hold on specific items. If OFF, users can only request next available copy.','','YesNo')");
1634         $dbh->do("INSERT INTO `systempreferences` (variable,value,options,explanation,type) VALUES ('XSLTDetailsDisplay','0','','Enable XSL stylesheet control over details page display on OPAC WARNING: MARC21 Only','YesNo')");
1635         $dbh->do("INSERT INTO `systempreferences` (variable,value,options,explanation,type) VALUES ('XSLTResultsDisplay','0','','Enable XSL stylesheet control over results page display on OPAC WARNING: MARC21 Only','YesNo')");
1636         print "Upgrade to $DBversion done (added 2 new 'AutoEmailOpacUser' sysprefs)\n";
1637     SetVersion ($DBversion);
1638 }
1639
1640 $DBversion = "3.00.00.089";
1641 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
1642         $dbh->do("INSERT INTO `systempreferences` (variable,value,options,explanation,type) VALUES('AdvancedSearchTypes','itemtypes','itemtypes|ccode','Select which set of fields comprise the Type limit in the advanced search','Choice')");
1643         print "Upgrade to $DBversion done (added new AdvancedSearchTypes syspref)\n";
1644     SetVersion ($DBversion);
1645 }
1646
1647 $DBversion = "3.00.00.090";
1648 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
1649     $dbh->do("
1650         CREATE TABLE `branch_borrower_circ_rules` (
1651           `branchcode` VARCHAR(10) NOT NULL,
1652           `categorycode` VARCHAR(10) NOT NULL,
1653           `maxissueqty` int(4) default NULL,
1654           PRIMARY KEY (`categorycode`, `branchcode`),
1655           CONSTRAINT `branch_borrower_circ_rules_ibfk_1` FOREIGN KEY (`categorycode`) REFERENCES `categories` (`categorycode`)
1656             ON DELETE CASCADE ON UPDATE CASCADE,
1657           CONSTRAINT `branch_borrower_circ_rules_ibfk_2` FOREIGN KEY (`branchcode`) REFERENCES `branches` (`branchcode`)
1658             ON DELETE CASCADE ON UPDATE CASCADE
1659         ) ENGINE=InnoDB DEFAULT CHARSET=utf8
1660     ");
1661     $dbh->do("
1662         CREATE TABLE `default_borrower_circ_rules` (
1663           `categorycode` VARCHAR(10) NOT NULL,
1664           `maxissueqty` int(4) default NULL,
1665           PRIMARY KEY (`categorycode`),
1666           CONSTRAINT `borrower_borrower_circ_rules_ibfk_1` FOREIGN KEY (`categorycode`) REFERENCES `categories` (`categorycode`)
1667             ON DELETE CASCADE ON UPDATE CASCADE
1668         ) ENGINE=InnoDB DEFAULT CHARSET=utf8
1669     ");
1670     $dbh->do("
1671         CREATE TABLE `default_branch_circ_rules` (
1672           `branchcode` VARCHAR(10) NOT NULL,
1673           `maxissueqty` int(4) default NULL,
1674           PRIMARY KEY (`branchcode`),
1675           CONSTRAINT `default_branch_circ_rules_ibfk_1` FOREIGN KEY (`branchcode`) REFERENCES `branches` (`branchcode`)
1676             ON DELETE CASCADE ON UPDATE CASCADE
1677         ) ENGINE=InnoDB DEFAULT CHARSET=utf8
1678     ");
1679     $dbh->do("
1680         CREATE TABLE `default_circ_rules` (
1681             `singleton` enum('singleton') NOT NULL default 'singleton',
1682             `maxissueqty` int(4) default NULL,
1683             PRIMARY KEY (`singleton`)
1684         ) ENGINE=InnoDB DEFAULT CHARSET=utf8
1685     ");
1686     print "Upgrade to $DBversion done (added several circ rules tables)\n";
1687     SetVersion ($DBversion);
1688 }
1689
1690
1691 $DBversion = "3.00.00.091";
1692 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
1693     $dbh->do(<<'END_SQL');
1694 ALTER TABLE borrowers
1695 ADD `smsalertnumber` varchar(50) default NULL
1696 END_SQL
1697
1698     $dbh->do(<<'END_SQL');
1699 CREATE TABLE `message_attributes` (
1700   `message_attribute_id` int(11) NOT NULL auto_increment,
1701   `message_name` varchar(20) NOT NULL default '',
1702   `takes_days` tinyint(1) NOT NULL default '0',
1703   PRIMARY KEY  (`message_attribute_id`),
1704   UNIQUE KEY `message_name` (`message_name`)
1705 ) ENGINE=InnoDB DEFAULT CHARSET=utf8
1706 END_SQL
1707
1708     $dbh->do(<<'END_SQL');
1709 CREATE TABLE `message_transport_types` (
1710   `message_transport_type` varchar(20) NOT NULL,
1711   PRIMARY KEY  (`message_transport_type`)
1712 ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
1713 END_SQL
1714
1715     $dbh->do(<<'END_SQL');
1716 CREATE TABLE `message_transports` (
1717   `message_attribute_id` int(11) NOT NULL,
1718   `message_transport_type` varchar(20) NOT NULL,
1719   `is_digest` tinyint(1) NOT NULL default '0',
1720   `letter_module` varchar(20) NOT NULL default '',
1721   `letter_code` varchar(20) NOT NULL default '',
1722   PRIMARY KEY  (`message_attribute_id`,`message_transport_type`,`is_digest`),
1723   KEY `message_transport_type` (`message_transport_type`),
1724   KEY `letter_module` (`letter_module`,`letter_code`),
1725   CONSTRAINT `message_transports_ibfk_1` FOREIGN KEY (`message_attribute_id`) REFERENCES `message_attributes` (`message_attribute_id`) ON DELETE CASCADE ON UPDATE CASCADE,
1726   CONSTRAINT `message_transports_ibfk_2` FOREIGN KEY (`message_transport_type`) REFERENCES `message_transport_types` (`message_transport_type`) ON DELETE CASCADE ON UPDATE CASCADE,
1727   CONSTRAINT `message_transports_ibfk_3` FOREIGN KEY (`letter_module`, `letter_code`) REFERENCES `letter` (`module`, `code`) ON DELETE CASCADE ON UPDATE CASCADE
1728 ) ENGINE=InnoDB DEFAULT CHARSET=utf8
1729 END_SQL
1730
1731     $dbh->do(<<'END_SQL');
1732 CREATE TABLE `borrower_message_preferences` (
1733   `borrower_message_preference_id` int(11) NOT NULL auto_increment,
1734   `borrowernumber` int(11) NOT NULL default '0',
1735   `message_attribute_id` int(11) default '0',
1736   `days_in_advance` int(11) default '0',
1737   `wants_digets` tinyint(1) NOT NULL default '0',
1738   PRIMARY KEY  (`borrower_message_preference_id`),
1739   KEY `borrowernumber` (`borrowernumber`),
1740   KEY `message_attribute_id` (`message_attribute_id`),
1741   CONSTRAINT `borrower_message_preferences_ibfk_1` FOREIGN KEY (`borrowernumber`) REFERENCES `borrowers` (`borrowernumber`) ON DELETE CASCADE ON UPDATE CASCADE,
1742   CONSTRAINT `borrower_message_preferences_ibfk_2` FOREIGN KEY (`message_attribute_id`) REFERENCES `message_attributes` (`message_attribute_id`) ON DELETE CASCADE ON UPDATE CASCADE
1743 ) ENGINE=InnoDB DEFAULT CHARSET=utf8
1744 END_SQL
1745
1746     $dbh->do(<<'END_SQL');
1747 CREATE TABLE `borrower_message_transport_preferences` (
1748   `borrower_message_preference_id` int(11) NOT NULL default '0',
1749   `message_transport_type` varchar(20) NOT NULL default '0',
1750   PRIMARY KEY  (`borrower_message_preference_id`,`message_transport_type`),
1751   KEY `message_transport_type` (`message_transport_type`),
1752   CONSTRAINT `borrower_message_transport_preferences_ibfk_1` FOREIGN KEY (`borrower_message_preference_id`) REFERENCES `borrower_message_preferences` (`borrower_message_preference_id`) ON DELETE CASCADE ON UPDATE CASCADE,
1753   CONSTRAINT `borrower_message_transport_preferences_ibfk_2` FOREIGN KEY (`message_transport_type`) REFERENCES `message_transport_types` (`message_transport_type`) ON DELETE CASCADE ON UPDATE CASCADE
1754 ) ENGINE=InnoDB DEFAULT CHARSET=utf8
1755 END_SQL
1756
1757     $dbh->do(<<'END_SQL');
1758 CREATE TABLE `message_queue` (
1759   `message_id` int(11) NOT NULL auto_increment,
1760   `borrowernumber` int(11) NOT NULL,
1761   `subject` text,
1762   `content` text,
1763   `message_transport_type` varchar(20) NOT NULL,
1764   `status` enum('sent','pending','failed','deleted') NOT NULL default 'pending',
1765   `time_queued` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
1766   KEY `message_id` (`message_id`),
1767   KEY `borrowernumber` (`borrowernumber`),
1768   KEY `message_transport_type` (`message_transport_type`),
1769   CONSTRAINT `messageq_ibfk_1` FOREIGN KEY (`borrowernumber`) REFERENCES `borrowers` (`borrowernumber`) ON DELETE CASCADE ON UPDATE CASCADE,
1770   CONSTRAINT `messageq_ibfk_2` FOREIGN KEY (`message_transport_type`) REFERENCES `message_transport_types` (`message_transport_type`) ON DELETE RESTRICT ON UPDATE CASCADE
1771 ) ENGINE=InnoDB DEFAULT CHARSET=utf8
1772 END_SQL
1773
1774     $dbh->do(<<'END_SQL');
1775 INSERT INTO `systempreferences`
1776   (variable,value,explanation,options,type)
1777 VALUES
1778 ('EnhancedMessagingPreferences',0,'If ON, allows patrons to select to receive additional messages about items due or nearly due.','','YesNo')
1779 END_SQL
1780
1781     $dbh->do( <<'END_SQL');
1782 INSERT INTO `letter`
1783 (module, code, name, title, content)
1784 VALUES
1785 ('circulation','DUE','Item Due Reminder','Item Due Reminder','Dear <<borrowers.firstname>> <<borrowers.surname>>,\r\n\r\nThe following item is now due:\r\n\r\n<<biblio.title>> by <<biblio.author>>'),
1786 ('circulation','DUEDGST','Item Due Reminder (Digest)','Item Due Reminder','You have <<count>> items due'),
1787 ('circulation','PREDUE','Advance Notice of Item Due','Advance Notice of Item Due','Dear <<borrowers.firstname>> <<borrowers.surname>>,\r\n\r\nThe following item will be due soon:\r\n\r\n<<biblio.title>> by <<biblio.author>>'),
1788 ('circulation','PREDUEDGST','Advance Notice of Item Due (Digest)','Advance Notice of Item Due','You have <<count>> items due soon'),
1789 ('circulation','EVENT','Upcoming Library Event','Upcoming Library Event','Dear <<borrowers.firstname>> <<borrowers.surname>>,\r\n\r\nThis is a reminder of an upcoming library event in which you have expressed interest.');
1790 END_SQL
1791
1792     my @sql_scripts = (
1793         'installer/data/mysql/en/mandatory/message_transport_types.sql',
1794         'installer/data/mysql/en/optional/sample_notices_message_attributes.sql',
1795         'installer/data/mysql/en/optional/sample_notices_message_transports.sql',
1796     );
1797
1798     my $installer = C4::Installer->new();
1799     foreach my $script ( @sql_scripts ) {
1800         my $full_path = $installer->get_file_path_from_name($script);
1801         my $error = $installer->load_sql($full_path);
1802         warn $error if $error;
1803     }
1804
1805     print "Upgrade to $DBversion done (Table structure for table `message_queue`, `message_transport_types`, `message_attributes`, `message_transports`, `borrower_message_preferences`, and `borrower_message_transport_preferences`.  Alter `borrowers` table,\n";
1806     SetVersion ($DBversion);
1807 }
1808
1809 $DBversion = "3.00.00.092";
1810 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
1811     $dbh->do("INSERT INTO `systempreferences` (variable,value,options,explanation,type) VALUES('AllowOnShelfHolds', '0', '', 'Allow hold requests to be placed on items that are not on loan', 'YesNo')");
1812     $dbh->do("INSERT INTO `systempreferences` (variable,value,options,explanation,type) VALUES('AllowHoldsOnDamagedItems', '1', '', 'Allow hold requests to be placed on damaged items', 'YesNo')");
1813         print "Upgrade to $DBversion done (added new AllowOnShelfHolds syspref)\n";
1814     SetVersion ($DBversion);
1815 }
1816
1817 $DBversion = "3.00.00.093";
1818 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
1819     $dbh->do("ALTER TABLE `items` MODIFY COLUMN `copynumber` VARCHAR(32) DEFAULT NULL");
1820     $dbh->do("ALTER TABLE `deleteditems` MODIFY COLUMN `copynumber` VARCHAR(32) DEFAULT NULL");
1821         print "Upgrade to $DBversion done (Change data type of items.copynumber to allow free text)\n";
1822     SetVersion ($DBversion);
1823 }
1824
1825 $DBversion = "3.00.00.094";
1826 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
1827     $dbh->do("ALTER TABLE `marc_subfield_structure` MODIFY `tagsubfield` VARCHAR(1) NOT NULL DEFAULT '' COLLATE utf8_bin");
1828         print "Upgrade to $DBversion done (Change Collation of marc_subfield_structure to allow mixed case in subfield labels.)\n";
1829     SetVersion ($DBversion);
1830 }
1831
1832 $DBversion = "3.00.00.095";
1833 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
1834     if (C4::Context->preference("marcflavour") eq 'MARC21') {
1835         $dbh->do("UPDATE marc_subfield_structure SET authtypecode = 'MEETI_NAME' WHERE authtypecode = 'Meeting Name'");
1836         $dbh->do("UPDATE marc_subfield_structure SET authtypecode = 'CORPO_NAME' WHERE authtypecode = 'CORP0_NAME'");
1837     }
1838         print "Upgrade to $DBversion done (fix invalid authority types in MARC21 frameworks [bug 2254])\n";
1839     SetVersion ($DBversion);
1840 }
1841
1842 $DBversion = "3.00.00.096";
1843 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
1844     $sth = $dbh->prepare("SHOW COLUMNS FROM borrower_message_preferences LIKE 'wants_digets'");
1845     $sth->execute();
1846     if (my $row = $sth->fetchrow_hashref) {
1847         $dbh->do("ALTER TABLE borrower_message_preferences CHANGE wants_digets wants_digest tinyint(1) NOT NULL default 0");
1848     }
1849         print "Upgrade to $DBversion done (fix name borrower_message_preferences.wants_digest)\n";
1850     SetVersion ($DBversion);
1851 }
1852
1853 $DBversion = '3.00.00.097';
1854 if ( C4::Context->preference('Version') < TransformToNum($DBversion) ) {
1855
1856     $dbh->do('ALTER TABLE message_queue ADD to_address   mediumtext default NULL');
1857     $dbh->do('ALTER TABLE message_queue ADD from_address mediumtext default NULL');
1858     $dbh->do('ALTER TABLE message_queue ADD content_type text');
1859     $dbh->do('ALTER TABLE message_queue CHANGE borrowernumber borrowernumber int(11) default NULL');
1860
1861     print "Upgrade to $DBversion done (updating 4 fields in message_queue table)\n";
1862     SetVersion($DBversion);
1863 }
1864
1865 $DBversion = '3.00.00.098';
1866 if ( C4::Context->preference('Version') < TransformToNum($DBversion) ) {
1867
1868     $dbh->do(q(DELETE FROM message_transport_types WHERE message_transport_type = 'rss'));
1869     $dbh->do(q(DELETE FROM message_transports WHERE message_transport_type = 'rss'));
1870
1871     print "Upgrade to $DBversion done (removing unused RSS message_transport_type)\n";
1872     SetVersion($DBversion);
1873 }
1874
1875 $DBversion = '3.00.00.099';
1876 if ( C4::Context->preference('Version') < TransformToNum($DBversion) ) {
1877     $dbh->do("INSERT INTO systempreferences (variable,value,options,explanation,type) VALUES('OpacSuppression', '0', '', 'Turn ON the OPAC Suppression feature, requires further setup, ask your system administrator for details', 'YesNo')");
1878     print "Upgrade to $DBversion done (Adding OpacSuppression syspref)\n";
1879     SetVersion($DBversion);
1880 }
1881
1882 $DBversion = '3.00.00.100';
1883 if ( C4::Context->preference('Version') < TransformToNum($DBversion) ) {
1884         $dbh->do('ALTER TABLE virtualshelves ADD COLUMN lastmodified timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP');
1885     print "Upgrade to $DBversion done (Adding lastmodified column to virtualshelves)\n";
1886     SetVersion($DBversion);
1887 }
1888
1889 $DBversion = '3.00.00.101';
1890 if ( C4::Context->preference('Version') < TransformToNum($DBversion) ) {
1891         $dbh->do('ALTER TABLE `overduerules` CHANGE `categorycode` `categorycode` VARCHAR(10) NOT NULL');
1892         $dbh->do('ALTER TABLE `deletedborrowers` CHANGE `categorycode` `categorycode` VARCHAR(10) NOT NULL');
1893     print "Upgrade to $DBversion done (Updating columnd definitions for patron category codes in notice/statsu triggers and deletedborrowers tables.)\n";
1894     SetVersion($DBversion);
1895 }
1896
1897 $DBversion = '3.00.00.102';
1898 if ( C4::Context->preference('Version') < TransformToNum($DBversion) ) {
1899         $dbh->do('ALTER TABLE serialitems MODIFY `serialid` int(11) NOT NULL AFTER itemnumber' );
1900         $dbh->do('ALTER TABLE serialitems DROP KEY serialididx' );
1901         $dbh->do('ALTER TABLE serialitems ADD CONSTRAINT UNIQUE KEY serialitemsidx (itemnumber)' );
1902         # before setting constraint, delete any unvalid data
1903         $dbh->do('DELETE from serialitems WHERE serialid not in (SELECT serial.serialid FROM serial)');
1904         $dbh->do('ALTER TABLE serialitems ADD CONSTRAINT serialitems_sfk_1 FOREIGN KEY (serialid) REFERENCES serial (serialid) ON DELETE CASCADE ON UPDATE CASCADE' );
1905     print "Upgrade to $DBversion done (Updating serialitems table to allow for multiple items per serial fixing kohabug 2380)\n";
1906     SetVersion($DBversion);
1907 }
1908
1909 $DBversion = "3.00.00.103";
1910 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
1911     $dbh->do("DELETE FROM systempreferences WHERE variable='serialsadditems'");
1912     print "Upgrade to $DBversion done ( Verifying the removal of serialsadditems from syspref fixing kohabug 2219)\n";
1913     SetVersion ($DBversion);
1914 }
1915
1916 $DBversion = "3.00.00.104";
1917 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
1918     $dbh->do("DELETE FROM systempreferences WHERE variable='noOPACHolds'");
1919     print "Upgrade to $DBversion done (remove superseded 'noOPACHolds' system preference per bug 2413)\n";
1920     SetVersion ($DBversion);
1921 }
1922
1923 $DBversion = '3.00.00.105';
1924 if ( C4::Context->preference("Version") < TransformToNum($DBversion) ) {
1925
1926     # it is possible that this syspref is already defined since the feature was added some time ago.
1927     unless ( $dbh->do(q(SELECT variable FROM systempreferences WHERE variable = 'SMSSendDriver')) ) {
1928         $dbh->do(<<'END_SQL');
1929 INSERT INTO `systempreferences`
1930   (variable,value,explanation,options,type)
1931 VALUES
1932 ('SMSSendDriver','','Sets which SMS::Send driver is used to send SMS messages.','','free')
1933 END_SQL
1934     }
1935     print "Upgrade to $DBversion done (added SMSSendDriver system preference)\n";
1936     SetVersion($DBversion);
1937 }
1938
1939 $DBversion = "3.00.00.106";
1940 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
1941     $dbh->do("DELETE FROM systempreferences WHERE variable='noOPACHolds'");
1942
1943 # db revision 105 didn't apply correctly, so we're rolling this into 106
1944         $dbh->do("INSERT INTO `systempreferences`
1945    (variable,value,explanation,options,type)
1946         VALUES
1947         ('SMSSendDriver','','Sets which SMS::Send driver is used to send SMS messages.','','free')");
1948
1949     print "Upgrade to $DBversion done (remove default '0000-00-00' in subscriptionhistory.enddate field)\n";
1950     $dbh->do("ALTER TABLE `subscriptionhistory` CHANGE `enddate` `enddate` DATE NULL DEFAULT NULL ");
1951
1952     sanitize_zero_date('subscriptionhistory', 'enddate');
1953
1954     SetVersion ($DBversion);
1955 }
1956
1957 $DBversion = '3.00.00.107';
1958 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
1959     $dbh->do(<<'END_SQL');
1960 UPDATE systempreferences
1961   SET explanation = CONCAT( explanation, '. WARNING: this feature is very resource consuming on collections with large numbers of items.' )
1962   WHERE variable = 'OPACShelfBrowser'
1963     AND explanation NOT LIKE '%WARNING%'
1964 END_SQL
1965     $dbh->do(<<'END_SQL');
1966 UPDATE systempreferences
1967   SET explanation = CONCAT( explanation, '. WARNING: this feature is very resource consuming.' )
1968   WHERE variable = 'CataloguingLog'
1969     AND explanation NOT LIKE '%WARNING%'
1970 END_SQL
1971     $dbh->do(<<'END_SQL');
1972 UPDATE systempreferences
1973   SET explanation = CONCAT( explanation, '. WARNING: using NoZebra on even modest sized collections is very slow.' )
1974   WHERE variable = 'NoZebra'
1975     AND explanation NOT LIKE '%WARNING%'
1976 END_SQL
1977     print "Upgrade to $DBversion done (warning added to OPACShelfBrowser system preference)\n";
1978     SetVersion ($DBversion);
1979 }
1980
1981 $DBversion = '3.01.00.000';
1982 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
1983     print "Upgrade to $DBversion done (start of 3.1)\n";
1984     SetVersion ($DBversion);
1985 }
1986
1987 $DBversion = '3.01.00.001';
1988 if ( C4::Context->preference('Version') < TransformToNum($DBversion) ) {
1989     $dbh->do("
1990         CREATE TABLE hold_fill_targets (
1991             `borrowernumber` int(11) NOT NULL,
1992             `biblionumber` int(11) NOT NULL,
1993             `itemnumber` int(11) NOT NULL,
1994             `source_branchcode`  varchar(10) default NULL,
1995             `item_level_request` tinyint(4) NOT NULL default 0,
1996             PRIMARY KEY `itemnumber` (`itemnumber`),
1997             KEY `bib_branch` (`biblionumber`, `source_branchcode`),
1998             CONSTRAINT `hold_fill_targets_ibfk_1` FOREIGN KEY (`borrowernumber`)
1999                 REFERENCES `borrowers` (`borrowernumber`) ON DELETE CASCADE ON UPDATE CASCADE,
2000             CONSTRAINT `hold_fill_targets_ibfk_2` FOREIGN KEY (`biblionumber`)
2001                 REFERENCES `biblio` (`biblionumber`) ON DELETE CASCADE ON UPDATE CASCADE,
2002             CONSTRAINT `hold_fill_targets_ibfk_3` FOREIGN KEY (`itemnumber`)
2003                 REFERENCES `items` (`itemnumber`) ON DELETE CASCADE ON UPDATE CASCADE,
2004             CONSTRAINT `hold_fill_targets_ibfk_4` FOREIGN KEY (`source_branchcode`)
2005                 REFERENCES `branches` (`branchcode`) ON DELETE CASCADE ON UPDATE CASCADE
2006         ) ENGINE=InnoDB DEFAULT CHARSET=utf8
2007     ");
2008     $dbh->do("
2009         ALTER TABLE tmp_holdsqueue
2010             ADD item_level_request tinyint(4) NOT NULL default 0
2011     ");
2012
2013     print "Upgrade to $DBversion done (add hold_fill_targets table and a column to tmp_holdsqueue)\n";
2014     SetVersion($DBversion);
2015 }
2016
2017 $DBversion = '3.01.00.002';
2018 if ( C4::Context->preference('Version') < TransformToNum($DBversion) ) {
2019     # use statistics where available
2020     $dbh->do("
2021         ALTER TABLE statistics ADD KEY  tmp_stats (type, itemnumber, borrowernumber)
2022     ");
2023     $dbh->do("
2024         UPDATE issues iss
2025         SET issuedate = (
2026             SELECT max(datetime)
2027             FROM statistics
2028             WHERE type = 'issue'
2029             AND itemnumber = iss.itemnumber
2030             AND borrowernumber = iss.borrowernumber
2031         )
2032         WHERE issuedate IS NULL;
2033     ");
2034     $dbh->do("ALTER TABLE statistics DROP KEY tmp_stats");
2035
2036     # default to last renewal date
2037     $dbh->do("
2038         UPDATE issues
2039         SET issuedate = lastreneweddate
2040         WHERE issuedate IS NULL
2041         and lastreneweddate IS NOT NULL
2042     ");
2043
2044     my $num_bad_issuedates = $dbh->selectrow_array("SELECT COUNT(*) FROM issues WHERE issuedate IS NULL");
2045     if ($num_bad_issuedates > 0) {
2046         print STDERR "After the upgrade to $DBversion, there are still $num_bad_issuedates loan(s) with a NULL (blank) loan date. ",
2047                      "Please check the issues table in your database.";
2048     }
2049     print "Upgrade to $DBversion done (bug 2582: set null issues.issuedate to lastreneweddate)\n";
2050     SetVersion($DBversion);
2051 }
2052
2053 $DBversion = "3.01.00.003";
2054 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
2055     $dbh->do("INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES('AllowRenewalLimitOverride', '0', 'if ON, allows renewal limits to be overridden on the circulation screen',NULL,'YesNo')");
2056     print "Upgrade to $DBversion done (add new syspref)\n";
2057     SetVersion ($DBversion);
2058 }
2059
2060 $DBversion = '3.01.00.004';
2061 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
2062     $dbh->do("INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES ('OPACDisplayRequestPriority','0','Show patrons the priority level on holds in the OPAC','','YesNo')");
2063     print "Upgrade to $DBversion done (added OPACDisplayRequestPriority system preference)\n";
2064     SetVersion ($DBversion);
2065 }
2066
2067 $DBversion = '3.01.00.005';
2068 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
2069     $dbh->do("
2070         INSERT INTO `letter` (module, code, name, title, content)
2071         VALUES('reserves', 'HOLD', 'Hold Available for Pickup', 'Hold Available for Pickup at <<branches.branchname>>', 'Dear <<borrowers.firstname>> <<borrowers.surname>>,\r\n\r\nYou have a hold available for pickup as of <<reserves.waitingdate>>:\r\n\r\nTitle: <<biblio.title>>\r\nAuthor: <<biblio.author>>\r\nCopy: <<items.copynumber>>\r\nLocation: <<branches.branchname>>\r\n<<branches.branchaddress1>>\r\n<<branches.branchaddress2>>\r\n<<branches.branchaddress3>>')
2072     ");
2073     $dbh->do("INSERT INTO `message_attributes` (message_attribute_id, message_name, takes_days) values(4, 'Hold Filled', 0)");
2074     $dbh->do("INSERT INTO `message_transports` (message_attribute_id, message_transport_type, is_digest, letter_module, letter_code) values(4, 'sms', 0, 'reserves', 'HOLD')");
2075     $dbh->do("INSERT INTO `message_transports` (message_attribute_id, message_transport_type, is_digest, letter_module, letter_code) values(4, 'email', 0, 'reserves', 'HOLD')");
2076     print "Upgrade to $DBversion done (Add letter for holds notifications)\n";
2077     SetVersion ($DBversion);
2078 }
2079
2080 $DBversion = '3.01.00.006';
2081 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
2082     $dbh->do("ALTER TABLE `biblioitems` ADD KEY issn (issn)");
2083     print "Upgrade to $DBversion done (add index on biblioitems.issn)\n";
2084     SetVersion ($DBversion);
2085 }
2086
2087 $DBversion = "3.01.00.007";
2088 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
2089     $dbh->do("UPDATE `systempreferences` SET options='70|10' WHERE variable='intranetmainUserblock'");
2090     $dbh->do("UPDATE `systempreferences` SET options='70|10' WHERE variable='intranetuserjs'");
2091     $dbh->do("UPDATE `systempreferences` SET options='70|10' WHERE variable='opacheader'");
2092     $dbh->do("UPDATE `systempreferences` SET options='70|10' WHERE variable='OpacMainUserBlock'");
2093     $dbh->do("UPDATE `systempreferences` SET options='70|10' WHERE variable='OpacNav'");
2094     $dbh->do("UPDATE `systempreferences` SET options='70|10' WHERE variable='opacuserjs'");
2095     $dbh->do("UPDATE `systempreferences` SET options='30|10', type='Textarea' WHERE variable='OAI-PMH:Set'");
2096     $dbh->do("UPDATE `systempreferences` SET options='50' WHERE variable='intranetstylesheet'");
2097     $dbh->do("UPDATE `systempreferences` SET options='50' WHERE variable='intranetcolorstylesheet'");
2098     $dbh->do("UPDATE `systempreferences` SET options='10' WHERE variable='globalDueDate'");
2099     $dbh->do("UPDATE `systempreferences` SET type='Integer' WHERE variable='numSearchResults'");
2100     $dbh->do("UPDATE `systempreferences` SET type='Integer' WHERE variable='OPACnumSearchResults'");
2101     $dbh->do("UPDATE `systempreferences` SET type='Integer' WHERE variable='ReservesMaxPickupDelay'");
2102     $dbh->do("UPDATE `systempreferences` SET type='Integer' WHERE variable='TransfersMaxDaysWarning'");
2103     $dbh->do("UPDATE `systempreferences` SET type='Integer' WHERE variable='StaticHoldsQueueWeight'");
2104     $dbh->do("UPDATE `systempreferences` SET type='Integer' WHERE variable='holdCancelLength'");
2105     $dbh->do("UPDATE `systempreferences` SET type='Integer' WHERE variable='XISBNDailyLimit'");
2106     $dbh->do("UPDATE `systempreferences` SET type='Float' WHERE variable='gist'");
2107     $dbh->do("UPDATE `systempreferences` SET type='Free' WHERE variable='BakerTaylorUsername'");
2108     $dbh->do("UPDATE `systempreferences` SET type='Free' WHERE variable='BakerTaylorPassword'");
2109     $dbh->do("UPDATE `systempreferences` SET type='Textarea', options='70|10' WHERE variable='ISBD'");
2110     $dbh->do("UPDATE `systempreferences` SET type='Textarea', options='70|10', explanation='Enter a specific hash for NoZebra indexes. Enter : \\\'indexname\\\' => \\\'100a,245a,500*\\\',\\\'index2\\\' => \\\'...\\\'' WHERE variable='NoZebraIndexes'");
2111     print "Upgrade to $DBversion done (fix display of many sysprefs)\n";
2112     SetVersion ($DBversion);
2113 }
2114
2115 $DBversion = '3.01.00.008';
2116 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
2117
2118     $dbh->do("CREATE TABLE branch_transfer_limits (
2119                           limitId int(8) NOT NULL auto_increment,
2120                           toBranch varchar(4) NOT NULL,
2121                           fromBranch varchar(4) NOT NULL,
2122                           itemtype varchar(4) NOT NULL,
2123                           PRIMARY KEY  (limitId)
2124                           ) ENGINE=InnoDB DEFAULT CHARSET=utf8"
2125                         );
2126
2127     $dbh->do("INSERT INTO `systempreferences` ( `variable` , `value` , `options` , `explanation` , `type` ) VALUES ( 'UseBranchTransferLimits', '0', '', 'If ON, Koha will will use the rules defined in branch_transfer_limits to decide if an item transfer should be allowed.', 'YesNo')");
2128
2129     print "Upgrade to $DBversion done (added branch_transfer_limits table and UseBranchTransferLimits system preference)\n";
2130     SetVersion ($DBversion);
2131 }
2132
2133 $DBversion = "3.01.00.009";
2134 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
2135     $dbh->do("ALTER TABLE permissions MODIFY `code` varchar(64) DEFAULT NULL");
2136     $dbh->do("ALTER TABLE user_permissions MODIFY `code` varchar(64) DEFAULT NULL");
2137     $dbh->do("INSERT INTO permissions (module_bit, code, description) VALUES ( 1, 'circulate_remaining_permissions', 'Remaining circulation permissions')");
2138     $dbh->do("INSERT INTO permissions (module_bit, code, description) VALUES ( 1, 'override_renewals', 'Override blocked renewals')");
2139     print "Upgrade to $DBversion done (added subpermissions for circulate permission)\n";
2140 }
2141
2142 $DBversion = '3.01.00.010';
2143 if ( C4::Context->preference('Version') < TransformToNum($DBversion) ) {
2144     $dbh->do("ALTER TABLE `borrower_attributes` MODIFY COLUMN `attribute` VARCHAR(64) DEFAULT NULL");
2145     $dbh->do("ALTER TABLE `borrower_attributes` MODIFY COLUMN `password` VARCHAR(64) DEFAULT NULL");
2146     print "Upgrade to $DBversion done (bug 2687: increase length of borrower attribute fields)\n";
2147     SetVersion ($DBversion);
2148 }
2149
2150 $DBversion = '3.01.00.011';
2151 if ( C4::Context->preference('Version') < TransformToNum($DBversion) ) {
2152
2153     # Yes, the old value was ^M terminated.
2154     my $bad_value = "function prepareEmailPopup(){\r\n  if (!document.getElementById) return false;\r\n  if (!document.getElementById('reserveemail')) return false;\r\n  rsvlink = document.getElementById('reserveemail');\r\n  rsvlink.onclick = function() {\r\n      doReservePopup();\r\n      return false;\r\n  }\r\n}\r\n\r\nfunction doReservePopup(){\r\n}\r\n\r\nfunction prepareReserveList(){\r\n}\r\n\r\naddLoadEvent(prepareEmailPopup);\r\naddLoadEvent(prepareReserveList);";
2155
2156     my $intranetuserjs = C4::Context->preference('intranetuserjs');
2157     if ($intranetuserjs  and  $intranetuserjs eq $bad_value) {
2158         my $sql = <<'END_SQL';
2159 UPDATE systempreferences
2160 SET value = ''
2161 WHERE variable = 'intranetuserjs'
2162 END_SQL
2163         $dbh->do($sql);
2164     }
2165     print "Upgrade to $DBversion done (removed bogus intranetuserjs syspref)\n";
2166     SetVersion($DBversion);
2167 }
2168
2169 $DBversion = "3.01.00.012";
2170 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
2171     $dbh->do("INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES('AllowHoldPolicyOverride', '0', 'Allow staff to override hold policies when placing holds',NULL,'YesNo')");
2172     $dbh->do("
2173         CREATE TABLE `branch_item_rules` (
2174           `branchcode` varchar(10) NOT NULL,
2175           `itemtype` varchar(10) NOT NULL,
2176           `holdallowed` tinyint(1) default NULL,
2177           PRIMARY KEY  (`itemtype`,`branchcode`),
2178           KEY `branch_item_rules_ibfk_2` (`branchcode`),
2179           CONSTRAINT `branch_item_rules_ibfk_1` FOREIGN KEY (`itemtype`) REFERENCES `itemtypes` (`itemtype`) ON DELETE CASCADE ON UPDATE CASCADE,
2180           CONSTRAINT `branch_item_rules_ibfk_2` FOREIGN KEY (`branchcode`) REFERENCES `branches` (`branchcode`) ON DELETE CASCADE ON UPDATE CASCADE
2181         ) ENGINE=InnoDB DEFAULT CHARSET=utf8
2182     ");
2183     $dbh->do("
2184         CREATE TABLE `default_branch_item_rules` (
2185           `itemtype` varchar(10) NOT NULL,
2186           `holdallowed` tinyint(1) default NULL,
2187           PRIMARY KEY  (`itemtype`),
2188           CONSTRAINT `default_branch_item_rules_ibfk_1` FOREIGN KEY (`itemtype`) REFERENCES `itemtypes` (`itemtype`) ON DELETE CASCADE ON UPDATE CASCADE
2189         ) ENGINE=InnoDB DEFAULT CHARSET=utf8
2190     ");
2191     $dbh->do("
2192         ALTER TABLE default_branch_circ_rules
2193             ADD COLUMN holdallowed tinyint(1) NULL
2194     ");
2195     $dbh->do("
2196         ALTER TABLE default_circ_rules
2197             ADD COLUMN holdallowed tinyint(1) NULL
2198     ");
2199     print "Upgrade to $DBversion done (Add tables and system preferences for holds policies)\n";
2200     SetVersion ($DBversion);
2201 }
2202
2203 $DBversion = '3.01.00.013';
2204 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
2205     $dbh->do("
2206         CREATE TABLE item_circulation_alert_preferences (
2207             id           int(11) AUTO_INCREMENT,
2208             branchcode   varchar(10) NOT NULL,
2209             categorycode varchar(10) NOT NULL,
2210             item_type    varchar(10) NOT NULL,
2211             notification varchar(16) NOT NULL,
2212             PRIMARY KEY (id),
2213             KEY (branchcode, categorycode, item_type, notification)
2214         ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
2215     ");
2216
2217     $dbh->do(q{ ALTER TABLE `message_queue` ADD metadata text DEFAULT NULL           AFTER content;  });
2218     $dbh->do(q{ ALTER TABLE `message_queue` ADD letter_code varchar(64) DEFAULT NULL AFTER metadata; });
2219
2220     $dbh->do(q{
2221         INSERT INTO `letter` (`module`, `code`, `name`, `title`, `content`) VALUES
2222         ('circulation','CHECKIN','Item Check-in','Check-ins','The following items have been checked in:\r\n----\r\n<<biblio.title>>\r\n----\r\nThank you.');
2223     });
2224     $dbh->do(q{
2225         INSERT INTO `letter` (`module`, `code`, `name`, `title`, `content`) VALUES
2226         ('circulation','CHECKOUT','Item Checkout','Checkouts','The following items have been checked out:\r\n----\r\n<<biblio.title>>\r\n----\r\nThank you for visiting <<branches.branchname>>.');
2227     });
2228
2229     $dbh->do(q{INSERT INTO message_attributes (message_attribute_id, message_name, takes_days) VALUES (5, 'Item Check-in', 0);});
2230     $dbh->do(q{INSERT INTO message_attributes (message_attribute_id, message_name, takes_days) VALUES (6, 'Item Checkout', 0);});
2231
2232     $dbh->do(q{INSERT INTO message_transports (message_attribute_id, message_transport_type, is_digest, letter_module, letter_code) VALUES (5, 'email', 0, 'circulation', 'CHECKIN');});
2233     $dbh->do(q{INSERT INTO message_transports (message_attribute_id, message_transport_type, is_digest, letter_module, letter_code) VALUES (5, 'sms',   0, 'circulation', 'CHECKIN');});
2234     $dbh->do(q{INSERT INTO message_transports (message_attribute_id, message_transport_type, is_digest, letter_module, letter_code) VALUES (6, 'email', 0, 'circulation', 'CHECKOUT');});
2235     $dbh->do(q{INSERT INTO message_transports (message_attribute_id, message_transport_type, is_digest, letter_module, letter_code) VALUES (6, 'sms',   0, 'circulation', 'CHECKOUT');});
2236
2237     print "Upgrade to $DBversion done (data for Email Checkout Slips project)\n";
2238          SetVersion ($DBversion);
2239 }
2240
2241 $DBversion = "3.01.00.014";
2242 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
2243     $dbh->do("ALTER TABLE `branch_transfer_limits` CHANGE `itemtype` `itemtype` VARCHAR( 4 ) CHARACTER SET utf8 COLLATE utf8_general_ci NULL");
2244     $dbh->do("ALTER TABLE `branch_transfer_limits` ADD `ccode` VARCHAR( 10 ) NULL ;");
2245     $dbh->do("INSERT INTO `systempreferences` ( `variable` , `value` , `options` , `explanation` , `type` )
2246     VALUES (
2247     'BranchTransferLimitsType', 'ccode', 'itemtype|ccode', 'When using branch transfer limits, choose whether to limit by itemtype or collection code.', 'Choice'
2248     );");
2249
2250     print "Upgrade to $DBversion done ( Updated table for Branch Transfer Limits)\n";
2251     SetVersion ($DBversion);
2252 }
2253
2254 $DBversion = '3.01.00.015';
2255 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
2256     $dbh->do("INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES ('SyndeticsClientCode', '0', 'Client Code for using Syndetics Solutions content','','free')");
2257
2258     $dbh->do("INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES ('SyndeticsEnabled', '0', 'Turn on Syndetics Enhanced Content','','YesNo')");
2259
2260     $dbh->do("INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES ('SyndeticsCoverImages', '0', 'Display Cover Images from Syndetics','','YesNo')");
2261
2262     $dbh->do("INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES ('SyndeticsTOC', '0', 'Display Table of Content information from Syndetics','','YesNo')");
2263
2264     $dbh->do("INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES ('SyndeticsSummary', '0', 'Display Summary Information from Syndetics','','YesNo')");
2265
2266     $dbh->do("INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES ('SyndeticsEditions', '0', 'Display Editions from Syndetics','','YesNo')");
2267
2268     $dbh->do("INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES ('SyndeticsExcerpt', '0', 'Display Excerpts and first chapters on OPAC from Syndetics','','YesNo')");
2269
2270     $dbh->do("INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES ('SyndeticsReviews', '0', 'Display Reviews on OPAC from Syndetics','','YesNo')");
2271
2272     $dbh->do("INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES ('SyndeticsAuthorNotes', '0', 'Display Notes about the Author on OPAC from Syndetics','','YesNo')");
2273
2274     $dbh->do("INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES ('SyndeticsAwards', '0', 'Display Awards on OPAC from Syndetics','','YesNo')");
2275
2276     $dbh->do("INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES ('SyndeticsSeries', '0', 'Display Series information on OPAC from Syndetics','','YesNo')");
2277
2278     $dbh->do("INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES ('SyndeticsCoverImageSize', 'MC', 'Choose the size of the Syndetics Cover Image to display on the OPAC detail page, MC is Medium, LC is Large','MC|LC','Choice')");
2279
2280     $dbh->do("INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES ('OPACAmazonCoverImages', '0', 'Display cover images on OPAC from Amazon Web Services','','YesNo')");
2281
2282     $dbh->do("INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES ('AmazonCoverImages', '0', 'Display Cover Images in Staff Client from Amazon Web Services','','YesNo')");
2283
2284     $dbh->do("UPDATE systempreferences SET variable='AmazonEnabled' WHERE variable = 'AmazonContent'");
2285
2286     $dbh->do("UPDATE systempreferences SET variable='OPACAmazonEnabled' WHERE variable = 'OPACAmazonContent'");
2287
2288     print "Upgrade to $DBversion done (added Syndetics Enhanced Content system preferences)\n";
2289     SetVersion ($DBversion);
2290 }
2291
2292 $DBversion = "3.01.00.016";
2293 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
2294     $dbh->do("INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES('Babeltheque',0,'Turn ON Babeltheque content  - See babeltheque.com to subscribe to this service','','YesNo')");
2295     print "Upgrade to $DBversion done (Added Babeltheque syspref)\n";
2296     SetVersion ($DBversion);
2297 }
2298
2299 $DBversion = "3.01.00.017";
2300 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
2301     $dbh->do("ALTER TABLE `subscription` ADD `staffdisplaycount` VARCHAR(10) NULL;");
2302     $dbh->do("ALTER TABLE `subscription` ADD `opacdisplaycount` VARCHAR(10) NULL;");
2303     $dbh->do("INSERT INTO `systempreferences` ( `variable` , `value` , `options` , `explanation` , `type` )
2304     VALUES (
2305     'StaffSerialIssueDisplayCount', '3', '', 'Number of serial issues to display per subscription in the Staff client', 'Integer'
2306     );");
2307         $dbh->do("INSERT INTO `systempreferences` ( `variable` , `value` , `options` , `explanation` , `type` )
2308     VALUES (
2309     'OPACSerialIssueDisplayCount', '3', '', 'Number of serial issues to display per subscription in the OPAC', 'Integer'
2310     );");
2311
2312     print "Upgrade to $DBversion done ( Updated table for Serials Display)\n";
2313     SetVersion ($DBversion);
2314 }
2315
2316 $DBversion = "3.01.00.018";
2317 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
2318     $dbh->do("ALTER TABLE deletedborrowers ADD `smsalertnumber` varchar(50) default NULL");
2319     print "Upgrade to $DBversion done (added deletedborrowers.smsalertnumber, missed in 3.00.00.091)\n";
2320     SetVersion ($DBversion);
2321 }
2322
2323 $DBversion = "3.01.00.019";
2324 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
2325         $dbh->do("INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES('OPACShowCheckoutName','0','Displays in the OPAC the name of patron who has checked out the material. WARNING: Most sites should leave this off. It is intended for corporate or special sites which need to track who has the item.','','YesNo')");
2326     print "Upgrade to $DBversion done (adding OPACShowCheckoutName systempref)\n";
2327     SetVersion ($DBversion);
2328 }
2329
2330 $DBversion = "3.01.00.020";
2331 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
2332     $dbh->do("INSERT INTO systempreferences (variable,value,explanation,options,type)VALUES('LibraryThingForLibrariesID','','See:http://librarything.com/forlibraries/','','free')");
2333     $dbh->do("INSERT INTO systempreferences (variable,value,explanation,options,type)VALUES('LibraryThingForLibrariesEnabled','0','Enable or Disable Library Thing for Libraries Features','','YesNo')");
2334     $dbh->do("INSERT INTO systempreferences (variable,value,explanation,options,type)VALUES('LibraryThingForLibrariesTabbedView','0','Put LibraryThingForLibraries Content in Tabs.','','YesNo')");
2335     print "Upgrade to $DBversion done (adding LibraryThing for Libraries sysprefs)\n";
2336     SetVersion ($DBversion);
2337 }
2338
2339 $DBversion = "3.01.00.021";
2340 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
2341     my $enable_reviews = C4::Context->preference('OPACAmazonEnabled') ? '1' : '0';
2342     $dbh->do("INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES ('OPACAmazonReviews', '$enable_reviews', 'Display Amazon readers reviews on OPAC','','YesNo')");
2343     print "Upgrade to $DBversion done (adding OPACAmazonReviews syspref)\n";
2344     SetVersion ($DBversion);
2345 }
2346
2347 $DBversion = '3.01.00.022';
2348 if ( C4::Context->preference('Version') < TransformToNum($DBversion) ) {
2349     $dbh->do("ALTER TABLE `labels_conf` MODIFY COLUMN `formatstring` mediumtext DEFAULT NULL");
2350     print "Upgrade to $DBversion done (bug 2945: increase size of labels_conf.formatstring)\n";
2351     SetVersion ($DBversion);
2352 }
2353
2354 $DBversion = '3.01.00.023';
2355 if ( C4::Context->preference('Version') < TransformToNum($DBversion) ) {
2356     $dbh->do("ALTER TABLE biblioitems        MODIFY COLUMN isbn VARCHAR(30) DEFAULT NULL");
2357     $dbh->do("ALTER TABLE deletedbiblioitems MODIFY COLUMN isbn VARCHAR(30) DEFAULT NULL");
2358     $dbh->do("ALTER TABLE import_biblios     MODIFY COLUMN isbn VARCHAR(30) DEFAULT NULL");
2359     $dbh->do("ALTER TABLE suggestions        MODIFY COLUMN isbn VARCHAR(30) DEFAULT NULL");
2360     print "Upgrade to $DBversion done (bug 2765: increase width of isbn column in several tables)\n";
2361     SetVersion ($DBversion);
2362 }
2363
2364 $DBversion = "3.01.00.024";
2365 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
2366     $dbh->do("ALTER TABLE labels MODIFY COLUMN batch_id int(10) NOT NULL default 1;");
2367     print "Upgrade to $DBversion done (change labels.batch_id from varchar to int)\n";
2368     SetVersion ($DBversion);
2369 }
2370
2371 $DBversion = '3.01.00.025';
2372 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
2373     $dbh->do("INSERT INTO `systempreferences` ( `variable` , `value` , `options` , `explanation` , `type` ) VALUES ( 'ceilingDueDate', '', '', 'If set, date due will not be past this date.  Enter date according to the dateformat System Preference', 'free')");
2374
2375     print "Upgrade to $DBversion done (added ceilingDueDate system preference)\n";
2376     SetVersion ($DBversion);
2377 }
2378
2379 $DBversion = '3.01.00.026';
2380 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
2381     $dbh->do("INSERT INTO `systempreferences` ( `variable` , `value` , `options` , `explanation` , `type` ) VALUES ( 'numReturnedItemsToShow', '20', '', 'Number of returned items to show on the check-in page', 'Integer')");
2382
2383     print "Upgrade to $DBversion done (added numReturnedItemsToShow system preference)\n";
2384     SetVersion ($DBversion);
2385 }
2386
2387 $DBversion = '3.01.00.027';
2388 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
2389     $dbh->do("ALTER TABLE zebraqueue CHANGE `biblio_auth_number` `biblio_auth_number` bigint(20) unsigned NOT NULL default 0");
2390     print "Upgrade to $DBversion done (Increased size of zebraqueue biblio_auth_number to address bug 3148.)\n";
2391     SetVersion ($DBversion);
2392 }
2393
2394 $DBversion = '3.01.00.028';
2395 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
2396     my $enable_reviews = C4::Context->preference('AmazonEnabled') ? '1' : '0';
2397     $dbh->do("INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES ('AmazonReviews', '$enable_reviews', 'Display Amazon reviews on staff interface','','YesNo')");
2398     print "Upgrade to $DBversion done (added AmazonReviews)\n";
2399     SetVersion ($DBversion);
2400 }
2401
2402 $DBversion = '3.01.00.029';
2403 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
2404     $dbh->do(q( UPDATE language_rfc4646_to_iso639
2405                 SET iso639_2_code = 'spa'
2406                 WHERE rfc4646_subtag = 'es'
2407                 AND   iso639_2_code = 'rus' )
2408             );
2409     print "Upgrade to $DBversion done (fixed bug 2599: using Spanish search limit retrieves Russian results)\n";
2410     SetVersion ($DBversion);
2411 }
2412
2413 $DBversion = "3.01.00.030";
2414 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
2415     $dbh->do("INSERT INTO `systempreferences` ( `variable` , `value` , `options` , `explanation` , `type` ) VALUES ( 'AllowNotForLoanOverride', '0', '', 'If ON, Koha will allow the librarian to loan a not for loan item.', 'YesNo')");
2416     print "Upgrade to $DBversion done (added AllowNotForLoanOverride system preference)\n";
2417     SetVersion ($DBversion);
2418 }
2419
2420 $DBversion = "3.01.00.031";
2421 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
2422     $dbh->do("ALTER TABLE branch_transfer_limits
2423               MODIFY toBranch   varchar(10) NOT NULL,
2424               MODIFY fromBranch varchar(10) NOT NULL,
2425               MODIFY itemtype   varchar(10) NULL");
2426     print "Upgrade to $DBversion done (fix column widths in branch_transfer_limits)\n";
2427     SetVersion ($DBversion);
2428 }
2429
2430 $DBversion = "3.01.00.032";
2431 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
2432     $dbh->do(<<ENDOFRENEWAL);
2433 INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES('RenewalPeriodBase', 'now', 'Set whether the renewal date should be counted from the date_due or from the moment the Patron asks for renewal ','date_due|now','Choice');
2434 ENDOFRENEWAL
2435     print "Upgrade to $DBversion done (Change the field)\n";
2436     SetVersion ($DBversion);
2437 }
2438
2439 $DBversion = "3.01.00.033";
2440 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
2441     $dbh->do(q/
2442         ALTER TABLE borrower_message_preferences
2443         MODIFY borrowernumber int(11) default NULL,
2444         ADD    categorycode varchar(10) default NULL AFTER borrowernumber,
2445         ADD KEY `categorycode` (`categorycode`),
2446         ADD CONSTRAINT `borrower_message_preferences_ibfk_3`
2447                        FOREIGN KEY (`categorycode`) REFERENCES `categories` (`categorycode`)
2448                        ON DELETE CASCADE ON UPDATE CASCADE
2449     /);
2450     print "Upgrade to $DBversion done (DB changes to allow patron category defaults for messaging preferences)\n";
2451     SetVersion ($DBversion);
2452 }
2453
2454 $DBversion = "3.01.00.034";
2455 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
2456     $dbh->do("ALTER TABLE `subscription` ADD COLUMN `graceperiod` INT(11) NOT NULL default '0';");
2457     print "Upgrade to $DBversion done (Adding graceperiod column to subscription table)\n";
2458     SetVersion ($DBversion);
2459 }
2460
2461 $DBversion = '3.01.00.035';
2462 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
2463     $dbh->do(q{ ALTER TABLE `subscription` ADD location varchar(80) NULL DEFAULT '' AFTER callnumber; });
2464    print "Upgrade to $DBversion done (Adding location to subscription table)\n";
2465     SetVersion ($DBversion);
2466 }
2467
2468 $DBversion = '3.01.00.036';
2469 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
2470     $dbh->do("UPDATE systempreferences SET explanation = 'Choose the default detail view in the staff interface; choose between normal, labeled_marc, marc or isbd'
2471               WHERE variable = 'IntranetBiblioDefaultView'
2472               AND   explanation = 'IntranetBiblioDefaultView'");
2473     $dbh->do("UPDATE systempreferences SET type = 'Choice', options = 'normal|marc|isbd|labeled_marc'
2474               WHERE variable = 'IntranetBiblioDefaultView'");
2475     $dbh->do("INSERT INTO systempreferences (variable,value,explanation,options,type)VALUES('viewISBD','1','Allow display of ISBD view of bibiographic records','','YesNo')");
2476     $dbh->do("INSERT INTO systempreferences (variable,value,explanation,options,type)VALUES('viewLabeledMARC','0','Allow display of labeled MARC view of bibiographic records','','YesNo')");
2477     $dbh->do("INSERT INTO systempreferences (variable,value,explanation,options,type)VALUES('viewMARC','1','Allow display of MARC view of bibiographic records','','YesNo')");
2478     print "Upgrade to $DBversion done (new viewISBD, viewLabeledMARC, viewMARC sysprefs and tweak IntranetBiblioDefaultView)\n";
2479     SetVersion ($DBversion);
2480 }
2481
2482 $DBversion = '3.01.00.037';
2483 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
2484     $dbh->do('ALTER TABLE authorised_values ADD KEY `lib` (`lib`)');
2485     $dbh->do("INSERT INTO systempreferences (variable,value,explanation,options,type)VALUES('FilterBeforeOverdueReport','0','Do not run overdue report until filter selected','','YesNo')");
2486     SetVersion ($DBversion);
2487     print "Upgrade to $DBversion done (added FilterBeforeOverdueReport syspref and new index on authorised_values)\n";
2488 }
2489
2490 $DBversion = "3.01.00.038";
2491 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
2492     # update branches table
2493     #
2494     $dbh->do("ALTER TABLE branches ADD `branchzip` varchar(25) default NULL AFTER `branchaddress3`");
2495     $dbh->do("ALTER TABLE branches ADD `branchcity` mediumtext AFTER `branchzip`");
2496     $dbh->do("ALTER TABLE branches ADD `branchcountry` text AFTER `branchcity`");
2497     $dbh->do("ALTER TABLE branches ADD `branchurl` mediumtext AFTER `branchemail`");
2498     $dbh->do("ALTER TABLE branches ADD `branchnotes` mediumtext AFTER `branchprinter`");
2499     print "Upgrade to $DBversion done (add ZIP, city, country, URL, and notes column to branches)\n";
2500     SetVersion ($DBversion);
2501 }
2502
2503 $DBversion = '3.01.00.039';
2504 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
2505     $dbh->do("INSERT INTO systempreferences (variable,value,options,explanation,type)VALUES('SpineLabelFormat', '<itemcallnumber><copynumber>', '30|10', 'This preference defines the format for the quick spine label printer. Just list the fields you would like to see in the order you would like to see them, surrounded by <>, for example <itemcallnumber>.', 'Textarea')");
2506     $dbh->do("INSERT INTO systempreferences (variable,value,options,explanation,type)VALUES('SpineLabelAutoPrint', '0', '', 'If this setting is turned on, a print dialog will automatically pop up for the quick spine label printer.', 'YesNo')");
2507     SetVersion ($DBversion);
2508     print "Upgrade to $DBversion done (added SpineLabelFormat and SpineLabelAutoPrint sysprefs)\n";
2509 }
2510
2511 $DBversion = '3.01.00.040';
2512 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
2513     $dbh->do("INSERT INTO systempreferences (variable,value,explanation,options,type)VALUES('AllowHoldDateInFuture','0','If set a date field is displayed on the Hold screen of the Staff Interface, allowing the hold date to be set in the future.','','YesNo')");
2514     $dbh->do("INSERT INTO systempreferences (variable,value,explanation,options,type)VALUES('OPACAllowHoldDateInFuture','0','If set, along with the AllowHoldDateInFuture system preference, OPAC users can set the date of a hold to be in the future.','','YesNo')");
2515     SetVersion ($DBversion);
2516     print "Upgrade to $DBversion done (AllowHoldDateInFuture and OPACAllowHoldDateInFuture sysprefs)\n";
2517 }
2518
2519 $DBversion = '3.01.00.041';
2520 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
2521     $dbh->do("INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES('AWSPrivateKey','','See:  http://aws.amazon.com.  Note that this is required after 2009/08/15 in order to retrieve any enhanced content other than book covers from Amazon.','','free')");
2522     SetVersion ($DBversion);
2523     print "Upgrade to $DBversion done (added AWSPrivateKey syspref - note that if you use enhanced content from Amazon, this should be set right away.)\n";
2524 }
2525
2526 $DBversion = '3.01.00.042';
2527 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
2528     $dbh->do("INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES('OPACFineNoRenewals','99999','Fine Limit above which user canmot renew books via OPAC','','Integer')");
2529     SetVersion ($DBversion);
2530     print "Upgrade to $DBversion done (added OPACFineNoRenewals syspref)\n";
2531 }
2532
2533 $DBversion = '3.01.00.043';
2534 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
2535     $dbh->do('ALTER TABLE items ADD COLUMN permanent_location VARCHAR(80) DEFAULT NULL AFTER location');
2536     $dbh->do('UPDATE items SET permanent_location = location');
2537     $dbh->do("INSERT INTO `systempreferences` ( `variable` , `value` , `options` , `explanation` , `type` ) VALUES ( 'NewItemsDefaultLocation', '', '', 'If set, all new items will have a location of the given Location Code ( Authorized Value type LOC )', '')");
2538     $dbh->do("INSERT INTO `systempreferences` ( `variable` , `value` , `options` , `explanation` , `type` ) VALUES ( 'InProcessingToShelvingCart', '0', '', 'If set, when any item with a location code of PROC is ''checked in'', it''s location code will be changed to CART.', 'YesNo')");
2539     $dbh->do("INSERT INTO `systempreferences` ( `variable` , `value` , `options` , `explanation` , `type` ) VALUES ( 'ReturnToShelvingCart', '0', '', 'If set, when any item is ''checked in'', it''s location code will be changed to CART.', 'YesNo')");
2540     SetVersion ($DBversion);
2541     print "Upgrade to $DBversion done (amended Item added NewItemsDefaultLocation, InProcessingToShelvingCart, ReturnToShelvingCart sysprefs)\n";
2542 }
2543
2544 $DBversion = '3.01.00.044';
2545 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
2546     $dbh->do("INSERT INTO systempreferences (variable,value,explanation,options,type)VALUES( 'DisplayClearScreenButton', '0', 'If set to yes, a clear screen button will appear on the circulation page.', 'If set to yes, a clear screen button will appear on the circulation page.', 'YesNo')");
2547     SetVersion ($DBversion);
2548     print "Upgrade to $DBversion done (added DisplayClearScreenButton system preference)\n";
2549 }
2550
2551 $DBversion = '3.01.00.045';
2552 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
2553     $dbh->do("INSERT INTO systempreferences (variable,value,options,explanation,type)VALUES('HidePatronName', '0', '', 'If this is switched on, patron''s cardnumber will be shown instead of their name on the holds and catalog screens', 'YesNo')");
2554     SetVersion ($DBversion);
2555     print "Upgrade to $DBversion done (added a preference to hide the patrons name in the staff catalog)\n";
2556 }
2557
2558 $DBversion = "3.01.00.046";
2559 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
2560     # update borrowers table
2561     #
2562     $dbh->do("ALTER TABLE borrowers ADD `country` text AFTER zipcode");
2563     $dbh->do("ALTER TABLE borrowers ADD `B_country` text AFTER B_zipcode");
2564     $dbh->do("ALTER TABLE deletedborrowers ADD `country` text AFTER zipcode");
2565     $dbh->do("ALTER TABLE deletedborrowers ADD `B_country` text AFTER B_zipcode");
2566     print "Upgrade to $DBversion done (add country and B_country to borrowers)\n";
2567     SetVersion ($DBversion);
2568 }
2569
2570 $DBversion = '3.01.00.047';
2571 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
2572     $dbh->do("ALTER TABLE items MODIFY itemcallnumber varchar(255);");
2573     $dbh->do("ALTER TABLE deleteditems MODIFY itemcallnumber varchar(255);");
2574     $dbh->do("ALTER TABLE tmp_holdsqueue MODIFY itemcallnumber varchar(255);");
2575     SetVersion ($DBversion);
2576     print " Upgrade to $DBversion done (bug 2761: change max length of itemcallnumber to 255 from 30)\n";
2577 }
2578
2579 $DBversion = '3.01.00.048';
2580 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
2581     $dbh->do("UPDATE userflags SET flagdesc='View Catalog (Librarian Interface)' WHERE bit=2;");
2582     $dbh->do("UPDATE userflags SET flagdesc='Edit Catalog (Modify bibliographic/holdings data)' WHERE bit=9;");
2583     $dbh->do("UPDATE userflags SET flagdesc='Allow to edit authorities' WHERE bit=14;");
2584     $dbh->do("UPDATE userflags SET flagdesc='Allow to access to the reports module' WHERE bit=16;");
2585     $dbh->do("UPDATE userflags SET flagdesc='Allow to manage serials subscriptions' WHERE bit=15;");
2586     SetVersion ($DBversion);
2587     print " Upgrade to $DBversion done (bug 2611: fix spelling/capitalization in permission flag descriptions)\n";
2588 }
2589
2590 $DBversion = '3.01.00.049';
2591 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
2592     $dbh->do("UPDATE permissions SET description = 'Perform inventory (stocktaking) of your catalog' WHERE code = 'inventory';");
2593      SetVersion ($DBversion);
2594     print "Upgrade to $DBversion done (bug 2611: changed catalogue to catalog per the standard)\n";
2595 }
2596
2597 $DBversion = '3.01.00.050';
2598 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
2599     $dbh->do("INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES ('OPACSearchForTitleIn','<li class=\"yuimenuitem\">\n<a target=\"_blank\" class=\"yuimenuitemlabel\" href=\"http://worldcat.org/search?q=TITLE\">Other Libraries (WorldCat)</a></li>\n<li class=\"yuimenuitem\">\n<a class=\"yuimenuitemlabel\" href=\"http://www.scholar.google.com/scholar?q=TITLE\" target=\"_blank\">Other Databases (Google Scholar)</a></li>\n<li class=\"yuimenuitem\">\n<a class=\"yuimenuitemlabel\" href=\"http://www.bookfinder.com/search/?author=AUTHOR&amp;title=TITLE&amp;st=xl&amp;ac=qr\" target=\"_blank\">Online Stores (Bookfinder.com)</a></li>','Enter the HTML that will appear in the ''Search for this title in'' box on the detail page in the OPAC.  Enter TITLE, AUTHOR, or ISBN in place of their respective variables in the URL.  Leave blank to disable ''More Searches'' menu.','70|10','Textarea');");
2600     SetVersion ($DBversion);
2601     print "Upgrade to $DBversion done (bug 1934: Add OPACSearchForTitleIn syspref)\n";
2602 }
2603
2604 $DBversion = '3.01.00.051';
2605 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
2606     $dbh->do("UPDATE systempreferences SET explanation='Fine limit above which user cannot renew books via OPAC' WHERE variable='OPACFineNoRenewals';");
2607     $dbh->do("UPDATE systempreferences SET explanation='If set to ON, a clear screen button will appear on the circulation page.' WHERE variable='DisplayClearScreenButton';");
2608     SetVersion ($DBversion);
2609     print "Upgrade to $DBversion done (fixed typos in new sysprefs)\n";
2610 }
2611
2612 $DBversion = '3.01.00.052';
2613 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
2614     $dbh->do('ALTER TABLE deleteditems ADD COLUMN permanent_location VARCHAR(80) DEFAULT NULL AFTER location');
2615     SetVersion ($DBversion);
2616     print "Upgrade to $DBversion done (bug 3481: add permanent_location column to deleteditems)\n";
2617 }
2618
2619 $DBversion = '3.01.00.053';
2620 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
2621     my $upgrade_script = C4::Context->config("intranetdir") . "/installer/data/mysql/labels_upgrade.pl";
2622     system("perl $upgrade_script");
2623     print "Upgrade to $DBversion done (Migrated labels tables and data to new schema.) NOTE: All existing label batches have been assigned to the first branch in the list of branches. This is ONLY true of migrated label batches.\n";
2624     SetVersion ($DBversion);
2625 }
2626
2627 $DBversion = '3.01.00.054';
2628 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
2629     $dbh->do("ALTER TABLE borrowers ADD `B_address2` text AFTER B_address");
2630     $dbh->do("ALTER TABLE borrowers ADD `altcontactcountry` text AFTER altcontactzipcode");
2631     $dbh->do("ALTER TABLE deletedborrowers ADD `B_address2` text AFTER B_address");
2632     $dbh->do("ALTER TABLE deletedborrowers ADD `altcontactcountry` text AFTER altcontactzipcode");
2633     SetVersion ($DBversion);
2634     print "Upgrade to $DBversion done (bug 1600, bug 3454: add altcontactcountry and B_address2 to borrowers and deletedborrowers)\n";
2635 }
2636
2637 $DBversion = '3.01.00.055';
2638 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
2639     $dbh->do(qq|UPDATE systempreferences set explanation='Enter the HTML that will appear in the ''Search for this title in'' box on the detail page in the OPAC.  Enter {TITLE}, {AUTHOR}, or {ISBN} in place of their respective variables in the URL. Leave blank to disable ''More Searches'' menu.', value='<li><a  href="http://worldcat.org/search?q={TITLE}" target="_blank">Other Libraries (WorldCat)</a></li>\n<li><a href="http://www.scholar.google.com/scholar?q={TITLE}" target="_blank">Other Databases (Google Scholar)</a></li>\n<li><a href="http://www.bookfinder.com/search/?author={AUTHOR}&amp;title={TITLE}&amp;st=xl&amp;ac=qr" target="_blank">Online Stores (Bookfinder.com)</a></li>' WHERE variable='OPACSearchForTitleIn'|);
2640     SetVersion ($DBversion);
2641     print "Upgrade to $DBversion done (changed OPACSearchForTitleIn per requests in bug 1934)\n";
2642 }
2643
2644 $DBversion = '3.01.00.056';
2645 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
2646     $dbh->do("INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES ('OPACPatronDetails','1','If OFF the patron details tab in the OPAC is disabled.','','YesNo');");
2647     SetVersion ($DBversion);
2648     print "Upgrade to $DBversion done (Bug 1172 : Add OPACPatronDetails syspref)\n";
2649 }
2650
2651 $DBversion = '3.01.00.057';
2652 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
2653     $dbh->do("INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES ('OPACFinesTab','1','If OFF the patron fines tab in the OPAC is disabled.','','YesNo');");
2654     SetVersion ($DBversion);
2655     print "Upgrade to $DBversion done (Bug 2576 : Add OPACFinesTab syspref)\n";
2656 }
2657
2658 $DBversion = '3.01.00.058';
2659 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
2660     $dbh->do("ALTER TABLE `language_subtag_registry` ADD `id` INT( 11 ) NOT NULL AUTO_INCREMENT PRIMARY KEY;");
2661     $dbh->do("ALTER TABLE `language_rfc4646_to_iso639` ADD `id` INT( 11 ) NOT NULL AUTO_INCREMENT PRIMARY KEY;");
2662     $dbh->do("ALTER TABLE `language_descriptions` ADD `id` INT( 11 ) NOT NULL AUTO_INCREMENT PRIMARY KEY;");
2663     SetVersion ($DBversion);
2664     print "Upgrade to $DBversion done (Added primary keys to language tables)\n";
2665 }
2666
2667 $DBversion = '3.01.00.059';
2668 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
2669     $dbh->do("INSERT INTO systempreferences (variable,value,options,explanation,type)VALUES('DisplayOPACiconsXSLT', '1', '', 'If ON, displays the format, audience, type icons in XSLT MARC21 results and display pages.', 'YesNo')");
2670     SetVersion ($DBversion);
2671     print "Upgrade to $DBversion done (added DisplayOPACiconsXSLT sysprefs)\n";
2672 }
2673
2674 $DBversion = '3.01.00.060';
2675 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
2676     $dbh->do("INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES('AllowAllMessageDeletion','0','Allow any Library to delete any message','','YesNo');");
2677     $dbh->do('DROP TABLE IF EXISTS messages');
2678     $dbh->do("CREATE TABLE messages ( `message_id` int(11) NOT NULL auto_increment,
2679         `borrowernumber` int(11) NOT NULL,
2680         `branchcode` varchar(4) default NULL,
2681         `message_type` varchar(1) NOT NULL,
2682         `message` text NOT NULL,
2683         `message_date` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
2684         PRIMARY KEY (`message_id`)
2685         ) ENGINE=InnoDB DEFAULT CHARSET=utf8");
2686
2687         print "Upgrade to $DBversion done ( Added AllowAllMessageDeletion syspref and messages table )\n";
2688     SetVersion ($DBversion);
2689 }
2690
2691 $DBversion = '3.01.00.061';
2692 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
2693     $dbh->do("INSERT INTO systempreferences (variable,value,explanation,options,type)VALUES('ShowPatronImageInWebBasedSelfCheck', '0', 'If ON, displays patron image when a patron uses web-based self-checkout', '', 'YesNo')");
2694         print "Upgrade to $DBversion done ( Added ShowPatronImageInWebBasedSelfCheck system preference )\n";
2695     SetVersion ($DBversion);
2696 }
2697
2698 $DBversion = "3.01.00.062";
2699 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
2700     $dbh->do("INSERT INTO permissions (module_bit, code, description) VALUES ( 13, 'manage_csv_profiles', 'Manage CSV export profiles')");
2701     $dbh->do(q/
2702         CREATE TABLE `export_format` (
2703           `export_format_id` int(11) NOT NULL auto_increment,
2704           `profile` varchar(255) NOT NULL,
2705           `description` mediumtext NOT NULL,
2706           `marcfields` mediumtext NOT NULL,
2707           PRIMARY KEY  (`export_format_id`)
2708         ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='Used for CSV export';
2709     /);
2710     print "Upgrade to $DBversion done (added csv export profiles)\n";
2711 }
2712
2713 $DBversion = "3.01.00.063";
2714 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
2715     $dbh->do("
2716         CREATE TABLE `fieldmapping` (
2717           `id` int(11) NOT NULL auto_increment,
2718           `field` varchar(255) NOT NULL,
2719           `frameworkcode` char(4) NOT NULL default '',
2720           `fieldcode` char(3) NOT NULL,
2721           `subfieldcode` char(1) NOT NULL,
2722           PRIMARY KEY  (`id`)
2723         ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
2724              ");
2725     SetVersion ($DBversion);print "Upgrade to $DBversion done (Created table fieldmapping)\n";print "Upgrade to 3.01.00.064 done (Version number skipped: nothing done)\n";
2726 }
2727
2728 $DBversion = '3.01.00.065';
2729 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
2730     $dbh->do('ALTER TABLE issuingrules ADD COLUMN `renewalsallowed` smallint(6) NOT NULL default "0" AFTER `issuelength`;');
2731     $sth = $dbh->prepare("SELECT itemtype, renewalsallowed FROM itemtypes");
2732     $sth->execute();
2733
2734     my $sthupd = $dbh->prepare("UPDATE issuingrules SET renewalsallowed = ? WHERE itemtype = ?");
2735
2736     while(my $row = $sth->fetchrow_hashref){
2737         $sthupd->execute($row->{renewalsallowed}, $row->{itemtype});
2738     }
2739
2740     $dbh->do('ALTER TABLE itemtypes DROP COLUMN `renewalsallowed`;');
2741
2742     SetVersion ($DBversion);
2743     print "Upgrade to $DBversion done (Moving allowed renewals from itemtypes to issuingrule)\n";
2744 }
2745
2746 $DBversion = '3.01.00.066';
2747 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
2748     $dbh->do('ALTER TABLE issuingrules ADD COLUMN `reservesallowed` smallint(6) NOT NULL default "0" AFTER `renewalsallowed`;');
2749
2750     my $maxreserves = C4::Context->preference('maxreserves');
2751     $sth = $dbh->prepare('UPDATE issuingrules SET reservesallowed = ?;');
2752     $sth->execute($maxreserves);
2753
2754     $dbh->do('DELETE FROM systempreferences WHERE variable = "maxreserves";');
2755
2756     $dbh->do("INSERT INTO systempreferences (variable,value, options, explanation, type) VALUES('ReservesControlBranch','PatronLibrary','ItemHomeLibrary|PatronLibrary','Branch checked for members reservations rights','Choice')");
2757
2758     SetVersion ($DBversion);
2759     print "Upgrade to $DBversion done (Moving max allowed reserves from system preference to issuingrule)\n";
2760 }
2761
2762 $DBversion = "3.01.00.067";
2763 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
2764     $dbh->do("INSERT INTO permissions (module_bit, code, description) VALUES ( 13, 'batchmod', 'Perform batch modification of items')");
2765     $dbh->do("INSERT INTO permissions (module_bit, code, description) VALUES ( 13, 'batchdel', 'Perform batch deletion of items')");
2766     print "Upgrade to $DBversion done (added permissions for batch modification and deletion)\n";
2767     SetVersion ($DBversion);
2768 }
2769
2770 $DBversion = "3.01.00.068";
2771 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
2772         $dbh->do("ALTER TABLE issuingrules ADD COLUMN `finedays` int(11) default NULL AFTER `fine` ");
2773         print "Upgrade to $DBversion done (Adding finedays in issuingrules table)\n";
2774     SetVersion ($DBversion);
2775 }
2776
2777
2778 $DBversion = "3.01.00.069";
2779 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
2780         $dbh->do("INSERT INTO `systempreferences` (`variable`, `value`, `options`, `explanation`, `type`) VALUES ('EnableOpacSearchHistory', '1', '', 'Enable or disable opac search history', 'YesNo')");
2781
2782         my $create = <<SEARCHHIST;
2783 CREATE TABLE IF NOT EXISTS `search_history` (
2784   `userid` int(11) NOT NULL,
2785   `sessionid` varchar(32) NOT NULL,
2786   `query_desc` varchar(255) NOT NULL,
2787   `query_cgi` varchar(255) NOT NULL,
2788   `total` int(11) NOT NULL,
2789   `time` timestamp NOT NULL default CURRENT_TIMESTAMP,
2790   KEY `userid` (`userid`),
2791   KEY `sessionid` (`sessionid`)
2792 ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='Opac search history results';
2793 SEARCHHIST
2794         $dbh->do($create);
2795
2796         print "Upgrade to $DBversion done (added OPAC search history preference and table)\n";
2797 }
2798
2799 $DBversion = "3.01.00.070";
2800 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
2801         $dbh->do("ALTER TABLE authorised_values ADD COLUMN `lib_opac` VARCHAR(80) default NULL AFTER `lib`");
2802         print "Upgrade to $DBversion done (Added a lib_opac field in authorised_values table)\n";
2803 }
2804
2805 $DBversion = "3.01.00.071";
2806 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
2807         $dbh->do("ALTER TABLE `subscription` ADD `enddate` date default NULL");
2808         $dbh->do("ALTER TABLE subscriptionhistory CHANGE enddate histenddate DATE default NULL");
2809         print "Upgrade to $DBversion done ( Adding enddate to subscription)\n";
2810 }
2811
2812 # Acquisitions update
2813
2814 $DBversion = "3.01.00.072";
2815 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
2816     $dbh->do("INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES('OpacPrivacy', '0', 'if ON, allows patrons to define their privacy rules (reading history)',NULL,'YesNo')");
2817     # create a new syspref for the 'Mr anonymous' patron
2818     $dbh->do("INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES('AnonymousPatron', '0', \"Set the identifier (borrowernumber) of the 'Mister anonymous' patron. Used for Suggestion and reading history privacy\",NULL,'')");
2819     # fill AnonymousPatron with AnonymousSuggestion value (copy)
2820     my $sth=$dbh->prepare("SELECT value FROM systempreferences WHERE variable='AnonSuggestions'");
2821     $sth->execute;
2822     my ($value) = $sth->fetchrow() || 0;
2823     $dbh->do("UPDATE systempreferences SET value='$value' WHERE variable='AnonymousPatron'");
2824     # set AnonymousSuggestion do YesNo
2825     # 1st, set the value (1/True if it had a borrowernumber)
2826     $dbh->do("UPDATE systempreferences SET value=1 WHERE variable='AnonSuggestions' AND value>0");
2827     # 2nd, change the type to Choice
2828     $dbh->do("UPDATE systempreferences SET type='YesNo' WHERE variable='AnonSuggestions'");
2829         # borrower reading record privacy : 0 : forever, 1 : laws, 2 : don't keep at all
2830     $dbh->do("ALTER TABLE `borrowers` ADD `privacy` INTEGER NOT NULL DEFAULT 1;");
2831     print "Upgrade to $DBversion done (add new syspref and column in borrowers)\n";
2832     SetVersion ($DBversion);
2833 }
2834
2835 $DBversion = '3.01.00.073';
2836 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
2837     $dbh->do('SET FOREIGN_KEY_CHECKS=0 ');
2838     $dbh->do(<<'END_SQL');
2839 CREATE TABLE IF NOT EXISTS `aqcontract` (
2840   `contractnumber` int(11) NOT NULL auto_increment,
2841   `contractstartdate` date default NULL,
2842   `contractenddate` date default NULL,
2843   `contractname` varchar(50) default NULL,
2844   `contractdescription` mediumtext,
2845   `booksellerid` int(11) not NULL,
2846     PRIMARY KEY  (`contractnumber`),
2847         CONSTRAINT `booksellerid_fk1` FOREIGN KEY (`booksellerid`)
2848         REFERENCES `aqbooksellers` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
2849 ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
2850 END_SQL
2851     $dbh->do('SET FOREIGN_KEY_CHECKS=1 ');
2852     print "Upgrade to $DBversion done (adding aqcontract table)\n";
2853     SetVersion ($DBversion);
2854 }
2855
2856 $DBversion = '3.01.00.074';
2857 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
2858     $dbh->do("ALTER TABLE `aqbasket` ADD COLUMN `basketname` varchar(50) default NULL AFTER `basketno`");
2859     $dbh->do("ALTER TABLE `aqbasket` ADD COLUMN `note` mediumtext AFTER `basketname`");
2860     $dbh->do("ALTER TABLE `aqbasket` ADD COLUMN `booksellernote` mediumtext AFTER `note`");
2861     $dbh->do("ALTER TABLE `aqbasket` ADD COLUMN `contractnumber` int(11) AFTER `booksellernote`");
2862     $dbh->do("ALTER TABLE `aqbasket` ADD FOREIGN KEY (`contractnumber`) REFERENCES `aqcontract` (`contractnumber`)");
2863     print "Upgrade to $DBversion done (edit aqbasket table done)\n";
2864     SetVersion ($DBversion);
2865 }
2866
2867 $DBversion = '3.01.00.075';
2868 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
2869     $dbh->do("ALTER TABLE `aqorders` ADD COLUMN `uncertainprice` tinyint(1)");
2870
2871     print "Upgrade to $DBversion done (adding uncertainprices)\n";
2872     SetVersion ($DBversion);
2873 }
2874
2875 $DBversion = '3.01.00.076';
2876 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
2877     $dbh->do('SET FOREIGN_KEY_CHECKS=0 ');
2878     $dbh->do("CREATE TABLE IF NOT EXISTS `aqbasketgroups` (
2879                          `id` int(11) NOT NULL auto_increment,
2880                          `name` varchar(50) default NULL,
2881                          `closed` tinyint(1) default NULL,
2882                          `booksellerid` int(11) NOT NULL,
2883                          PRIMARY KEY (`id`),
2884                          KEY `booksellerid` (`booksellerid`),
2885                          CONSTRAINT `aqbasketgroups_ibfk_1` FOREIGN KEY (`booksellerid`) REFERENCES `aqbooksellers` (`id`) ON UPDATE CASCADE ON DELETE CASCADE
2886                          ) ENGINE=InnoDB DEFAULT CHARSET=utf8;");
2887     $dbh->do("ALTER TABLE aqbasket ADD COLUMN `basketgroupid` int(11)");
2888     $dbh->do("ALTER TABLE aqbasket ADD FOREIGN KEY (`basketgroupid`) REFERENCES `aqbasketgroups` (`id`) ON UPDATE CASCADE ON DELETE SET NULL");
2889     $dbh->do("INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES ('pdfformat','pdfformat::layout2pages','Controls what script is used for printing (basketgroups)','','free')");
2890     $dbh->do('SET FOREIGN_KEY_CHECKS=1 ');
2891     print "Upgrade to $DBversion done (adding basketgroups)\n";
2892     SetVersion ($DBversion);
2893 }
2894 $DBversion = '3.01.00.077';
2895 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
2896
2897     $dbh->do("SET FOREIGN_KEY_CHECKS=0 ");
2898     # create a mapping table holding the info we need to match orders to budgets
2899     $dbh->do('DROP TABLE IF EXISTS fundmapping');
2900     $dbh->do(
2901         q|CREATE TABLE fundmapping AS
2902         SELECT aqorderbreakdown.ordernumber, branchcode, bookfundid, budgetdate, entrydate
2903         FROM aqorderbreakdown JOIN aqorders ON aqorderbreakdown.ordernumber = aqorders.ordernumber|);
2904     # match the new type of the corresponding field
2905     $dbh->do('ALTER TABLE fundmapping modify column bookfundid varchar(30)');
2906     # System did not ensure budgetdate was valid historically
2907     sanitize_zero_date('fundmapping', 'budgetdate');
2908     $dbh->do(q|UPDATE fundmapping SET budgetdate = entrydate WHERE budgetdate IS NULL|);
2909     # We save the map in fundmapping in case you need later processing
2910     $dbh->do(q|ALTER TABLE fundmapping add column aqbudgetid integer|);
2911     # these can speed processing up
2912     $dbh->do(q|CREATE INDEX fundmaporder ON fundmapping (ordernumber)|);
2913     $dbh->do(q|CREATE INDEX fundmapid ON fundmapping (bookfundid)|);
2914
2915     $dbh->do("DROP TABLE IF EXISTS `aqbudgetperiods` ");
2916
2917     $dbh->do(qq|
2918                     CREATE TABLE `aqbudgetperiods` (
2919                     `budget_period_id` int(11) NOT NULL auto_increment,
2920                     `budget_period_startdate` date NOT NULL,
2921                     `budget_period_enddate` date NOT NULL,
2922                     `budget_period_active` tinyint(1) default '0',
2923                     `budget_period_description` mediumtext,
2924                     `budget_period_locked` tinyint(1) default NULL,
2925                     `sort1_authcat` varchar(10) default NULL,
2926                     `sort2_authcat` varchar(10) default NULL,
2927                     PRIMARY KEY  (`budget_period_id`)
2928                     ) ENGINE=InnoDB  DEFAULT CHARSET=utf8 |);
2929
2930    $dbh->do(<<ADDPERIODS);
2931 INSERT INTO aqbudgetperiods (budget_period_startdate,budget_period_enddate,budget_period_active,budget_period_description,budget_period_locked)
2932 SELECT DISTINCT startdate, enddate, NOW() BETWEEN startdate and enddate, concat(startdate," ",enddate),NOT NOW() BETWEEN startdate AND enddate from aqbudget
2933 ADDPERIODS
2934 # SORRY , NO AQBUDGET/AQBOOKFUND -> AQBUDGETS IMPORT JUST YET,
2935 # BUT A NEW CLEAN AQBUDGETS TABLE CREATE FOR NOW..
2936 # DROP TABLE IF EXISTS `aqbudget`;
2937 #CREATE TABLE `aqbudget` (
2938 #  `bookfundid` varchar(10) NOT NULL default ',
2939 #    `startdate` date NOT NULL default 0,
2940 #         `enddate` date default NULL,
2941 #           `budgetamount` decimal(13,2) default NULL,
2942 #                 `aqbudgetid` tinyint(4) NOT NULL auto_increment,
2943 #                   `branchcode` varchar(10) default NULL,
2944     DropAllForeignKeys('aqbudget');
2945   #$dbh->do("drop table aqbudget;");
2946
2947
2948     my $maxbudgetid = $dbh->selectcol_arrayref(<<IDsBUDGET);
2949 SELECT MAX(aqbudgetid) from aqbudget
2950 IDsBUDGET
2951
2952 $$maxbudgetid[0] = 0 if !$$maxbudgetid[0];
2953
2954     $dbh->do(<<BUDGETAUTOINCREMENT);
2955 ALTER TABLE aqbudget AUTO_INCREMENT=$$maxbudgetid[0]
2956 BUDGETAUTOINCREMENT
2957
2958     $dbh->do(<<BUDGETNAME);
2959 ALTER TABLE aqbudget RENAME `aqbudgets`
2960 BUDGETNAME
2961
2962     $dbh->do(<<BUDGETS);
2963 ALTER TABLE `aqbudgets`
2964    CHANGE  COLUMN aqbudgetid `budget_id` int(11) NOT NULL AUTO_INCREMENT,
2965    CHANGE  COLUMN branchcode `budget_branchcode` varchar(10) default NULL,
2966    CHANGE  COLUMN budgetamount `budget_amount` decimal(28,6) NOT NULL default '0.00',
2967    CHANGE  COLUMN bookfundid   `budget_code` varchar(30) default NULL,
2968    ADD     COLUMN `budget_parent_id` int(11) default NULL,
2969    ADD     COLUMN `budget_name` varchar(80) default NULL,
2970    ADD     COLUMN `budget_encumb` decimal(28,6) default '0.00',
2971    ADD     COLUMN `budget_expend` decimal(28,6) default '0.00',
2972    ADD     COLUMN `budget_notes` mediumtext,
2973    ADD     COLUMN `budget_description` mediumtext,
2974    ADD     COLUMN `timestamp` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
2975    ADD     COLUMN `budget_amount_sublevel`  decimal(28,6) AFTER `budget_amount`,
2976    ADD     COLUMN `budget_period_id` int(11) default NULL,
2977    ADD     COLUMN `sort1_authcat` varchar(80) default NULL,
2978    ADD     COLUMN `sort2_authcat` varchar(80) default NULL,
2979    ADD     COLUMN `budget_owner_id` int(11) default NULL,
2980    ADD     COLUMN `budget_permission` int(1) default '0';
2981 BUDGETS
2982
2983     $dbh->do(<<BUDGETCONSTRAINTS);
2984 ALTER TABLE `aqbudgets`
2985    ADD CONSTRAINT `aqbudgets_ifbk_1` FOREIGN KEY (`budget_period_id`) REFERENCES `aqbudgetperiods` (`budget_period_id`) ON DELETE CASCADE ON UPDATE CASCADE
2986 BUDGETCONSTRAINTS
2987 #    $dbh->do(<<BUDGETPKDROP);
2988 #ALTER TABLE `aqbudgets`
2989 #   DROP PRIMARY KEY
2990 #BUDGETPKDROP
2991 #    $dbh->do(<<BUDGETPKADD);
2992 #ALTER TABLE `aqbudgets`
2993 #   ADD PRIMARY KEY budget_id
2994 #BUDGETPKADD
2995
2996
2997         my $query_period= $dbh->prepare(qq|SELECT budget_period_id from aqbudgetperiods where budget_period_startdate=? and budget_period_enddate=?|);
2998         my $query_bookfund= $dbh->prepare(qq|SELECT * from aqbookfund where bookfundid=?|);
2999         my $selectbudgets=$dbh->prepare(qq|SELECT * from aqbudgets|);
3000         my $updatebudgets=$dbh->prepare(qq|UPDATE aqbudgets SET budget_period_id= ? , budget_name=?, budget_branchcode=? where budget_id=?|);
3001         $selectbudgets->execute;
3002         while (my $databudget=$selectbudgets->fetchrow_hashref){
3003                 $query_period->execute ($$databudget{startdate},$$databudget{enddate});
3004                 my ($budgetperiodid)=$query_period->fetchrow;
3005                 $query_bookfund->execute ($$databudget{budget_code});
3006                 my $databf=$query_bookfund->fetchrow_hashref;
3007                 my $branchcode=$$databudget{budget_branchcode}||$$databf{branchcode};
3008                 $updatebudgets->execute($budgetperiodid,$$databf{bookfundname},$branchcode,$$databudget{budget_id});
3009         }
3010     $dbh->do(<<BUDGETDROPDATES);
3011 ALTER TABLE `aqbudgets`
3012    DROP startdate,
3013    DROP enddate
3014 BUDGETDROPDATES
3015
3016
3017     $dbh->do("DROP TABLE IF EXISTS `aqbudgets_planning` ");
3018     $dbh->do("CREATE TABLE  `aqbudgets_planning` (
3019                     `plan_id` int(11) NOT NULL auto_increment,
3020                     `budget_id` int(11) NOT NULL,
3021                     `budget_period_id` int(11) NOT NULL,
3022                     `estimated_amount` decimal(28,6) default NULL,
3023                     `authcat` varchar(30) NOT NULL,
3024                     `authvalue` varchar(30) NOT NULL,
3025                                         `display` tinyint(1) DEFAULT 1,
3026                         PRIMARY KEY  (`plan_id`),
3027                         CONSTRAINT `aqbudgets_planning_ifbk_1` FOREIGN KEY (`budget_id`) REFERENCES `aqbudgets` (`budget_id`) ON DELETE CASCADE ON UPDATE CASCADE
3028                         ) ENGINE=InnoDB DEFAULT CHARSET=utf8;");
3029
3030     $dbh->do("ALTER TABLE `aqorders`
3031                     ADD COLUMN `budget_id` tinyint(4) NOT NULL,
3032                     ADD COLUMN `budgetgroup_id` int(11) NOT NULL,
3033                     ADD COLUMN  `sort1_authcat` varchar(10) default NULL,
3034                     ADD COLUMN  `sort2_authcat` varchar(10) default NULL" );
3035                 # We need to map the orders to the budgets
3036                 # For Historic reasons this is more complex than it should be on occasions
3037                 my $budg_arr = $dbh->selectall_arrayref(
3038                     q|SELECT aqbudgets.budget_id, aqbudgets.budget_code, aqbudgetperiods.budget_period_startdate,
3039                     aqbudgetperiods.budget_period_enddate
3040                     FROM aqbudgets JOIN aqbudgetperiods ON aqbudgets.budget_period_id = aqbudgetperiods.budget_period_id
3041                     ORDER BY budget_code, budget_period_startdate|, { Slice => {} });
3042                 # We arbitarily order on start date, this means if you have overlapping periods the order will be
3043                 # linked to the latest matching budget YMMV
3044                 my $b_sth = $dbh->prepare(
3045                     'UPDATE fundmapping set aqbudgetid = ? where bookfundid =? AND budgetdate >= ? AND budgetdate <= ?');
3046                 for my $b ( @{$budg_arr}) {
3047                     $b_sth->execute($b->{budget_id}, $b->{budget_code}, $b->{budget_period_startdate}, $b->{budget_period_enddate});
3048                 }
3049                 # move the budgetids to aqorders
3050                 $dbh->do(q|UPDATE aqorders, fundmapping SET aqorders.budget_id = fundmapping.aqbudgetid
3051                     WHERE aqorders.ordernumber = fundmapping.ordernumber AND fundmapping.aqbudgetid IS NOT NULL|);
3052                 # NB fundmapping is left as an accontants trail also if you have budgetids that werent set
3053                 # you can decide what to do with them
3054
3055      $dbh->do(
3056          q|UPDATE aqorders, aqbudgets SET aqorders.budgetgroup_id = aqbudgets.budget_period_id
3057          WHERE aqorders.budget_id = aqbudgets.budget_id|);
3058                 # cannot do until aqorderbreakdown removed
3059 #    $dbh->do("DROP TABLE aqbookfund ");
3060 #    $dbh->do("ALTER TABLE aqorders  ADD FOREIGN KEY (`budget_id`) REFERENCES `aqbudgets` (`budget_id`) ON UPDATE CASCADE  " ); ????
3061     $dbh->do("SET FOREIGN_KEY_CHECKS=1 ");
3062
3063     print "Upgrade to $DBversion done (Adding new aqbudgetperiods, aqbudgets and aqbudget_planning tables  )\n";
3064     SetVersion ($DBversion);
3065 }
3066
3067
3068
3069 $DBversion = '3.01.00.078';
3070 if ( C4::Context->preference("Version") < TransformToNum($DBversion) ) {
3071     $dbh->do("ALTER TABLE aqbudgetperiods ADD COLUMN budget_period_total decimal(28,6)");
3072     print "Upgrade to $DBversion done (adds 'budget_period_total' column to aqbudgetperiods table)\n";
3073     SetVersion($DBversion);
3074 }
3075
3076
3077 $DBversion = '3.01.00.079';
3078 if ( C4::Context->preference("Version") < TransformToNum($DBversion) ) {
3079     $dbh->do("ALTER TABLE currency ADD COLUMN active  tinyint(1)");
3080
3081     print "Upgrade to $DBversion done (adds 'active' column to currencies table)\n";
3082     SetVersion($DBversion);
3083 }
3084
3085 $DBversion = '3.01.00.080';
3086 if ( C4::Context->preference("Version") < TransformToNum($DBversion) ) {
3087     $dbh->do(<<BUDG_PERM );
3088 INSERT INTO permissions (module_bit, code, description) VALUES
3089             (11, 'vendors_manage', 'Manage vendors'),
3090             (11, 'contracts_manage', 'Manage contracts'),
3091             (11, 'period_manage', 'Manage periods'),
3092             (11, 'budget_manage', 'Manage budgets'),
3093             (11, 'budget_modify', "Modify budget (can't create lines but can modify existing ones)"),
3094             (11, 'planning_manage', 'Manage budget plannings'),
3095             (11, 'order_manage', 'Manage orders & basket'),
3096             (11, 'group_manage', 'Manage orders & basketgroups'),
3097             (11, 'order_receive', 'Manage orders & basket'),
3098             (11, 'budget_add_del', "Add and delete budgets (but can't modify budgets)");
3099 BUDG_PERM
3100
3101     print "Upgrade to $DBversion done (adds permissions for the acquisitions module)\n";
3102     SetVersion($DBversion);
3103 }
3104
3105
3106 $DBversion = '3.01.00.081';
3107 if ( C4::Context->preference("Version") < TransformToNum($DBversion) ) {
3108     $dbh->do("ALTER TABLE aqbooksellers ADD COLUMN `gstrate` decimal(6,4) default NULL");
3109     if (my $gist=C4::Context->preference("gist")){
3110                 my $sql=$dbh->prepare("UPDATE aqbooksellers set `gstrate`=? ");
3111         $sql->execute($gist) ;
3112         }
3113     print "Upgrade to $DBversion done (added per-supplier gstrate setting)\n";
3114     SetVersion($DBversion);
3115 }
3116
3117 $DBversion = "3.01.00.082";
3118 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
3119     if (C4::Context->preference("opaclanguages") eq "fr") {
3120         $dbh->do(qq#INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES('AcqCreateItem','ordering',"Définit quand l'exemplaire est créé : à la commande, à la livraison, au catalogage",'ordering|receiving|cataloguing','Choice')#);
3121     } else {
3122         $dbh->do("INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES('AcqCreateItem','ordering','Define when the item is created : when ordering, when receiving, or in cataloguing module','ordering|receiving|cataloguing','Choice')");
3123     }
3124     print "Upgrade to $DBversion done (adding ReservesNeedReturns systempref, in circulation)\n";
3125     SetVersion ($DBversion);
3126 }
3127
3128 $DBversion = "3.01.00.083";
3129 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
3130     $dbh->do(qq|
3131  CREATE TABLE `aqorders_items` (
3132   `ordernumber` int(11) NOT NULL,
3133   `itemnumber` int(11) NOT NULL,
3134   `timestamp` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
3135   PRIMARY KEY  (`itemnumber`),
3136   KEY `ordernumber` (`ordernumber`)
3137 ) ENGINE=InnoDB DEFAULT CHARSET=utf8   |
3138     );
3139
3140     $dbh->do(qq| DROP TABLE aqorderbreakdown |);
3141     $dbh->do('DROP TABLE aqbookfund');
3142     print "Upgrade to $DBversion done (New aqorders_items table for acqui)\n";
3143     SetVersion ($DBversion);
3144 }
3145
3146 $DBversion = "3.01.00.084";
3147 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
3148     $dbh->do(  qq# INSERT INTO `systempreferences` VALUES ('CurrencyFormat','US','US|FR','Determines the display format of currencies. eg: ''36000'' is displayed as ''360 000,00''  in ''FR'' or 360,000.00''  in ''US''.','Choice')  #);
3149
3150     print "Upgrade to $DBversion done (CurrencyFormat syspref added)\n";
3151     SetVersion ($DBversion);
3152 }
3153
3154 $DBversion = "3.01.00.085";
3155 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
3156     $dbh->do("ALTER table aqorders drop column title");
3157     $dbh->do("ALTER TABLE `aqorders` CHANGE `budget_id` `budget_id` INT( 11 ) NOT NULL");
3158     print "Upgrade to $DBversion done update budget_id size that should not be a tinyint\n";
3159     SetVersion ($DBversion);
3160 }
3161
3162 $DBversion = "3.01.00.086";
3163 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
3164     $dbh->do(<<SUGGESTIONS);
3165 ALTER table suggestions
3166     ADD budgetid INT(11),
3167     ADD branchcode VARCHAR(10) default NULL,
3168     ADD acceptedby INT(11) default NULL,
3169     ADD accepteddate date default NULL,
3170     ADD suggesteddate date default NULL,
3171     ADD manageddate date default NULL,
3172     ADD rejectedby INT(11) default NULL,
3173     ADD rejecteddate date default NULL,
3174     ADD collectiontitle text default NULL,
3175     ADD itemtype VARCHAR(30) default NULL
3176     ;
3177 SUGGESTIONS
3178     print "Upgrade to $DBversion done (Suggestions)\n";
3179     SetVersion ($DBversion);
3180 }
3181
3182 $DBversion = "3.01.00.087";
3183 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
3184     $dbh->do("ALTER table aqbudgets drop column budget_amount_sublevel;");
3185     print "Upgrade to $DBversion done (Drop column budget_amount_sublevel from aqbudgets)\n";
3186     SetVersion ($DBversion);
3187 }
3188
3189 $DBversion = "3.01.00.088";
3190 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
3191     $dbh->do(  qq# INSERT INTO `systempreferences` VALUES ('intranetbookbag','1','','If ON, enables display of Cart feature in the intranet','YesNo')  #);
3192
3193     print "Upgrade to $DBversion done (intranetbookbag syspref added)\n";
3194     SetVersion ($DBversion);
3195 }
3196
3197 $DBversion = "3.01.00.090";
3198 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
3199 $dbh->do("
3200        INSERT INTO `permissions` (`module_bit`, `code`, `description`) VALUES
3201                 (16, 'execute_reports', 'Execute SQL reports'),
3202                 (16, 'create_reports', 'Create SQL Reports')
3203         ");
3204
3205     print "Upgrade to $DBversion done (granular permissions for guided reports added)\n";
3206     SetVersion ($DBversion);
3207 }
3208
3209 $DBversion = "3.01.00.091";
3210 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
3211 $dbh->do("
3212         UPDATE `systempreferences` SET `options` = 'holdings|serialcollection|subscriptions'
3213         WHERE `systempreferences`.`variable` = 'opacSerialDefaultTab' LIMIT 1
3214         ");
3215
3216     print "Upgrade to $DBversion done (opac-detail default tag updated)\n";
3217     SetVersion ($DBversion);
3218 }
3219
3220 $DBversion = "3.01.00.092";
3221 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
3222     if (C4::Context->preference("opaclanguages") =~ /fr/) {
3223         $dbh->do(qq{
3224 INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES ('RoutingListAddReserves','1','Si activé, des reservations sont automatiquement créées pour chaque lecteur de la liste de circulation d''un numéro de périodique','','YesNo');
3225         });
3226         }else{
3227         $dbh->do(qq{
3228 INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES ('RoutingListAddReserves','1','If ON the patrons on routing lists are automatically added to holds on the issue.','','YesNo');
3229         });
3230         }
3231     print "Upgrade to $DBversion done (Added RoutingListAddReserves syspref)\n";
3232     SetVersion ($DBversion);
3233 }
3234
3235 $DBversion = "3.01.00.093";
3236 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
3237         $dbh->do(qq{
3238         ALTER TABLE biblioitems ADD INDEX issn_idx (issn);
3239         });
3240     print "Upgrade to $DBversion done (added index to ISSN)\n";
3241     SetVersion ($DBversion);
3242 }
3243
3244 $DBversion = "3.01.00.094";
3245 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
3246         $dbh->do(qq{
3247         ALTER TABLE aqbasketgroups ADD deliveryplace VARCHAR(10) default NULL, ADD deliverycomment VARCHAR(255) default NULL;
3248         });
3249
3250     print "Upgrade to $DBversion done (adding deliveryplace deliverycomment to basketgroups)\n";
3251     SetVersion ($DBversion);
3252 }
3253
3254 $DBversion = "3.01.00.095";
3255 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
3256         $dbh->do(qq{
3257         ALTER TABLE items ADD stocknumber VARCHAR(32) DEFAULT NULL COMMENT "stores the inventory number";
3258         });
3259         $dbh->do(qq{
3260         ALTER TABLE items ADD UNIQUE INDEX itemsstocknumberidx (stocknumber);
3261         });
3262         $dbh->do(qq{
3263         ALTER TABLE deleteditems ADD stocknumber VARCHAR(32) DEFAULT NULL COMMENT "stores the inventory number of deleted items";
3264         });
3265         $dbh->do(qq{
3266         ALTER TABLE deleteditems ADD UNIQUE INDEX deleteditemsstocknumberidx (stocknumber);
3267         });
3268         if (C4::Context->preference('marcflavour') eq 'UNIMARC'){
3269                 $dbh->do(qq{
3270         INSERT IGNORE INTO marc_subfield_structure (frameworkcode,tagfield, tagsubfield, tab, repeatable, mandatory,kohafield)
3271         SELECT DISTINCT (frameworkcode),995,"j",10,0,0,"items.stocknumber" from biblio_framework ;
3272                 });
3273                 #Previously, copynumber was used as stocknumber
3274                 $dbh->do(qq{
3275         UPDATE items set stocknumber=copynumber;
3276                 });
3277                 $dbh->do(qq{
3278         UPDATE items set copynumber=NULL;
3279                 });
3280         }
3281     print "Upgrade to $DBversion done (stocknumber field added)\n";
3282     SetVersion ($DBversion);
3283 }
3284
3285 $DBversion = "3.01.00.096";
3286 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
3287     $dbh->do("INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES ('OrderPdfTemplate','','Uploads a PDF template to use for printing baskets','NULL','Upload')");
3288     $dbh->do("UPDATE systempreferences SET variable='OrderPdfFormat' WHERE variable='pdfformat'");
3289     print "Upgrade to $DBversion done (PDF orders system preferences added and updated)\n";
3290     SetVersion ($DBversion);
3291 }
3292
3293 $DBversion = "3.01.00.097";
3294 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
3295         $dbh->do(qq{
3296         ALTER TABLE aqbasketgroups ADD billingplace VARCHAR(10) NOT NULL AFTER deliverycomment;
3297         });
3298
3299     print "Upgrade to $DBversion done (Adding billingplace to aqbasketgroups)\n";
3300     SetVersion ($DBversion);
3301 }
3302
3303 $DBversion = "3.01.00.098";
3304 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
3305         $dbh->do(qq{
3306         ALTER TABLE auth_subfield_structure MODIFY frameworkcode VARCHAR(10) NULL;
3307         });
3308
3309     print "Upgrade to $DBversion done (changing frameworkcode length in auth_subfield_structure)\n";
3310     SetVersion ($DBversion);
3311 }
3312
3313 $DBversion = "3.01.00.099";
3314 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
3315         $dbh->do(qq{
3316                 INSERT INTO `permissions` (`module_bit`, `code`, `description`) VALUES
3317                 (9, 'edit_catalogue', 'Edit catalogue'),
3318                 (9, 'fast_cataloging', 'Fast cataloging')
3319         });
3320
3321     print "Upgrade to $DBversion done (granular permissions for cataloging added)\n";
3322     SetVersion ($DBversion);
3323 }
3324
3325 $DBversion = "3.01.00.100";
3326 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
3327         $dbh->do("INSERT INTO `systempreferences` (`variable`, `value`, `options`, `explanation`, `type`) VALUES ('casAuthentication', '0', '', 'Enable or disable CAS authentication', 'YesNo'), ('casLogout', '1', '', 'Does a logout from Koha should also log out of CAS ?', 'YesNo'), ('casServerUrl', 'https://localhost:8443/cas', '', 'URL of the cas server', 'Free')");
3328         print "Upgrade to $DBversion done (added CAS authentication system preferences)\n";
3329     SetVersion ($DBversion);
3330 }
3331
3332 $DBversion = "3.01.00.101";
3333 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
3334         $dbh->do(
3335         "INSERT INTO systempreferences
3336            (variable, value, options, explanation, type)
3337          VALUES (
3338             'OverdueNoticeBcc', '', '',
3339             'Email address to Bcc outgoing notices sent by email',
3340             'free')
3341          ");
3342         print "Upgrade to $DBversion done (added OverdueNoticeBcc system preferences)\n";
3343     SetVersion ($DBversion);
3344 }
3345 $DBversion = "3.01.00.102";
3346 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
3347     $dbh->do(
3348     "UPDATE permissions set description = 'Edit catalog (Modify bibliographic/holdings data)' where module_bit = 9 and code = 'edit_catalogue'"
3349     );
3350         print "Upgrade to $DBversion done (fixed spelling error in edit_catalogue permission)\n";
3351     SetVersion ($DBversion);
3352 }
3353
3354 $DBversion = "3.01.00.103";
3355 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
3356         $dbh->do("INSERT INTO permissions (module_bit, code, description) VALUES (13, 'moderate_tags', 'Moderate patron tags')");
3357         print "Upgrade to $DBversion done (adding patron permissions for tags tool)\n";
3358     SetVersion ($DBversion);
3359 }
3360
3361 $DBversion = "3.01.00.104";
3362 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
3363
3364     my ($maninv_count, $borrnotes_count);
3365     eval { $maninv_count = $dbh->do("SELECT 1 FROM authorised_values WHERE category='MANUAL_INV'"); };
3366     if ($maninv_count == 0) {
3367         $dbh->do("INSERT INTO authorised_values (category,authorised_value,lib) VALUES ('MANUAL_INV','Copier Fees','.25')");
3368     }
3369     eval { $borrnotes_count = $dbh->do("SELECT 1 FROM authorised_values WHERE category='BOR_NOTES'"); };
3370     if ($borrnotes_count == 0) {
3371         $dbh->do("INSERT INTO authorised_values (category,authorised_value,lib) VALUES ('BOR_NOTES','ADDR','Address Notes')");
3372     }
3373
3374     $dbh->do("INSERT INTO authorised_values (category,authorised_value,lib) VALUES ('LOC','CART','Book Cart')");
3375     $dbh->do("INSERT INTO authorised_values (category,authorised_value,lib) VALUES ('LOC','PROC','Processing Center')");
3376
3377         print "Upgrade to $DBversion done ( add defaults to authorized values for MANUAL_INV and BOR_NOTES and add new default LOC authorized values for shelf to cart processing )\n";
3378         SetVersion ($DBversion);
3379 }
3380
3381
3382 $DBversion = "3.01.00.105";
3383 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
3384     $dbh->do("
3385       CREATE TABLE `collections` (
3386         `colId` int(11) NOT NULL auto_increment,
3387         `colTitle` varchar(100) NOT NULL default '',
3388         `colDesc` text NOT NULL,
3389         `colBranchcode` varchar(4) default NULL COMMENT 'branchcode for branch where item should be held.',
3390         PRIMARY KEY  (`colId`)
3391       ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
3392     ");
3393
3394     $dbh->do("
3395       CREATE TABLE `collections_tracking` (
3396         `ctId` int(11) NOT NULL auto_increment,
3397         `colId` int(11) NOT NULL default '0' COMMENT 'collections.colId',
3398         `itemnumber` int(11) NOT NULL default '0' COMMENT 'items.itemnumber',
3399         PRIMARY KEY  (`ctId`)
3400       ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
3401     ");
3402     $dbh->do("
3403         INSERT INTO permissions (module_bit, code, description)
3404         VALUES ( 13, 'rotating_collections', 'Manage Rotating collections')" );
3405         print "Upgrade to $DBversion done (added collection and collection_tracking tables for rotating collections functionality)\n";
3406     SetVersion ($DBversion);
3407 }
3408 $DBversion = "3.01.00.106";
3409 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
3410         $dbh->do("INSERT INTO `systempreferences` (variable,value,options,explanation,type) VALUES ( 'OpacAddMastheadLibraryPulldown', '0', '', 'Adds a pulldown menu to select the library to search on the opac masthead.', 'YesNo' )");
3411         print "Upgrade to $DBversion done (added OpacAddMastheadLibraryPulldown system preferences)\n";
3412     SetVersion ($DBversion);
3413 }
3414
3415 $DBversion = '3.01.00.107';
3416 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
3417     my $upgrade_script = C4::Context->config("intranetdir") . "/installer/data/mysql/patroncards_upgrade.pl";
3418     system("perl $upgrade_script");
3419     print "Upgrade to $DBversion done (Migrated labels and patroncards tables and data to new schema.)\n";
3420     SetVersion ($DBversion);
3421 }
3422
3423 $DBversion = '3.01.00.108';
3424 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
3425         $dbh->do(qq{
3426     ALTER TABLE `export_format` ADD `csv_separator` VARCHAR( 2 ) NOT NULL AFTER `marcfields` ,
3427     ADD `field_separator` VARCHAR( 2 ) NOT NULL AFTER `csv_separator` ,
3428     ADD `subfield_separator` VARCHAR( 2 ) NOT NULL AFTER `field_separator`
3429     });
3430         print "Upgrade to $DBversion done (added separators for csv export)\n";
3431     SetVersion ($DBversion);
3432 }
3433
3434 $DBversion = "3.01.00.109";
3435 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
3436         $dbh->do(qq{
3437         ALTER TABLE `export_format` ADD `encoding` VARCHAR(255) NOT NULL AFTER `subfield_separator`
3438         });
3439         print "Upgrade to $DBversion done (added encoding for csv export)\n";
3440     SetVersion ($DBversion);
3441 }
3442
3443 $DBversion = '3.01.00.110';
3444 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
3445     $dbh->do('ALTER TABLE `categories` ADD COLUMN `enrolmentperioddate` DATE NULL DEFAULT NULL AFTER `enrolmentperiod`');
3446     print "Upgrade to $DBversion done (Add enrolment period date support)\n";
3447     SetVersion ($DBversion);
3448 }
3449
3450 $DBversion = '3.01.00.111';
3451 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
3452     print "Upgrade to $DBversion done (mark DBrev for 3.2-alpha release)\n";
3453     SetVersion ($DBversion);
3454 }
3455
3456 $DBversion = '3.01.00.112';
3457 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
3458         $dbh->do("INSERT INTO `systempreferences` (variable,value,options,explanation,type) VALUES ('SpineLabelShowPrintOnBibDetails', '0', '', 'If turned on, a \"Print Label\" link will appear for each item on the bib details page in the staff interface.', 'YesNo');");
3459         print "Upgrade to $DBversion done ( added Show Spine Label Printer on Bib Items Details preferences )\n";
3460     SetVersion ($DBversion);
3461 }
3462
3463 $DBversion = '3.01.00.113';
3464 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
3465     my $value = C4::Context->preference("XSLTResultsDisplay");
3466     $dbh->do(
3467         "INSERT INTO systempreferences (variable,value,type)
3468          VALUES('OPACXSLTResultsDisplay',?,'YesNo')", {}, $value ? 1 : 0);
3469     $value = C4::Context->preference("XSLTDetailsDisplay");
3470     $dbh->do(
3471         "INSERT INTO systempreferences (variable,value,type)
3472          VALUES('OPACXSLTDetailsDisplay',?,'YesNo')", {}, $value ? 1 : 0);
3473     print "Upgrade to $DBversion done (added two new syspref: OPACXSLTResultsDisplay and OPACXSLTDetailDisplay). You may have to go in Admin > System preference to tweak XSLT related syspref both in OPAC and Search tabs.\n";
3474     SetVersion ($DBversion);
3475 }
3476
3477 $DBversion = '3.01.00.114';
3478 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
3479     $dbh->do("INSERT INTO systempreferences (variable,value,explanation,options,type)VALUES('AutoSelfCheckAllowed', '0', 'For corporate and special libraries which want web-based self-check available from any PC without the need for a manual staff login. Most libraries will want to leave this turned off. If on, requires self-check ID and password to be entered in AutoSelfCheckID and AutoSelfCheckPass sysprefs.', '', 'YesNo')");
3480     $dbh->do("INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES('AutoSelfCheckID','','Staff ID with circulation rights to be used for automatic web-based self-check. Only applies if AutoSelfCheckAllowed syspref is turned on.','','free')");
3481     $dbh->do("INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES('AutoSelfCheckPass','','Password to be used for automatic web-based self-check. Only applies if AutoSelfCheckAllowed syspref is turned on.','','free')");
3482         print "Upgrade to $DBversion done ( Added AutoSelfCheckAllowed, AutoSelfCheckID, and AutoShelfCheckPass system preference )\n";
3483     SetVersion ($DBversion);
3484 }
3485
3486 $DBversion = '3.01.00.115';
3487 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
3488     $dbh->do('UPDATE aqorders SET quantityreceived = 0 WHERE quantityreceived IS NULL');
3489     $dbh->do('ALTER TABLE aqorders MODIFY COLUMN quantityreceived smallint(6) NOT NULL DEFAULT 0');
3490         print "Upgrade to $DBversion done ( Default aqorders.quantityreceived to 0 )\n";
3491     SetVersion ($DBversion);
3492 }
3493
3494 $DBversion = '3.01.00.116';
3495 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
3496         if (C4::Context->preference('OrderPdfFormat') eq 'pdfformat::example'){
3497                 $dbh->do("UPDATE `systempreferences` set value='pdfformat::layout2pages' WHERE variable='OrderPdfFormat'");
3498         }
3499         print "Upgrade to $DBversion done (corrected default OrderPdfFormat value if still set wrong )\n";
3500     SetVersion ($DBversion);
3501 }
3502
3503 $DBversion = '3.01.00.117';
3504 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
3505     $dbh->do("UPDATE language_rfc4646_to_iso639 SET iso639_2_code = 'por' WHERE rfc4646_subtag='pt' ");
3506     print "Upgrade to $DBversion done (corrected ISO 639-2 language code for Portuguese)\n";
3507     SetVersion ($DBversion);
3508 }
3509
3510 $DBversion = '3.01.00.118';
3511 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
3512     my ($count) = $dbh->selectrow_array("SELECT count(*) FROM information_schema.columns
3513                                          WHERE table_name = 'aqbudgets_planning'
3514                                          AND column_name = 'display'");
3515     if ($count < 1) {
3516         $dbh->do("ALTER TABLE aqbudgets_planning ADD COLUMN display tinyint(1) DEFAULT 1");
3517     }
3518     print "Upgrade to $DBversion done (bug 4203: add display column to aqbudgets_planning if missing)\n";
3519     SetVersion ($DBversion);
3520 }
3521
3522 $DBversion = '3.01.00.119';
3523 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
3524     eval{require Locale::Currency::Format};
3525     if (!$@) {
3526         print "Upgrade to $DBversion done (Locale::Currency::Format installed.)\n";
3527         SetVersion ($DBversion);
3528     }
3529     else {
3530         print "Upgrade to $DBversion done.\n";
3531         print "NOTICE: The Locale::Currency::Format package is not installed on your system or not found in \@INC.\nThis dependency is required in order to include fine information in overdue notices.\nPlease ask your system administrator to install this package.\n";
3532         SetVersion ($DBversion);
3533     }
3534 }
3535
3536 $DBversion = '3.01.00.120';
3537 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
3538     $dbh->do(q{
3539 INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES('soundon','0','Enable circulation sounds during checkin and checkout in the staff interface.  Not supported by all web browsers yet.','','YesNo');
3540 });
3541     print "Upgrade to $DBversion done (bug 1080: add soundon system preference for circulation sounds)\n";
3542     SetVersion ($DBversion);
3543 }
3544
3545 $DBversion = '3.01.00.121';
3546 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
3547     $dbh->do("ALTER TABLE `reserves` ADD `expirationdate` DATE DEFAULT NULL");
3548     $dbh->do("ALTER TABLE `reserves` ADD `lowestPriority` tinyint(1) NOT NULL");
3549     $dbh->do("ALTER TABLE `old_reserves` ADD `expirationdate` DATE DEFAULT NULL");
3550     $dbh->do("ALTER TABLE `old_reserves` ADD `lowestPriority` tinyint(1) NOT NULL");
3551     print "Upgrade to $DBversion done ( Added Additional Fields to Reserves tables )\n";
3552     SetVersion ($DBversion);
3553 }
3554
3555 $DBversion = '3.01.00.122';
3556 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
3557     $dbh->do(q{
3558       INSERT INTO systempreferences (variable,value,explanation,options,type)
3559       VALUES ('OAI-PMH:ConfFile', '', 'If empty, Koha OAI Server operates in normal mode, otherwise it operates in extended mode.','','File');
3560 });
3561     print "Upgrade to $DBversion done. — Add a new system preference OAI-PMF:ConfFile\n";
3562     SetVersion ($DBversion);
3563 }
3564
3565 $DBversion = "3.01.00.123";
3566 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
3567     $dbh->do("INSERT INTO `permissions` (`module_bit`, `code`, `description`) VALUES
3568         (6, 'place_holds', 'Place holds for patrons')");
3569     $dbh->do("INSERT INTO `permissions` (`module_bit`, `code`, `description`) VALUES
3570         (6, 'modify_holds_priority', 'Modify holds priority')");
3571     $dbh->do("UPDATE `userflags` SET `flagdesc` = 'Place and modify holds for patrons' WHERE `flag` = 'reserveforothers'");
3572     print "Upgrade to $DBversion done (Add granular permission for holds modification and update description of reserveforothers permission)\n";
3573     SetVersion ($DBversion);
3574 }
3575
3576 $DBversion = '3.01.00.124';
3577 if (C4::Context->preference('Version') < TransformToNum($DBversion)){
3578     $dbh->do("
3579         INSERT INTO `letter` (module, code, name, title, content)         VALUES('reserves', 'HOLDPLACED', 'Hold Placed on Item', 'Hold Placed on Item','A hold has been placed on the following item : <<title>> (<<biblionumber>>) by the user <<firstname>> <<surname>> (<<cardnumber>>).');
3580     ");
3581     print "Upgrade to $DBversion done (bug 3242: add HOLDPLACED letter template, which is used when emailLibrarianWhenHoldIsPlaced is enabled)\n";
3582     SetVersion ($DBversion);
3583 }
3584
3585 $DBversion = '3.01.00.125';
3586 if (C4::Context->preference('Version') < TransformToNum($DBversion)){
3587     $dbh->do("
3588         INSERT INTO `systempreferences` ( `variable` , `value` , `options` , `explanation` , `type` ) VALUES ( 'PrintNoticesMaxLines', '0', '', 'If greater than 0, sets the maximum number of lines an overdue notice will print. If the number of items is greater than this number, the notice will end with a warning asking the borrower to check their online account for a full list of overdue items.', 'Integer' );
3589     ");
3590     $dbh->do("
3591         INSERT INTO message_transport_types (message_transport_type) values ('print');
3592     ");
3593     print "Upgrade to $DBversion done (bug 3482: Printable hold and overdue notices)\n";
3594     SetVersion ($DBversion);
3595 }
3596
3597 $DBversion = "3.01.00.126";
3598 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
3599         $dbh->do("INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES ('ILS-DI','0','Enable ILS-DI services. See http://your.opac.name/cgi-bin/koha/ilsdi.pl for online documentation.','','YesNo')");
3600         $dbh->do("INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES ('ILS-DI:AuthorizedIPs','127.0.0.1','A comma separated list of IP addresses authorized to access the web services.','','free')");
3601
3602     print "Upgrade to $DBversion done (Adding ILS-DI updates and ILS-DI:AuthorizedIPs)\n";
3603     SetVersion ($DBversion);
3604 }
3605
3606 $DBversion = '3.01.00.127';
3607 if (C4::Context->preference('Version') < TransformToNum($DBversion)){
3608     $dbh->do("ALTER TABLE messages CHANGE branchcode branchcode varchar(10);");
3609     print "Upgrade to $DBversion done (bug 4190: messages in patron account did not work with branchcodes > 4)\n";
3610     SetVersion ($DBversion);
3611 }
3612
3613 $DBversion = '3.01.00.128';
3614 if (C4::Context->preference('Version') < TransformToNum($DBversion)){
3615     $dbh->do('CREATE INDEX budget_id ON aqorders (budget_id );');
3616     print "Upgrade to $DBversion done (bug 4331: index orders by budget_id)\n";
3617     SetVersion ($DBversion);
3618 }
3619
3620 $DBversion = "3.01.00.129";
3621 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
3622         $dbh->do("UPDATE `permissions` SET `code` = 'items_batchdel' WHERE `permissions`.`module_bit` =13 AND `permissions`.`code` = 'batchdel' LIMIT 1 ;");
3623         $dbh->do("UPDATE `permissions` SET `code` = 'items_batchmod' WHERE `permissions`.`module_bit` =13 AND `permissions`.`code` = 'batchmod' LIMIT 1 ;");
3624         print "Upgrade to $DBversion done (Change permissions names for item batch modification / deletion)\n";
3625
3626     SetVersion ($DBversion);
3627 }
3628
3629 $DBversion = "3.01.00.130";
3630 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
3631     sanitize_zero_date('reserves', 'expirationdate');
3632     print "Upgrade to $DBversion done (change reserves.expirationdate values of 0000-00-00 to NULL (bug 1532)\n";
3633     SetVersion ($DBversion);
3634 }
3635
3636 $DBversion = "3.01.00.131";
3637 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
3638         $dbh->do(q{
3639 INSERT IGNORE INTO message_transport_types (message_transport_type) VALUES ('print'),('feed');
3640     });
3641     print "Upgrade to $DBversion done (adding print and feed message transport types)\n";
3642     SetVersion ($DBversion);
3643 }
3644
3645 $DBversion = "3.01.00.132";
3646 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
3647         $dbh->do(q{
3648     ALTER TABLE language_descriptions ADD INDEX subtag_type_lang (subtag, type, lang);
3649     });
3650     print "Upgrade to $DBversion done (Adding index to language_descriptions table)\n";
3651     SetVersion ($DBversion);
3652 }
3653
3654 $DBversion = '3.01.00.133';
3655 if (C4::Context->preference('Version') < TransformToNum($DBversion)){
3656     $dbh->do("INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES ('OverduesBlockCirc','noblock','When checking out an item should overdues block checkout, generate a confirmation dialogue, or allow checkout','noblock|confirmation|block','Choice')");
3657     print "Upgrade to $DBversion done (bug 4405: added OverduesBlockCirc syspref to control whether circulation is blocked if a borrower has overdues)\n";
3658     SetVersion ($DBversion);
3659 }
3660
3661 $DBversion = '3.01.00.134';
3662 if (C4::Context->preference('Version') < TransformToNum($DBversion)){
3663     $dbh->do("INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES ('DisplayMultiPlaceHold','1','Display the ability to place multiple holds or not','','YesNo')");
3664     print "Upgrade to $DBversion done (adding syspref DisplayMultiPlaceHold to control whether multiple holds can be placed from the search results page)\n";
3665     SetVersion ($DBversion);
3666 }
3667
3668 $DBversion = '3.01.00.135';
3669 if (C4::Context->preference('Version') < TransformToNum($DBversion)){
3670     $dbh->do("
3671         INSERT INTO `letter` (module, code, name, title, content) VALUES
3672 ('reserves', 'HOLD_PRINT', 'Hold Available for Pickup (print notice)', 'Hold Available for Pickup (print notice)', '<<branches.branchname>>\r\n<<branches.branchaddress1>>\r\n<<branches.branchaddress2>>\r\n\r\n\r\nChange Service Requested\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n<<borrowers.firstname>> <<borrowers.surname>>\r\n<<borrowers.address>>\r\n<<borrowers.city>> <<borrowers.zipcode>>\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n<<borrowers.firstname>> <<borrowers.surname>> <<borrowers.cardnumber>>\r\n\r\nYou have a hold available for pickup as of <<reserves.waitingdate>>:\r\n\r\nTitle: <<biblio.title>>\r\nAuthor: <<biblio.author>>\r\nCopy: <<items.copynumber>>\r\n')
3673 ");
3674     print "Upgrade to $DBversion done (bug 4377: added HOLD_PRINT message template)\n";
3675     SetVersion ($DBversion);
3676 }
3677
3678 $DBversion = '3.01.00.136';
3679 if (C4::Context->preference('Version') < TransformToNum($DBversion)){
3680     $dbh->do(qq{
3681 INSERT INTO permissions (module_bit, code, description) VALUES
3682    ( 9, 'edit_items', 'Edit Items');});
3683     print "Upgrade to $DBversion done (Adding a new permission to edit items)\n";
3684     SetVersion ($DBversion);
3685 }
3686
3687 $DBversion = "3.01.00.137";
3688 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
3689         $dbh->do("
3690           INSERT INTO permissions (module_bit, code, description) VALUES
3691           (15, 'check_expiration', 'Check the expiration of a serial'),
3692           (15, 'claim_serials', 'Claim missing serials'),
3693           (15, 'create_subscription', 'Create a new subscription'),
3694           (15, 'delete_subscription', 'Delete an existing subscription'),
3695           (15, 'edit_subscription', 'Edit an existing subscription'),
3696           (15, 'receive_serials', 'Serials receiving'),
3697           (15, 'renew_subscription', 'Renew a subscription'),
3698           (15, 'routing', 'Routing');
3699                  ");
3700     print "Upgrade to $DBversion done (adding granular permissions for serials)\n";
3701     SetVersion ($DBversion);
3702 }
3703
3704 $DBversion = "3.01.00.138";
3705 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
3706     $dbh->do("DELETE FROM systempreferences WHERE variable = 'GranularPermissions'");
3707     print "Upgrade to $DBversion done (bug 4896: removing GranularPermissions syspref; use of granular permissions is now the default)\n";
3708     SetVersion ($DBversion);
3709 }
3710
3711 $DBversion = '3.01.00.139';
3712 if (C4::Context->preference('Version') < TransformToNum($DBversion)){
3713     $dbh->do("ALTER TABLE message_attributes CHANGE message_name message_name varchar(40);");
3714     print "Upgrade to $DBversion done (bug 3682: change message_name from varchar(20) to varchar(40))\n";
3715     SetVersion ($DBversion);
3716 }
3717
3718 $DBversion = '3.01.00.140';
3719 if (C4::Context->preference('Version') < TransformToNum($DBversion)){
3720     $dbh->do("UPDATE systempreferences SET value = '0' WHERE variable = 'TagsModeration' AND value is NULL");
3721     print "Upgrade to $DBversion done (bug 4312 TagsModeration changed from NULL to 0)\n";
3722     SetVersion ($DBversion);
3723 }
3724
3725 $DBversion = '3.01.00.141';
3726 if (C4::Context->preference('Version') < TransformToNum($DBversion)){
3727     $dbh->do(qq{DELETE FROM message_attributes WHERE message_attribute_id=3;});
3728     $dbh->do(qq{DELETE FROM letter WHERE code='EVENT' AND title='Upcoming Library Event';});
3729     print "Upgrade to $DBversion done Remove upcoming events messaging option (bug 2434)\n";
3730     SetVersion ($DBversion);
3731 }
3732
3733 $DBversion = '3.01.00.142';
3734 if (C4::Context->preference('Version') < TransformToNum($DBversion)){
3735     $dbh->do(qq{DELETE FROM message_transports WHERE message_attribute_id=3;});
3736     print "Upgrade to $DBversion done (Remove upcoming events messaging option part 2 (bug 2434))\n";
3737     SetVersion ($DBversion);
3738 }
3739
3740 $DBversion = '3.01.00.143';
3741 if (C4::Context->preference('Version') < TransformToNum($DBversion)){
3742     $dbh->do(qq{CREATE INDEX auth_value_idx ON authorised_values (authorised_value)});
3743     $dbh->do(qq{CREATE INDEX auth_val_cat_idx ON borrower_attribute_types (authorised_value_category)});
3744     print "Upgrade to $DBversion done (Create index on authorised_values and borrower_attribute_types (bug 4139))\n";
3745     SetVersion ($DBversion);
3746 }
3747
3748 $DBversion = '3.01.00.144';
3749 if (C4::Context->preference('Version') < TransformToNum($DBversion)){
3750     $dbh->do(qq{UPDATE systempreferences SET value='normal' where value='default' and variable='IntranetBiblioDefaultView'});
3751     print "Upgrade to $DBversion done (Update the 'default' to 'normal' for the IntranetBiblioDefaultView syspref (bug 5007))\n";
3752     SetVersion ($DBversion);
3753 }
3754
3755 $DBversion = "3.01.00.145";
3756 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
3757     $dbh->do("ALTER TABLE borrowers ADD KEY `guarantorid` (guarantorid);");
3758     print "Upgrade to $DBversion done (Add index on guarantorid)\n";
3759     SetVersion ($DBversion);
3760 }
3761
3762 $DBversion = '3.01.00.999';
3763 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
3764     print "Upgrade to $DBversion done (3.2.0 release candidate)\n";
3765     SetVersion ($DBversion);
3766 }
3767
3768 $DBversion = "3.02.00.000";
3769 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
3770     my $value = $dbh->selectrow_array("SELECT value FROM systempreferences WHERE variable = 'HomeOrHoldingBranch'");
3771     $dbh->do("INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES('HomeOrHoldingBranchReturn','$value','Used by Circulation to determine which branch of an item to check checking-in items','holdingbranch|homebranch','Choice');");
3772     print "Upgrade to $DBversion done (Add HomeOrHoldingBranchReturn system preference)\n";
3773     SetVersion ($DBversion);
3774 }
3775
3776 $DBversion = "3.02.00.001";
3777 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
3778     $dbh->do(q{DELETE FROM systempreferences WHERE variable IN (
3779                 'holdCancelLength',
3780                 'PINESISBN',
3781                 'sortbynonfiling',
3782                 'TemplateEncoding',
3783                 'OPACSubscriptionDisplay',
3784                 'OPACDisplayExtendedSubInfo',
3785                 'OAI-PMH:Set',
3786                 'OAI-PMH:Subset',
3787                 'libraryAddress',
3788                 'kohaspsuggest',
3789                 'OrderPdfTemplate',
3790                 'marc',
3791                 'acquisitions',
3792                 'MIME')
3793                }
3794     );
3795     print "Upgrade to $DBversion done (bug 3756: remove disused system preferences)\n";
3796     SetVersion ($DBversion);
3797 }
3798
3799 $DBversion = "3.02.00.002";
3800 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
3801     $dbh->do(q{DELETE FROM systempreferences WHERE variable = 'OpacPrivacy'});
3802     print "Upgrade to $DBversion done (bug 3881: remove unused OpacPrivacy system preference)\n";
3803     SetVersion ($DBversion);
3804 }
3805
3806 $DBversion = "3.02.00.003";
3807 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
3808     $dbh->do(q{UPDATE systempreferences SET variable = 'ILS-DI:AuthorizedIPs' WHERE variable = 'ILS-DI:Authorized_IPs'});
3809     print "Upgrade to $DBversion done (correct ILS-DI:AuthorizedIPs)\n";
3810     SetVersion ($DBversion);
3811 }
3812
3813 $DBversion = "3.02.00.004";
3814 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
3815     print "Upgrade to $DBversion done (3.2.0 general release)\n";
3816     SetVersion ($DBversion);
3817 }
3818 # This is the point where 3.2.x and master diverged, we can use $original_version to make sure we don't
3819
3820 # apply updates that have already been done
3821
3822 $DBversion = "3.03.00.001";
3823 if (C4::Context->preference("Version") < TransformToNum($DBversion) && $original_version < TransformToNum("3.02.00.005")) {
3824     $dbh->do("DELETE FROM subscriptionroutinglist WHERE borrowernumber IS NULL;");
3825     $dbh->do("ALTER TABLE subscriptionroutinglist MODIFY COLUMN `borrowernumber` int(11) NOT NULL;");
3826     $dbh->do("DELETE FROM subscriptionroutinglist WHERE subscriptionid IS NULL;");
3827     $dbh->do("ALTER TABLE subscriptionroutinglist MODIFY COLUMN `subscriptionid` int(11) NOT NULL;");
3828     $dbh->do("CREATE TEMPORARY TABLE del_subscriptionroutinglist
3829               SELECT s1.routingid FROM subscriptionroutinglist s1
3830               WHERE EXISTS (SELECT * FROM subscriptionroutinglist s2
3831                             WHERE s2.borrowernumber = s1.borrowernumber
3832                             AND   s2.subscriptionid = s1.subscriptionid
3833                             AND   s2.routingid < s1.routingid);");
3834     $dbh->do("DELETE FROM subscriptionroutinglist
3835               WHERE routingid IN (SELECT routingid FROM del_subscriptionroutinglist);");
3836     $dbh->do("ALTER TABLE subscriptionroutinglist ADD UNIQUE (subscriptionid, borrowernumber);");
3837     $dbh->do("ALTER TABLE subscriptionroutinglist
3838                 ADD CONSTRAINT `subscriptionroutinglist_ibfk_1` FOREIGN KEY (`borrowernumber`)
3839                 REFERENCES `borrowers` (`borrowernumber`)
3840                 ON DELETE CASCADE ON UPDATE CASCADE");
3841     $dbh->do("ALTER TABLE subscriptionroutinglist
3842                 ADD CONSTRAINT `subscriptionroutinglist_ibfk_2` FOREIGN KEY (`subscriptionid`)
3843                 REFERENCES `subscription` (`subscriptionid`)
3844                 ON DELETE CASCADE ON UPDATE CASCADE");
3845     print "Upgrade to $DBversion done (Make subscriptionroutinglist more strict)\n";
3846     SetVersion ($DBversion);
3847 }
3848
3849 $DBversion = '3.03.00.002';
3850 if (C4::Context->preference("Version") < TransformToNum($DBversion) && $original_version < TransformToNum("3.02.00.006")) {
3851     $dbh->do("UPDATE language_rfc4646_to_iso639 SET iso639_2_code='arm' WHERE rfc4646_subtag='hy';");
3852     $dbh->do("UPDATE language_rfc4646_to_iso639 SET iso639_2_code='eng' WHERE rfc4646_subtag='en';");
3853     $dbh->do("INSERT INTO language_rfc4646_to_iso639(rfc4646_subtag,iso639_2_code) VALUES( 'fi','fin');");
3854     $dbh->do("UPDATE language_rfc4646_to_iso639 SET iso639_2_code='fre' WHERE rfc4646_subtag='fr';");
3855     $dbh->do("INSERT INTO language_rfc4646_to_iso639(rfc4646_subtag,iso639_2_code) VALUES( 'lo','lao');");
3856     $dbh->do("UPDATE language_rfc4646_to_iso639 SET iso639_2_code='ita' WHERE rfc4646_subtag='it';");
3857     $dbh->do("INSERT INTO language_rfc4646_to_iso639(rfc4646_subtag,iso639_2_code) VALUES( 'sr','srp');");
3858     $dbh->do("INSERT INTO language_rfc4646_to_iso639(rfc4646_subtag,iso639_2_code) VALUES( 'tet','tet');");
3859     $dbh->do("INSERT INTO language_rfc4646_to_iso639(rfc4646_subtag,iso639_2_code) VALUES( 'ur','urd');");
3860
3861     print "Upgrade to $DBversion done (Correct language mappings)\n";
3862     SetVersion ($DBversion);
3863 }
3864
3865 $DBversion = '3.03.00.003';
3866 if (C4::Context->preference("Version") < TransformToNum($DBversion) && $original_version < TransformToNum("3.02.00.007")) {
3867     $dbh->do("INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES('UseTablesortForCirc','0','If on, use the JQuery tablesort function on the list of current borrower checkouts on the circulation page. Note that the use of this function may slow down circ for patrons with may checkouts.','','YesNo');");
3868     print "Upgrade to $DBversion done (Add UseTablesortForCirc syspref)\n";
3869     SetVersion ($DBversion);
3870 }
3871
3872 $DBversion = '3.03.00.004';
3873 if (C4::Context->preference("Version") < TransformToNum($DBversion) && $original_version < TransformToNum("3.02.01.001")) {
3874     my $count = $dbh->selectrow_array('SELECT COUNT(*) FROM letter WHERE module = ? AND code = ?', {}, 'suggestions', 'ACCEPTED');
3875     $dbh->do(q/
3876 INSERT INTO `letter`
3877 (module, code, name, title, content)
3878 VALUES
3879 ('suggestions','ACCEPTED','Suggestion accepted', 'Purchase suggestion accepted','Dear <<borrowers.firstname>> <<borrowers.surname>>,\n\nYou have suggested that the library acquire <<suggestions.title>> by <<suggestions.author>>.\n\nThe library has reviewed your suggestion today. The item will be ordered as soon as possible. You will be notified by mail when the order is completed, and again when the item arrives at the library.\n\nIf you have any questions, please email us at <<branches.branchemail>>.\n\nThank you,\n\n<<branches.branchname>>')
3880 /) unless $count > 0;
3881     $count = $dbh->selectrow_array('SELECT COUNT(*) FROM letter WHERE module = ? AND code = ?', {}, 'suggestions', 'AVAILABLE');
3882     $dbh->do(q/
3883 INSERT INTO `letter`
3884 (module, code, name, title, content)
3885 VALUES
3886 ('suggestions','AVAILABLE','Suggestion available', 'Suggested purchase available','Dear <<borrowers.firstname>> <<borrowers.surname>>,\n\nYou have suggested that the library acquire <<suggestions.title>> by <<suggestions.author>>.\n\nWe are pleased to inform you that the item you requested is now part of the collection.\n\nIf you have any questions, please email us at <<branches.branchemail>>.\n\nThank you,\n\n<<branches.branchname>>')
3887 /) unless $count > 0;
3888     $count = $dbh->selectrow_array('SELECT COUNT(*) FROM letter WHERE module = ? AND code = ?', {}, 'suggestions', 'ORDERED');
3889     $dbh->do(q/
3890 INSERT INTO `letter`
3891 (module, code, name, title, content)
3892 VALUES
3893 ('suggestions','ORDERED','Suggestion ordered', 'Suggested item ordered','Dear <<borrowers.firstname>> <<borrowers.surname>>,\n\nYou have suggested that the library acquire <<suggestions.title>> by <<suggestions.author>>.\n\nWe are pleased to inform you that the item you requested has now been ordered. It should arrive soon, at which time it will be processed for addition into the collection.\n\nYou will be notified again when the book is available.\n\nIf you have any questions, please email us at <<branches.branchemail>>\n\nThank you,\n\n<<branches.branchname>>')
3894 /) unless $count > 0;
3895     $count = $dbh->selectrow_array('SELECT COUNT(*) FROM letter WHERE module = ? AND code = ?', {}, 'suggestions', 'REJECTED');
3896     $dbh->do(q/
3897 INSERT INTO `letter`
3898 (module, code, name, title, content)
3899 VALUES
3900 ('suggestions','REJECTED','Suggestion rejected', 'Purchase suggestion declined','Dear <<borrowers.firstname>> <<borrowers.surname>>,\n\nYou have suggested that the library acquire <<suggestions.title>> by <<suggestions.author>>.\n\nThe library has reviewed your request today, and has decided not to accept the suggestion at this time.\n\nThe reason given is: <<suggestions.reason>>\n\nIf you have any questions, please email us at <<branches.branchemail>>.\n\nThank you,\n\n<<branches.branchname>>')
3901 /) unless $count > 0;
3902     print "Upgrade to $DBversion done (bug 5127: add default templates for suggestion status change notifications)\n";
3903     SetVersion ($DBversion);
3904 };
3905
3906 $DBversion = '3.03.00.005';
3907 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
3908     $dbh->do("update `systempreferences` set options='whitespace|T-prefix|cuecat|libsuite8' where variable='itemBarcodeInputFilter'");
3909     print "Upgrade to $DBversion done (Add itemBarcodeInputFilter choice libsuite8)\n";
3910 }
3911
3912 $DBversion = '3.03.00.006';
3913 if (C4::Context->preference("Version") < TransformToNum($DBversion) && $original_version < TransformToNum("3.02.01.002")) {
3914     $dbh->do("ALTER TABLE deletedborrowers ADD `privacy` int(11) AFTER smsalertnumber;");
3915     $dbh->do("ALTER TABLE deletedborrowers CHANGE `cardnumber` `cardnumber` varchar(16);");
3916     print "Upgrade to $DBversion done (Fix differences between borrowers and deletedborrowers)\n";
3917     SetVersion ($DBversion);
3918 }
3919
3920 $DBversion = '3.03.00.007';
3921 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
3922     $dbh->do("ALTER table suggestions ADD quantity SMALLINT(6) default NULL,
3923                 ADD currency VARCHAR(3) default NULL,
3924                 ADD price DECIMAL(28,6) default NULL,
3925                 ADD total DECIMAL(28,6) default NULL;
3926                 ");
3927     print "Upgrade to $DBversion done (Added acq related columns to suggestions)\n";
3928     SetVersion ($DBversion);
3929 }
3930
3931 $DBversion = '3.03.00.008';
3932 if (C4::Context->preference('Version') < TransformToNum($DBversion)){
3933     $dbh->do("INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES ('OPACNoResultsFound','','Display this HTML when no results are found for a search in the OPAC','70|10','Textarea')");
3934     print "Upgrade to $DBversion done (adding syspref OPACNoResultsFound to control what displays when no results are found for a search in the OPAC.)\n";
3935     SetVersion ($DBversion);
3936 }
3937
3938 $DBversion = '3.03.00.009';
3939 if (C4::Context->preference("Version") < TransformToNum($DBversion) && $original_version < TransformToNum("3.02.01.003")) {
3940     $dbh->do("INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES('IntranetUserCSS','','Add CSS to be included in the Intranet',NULL,'free')");
3941     print "Upgrade to $DBversion done (Add IntranetUserCSS syspref)\n";
3942     SetVersion ($DBversion);
3943 }
3944
3945 $DBversion = "3.03.00.010";
3946 if (C4::Context->preference("Version") < TransformToNum($DBversion) && $original_version < TransformToNum("3.02.02.001")) {
3947     $dbh->do("UPDATE `marc_subfield_structure` SET liblibrarian = 'Distance from earth' WHERE liblibrarian = 'Distrance from earth' AND tagfield = '034' AND tagsubfield = 'r';");
3948     $dbh->do("UPDATE `marc_subfield_structure` SET libopac = 'Distance from earth' WHERE libopac = 'Distrance from earth' AND tagfield = '034' AND tagsubfield = 'r';");
3949     print "Upgrade to $DBversion done (Fix misspelled 034r subfield in MARC21 Frameworks)\n";
3950     SetVersion ($DBversion);
3951 }
3952
3953 $DBversion = "3.03.00.011";
3954 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
3955     $dbh->do("UPDATE aqbooksellers SET gstrate=NULL WHERE gstrate=0.0");
3956     print "Upgrade to $DBversion done (Bug 5186: allow GST rate to be set to 0)\n";
3957     SetVersion ($DBversion);
3958 }
3959
3960 $DBversion = "3.03.00.012";
3961 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
3962    $dbh->do("INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES('maxItemsInSearchResults',20,'Specify the maximum number of items to display for each result on a page of results',NULL,'free')");
3963    print "Upgrade to $DBversion done (Bug 2142: maxItemsInSearchResults syspref resurrected)\n";
3964    SetVersion ($DBversion);
3965 }
3966
3967 $DBversion = "3.03.00.013";
3968 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
3969     $dbh->do("INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES ('OpacPublic','1','If set to OFF and user is not logged in, all  OPAC pages require authentication, and OPAC searchbar is removed)','','YesNo')");
3970     print "Upgrade to $DBversion done (added 'OpacPublic' syspref)\n";
3971    SetVersion ($DBversion);
3972 }
3973
3974 $DBversion = "3.03.00.014";
3975 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
3976     $dbh->do("INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES ('ShelfBrowserUsesLocation','1','Use the item location when finding items for the shelf browser.','1','YesNo')");
3977     $dbh->do("INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES ('ShelfBrowserUsesHomeBranch','1','Use the item home branch when finding items for the shelf browser.','1','YesNo')");
3978     $dbh->do("INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES ('ShelfBrowserUsesCcode','0','Use the item collection code when finding items for the shelf browser.','1','YesNo')");
3979     print "Upgrade to $DBversion done (Add flexible shelf browser constraints)\n";
3980     SetVersion ($DBversion);
3981 }
3982
3983 $DBversion = "3.03.00.015";
3984 if ( C4::Context->preference("Version") < TransformToNum($DBversion) ) {
3985     if ( C4::Context->preference("marcflavour") eq "MARC21" ) {
3986         my $sth = $dbh->prepare(
3987 "INSERT INTO `marc_subfield_structure` (`tagfield`, `tagsubfield`, `liblibrarian`, `libopac`, `repeatable`, `mandatory`, `kohafield`,
3988                              `tab`, `authorised_value`, `authtypecode`, `value_builder`, `isurl`, `hidden`, `frameworkcode`, `seealso`, `link`, `defaultvalue`)
3989                              VALUES ( ?, '9', '9 (RLIN)', '9 (RLIN)', 0, 0, '', 6, '', '', '', 0, -5, '', '', '', NULL)"
3990         );
3991         $sth->execute('648');
3992         $sth->execute('654');
3993         $sth->execute('655');
3994         $sth->execute('656');
3995         $sth->execute('657');
3996         $sth->execute('658');
3997         $sth->execute('662');
3998         $sth->finish;
3999         print
4000 "Upgrade to $DBversion done (Bug 5619: Add subfield 9 to marc21 648,654,655,656,657,658,662)\n";
4001     }
4002     SetVersion($DBversion);
4003 }
4004
4005 $DBversion = '3.03.00.016';
4006 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
4007     # reimplement OpacPrivacy system preference
4008     $dbh->do("INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES('OpacPrivacy', '0', 'if ON, allows patrons to define their privacy rules (reading history)',NULL,'YesNo')");
4009     $dbh->do("ALTER TABLE `borrowers` ADD `privacy` INTEGER NOT NULL DEFAULT 1;");
4010     $dbh->do("ALTER TABLE `deletedborrowers` ADD `privacy` INTEGER NOT NULL DEFAULT 1;");
4011     print "Upgrade to $DBversion done (OpacPrivacy reimplementation)\n";
4012     SetVersion($DBversion);
4013 };
4014
4015 $DBversion = '3.03.00.017';
4016 if (C4::Context->preference("Version") < TransformToNum($DBversion) && $original_version < TransformToNum("3.02.03.001")) {
4017     $dbh->do("ALTER TABLE  `currency` CHANGE `rate` `rate` FLOAT( 15, 5 ) NULL DEFAULT NULL;");
4018     print "Upgrade to $DBversion done (Enable currency rates >= 100)\n";
4019     SetVersion ($DBversion);
4020 }
4021
4022 $DBversion = '3.03.00.018';
4023 if (C4::Context->preference("Version") < TransformToNum($DBversion) && $original_version < TransformToNum("3.02.03.002")) {
4024     $dbh->do( q|update language_descriptions set description = 'Nederlands' where lang = 'nl' and subtag = 'nl'|);
4025     $dbh->do( q|update language_descriptions set description = 'Dansk' where lang = 'da' and subtag = 'da'|);
4026     print "Upgrade to $DBversion done (Correct language descriptions)\n";
4027     SetVersion ($DBversion);
4028 }
4029
4030 $DBversion = '3.03.00.019';
4031 if (C4::Context->preference("Version") < TransformToNum($DBversion) && $original_version < TransformToNum("3.02.03.003")) {
4032     # Fix bokmål
4033     $dbh->do("UPDATE language_subtag_registry SET description = 'Norwegian bokm&#229;l' WHERE subtag = 'nb';");
4034     $dbh->do("INSERT INTO language_rfc4646_to_iso639(rfc4646_subtag,iso639_2_code) VALUES( 'nb','nob');");
4035     $dbh->do("UPDATE language_descriptions SET description = 'Norsk bokm&#229;l' WHERE subtag = 'nb' AND lang = 'nb';");
4036     $dbh->do("UPDATE language_descriptions SET description = 'Norwegian bokm&#229;l' WHERE subtag = 'nb' AND lang = 'en';");
4037     $dbh->do("UPDATE language_descriptions SET description = 'Norvégien bokm&#229;l' WHERE subtag = 'nb' AND lang = 'fr';");
4038     # Add nynorsk
4039     $dbh->do("INSERT INTO language_subtag_registry( subtag, type, description, added) VALUES ( 'nn', 'language', 'Norwegian nynorsk','2011-02-14' )");
4040     $dbh->do("INSERT INTO language_rfc4646_to_iso639(rfc4646_subtag,iso639_2_code) VALUES( 'nn','nno')");
4041     $dbh->do("INSERT INTO language_descriptions(subtag, type, lang, description) VALUES( 'nn', 'language', 'nb', 'Norsk nynorsk')");
4042     $dbh->do("INSERT INTO language_descriptions(subtag, type, lang, description) VALUES( 'nn', 'language', 'nn', 'Norsk nynorsk')");
4043     $dbh->do("INSERT INTO language_descriptions(subtag, type, lang, description) VALUES( 'nn', 'language', 'en', 'Norwegian nynorsk')");
4044     $dbh->do("INSERT INTO language_descriptions(subtag, type, lang, description) VALUES( 'nn', 'language', 'fr', 'Norvégien nynorsk')");
4045     print "Upgrade to $DBversion done (Correct language descriptions for Norwegian)\n";
4046     SetVersion ($DBversion);
4047 }
4048
4049 $DBversion = '3.03.00.020';
4050 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
4051     $dbh->do("INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES ('AllowFineOverride','0','If on, staff will be able to issue books to patrons with fines greater than noissuescharge.','0','YesNo')");
4052     $dbh->do("INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES ('AllFinesNeedOverride','1','If on, staff will be asked to override every fine, even if it is below noissuescharge.','0','YesNo')");
4053     print "Upgrade to $DBversion done (Bug 5811: Add sysprefs controlling overriding fines)\n";
4054     SetVersion($DBversion);
4055 };
4056
4057 $DBversion = '3.03.00.021';
4058 if (C4::Context->preference("Version") < TransformToNum($DBversion) && $original_version < TransformToNum("3.02.05.001")) {
4059     $dbh->do("ALTER TABLE items MODIFY enumchron TEXT");
4060     $dbh->do("ALTER TABLE deleteditems MODIFY enumchron TEXT");
4061     print "Upgrade to $DBversion done (bug 5642: longer serial enumeration)\n";
4062     SetVersion ($DBversion);
4063 }
4064
4065 $DBversion = '3.03.00.022';
4066 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
4067     $dbh->do("INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES ('AuthoritiesLog','0','If ON, log edit/create/delete actions on authorities.','','YesNo');");
4068     print "Upgrade to $DBversion done (Add AuthoritiesLog syspref)\n";
4069     SetVersion ($DBversion);
4070 }
4071
4072 # due to a mismatch in kohastructure.sql some koha will have missing columns in aqbasketgroup
4073 # this attempts to fix that
4074 $DBversion = '3.03.00.023';
4075 if (C4::Context->preference("Version") < TransformToNum($DBversion) && $original_version < TransformToNum("3.02.05.002")) {
4076     my $sth = $dbh->prepare("SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'aqbasketgroups' AND COLUMN_NAME = 'billingplace'");
4077     $sth->execute;
4078     $dbh->do("ALTER TABLE aqbasketgroups ADD billingplace VARCHAR(10)") if ! $sth->fetchrow_hashref;
4079     $sth = $dbh->prepare("SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'aqbasketgroups' AND COLUMN_NAME = 'deliveryplace'");
4080     $sth->execute;
4081     $dbh->do("ALTER TABLE aqbasketgroups ADD deliveryplace VARCHAR(10)") if ! $sth->fetchrow_hashref;
4082     $sth = $dbh->prepare("SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'aqbasketgroups' AND COLUMN_NAME = 'deliverycomment'");
4083     $sth->execute;
4084     $dbh->do("ALTER TABLE aqbasketgroups ADD deliverycomment VARCHAR(255)") if ! $sth->fetchrow_hashref;
4085     print "Upgrade to $DBversion done (Reconcile aqbasketgroups)\n";
4086     SetVersion ($DBversion);
4087 }
4088
4089 $DBversion = '3.03.00.024';
4090 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
4091     $dbh->do("INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES ('TraceCompleteSubfields','0','Force subject tracings to only match complete subfields.','0','YesNo')");
4092     $dbh->do("INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES ('UseAuthoritiesForTracings','1','Use authority record numbers for subject tracings instead of heading strings.','0','YesNo')");
4093     print "Upgrade to $DBversion done (Add syspref to force whole-subfield matching on subject tracings)\n";
4094     SetVersion($DBversion);
4095 };
4096
4097 $DBversion = "3.03.00.025";
4098 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
4099     $dbh->do("INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES ('OPACAllowUserToChooseBranch', 1, 'Allow the user to choose the branch they want to pickup their hold from','1','YesNo')");
4100     print "Upgrade to $DBversion done (Add syspref to control if user can choose pickup branch for holds)\n";
4101     SetVersion ($DBversion);
4102 }
4103
4104 $DBversion = '3.03.00.026';
4105 if (C4::Context->preference("Version") < TransformToNum($DBversion) && $original_version < TransformToNum("3.02.05.003")) {
4106     $dbh->do("UPDATE `message_attributes` SET message_name='Item Due' WHERE message_attribute_id=1 AND message_name LIKE 'Item DUE'");
4107         print "Upgrade to $DBversion done ( fix capitalization in message type )\n";
4108     SetVersion ($DBversion);
4109 }
4110
4111 $DBversion = '3.03.00.027';
4112 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
4113     $dbh->do("INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES('displayFacetCount', '0', NULL, NULL, 'YesNo')");
4114     $dbh->do("INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES('maxRecordsForFacets', '20', NULL, NULL, 'Integer')");
4115     print "Upgrade to $DBversion done (Preferences for facet count)\n";
4116     SetVersion ($DBversion);
4117 }
4118
4119 $DBversion = "3.03.00.028";
4120 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
4121     $dbh->do("INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES ('FacetLabelTruncationLength', 20, 'Truncate facets length to','','free')");
4122     print "Upgrade to $DBversion done (Add FacetLabelTruncationLength syspref to control facets displayed length)\n";
4123     SetVersion ($DBversion);
4124 }
4125
4126 $DBversion = "3.03.00.029";
4127 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
4128     $dbh->do("INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES ('AllowPurchaseSuggestionBranchChoice', 0, 'Allow user to choose branch when making a purchase suggestion','1','YesNo')");
4129     print "Upgrade to $DBversion done (Add syspref to control if user can choose branch when making purchase suggestion)\n";
4130     SetVersion ($DBversion);
4131 }
4132
4133 $DBversion = "3.03.00.030";
4134 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
4135     $dbh->do("INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES('OpacFavicon','','Enter a complete URL to an image to replace the default Koha favicon on the OPAC','','free')");
4136     $dbh->do("INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES('IntranetFavicon','','Enter a complete URL to an image to replace the default Koha favicon on the Staff client','','free')");
4137     print "Upgrade to $DBversion done (Add sysprefs to control custom favicons)\n";
4138     SetVersion ($DBversion);
4139 }
4140
4141 $DBversion = "3.03.00.031";
4142 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
4143     $dbh->do("INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES('FineNotifyAtCheckin',0,'If ON notify librarians of overdue fines on the items they are checking in.',NULL,'YesNo');");
4144     print "Upgrade to $DBversion done (Add syspref FineNotifyAtCheckin)\n";
4145     SetVersion ($DBversion);
4146 }
4147
4148 $DBversion = '3.03.00.032';
4149 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
4150     $dbh->do("INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES ('TraceSubjectSubdivisions', 1, 'Create searches on all subdivisions for subject tracings.','1','YesNo')");
4151     print "Upgrade to $DBversion done ( include subdivisions when generating subject tracing searches )\n";
4152 }
4153
4154
4155 $DBversion = '3.03.00.033';
4156 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
4157     $dbh->do("INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES('StaffAuthorisedValueImages', '1', '', NULL, 'YesNo')");
4158     print "Upgrade to $DBversion done (System pref StaffAuthorisedValueImages)\n";
4159     SetVersion ($DBversion);
4160 }
4161
4162 $DBversion = '3.03.00.034';
4163 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
4164     $dbh->do("ALTER TABLE `categories` ADD `hidelostitems` tinyint(1) NOT NULL default '0' AFTER `reservefee`");
4165     print "Upgrade to $DBversion done (Add hidelostitems preference to borrower categories)\n";
4166     SetVersion ($DBversion);
4167 }
4168
4169 $DBversion = '3.03.00.035';
4170 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
4171     $dbh->do("ALTER TABLE `issuingrules` ADD hardduedate date default NULL AFTER issuelength");
4172     $dbh->do("ALTER TABLE `issuingrules` ADD hardduedatecompare tinyint NOT NULL default 0 AFTER hardduedate");
4173     my $duedate;
4174     if (C4::Context->preference("globalDueDate")) {
4175       $duedate = eval { output_pref( { dt => dt_from_string( C4::Context->preference("globalDueDate") ), dateonly => 1, dateformat => 'iso' } ); };
4176       $dbh->do("UPDATE `issuingrules` SET hardduedate = '$duedate', hardduedatecompare = 0");
4177     } elsif (C4::Context->preference("ceilingDueDate")) {
4178       $duedate = eval { output_pref( { dt => dt_from_string( C4::Context->preference("ceilingDueDate") ), dateonly => 1, dateformat => 'iso' } ); };
4179       $dbh->do("UPDATE `issuingrules` SET hardduedate = '$duedate', hardduedatecompare = -1");
4180     }
4181     $dbh->do("DELETE FROM `systempreferences` WHERE variable = 'globalDueDate' OR variable = 'ceilingDueDate'");
4182     print "Upgrade to $DBversion done (Move global and ceiling due dates to Circ Rules level)\n";
4183     SetVersion ($DBversion);
4184 }
4185
4186 $DBversion = '3.03.00.036';
4187 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
4188     $dbh->do("INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES ('COinSinOPACResults', 1, 'If ON, use COinS in OPAC search results page.  NOTE: this can slow down search response time significantly','','YesNo')");
4189     print "Upgrade to $DBversion done ( Make COinS optional in OPAC search results )\n";
4190     SetVersion ($DBversion);
4191 }
4192
4193 $DBversion = '3.03.00.037';
4194 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
4195     $dbh->do("INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES('OPACDisplay856uAsImage','OFF','Display the URI in the 856u field as an image, the corresponding OPACXSLT option must be on','OFF|Details|Results|Both','Choice')");
4196     $dbh->do("INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES('Display856uAsImage','OFF','Display the URI in the 856u field as an image, the corresponding Staff Client XSLT option must be on','OFF|Details|Results|Both','Choice')");
4197     print "Upgrade to $DBversion done (Add 'Display856uAsImage' and 'OPACDisplay856uAsImage' syspref)\n";
4198     SetVersion ($DBversion);
4199 }
4200
4201 $DBversion = '3.03.00.038';
4202 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
4203     $dbh->do("INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES ('SelfCheckTimeout',120,'Define the number of seconds before the Web-based Self Checkout times out a patron','','Integer')");
4204     $dbh->do("INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES ('AllowSelfCheckReturns',0,'If enabled, patrons may return items through the Web-based Self Checkout','','YesNo')");
4205     $dbh->do("INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES ('SelfCheckHelpMessage','','Enter HTML to include under the basic Web-based Self Checkout instructions on the Help page','70|10','Textarea')");
4206     print "Upgrade to $DBversion done ( Add Self-checkout by Login system preferences )\n";
4207 }
4208
4209 $DBversion = "3.03.00.039";
4210 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
4211     $dbh->do("INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES('ShowReviewer',1,'If ON, name of reviewer will be shown above comments in OPAC',NULL,'YesNo');");
4212     print "Upgrade to $DBversion done (Add syspref ShowReviewer)\n";
4213 }
4214
4215 $DBversion = "3.03.00.040";
4216 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
4217     $dbh->do("INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES('UseControlNumber',0,'If ON, record control number (w subfields) and control number (001) are used for linking of bibliographic records.','','YesNo');");
4218     print "Upgrade to $DBversion done (Add syspref UseControlNumber)\n";
4219 }
4220
4221 $DBversion = "3.03.00.041";
4222 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
4223     $dbh->do("INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES('AlternateHoldingsField','','The MARC field/subfield that contains alternate holdings information for bibs taht do not have items attached (e.g. 852abchi for libraries converting from MARC Magician).',NULL,'free')");
4224     $dbh->do("INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES('AlternateHoldingsSeparator','','The string to use to separate subfields in alternate holdings displays.',NULL,'free')");
4225     print "Upgrade to $DBversion done (Add sysprefs to control alternate holdings information display)\n";
4226     SetVersion ($DBversion);
4227 }
4228
4229 $DBversion = '3.03.00.042';
4230 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
4231     stocknumber_checker();
4232     print "Upgrade to $DBversion done (5860 Index itemstocknumber)\n";
4233     SetVersion ($DBversion);
4234 }
4235
4236 sub stocknumber_checker { #code reused later on
4237   my @row;
4238   #drop the obsolete itemSStocknumber idx if it exists
4239   @row = $dbh->selectrow_array("SHOW INDEXES FROM items WHERE key_name='itemsstocknumberidx'");
4240   $dbh->do("ALTER TABLE `items` DROP INDEX `itemsstocknumberidx`;") if @row;
4241
4242   #check itemstocknumber idx; remove it if it is unique
4243   @row = $dbh->selectrow_array("SHOW INDEXES FROM items WHERE key_name='itemstocknumberidx' AND non_unique=0");
4244   $dbh->do("ALTER TABLE `items` DROP INDEX `itemstocknumberidx`;") if @row;
4245
4246   #add itemstocknumber index non-unique IF it still not exists
4247   @row = $dbh->selectrow_array("SHOW INDEXES FROM items WHERE key_name='itemstocknumberidx'");
4248   $dbh->do("ALTER TABLE items ADD INDEX itemstocknumberidx (stocknumber);") unless @row;
4249 }
4250
4251 $DBversion = "3.03.00.043";
4252 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
4253
4254     $dbh->do("INSERT INTO authorised_values (category,authorised_value,lib,lib_opac) VALUES ('YES_NO','0','No','No')");
4255     $dbh->do("INSERT INTO authorised_values (category,authorised_value,lib,lib_opac) VALUES ('YES_NO','1','Yes','Yes')");
4256
4257         print "Upgrade to $DBversion done ( add generic boolean YES_NO authorised_values pair )\n";
4258         SetVersion ($DBversion);
4259 }
4260
4261 $DBversion = '3.03.00.044';
4262 if ( C4::Context->preference("Version") < TransformToNum($DBversion) ) {
4263     $dbh->do("ALTER TABLE `aqbasketgroups` ADD `freedeliveryplace` TEXT NULL AFTER `deliveryplace`;");
4264     print "Upgrade to $DBversion done (adding freedeliveryplace to basketgroups)\n";
4265 }
4266
4267 $DBversion = '3.03.00.045';
4268 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
4269     #Remove obsolete columns from aqbooksellers if needed
4270     my $a = $dbh->selectall_hashref('SHOW columns from aqbooksellers','Field');
4271     my $sqldrop="ALTER TABLE aqbooksellers DROP COLUMN ";
4272     foreach(qw/deliverydays followupdays followupscancel invoicedisc nocalc specialty/) {
4273       $dbh->do($sqldrop.$_) if exists $a->{$_};
4274     }
4275     #Remove obsolete column from aqbudgets if needed
4276     #The correct column is budget_notes
4277     $a = $dbh->selectall_hashref('SHOW columns from aqbudgets','Field');
4278     if(exists $a->{budget_description}) {
4279       $dbh->do("ALTER TABLE aqbudgets DROP COLUMN budget_description");
4280     }
4281     print "Upgrade to $DBversion done (Remove obsolete columns from aqbooksellers and aqbudgets if needed)\n";
4282     SetVersion ($DBversion);
4283 }
4284
4285 $DBversion = "3.03.00.046";
4286 if ( C4::Context->preference("Version") < TransformToNum($DBversion) ) {
4287     $dbh->do("ALTER TABLE overduerules ALTER delay1 SET DEFAULT NULL, ALTER delay2 SET DEFAULT NULL, ALTER delay3 SET DEFAULT NULL");
4288     print "Upgrade to $DBversion done (Setting NULL default value for delayn columns in table overduerules)\n";
4289     SetVersion($DBversion);
4290 }
4291
4292 $DBversion = '3.03.00.047';
4293 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
4294     $dbh->do("ALTER TABLE borrowers ADD `state` mediumtext AFTER city;");
4295     $dbh->do("ALTER TABLE borrowers ADD `B_state` mediumtext AFTER B_city;");
4296     $dbh->do("ALTER TABLE borrowers ADD `altcontactstate` mediumtext AFTER altcontactaddress3;");
4297     $dbh->do("ALTER TABLE deletedborrowers ADD `state` mediumtext AFTER city;");
4298     $dbh->do("ALTER TABLE deletedborrowers ADD `B_state` mediumtext AFTER B_city;");
4299     $dbh->do("ALTER TABLE deletedborrowers ADD `altcontactstate` mediumtext AFTER altcontactaddress3;");
4300     print "Upgrade to $DBversion done (Add state field to patron's addresses)\n";
4301 }
4302
4303 $DBversion = '3.03.00.048';
4304 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
4305     $dbh->do("ALTER TABLE branches ADD `branchstate` mediumtext AFTER `branchcity`;");
4306     print "Upgrade to $DBversion done (Add state to branch address)\n";
4307     SetVersion ($DBversion);
4308 }
4309
4310 $DBversion = '3.03.00.049';
4311 if ( C4::Context->preference("Version") < TransformToNum($DBversion) ) {
4312     $dbh->do("ALTER TABLE `accountlines` ADD `note` text NULL default NULL");
4313     $dbh->do("ALTER TABLE `accountlines` ADD `manager_id` int( 11 ) NULL ");
4314     print "Upgrade to $DBversion done (adding note and manager_id fields in accountlines table)\n";
4315     SetVersion($DBversion);
4316 }
4317
4318 $DBversion = "3.03.00.050";
4319 if ( C4::Context->preference("Version") < TransformToNum($DBversion) ) {
4320     $dbh->do("
4321         INSERT IGNORE INTO `systempreferences` (variable,value,explanation,options,type) VALUES('OpacHiddenItems','','This syspref allows to define custom rules for hiding specific items at opac. See docs/opac/OpacHiddenItems.txt for more informations.','','Textarea');
4322         ");
4323     print "Upgrade to $DBversion done (Adding OpacHiddenItems syspref)\n";
4324     SetVersion($DBversion);
4325 }
4326
4327 $DBversion = "3.03.00.051";
4328 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
4329     print "Upgrade to $DBversion done (Remove spaces and dashes from message_attribute names)\n";
4330     $dbh->do("UPDATE message_attributes SET message_name = 'Item_Due' WHERE message_name='Item Due'");
4331     $dbh->do("UPDATE message_attributes SET message_name = 'Advance_Notice' WHERE message_name='Advance Notice'");
4332     $dbh->do("UPDATE message_attributes SET message_name = 'Hold_Filled' WHERE message_name='Hold Filled'");
4333     $dbh->do("UPDATE message_attributes SET message_name = 'Item_Check_in' WHERE message_name='Item Check-in'");
4334     $dbh->do("UPDATE message_attributes SET message_name = 'Item_Checkout' WHERE message_name='Item Checkout'");
4335     SetVersion ($DBversion);
4336 }
4337
4338 $DBversion = "3.03.00.052";
4339 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
4340     $dbh->do("INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES('WaitingNotifyAtCheckin',0,'If ON, notify librarians of waiting holds for the patron whose items they are checking in.',NULL,'YesNo');");
4341     print "Upgrade to $DBversion done (Add syspref WaitingNotifyAtCheckin)\n";
4342     SetVersion ($DBversion);
4343 }
4344
4345 $DBversion = "3.04.00.000";
4346 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
4347     print "Upgrade to $DBversion done Koha 3.4.0 release \n";
4348     SetVersion ($DBversion);
4349 }
4350
4351 $DBversion = "3.05.00.001";
4352 if ( C4::Context->preference("Version") < TransformToNum($DBversion) ) {
4353     $dbh->do(qq{
4354     INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES('numSearchRSSResults',50,'Specify the maximum number of results to display on a RSS page of results',NULL,'Integer');
4355     });
4356     print "Upgrade to $DBversion done (Adds New System preference numSearchRSSResults)\n";
4357     SetVersion($DBversion);
4358 }
4359
4360 $DBversion = '3.05.00.002';
4361 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
4362     #follow up fix 5860: some installs already past 3.3.0.42
4363     stocknumber_checker();
4364     print "Upgrade to $DBversion done (Fix for stocknumber index)\n";
4365     SetVersion ($DBversion);
4366 }
4367
4368 $DBversion = "3.05.00.003";
4369 if ( C4::Context->preference("Version") < TransformToNum($DBversion) ) {
4370     $dbh->do(qq{
4371     INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES('OpacRenewalBranch','checkoutbranch','Choose how the branch for an OPAC renewal is recorded in statistics','itemhomebranch|patronhomebranch|checkoutbranch|null','Choice');
4372     });
4373     print "Upgrade to $DBversion done (Adds New System preference OpacRenewalBranch)\n";
4374     SetVersion($DBversion);
4375 }
4376
4377 $DBversion = "3.05.00.004";
4378 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
4379     $dbh->do("INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES('ShowReviewerPhoto',1,'If ON, photo of reviewer will be shown beside comments in OPAC',NULL,'YesNo');");
4380     print "Upgrade to $DBversion done (Add syspref ShowReviewerPhoto)\n";
4381     SetVersion($DBversion);
4382 }
4383
4384 $DBversion = "3.05.00.005";
4385 if ( C4::Context->preference("Version") < TransformToNum($DBversion) ) {
4386     $dbh->do("INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES ('BasketConfirmations', '1', 'When closing or reopening a basket,', 'always ask for confirmation.|do not ask for confirmation.', 'Choice');");
4387     print "Upgrade to $DBversion done (Adds pref BasketConfirmations)\n";
4388     SetVersion($DBversion);
4389 }
4390
4391 $DBversion = "3.05.00.006";
4392 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
4393     $dbh->do("INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES ('MARCAuthorityControlField008', '|| aca||aabn           | a|a     d', NULL, NULL, 'Textarea')");
4394     print "Upgrade to $DBversion done (Add syspref MARCAuthorityControlField008)\n";
4395     SetVersion ($DBversion);
4396 }
4397
4398 $DBversion = "3.05.00.007";
4399 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
4400     $dbh->do("INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES('OpenLibraryCovers',0,'If ON Openlibrary book covers will be show',NULL,'YesNo');");
4401     print "Upgrade to $DBversion done (Add syspref OpenLibraryCovers)\n";
4402     SetVersion($DBversion);
4403 }
4404
4405 $DBversion = "3.05.00.008";
4406 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
4407     $dbh->do("ALTER TABLE `cities` ADD `city_state` VARCHAR( 100 ) NULL DEFAULT NULL AFTER  `city_name`;");
4408     $dbh->do("ALTER TABLE `cities` ADD `city_country` VARCHAR( 100 ) NULL DEFAULT NULL AFTER  `city_zipcode`;");
4409     print "Add state and country to cities table corresponding to new columns in borrowers\n";
4410     SetVersion($DBversion);
4411 }
4412
4413 $DBversion = "3.05.00.009";
4414 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
4415     $dbh->do("INSERT INTO old_issues (borrowernumber, itemnumber, date_due, branchcode, issuingbranch, returndate, lastreneweddate, `return`, renewals, timestamp, issuedate)
4416               SELECT borrowernumber, itemnumber, date_due, branchcode, issuingbranch, returndate, lastreneweddate, `return`, renewals, timestamp, issuedate FROM issues WHERE borrowernumber IS NULL");
4417     $dbh->do("DELETE FROM issues WHERE borrowernumber IS NULL");
4418
4419     $dbh->do("INSERT INTO old_issues (borrowernumber, itemnumber, date_due, branchcode, issuingbranch, returndate, lastreneweddate, `return`, renewals, timestamp, issuedate)
4420               SELECT borrowernumber, itemnumber, date_due, branchcode, issuingbranch, returndate, lastreneweddate, `return`, renewals, timestamp, issuedate FROM issues WHERE itemnumber IS NULL");
4421     $dbh->do("DELETE FROM issues WHERE itemnumber IS NULL");
4422
4423     $dbh->do("INSERT INTO old_issues (borrowernumber, itemnumber, date_due, branchcode, issuingbranch, returndate, lastreneweddate, `return`, renewals, timestamp, issuedate)
4424               SELECT borrowernumber, itemnumber, date_due, branchcode, issuingbranch, returndate, lastreneweddate, `return`, renewals, timestamp, issuedate FROM issues WHERE NOT EXISTS (SELECT * FROM borrowers WHERE borrowernumber = issues.borrowernumber)");
4425     $dbh->do("DELETE FROM issues WHERE NOT EXISTS (SELECT * FROM borrowers WHERE borrowernumber = issues.borrowernumber)");
4426
4427     $dbh->do("INSERT INTO old_issues (borrowernumber, itemnumber, date_due, branchcode, issuingbranch, returndate, lastreneweddate, `return`, renewals, timestamp, issuedate)
4428               SELECT borrowernumber, itemnumber, date_due, branchcode, issuingbranch, returndate, lastreneweddate, `return`, renewals, timestamp, issuedate FROM issues WHERE NOT EXISTS (SELECT * FROM items WHERE itemnumber = issues.itemnumber)");
4429     $dbh->do("DELETE FROM issues WHERE NOT EXISTS (SELECT * FROM items WHERE itemnumber = issues.itemnumber)");
4430
4431     $dbh->do("ALTER TABLE issues DROP FOREIGN KEY `issues_ibfk_1`");
4432     $dbh->do("ALTER TABLE issues DROP FOREIGN KEY `issues_ibfk_2`");
4433     $dbh->do("ALTER TABLE issues ALTER COLUMN borrowernumber DROP DEFAULT");
4434     $dbh->do("ALTER TABLE issues ALTER COLUMN itemnumber DROP DEFAULT");
4435     $dbh->do("ALTER TABLE issues MODIFY COLUMN borrowernumber int(11) NOT NULL");
4436     $dbh->do("ALTER TABLE issues MODIFY COLUMN itemnumber int(11) NOT NULL");
4437     $dbh->do("ALTER TABLE issues DROP KEY `issuesitemidx`");
4438     $dbh->do("ALTER TABLE issues ADD PRIMARY KEY (`itemnumber`)");
4439     $dbh->do("ALTER TABLE issues ADD CONSTRAINT `issues_ibfk_1` FOREIGN KEY (`borrowernumber`) REFERENCES `borrowers` (`borrowernumber`) ON DELETE RESTRICT ON UPDATE CASCADE");
4440     $dbh->do("ALTER TABLE issues ADD CONSTRAINT `issues_ibfk_2` FOREIGN KEY (`itemnumber`) REFERENCES `items` (`itemnumber`) ON DELETE RESTRICT ON UPDATE CASCADE");
4441
4442     print "Upgrade to $DBversion done (issues referential integrity)\n";
4443     SetVersion ($DBversion);
4444 }
4445
4446 $DBversion = "3.05.00.010";
4447 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
4448     $dbh->do("CREATE INDEX priorityfoundidx ON reserves (priority,found)");
4449     print "Create an index on reserves to speed up holds awaiting pickup report bug 5866\n";
4450     SetVersion($DBversion);
4451 }
4452
4453
4454 $DBversion = "3.05.00.011";
4455 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
4456     $dbh->do("INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES('OPACResultsSidebar','','Define HTML to be included on the search results page, underneath the facets sidebar','70|10','Textarea')");
4457     print "Upgrade to $DBversion done (add OPACResultsSidebar syspref (enh 6165))\n";
4458     SetVersion($DBversion);
4459 }
4460
4461 $DBversion = "3.05.00.012";
4462 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
4463     $dbh->do("INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES('RecordLocalUseOnReturn',0,'If ON, statistically record returns of unissued items as local use, instead of return',NULL,'YesNo')");
4464     print "Upgrade to $DBversion done (add RecordLocalUseOnReturn syspref (enh 6403))\n";
4465     SetVersion($DBversion);
4466 }
4467
4468 $DBversion = "3.05.00.013";
4469 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
4470     $dbh->do(qq|INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES ('OpacKohaUrl','0',"Show 'Powered by Koha' text on OPAC footer.",NULL,NULL)|);
4471     print "Upgrade to $DBversion done (Add syspref 'OpacKohaUrl')\n";
4472     SetVersion($DBversion);
4473 }
4474
4475 $DBversion = "3.05.00.014";
4476 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
4477     $dbh->do("ALTER TABLE `borrowers` MODIFY `userid` VARCHAR(75)");
4478     print "Modified userid column length into 75 in borrowers\n";
4479     SetVersion($DBversion);
4480 }
4481
4482 $DBversion = "3.05.00.015";
4483 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
4484     $dbh->do("INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES ('NovelistSelectEnabled',0,'Enable Novelist Select content.  Requires Novelist Profile and Password',NULL,'YesNo')");
4485     $dbh->do("INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES ('NovelistSelectProfile',NULL,'Novelist Select user Password',NULL,'free')");
4486     $dbh->do("INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES ('NovelistSelectPassword',NULL,'Enable Novelist user Profile',NULL,'free')");
4487     $dbh->do("INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES ('NovelistSelectView','tab','Where to display Novelist Select content','tab|above|below|right','Choice')");
4488     print "Upgrade to $DBversion done (Add support for EBSCO's NoveList Select (enh 6902))\n";
4489     SetVersion($DBversion);
4490 }
4491
4492 $DBversion = '3.05.00.016';
4493 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
4494     $dbh->do("INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES('EasyAnalyticalRecords','0','If on, display in the catalogue screens tools to easily setup analytical record relationships','','YesNo');");
4495     print "Upgrade to $DBversion done (Add EasyAnalyticalRecords syspref)\n";
4496     SetVersion ($DBversion);
4497 }
4498
4499 $DBversion = '3.05.00.017';
4500 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
4501     if (C4::Context->preference("marcflavour") eq 'MARC21' ||
4502         C4::Context->preference("marcflavour") eq 'NORMARC'){
4503         $dbh->do("INSERT INTO `marc_subfield_structure` (`tagfield`, `tagsubfield`, `liblibrarian`, `libopac`, `repeatable`, `mandatory`, `kohafield`, `tab`, `authorised_value` , `authtypecode`, `value_builder`, `isurl`, `hidden`, `frameworkcode`, `seealso`, `link`, `defaultvalue`) VALUES ('773', '0', 'Host Biblionumber', 'Host Biblionumber', 0, 0, NULL, 7, NULL, NULL, '', NULL, -6, '', '', '', NULL)");
4504         $dbh->do("INSERT INTO `marc_subfield_structure` (`tagfield`, `tagsubfield`, `liblibrarian`, `libopac`, `repeatable`, `mandatory`, `kohafield`, `tab`, `authorised_value` , `authtypecode`, `value_builder`, `isurl`, `hidden`, `frameworkcode`, `seealso`, `link`, `defaultvalue`) VALUES ('773', '9', 'Host Itemnumber', 'Host Itemnumber', 0, 0, NULL, 7, NULL, NULL, '', NULL, -6, '', '', '', NULL)");
4505         print "Upgrade to $DBversion done (Add 773 subfield 9 and 0 to default framework)\n";
4506         SetVersion ($DBversion);
4507     } elsif (C4::Context->preference("marcflavour") eq 'UNIMARC'){
4508         $dbh->do("INSERT INTO `marc_subfield_structure` (`tagfield`, `tagsubfield`, `liblibrarian`, `libopac`, `repeatable`, `mandatory`, `kohafield`, `tab`, `authorised_value` , `authtypecode`, `value_builder`, `isurl`, `hidden`, `frameworkcode`, `seealso`, `link`, `defaultvalue`) VALUES ('461', '9', 'Host Itemnumber', 'Host Itemnumber', 0, 0, NULL, 7, NULL, NULL, '', NULL, -6, '', '', '', NULL)");
4509         print "Upgrade to $DBversion done (Add 461 subfield 9 to default framework)\n";
4510         SetVersion ($DBversion);
4511     }
4512 }
4513
4514 $DBversion = "3.05.00.018";
4515 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
4516     $dbh->do("INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES('OpacNavBottom','','Links after OpacNav links','70|10','Textarea')");
4517     print "Upgrade to $DBversion done (add OpacNavBottom syspref (enh 6825): if appropriate, you can split OpacNav into OpacNav and OpacNavBottom)\n";
4518     SetVersion($DBversion);
4519 }
4520
4521 $DBversion = "3.05.00.019";
4522 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
4523     $dbh->do("UPDATE itemtypes SET imageurl = 'vokal/Book.png' WHERE imageurl = 'vokal/BOOK.png'");
4524     $dbh->do("UPDATE itemtypes SET imageurl = 'vokal/Book-32px.png' WHERE imageurl = 'vokal/BOOK-32px.png'");
4525     $dbh->do("UPDATE authorised_values SET imageurl = 'vokal/Book.png' WHERE imageurl = 'vokal/BOOK.png'");
4526     $dbh->do("UPDATE authorised_values SET imageurl = 'vokal/Book-32px.png' WHERE imageurl = 'vokal/BOOK-32px.png'");
4527     print "Upgrade to $DBversion done (remove duplicate VOKAL Book icons, bug 6862)\n";
4528     SetVersion($DBversion);
4529 }
4530
4531 $DBversion = "3.05.00.020";
4532 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
4533     $dbh->do("INSERT INTO `systempreferences` (variable,value,options,explanation,type) VALUES ('AcqViewBaskets','user','user|branch|all','Define which baskets a user is allowed to view: his own only, any within his branch or all','Choice')");
4534     print "Upgrade to $DBversion done (Add syspref AcqViewBaskets)\n";
4535     SetVersion($DBversion);
4536 }
4537
4538 $DBversion = "3.05.00.021";
4539 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
4540     $dbh->do("ALTER TABLE borrower_attribute_types ADD COLUMN display_checkout TINYINT(1) NOT NULL DEFAULT '0';");
4541     print "Upgrade to $DBversion done (Added a display_checkout field in borrower_attribute_types table)\n";
4542     SetVersion($DBversion);
4543 }
4544
4545 $DBversion = "3.05.00.022";
4546 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
4547     $dbh->do("CREATE TABLE need_merge_authorities (id int NOT NULL auto_increment PRIMARY KEY, authid bigint NOT NULL, done tinyint DEFAULT 0) ENGINE=InnoDB DEFAULT CHARSET=utf8");
4548     print "Upgrade to $DBversion done (6094: Fixing ModAuthority problems, add a need_merge_authorities table)\n";
4549     SetVersion($DBversion);
4550 }
4551
4552 $DBversion = "3.05.00.023";
4553 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
4554     $dbh->do("INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES('OpacShowRecentComments',0,'If ON a link to recent comments will appear in the OPAC masthead',NULL,'YesNo');");
4555     print "Upgrade to $DBversion done (Add syspref OpacShowRecentComments. When the preference is turned on a link to recent comments will appear in the OPAC masthead. )\n";
4556     SetVersion($DBversion);
4557 }
4558
4559 $DBversion = "3.06.00.000";
4560 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
4561     print "Upgrade to $DBversion done Koha 3.6.0 release \n";
4562     SetVersion ($DBversion);
4563 }
4564
4565 $DBversion = "3.07.00.001";
4566 if ( C4::Context->preference("Version") < TransformToNum($DBversion) ) {
4567     my $borrowers = $dbh->selectcol_arrayref( "SELECT borrowernumber from borrowers where debarred =1;", { Columns => [1] } );
4568     $dbh->do("ALTER TABLE borrowers MODIFY debarred DATE DEFAULT NULL;");
4569     $dbh->do( "UPDATE borrowers set debarred='9999-12-31' where borrowernumber IN (" . join( ",", @$borrowers ) . ");" ) if ($borrowers and scalar(@$borrowers)>0);
4570     $dbh->do("ALTER TABLE borrowers ADD COLUMN debarredcomment VARCHAR(255) DEFAULT NULL AFTER debarred;");
4571     $dbh->do("ALTER TABLE deletedborrowers MODIFY debarred DATE DEFAULT NULL;");
4572     $dbh->do("ALTER TABLE deletedborrowers ADD COLUMN debarredcomment VARCHAR(255) DEFAULT NULL AFTER debarred;");
4573     print "Upgrade done (Change borrowers.debarred into Date )\n";
4574     SetVersion($DBversion);
4575 }
4576
4577 $DBversion = "3.07.00.002";
4578 if ( C4::Context->preference("Version") < TransformToNum($DBversion) ) {
4579     sanitize_zero_date('borrowers', 'debarred');
4580     print "Setting NULL to debarred where 0000-00-00 is stored (bug 7272)\n";
4581     SetVersion($DBversion);
4582 }
4583
4584 $DBversion = "3.07.00.003";
4585 if ( C4::Context->preference("Version") < TransformToNum($DBversion) ) {
4586     $dbh->do(" UPDATE `message_attributes` SET message_name='Item_Due' WHERE message_name='Item_DUE'");
4587     print "Updating message_name in message_attributes\n";
4588     SetVersion($DBversion);
4589 }
4590
4591 $DBversion = "3.07.00.004";
4592 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
4593     $dbh->do("ALTER TABLE  `suggestions` ADD  `patronreason` TEXT NULL AFTER  `reason`");
4594     print "Upgrade to $DBversion done (Add column to suggestions table to store patrons' reasons for submitting a suggestion. )\n";
4595     SetVersion($DBversion);
4596 }
4597
4598 $DBversion = "3.07.00.005";
4599 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
4600     $dbh->do("INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES ('BorrowerUnwantedField','','Name the fields you don''t need to store for a patron''s account',NULL,'free')");
4601     print "Upgrade to $DBversion done (BorrowerUnwantedField syspref)\n";
4602     SetVersion ($DBversion);
4603 }
4604
4605 $DBversion = "3.07.00.006";
4606 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
4607     $dbh->do("INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES ('CircAutoPrintQuickSlip', '1', 'Choose what should happen when an empty barcode field is submitted in circulation: Display a print quick slip window or Clear the screen.',NULL,'YesNo');");
4608     print "Upgrade to $DBversion done (Add syspref CircAutoPrintQuickSlip to control what should happen when an empty barcode field is submitted in circulation: Display a print quick slip window (default value, 3.6 behaviour) or clear the screen (previous 3.6 behaviour). )\n";
4609     SetVersion($DBversion);
4610 }
4611
4612 $DBversion = "3.07.00.007";
4613 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
4614     $dbh->do("ALTER TABLE items MODIFY materials text;");
4615     print "Upgrade to $DBversion done alter items.material from varchar(10) to text \n";
4616     SetVersion($DBversion);
4617 }
4618
4619 $DBversion = '3.07.00.008';
4620 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
4621     if (C4::Context->preference("marcflavour") eq 'MARC21') {
4622         if (C4::Context->preference("opaclanguages") eq "de") {
4623             $dbh->do("INSERT INTO `marc_tag_structure` (`tagfield`, `liblibrarian`, `libopac`, `repeatable`, `mandatory`, `authorised_value`, `frameworkcode`) VALUES ('545', 'Fußnote zu biografischen oder historischen Daten', 'Fußnote zu biografischen oder historischen Daten', 1, 0, NULL, '');");
4624         } else {
4625             $dbh->do("INSERT INTO `marc_tag_structure` (`tagfield`, `liblibrarian`, `libopac`, `repeatable`, `mandatory`, `authorised_value`, `frameworkcode`) VALUES ('545', 'BIOGRAPHICAL OR HISTORICAL DATA', 'BIOGRAPHICAL OR HISTORICAL DATA', 1, 0, NULL, '');");
4626         }
4627     }
4628     print "Upgrade to $DBversion done (add MARC21 field 545 to framework)\n";
4629     SetVersion ($DBversion);
4630 }
4631
4632 $DBversion = "3.07.00.009";
4633 if ( C4::Context->preference("Version") < TransformToNum($DBversion) ) {
4634     $dbh->do("ALTER TABLE `aqorders` ADD COLUMN `claims_count` INT(11)  DEFAULT 0, ADD COLUMN `claimed_date` DATE  DEFAULT NULL AFTER `claims_count`");
4635     print "Upgrade to $DBversion done (Add claims_count and claimed_date fields in aqorders table)\n";
4636     SetVersion($DBversion);
4637 }
4638
4639 $DBversion = "3.07.00.010";
4640 if ( C4::Context->preference("Version") < TransformToNum($DBversion) ) {
4641     $dbh->do(
4642         q|CREATE TABLE `biblioimages` (
4643           `imagenumber` int(11) NOT NULL AUTO_INCREMENT,
4644           `biblionumber` int(11) NOT NULL,
4645           `mimetype` varchar(15) NOT NULL,
4646           `imagefile` mediumblob NOT NULL,
4647           `thumbnail` mediumblob NOT NULL,
4648           PRIMARY KEY (`imagenumber`),
4649           CONSTRAINT `bibliocoverimage_fk1` FOREIGN KEY (`biblionumber`) REFERENCES `biblio` (`biblionumber`) ON DELETE CASCADE ON UPDATE CASCADE
4650           ) ENGINE=InnoDB DEFAULT CHARSET=utf8|
4651     );
4652     $dbh->do(
4653         q|INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES ('OPACLocalCoverImages','0','Display local cover images on OPAC search and details pages.','1','YesNo')|
4654         );
4655     $dbh->do(
4656         q|INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES ('LocalCoverImages','0','Display local cover images on intranet search and details pages.','1','YesNo')|
4657         );
4658     $dbh->do(
4659         q|INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES ('AllowMultipleCovers','0','Allow multiple cover images to be attached to each bibliographic record.','1','YesNo')|
4660     );
4661     $dbh->do(
4662         q|INSERT INTO permissions (module_bit, code, description) VALUES (13, 'upload_local_cover_images', 'Upload local cover images')|
4663     );
4664     print "Upgrade to $DBversion done (Added support for local cover images)\n";
4665     SetVersion($DBversion);
4666 }
4667
4668 $DBversion = "3.07.00.011";
4669 if ( C4::Context->preference("Version") < TransformToNum($DBversion) ) {
4670     $dbh->do(<<ENDOFRENEWAL);
4671     INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES('BorrowerRenewalPeriodBase', 'now', 'Set whether the borrower renewal date should be counted from the dateexpiry or from the current date ','dateexpiry|now','Choice');
4672 ENDOFRENEWAL
4673     print "Upgrade to $DBversion done (Added a system preference to allow renewal of Patron account either from todays date or from existing expiry date in the patrons account.)\n";
4674     SetVersion($DBversion);
4675 }
4676
4677 $DBversion = "3.07.00.012";
4678 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
4679     $dbh->do("INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES ('AllowItemsOnHoldCheckout',0,'Do not generate RESERVE_WAITING and RESERVED warning when checking out items reserved to someone else. This allows self checkouts for those items.','','YesNo')");
4680     print "Upgrade to $DBversion add 'AllowItemsOnHoldCheckout' syspref \n";
4681     SetVersion ($DBversion);
4682 }
4683
4684 $DBversion = "3.07.00.013";
4685 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
4686     $dbh->do("INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES('OpacExportOptions','bibtex|dc|marcxml|marc8|utf8|marcstd|mods|ris','Define available export options on OPAC detail page.','','free');");
4687     print "Upgrade to $DBversion done (Bug 7345: Add system preference OpacExportOptions.)\n";
4688     SetVersion ($DBversion);
4689 }
4690
4691 $DBversion = "3.07.00.014";
4692 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
4693     print "RELTERMS category available for English-, French-, and Spanish-language relator terms. They are not loaded during upgrade but can be easily inserted using the provided marc21_relatorterms.sql SQL script (MARC21 only, and currently available for en, es, and fr only).\n";
4694     SetVersion($DBversion);
4695 }
4696
4697 $DBversion = "3.07.00.015";
4698 if ( C4::Context->preference("Version") < TransformToNum($DBversion) ) {
4699     my $sth = $dbh->prepare(q|
4700         SELECT COUNT(*) FROM marc_subfield_structure where kohafield="biblioitems.editionstatement"
4701         |);
4702     $sth->execute;
4703     my $already_exists = $sth->fetchrow;
4704     if ( not $already_exists ) {
4705         my $field = C4::Context->preference("marcflavour") eq "UNIMARC" ? "205" : "250";
4706         my $subfield = "a";
4707         my $sth = $dbh->prepare( q|
4708             UPDATE marc_subfield_structure SET kohafield = "biblioitems.editionstatement"
4709             WHERE tagfield = ? AND tagsubfield = ?
4710         |);
4711         $sth->execute( $field, $subfield );
4712         print "Upgrade to $DBversion done (Added a mapping for biblioitems.editionstatement.)\n";
4713     } else {
4714         print "Upgrade to $DBversion done (Added a mapping for biblioitems.editionstatement (already exists, nothing to do).)\n";
4715     }
4716     SetVersion($DBversion);
4717 }
4718
4719 $DBversion = "3.07.00.016";
4720 if ( C4::Context->preference("Version") < TransformToNum($DBversion) ) {
4721     $dbh->do("ALTER TABLE items ADD KEY `itemcallnumber` (itemcallnumber)");
4722     print "Upgrade to $DBversion done (Added index on items.itemcallnumber)\n";
4723     SetVersion($DBversion);
4724 }
4725
4726 $DBversion = "3.07.00.017";
4727 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
4728     $dbh->do("INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES('TransferWhenCancelAllWaitingHolds','0','Transfer items when cancelling all waiting holds',NULL,'YesNo')");
4729     print "Upgrade to $DBversion done (Add sysprefs to control transfer when cancel all waiting holds)\n";
4730     SetVersion ($DBversion);
4731 }
4732
4733 $DBversion = "3.07.00.018";
4734 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
4735     $dbh->do("CREATE TABLE pending_offline_operations ( operationid int(11) NOT NULL AUTO_INCREMENT, userid varchar(30) NOT NULL, branchcode varchar(10) NOT NULL, timestamp timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, action varchar(10) NOT NULL, barcode varchar(20) NOT NULL, cardnumber varchar(16) DEFAULT NULL, PRIMARY KEY (operationid) ) ENGINE=MyISAM DEFAULT CHARSET=utf8;");
4736     print "Upgrade to $DBversion done ( adding offline operations table )\n";
4737     SetVersion($DBversion);
4738 }
4739
4740 $DBversion = "3.07.00.019";
4741 if ( C4::Context->preference("Version") < TransformToNum($DBversion) ) {
4742     $dbh->do(" UPDATE `systempreferences` SET  `value` =  'none', `options` =  'none|full|first|surname|firstandinitial|username', `explanation` =  'Choose how a commenter''s identity is presented alongside comments in the OPAC', `type` =  'Choice' WHERE  `systempreferences`.`variable` =  'ShowReviewer' AND `systempreferences`.`variable` = 0");
4743     $dbh->do(" UPDATE `systempreferences` SET  `value` =  'full', `options` =  'none|full|first|surname|firstandinitial|username', `explanation` =  'Choose how a commenter''s identity is presented alongside comments in the OPAC', `type` =  'Choice' WHERE  `systempreferences`.`variable` =  'ShowReviewer' AND `systempreferences`.`variable` = 1");
4744     print "Upgrade to $DBversion done ( Adding additional options for the display of commenter's identity in the OPAC: Full name, first name, last name, first name and last name first initial, username, or no information)\n";
4745     SetVersion($DBversion);
4746 }
4747
4748 $DBversion = "3.07.00.020";
4749 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
4750     $dbh->do("INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES('OPACpatronimages',0,'Enable patron images in the OPAC',NULL,'YesNo');");
4751     print "Upgrade to $DBversion done (Bug 3516: Add the option to show patron images in the OPAC.)\n";
4752     SetVersion($DBversion);
4753 }
4754
4755 $DBversion = "3.07.00.021";
4756 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
4757     $dbh->do(
4758     "INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES('LinkerModule','Default','Chooses which linker module to use (see documentation).','Default|FirstMatchLastMatch','Choice');"
4759     );
4760     $dbh->do(
4761     "INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES('LinkerOptions','','A pipe-separated list of options for the linker.','','free');"
4762     );
4763     $dbh->do(
4764     "INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES('LinkerRelink',1,'If ON the authority linker will relink headings that have previously been linked every time it runs.',NULL,'YesNo');"
4765     );
4766     $dbh->do(
4767     "INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES('LinkerKeepStale',0,'If ON the authority linker will keep existing authority links for headings where it is unable to find a match.',NULL,'YesNo');"
4768     );
4769     $dbh->do(
4770     "INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES('AutoCreateAuthorities',0,'Automatically create authorities that do not exist when cataloging records.',NULL,'YesNo');"
4771     );
4772     $dbh->do(
4773     "INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES('CatalogModuleRelink',0,'If OFF the linker will never replace the authids that are set in the cataloging module.',NULL,'YesNo');"
4774     );
4775     print "Upgrade to $DBversion done (Enhancement 7284, improved authority matching, see http://wiki.koha-community.org/wiki/Bug7284_authority_matching_improvement wiki page for configuration update needed)\n";
4776     SetVersion($DBversion);
4777 }
4778
4779 $DBversion = "3.07.00.022";
4780 if ( C4::Context->preference("Version") < TransformToNum($DBversion) ) {
4781     $dbh->do("DELETE FROM reviews WHERE biblionumber NOT IN (SELECT biblionumber from biblio)");
4782     $dbh->do("UPDATE reviews SET borrowernumber = NULL WHERE borrowernumber NOT IN (SELECT borrowernumber FROM borrowers)");
4783     $dbh->do("ALTER TABLE reviews ADD CONSTRAINT reviews_ibfk_2 FOREIGN KEY (`biblionumber`) REFERENCES `biblio` (`biblionumber`) ON DELETE CASCADE ON UPDATE CASCADE");
4784     $dbh->do("ALTER TABLE reviews ADD CONSTRAINT reviews_ibfk_1 FOREIGN KEY (borrowernumber) REFERENCES borrowers (borrowernumber ) ON UPDATE CASCADE ON DELETE SET NULL");
4785     print "Upgrade to $DBversion done (Bug 7493 - Add constraint linking OPAC comment biblionumber to biblio, OPAC comment borrowernumber to borrowers.)\n";
4786     SetVersion($DBversion);
4787 }
4788
4789 $DBversion = "3.07.00.023";
4790 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
4791     $dbh->do("ALTER TABLE `message_transports` DROP FOREIGN KEY `message_transports_ibfk_3`");
4792     $dbh->do("ALTER TABLE `letter` DROP PRIMARY KEY");
4793     $dbh->do("ALTER TABLE `letter` ADD `branchcode` varchar(10) default NULL AFTER `code`");
4794     $dbh->do("ALTER TABLE `letter` ADD PRIMARY KEY  (`module`,`code`, `branchcode`)");
4795     $dbh->do("ALTER TABLE `message_transports` ADD `branchcode` varchar(10) NOT NULL default ''");
4796     $dbh->do("ALTER TABLE `message_transports` ADD CONSTRAINT `message_transports_ibfk_3` FOREIGN KEY (`letter_module`, `letter_code`, `branchcode`) REFERENCES `letter` (`module`, `code`, `branchcode`) ON DELETE CASCADE ON UPDATE CASCADE");
4797     $dbh->do("ALTER TABLE `letter` ADD `is_html` tinyint(1) default 0 AFTER `name`");
4798
4799     $dbh->do("INSERT INTO `letter` (module, code, name, title, content, is_html)
4800               VALUES ('circulation','ISSUESLIP','Issue Slip','Issue Slip', '<h3><<branches.branchname>></h3>
4801 Checked out to <<borrowers.title>> <<borrowers.firstname>> <<borrowers.initials>> <<borrowers.surname>> <br />
4802 (<<borrowers.cardnumber>>) <br />
4803
4804 <<today>><br />
4805
4806 <h4>Checked Out</h4>
4807 <checkedout>
4808 <p>
4809 <<biblio.title>> <br />
4810 Barcode: <<items.barcode>><br />
4811 Date due: <<issues.date_due>><br />
4812 </p>
4813 </checkedout>
4814
4815 <h4>Overdues</h4>
4816 <overdue>
4817 <p>
4818 <<biblio.title>> <br />
4819 Barcode: <<items.barcode>><br />
4820 Date due: <<issues.date_due>><br />
4821 </p>
4822 </overdue>
4823
4824 <hr>
4825
4826 <h4 style=\"text-align: center; font-style:italic;\">News</h4>
4827 <news>
4828 <div class=\"newsitem\">
4829 <h5 style=\"margin-bottom: 1px; margin-top: 1px\"><b><<opac_news.title>></b></h5>
4830 <p style=\"margin-bottom: 1px; margin-top: 1px\"><<opac_news.new>></p>
4831 <p class=\"newsfooter\" style=\"font-size: 8pt; font-style:italic; margin-bottom: 1px; margin-top: 1px\">Posted on <<opac_news.timestamp>></p>
4832 <hr />
4833 </div>
4834 </news>', 1)");
4835     $dbh->do("INSERT INTO `letter` (module, code, name, title, content, is_html)
4836               VALUES ('circulation','ISSUEQSLIP','Issue Quick Slip','Issue Quick Slip', '<h3><<branches.branchname>></h3>
4837 Checked out to <<borrowers.title>> <<borrowers.firstname>> <<borrowers.initials>> <<borrowers.surname>> <br />
4838 (<<borrowers.cardnumber>>) <br />
4839
4840 <<today>><br />
4841
4842 <h4>Checked Out Today</h4>
4843 <checkedout>
4844 <p>
4845 <<biblio.title>> <br />
4846 Barcode: <<items.barcode>><br />
4847 Date due: <<issues.date_due>><br />
4848 </p>
4849 </checkedout>', 1)");
4850     $dbh->do("INSERT INTO `letter` (module, code, name, title, content, is_html)
4851               VALUES ('circulation','RESERVESLIP','Reserve Slip','Reserve Slip', '<h5>Date: <<today>></h5>
4852
4853 <h3> Transfer to/Hold in <<branches.branchname>></h3>
4854
4855 <h3><<borrowers.surname>>, <<borrowers.firstname>></h3>
4856
4857 <ul>
4858     <li><<borrowers.cardnumber>></li>
4859     <li><<borrowers.phone>></li>
4860     <li> <<borrowers.address>><br />
4861          <<borrowers.address2>><br />
4862          <<borrowers.city >>  <<borrowers.zipcode>>
4863     </li>
4864     <li><<borrowers.email>></li>
4865 </ul>
4866 <br />
4867 <h3>ITEM ON HOLD</h3>
4868 <h4><<biblio.title>></h4>
4869 <h5><<biblio.author>></h5>
4870 <ul>
4871    <li><<items.barcode>></li>
4872    <li><<items.itemcallnumber>></li>
4873    <li><<reserves.waitingdate>></li>
4874 </ul>
4875 <p>Notes:
4876 <pre><<reserves.reservenotes>></pre>
4877 </p>', 1)");
4878     $dbh->do("INSERT INTO `letter` (module, code, name, title, content, is_html)
4879               VALUES ('circulation','TRANSFERSLIP','Transfer Slip','Transfer Slip', '<h5>Date: <<today>></h5>
4880 <h3>Transfer to <<branches.branchname>></h3>
4881
4882 <h3>ITEM</h3>
4883 <h4><<biblio.title>></h4>
4884 <h5><<biblio.author>></h5>
4885 <ul>
4886    <li><<items.barcode>></li>
4887    <li><<items.itemcallnumber>></li>
4888 </ul>', 1)");
4889
4890     $dbh->do("INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES('NoticeCSS','','Notices CSS url.',NULL,'free')");
4891     $dbh->do("INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES('SlipCSS','','Slips CSS url.',NULL,'free')");
4892
4893     $dbh->do("UPDATE `letter` SET content = replace(content, '<<title>>', '<<biblio.title>>') WHERE code = 'HOLDPLACED'");
4894
4895     print "Upgrade to $DBversion done (Add branchcode and is_html to letter table; Default ISSUESLIP, RESERVESLIP and TRANSFERSLIP letters; Add NoticeCSS and SlipCSS sysprefs)\n";
4896     SetVersion($DBversion);
4897 }
4898
4899 $DBversion = "3.07.00.024";
4900 if ( C4::Context->preference("Version") < TransformToNum($DBversion) ) {
4901     $dbh->do("INSERT INTO systempreferences (variable,value,options,explanation,type) VALUES ('ExpireReservesMaxPickUpDelayCharge', '0', NULL , 'If ExpireReservesMaxPickUpDelay is enabled, and this field has a non-zero value, than a borrower whose waiting hold has expired will be charged this amount.',  'free')");
4902     $dbh->do("INSERT INTO systempreferences (variable,value,options,explanation,type) VALUES ('ExpireReservesMaxPickUpDelay', '0', '', 'Enabling this allows holds to expire automatically if they have not been picked by within the time period specified in ReservesMaxPickUpDelay', 'YesNo')");
4903     print "Upgrade to $DBversion done (Added system preference ExpireReservesMaxPickUpDelay, system preference ExpireReservesMaxPickUpDelayCharge, add reseves.charge_if_expired)\n";
4904 }
4905
4906 $DBversion = "3.07.00.025";
4907 if ( C4::Context->preference("Version") < TransformToNum($DBversion) ) {
4908     if (TableExists('bibliocoverimage')) {
4909         $dbh->do( q|DROP TABLE bibliocoverimage;| );
4910         $dbh->do(
4911             q|CREATE TABLE biblioimages (
4912               imagenumber int(11) NOT NULL AUTO_INCREMENT,
4913               biblionumber int(11) NOT NULL,
4914               mimetype varchar(15) NOT NULL,
4915               imagefile mediumblob NOT NULL,
4916               thumbnail mediumblob NOT NULL,
4917               PRIMARY KEY (imagenumber),
4918               CONSTRAINT bibliocoverimage_fk1 FOREIGN KEY (biblionumber) REFERENCES biblio (biblionumber) ON DELETE CASCADE ON UPDATE CASCADE
4919               ) ENGINE=InnoDB DEFAULT CHARSET=utf8;|
4920         );
4921     }
4922     print "Upgrade to $DBversion done (Correct table name for local cover images if needed. )\n";
4923     SetVersion($DBversion);
4924 }
4925
4926 $DBversion = "3.07.00.026";
4927 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
4928     $dbh->do("INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES('CalendarFirstDayOfWeek','Sunday','Select the first day of week to use in the calendar.','Sunday|Monday','Choice');");
4929     print "Upgrade to $DBversion done (Add syspref CalendarFirstDayOfWeek used to select the first day of week to use in the calendar. )\n";
4930     SetVersion($DBversion);
4931 }
4932
4933 $DBversion = "3.07.00.027";
4934 if ( C4::Context->preference("Version") < TransformToNum($DBversion) ) {
4935     $dbh->do(q{INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES('RoutingListNote','','Define a note to be shown on all routing lists','70|10','Textarea');});
4936     print "Upgrade to $DBversion done (Added system preference RoutingListNote for adding a general note to all routing lists.)\n";
4937     SetVersion($DBversion);
4938 }
4939
4940 $DBversion = "3.07.00.028";
4941 if ( C4::Context->preference("Version") < TransformToNum($DBversion) ) {
4942     $dbh->do(qq{
4943     INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES ('AllowPKIAuth','None','Use the field from a client-side SSL certificate to look a user in the Koha database','None|Common Name|emailAddress','Choice');
4944     });
4945     print "Upgrade to $DBversion done (Bug 6296 New System preference AllowPKIAuth)\n";
4946 }
4947
4948 $DBversion = "3.07.00.029";
4949 if ( C4::Context->preference("Version") < TransformToNum($DBversion) ) {
4950     $dbh->do(q{DROP TABLE IF EXISTS `oai_sets_descriptions`;});
4951     $dbh->do(q{DROP TABLE IF EXISTS `oai_sets_mappings`;});
4952     $dbh->do(q{DROP TABLE IF EXISTS `oai_sets_biblios`;});
4953     $dbh->do(q{DROP TABLE IF EXISTS `oai_sets`;});
4954
4955     $dbh->do(q{
4956         CREATE TABLE `oai_sets` (
4957           `id` int(11) NOT NULL auto_increment,
4958           `spec` varchar(80) NOT NULL UNIQUE,
4959           `name` varchar(80) NOT NULL,
4960           PRIMARY KEY (`id`)
4961         ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
4962     });
4963
4964     $dbh->do(q{
4965         CREATE TABLE `oai_sets_descriptions` (
4966           `set_id` int(11) NOT NULL,
4967           `description` varchar(255) NOT NULL,
4968           CONSTRAINT `oai_sets_descriptions_ibfk_1` FOREIGN KEY (`set_id`) REFERENCES `oai_sets` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
4969         ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
4970     });
4971
4972     $dbh->do(q{
4973         CREATE TABLE `oai_sets_mappings` (
4974           `set_id` int(11) NOT NULL,
4975           `marcfield` char(3) NOT NULL,
4976           `marcsubfield` char(1) NOT NULL,
4977           `marcvalue` varchar(80) NOT NULL,
4978           CONSTRAINT `oai_sets_mappings_ibfk_1` FOREIGN KEY (`set_id`) REFERENCES `oai_sets` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
4979         ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
4980     });
4981
4982     $dbh->do(q{
4983         CREATE TABLE `oai_sets_biblios` (
4984           `biblionumber` int(11) NOT NULL,
4985           `set_id` int(11) NOT NULL,
4986           PRIMARY KEY (`biblionumber`, `set_id`),
4987           CONSTRAINT `oai_sets_biblios_ibfk_1` FOREIGN KEY (`biblionumber`) REFERENCES `biblio` (`biblionumber`) ON DELETE CASCADE ON UPDATE CASCADE,
4988           CONSTRAINT `oai_sets_biblios_ibfk_2` FOREIGN KEY (`set_id`) REFERENCES `oai_sets` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
4989         ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
4990     });
4991
4992     $dbh->do(q{
4993         INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES('OAI-PMH:AutoUpdateSets','0','Automatically update OAI sets when a bibliographic record is created or updated','','YesNo');
4994     });
4995
4996     print "Upgrade to $DBversion done (Atomic update for OAI-PMH sets management)\n";
4997     SetVersion($DBversion);
4998 }
4999
5000 $DBversion = "3.07.00.030";
5001 if ( C4::Context->preference("Version") < TransformToNum($DBversion) ) {
5002     $dbh->do("ALTER TABLE default_circ_rules ADD
5003             COLUMN `returnbranch` varchar(15) default NULL AFTER `holdallowed`");
5004     $dbh->do("ALTER TABLE branch_item_rules ADD
5005             COLUMN `returnbranch` varchar(15) default NULL AFTER `holdallowed`");
5006     $dbh->do("ALTER TABLE default_branch_circ_rules ADD
5007             COLUMN `returnbranch` varchar(15) default NULL AFTER `holdallowed`");
5008     $dbh->do("ALTER TABLE default_branch_item_rules ADD
5009             COLUMN `returnbranch` varchar(15) default NULL AFTER `holdallowed`");
5010     # set the default rule to the current value of HomeOrHoldingBranchReturn (default to 'homebranch' if need be)
5011     my $homeorholdingbranchreturn = C4::Context->preference('HomeOrHoldingBranchReturn') || 'homebranch';
5012     $dbh->do("UPDATE default_circ_rules SET returnbranch = '$homeorholdingbranchreturn'");
5013     print "Upgrade to $DBversion done (Atomic update for OAI-PMH sets management)\n";
5014     SetVersion($DBversion);
5015 }
5016
5017 $DBversion = "3.07.00.031";
5018 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
5019     $dbh->do("INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES ('UseICU', '1', 'Tell Koha if ICU indexing is in use for Zebra or not.','1','YesNo')");
5020     print "Upgrade to $DBversion done (Add syspref to tell Koha if ICU indexing is in use for Zebra or not.)\n";
5021     SetVersion ($DBversion);
5022 }
5023
5024 $DBversion = "3.07.00.032";
5025 if ( C4::Context->preference("Version") < TransformToNum($DBversion) ) {
5026     $dbh->do("ALTER TABLE virtualshelves MODIFY COLUMN owner int"); #should have been int already (fk to borrowers)
5027     $dbh->do("UPDATE virtualshelves vi LEFT JOIN borrowers bo ON bo.borrowernumber=vi.owner SET vi.owner=NULL where bo.borrowernumber IS NULL"); #before adding the constraint on borrowernumber, we need to get rid of deleted owners
5028     $dbh->do("DELETE FROM virtualshelves WHERE owner IS NULL and category=1"); #delete private lists without owner (cascades to shelfcontents)
5029     $dbh->do("ALTER TABLE virtualshelves ADD COLUMN allow_add tinyint(1) DEFAULT 0, ADD COLUMN allow_delete_own tinyint(1) DEFAULT 1, ADD COLUMN allow_delete_other tinyint(1) DEFAULT 0, ADD CONSTRAINT `virtualshelves_ibfk_1` FOREIGN KEY (`owner`) REFERENCES `borrowers` (`borrowernumber`) ON DELETE SET NULL ON UPDATE SET NULL");
5030     $dbh->do("UPDATE virtualshelves SET allow_add=0, allow_delete_own=1, allow_delete_other=0 WHERE category=1");
5031     $dbh->do("UPDATE virtualshelves SET allow_add=0, allow_delete_own=1, allow_delete_other=0 WHERE category=2");
5032     $dbh->do("UPDATE virtualshelves SET allow_add=1, allow_delete_own=1, allow_delete_other=1 WHERE category=3");
5033     $dbh->do("UPDATE virtualshelves SET category=2 WHERE category=3");
5034
5035     $dbh->do("ALTER TABLE virtualshelfcontents ADD COLUMN borrowernumber int, ADD CONSTRAINT `shelfcontents_ibfk_3` FOREIGN KEY (`borrowernumber`) REFERENCES `borrowers` (`borrowernumber`) ON DELETE SET NULL ON UPDATE SET NULL");
5036     $dbh->do("UPDATE virtualshelfcontents co LEFT JOIN virtualshelves sh USING (shelfnumber) SET co.borrowernumber=sh.owner");
5037
5038     $dbh->do("CREATE TABLE virtualshelfshares
5039     (id int AUTO_INCREMENT PRIMARY KEY, shelfnumber int NOT NULL,
5040     borrowernumber int, invitekey varchar(10), sharedate datetime,
5041     CONSTRAINT `virtualshelfshares_ibfk_1` FOREIGN KEY (`shelfnumber`) REFERENCES `virtualshelves` (`shelfnumber`) ON DELETE CASCADE ON UPDATE CASCADE,
5042         CONSTRAINT `virtualshelfshares_ibfk_2` FOREIGN KEY (`borrowernumber`) REFERENCES `borrowers` (`borrowernumber`) ON DELETE SET NULL ON UPDATE SET NULL) ENGINE=InnoDB DEFAULT CHARSET=utf8");
5043
5044     $dbh->do("INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES('OpacAllowPublicListCreation',1,'If set, allows opac users to create public lists',NULL,'YesNo');");
5045     $dbh->do("INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES('OpacAllowSharingPrivateLists',0,'If set, allows opac users to share private lists with other patrons',NULL,'YesNo');");
5046
5047     print "Upgrade to $DBversion done (BZ7310: Improving list permissions)\n";
5048     SetVersion($DBversion);
5049 }
5050
5051 $DBversion = "3.07.00.033";
5052 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
5053     $dbh->do("ALTER TABLE branches ADD opac_info text;");
5054     print "Upgrade to $DBversion done add opac_info to branches \n";
5055     SetVersion($DBversion);
5056 }
5057
5058 $DBversion = "3.07.00.034";
5059 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
5060     $dbh->do("ALTER TABLE borrower_attribute_types ADD COLUMN category_code VARCHAR(10) NULL DEFAULT NULL AFTER `display_checkout`");
5061     $dbh->do("ALTER TABLE borrower_attribute_types ADD COLUMN class VARCHAR(255)  NOT NULL DEFAULT '' AFTER `category_code`");
5062     $dbh->do("ALTER TABLE borrower_attribute_types ADD CONSTRAINT category_code_fk FOREIGN KEY (category_code) REFERENCES categories(categorycode)");
5063     print "Upgrade to $DBversion done (New fields category_code and class in borrower_attribute_types table)\n";
5064     SetVersion($DBversion);
5065 }
5066
5067 $DBversion = "3.07.00.035";
5068 if ( C4::Context->preference("Version") < TransformToNum($DBversion) ) {
5069     $dbh->do("ALTER TABLE issues CHANGE date_due date_due datetime");
5070     $dbh->do("UPDATE issues SET date_due = CONCAT(SUBSTR(date_due,1,11),'23:59:00')");
5071     $dbh->do("ALTER TABLE issues CHANGE returndate returndate datetime");
5072     $dbh->do("ALTER TABLE issues CHANGE lastreneweddate lastreneweddate datetime");
5073     $dbh->do("ALTER TABLE issues CHANGE issuedate issuedate datetime");
5074     $dbh->do("ALTER TABLE old_issues CHANGE date_due date_due datetime");
5075     $dbh->do("ALTER TABLE old_issues CHANGE returndate returndate datetime");
5076     $dbh->do("ALTER TABLE old_issues CHANGE lastreneweddate lastreneweddate datetime");
5077     $dbh->do("ALTER TABLE old_issues CHANGE issuedate issuedate datetime");
5078     $dbh->do("UPDATE accountlines SET description = CONCAT(description,' 23:59') WHERE accounttype='F' OR accounttype='FU'"); #BUG-8253
5079     print "Upgrade to $DBversion done (Setting up issues and accountlines tables for hourly loans)\n";
5080     SetVersion($DBversion);
5081 }
5082
5083 $DBversion = "3.07.00.036";
5084 if ( C4::Context->preference("Version") < TransformToNum($DBversion) ) {
5085     $dbh->do(qq{
5086        ALTER TABLE z3950servers ADD timeout INT( 11 ) NOT NULL DEFAULT '0' AFTER syntax;
5087     });
5088     print "Upgrade to $DBversion done (New timeout field in z3950servers)\n";
5089 }
5090
5091 $DBversion = "3.07.00.037";
5092 if ( C4::Context->preference("Version") < TransformToNum($DBversion) ) {
5093     $dbh->do("
5094        ALTER TABLE  `marc_subfield_structure` ADD  `maxlength` INT( 4 ) NOT NULL DEFAULT  '9999';
5095        ");
5096        $dbh->do("
5097        UPDATE `marc_subfield_structure` SET maxlength=24 WHERE tagfield='000';
5098        ");
5099        $dbh->do("
5100        UPDATE marc_subfield_structure SET maxlength = IF ((SELECT value FROM systempreferences WHERE variable = 'marcflavour')='MARC21','40','9999') WHERE tagfield='008';
5101        ");
5102        $dbh->do("
5103        UPDATE marc_subfield_structure SET maxlength = IF ((SELECT value FROM systempreferences WHERE variable = 'marcflavour')='NORMARC','40','9999') WHERE tagfield='008';
5104        ");
5105        $dbh->do("
5106        UPDATE marc_subfield_structure SET maxlength = IF ((SELECT value FROM systempreferences WHERE variable = 'marcflavour')='UNIMARC','36','9999') WHERE tagfield='100';
5107        ");
5108     print "Upgrade to $DBversion done (Add new field maxlength to marc_subfield_structure)\n";
5109     SetVersion($DBversion);
5110 }
5111
5112 $DBversion = "3.07.00.038";
5113 if ( C4::Context->preference("Version") < TransformToNum($DBversion) ) {
5114     $dbh->do(qq{
5115         INSERT INTO systempreferences(variable,value,explanation,options,type)
5116         VALUES('UniqueItemFields', 'barcode', 'Space-separated list of fields that should be unique (used in acquisition module for item creation). Fields must be valid SQL column names of items table', '', 'Free')
5117     });
5118     print "Upgrade to $DBversion done (Added system preference 'UniqueItemFields')\n";
5119     SetVersion($DBversion);
5120 }
5121
5122 $DBversion = "3.07.00.039";
5123 if ( C4::Context->preference("Version") < TransformToNum($DBversion) ) {
5124     $dbh->do( qq{INSERT IGNORE INTO systempreferences (variable,value,explanation,options,type) VALUES('Babeltheque_url_js','','Url for Babeltheque javascript (e.g. http://www.babeltheque.com/bw_XX.js','','Free')} );
5125     $dbh->do( qq{CREATE TABLE IF NOT EXISTS social_data
5126       ( isbn VARCHAR(30),
5127         num_critics INT,
5128         num_critics_pro INT,
5129         num_quotations INT,
5130         num_videos INT,
5131         score_avg DECIMAL(5,2),
5132         num_scores INT,
5133         PRIMARY KEY  (isbn)
5134       ) ENGINE=InnoDB DEFAULT CHARSET=utf8
5135     } );
5136     $dbh->do( qq{INSERT IGNORE INTO systempreferences (variable,value,explanation,options,type) VALUES ('Babeltheque_url_update', '', 'Url for Babeltheque update (E.G. http://www.babeltheque.com/.../file.csv.bz2)', '', 'Free')} );
5137     print "Upgrade to $DBversion done (added syspref and table for babeltheque (Babeltheque_url_js, babeltheque))\n";
5138     SetVersion($DBversion);
5139 }
5140
5141 $DBversion = "3.07.00.040";
5142 if ( C4::Context->preference("Version") < TransformToNum($DBversion) ) {
5143     $dbh->do( qq{INSERT IGNORE INTO systempreferences (variable,value,explanation,options,type) VALUES('SocialNetworks','0','Enable/Disable social networks links in opac detail','','YesNo')} );
5144     print "Upgrade to $DBversion done (added syspref SocialNetworks, to display facebook/ggl+ and other buttons)\n";
5145     SetVersion($DBversion);
5146 }
5147
5148
5149
5150 $DBversion = "3.07.00.041";
5151 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
5152     $dbh->do("INSERT INTO systempreferences (variable,value,options,explanation,type) VALUES('SubscriptionDuplicateDroppedInput','','','List of fields which must not be rewritten when a subscription is duplicated (Separated by pipe |)','Free')");
5153     print "Upgrade to $DBversion done (Add system preference SubscriptionDuplicateDroppedInput)\n";
5154     SetVersion($DBversion);
5155 }
5156
5157 $DBversion = "3.07.00.042";
5158 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
5159     $dbh->do("ALTER TABLE reserves ADD suspend BOOLEAN NOT NULL DEFAULT 0");
5160     $dbh->do("ALTER TABLE old_reserves ADD suspend BOOLEAN NOT NULL DEFAULT 0");
5161
5162     $dbh->do("ALTER TABLE reserves ADD suspend_until DATETIME NULL DEFAULT NULL");
5163     $dbh->do("ALTER TABLE old_reserves ADD suspend_until DATETIME NULL DEFAULT NULL");
5164
5165     $dbh->do("INSERT INTO systempreferences (variable,value,options,explanation,type) VALUES ('AutoResumeSuspendedHolds',  '1', NULL ,  'Allow suspended holds to be automatically resumed by a set date.',  'YesNo')");
5166
5167     print "Upgrade to $DBversion done (Add suspend fields to reserves table, add syspref AutoResumeSuspendedHolds)\n";
5168     SetVersion ($DBversion);
5169 }
5170
5171 $DBversion = "3.07.00.043";
5172 if ( C4::Context->preference("Version") < TransformToNum($DBversion) ) {
5173     my $countXSLTDetailsDisplay = 0;
5174     my $valueXSLTDetailsDisplay = "";
5175     my $valueXSLTResultsDisplay = "";
5176     my $valueOPACXSLTDetailsDisplay = "";
5177     my $valueOPACXSLTResultsDisplay = "";
5178     #the line below test if database comes from a BibLibre's branch
5179     $countXSLTDetailsDisplay = $dbh->do('SELECT 1 FROM systempreferences WHERE variable="IntranetXSLTDetailsDisplay"');
5180     if ($countXSLTDetailsDisplay > 0)
5181     {
5182         #the two lines below will only be used to update the databases from the BibLibre's branch. They will not affect the others
5183         $dbh->do(q|UPDATE systempreferences SET variable="XSLTDetailsDisplay" WHERE variable="IntranetXSLTDetailsDisplay"|);
5184         $dbh->do(q|UPDATE systempreferences SET variable="XSLTResultsDisplay" WHERE variable="IntranetXSLTResultsDisplay"|);
5185     }
5186     else
5187     {
5188         $valueXSLTDetailsDisplay = "default" if (C4::Context->preference("XSLTDetailsDisplay"));
5189         $valueXSLTResultsDisplay = "default" if (C4::Context->preference("XSLTResultsDisplay"));
5190         $valueOPACXSLTDetailsDisplay = "default" if (C4::Context->preference("OPACXSLTDetailsDisplay"));
5191         $valueOPACXSLTResultsDisplay = "default" if (C4::Context->preference("OPACXSLTResultsDisplay"));
5192         $dbh->do("UPDATE systempreferences SET type='Free', value=\"$valueXSLTDetailsDisplay\" WHERE variable='XSLTDetailsDisplay'");
5193         $dbh->do("UPDATE systempreferences SET type='Free', value=\"$valueXSLTResultsDisplay\" WHERE variable='XSLTResultsDisplay'");
5194         $dbh->do("UPDATE systempreferences SET type='Free', value=\"$valueOPACXSLTDetailsDisplay\" WHERE variable='OPACXSLTDetailsDisplay'");
5195         $dbh->do("UPDATE systempreferences SET type='Free', value=\"$valueOPACXSLTResultsDisplay\" WHERE variable='OPACXSLTResultsDisplay'");
5196     }
5197     print "Upgrade to $DBversion done (XSLT systempreference takes a path to file rather than YesNo)\n";
5198     SetVersion($DBversion);
5199 }
5200
5201 $DBversion = "3.07.00.044";
5202 if ( C4::Context->preference("Version") < TransformToNum($DBversion) ) {
5203     $dbh->do("ALTER TABLE aqbooksellers ADD deliverytime INT DEFAULT NULL");
5204     print "Upgrade to $DBversion done (Add deliverytime field in aqbooksellers table)";
5205     SetVersion($DBversion);
5206 }
5207
5208 $DBversion = "3.07.00.045";
5209 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
5210     $dbh->do("ALTER TABLE import_batches MODIFY COLUMN batch_type ENUM('batch','z3950','webservice') NOT NULL default 'batch'");
5211     print "Upgrade to $DBversion done (Add 'webservice' to batch_type enum)\n";
5212     SetVersion ($DBversion);
5213 }
5214
5215 $DBversion = "3.07.00.046";
5216 if ( C4::Context->preference("Version") < TransformToNum($DBversion) ) {
5217     $dbh->do("ALTER TABLE issuingrules ADD COLUMN lengthunit varchar(10) DEFAULT 'days' AFTER issuelength");
5218     print "Upgrade to $DBversion done (Setting up issues tables for hourly loans (lengthunit fix))\n";
5219     SetVersion($DBversion);
5220 }
5221
5222 $DBversion = "3.07.00.047";
5223 if ( C4::Context->preference("Version") < TransformToNum($DBversion) ) {
5224     $dbh->do("CREATE INDEX items_location ON items(location)");
5225     $dbh->do("CREATE INDEX items_ccode ON items(ccode)");
5226     print "Upgrade to $DBversion done (items_location and items_ccode indexes added for ShelfBrowser)\n";
5227     SetVersion($DBversion);
5228 }
5229
5230 $DBversion = "3.07.00.048";
5231 if ( C4::Context->preference("Version") < TransformToNum($DBversion) ) {
5232     $dbh->do(
5233         q | CREATE TABLE ratings (
5234   borrowernumber int(11) NOT NULL,
5235   biblionumber int(11) NOT NULL,
5236   rating_value tinyint(1) NOT NULL,
5237   timestamp timestamp NOT NULL default CURRENT_TIMESTAMP,
5238   PRIMARY KEY  (borrowernumber,biblionumber),
5239   CONSTRAINT ratings_ibfk_1 FOREIGN KEY (borrowernumber) REFERENCES borrowers (borrowernumber) ON DELETE CASCADE ON UPDATE CASCADE,
5240   CONSTRAINT ratings_ibfk_2 FOREIGN KEY (biblionumber) REFERENCES biblio (biblionumber) ON DELETE CASCADE ON UPDATE CASCADE
5241 ) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
5242     );
5243
5244     $dbh->do(
5245 q /INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES ('OpacStarRatings','disable',NULL,'disable|all|details','Choice') /
5246     );
5247
5248     print
5249 "Upgrade to $DBversion done (Add 'ratings' table and 'OpacStarRatings' syspref)\n";
5250     SetVersion($DBversion);
5251 }
5252
5253 $DBversion = "3.07.00.049";
5254 if ( C4::Context->preference("Version") < TransformToNum($DBversion) ) {
5255     $dbh->do("INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES('OpacBrowseResults','1','Disable/enable browsing and paging search results from the OPAC detail page.',NULL,'YesNo')");
5256     print "Upgrade to $DBversion done (Add system preference OpacBrowseResults ))\n";
5257     SetVersion($DBversion);
5258 }
5259
5260 $DBversion = "3.08.00.000";
5261 if ( C4::Context->preference("Version") < TransformToNum($DBversion) ) {
5262     print "Upgrade to $DBversion done\n";
5263     SetVersion($DBversion);
5264 }
5265
5266 $DBversion = "3.09.00.001";
5267 if ( C4::Context->preference("Version") < TransformToNum($DBversion) ) {
5268     $dbh->do("ALTER TABLE borrower_attribute_types MODIFY category_code VARCHAR( 1 ) NULL DEFAULT NULL");
5269     print "Upgrade to $DBversion done. (Bug 8002: Update patron attribute types table to allow NULL category_code)\n";
5270     SetVersion($DBversion);
5271 }
5272
5273 $DBversion = "3.09.00.002";
5274 if ( C4::Context->preference("Version") < TransformToNum($DBversion) ) {
5275     $dbh->do("ALTER TABLE saved_sql
5276         ADD (
5277             cache_expiry INT NOT NULL DEFAULT 300,
5278             public BOOLEAN NOT NULL DEFAULT FALSE
5279         );
5280     ");
5281     print "Upgrade to $DBversion done (Added cache_expiry and public fields in
5282 saved_reports table.)\n";
5283     SetVersion($DBversion);
5284 }
5285
5286 $DBversion = "3.09.00.003";
5287 if ( C4::Context->preference("Version") < TransformToNum($DBversion) ) {
5288     $dbh->do("INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES('SvcMaxReportRows','10','Maximum number of rows to return via the report web service.',NULL,'Integer');");
5289     print "Upgrade to $DBversion done (Added SvcMaxReportRows syspref)\n";
5290     SetVersion($DBversion);
5291 }
5292
5293 $DBversion = "3.09.00.004";
5294 if ( C4::Context->preference("Version") < TransformToNum($DBversion) ) {
5295     $dbh->do("INSERT IGNORE INTO permissions (module_bit, code, description) VALUES('13', 'edit_patrons', 'Perform batch modifivation of patrons')");
5296     print "Upgrade to $DBversion done (Adds permissions flag for access to the patron modifications tool)\n";
5297     SetVersion($DBversion);
5298 }
5299
5300 $DBversion = "3.09.00.005";
5301 if ( C4::Context->preference("Version") < TransformToNum($DBversion) ) {
5302     unless (TableExists('quotes')) {
5303         $dbh->do( qq{
5304             CREATE TABLE `quotes` (
5305               `id` int(11) NOT NULL AUTO_INCREMENT,
5306               `source` text DEFAULT NULL,
5307               `text` mediumtext NOT NULL,
5308               `timestamp` datetime NOT NULL,
5309               PRIMARY KEY (`id`)
5310             ) ENGINE=InnoDB DEFAULT CHARSET=utf8
5311         });
5312     }
5313     $dbh->do( qq{
5314         INSERT IGNORE INTO permissions VALUES (13, "edit_quotes","Edit quotes for quote-of-the-day feature");
5315     });
5316     $dbh->do( qq{
5317         INSERT IGNORE INTO `systempreferences` (variable,value,explanation,options,type) VALUES('QuoteOfTheDay',0,'Enable or disable display of Quote of the Day on the OPAC home page',NULL,'YesNo');
5318     });
5319     print "Upgrade to $DBversion done (Adding Quote of the Day Option.)\n";
5320     SetVersion($DBversion);
5321 }
5322
5323 $DBversion = "3.09.00.006";
5324 if ( C4::Context->preference("Version") < TransformToNum($DBversion) ) {
5325     $dbh->do("UPDATE systempreferences SET
5326                 variable = 'OPACShowHoldQueueDetails',
5327                 value = CASE value WHEN '1' THEN 'priority' ELSE 'none' END,
5328                 options = 'none|priority|holds|holds_priority',
5329                 explanation = 'Show holds details in OPAC',
5330                 type = 'Choice'
5331               WHERE variable = 'OPACDisplayRequestPriority'");
5332     print "Upgrade to $DBversion done (Changed system preference OPACDisplayRequestPriority -> OPACShowHoldQueueDetails)\n";
5333     SetVersion($DBversion);
5334 }
5335
5336 $DBversion = "3.09.00.007";
5337 if ( C4::Context->preference("Version") < TransformToNum($DBversion) ) {
5338     unless(C4::Context->preference('ReservesControlBranch')){
5339         $dbh->do("INSERT INTO `systempreferences` (variable,value,options,explanation,type) VALUES ('ReservesControlBranch','PatronLibrary','ItemHomeLibrary|PatronLibrary','Branch checked for members reservations rights.','Choice')");
5340     }
5341     print "Upgrade to $DBversion done (Insert ReservesControlBranch systempreference into systempreferences table )\n";
5342     SetVersion($DBversion);
5343 }
5344
5345 $DBversion = "3.09.00.008";
5346 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
5347     $dbh->do("ALTER TABLE sessions ADD PRIMARY KEY (id);");
5348     $dbh->do("ALTER TABLE sessions DROP INDEX `id`;");
5349     print "Upgrade to $DBversion done (redefine the field id as PRIMARY KEY of sessions)\n";
5350     SetVersion($DBversion);
5351 }
5352
5353 $DBversion = "3.09.00.009";
5354 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
5355     $dbh->do("ALTER TABLE branches ADD PRIMARY KEY (branchcode);");
5356     $dbh->do("ALTER TABLE branches DROP INDEX branchcode;");
5357     print "Upgrade to $DBversion done (redefine the field branchcode as PRIMARY KEY of branches)\n";
5358     SetVersion ($DBversion);
5359 }
5360
5361 $DBversion = "3.09.00.010";
5362 if ( C4::Context->preference("Version") < TransformToNum($DBversion) ) {
5363     $dbh->do("INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES('IssueLostItem', 'alert', 'alert|confirm|nothing', 'Defines what should be done when an attempt is made to issue an item that has been marked as lost.', 'Choice')");
5364     print "Upgrade to $DBversion done (Add system preference issuelostitem ))\n";
5365     SetVersion($DBversion);
5366 }
5367
5368 $DBversion = "3.09.00.011";
5369 if ( C4::Context->preference("Version") < TransformToNum($DBversion) ) {
5370     $dbh->do("ALTER TABLE `biblioitems` ADD `ean` VARCHAR( 13 ) NULL AFTER issn");
5371     $dbh->do("CREATE INDEX `ean` ON biblioitems (`ean`) ");
5372     $dbh->do("ALTER TABLE `deletedbiblioitems` ADD `ean` VARCHAR( 13 ) NULL AFTER issn");
5373     if (C4::Context->preference("marcflavour") eq 'UNIMARC') {
5374          $dbh->do("UPDATE marc_subfield_structure SET kohafield='biblioitems.ean' WHERE tagfield='073' and tagsubfield='a'");
5375     }
5376     print "Upgrade to $DBversion done (Adding ean in biblioitems and deletedbiblioitems)\n";
5377     print "If you have records with ean, please run misc/batchRebuildBiblioTables.pl to populate bibliotems.ean\n" if (C4::Context->preference("marcflavour") eq 'UNIMARC');
5378     SetVersion($DBversion);
5379 }
5380
5381 $DBversion = "3.09.00.012";
5382 if ( C4::Context->preference("Version") < TransformToNum($DBversion) ) {
5383     $dbh->do("INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES('SuspendHoldsIntranet', '1', NULL , 'Allow holds to be suspended from the intranet.', 'YesNo')");
5384     $dbh->do("INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES('SuspendHoldsOpac', '1', NULL , 'Allow holds to be suspended from the OPAC.', 'YesNo')");
5385     print "Upgrade to $DBversion done (Add system preference OpacBrowseResults ))\n";
5386     SetVersion($DBversion);
5387 }
5388
5389 $DBversion ="3.09.00.013";
5390 if ( C4::Context->preference("Version") < TransformToNum($DBversion) ) {
5391     $dbh->do("INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES('DefaultLanguageField008','','Fill in the default language for field 008 Range 35-37 (e.g. eng, nor, ger, see www.loc.gov/marc/languages/language_code.html)','','Free');");
5392     print "Upgrade to $DBversion done (Add system preference DefaultLanguageField008))\n";
5393     SetVersion($DBversion);
5394 }
5395
5396 $DBversion ="3.09.00.014";
5397 if ( C4::Context->preference("Version") < TransformToNum($DBversion) ) {
5398     # add phone message transport type
5399     $dbh->do("INSERT INTO message_transport_types (message_transport_type) VALUES ('phone')");
5400
5401     # adds HOLD_PHONE and PREDUE_PHONE letters (as placeholders)
5402     $dbh->do("INSERT INTO letter (module, code, name, title, content) VALUES
5403               ('reserves', 'HOLD_PHONE', 'Item Available for Pick-up (phone notice)', 'Item Available for Pick-up (phone notice)', 'Your item is available for pickup'),
5404               ('circulation', 'PREDUE_PHONE', 'Advance Notice of Item Due (phone notice)', 'Advance Notice of Item Due (phone notice)', 'Your item is due soon'),
5405               ('circulation', 'OVERDUE_PHONE', 'Overdue Notice (phone notice)', 'Overdue Notice (phone notice)', 'Your item is overdue')
5406               ");
5407
5408     # add phone notifications to patron message preferences options
5409     $dbh->do("INSERT INTO message_transports
5410              (message_attribute_id, message_transport_type, is_digest, letter_module, letter_code) VALUES
5411              (4, 'phone', 0, 'reserves', 'HOLD_PHONE'),
5412              (2, 'phone', 0, 'circulation', 'PREDUE_PHONE')
5413              ");
5414
5415     # add TalkingTechItivaPhoneNotification syspref
5416     $dbh->do("INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES('TalkingTechItivaPhoneNotification',0,'If ON, enables Talking Tech I-tiva phone notifications',NULL,'YesNo');");
5417
5418     print "Upgrade done (Support for Talking Tech i-tiva phone notification system)\n";
5419     SetVersion($DBversion);
5420 }
5421
5422 $DBversion = "3.09.00.015";
5423 if ( C4::Context->preference("Version") < TransformToNum($DBversion) ) {
5424     $dbh->do(qq{
5425         INSERT IGNORE INTO systempreferences (variable,value,explanation,options,type) VALUES('StatisticsFields','location|itype|ccode','Define Fields (from the items table) used for statistics members','location|itype|ccode','free')
5426     });
5427     print "Upgrade to $DBversion done (Add System preference StatisticsFields)\n";
5428     SetVersion($DBversion);
5429 }
5430
5431 $DBversion = "3.09.00.016";
5432 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
5433     $dbh->do("INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES('OPACShowBarcode','0','Show items barcode in holding tab','','YesNo')");
5434     print "Upgrade to $DBversion done (Add syspref OPACShowBarcode)\n";
5435     SetVersion ($DBversion);
5436 }
5437
5438 $DBversion = "3.09.00.017";
5439 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
5440     $dbh->do("INSERT INTO systempreferences (variable,value,options,explanation,type) VALUES ('OpacNavRight', '', '70|10', 'Show the following HTML in the right hand column of the main page under the main login form', 'Textarea');");
5441     print "Upgrade to $DBversion done (Add customizable OpacNavRight region to the OPAC main page)\n";
5442     SetVersion ($DBversion);
5443 }
5444
5445 $DBversion = "3.09.00.018";
5446 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
5447     $dbh->do("DROP TABLE IF EXISTS aqbudgetborrowers");
5448     $dbh->do("
5449         CREATE TABLE aqbudgetborrowers (
5450           budget_id int(11) NOT NULL,
5451           borrowernumber int(11) NOT NULL,
5452           PRIMARY KEY (budget_id, borrowernumber),
5453           CONSTRAINT aqbudgetborrowers_ibfk_1 FOREIGN KEY (budget_id)
5454             REFERENCES aqbudgets (budget_id)
5455             ON DELETE CASCADE ON UPDATE CASCADE,
5456           CONSTRAINT aqbudgetborrowers_ibfk_2 FOREIGN KEY (borrowernumber)
5457             REFERENCES borrowers (borrowernumber)
5458             ON DELETE CASCADE ON UPDATE CASCADE
5459         ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
5460     ");
5461     $dbh->do("
5462         INSERT INTO permissions (module_bit, code, description)
5463         VALUES (11, 'budget_manage_all', 'Manage all budgets')
5464     ");
5465     print "Upgrade to $DBversion done (Add aqbudgetborrowers table)\n";
5466     SetVersion($DBversion);
5467 }
5468
5469 $DBversion = "3.09.00.019";
5470 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
5471     $dbh->do("INSERT INTO systempreferences (variable,value,options,explanation,type) VALUES ('OPACShowUnusedAuthorities','1','','Show authorities that are not being used in the OPAC.','YesNo')");
5472     print "Upgrade to $DBversion done (Add OPACShowUnusedAuthorities system preference)\n";
5473     SetVersion ($DBversion);
5474 }
5475
5476 $DBversion = "3.09.00.020";
5477 if ( C4::Context->preference("Version") < TransformToNum($DBversion) ) {
5478     $dbh->do("INSERT INTO systempreferences (variable,value,explanation,type) VALUES('EnableBorrowerFiles','0','If enabled, allows librarians to upload and attach arbitrary files to a borrower record.','YesNo')");
5479     $dbh->do("
5480 CREATE TABLE IF NOT EXISTS borrower_files (
5481   file_id int(11) NOT NULL AUTO_INCREMENT,
5482   borrowernumber int(11) NOT NULL,
5483   file_name varchar(255) NOT NULL,
5484   file_type varchar(255) NOT NULL,
5485   file_description varchar(255) DEFAULT NULL,
5486   file_content longblob NOT NULL,
5487   date_uploaded timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
5488   PRIMARY KEY (file_id),
5489   KEY borrowernumber (borrowernumber)
5490 ) ENGINE=InnoDB  DEFAULT CHARSET=utf8;
5491     ");
5492     $dbh->do("ALTER TABLE borrower_files ADD CONSTRAINT borrower_files_ibfk_1 FOREIGN KEY (borrowernumber) REFERENCES borrowers (borrowernumber) ON DELETE CASCADE ON UPDATE CASCADE");
5493
5494     print "Upgrade to $DBversion done (Added borrow_files table, EnableBorrowerFiles syspref)\n";
5495     SetVersion($DBversion);
5496 }
5497
5498 $DBversion = "3.09.00.021";
5499 if ( C4::Context->preference("Version") < TransformToNum($DBversion) ) {
5500     $dbh->do("INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES('UpdateTotalIssuesOnCirc','0','Whether to update the totalissues field in the biblio on each circ.',NULL,'YesNo');");
5501     print "Upgrade to $DBversion done (Add syspref UpdateTotalIssuesOnCirc)\n";
5502     SetVersion($DBversion);
5503 }
5504
5505 $DBversion = "3.09.00.022";
5506 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
5507     $dbh->do("ALTER TABLE search_history MODIFY COLUMN query_cgi text NOT NULL");
5508     print "Upgrade to $DBversion done (Change search_history.query_cgi type to text. bug 5981)\n";
5509     SetVersion($DBversion);
5510 }
5511
5512 $DBversion = "3.09.00.023";
5513 if ( C4::Context->preference("Version") < TransformToNum($DBversion) ) {
5514     $dbh->do("INSERT IGNORE INTO systempreferences (variable,value,options,explanation,type) VALUES('SearchEngine','Zebra','Solr|Zebra','Search Engine','Choice')");
5515     print "Upgrade to $DBversion done (Add system preference SearchEngine )\n";
5516     SetVersion($DBversion);
5517 }
5518
5519 $DBversion ="3.09.00.024";
5520 if ( C4::Context->preference("Version") < TransformToNum($DBversion) ) {
5521     $dbh->do("INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES('IntranetSlipPrinterJS','','Use this JavaScript for printing slips. Define at least function printThenClose(). For use e.g. with Firefox PlugIn jsPrintSetup, see http://jsprintsetup.mozdev.org/','','Free')");
5522     print "Upgrade to $DBversion done (Add system preference IntranetSlipPrinterJS))\n";
5523     SetVersion($DBversion);
5524 }
5525
5526 $DBversion = "3.09.00.025";
5527 if ( C4::Context->preference("Version") < TransformToNum($DBversion) ) {
5528     $dbh->do('START TRANSACTION');
5529     $dbh->do('CREATE TABLE tmp_reserves AS SELECT * FROM old_reserves LIMIT 0');
5530     $dbh->do('ALTER TABLE tmp_reserves ADD reserve_id INT( 11 ) NOT NULL AUTO_INCREMENT PRIMARY KEY FIRST');
5531     $dbh->do("
5532         INSERT INTO tmp_reserves (
5533           borrowernumber, reservedate, biblionumber,
5534           constrainttype, branchcode, notificationdate,
5535           reminderdate, cancellationdate, reservenotes,
5536           priority, found, timestamp, itemnumber,
5537           waitingdate, expirationdate, lowestPriority,
5538           suspend, suspend_until
5539         ) SELECT
5540           borrowernumber, reservedate, biblionumber,
5541           constrainttype, branchcode, notificationdate,
5542           reminderdate, cancellationdate, reservenotes,
5543           priority, found, timestamp, itemnumber,
5544           waitingdate, expirationdate, lowestPriority,
5545           suspend, suspend_until
5546         FROM old_reserves ORDER BY reservedate
5547     ");
5548     $dbh->do('SET @ai = ( SELECT MAX( reserve_id ) FROM tmp_reserves )');
5549     $dbh->do('TRUNCATE old_reserves');
5550     $dbh->do('ALTER TABLE old_reserves ADD reserve_id INT( 11 ) NOT NULL PRIMARY KEY FIRST');
5551     $dbh->do('INSERT INTO old_reserves SELECT * FROM tmp_reserves WHERE reserve_id <= @ai');
5552     $dbh->do("
5553         INSERT INTO tmp_reserves (
5554           borrowernumber, reservedate, biblionumber,
5555           constrainttype, branchcode, notificationdate,
5556           reminderdate, cancellationdate, reservenotes,
5557           priority, found, timestamp, itemnumber,
5558           waitingdate, expirationdate, lowestPriority,
5559           suspend, suspend_until
5560         ) SELECT
5561           borrowernumber, reservedate, biblionumber,
5562           constrainttype, branchcode, notificationdate,
5563           reminderdate, cancellationdate, reservenotes,
5564           priority, found, timestamp, itemnumber,
5565           waitingdate, expirationdate, lowestPriority,
5566           suspend, suspend_until
5567         FROM reserves ORDER BY reservedate
5568     ");
5569     $dbh->do('TRUNCATE reserves');
5570     $dbh->do('ALTER TABLE reserves ADD reserve_id INT( 11 ) NOT NULL AUTO_INCREMENT PRIMARY KEY FIRST');
5571     $dbh->do('INSERT INTO reserves SELECT * FROM tmp_reserves WHERE reserve_id > COALESCE(@ai, 0)');
5572     $dbh->do('DROP TABLE tmp_reserves');
5573     $dbh->do('COMMIT');
5574
5575     my $sth = $dbh->prepare("
5576         SELECT COUNT( * ) AS count
5577         FROM information_schema.COLUMNS
5578         WHERE COLUMN_NAME =  'reserve_id'
5579         AND (
5580           TABLE_NAME LIKE  'reserves'
5581           OR
5582           TABLE_NAME LIKE  'old_reserves'
5583         )
5584     ");
5585     $sth->execute();
5586     my $row = $sth->fetchrow_hashref();
5587     die("Failed to add reserve_id to reserves tables, please refresh the page to try again.") unless ( $row->{'count'} );
5588
5589     print "Upgrade to $DBversion done (add reserve_id to reserves & old_reserves tables)\n";
5590     SetVersion($DBversion);
5591 }
5592
5593 $DBversion = "3.09.00.026";
5594 if ( C4::Context->preference("Version") < TransformToNum($DBversion) ) {
5595     $dbh->do("INSERT INTO permissions (module_bit, code, description) VALUES
5596         ( 3, 'parameters_remaining_permissions', 'Remaining system parameters permissions'),
5597         ( 3, 'manage_circ_rules', 'manage circulation rules')");
5598     $dbh->do("INSERT INTO user_permissions (borrowernumber, module_bit, code)
5599         SELECT borrowernumber, 3, 'parameters_remaining_permissions'
5600         FROM borrowers WHERE flags & (1 << 3)");
5601     # Give new subpermissions to all users that have 'parameters' permission flag (bit 3) set
5602     # see userflags table
5603     $dbh->do("INSERT INTO user_permissions (borrowernumber, module_bit, code)
5604         SELECT borrowernumber, 3, 'manage_circ_rules'
5605         FROM borrowers WHERE flags & (1 << 3)");
5606     print "Upgrade to $DBversion done (Added parameters subpermissions)\n";
5607     SetVersion($DBversion);
5608 }
5609
5610 $DBversion = '3.09.00.027';
5611 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
5612     $dbh->do("ALTER TABLE issuingrules ADD overduefinescap decimal(28,6) DEFAULT NULL");
5613     my $maxfine = C4::Context->preference('MaxFine');
5614     if ($maxfine && $maxfine < 900) { # an arbitrary value that tells us it's not "some huge value"
5615       $dbh->do("UPDATE issuingrules SET overduefinescap=?",undef,$maxfine);
5616       $dbh->do("UPDATE systempreferences SET value = NULL WHERE variable = 'MaxFine'");
5617     }
5618     $dbh->do("UPDATE systempreferences SET explanation = 'Maximum fine a patron can have for all late returns at one moment. Single item caps are specified in the circulation rules matrix.' WHERE variable = 'MaxFine'");
5619     print "Upgrade to $DBversion done (Bug 7420 add overduefinescap to circulation matrix)\n";
5620     SetVersion ($DBversion);
5621 }
5622
5623 $DBversion = "3.09.00.028";
5624 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
5625     unless ( C4::Context->preference('marcflavour') eq 'UNIMARC' ) {
5626         my %referencetypes = (  '00' => 'PERSO_NAME',
5627                                 '10' => 'CORPO_NAME',
5628                                 '11' => 'MEETI_NAME',
5629                                 '30' => 'UNIF_TITLE',
5630                                 '48' => 'CHRON_TERM',
5631                                 '50' => 'TOPIC_TERM',
5632                                 '51' => 'GEOGR_NAME',
5633                                 '55' => 'GENRE/FORM'
5634                 );
5635         my $query = q{SELECT DISTINCT authtypecode, tagfield
5636                     FROM auth_subfield_structure
5637                     WHERE (tagfield BETWEEN '400' AND '455' OR
5638                     tagfield BETWEEN '500' and '555') AND tagsubfield='a' AND
5639                     frameworkcode = '' AND ROW(authtypecode, tagfield) NOT IN
5640                     (SELECT authtypecode, tagfield FROM auth_subfield_structure
5641                     WHERE tagsubfield ='9' )};
5642         $sth = $dbh->prepare($query);
5643         $sth->execute;
5644         my $sth2 = $dbh->prepare(q{INSERT INTO auth_subfield_structure
5645                 (authtypecode, tagfield, tagsubfield, liblibrarian, libopac,
5646                  repeatable, mandatory, tab, authorised_value, value_builder,
5647                  seealso, isurl, hidden, linkid, kohafield, frameworkcode)
5648                 VALUES (?, ?, '9', '9 (RLIN)', '9 (RLIN)', 0, 0, ?, NULL, NULL,
5649                     NULL, 0, 1, '', '', '')});
5650         my $sth3 = $dbh->prepare(q{UPDATE auth_subfield_structure SET
5651                                     frameworkcode = ? WHERE authtypecode = ? AND
5652                                     tagfield = ? AND tagsubfield = 'a'});
5653         while (my $row = $sth->fetchrow_arrayref()) {
5654             my ($authtypecode, $field) = @$row;
5655             $sth2->execute($authtypecode, $field, substr($field, 0, 1));
5656             my $authtypemarker = substr $field, 1, 2;
5657             if ($authtypemarker && $referencetypes{$authtypemarker}) {
5658                 $sth3->execute($referencetypes{$authtypemarker}, $authtypecode, $field);
5659             }
5660         }
5661     }
5662
5663     print "Upgrade to $DBversion done (Add thesaurus links for MARC21/NORMARC)\n";
5664     SetVersion($DBversion);
5665 }
5666
5667 $DBversion = "3.09.00.029"; # FIXME
5668 if ( C4::Context->preference("Version") < TransformToNum($DBversion) ) {
5669     $dbh->do("UPDATE systempreferences SET options=concat(options,'|EAN13') WHERE variable='itemBarcodeInputFilter' AND options NOT LIKE '%EAN13%'");
5670     print "Upgrade to $DBversion done (Add itemBarcodeInputFilter choice EAN13)\n";
5671
5672     $dbh->do("UPDATE systempreferences SET options = concat(options,'|EAN13'), explanation = concat(explanation,'; EAN13 - incremental') WHERE variable = 'autoBarcode' AND options NOT LIKE '%EAN13%'");
5673     print "Upgrade to $DBversion done ( Added EAN13 barcode autogeneration sequence )\n";
5674     SetVersion($DBversion);
5675 }
5676
5677 $DBversion ="3.09.00.030";
5678 if(C4::Context->preference("Version") < TransformToNum($DBversion) ) {
5679     my $query = "SELECT value FROM systempreferences WHERE variable='opacstylesheet'";
5680     my $remote= $dbh->selectrow_arrayref($query);
5681     $dbh->do("DELETE from systempreferences WHERE variable='opacstylesheet'");
5682     if($remote && $remote->[0]) {
5683         $query="UPDATE systempreferences SET value=? WHERE variable='opaclayoutstylesheet'";
5684         $dbh->do($query,undef,$remote->[0]);
5685         print "NOTE: The URL of your remote opac css file has been moved to preference opaclayoutstylesheet.\n";
5686     }
5687     print "Upgrade to $DBversion done (BZ 8263: Make OPAC stylesheet preferences more consistent)\n";
5688     SetVersion($DBversion);
5689 }
5690
5691 $DBversion = "3.09.00.031";
5692 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
5693     $dbh->do("DELETE FROM systempreferences WHERE variable='AmazonReviews'");
5694     $dbh->do("DELETE FROM systempreferences WHERE variable='AmazonSimilarItems'");
5695     $dbh->do("DELETE FROM systempreferences WHERE variable='AWSAccessKeyID'");
5696     $dbh->do("DELETE FROM systempreferences WHERE variable='AWSPrivateKey'");
5697     $dbh->do("DELETE FROM systempreferences WHERE variable='OPACAmazonReviews'");
5698     $dbh->do("DELETE FROM systempreferences WHERE variable='OPACAmazonSimilarItems'");
5699     $dbh->do("DELETE FROM systempreferences WHERE variable='AmazonEnabled'");
5700     $dbh->do("DELETE FROM systempreferences WHERE variable='OPACAmazonEnabled'");
5701     print "Upgrade to $DBversion done ('Remove preferences controlling broken Amazon features (Bug 8679')\n";
5702     SetVersion ($DBversion);
5703 }
5704
5705 $DBversion = "3.09.00.032";
5706 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
5707     $dbh->do("UPDATE systempreferences SET value = 'call_number' WHERE variable = 'defaultSortField' AND value = 'callnumber'");
5708     $dbh->do("UPDATE systempreferences SET value = 'call_number' WHERE variable = 'OPACdefaultSortField' AND value = 'callnumber'");
5709     print "Upgrade to $DBversion done (Bug 8657 - Default sort by call number does not work. Correcting system preference value.)\n";
5710     SetVersion ($DBversion);
5711 }
5712
5713
5714 $DBversion = '3.09.00.033';
5715 if ( C4::Context->preference("Version") < TransformToNum($DBversion) ) {
5716    $dbh->do("INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES('OpacSuppressionByIPRange','','Restrict the suppression to IP adresses outside of the IP range','','free');");
5717    print "Upgrade to $DBversion done (Add OpacSuppressionByIPRange syspref)\n";
5718    SetVersion ($DBversion);
5719 }
5720
5721 $DBversion ="3.09.00.034";
5722 if(C4::Context->preference("Version") < TransformToNum($DBversion) ) {
5723     $dbh->do("UPDATE auth_subfield_structure SET frameworkcode = 'PERSO_NAME' WHERE frameworkcode = 'PERSO_CODE'");
5724     $dbh->do("UPDATE auth_subfield_structure SET frameworkcode = 'CORPO_NAME' WHERE frameworkcode = 'ORGO_CODE'");
5725     print "Upgrade to $DBversion done (Bug 8207: correct typo in authority types)\n";
5726     SetVersion ($DBversion);
5727 }
5728
5729 $DBversion = "3.09.00.035";
5730 if ( C4::Context->preference("Version") < TransformToNum($DBversion) ) {
5731     $dbh->do("
5732     INSERT IGNORE INTO systempreferences (variable,value,explanation,options,type) VALUES('PrefillItem','0','When a new item is added, should it be prefilled with last created item values?','','YesNo');
5733     ");
5734     $dbh->do(
5735     "INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES ('SubfieldsToUseWhenPrefill','','Define a list of subfields to use when prefilling items (separated by space)','','Free');
5736     ");
5737     print "Upgrade to $DBversion done (Adding PrefillItem and SubfieldsToUseWhenPrefill sysprefs)\n";
5738     SetVersion ($DBversion);
5739 }
5740
5741 $DBversion = "3.09.00.036";
5742 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
5743     # biblioitems changes
5744     $dbh->do("ALTER TABLE biblioitems ADD COLUMN agerestriction VARCHAR(255) DEFAULT NULL AFTER cn_sort");
5745     $dbh->do("ALTER TABLE deletedbiblioitems ADD COLUMN agerestriction VARCHAR(255) DEFAULT NULL AFTER cn_sort");
5746     # preferences changes
5747     $dbh->do("INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES('AgeRestrictionMarker','','Markers for age restriction indication, e.g. FSK|PEGI|Age|. See: http://wiki.koha-community.org/wiki/Age_restriction',NULL,'free')");
5748     $dbh->do("INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES('AgeRestrictionOverride',0,'Allow staff to check out an item with age restriction.',NULL,'YesNo')");
5749
5750     print "Upgrade to $DBversion done (Add colum agerestriction to biblioitems and deletedbiblioitems, add system preferences AgeRestrictionMarker and AgeRestrictionOverride)\n";
5751    SetVersion ($DBversion);
5752 }
5753
5754 $DBversion = "3.09.00.037";
5755 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
5756     $dbh->do("INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES('UseTransportCostMatrix',0,'Use Transport Cost Matrix when filling holds','','YesNo')");
5757
5758  $dbh->do("CREATE TABLE `transport_cost` (
5759               `frombranch` varchar(10) NOT NULL,
5760               `tobranch` varchar(10) NOT NULL,
5761               `cost` decimal(6,2) NOT NULL,
5762               `disable_transfer` tinyint(1) NOT NULL DEFAULT 0,
5763               CHECK ( `frombranch` <> `tobranch` ), -- a dud check, mysql does not support that
5764               PRIMARY KEY (`frombranch`, `tobranch`),
5765               CONSTRAINT `transport_cost_ibfk_1` FOREIGN KEY (`frombranch`) REFERENCES `branches` (`branchcode`) ON DELETE CASCADE ON UPDATE CASCADE,
5766               CONSTRAINT `transport_cost_ibfk_2` FOREIGN KEY (`tobranch`) REFERENCES `branches` (`branchcode`) ON DELETE CASCADE ON UPDATE CASCADE
5767           ) ENGINE=InnoDB DEFAULT CHARSET=utf8");
5768
5769     print "Upgrade to $DBversion done (creating `transport_cost` table; adding UseTransportCostMatrix systempref, in circulation)\n";
5770     SetVersion($DBversion);
5771 }
5772
5773 $DBversion ="3.09.00.038";
5774 if ( C4::Context->preference("Version") < TransformToNum($DBversion) ) {
5775     $dbh->do("ALTER TABLE borrower_attributes CHANGE  attribute  attribute VARCHAR( 255 ) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL");
5776     print "Upgrade to $DBversion done (Increase the maximum size of a borrower attribute value)\n";
5777     SetVersion($DBversion);
5778 }
5779
5780 $DBversion ="3.09.00.039";
5781 if ( C4::Context->preference("Version") < TransformToNum($DBversion) ) {
5782     $dbh->do("INSERT INTO systempreferences (variable,value,explanation,type) VALUES('DidYouMeanFromAuthorities','0','Suggest searches based on authority file.','YesNo');");
5783     print "Upgrade to $DBversion done (Add system preference DidYouMeanFromAuthorities)\n";
5784     SetVersion($DBversion);
5785 }
5786
5787 $DBversion = "3.09.00.040";
5788 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
5789     $dbh->do("INSERT INTO systempreferences (variable,value,options,explanation,type) VALUES ('IncludeSeeFromInSearches','0','','Include see-from references in searches.','YesNo');");
5790     print "Upgrade to $DBversion done (Add IncludeSeeFromInSearches system preference)\n";
5791     SetVersion ($DBversion);
5792 }
5793
5794 $DBversion = "3.09.00.041";
5795 if ( C4::Context->preference("Version") < TransformToNum($DBversion) ) {
5796     $dbh->do(qq{
5797         INSERT IGNORE INTO systempreferences (variable,value,explanation,options,type) VALUES('ExportRemoveFields','','List of fields for non export in circulation.pl (separated by a space)','','');
5798     });
5799     print "Upgrade to $DBversion done (Add system preference ExportRemoveFields)\n";
5800     SetVersion($DBversion);
5801 }
5802
5803 $DBversion = "3.09.00.042";
5804 if ( C4::Context->preference("Version") < TransformToNum($DBversion) ) {
5805     $dbh->do(qq{
5806         INSERT IGNORE INTO systempreferences (variable,value,explanation,options,type) VALUES('ExportWithCsvProfile','','Set a profile name for CSV export','','');
5807     });
5808     print "Upgrade to $DBversion done (Adds New System preference ExportWithCsvProfile)\n";
5809     SetVersion($DBversion)
5810 }
5811
5812 $DBversion = "3.09.00.043";
5813 if ( C4::Context->preference("Version") < TransformToNum($DBversion) ) {
5814     $dbh->do("
5815         ALTER TABLE aqorders
5816         ADD parent_ordernumber int(11) DEFAULT NULL
5817     ");
5818     $dbh->do("
5819         UPDATE aqorders
5820         SET parent_ordernumber = ordernumber;
5821     ");
5822     print "Upgrade to $DBversion done (Adding parent_ordernumber in aqorders)\n";
5823     SetVersion($DBversion);
5824 }
5825
5826 $DBversion = '3.09.00.044';
5827 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
5828     $dbh->do("ALTER TABLE statistics ADD COLUMN ccode VARCHAR ( 10 ) NULL AFTER associatedborrower");
5829     $dbh->do("UPDATE statistics SET statistics.ccode = ( SELECT items.ccode FROM items WHERE statistics.itemnumber = items.itemnumber )");
5830     $dbh->do("UPDATE statistics SET statistics.ccode = (
5831               SELECT deleteditems.ccode FROM deleteditems
5832                   WHERE statistics.itemnumber = deleteditems.itemnumber
5833               ) WHERE statistics.ccode IS NULL");
5834     print "Upgrade done ( Added Collection Code to Statistics table. )\n";
5835     SetVersion ($DBversion);
5836 }
5837
5838 $DBversion = "3.09.00.045";
5839 if ( C4::Context->preference("Version") < TransformToNum($DBversion) ) {
5840     $dbh->do("ALTER TABLE borrower_attribute_types MODIFY category_code VARCHAR( 10 ) NULL DEFAULT NULL");
5841     print "Upgrade to $DBversion done. (Bug 8002: Update patron attribute types table from varchar(1) to varchar(10) category_code)\nWarning to Koha System Administrators: If you use borrower attributes defined by borrower categories, you have to check your configuration. A bug may have removed your attribute links to borrower categories.\nPlease check, and fix it if necessary.";
5842     SetVersion($DBversion);
5843 }
5844
5845 $DBversion = "3.09.00.046";
5846 if ( C4::Context->preference("Version") < TransformToNum($DBversion) ) {
5847     $dbh->do("ALTER TABLE `accountlines` ADD `accountlines_id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY FIRST;");
5848     print "Upgrade to $DBversion done (adding accountlines_id field in accountlines table)\n";
5849     SetVersion($DBversion);
5850 }
5851
5852 $DBversion = "3.09.00.047";
5853 if ( C4::Context->preference("Version") < TransformToNum($DBversion) ) {
5854     # to preserve default behaviour as best as possible, set this new preference differently depending on whether IndependantBranches is set or not
5855     my $prefvalue = 'anywhere';
5856     if (C4::Context->preference("IndependantBranches")) { $prefvalue = 'homeorholdingbranch';}
5857     $dbh->do("INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES('AllowReturnToBranch', '$prefvalue', 'Where an item may be returned', 'anywhere|homebranch|holdingbranch|homeorholdingbranch', 'Choice');");
5858
5859     print "Upgrade to $DBversion done: adding AllowReturnToBranch syspref (bug 6151)";
5860     SetVersion($DBversion);
5861 }
5862
5863 $DBversion = "3.09.00.048";
5864 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
5865     $dbh->do("ALTER TABLE authorised_values MODIFY lib varchar(200)");
5866     $dbh->do("ALTER TABLE authorised_values MODIFY lib_opac varchar(200)");
5867
5868     print "Upgrade to $DBversion done (Raise the length of Authorised Values descriptions)\n";
5869     SetVersion($DBversion);
5870 }
5871
5872 $DBversion ="3.09.00.049";
5873 if(C4::Context->preference("Version") < TransformToNum($DBversion) ) {
5874     $dbh->do("INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES('OPACMobileUserCSS','','Include the following CSS for the mobile view on all pages in the OPAC:',NULL,'free');");
5875     $dbh->do("INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES('OpacMainUserBlockMobile','','Show the following HTML in its own column on the main page of the OPAC (mobile version):',NULL,'free');");
5876     $dbh->do("INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES('OpacShowLibrariesPulldownMobile','1','Show the libraries pulldown on the mobile version of the OPAC.',NULL,'YesNo');");
5877     $dbh->do("INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES('OpacShowFiltersPulldownMobile','1','Show the search filters pulldown on the mobile version of the OPAC.',NULL,'YesNo');");
5878     print "Upgrade to $DBversion done (Add OPACMobileUserCSS, OpacMainUserBlockMobile, OpacShowLibrariesPulldownMobile and OpacShowFiltersPulldownMobile sysprefs)\n";
5879     SetVersion($DBversion);
5880 }
5881
5882 $DBversion = "3.09.00.050";
5883 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
5884     $dbh->do("ALTER TABLE authorised_values MODIFY category varchar(16) NOT NULL DEFAULT '';");
5885     $dbh->do("INSERT INTO authorised_values (category, authorised_value, lib) VALUES
5886               ('REPORT_GROUP', 'CIRC', 'Circulation'),
5887               ('REPORT_GROUP', 'CAT', 'Catalog'),
5888               ('REPORT_GROUP', 'PAT', 'Patrons'),
5889               ('REPORT_GROUP', 'ACQ', 'Acquisitions'),
5890               ('REPORT_GROUP', 'ACC', 'Accounts');");
5891
5892     $dbh->do("ALTER TABLE reports_dictionary ADD report_area varchar(6) DEFAULT NULL;");
5893     $dbh->do("UPDATE reports_dictionary SET report_area = CASE area
5894                   WHEN 1 THEN 'CIRC'
5895                   WHEN 2 THEN 'CAT'
5896                   WHEN 3 THEN 'PAT'
5897                   WHEN 4 THEN 'ACQ'
5898                   WHEN 5 THEN 'ACC'
5899                   END;");
5900     $dbh->do("ALTER TABLE reports_dictionary DROP area;");
5901     $dbh->do("ALTER TABLE reports_dictionary ADD KEY dictionary_area_idx (report_area);");
5902
5903     $dbh->do("ALTER TABLE saved_sql ADD report_area varchar(6) DEFAULT NULL;");
5904     $dbh->do("ALTER TABLE saved_sql ADD report_group varchar(80) DEFAULT NULL;");
5905     $dbh->do("ALTER TABLE saved_sql ADD report_subgroup varchar(80) DEFAULT NULL;");
5906     $dbh->do("ALTER TABLE saved_sql ADD KEY sql_area_group_idx (report_group, report_subgroup);");
5907
5908     print "Upgrade to $DBversion done saved_sql new fields report_group and report_area; authorised_values.category 16 char \n";
5909     SetVersion($DBversion);
5910 }
5911
5912 $DBversion = "3.09.00.051";
5913 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
5914     $dbh->do("
5915         CREATE TABLE aqinvoices (
5916           invoiceid int(11) NOT NULL AUTO_INCREMENT,
5917           invoicenumber mediumtext NOT NULL,
5918           booksellerid int(11) NOT NULL,
5919           shipmentdate date default NULL,
5920           billingdate date default NULL,
5921           closedate date default NULL,
5922           shipmentcost decimal(28,6) default NULL,
5923           shipmentcost_budgetid int(11) default NULL,
5924           PRIMARY KEY (invoiceid),
5925           CONSTRAINT aqinvoices_fk_aqbooksellerid FOREIGN KEY (booksellerid) REFERENCES aqbooksellers (id) ON DELETE CASCADE ON UPDATE CASCADE,
5926           CONSTRAINT aqinvoices_fk_shipmentcost_budgetid FOREIGN KEY (shipmentcost_budgetid) REFERENCES aqbudgets (budget_id) ON DELETE SET NULL ON UPDATE CASCADE
5927         ) ENGINE=InnoDB DEFAULT CHARSET=utf8
5928     ");
5929
5930     # Fill this new table with existing invoices
5931     my $sth = $dbh->prepare("
5932         SELECT aqorders.booksellerinvoicenumber AS invoicenumber, aqbasket.booksellerid, aqorders.datereceived
5933         FROM aqorders
5934           LEFT JOIN aqbasket ON aqorders.basketno = aqbasket.basketno
5935         WHERE aqorders.booksellerinvoicenumber IS NOT NULL
5936           AND aqorders.booksellerinvoicenumber != ''
5937         GROUP BY aqorders.booksellerinvoicenumber
5938     ");
5939     $sth->execute;
5940     my $results = $sth->fetchall_arrayref({});
5941     $sth = $dbh->prepare("
5942         INSERT INTO aqinvoices (invoicenumber, booksellerid, shipmentdate) VALUES (?,?,?)
5943     ");
5944     foreach(@$results) {
5945         $sth->execute($_->{invoicenumber}, $_->{booksellerid}, $_->{datereceived});
5946     }
5947
5948     # Add the column in aqorders, fill it with correct value
5949     # and then drop booksellerinvoicenumber column
5950     $dbh->do("
5951         ALTER TABLE aqorders
5952         ADD COLUMN invoiceid int(11) default NULL AFTER booksellerinvoicenumber,
5953         ADD CONSTRAINT aqorders_ibfk_3 FOREIGN KEY (invoiceid) REFERENCES aqinvoices (invoiceid) ON DELETE SET NULL ON UPDATE CASCADE
5954     ");
5955
5956     $dbh->do("
5957         UPDATE aqorders, aqinvoices
5958         SET aqorders.invoiceid = aqinvoices.invoiceid
5959         WHERE aqorders.booksellerinvoicenumber = aqinvoices.invoicenumber
5960     ");
5961
5962     $dbh->do("
5963         ALTER TABLE aqorders
5964         DROP COLUMN booksellerinvoicenumber
5965     ");
5966
5967     print "Upgrade to $DBversion done (Add aqinvoices table) \n";
5968     SetVersion ($DBversion);
5969 }
5970
5971 $DBversion = "3.09.00.052";
5972 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
5973     $dbh->do("INSERT INTO systempreferences (variable,value,options,explanation,type) VALUES ('decreaseLoanHighHolds', NULL, '', 'Decreases the loan period for items with number of holds above the threshold specified in decreaseLoanHighHoldsValue', 'YesNo');");
5974     $dbh->do("INSERT INTO systempreferences (variable,value,options,explanation,type) VALUES ('decreaseLoanHighHoldsValue', NULL, '', 'Specifies a threshold for the minimum number of holds needed to trigger a reduction in loan duration (used with decreaseLoanHighHolds)', 'Integer');");
5975     $dbh->do("INSERT INTO systempreferences (variable,value,options,explanation,type) VALUES ('decreaseLoanHighHoldsDuration', NULL, '', 'Specifies a number of days that a loan is reduced to when used in conjunction with decreaseLoanHighHolds', 'Integer');");
5976     print "Upgrade to $DBversion done (Add systempreferences to decrease loan length on high demand items decreaseLoanHighHolds, decreaseLoanHighHoldsValue and decreaseLoanHighHoldsDuration) \n";
5977     SetVersion ($DBversion);
5978 }
5979
5980 $DBversion = "3.09.00.053";
5981 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
5982     $dbh->do(
5983     q|CREATE TABLE `import_auths` (
5984         import_record_id int(11) NOT NULL,
5985         matched_authid int(11) default NULL,
5986         control_number varchar(25) default NULL,
5987         authorized_heading varchar(128) default NULL,
5988         original_source varchar(25) default NULL,
5989         CONSTRAINT import_auths_ibfk_1 FOREIGN KEY (import_record_id)
5990         REFERENCES import_records (import_record_id) ON DELETE CASCADE ON UPDATE CASCADE,
5991         KEY matched_authid (matched_authid)
5992         ) ENGINE=InnoDB DEFAULT CHARSET=utf8;|
5993     );
5994     $dbh->do("ALTER TABLE import_batches
5995                 CHANGE COLUMN num_biblios num_records int(11) NOT NULL default 0,
5996                 ADD COLUMN record_type enum('biblio', 'auth', 'holdings') NOT NULL default 'biblio'");
5997     $dbh->do("UPDATE import_batches SET record_type='auth' WHERE import_batch_id IN
5998                 (SELECT import_batch_id FROM import_records WHERE record_type='auth')");
5999
6000     print "Upgrade to $DBversion done (Added support for staging authorities)\n";
6001     SetVersion ($DBversion);
6002 }
6003
6004 $DBversion = "3.09.00.054";
6005 if ( C4::Context->preference("Version") < TransformToNum($DBversion) ) {
6006     $dbh->do("ALTER TABLE aqorders CHANGE COLUMN gst gstrate DECIMAL(6,4)  DEFAULT NULL");
6007     print "Upgrade to $DBversion done (Change column name in aqorders gst --> gstrate)\n";
6008     SetVersion($DBversion);
6009 }
6010
6011 $DBversion = "3.09.00.055";
6012 if ( C4::Context->preference("Version") < TransformToNum($DBversion) ) {
6013     $dbh->do("ALTER TABLE aqorders ADD discount float(6,4) DEFAULT NULL AFTER gstrate");
6014     print "Upgrade to $DBversion done (Add discount field in aqorders table)\n";
6015     SetVersion($DBversion);
6016 }
6017
6018 $DBversion ="3.09.00.056";
6019 if ( C4::Context->preference("Version") < TransformToNum($DBversion) ) {
6020     $dbh->do("INSERT IGNORE INTO systempreferences (variable,value,explanation,options,type) VALUES('AuthDisplayHierarchy','0','Display authority hierarchies','','YesNo')");
6021     print "Upgrade to $DBversion done (Add system preference AuthDisplayHierarchy)\n";
6022     SetVersion($DBversion);
6023 }
6024
6025 $DBversion = "3.09.00.057";
6026 if ( C4::Context->preference("Version") < TransformToNum($DBversion) ) {
6027     $dbh->do("ALTER TABLE aqbasket ADD deliveryplace VARCHAR(10) default NULL AFTER basketgroupid;");
6028     $dbh->do("ALTER TABLE aqbasket ADD billingplace VARCHAR(10) default NULL AFTER deliveryplace;");
6029     print "Upgrade to $DBversion done (Bug 5356: Added billingplace, deliveryplace to the aqbasket table)\n";
6030     SetVersion($DBversion);
6031 }
6032
6033 $DBversion ="3.09.00.058";
6034 if ( C4::Context->preference("Version") < TransformToNum($DBversion) ) {
6035     $dbh->do("INSERT INTO systempreferences (variable,value,explanation,type) VALUES('OPACdidyoumean',NULL,'Did you mean? configuration for the OPAC. Do not change, as this is controlled by /cgi-bin/koha/admin/didyoumean.pl.','Free');");
6036     $dbh->do("INSERT INTO systempreferences (variable,value,explanation,type) VALUES('INTRAdidyoumean',NULL,'Did you mean? configuration for the Intranet. Do not change, as this is controlled by /cgi-bin/koha/admin/didyoumean.pl.','Free');");
6037     print "Upgrade to $DBversion done (Add Did You Mean? configuration)\n";
6038     SetVersion($DBversion);
6039 }
6040
6041 $DBversion ="3.09.00.059";
6042 if ( C4::Context->preference("Version") < TransformToNum($DBversion) ) {
6043     $dbh->do("INSERT INTO systempreferences (variable, value, options, explanation, type) VALUES ('BlockReturnOfWithdrawnItems', '1', '0', 'If enabled, items that are marked as withdrawn cannot be returned.', 'YesNo');");
6044     print "Upgrade to $DBversion done (Add system preference BlockReturnOfWithdrawnItems)\n";
6045     SetVersion($DBversion);
6046 }
6047
6048 $DBversion = "3.09.00.060";
6049 if ( C4::Context->preference("Version") < TransformToNum($DBversion) ) {
6050     $dbh->do("INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES('HoldsToPullStartDate','2','Set the default start date for the Holds to pull list to this many days ago',NULL,'Integer')");
6051     print "Upgrade to $DBversion done (Added HoldsToPullStartDate syspref)\n";
6052     SetVersion($DBversion);
6053 }
6054
6055 $DBversion = "3.09.00.061";
6056 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
6057     $dbh->do("UPDATE systempreferences set value=0 WHERE variable='OPACItemsResultsDisplay' AND value='statuses'");
6058     $dbh->do("UPDATE systempreferences set value=1 WHERE variable='OPACItemsResultsDisplay' AND value='itemdetails'");
6059     $dbh->do("UPDATE systempreferences SET explanation='If No, show only the status of items in result list. If Yes, show full location of items (branchlocation+callnumber) as in staff interface',options=NULL,type='YesNo' WHERE variable='OPACItemsResultsDisplay'");
6060     print "Upgrade to $DBversion done (Fixes Bug 5409, Set the syspref value to 1 if it is itemdetails and 0 if it is statuses, leaving it alone if it is already 1 or 0 and change the type of the syspref to YesNo.)\n";
6061     SetVersion ($DBversion);
6062 }
6063
6064 $DBversion = "3.09.00.062";
6065 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
6066    $dbh->do("UPDATE systempreferences SET value=0 WHERE variable='NoZebra'");
6067    $dbh->do("UPDATE systempreferences SET value=0 WHERE variable='QueryRemoveStopwords'");
6068    print "Upgrade to $DBversion done (Disable obsolete NoZebra and QueryRemoveStopwords sysprefs)\n";
6069    SetVersion ($DBversion);
6070 }
6071
6072 $DBversion = "3.09.00.063";
6073 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
6074     my $gst_booksellers = $dbh->selectcol_arrayref("SELECT DISTINCT(gstrate) FROM aqbooksellers");
6075     my $gist_syspref = C4::Context->preference("gist");
6076     # remove the undef values and construct and array with the syspref and the supplier values
6077     my @gstrates = map { defined $_ ? $_ : () } @$gst_booksellers;
6078     push @gstrates, split ('\|', $gist_syspref);
6079     # we want to compare integer (or float)
6080     $_ = $_ + 0 for @gstrates;
6081     use List::MoreUtils qw/uniq/;
6082     # remove duplicate values
6083     @gstrates = uniq sort @gstrates;
6084     my $new_syspref_value = join '|', @gstrates;
6085     # update the syspref with the new values
6086     my $sth = $dbh->prepare("UPDATE systempreferences set value=? WHERE variable='gist'");
6087     $sth->execute( $new_syspref_value );
6088
6089     print "Upgrade to $DBversion done (Bug 8832, Set the syspref gist with the existing values)\n";
6090     SetVersion ($DBversion);
6091 }
6092
6093 $DBversion = "3.09.00.064";
6094 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
6095    $dbh->do('ALTER TABLE items ADD coded_location_qualifier varchar(10) default NULL AFTER itemcallnumber');
6096    print "Upgrade to $DBversion done (Bug 6428: Added coded_location_qualifier to the items table)\n";
6097    SetVersion ($DBversion);
6098 }
6099
6100 $DBversion = "3.09.00.065";
6101 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
6102    $dbh->do('ALTER TABLE deleteditems ADD coded_location_qualifier varchar(10) default NULL AFTER itemcallnumber');
6103    print "Upgrade to $DBversion done (Bug 6428: Added coded_location_qualifier to the deleteditems table)\n";
6104    SetVersion ($DBversion);
6105 }
6106
6107 $DBversion = "3.09.00.066";
6108 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
6109    $dbh->do("DELETE FROM systempreferences WHERE variable='DidYouMeanFromAuthorities'");
6110    print "Upgrade to $DBversion done (Bug 9107: remove DidYouMeanFromAuthorities syspref)\n";
6111    SetVersion ($DBversion);
6112 }
6113
6114 $DBversion = "3.09.00.067";
6115 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
6116    $dbh->do("ALTER TABLE statistics CHANGE COLUMN ccode ccode varchar(10) NULL");
6117    print "Upgrade to $DBversion done (Bug 9064: statistics.ccode potentially wrongly defined)\n";
6118    SetVersion ($DBversion);
6119 }
6120
6121 $DBversion = "3.10.00.00";
6122 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
6123    print "Upgrade to $DBversion done (release tag)\n";
6124    SetVersion ($DBversion);
6125 }
6126
6127 $DBversion = "3.11.00.001";
6128 if ( C4::Context->preference("Version") < TransformToNum($DBversion) ) {
6129     $dbh->do("INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES('alphabet','A B C D E F G H I J K L M N O P Q R S T U V W X Y Z','Alphabet that can be expanded into browse links, e.g. on Home > Patrons',NULL,'free')");
6130     print "Upgrade to $DBversion done (Bug 2832 - Add alphabet syspref)\n";
6131 }
6132
6133 $DBversion = "3.11.00.002";
6134 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
6135     $dbh->do(q{
6136         DELETE from aqorders_items where ordernumber NOT IN (SELECT ordernumber FROM aqorders);
6137     });
6138     $dbh->do(q{
6139         ALTER TABLE aqorders_items
6140         ADD CONSTRAINT aqorders_items_ibfk_1 FOREIGN KEY (ordernumber) REFERENCES aqorders (ordernumber)
6141         ON DELETE CASCADE ON UPDATE CASCADE;
6142     });
6143     print "Upgrade to $DBversion done (Bug 9030: Add constraint on aqorders_items.ordernumber)\n";
6144     SetVersion ($DBversion);
6145 }
6146
6147 $DBversion = "3.11.00.003";
6148 if ( C4::Context->preference("Version") < TransformToNum($DBversion) ) {
6149     $dbh->do("INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES('RefundLostItemFeeOnReturn', '1', 'If enabled, the lost item fee charged to a borrower will be refunded when the lost item is returned.', NULL, 'YesNo')");
6150     print "Upgrade to $DBversion done (Bug 7189: Add system preference RefundLostItemFeeOnReturn)\n";
6151     SetVersion($DBversion);
6152 }
6153
6154 $DBversion = "3.11.00.004";
6155 if ( C4::Context->preference("Version") < TransformToNum($DBversion) ) {
6156     $dbh->do(qq{
6157         ALTER TABLE subscription ADD COLUMN closed INT(1) NOT NULL DEFAULT 0 AFTER enddate;
6158     });
6159
6160     print "Upgrade to $DBversion done (Bug 8782: Add field subscription.closed)\n";
6161     SetVersion($DBversion);
6162 }
6163
6164 $DBversion = "3.11.00.005";
6165 if ( C4::Context->preference("Version") < TransformToNum($DBversion) ) {
6166     $dbh->do(qq{CREATE TABLE borrower_attribute_types_branches(bat_code VARCHAR(10), b_branchcode VARCHAR(10),FOREIGN KEY (bat_code) REFERENCES borrower_attribute_types(code) ON DELETE CASCADE,FOREIGN KEY (b_branchcode) REFERENCES branches(branchcode) ON DELETE CASCADE ) ENGINE=INNODB DEFAULT CHARSET=utf8;});
6167
6168     $dbh->do(qq{CREATE TABLE categories_branches(categorycode VARCHAR(10), branchcode VARCHAR(10), FOREIGN KEY (categorycode) REFERENCES categories(categorycode) ON DELETE CASCADE, FOREIGN KEY (branchcode) REFERENCES branches(branchcode) ON DELETE CASCADE ) ENGINE=INNODB DEFAULT CHARSET=utf8;});
6169
6170     $dbh->do(qq{CREATE TABLE authorised_values_branches(av_id INTEGER, branchcode VARCHAR(10), FOREIGN KEY (av_id) REFERENCES authorised_values(id) ON DELETE CASCADE, FOREIGN KEY  (branchcode) REFERENCES branches(branchcode) ON DELETE CASCADE ) ENGINE=INNODB DEFAULT CHARSET=utf8;});
6171
6172     print "Upgrade to $DBversion done (Bug 7919: Display of values depending on the connexion library)\n";
6173     SetVersion($DBversion);
6174 }
6175
6176 $DBversion = "3.11.00.006";
6177 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
6178     $dbh->do(q{
6179         UPDATE virtualshelves SET sortfield="copyrightdate" where sortfield="year";
6180     });
6181     print "Upgrade to $DBversion done (Bug 9167: Update the virtualshelves.sortfield column with 'copyrightdate' if needed)\n";
6182     SetVersion($DBversion);
6183 }
6184
6185 $DBversion = "3.11.00.007";
6186 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
6187     $dbh->do("INSERT INTO language_descriptions (subtag, type, lang, description) VALUES( 'ar', 'language', 'de', 'Arabisch')");
6188     $dbh->do("INSERT INTO language_descriptions (subtag, type, lang, description) VALUES( 'hy', 'language', 'de', 'Armenisch')");
6189     $dbh->do("INSERT INTO language_descriptions (subtag, type, lang, description) VALUES( 'bg', 'language', 'de', 'Bulgarisch')");
6190     $dbh->do("INSERT INTO language_descriptions (subtag, type, lang, description) VALUES( 'zh', 'language', 'de', 'Chinesisch')");
6191     $dbh->do("INSERT INTO language_descriptions (subtag, type, lang, description) VALUES( 'cs', 'language', 'de', 'Tschechisch')");
6192     $dbh->do("INSERT INTO language_descriptions (subtag, type, lang, description) VALUES( 'da', 'language', 'de', 'Dänisch')");
6193     $dbh->do("INSERT INTO language_descriptions (subtag, type, lang, description) VALUES( 'nl', 'language', 'de', 'Niederländisch')");
6194     $dbh->do("INSERT INTO language_descriptions (subtag, type, lang, description) VALUES( 'en', 'language', 'de', 'Englisch')");
6195     $dbh->do("INSERT INTO language_descriptions (subtag, type, lang, description) VALUES( 'fi', 'language', 'de', 'Finnisch')");
6196     $dbh->do("INSERT INTO language_descriptions (subtag, type, lang, description) VALUES( 'fr', 'language', 'de', 'Französisch')");
6197     $dbh->do("INSERT INTO language_descriptions (subtag, type, lang, description) VALUES( 'lo', 'language', 'fr', 'Laotien')");
6198     $dbh->do("INSERT INTO language_descriptions (subtag, type, lang, description) VALUES( 'lo', 'language', 'de', 'Laotisch')");
6199     $dbh->do("INSERT INTO language_descriptions (subtag, type, lang, description) VALUES( 'el', 'language', 'de', 'Griechisch (Nach 1453)')");
6200     $dbh->do("INSERT INTO language_descriptions (subtag, type, lang, description) VALUES( 'he', 'language', 'de', 'Hebräisch')");
6201     $dbh->do("INSERT INTO language_descriptions (subtag, type, lang, description) VALUES( 'hi', 'language', 'de', 'Hindi')");
6202     $dbh->do("INSERT INTO language_descriptions (subtag, type, lang, description) VALUES( 'hu', 'language', 'de', 'Ungarisch')");
6203     $dbh->do("INSERT INTO language_descriptions (subtag, type, lang, description) VALUES( 'id', 'language', 'de', 'Indonesisch')");
6204     $dbh->do("INSERT INTO language_descriptions (subtag, type, lang, description) VALUES( 'it', 'language', 'de', 'Italienisch')");
6205     $dbh->do("INSERT INTO language_descriptions (subtag, type, lang, description) VALUES( 'ja', 'language', 'de', 'Japanisch')");
6206     $dbh->do("INSERT INTO language_descriptions (subtag, type, lang, description) VALUES( 'ko', 'language', 'de', 'Koreanisch')");
6207     $dbh->do("INSERT INTO language_descriptions (subtag, type, lang, description) VALUES( 'la', 'language', 'de', 'Latein')");
6208     $dbh->do("INSERT INTO language_descriptions (subtag, type, lang, description) VALUES( 'gl', 'language', 'fr', 'Galicien')");
6209     $dbh->do("INSERT INTO language_descriptions (subtag, type, lang, description) VALUES( 'gl', 'language', 'de', 'Galizisch')");
6210     $dbh->do("INSERT INTO language_descriptions (subtag, type, lang, description) VALUES( 'nb', 'language', 'de', 'Norwegisch bokm&#229;l')");
6211     $dbh->do("INSERT INTO language_descriptions (subtag, type, lang, description) VALUES( 'nn', 'language', 'de', 'Norwegisch nynorsk')");
6212     $dbh->do("INSERT INTO language_descriptions (subtag, type, lang, description) VALUES( 'fa', 'language', 'de', 'Persisch')");
6213     $dbh->do("INSERT INTO language_descriptions (subtag, type, lang, description) VALUES( 'pl', 'language', 'de', 'Polnisch')");
6214     $dbh->do("INSERT INTO language_descriptions (subtag, type, lang, description) VALUES( 'pt', 'language', 'de', 'Portugiesisch')");
6215     $dbh->do("INSERT INTO language_descriptions (subtag, type, lang, description) VALUES( 'ro', 'language', 'de', 'Rumänisch')");
6216     $dbh->do("INSERT INTO language_descriptions (subtag, type, lang, description) VALUES( 'ru', 'language', 'de', 'Russisch')");
6217     $dbh->do("INSERT INTO language_descriptions (subtag, type, lang, description) VALUES( 'sr', 'language', 'fr', 'Serbe')");
6218     $dbh->do("INSERT INTO language_descriptions (subtag, type, lang, description) VALUES( 'sr', 'language', 'de', 'Serbisch')");
6219     $dbh->do("INSERT INTO language_descriptions (subtag, type, lang, description) VALUES( 'es', 'language', 'de', 'Spanisch')");
6220     $dbh->do("INSERT INTO language_descriptions (subtag, type, lang, description) VALUES( 'sv', 'language', 'de', 'Schwedisch')");
6221     $dbh->do("INSERT INTO language_descriptions (subtag, type, lang, description) VALUES( 'tet', 'language', 'fr', 'Tétoum')");
6222     $dbh->do("INSERT INTO language_descriptions (subtag, type, lang, description) VALUES( 'tet', 'language', 'de', 'Tetum')");
6223     $dbh->do("INSERT INTO language_descriptions (subtag, type, lang, description) VALUES( 'th', 'language', 'de', 'Thailändisch')");
6224     $dbh->do("INSERT INTO language_descriptions (subtag, type, lang, description) VALUES( 'tr', 'language', 'de', 'Türkisch')");
6225     $dbh->do("INSERT INTO language_descriptions (subtag, type, lang, description) VALUES( 'uk', 'language', 'de', 'Ukrainisch')");
6226     $dbh->do("INSERT INTO language_descriptions (subtag, type, lang, description) VALUES( 'ur', 'language', 'fr', 'Ourdou')");
6227     $dbh->do("INSERT INTO language_descriptions (subtag, type, lang, description) VALUES( 'ur', 'language', 'de', 'Urdu')");
6228     print "Upgrade to $DBversion done (Bug 9056: add German and a couple of French translations to language_descriptions)\n";
6229     SetVersion ($DBversion);
6230 }
6231
6232 $DBversion = "3.11.00.008";
6233 if (CheckVersion($DBversion)) {
6234     $dbh->do("
6235         CREATE TABLE IF NOT EXISTS `borrower_modifications` (
6236           `timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
6237           `verification_token` varchar(255) NOT NULL DEFAULT '',
6238           `borrowernumber` int(11) NOT NULL DEFAULT '0',
6239           `cardnumber` varchar(16) DEFAULT NULL,
6240           `surname` mediumtext,
6241           `firstname` text,
6242           `title` mediumtext,
6243           `othernames` mediumtext,
6244           `initials` text,
6245           `streetnumber` varchar(10) DEFAULT NULL,
6246           `streettype` varchar(50) DEFAULT NULL,
6247           `address` mediumtext,
6248           `address2` text,
6249           `city` mediumtext,
6250           `state` text,
6251           `zipcode` varchar(25) DEFAULT NULL,
6252           `country` text,
6253           `email` mediumtext,
6254           `phone` text,
6255           `mobile` varchar(50) DEFAULT NULL,
6256           `fax` mediumtext,
6257           `emailpro` text,
6258           `phonepro` text,
6259           `B_streetnumber` varchar(10) DEFAULT NULL,
6260           `B_streettype` varchar(50) DEFAULT NULL,
6261           `B_address` varchar(100) DEFAULT NULL,
6262           `B_address2` text,
6263           `B_city` mediumtext,
6264           `B_state` text,
6265           `B_zipcode` varchar(25) DEFAULT NULL,
6266           `B_country` text,
6267           `B_email` text,
6268           `B_phone` mediumtext,
6269           `dateofbirth` date DEFAULT NULL,
6270           `branchcode` varchar(10) DEFAULT NULL,
6271           `categorycode` varchar(10) DEFAULT NULL,
6272           `dateenrolled` date DEFAULT NULL,
6273           `dateexpiry` date DEFAULT NULL,
6274           `gonenoaddress` tinyint(1) DEFAULT NULL,
6275           `lost` tinyint(1) DEFAULT NULL,
6276           `debarred` date DEFAULT NULL,
6277           `debarredcomment` varchar(255) DEFAULT NULL,
6278           `contactname` mediumtext,
6279           `contactfirstname` text,
6280           `contacttitle` text,
6281           `guarantorid` int(11) DEFAULT NULL,
6282           `borrowernotes` mediumtext,
6283           `relationship` varchar(100) DEFAULT NULL,
6284           `ethnicity` varchar(50) DEFAULT NULL,
6285           `ethnotes` varchar(255) DEFAULT NULL,
6286           `sex` varchar(1) DEFAULT NULL,
6287           `password` varchar(30) DEFAULT NULL,
6288           `flags` int(11) DEFAULT NULL,
6289           `userid` varchar(75) DEFAULT NULL,
6290           `opacnote` mediumtext,
6291           `contactnote` varchar(255) DEFAULT NULL,
6292           `sort1` varchar(80) DEFAULT NULL,
6293           `sort2` varchar(80) DEFAULT NULL,
6294           `altcontactfirstname` varchar(255) DEFAULT NULL,
6295           `altcontactsurname` varchar(255) DEFAULT NULL,
6296           `altcontactaddress1` varchar(255) DEFAULT NULL,
6297           `altcontactaddress2` varchar(255) DEFAULT NULL,
6298           `altcontactaddress3` varchar(255) DEFAULT NULL,
6299           `altcontactstate` text,
6300           `altcontactzipcode` varchar(50) DEFAULT NULL,
6301           `altcontactcountry` text,
6302           `altcontactphone` varchar(50) DEFAULT NULL,
6303           `smsalertnumber` varchar(50) DEFAULT NULL,
6304           `privacy` int(11) DEFAULT NULL,
6305           PRIMARY KEY (`verification_token`,`borrowernumber`),
6306           KEY `verification_token` (`verification_token`),
6307           KEY `borrowernumber` (`borrowernumber`)
6308         ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
6309 ");
6310
6311     $dbh->do("
6312         INSERT INTO systempreferences (`variable`, `value`, `options`, `explanation`, `type`) VALUES
6313         ('PatronSelfRegistration', '0', NULL, 'If enabled, patrons will be able to register themselves via the OPAC.', 'YesNo'),
6314         ('PatronSelfRegistrationVerifyByEmail', '0', NULL, 'If enabled, any patron attempting to register themselves via the OPAC will be required to verify themselves via email to activate his or her account.', 'YesNo'),
6315         ('PatronSelfRegistrationDefaultCategory', '', '', 'A patron registered via the OPAC will receive a borrower category code set in this system preference.', 'free'),
6316         ('PatronSelfRegistrationExpireTemporaryAccountsDelay', '0', NULL, 'If PatronSelfRegistrationDefaultCategory is enabled, this system preference controls how long a patron can have a temporary status before the account is deleted automatically. It is an integer value representing a number of days to wait before deleting a temporary patron account. Setting it to 0 disables the deleting of temporary accounts.', 'Integer'),
6317         ('PatronSelfRegistrationBorrowerMandatoryField',  'surname|firstname', NULL ,  'Choose the mandatory fields for a patron''s account, when registering via the OPAC.',  'free'),
6318         ('PatronSelfRegistrationBorrowerUnwantedField',  '', NULL ,  'Name the fields you don''t want to display when registering a new patron via the OPAC.',  'free');
6319     ");
6320
6321     $dbh->do("
6322     INSERT INTO  letter ( `module`, `code`, `branchcode`, `name`, `is_html`, `title`, `content` )
6323     VALUES ( 'members', 'OPAC_REG_VERIFY', '', 'Opac Self-Registration Verification Email', '1', 'Verify Your Account', 'Hello!
6324
6325     Your library account has been created. Please verify your email address by clicking this link to complete the signup process:
6326
6327     http://<<OPACBaseURL>>/cgi-bin/koha/opac-registration-verify.pl?token=<<borrower_modifications.verification_token>>
6328
6329     If you did not initiate this request, you may safely ignore this one-time message. The request will expire shortly.'
6330     )");
6331
6332     print "Upgrade to $DBversion done (Bug 7067: Add Patron Self Registration)\n";
6333     SetVersion ($DBversion);
6334 }
6335
6336 $DBversion = "3.11.00.009";
6337 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
6338     $dbh->do("
6339         INSERT IGNORE INTO systempreferences (variable,value,explanation,options,type) VALUES
6340         ('SeparateHoldings', '0', 'Separate current branch holdings from other holdings', NULL, 'YesNo'),
6341         ('SeparateHoldingsBranch', 'homebranch', 'Branch used to separate holdings', 'homebranch|holdingbranch', 'Choice'),
6342         ('OpacSeparateHoldings', '0', 'Separate current branch holdings from other holdings (OPAC)', NULL, 'YesNo'),
6343         ('OpacSeparateHoldingsBranch', 'homebranch', 'Branch used to separate holdings (OPAC)', 'homebranch|holdingbranch', 'Choice')
6344     ");
6345
6346     print "Upgrade to $DBversion done (Bug 7674: Add systempreferences SeparateHoldings, SeparateHoldingsBranch, OpacSeparateHoldings and OpacSeparateHoldingsBranch) \n";
6347     SetVersion ($DBversion);
6348 }
6349
6350 $DBversion = "3.11.00.010";
6351 if ( C4::Context->preference("Version") < TransformToNum($DBversion) ) {
6352     $dbh->do("INSERT INTO systempreferences (variable,value,options,explanation,type) VALUES('RenewalSendNotice', '0', '', NULL, 'YesNo')");
6353     $dbh->do(q{
6354         INSERT INTO `letter` (`module`, `code`, `name`, `title`, `content`) VALUES
6355         ('circulation','RENEWAL','Item Renewals','Item Renewals','The following items have been renewed:\r\n----\r\n<<biblio.title>>\r\n----\r\nThank you for visiting <<branches.branchname>>.');
6356     });
6357     print "Upgrade to $DBversion done (Bug 9151 - Renewal notice according to patron alert preferences)\n";
6358     SetVersion($DBversion);
6359 }
6360
6361 $DBversion = "3.11.00.011";
6362 if ( CheckVersion($DBversion) ) {
6363    $dbh->do("INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES('HTML5MediaEnabled','not','Show a HTML5 media player in a tab on opac-detail.pl for media files catalogued in field 856.','not|opac|staff|both','Choice');");
6364    $dbh->do("INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES('HTML5MediaExtensions','webm|ogg|ogv|oga|vtt','Media file extensions','','free');");
6365    print "Upgrade to $DBversion done (Bug 8377: Add HTML5MediaEnabled and HTML5MediaExtensions sysprefs)\n";
6366    SetVersion ($DBversion);
6367 }
6368
6369 $DBversion = "3.11.00.012";
6370 if ( CheckVersion($DBversion) ) {
6371     $dbh->do("INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES('AllowHoldsOnPatronsPossessions', '1', 'Allow holds on records that patron have items of it',NULL,'YesNo')");
6372     print "Upgrade to $DBversion done (Bug 9206: Only allow place holds in records that the patron don't have in his possession)\n";
6373     SetVersion($DBversion);
6374 }
6375
6376 $DBversion = "3.11.00.013";
6377 if ( CheckVersion($DBversion) ) {
6378     $dbh->do("INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES('NotesBlacklist','','List of notes fields that should not appear in the title notes/description separator of details',NULL,'free')");
6379     print "Upgrade to $DBversion done (Bug 9162 - Add a system preference to set which notes fields appears on title notes/description separator)\n";
6380     SetVersion($DBversion);
6381 }
6382
6383 $DBversion = "3.11.00.014";
6384 if ( CheckVersion($DBversion) ) {
6385    $dbh->do("INSERT INTO systempreferences ( variable, value, explanation, type ) VALUES ( 'SCOUserCSS', '', 'Add CSS to be included in the SCO module in an embedded <style> tag.', 'free' )");
6386    $dbh->do("INSERT INTO systempreferences ( variable, value, explanation, type ) VALUES ( 'SCOUserJS', '', 'Define custom javascript for inclusion in the SCO module', 'free' )");
6387    print "Upgrade to $DBversion done (Bug 9009: Add SCOUserCSS and SCOUserJS sysprefs)\n";
6388 }
6389
6390 $DBversion = "3.11.00.015";
6391 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
6392     $dbh->do("INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES ('RentalsInNoissuesCharge', '1', 'Rental charges block checkouts (added to noissuescharge).',NULL,'YesNo');");
6393     $dbh->do("INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES ('ManInvInNoissuesCharge', '1', 'MANUAL_INV charges block checkouts (added to noissuescharge).',NULL,'YesNo');");
6394     print "Upgrade to $DBversion done (Add sysprefs RentalsInNoissuesCharge and ManInvInNoissuesCharge.)\n";
6395     SetVersion($DBversion);
6396 }
6397
6398 $DBversion = "3.11.00.016";
6399 if ( CheckVersion($DBversion) ) {
6400    $dbh->do(q{
6401         UPDATE userflags SET flagdesc="<b>Required for staff login.</b> Staff access, allows viewing of catalogue in staff client." where flagdesc="Modify login / permissions for staff users";
6402         });
6403    $dbh->do(q{
6404         UPDATE userflags SET flagdesc="Edit Authorities" where flagdesc="Allow to edit authorities";
6405         });
6406    $dbh->do(q{
6407         UPDATE userflags SET flagdesc="Allow access to the reports module" where flagdesc="Allow to access to the reports module";
6408         });
6409    $dbh->do(q{
6410         UPDATE userflags SET flagdesc="Set library management parameters (deprecated)" where flagdesc="Set library management parameters";
6411         });
6412    $dbh->do(q{
6413         UPDATE userflags SET flagdesc="Manage serial subscriptions" where flagdesc="Allow to manage serials subscriptions";
6414         });
6415    $dbh->do(q{
6416         UPDATE userflags SET flagdesc="Manage patrons fines and fees" where flagdesc="Update borrower charges";
6417         });
6418    $dbh->do(q{
6419         UPDATE userflags SET flagdesc="Check out and check in items" where flagdesc="Circulate books";
6420         });
6421    $dbh->do(q{
6422         UPDATE userflags SET flagdesc="Manage Koha system settings (Administration panel)" where flagdesc="Set Koha system parameters";
6423         });
6424    $dbh->do(q{
6425         UPDATE userflags SET flagdesc="Add or modify patrons" where flagdesc="Add or modify borrowers";
6426         });
6427    $dbh->do(q{
6428         UPDATE userflags SET flagdesc="Use all tools (expand for granular tools permissions)" where flagdesc="Use tools (export, import, barcodes)";
6429         });
6430    $dbh->do(q{
6431         UPDATE userflags SET flagdesc="Allow staff members to modify permissions for other staff members" where flagdesc="Set user permissions";
6432         });
6433    $dbh->do(q{
6434         UPDATE permissions SET description="Perform batch modification of patrons" where description="Perform batch modifivation of patrons";
6435         });
6436
6437    print "Upgrade to $DBversion done (Bug 9382 (updated with bug 9745) - refresh permission descriptions to make more sense)\n";
6438    SetVersion ($DBversion);
6439 }
6440
6441 $DBversion ="3.11.00.017";
6442 if ( CheckVersion($DBversion) ) {
6443     $dbh->do("INSERT IGNORE INTO systempreferences (variable,value,explanation,options,type) VALUES('IDreamBooksReviews','0','Display book review snippets from IDreamBooks.com','','YesNo');");
6444     $dbh->do("INSERT IGNORE INTO systempreferences (variable,value,explanation,options,type) VALUES('IDreamBooksReadometer','0','Display Readometer from IDreamBooks.com','','YesNo');");
6445     $dbh->do("INSERT IGNORE INTO systempreferences (variable,value,explanation,options,type) VALUES('IDreamBooksResults','0','Display IDreamBooks.com rating in search results','','YesNo');");
6446     print "Upgrade to $DBversion done (Add IDreamBooks enhanced content)\n";
6447     SetVersion($DBversion);
6448 }
6449
6450 $DBversion = "3.11.00.018";
6451 if ( CheckVersion($DBversion) ) {
6452    $dbh->do("INSERT INTO systempreferences (variable,value,options,explanation,type) VALUES ('OPACNumbersPreferPhrase','0', NULL, 'Control the use of phr operator in callnumber and standard number OPAC searches', 'YesNo')");
6453    $dbh->do("INSERT INTO systempreferences (variable,value,options,explanation,type) VALUES ('IntranetNumbersPreferPhrase','0', NULL, 'Control the use of phr operator in callnumber and standard number staff client searches', 'YesNo')");
6454    print "Upgrade to $DBversion done (Bug 9395: Problem with callnumber and standard number search in OPAC and Staff Client)\n";
6455    SetVersion ($DBversion);
6456 }
6457
6458 $DBversion = "3.11.00.019";
6459 if ( CheckVersion($DBversion) ) {
6460     $dbh->do("INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES ('UNIMARCAuthorityField100', 'afrey50      ba0', NULL, NULL, 'Textarea')");
6461     print "Upgrade to $DBversion done (Bug 9145 - Add syspref UNIMARCAuthorityField100)\n";
6462     SetVersion ($DBversion);
6463 }
6464
6465 $DBversion = "3.11.00.020";
6466 if ( CheckVersion($DBversion) ) {
6467     $dbh->do("INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES('UNIMARCField100Language', 'fre','UNIMARC field 100 default language',NULL,'short')");
6468     print "Upgrade to $DBversion done (Bug 8347 - Koha forces UNIMARC 100 field code language to 'fre')\n";
6469     SetVersion($DBversion);
6470 }
6471
6472 $DBversion ="3.11.00.021";
6473 if ( CheckVersion($DBversion) ) {
6474     $dbh->do("INSERT IGNORE INTO systempreferences (variable,value,explanation,options,type) VALUES('OPACPopupAuthorsSearch','0','Display the list of authors when clicking on one author.','','YesNo');");
6475     print "Upgrade to $DBversion done (Bug 5888 - Subject search pop-up for the OPAC)\n";
6476     SetVersion($DBversion);
6477 }
6478
6479 $DBversion = "3.11.00.022";
6480 if ( CheckVersion($DBversion) ) {
6481     $dbh->do(
6482 "INSERT IGNORE INTO systempreferences (variable,value,explanation,options,type) VALUES('Persona',0,'Use Mozilla Persona for login','','YesNo')"
6483     );
6484     print "Upgrade to $DBversion done (Bug 9587 - Allow login via Persona)\n";
6485     SetVersion($DBversion);
6486 }
6487
6488 $DBversion = "3.11.00.023";
6489 if ( CheckVersion($DBversion) ) {
6490     $dbh->do("UPDATE z3950servers SET host = 'lx2.loc.gov', port = 210, db = 'LCDB', syntax = 'USMARC', encoding = 'utf8' WHERE name = 'LIBRARY OF CONGRESS'");
6491     print "Upgrade to $DBversion done (Bug 9520 - Update default LOC Z39.50 target)\n";
6492     SetVersion($DBversion);
6493 }
6494
6495 $DBversion = "3.11.00.024";
6496 if ( CheckVersion($DBversion) ) {
6497     $dbh->do("INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES('OpacItemLocation','callnum','Show the shelving location of items in the opac','callnum|ccode|location','Choice');");
6498     print "Upgrade to $DBversion done (Bug 5079: Add OpacItemLocation syspref)\n";
6499     SetVersion ($DBversion);
6500 }
6501
6502 $DBversion = "3.11.00.025";
6503 if ( CheckVersion($DBversion) ) {
6504     $dbh->do(
6505         "CREATE TABLE linktracker (
6506   id int(11) NOT NULL AUTO_INCREMENT,
6507   biblionumber int(11) DEFAULT NULL,
6508   itemnumber int(11) DEFAULT NULL,
6509   borrowernumber int(11) DEFAULT NULL,
6510   url text,
6511   timeclicked datetime DEFAULT NULL,
6512   PRIMARY KEY (id),
6513   KEY bibidx (biblionumber),
6514   KEY itemidx (itemnumber),
6515   KEY borridx (borrowernumber),
6516   KEY dateidx (timeclicked)
6517     ) ENGINE=InnoDB DEFAULT CHARSET=utf8;"
6518     );
6519     $dbh->do( "
6520   INSERT INTO systempreferences (variable,value,explanation,options,type)
6521   VALUES('TrackClicks','0','Track links clicked',NULL,'Integer')" );
6522     print
6523 "Upgrade to $DBversion done (Adds feature Bug 8917, the ability to track links clicked)\n";
6524     SetVersion($DBversion);
6525 }
6526
6527 $DBversion = "3.11.00.026";
6528 if ( CheckVersion($DBversion) ) {
6529     $dbh->do(qq{
6530         ALTER TABLE import_records ADD INDEX batch_id_record_type ( import_batch_id, record_type );
6531     });
6532     print "Upgrade to $DBversion done (Bug 9207: Add new index batch_id_record_type to import_records)\n";
6533     SetVersion($DBversion);
6534 }
6535
6536 $DBversion = "3.11.00.027";
6537 if ( CheckVersion($DBversion) ) {
6538     $dbh->do(q{
6539         INSERT INTO permissions ( module_bit, code, description )
6540         VALUES  ( '1', 'overdues_report', 'Execute overdue items report' )
6541     });
6542     # add new permission for users with all report permissions and circulation remaining permission
6543     $dbh->do(q{
6544         INSERT INTO user_permissions (borrowernumber, module_bit, code)
6545         SELECT user_permissions.borrowernumber, 1, 'overdues_report'
6546         FROM user_permissions
6547         LEFT JOIN borrowers USING(borrowernumber)
6548         WHERE borrowers.flags & (1 << 16)
6549         AND user_permissions.code = 'circulate_remaining_permissions'
6550     });
6551     print "Upgrade to $DBversion done ( Add circ permission overdues_report )\n";
6552     SetVersion($DBversion);
6553 }
6554
6555 $DBversion = "3.11.00.028";
6556 if ( CheckVersion($DBversion) ) {
6557     $dbh->do("INSERT IGNORE INTO systempreferences (variable,value,options,explanation,type) VALUES ('PatronSelfRegistrationAdditionalInstructions', '', NULL , 'A free text field to display additional instructions to newly self registered patrons.', 'free'    );");
6558     print "Upgrade to $DBversion done (Bug 9756 - Patron self registration missing the system preference PatronSelfRegistrationAdditionalInstructions)\n";
6559     SetVersion($DBversion);
6560 }
6561
6562 $DBversion = "3.11.00.029";
6563 if (CheckVersion($DBversion)) {
6564     $dbh->do("INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES('UseQueryParser', '0', 'If enabled, try to use QueryParser for queries.', NULL, 'YesNo')");
6565     print "Upgrade to $DBversion done (Bug 9239: Make it possible for Koha to use QueryParser)\n";
6566     SetVersion ($DBversion);
6567 }
6568
6569 $DBversion = "3.11.00.030";
6570 if ( CheckVersion($DBversion) ) {
6571     $dbh->do("INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES('FinesIncludeGracePeriod','1','If enabled, fines calculations will include the grace period.',NULL,'YesNo');");
6572     print "Upgrade to $DBversion done (Add system preference FinesIncludeGracePeriod)\n";
6573     SetVersion($DBversion);
6574 }
6575
6576 $DBversion = "3.11.00.100";
6577 if ( CheckVersion($DBversion) ) {
6578     print "Upgrade to $DBversion done (3.12-alpha release)\n";
6579     SetVersion ($DBversion);
6580 }
6581
6582 $DBversion = "3.11.00.101";
6583 if ( CheckVersion($DBversion) ) {
6584    $dbh->do("INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES ('UNIMARCAuthorsFacetsSeparator',', ', 'UNIMARC authors facets separator', NULL, 'short')");
6585    print "Upgrade to $DBversion done (Bug 9341: Problem with UNIMARC authors facets)\n";
6586    SetVersion ($DBversion);
6587 }
6588
6589 $DBversion = "3.11.00.102";
6590 if ( CheckVersion($DBversion) ) {
6591     $dbh->do(q{
6592         DELETE FROM systempreferences WHERE variable='NoZebra'
6593     });
6594     $dbh->do(q{
6595         DELETE FROM systempreferences WHERE variable='QueryRemoveStopwords'
6596     });
6597     print "Upgrade to $DBversion done (Remove deprecated NoZebra and QueryRemoveStopwords sysprefs)\n";
6598     SetVersion($DBversion);
6599 }
6600
6601 $DBversion = "3.11.00.103";
6602 if ( CheckVersion($DBversion) ) {
6603     $dbh->do("DELETE FROM systempreferences WHERE variable = 'insecure';");
6604     print "Upgrade to $DBversion done (Bug 9827 - Remove 'insecure' system preference)\n";
6605     SetVersion($DBversion);
6606 }
6607
6608 $DBversion = "3.11.00.104";
6609 if ( CheckVersion($DBversion) ) {
6610     print "Upgrade to $DBversion done (3.12-alpha2 release)\n";
6611     SetVersion ($DBversion);
6612 }
6613
6614 $DBversion = "3.11.00.105";
6615 if ( CheckVersion($DBversion) ) {
6616     if ( C4::Context->preference("marcflavour") eq 'MARC21' ) {
6617         $sth = $dbh->prepare(
6618 "SELECT frameworkcode FROM marc_tag_structure WHERE tagfield = '029'"
6619         );
6620         $sth->execute;
6621         my $frameworkcodes = $sth->fetchall_hashref('frameworkcode');
6622
6623         for my $frameworkcode ( keys %$frameworkcodes ) {
6624             $dbh->do( "
6625     INSERT IGNORE INTO marc_subfield_structure (tagfield, tagsubfield, liblibrarian,
6626     libopac, repeatable, mandatory, kohafield, tab, authorised_value, authtypecode,
6627     value_builder, isurl, hidden, frameworkcode, seealso, link, defaultvalue) VALUES
6628     ('029', 'a', 'OCLC library identifier', 'OCLC library identifier', 0, 0, '', 0, '', '', '', 0, -6, '$frameworkcode', '', '', NULL),
6629     ('029', 'b', 'System control number', 'System control number', 0, 0, '', 0, '', '', '', 0, -6, '$frameworkcode', '', '', NULL),
6630     ('029', 'c', 'OAI set name', 'OAI set name', 0, 0, '', 0, '', '', '', 0, -6, '$frameworkcode', '', '', NULL),
6631     ('029', 't', 'Content type identifier', 'Content type identifier', 0, 0, '', 0, '', '', '', 0, -6, '$frameworkcode', '', '', NULL)
6632    " );
6633         }
6634
6635         for my $tag ( '863', '864', '865' ) {
6636             $sth = $dbh->prepare(
6637 "SELECT frameworkcode FROM marc_tag_structure WHERE tagfield = '$tag'"
6638             );
6639             $sth->execute;
6640             my $frameworkcodes = $sth->fetchall_hashref('frameworkcode');
6641
6642             for my $frameworkcode ( keys %$frameworkcodes ) {
6643                 $dbh->do( "
6644      INSERT IGNORE INTO marc_subfield_structure (tagfield, tagsubfield, liblibrarian,
6645      libopac, repeatable, mandatory, kohafield, tab, authorised_value, authtypecode,
6646      value_builder, isurl, hidden, frameworkcode, seealso, link, defaultvalue) VALUES
6647      ('$tag', '6', 'Linkage', 'Linkage', 0, 0, '', 8, '', '', '', NULL, 5, '$frameworkcode', '', '', NULL),
6648      ('$tag', '8', 'Field link and sequence number', 'Field link and sequence number', 0, 0, '', 8, '', '', '', NULL, 5, '$frameworkcode', '', '', NULL),
6649      ('$tag', 'a', 'First level of enumeration', 'First level of enumeration', 0, 0, '', 8, '', '', '', 0, 5, '$frameworkcode', '', '', NULL),
6650      ('$tag', 'b', 'Second level of enumeration', 'Second level of enumeration', 0, 0, '', 8, '', '', '', 0, 5, '$frameworkcode', '', '', NULL),
6651      ('$tag', 'c', 'Third level of enumeration', 'Third level of enumeration', 0, 0, '', 8, '', '', '', 0, 5, '$frameworkcode', '', '', NULL),
6652      ('$tag', 'd', 'Fourth level of enumeration', 'Fourth level of enumeration', 0, 0, '', 8, '', '', '', 0, 5, '$frameworkcode', '', '', NULL),
6653      ('$tag', 'e', 'Fifth level of enumeration', 'Fifth level of enumeration', 0, 0, '', 8, '', '', '', 0, 5, '$frameworkcode', '', '', NULL),
6654      ('$tag', 'f', 'Sixth level of enumeration', 'Sixth level of enumeration', 0, 0, '', 8, '', '', '', 0, 5, '$frameworkcode', '', '', NULL),
6655      ('$tag', 'g', 'Alternative numbering scheme, first level of enumeration', 'Alternative numbering scheme, first level of enumeration', 0, 0, '', 8, '', '', '', 0, 5, '$frameworkcode', '', '', NULL),
6656      ('$tag', 'h', 'Alternative numbering scheme, second level of enumeration', 'Alternative numbering scheme, second level of enumeration', 0, 0, '', 8, '', '', '', 0, 5, '$frameworkcode', '', '', NULL),
6657      ('$tag', 'i', 'First level of chronology', 'First level of chronology', 0, 0, '', 8, '', '', '', 0, 5, '$frameworkcode', '', '', NULL),
6658      ('$tag', 'j', 'Second level of chronology', 'Second level of chronology', 0, 0, '', 8, '', '', '', 0, 5, '$frameworkcode', '', '', NULL),
6659      ('$tag', 'k', 'Third level of chronology', 'Third level of chronology', 0, 0, '', 8, '', '', '', 0, 5, '$frameworkcode', '', '', NULL),
6660      ('$tag', 'l', 'Fourth level of chronology', 'Fourth level of chronology', 0, 0, '', 8, '', '', '', 0, 5, '$frameworkcode', '', '', NULL),
6661      ('$tag', 'm', 'Alternative numbering scheme, chronology', 'Alternative numbering scheme, chronology', 0, 0, '', 8, '', '', '', 0, 5, '$frameworkcode', '', '', NULL),
6662      ('$tag', 'n', 'Converted Gregorian year', 'Converted Gregorian year', 0, 0, '', 8, '', '', '', 0, 5, '$frameworkcode', '', '', NULL),
6663      ('$tag', 'o', 'Type of unit', 'Type of unit', 1, 0, '', 8, '', '', '', 0, 5, '$frameworkcode', '', '', NULL),
6664      ('$tag', 'p', 'Piece designation', 'Piece designation', 0, 0, '', 8, '', '', '', 0, 5, '$frameworkcode', '', '', NULL),
6665      ('$tag', 'q', 'Piece physical condition', 'Piece physical condition', 0, 0, '', 8, '', '', '', 0, 5, '$frameworkcode', '', '', NULL),
6666      ('$tag', 's', 'Copyright article-fee code', 'Copyright article-fee code', 1, 0, '', 8, '', '', '', 0, 5, '$frameworkcode', '', '', NULL),
6667      ('$tag', 't', 'Copy number', 'Copy number', 0, 0, '', 8, '', '', '', 0, 5, '$frameworkcode', '', '', NULL),
6668      ('$tag', 'v', 'Issuing date', 'Issuing date', 1, 0, '', 8, '', '', '', 0, 5, '$frameworkcode', '', '', NULL),
6669      ('$tag', 'w', 'Break indicator', 'Break indicator', 0, 0, '', 8, '', '', '', 0, 5, '$frameworkcode', '', '', NULL),
6670      ('$tag', 'x', 'Nonpublic note', 'Nonpublic note', 1, 0, '', 8, '', '', '', 0, 5, '$frameworkcode', '', '', NULL),
6671      ('$tag', 'z', 'Public note', 'Public note', 1, 0, '', 8, '', '', '', 0, 5, '$frameworkcode', '', '', NULL)
6672     " );
6673             }
6674         }
6675     }
6676     print "Upgrade to $DBversion done (Bug 9353: Missing subfields on MARC21 frameworks)\n";
6677     SetVersion($DBversion);
6678 }
6679
6680
6681 $DBversion = "3.11.00.106";
6682 if ( CheckVersion($DBversion) ) {
6683     $dbh->do("INSERT INTO userflags (bit, flag, flagdesc, defaulton) VALUES ('19', 'plugins', 'Koha plugins', '0')");
6684     $dbh->do("INSERT INTO permissions (module_bit, code, description) VALUES
6685               ('19', 'manage', 'Manage plugins ( install / uninstall )'),
6686               ('19', 'tool', 'Use tool plugins'),
6687               ('19', 'report', 'Use report plugins'),
6688               ('19', 'configure', 'Configure plugins')
6689             ");
6690     $dbh->do("INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES('UseKohaPlugins','0','Enable or disable the ability to use Koha Plugins.','','YesNo')");
6691
6692     $dbh->do("
6693         CREATE TABLE IF NOT EXISTS plugin_data (
6694             plugin_class varchar(255) NOT NULL,
6695             plugin_key varchar(255) NOT NULL,
6696             plugin_value text,
6697             PRIMARY KEY (plugin_class,plugin_key)
6698         ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
6699     ");
6700
6701     print "Upgrade to $DBversion done (Bug 7804: Added plugin system.)\n";
6702     SetVersion($DBversion);
6703 }
6704
6705 $DBversion = "3.11.00.107";
6706 if ( CheckVersion($DBversion) ) {
6707    $dbh->do("INSERT INTO systempreferences (variable,value,options,explanation,type) VALUES ('TimeFormat','24hr','12hr|24hr','Defines the global time format for visual output.','Choice')");
6708    print "Upgrade to $DBversion done (Bug 9014: Add syspref TimeFormat)\n";
6709    SetVersion ($DBversion);
6710 }
6711
6712 $DBversion = "3.11.00.108";
6713 if ( CheckVersion($DBversion) ) {
6714     $dbh->do("ALTER TABLE action_logs CHANGE timestamp timestamp TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP;");
6715     $dbh->do("UPDATE action_logs SET info=(SELECT itemnumber FROM items WHERE biblionumber= action_logs.info LIMIT 1) WHERE module='CIRCULATION' AND action in ('ISSUE','RETURN');");
6716     $dbh->do("ALTER TABLE action_logs CHANGE timestamp timestamp TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP;");
6717     print "Upgrade to $DBversion done (Bug 7241: Fix on circulation logs)\n";
6718     print "WARNING about bug 7241: to partially correct the broken logs, the log history is filled with the first found item for each biblio.\n";
6719     SetVersion($DBversion);
6720 }
6721
6722 $DBversion = "3.11.00.109";
6723 if ( CheckVersion($DBversion) ) {
6724    $dbh->do("INSERT INTO systempreferences (variable,value,options,explanation,type) VALUES('DisplayIconsXSLT', '1', '', 'If ON, displays the format, audience, and material type icons in XSLT MARC21 results and detail pages.', 'YesNo');");
6725    print "Upgrade to $DBversion done (Bug 9403: Add DisplayIconsXSLT)\n";
6726    SetVersion ($DBversion);
6727 }
6728
6729 $DBversion = "3.11.00.110";
6730 if ( CheckVersion($DBversion) ) {
6731     $dbh->do("ALTER TABLE pending_offline_operations CHANGE barcode barcode VARCHAR( 20 ) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL");
6732     $dbh->do("ALTER TABLE pending_offline_operations ADD amount DECIMAL( 28, 6 ) NULL DEFAULT NULL");
6733     print "Upgrade to $DBversion done (Bug 8220 - Allow koc uploads to go to process queue)\n";
6734     SetVersion ($DBversion);
6735 }
6736
6737 $DBversion = "3.11.00.111";
6738 if ( CheckVersion($DBversion) ) {
6739     my $sth = $dbh->prepare("
6740         SELECT module, code, branchcode, content
6741         FROM letter
6742         WHERE content LIKE '%<fine>%'
6743     ");
6744     $sth->execute;
6745     my $sth_update = $dbh->prepare("UPDATE letter SET content = ? WHERE module = ? AND code = ? AND branchcode = ?");
6746     while(my $row = $sth->fetchrow_hashref){
6747         $row->{content} =~ s/<fine>\w+<\/fine>/<<items.fine>>/;
6748         $sth_update->execute($row->{content}, $row->{module}, $row->{code}, $row->{branchcode});
6749     }
6750     print "Upgrade to $DBversion done (use new <<items.fine>> syntax in notices)\n";
6751     SetVersion($DBversion);
6752 }
6753
6754 $DBversion = "3.11.00.112";
6755 if ( CheckVersion($DBversion) ) {
6756     $dbh->do(qq{
6757         ALTER TABLE issuingrules ADD COLUMN renewalperiod int(4) DEFAULT NULL AFTER renewalsallowed
6758     });
6759     $dbh->do(qq{
6760         UPDATE issuingrules SET renewalperiod = issuelength
6761     });
6762     print "Upgrade to $DBversion done (Bug 8365: Add colum issuingrules.renewalperiod)\n";
6763     SetVersion ($DBversion);
6764 }
6765
6766 $DBversion = "3.11.00.113";
6767 if ( CheckVersion($DBversion) ) {
6768     $dbh->do(q{
6769         ALTER TABLE branchcategories ADD show_in_pulldown BOOLEAN NOT NULL DEFAULT '0',
6770         ADD INDEX ( show_in_pulldown )
6771     });
6772     print "Upgrade to $DBversion done (Bug 9257 - Add groups to normal search pulldown)\n";
6773     SetVersion ($DBversion);
6774 }
6775
6776 $DBversion = "3.11.00.115";
6777 if ( CheckVersion($DBversion) ) {
6778     $dbh->do("INSERT INTO systempreferences (variable,value,options,explanation,type) VALUES ('HighlightOwnItemsOnOPAC','0','','If on, and a patron is logged into the OPAC, items from his or her home library will be emphasized and shown first in search results and item details.','YesNo')");
6779     $dbh->do("INSERT INTO systempreferences (variable,value,options,explanation,type) VALUES ('HighlightOwnItemsOnOPACWhich','PatronBranch','PatronBranch|OpacURLBranch','Decides which branch''s items to emphasize. If PatronBranch, emphasize the logged in user''s library''s items. If OpacURLBranch, highlight the items of the Apache var BRANCHCODE defined in Koha''s Apache configuration file.','Choice')");
6780     print "Upgrade to $DBversion done (Bug 7740: Add syspref HighlightOwnItemsOnOPAC)\n";
6781     SetVersion ($DBversion);
6782 }
6783
6784 $DBversion = "3.11.00.116";
6785 if ( CheckVersion($DBversion) ) {
6786     $dbh->do(q{ALTER TABLE aqorders DROP COLUMN serialid;});
6787     $dbh->do(q{ALTER TABLE aqorders DROP COLUMN subscription;});
6788     $dbh->do(q{ALTER TABLE aqorders ADD COLUMN subscriptionid INT(11) DEFAULT NULL;});
6789     $dbh->do(q{ALTER TABLE aqorders ADD CONSTRAINT aqorders_subscriptionid FOREIGN KEY (subscriptionid) REFERENCES subscription (subscriptionid) ON DELETE CASCADE ON UPDATE CASCADE;});
6790     $dbh->do(q{ALTER TABLE subscription ADD COLUMN reneweddate DATE DEFAULT NULL;});
6791     print "Upgrade to $DBversion done (Bug 5343: table aqorders: DROP serialid and subscription fields and ADD subscriptionid, table subscription: ADD reneweddate)\n";
6792     SetVersion ($DBversion);
6793 }
6794
6795 $DBversion = "3.11.00.200";
6796 if ( CheckVersion($DBversion) ) {
6797     print "Upgrade to $DBversion done (3.12-beta1 release)\n";
6798     SetVersion ($DBversion);
6799 }
6800
6801 $DBversion = "3.11.00.201";
6802 if ( CheckVersion($DBversion) ) {
6803     $dbh->do("UPDATE z3950servers SET encoding = 'ISO_8859-1' WHERE name = 'BIBSYS' AND host LIKE 'z3950.bibsys.no'");
6804     $dbh->do("UPDATE z3950servers SET encoding = 'ISO_8859-1' WHERE name = 'NORBOK' AND host LIKE 'z3950.nb.no'");
6805     $dbh->do("UPDATE z3950servers SET encoding = 'ISO_8859-1' WHERE name = 'SAMBOK' AND host LIKE 'z3950.nb.no'");
6806     $dbh->do("UPDATE z3950servers SET encoding = 'ISO_8859-1' WHERE name = 'DEICHMAN' AND host like 'z3950.deich.folkebibl.no'");
6807     print "Upgrade to $DBversion done (Bug 9498 - Update encoding for Norwegian sample Z39.50 servers)\n";
6808     SetVersion($DBversion);
6809 }
6810
6811 $DBversion = "3.11.00.202";
6812 if ( CheckVersion($DBversion) ) {
6813    $dbh->do("INSERT INTO language_subtag_registry( subtag, type, description, added) VALUES ( 'ca', 'language', 'Catalan','2013-01-12' )");
6814    $dbh->do("INSERT INTO language_rfc4646_to_iso639(rfc4646_subtag,iso639_2_code) VALUES( 'ca','cat')");
6815    $dbh->do("INSERT INTO language_descriptions(subtag, type, lang, description) VALUES( 'ca', 'language', 'es', 'Catalán')");
6816    $dbh->do("INSERT INTO language_descriptions(subtag, type, lang, description) VALUES( 'ca', 'language', 'en', 'Catalan')");
6817    $dbh->do("INSERT INTO language_descriptions(subtag, type, lang, description) VALUES( 'ca', 'language', 'fr', 'Catalan')");
6818    $dbh->do("INSERT INTO language_descriptions(subtag, type, lang, description) VALUES( 'ca', 'language', 'ca', 'Català')");
6819    $dbh->do("INSERT INTO language_descriptions(subtag, type, lang, description) VALUES( 'ca', 'language', 'de', 'Katalanisch')");
6820    print "Upgrade to $DBversion done (Bug 9381: Add Catalan laguage)\n";
6821    SetVersion ($DBversion);
6822 }
6823
6824 $DBversion = "3.11.00.203";
6825 if ( CheckVersion($DBversion) ) {
6826     $dbh->do(q{ALTER TABLE suggestions CHANGE COLUMN title title VARCHAR(255) DEFAULT NULL;});
6827     print "Upgrade to $DBversion done (Bug 2046 - increasing title column length for suggestions)\n";
6828     SetVersion ($DBversion);
6829 }
6830
6831 $DBversion = "3.11.00.300";
6832 if ( CheckVersion($DBversion) ) {
6833     print "Upgrade to $DBversion done (3.12-beta3 release)\n";
6834     SetVersion ($DBversion);
6835 }
6836
6837 $DBversion = "3.11.00.301";
6838 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
6839     #issues
6840     $dbh->do(q{
6841         ALTER TABLE `issues`
6842             ADD KEY `itemnumber_idx` (`itemnumber`),
6843             ADD KEY `branchcode_idx` (`branchcode`),
6844             ADD KEY `issuingbranch_idx` (`issuingbranch`)
6845     });
6846     $dbh->do(q{
6847         ALTER TABLE `old_issues`
6848             ADD KEY `branchcode_idx` (`branchcode`),
6849             ADD KEY `issuingbranch_idx` (`issuingbranch`)
6850     });
6851     #items
6852     $dbh->do(q{
6853         ALTER TABLE `items` ADD KEY `itype_idx` (`itype`)
6854     });
6855     $dbh->do(q{
6856         ALTER TABLE `deleteditems` ADD KEY `itype_idx` (`itype`)
6857     });
6858     # biblioitems
6859     $dbh->do(q{
6860         ALTER TABLE `biblioitems` ADD KEY `itemtype_idx` (`itemtype`)
6861     });
6862     $dbh->do(q{
6863         ALTER TABLE `deletedbiblioitems` ADD KEY `itemtype_idx` (`itemtype`)
6864     });
6865     # statistics
6866     $dbh->do(q{
6867         ALTER TABLE `statistics`
6868             ADD KEY `branch_idx` (`branch`),
6869             ADD KEY `proccode_idx` (`proccode`),
6870             ADD KEY `type_idx` (`type`),
6871             ADD KEY `usercode_idx` (`usercode`),
6872             ADD KEY `itemnumber_idx` (`itemnumber`),
6873             ADD KEY `itemtype_idx` (`itemtype`),
6874             ADD KEY `borrowernumber_idx` (`borrowernumber`),
6875             ADD KEY `associatedborrower_idx` (`associatedborrower`),
6876             ADD KEY `ccode_idx` (`ccode`)
6877     });
6878
6879     print "Upgrade to $DBversion done (Bug 9681: Add some database indexes)\n";
6880     SetVersion($DBversion);
6881 }
6882
6883 $DBversion = "3.12.00.000";
6884 if ( CheckVersion($DBversion) ) {
6885     print "Upgrade to $DBversion done (3.12.0 release)\n";
6886     SetVersion ($DBversion);
6887 }
6888
6889 $DBversion = '3.13.00.000';
6890 if ( CheckVersion($DBversion) ) {
6891     print "Upgrade to $DBversion done (start the journey to Koha Pi)\n";
6892     SetVersion ($DBversion);
6893 }
6894
6895 $DBversion = "3.13.00.001";
6896 if ( CheckVersion($DBversion) ) {
6897     $dbh->do("INSERT INTO `systempreferences` (`variable`, `value`, `options`, `explanation`, `type`) VALUES ('UseCourseReserves', '0', NULL, 'Enable the course reserves feature.', 'YesNo')");
6898     $dbh->do("INSERT INTO userflags (bit,flag,flagdesc,defaulton) VALUES ('18','coursereserves','Course Reserves','0')");
6899     $dbh->do("
6900 CREATE TABLE `courses` (
6901   `course_id` int(11) NOT NULL AUTO_INCREMENT,
6902   `department` varchar(20) DEFAULT NULL,
6903   `course_number` varchar(255) DEFAULT NULL,
6904   `section` varchar(255) DEFAULT NULL,
6905   `course_name` varchar(255) DEFAULT NULL,
6906   `term` varchar(20) DEFAULT NULL,
6907   `staff_note` mediumtext,
6908   `public_note` mediumtext,
6909   `students_count` varchar(20) DEFAULT NULL,
6910   `enabled` enum('yes','no') NOT NULL DEFAULT 'yes',
6911   `timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
6912    PRIMARY KEY (`course_id`)
6913 ) ENGINE=InnoDB  DEFAULT CHARSET=utf8;
6914     ");
6915
6916     $dbh->do("
6917 CREATE TABLE `course_instructors` (
6918   `course_id` int(11) NOT NULL,
6919   `borrowernumber` int(11) NOT NULL,
6920   PRIMARY KEY (`course_id`,`borrowernumber`),
6921   KEY `borrowernumber` (`borrowernumber`)
6922 ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
6923     ");
6924
6925     $dbh->do("
6926 ALTER TABLE `course_instructors`
6927   ADD CONSTRAINT `course_instructors_ibfk_2` FOREIGN KEY (`course_id`) REFERENCES `courses` (`course_id`),
6928   ADD CONSTRAINT `course_instructors_ibfk_1` FOREIGN KEY (`borrowernumber`) REFERENCES `borrowers` (`borrowernumber`) ON DELETE CASCADE ON UPDATE CASCADE;
6929     ");
6930
6931     $dbh->do("
6932 CREATE TABLE `course_items` (
6933   `ci_id` int(11) NOT NULL AUTO_INCREMENT,
6934   `itemnumber` int(11) NOT NULL,
6935   `itype` varchar(10) DEFAULT NULL,
6936   `ccode` varchar(10) DEFAULT NULL,
6937   `holdingbranch` varchar(10) DEFAULT NULL,
6938   `location` varchar(80) DEFAULT NULL,
6939   `enabled` enum('yes','no') NOT NULL DEFAULT 'no',
6940   `timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
6941    PRIMARY KEY (`ci_id`),
6942    UNIQUE KEY `itemnumber` (`itemnumber`),
6943    KEY `holdingbranch` (`holdingbranch`)
6944 ) ENGINE=InnoDB  DEFAULT CHARSET=utf8;
6945     ");
6946
6947     $dbh->do("
6948 ALTER TABLE `course_items`
6949   ADD CONSTRAINT `course_items_ibfk_2` FOREIGN KEY (`holdingbranch`) REFERENCES `branches` (`branchcode`) ON DELETE CASCADE ON UPDATE CASCADE,
6950   ADD CONSTRAINT `course_items_ibfk_1` FOREIGN KEY (`itemnumber`) REFERENCES `items` (`itemnumber`) ON DELETE CASCADE ON UPDATE CASCADE;
6951 ");
6952
6953     $dbh->do("
6954 CREATE TABLE `course_reserves` (
6955   `cr_id` int(11) NOT NULL AUTO_INCREMENT,
6956   `course_id` int(11) NOT NULL,
6957   `ci_id` int(11) NOT NULL,
6958   `staff_note` mediumtext,
6959   `public_note` mediumtext,
6960   `timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
6961    PRIMARY KEY (`cr_id`),
6962    UNIQUE KEY `pseudo_key` (`course_id`,`ci_id`),
6963    KEY `course_id` (`course_id`)
6964 ) ENGINE=InnoDB  DEFAULT CHARSET=utf8;
6965 ");
6966
6967     $dbh->do("
6968 ALTER TABLE `course_reserves`
6969   ADD CONSTRAINT `course_reserves_ibfk_1` FOREIGN KEY (`course_id`) REFERENCES `courses` (`course_id`);
6970     ");
6971
6972     $dbh->do("
6973 INSERT INTO permissions (module_bit, code, description) VALUES
6974   (18, 'manage_courses', 'Add, edit and delete courses'),
6975   (18, 'add_reserves', 'Add course reserves'),
6976   (18, 'delete_reserves', 'Remove course reserves')
6977 ;
6978     ");
6979
6980
6981     print "Upgrade to $DBversion done (Add Course Reserves ( system preference UseCourseReserves ))\n";
6982     SetVersion($DBversion);
6983 }
6984
6985 $DBversion = "3.13.00.002";
6986 if ( CheckVersion($DBversion) ) {
6987    $dbh->do("UPDATE systempreferences SET variable = 'IndependentBranches' WHERE variable = 'IndependantBranches'");
6988    print "Upgrade to $DBversion done (Bug 10080 - Change system pref IndependantBranches to IndependentBranches)\n";
6989    SetVersion ($DBversion);
6990 }
6991
6992 $DBversion = '3.13.00.003';
6993 if ( CheckVersion($DBversion) ) {
6994     $dbh->do("ALTER TABLE serial DROP itemnumber");
6995     print "Upgrade to $DBversion done (Bug 7718 - Remove itemnumber column from serials table)\n";
6996     SetVersion($DBversion);
6997 }
6998
6999 $DBversion = "3.13.00.004";
7000 if(CheckVersion($DBversion)) {
7001     $dbh->do(
7002 "INSERT IGNORE INTO systempreferences (variable,value,explanation,options,type) VALUES('OpacShowHoldNotes',0,'Show hold notes on OPAC','','YesNo')"
7003     );
7004     print "Upgrade to $DBversion done (Bug 9722: Allow users to add notes when placing a hold in OPAC)\n";
7005     SetVersion($DBversion);
7006 }
7007
7008 $DBversion = "3.13.00.005";
7009 if(CheckVersion($DBversion)) {
7010     my $intra= C4::Context->preference("intranetstylesheet");
7011     #if this pref is not blank or starting with http, https or / [root], then
7012     #add an additional / to the front
7013     if($intra && $intra !~ /^(\/|https?)/) {
7014         $dbh->do("UPDATE systempreferences SET value=? WHERE variable=?",
7015             undef,('/'.$intra,"intranetstylesheet"));
7016         print "WARNING: Your system preference intranetstylesheet has been prefixed with a slash to make it an absolute path.\n";
7017     }
7018     print "Upgrade to $DBversion done (Bug 10052: Make intranetstylesheet and intranetcolorstylesheet behave exactly like their opac counterparts)\n";
7019     SetVersion ($DBversion);
7020 }
7021
7022 $DBversion = "3.13.00.006";
7023 if ( CheckVersion($DBversion) ) {
7024     $dbh->do(q{
7025         INSERT IGNORE INTO systempreferences (variable,value,explanation,options,type)
7026         VALUES ('CalculateFinesOnReturn','1','Switch to control if overdue fines are calculated on return or not', '', 'YesNo')
7027     });
7028     print "Upgrade to $DBversion done (Bug 10120: Fines on item return controlled by a systempreference)\n";
7029     SetVersion($DBversion);
7030 }
7031
7032 $DBversion = "3.13.00.007";
7033 if ( CheckVersion($DBversion) ) {
7034     $dbh->do("UPDATE systempreferences SET variable='OpacHoldNotes' WHERE variable='OpacShowHoldNotes'");
7035     print "Upgrade to $DBversion done (Bug 10343: Rename OpacShowHoldNotes to OpacHoldNotes)\n";
7036     SetVersion($DBversion);
7037 }
7038
7039 $DBversion = "3.13.00.008";
7040 if ( CheckVersion($DBversion) ) {
7041     $dbh->do("
7042 CREATE TABLE IF NOT EXISTS borrower_files (
7043   file_id int(11) NOT NULL AUTO_INCREMENT,
7044   borrowernumber int(11) NOT NULL,
7045   file_name varchar(255) NOT NULL,
7046   file_type varchar(255) NOT NULL,
7047   file_description varchar(255) DEFAULT NULL,
7048   file_content longblob NOT NULL,
7049   date_uploaded timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
7050   PRIMARY KEY (file_id),
7051   KEY borrowernumber (borrowernumber),
7052   CONSTRAINT borrower_files_ibfk_1 FOREIGN KEY (borrowernumber) REFERENCES borrowers (borrowernumber) ON DELETE CASCADE ON UPDATE CASCADE
7053 ) ENGINE=InnoDB  DEFAULT CHARSET=utf8;
7054     ");
7055     print "Upgrade to $DBversion done (Bug 10443: make sure borrower_files table exists)\n";
7056     SetVersion($DBversion);
7057 }
7058
7059 $DBversion = "3.13.00.009";
7060 if ( CheckVersion($DBversion) ) {
7061     $dbh->do("ALTER TABLE aqorders DROP COLUMN biblioitemnumber");
7062     print "Upgrade to $DBversion done (Bug 9987 - Drop column aqorders.biblioitemnumber)\n";
7063     SetVersion($DBversion);
7064 }
7065
7066 $DBversion = "3.13.00.010";
7067 if ( CheckVersion($DBversion) ) {
7068     $dbh->do(
7069         q{
7070 INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES ('AcqWarnOnDuplicateInvoice','0','Warn librarians when they try to create a duplicate invoice', '', 'YesNo');
7071 }
7072     );
7073     print
7074 "Upgrade to $DBversion done (Bug 10366 - Add system preference to enabling warning librarian when invoice is duplicated)\n";
7075     SetVersion($DBversion);
7076 }
7077
7078 $DBversion = "3.13.00.011";
7079 if ( CheckVersion($DBversion) ) {
7080     $dbh->do("UPDATE language_rfc4646_to_iso639 SET iso639_2_code='ita' WHERE rfc4646_subtag='it'");
7081     print "Upgrade to $DBversion done (Bug 9519: Wrong language code for Italian in the advanced search language limitations)\n";
7082     SetVersion($DBversion);
7083 }
7084
7085 $DBversion = "3.13.00.012";
7086 if ( CheckVersion($DBversion) ) {
7087     $dbh->do("ALTER TABLE issuingrules MODIFY COLUMN overduefinescap decimal(28,6) DEFAULT NULL;");
7088     print "Upgrade to $DBversion done (Bug 10490: Correct datatype for overduefinescap in issuingrules)\n";
7089     SetVersion($DBversion);
7090 }
7091
7092 $DBversion ="3.13.00.013";
7093 if ( CheckVersion($DBversion) ) {
7094     $dbh->do("INSERT IGNORE INTO systempreferences (variable,value,explanation,options,type) VALUES ('AllowTooManyOverride', '1', 'If on, allow staff to override and check out items when the patron has reached the maximum number of allowed checkouts', '', 'YesNo');");
7095     print "Upgrade to $DBversion done (Bug 9576: add AllowTooManyOverride syspref to enable or disable issue limit confirmation)\n";
7096     SetVersion($DBversion);
7097 }
7098
7099 $DBversion = "3.13.00.014";
7100 if ( CheckVersion($DBversion) ) {
7101     $dbh->do("ALTER TABLE courses MODIFY COLUMN department varchar(80) DEFAULT NULL;");
7102     $dbh->do("ALTER TABLE courses MODIFY COLUMN term       varchar(80) DEFAULT NULL;");
7103     print "Upgrade to $DBversion done (Bug 10604: correct width of courses.department and courses.term)\n";
7104     SetVersion($DBversion);
7105 }
7106
7107 $DBversion = "3.13.00.015";
7108 if ( CheckVersion($DBversion) ) {
7109     $dbh->do(
7110 "INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES('itemBarcodeFallbackSearch','','If set, enables the automatic use of a keyword catalog search if the phrase entered as a barcode on the checkout page does not turn up any results during an item barcode search',NULL,'YesNo')"
7111     );
7112     print "Upgrade to $DBversion done (Bug 7494: Add itemBarcodeFallbackSearch syspref)\n";
7113     SetVersion($DBversion);
7114 }
7115
7116 $DBversion = "3.13.00.016";
7117 if ( CheckVersion($DBversion) ) {
7118     $dbh->do(q{
7119         ALTER TABLE items CHANGE wthdrawn withdrawn TINYINT( 1 ) NOT NULL DEFAULT  '0'
7120     });
7121
7122     $dbh->do(q{
7123         ALTER TABLE deleteditems CHANGE wthdrawn withdrawn TINYINT( 1 ) NOT NULL DEFAULT  '0'
7124     });
7125
7126     $dbh->do(q{
7127         UPDATE saved_sql SET savedsql = REPLACE(savedsql, 'wthdrawn', 'withdrawn')
7128     });
7129
7130     $dbh->do(q{
7131         UPDATE marc_subfield_structure SET kohafield = 'items.withdrawn' WHERE kohafield = 'items.wthdrawn'
7132     });
7133
7134     print "Upgrade to $DBversion done (Bug 10550 - Fix database typo wthdrawn)\n";
7135     SetVersion($DBversion);
7136 }
7137
7138 $DBversion = "3.13.00.017";
7139 if ( CheckVersion($DBversion) ) {
7140     $dbh->do(
7141 "INSERT IGNORE INTO systempreferences (variable,value,explanation,options,type) VALUES('OverDriveClientKey','','Client key for OverDrive integration','30','Free')"
7142     );
7143     $dbh->do(
7144 "INSERT IGNORE INTO systempreferences (variable,value,explanation,options,type) VALUES('OverDriveClientSecret','','Client key for OverDrive integration','30','YesNo')"
7145     );
7146     $dbh->do(
7147 "INSERT IGNORE INTO systempreferences (variable,value,explanation,options,type) VALUES('OverDriveLibraryID','','Library ID for OverDrive integration','','Integer')"
7148     );
7149     print "Upgrade to $DBversion done (Bug 10320 - Show results from library's OverDrive collection in OPAC search)\n";
7150     SetVersion($DBversion);
7151 }
7152
7153 $DBversion = "3.13.00.018";
7154 if ( CheckVersion($DBversion) ) {
7155     $dbh->do(qq{DROP TABLE IF EXISTS aqorders_transfers;});
7156     $dbh->do(qq{
7157         CREATE TABLE aqorders_transfers (
7158           ordernumber_from int(11) NULL,
7159           ordernumber_to int(11) NULL,
7160           timestamp timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
7161           UNIQUE KEY ordernumber_from (ordernumber_from),
7162           UNIQUE KEY ordernumber_to (ordernumber_to),
7163           CONSTRAINT aqorders_transfers_ordernumber_from FOREIGN KEY (ordernumber_from) REFERENCES aqorders (ordernumber) ON DELETE SET NULL ON UPDATE CASCADE,
7164           CONSTRAINT aqorders_transfers_ordernumber_to FOREIGN KEY (ordernumber_to) REFERENCES aqorders (ordernumber) ON DELETE SET NULL ON UPDATE CASCADE
7165         ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
7166     });
7167     print "Upgrade to $DBversion done (Bug 5349: Add aqorders_transfers table)\n";
7168     SetVersion($DBversion);
7169 }
7170
7171 $DBversion = "3.13.00.019";
7172 if ( CheckVersion($DBversion) ) {
7173     $dbh->do("ALTER TABLE itemtypes ADD COLUMN checkinmsg VARCHAR(255) AFTER summary;");
7174     $dbh->do("ALTER TABLE itemtypes ADD COLUMN checkinmsgtype CHAR(16) DEFAULT 'message' NOT NULL AFTER checkinmsg;");
7175     print "Upgrade to $DBversion done (Bug 10513 - Light up a warning/message when returning a chosen item type)\n";
7176     SetVersion($DBversion);
7177 }
7178
7179 $DBversion = "3.13.00.020";
7180 if ( CheckVersion($DBversion) ) {
7181     $dbh->do("INSERT INTO systempreferences (variable,value,options,explanation,type) VALUES('WhenLostForgiveFine','0',NULL,'If ON, Forgives the fines on an item when it is lost.','YesNo')");
7182     $dbh->do("INSERT INTO systempreferences (variable,value,options,explanation,type) VALUES('WhenLostChargeReplacementFee','1',NULL,'If ON, Charge the replacement price when a patron loses an item.','YesNo')");
7183     print "Upgrade to $DBversion done (Bug 7639: system preferences to forgive fines on lost items)\n";
7184     SetVersion($DBversion);
7185 }
7186
7187 $DBversion ="3.13.00.021";
7188 if ( CheckVersion($DBversion) ) {
7189     $dbh->do("INSERT IGNORE INTO systempreferences (variable,value,explanation,options,type) VALUES('ConfirmFutureHolds','0','Number of days for confirming future holds','','Integer');");
7190     print "Upgrade to $DBversion done (Bug 9761: Add ConfirmFutureHolds pref)\n";
7191     SetVersion($DBversion);
7192 }
7193
7194 $DBversion = "3.13.00.022";
7195 if ( CheckVersion($DBversion) ) {
7196     $dbh->do("DELETE from auth_tag_structure WHERE tagfield IN ('68a','68b')");
7197     $dbh->do("DELETE from auth_subfield_structure WHERE tagfield IN ('68a','68b')");
7198     print "Upgrade to $DBversion done (Bug 10687 - Delete erroneous tags 68a and 68b on default MARC21 auth framework)\n";
7199     SetVersion($DBversion);
7200 }
7201
7202 $DBversion = "3.13.00.023";
7203 if ( CheckVersion($DBversion) ) {
7204     $dbh->do("ALTER TABLE borrowers CHANGE password password VARCHAR(60);");
7205     print "Upgrade to $DBversion done (Bug 9611 upgrading password storage system)\n";
7206     SetVersion($DBversion);
7207 }
7208
7209 $DBversion = "3.13.00.024";
7210 if ( CheckVersion($DBversion) ) {
7211     $dbh->do(q{ALTER TABLE z3950servers ADD COLUMN recordtype VARCHAR(45) NOT NULL DEFAULT 'biblio' AFTER description;});
7212     print "Upgrade to $DBversion done (Bug 10096 - Add a Z39.50 interface for authority searching)\n";
7213 }
7214
7215 $DBversion = "3.13.00.025";
7216 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
7217    $dbh->do("ALTER TABLE oai_sets_mappings ADD COLUMN operator varchar(8) NOT NULL default 'equal' AFTER marcsubfield;");
7218    print "Upgrade to $DBversion done (Bug 9295: OAI notequal: add operator column to OAI mappings table)\n";
7219    SetVersion ($DBversion);
7220 }
7221
7222 $DBversion = "3.13.00.026";
7223 if ( CheckVersion($DBversion) ) {
7224     $dbh->do(q|
7225         ALTER TABLE auth_subfield_structure ADD COLUMN defaultvalue TEXT DEFAULT NULL AFTER frameworkcode
7226     |);
7227     print "Upgrade to $DBversion done (Bug 10602: Add the column auth_subfield_structure.defaultvalue)\n";
7228     SetVersion($DBversion);
7229 }
7230
7231 $DBversion = "3.13.00.027";
7232 if ( CheckVersion($DBversion) ) {
7233     $dbh->do("INSERT INTO systempreferences (variable,value,options,explanation,type) VALUES ('AllowOfflineCirculation','0','','If on, enables HTML5 offline circulation functionality.','YesNo')");
7234     print "Upgrade to $DBversion done (Bug 10240: Add syspref AllowOfflineCirculation)\n";
7235     SetVersion ($DBversion);
7236 }
7237
7238 $DBversion = "3.13.00.028";
7239 if ( CheckVersion($DBversion) ) {
7240     $dbh->do(q{
7241         ALTER TABLE export_format ADD type VARCHAR(255) DEFAULT 'marc' AFTER encoding
7242     });
7243     $dbh->do(q{
7244         ALTER TABLE export_format CHANGE marcfields content mediumtext NOT NULL
7245     });
7246     print "Upgrade to $DBversion done (Bug 10853: Add new field export_format.type and rename export_format.marcfields with export_format.content)\n";
7247     SetVersion($DBversion);
7248 }
7249
7250 $DBversion = "3.13.00.029";
7251 if ( CheckVersion($DBversion) ) {
7252     $dbh->do(q{
7253         INSERT IGNORE INTO export_format( profile, description, content, csv_separator, type )
7254         VALUES ( "issues to claim", "Default CSV export for serial issue claims",
7255                 "SUPPLIER=aqbooksellers.name|TITLE=subscription.title|ISSUE NUMBER=serial.serialseq|LATE SINCE=serial.planneddate",
7256                 ",", "sql" )
7257     });
7258     print "Upgrade to $DBversion done (Bug 10854: Add the default CSV profile for claiming issues)\n";
7259     SetVersion($DBversion);
7260 }
7261
7262 $DBversion = "3.13.00.030";
7263 if ( CheckVersion($DBversion) ) {
7264     $dbh->do(qq{
7265         DELETE FROM patronimage WHERE NOT EXISTS (SELECT * FROM borrowers WHERE borrowers.cardnumber = patronimage.cardnumber)
7266     });
7267
7268     $dbh->do(qq{
7269         ALTER TABLE patronimage ADD borrowernumber INT( 11 ) NULL FIRST
7270     });
7271
7272     $dbh->{AutoCommit} = 0;
7273     $dbh->{RaiseError} = 1;
7274
7275     eval {
7276         $dbh->do(qq{
7277             UPDATE patronimage LEFT JOIN borrowers USING ( cardnumber ) SET patronimage.borrowernumber = borrowers.borrowernumber
7278         });
7279         $dbh->commit();
7280     };
7281
7282     if ($@) {
7283         print "Upgrade to $DBversion done (Bug 10636 - patronimage should have borrowernumber as PK, not cardnumber) failed! Transaction aborted because $@\n";
7284         eval { $dbh->rollback };
7285     }
7286     else {
7287         $dbh->do(qq{
7288             ALTER TABLE patronimage DROP FOREIGN KEY patronimage_fk1
7289         });
7290         $dbh->do(qq{
7291             ALTER TABLE patronimage DROP PRIMARY KEY, ADD PRIMARY KEY( borrowernumber )
7292         });
7293         $dbh->do(qq{
7294             ALTER TABLE patronimage DROP cardnumber
7295         });
7296         $dbh->do(qq{
7297             ALTER TABLE patronimage ADD FOREIGN KEY ( borrowernumber ) REFERENCES borrowers ( borrowernumber ) ON DELETE CASCADE ON UPDATE CASCADE
7298         });
7299
7300         print "Upgrade to $DBversion done (Bug 10636 - patronimage should have borrowernumber as PK, not cardnumber)\n";
7301         SetVersion($DBversion);
7302     }
7303
7304     $dbh->{AutoCommit} = 1;
7305     $dbh->{RaiseError} = 0;
7306 }
7307
7308 $DBversion = "3.13.00.031";
7309 if ( CheckVersion($DBversion) ) {
7310
7311     $dbh->do(q{
7312         CREATE TABLE IF NOT EXISTS `patron_lists` (
7313           patron_list_id int(11) NOT NULL AUTO_INCREMENT,
7314           name varchar(255) CHARACTER SET utf8 NOT NULL,
7315           owner int(11) NOT NULL,
7316           PRIMARY KEY (patron_list_id),
7317           KEY owner (owner)
7318         ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
7319     });
7320
7321     $dbh->do(q{
7322         ALTER TABLE `patron_lists`
7323           ADD CONSTRAINT patron_lists_ibfk_1 FOREIGN KEY (`owner`) REFERENCES borrowers (borrowernumber) ON DELETE CASCADE ON UPDATE CASCADE;
7324     });
7325
7326     $dbh->do(q{
7327         CREATE TABLE patron_list_patrons (
7328           patron_list_patron_id int(11) NOT NULL AUTO_INCREMENT,
7329           patron_list_id int(11) NOT NULL,
7330           borrowernumber int(11) NOT NULL,
7331           PRIMARY KEY (patron_list_patron_id),
7332           KEY patron_list_id (patron_list_id),
7333           KEY borrowernumber (borrowernumber)
7334         ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
7335     });
7336
7337     $dbh->do(q{
7338         ALTER TABLE `patron_list_patrons`
7339           ADD CONSTRAINT patron_list_patrons_ibfk_1 FOREIGN KEY (patron_list_id) REFERENCES patron_lists (patron_list_id) ON DELETE CASCADE ON UPDATE CASCADE,
7340           ADD CONSTRAINT patron_list_patrons_ibfk_2 FOREIGN KEY (borrowernumber) REFERENCES borrowers (borrowernumber) ON DELETE CASCADE ON UPDATE CASCADE;
7341     });
7342
7343     $dbh->do(q{
7344         INSERT INTO permissions (module_bit, code, description) VALUES
7345         (13, 'manage_patron_lists', 'Add, edit and delete patron lists and their contents')
7346     });
7347
7348     print "Upgrade to $DBversion done (Bug 10565 - Add a 'Patron List' feature for storing and manipulating collections of patrons)\n";
7349     SetVersion($DBversion);
7350 }
7351
7352 $DBversion = "3.13.00.032";
7353 if ( CheckVersion($DBversion) ) {
7354     $dbh->do("ALTER TABLE aqorders ADD COLUMN orderstatus varchar(16) DEFAULT 'new' AFTER parent_ordernumber");
7355     $dbh->do("UPDATE aqorders SET orderstatus='ordered' WHERE basketno IN (SELECT basketno FROM aqbasket WHERE closedate IS NOT NULL)");
7356     $dbh->do(q{
7357         UPDATE aqorders SET orderstatus='partial'
7358         WHERE quantity > quantityreceived
7359         AND quantityreceived > 0
7360         AND ordernumber IN (
7361             SELECT parent_ordernumber
7362             FROM (
7363                 SELECT DISTINCT(parent_ordernumber)
7364                 FROM aqorders
7365                 WHERE ordernumber != parent_ordernumber
7366             ) AS aq
7367         )
7368         AND basketno IN (SELECT basketno FROM aqbasket WHERE closedate IS NOT NULL)
7369     });
7370     $dbh->do("UPDATE aqorders SET orderstatus='complete' WHERE quantity=quantityreceived");
7371     $dbh->do("UPDATE aqorders SET orderstatus='cancelled' WHERE datecancellationprinted IS NOT NULL");
7372     print "Upgrade to $DBversion done (Bug 5336: Add the new column aqorders.orderstatus)\n";
7373     SetVersion($DBversion);
7374 }
7375
7376 $DBversion = "3.13.00.033";
7377 if ( CheckVersion($DBversion) ) {
7378     $dbh->do(qq|
7379         DROP TABLE IF EXISTS subscription_frequencies
7380     |);
7381     $dbh->do(qq|
7382         CREATE TABLE subscription_frequencies (
7383             id INTEGER NOT NULL AUTO_INCREMENT,
7384             description TEXT NOT NULL,
7385             displayorder INT DEFAULT NULL,
7386             unit ENUM('day','week','month','year') DEFAULT NULL,
7387             unitsperissue INTEGER NOT NULL DEFAULT '1',
7388             issuesperunit INTEGER NOT NULL DEFAULT '1',
7389             PRIMARY KEY (id)
7390         ) ENGINE=InnoDB DEFAULT CHARSET=utf8
7391     |);
7392
7393     $dbh->do(qq|
7394         DROP TABLE IF EXISTS subscription_numberpatterns
7395     |);
7396     $dbh->do(qq|
7397         CREATE TABLE subscription_numberpatterns (
7398             id INTEGER NOT NULL AUTO_INCREMENT,
7399             label VARCHAR(255) NOT NULL,
7400             displayorder INTEGER DEFAULT NULL,
7401             description TEXT NOT NULL,
7402             numberingmethod VARCHAR(255) NOT NULL,
7403             label1 VARCHAR(255) DEFAULT NULL,
7404             add1 INTEGER DEFAULT NULL,
7405             every1 INTEGER DEFAULT NULL,
7406             whenmorethan1 INTEGER DEFAULT NULL,
7407             setto1 INTEGER DEFAULT NULL,
7408             numbering1 VARCHAR(255) DEFAULT NULL,
7409             label2 VARCHAR(255) DEFAULT NULL,
7410             add2 INTEGER DEFAULT NULL,
7411             every2 INTEGER DEFAULT NULL,
7412             whenmorethan2 INTEGER DEFAULT NULL,
7413             setto2 INTEGER DEFAULT NULL,
7414             numbering2 VARCHAR(255) DEFAULT NULL,
7415             label3 VARCHAR(255) DEFAULT NULL,
7416             add3 INTEGER DEFAULT NULL,
7417             every3 INTEGER DEFAULT NULL,
7418             whenmorethan3 INTEGER DEFAULT NULL,
7419             setto3 INTEGER DEFAULT NULL,
7420             numbering3 VARCHAR(255) DEFAULT NULL,
7421             PRIMARY KEY (id)
7422         ) ENGINE=InnoDB DEFAULT CHARSET=utf8
7423     |);
7424
7425     $dbh->do(qq|
7426         INSERT INTO subscription_frequencies (description, unit, unitsperissue, issuesperunit, displayorder)
7427         VALUES
7428             ('2/day', 'day', 1, 2, 1),
7429             ('1/day', 'day', 1, 1, 2),
7430             ('3/week', 'week', 1, 3, 3),
7431             ('1/week', 'week', 1, 1, 4),
7432             ('1/2 weeks', 'week', 2, 1, 5),
7433             ('1/3 weeks', 'week', 3, 1, 6),
7434             ('1/month', 'month', 1, 1, 7),
7435             ('1/2 months', 'month', 2, 1, 8),
7436             ('1/3 months', 'month', 3, 1, 9),
7437             ('2/year', 'month', 6, 1, 10),
7438             ('1/year', 'year', 1, 1, 11),
7439             ('1/2 year', 'year', 2, 1, 12),
7440             ('Irregular', NULL, 1, 1, 13)
7441     |);
7442
7443     # Used to link existing subscription to newly created frequencies
7444     my $frequencies_mapping = {     # keys are old frequency numbers, values are the new ones
7445         1 => 2,     # daily (n/week)
7446         2 => 4,     # 1/week
7447         3 => 5,     # 1/2 weeks
7448         4 => 6,     # 1/3 weeks
7449         5 => 7,     # 1/month
7450         6 => 8,     # 1/2 months (6/year)
7451         7 => 9,     # 1/3 months (1/quarter)
7452         8 => 9,    # 1/quarter (seasonal)
7453         9 => 10,    # 2/year
7454         10 => 11,   # 1/year
7455         11 => 12,   # 1/2 years
7456         12 => 1,    # 2/day
7457         16 => 13,   # Without periodicity
7458         32 => 13,   # Irregular
7459         48 => 13    # Unknown
7460     };
7461
7462     $dbh->do(qq|
7463         INSERT INTO subscription_numberpatterns
7464             (label, displayorder, description, numberingmethod,
7465             label1, add1, every1, whenmorethan1, setto1, numbering1,
7466             label2, add2, every2, whenmorethan2, setto2, numbering2,
7467             label3, add3, every3, whenmorethan3, setto3, numbering3)
7468         VALUES
7469             ('Number', 1, 'Simple Numbering method', 'No.{X}',
7470             'Number', 1, 1, 99999, 1, NULL,
7471             NULL, NULL, NULL, NULL, NULL, NULL,
7472             NULL, NULL, NULL, NULL, NULL, NULL),
7473
7474             ('Volume, Number, Issue', 2, 'Volume Number Issue 1', 'Vol.{X}, Number {Y}, Issue {Z}',
7475             'Volume', 1, 48, 99999, 1, NULL,
7476             'Number', 1, 4, 12, 1, NULL,
7477             'Issue', 1, 1, 4, 1, NULL),
7478
7479             ('Volume, Number', 3, 'Volume Number 1', 'Vol {X}, No {Y}',
7480             'Volume', 1, 12, 99999, 1, NULL,
7481             'Number', 1, 1, 12, 1, NULL,
7482             NULL, NULL, NULL, NULL, NULL, NULL),
7483
7484             ('Seasonal', 4, 'Season Year', '{X} {Y}',
7485             'Season', 1, 1, 3, 0, 'season',
7486             'Year', 1, 4, 99999, 1, NULL,
7487             NULL, NULL, NULL, NULL, NULL, NULL)
7488     |);
7489
7490     $dbh->do(qq|
7491         ALTER TABLE subscription
7492         MODIFY COLUMN numberpattern INTEGER DEFAULT NULL,
7493         MODIFY COLUMN periodicity INTEGER DEFAULT NULL
7494     |);
7495
7496     # Update existing subscriptions
7497
7498     my $query = qq|
7499         SELECT subscriptionid, periodicity, numberingmethod,
7500             add1, every1, whenmorethan1, setto1,
7501             add2, every2, whenmorethan2, setto2,
7502             add3, every3, whenmorethan3, setto3
7503         FROM subscription
7504         ORDER BY subscriptionid
7505     |;
7506     my $sth = $dbh->prepare($query);
7507     $sth->execute;
7508     my $insert_numberpatterns_sth = $dbh->prepare(qq|
7509         INSERT INTO subscription_numberpatterns
7510              (label, displayorder, description, numberingmethod,
7511             label1, add1, every1, whenmorethan1, setto1, numbering1,
7512             label2, add2, every2, whenmorethan2, setto2, numbering2,
7513             label3, add3, every3, whenmorethan3, setto3, numbering3)
7514         VALUES
7515             (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
7516     |);
7517     my $check_numberpatterns_sth = $dbh->prepare(qq|
7518         SELECT * FROM subscription_numberpatterns
7519         WHERE (add1 = ? OR (add1 IS NULL AND ? IS NULL)) AND (add2 = ? OR (add2 IS NULL AND ? IS NULL))
7520         AND (add3 = ? OR (add3 IS NULL AND ? IS NULL)) AND (every1 = ? OR (every1 IS NULL AND ? IS NULL))
7521         AND (every2 = ? OR (every2 IS NULL AND ? IS NULL)) AND (every3 = ? OR (every3 IS NULL AND ? IS NULL))
7522         AND (whenmorethan1 = ? OR (whenmorethan1 IS NULL AND ? IS NULL)) AND (whenmorethan2 = ? OR (whenmorethan2 IS NULL AND ? IS NULL))
7523         AND (whenmorethan3 = ? OR (whenmorethan3 IS NULL AND ? IS NULL)) AND (setto1 = ? OR (setto1 IS NULL AND ? IS NULL))
7524         AND (setto2 = ? OR (setto2 IS NULL AND ? IS NULL)) AND (setto3 = ? OR (setto3 IS NULL AND ? IS NULL))
7525         AND (numberingmethod = ? OR (numberingmethod IS NULL AND ? IS NULL))
7526         LIMIT 1
7527     |);
7528     my $update_subscription_sth = $dbh->prepare(qq|
7529         UPDATE subscription
7530         SET numberpattern = ?,
7531             periodicity = ?
7532         WHERE subscriptionid = ?
7533     |);
7534
7535     my $i = 1;
7536     while(my $sub = $sth->fetchrow_hashref) {
7537         $check_numberpatterns_sth->execute(
7538             $sub->{add1}, $sub->{add1}, $sub->{add2}, $sub->{add2}, $sub->{add3}, $sub->{add3},
7539             $sub->{every1}, $sub->{every1}, $sub->{every2}, $sub->{every2}, $sub->{every3}, $sub->{every3},
7540             $sub->{whenmorethan1}, $sub->{whenmorethan1}, $sub->{whenmorethan2}, $sub->{whenmorethan2},
7541             $sub->{whenmorethan3}, $sub->{whenmorethan3}, $sub->{setto1}, $sub->{setto1}, $sub->{setto2},
7542             $sub->{setto2}, $sub->{setto3}, $sub->{setto3}, $sub->{numberingmethod}, $sub->{numberingmethod}
7543         );
7544         my $p = $check_numberpatterns_sth->fetchrow_hashref;
7545         if (defined $p) {
7546             # Pattern already exists, link to it
7547             $update_subscription_sth->execute($p->{id},
7548                 $frequencies_mapping->{$sub->{periodicity}},
7549                 $sub->{subscriptionid});
7550         } else {
7551             # Create a new numbering pattern for this subscription
7552             my $ok = $insert_numberpatterns_sth->execute(
7553                 "Backup pattern $i", 4+$i, "Automatically created pattern by updatedatabase", $sub->{numberingmethod},
7554                 "X", $sub->{add1}, $sub->{every1}, $sub->{whenmorethan1}, $sub->{setto1}, undef,
7555                 "Y", $sub->{add2}, $sub->{every2}, $sub->{whenmorethan2}, $sub->{setto2}, undef,
7556                 "Z", $sub->{add3}, $sub->{every3}, $sub->{whenmorethan3}, $sub->{setto3}, undef
7557             );
7558             if($ok) {
7559                 my $id = $dbh->last_insert_id(undef, undef, 'subscription_numberpatterns', undef);
7560                 # Link to subscription_numberpatterns and subscription_frequencies
7561                 $update_subscription_sth->execute($id,
7562                     $frequencies_mapping->{$sub->{periodicity}},
7563                     $sub->{subscriptionid});
7564             }
7565             $i++;
7566         }
7567     }
7568
7569     # Remove now useless columns
7570     $dbh->do(qq|
7571         ALTER TABLE subscription
7572         DROP COLUMN numberingmethod,
7573         DROP COLUMN add1,
7574         DROP COLUMN every1,
7575         DROP COLUMN whenmorethan1,
7576         DROP COLUMN setto1,
7577         DROP COLUMN add2,
7578         DROP COLUMN every2,
7579         DROP COLUMN whenmorethan2,
7580         DROP COLUMN setto2,
7581         DROP COLUMN add3,
7582         DROP COLUMN every3,
7583         DROP COLUMN whenmorethan3,
7584         DROP COLUMN setto3,
7585         DROP COLUMN dow,
7586         DROP COLUMN issuesatonce,
7587         DROP COLUMN hemisphere,
7588         ADD COLUMN countissuesperunit INTEGER NOT NULL DEFAULT 1 AFTER periodicity,
7589         ADD COLUMN skip_serialseq BOOLEAN NOT NULL DEFAULT 0 AFTER irregularity,
7590         ADD COLUMN locale VARCHAR(80) DEFAULT NULL AFTER numberpattern,
7591         ADD CONSTRAINT subscription_ibfk_1 FOREIGN KEY (periodicity) REFERENCES subscription_frequencies (id) ON DELETE SET NULL ON UPDATE CASCADE,
7592         ADD CONSTRAINT subscription_ibfk_2 FOREIGN KEY (numberpattern) REFERENCES subscription_numberpatterns (id) ON DELETE SET NULL ON UPDATE CASCADE
7593     |);
7594
7595     # Set firstacquidate if not already set (firstacquidate is now mandatory)
7596     my $get_first_planneddate_sth = $dbh->prepare(qq|
7597         SELECT planneddate
7598         FROM serial
7599         WHERE subscriptionid = ?
7600         ORDER BY serialid
7601         LIMIT 1
7602     |);
7603     my $update_firstacquidate_sth = $dbh->prepare(qq|
7604         UPDATE subscription
7605         SET firstacquidate = ?
7606         WHERE subscriptionid = ?
7607     |);
7608
7609     sanitize_zero_date('subscription', 'firstacquidate');
7610     my $get_subscriptions_sth = $dbh->prepare(qq|
7611         SELECT subscriptionid, startdate
7612         FROM subscription
7613         WHERE firstacquidate IS NULL
7614           OR firstacquidate = '0000-00-00'
7615     |);
7616     $get_subscriptions_sth->execute;
7617     while ( my ($subscriptionid, $startdate) = $get_subscriptions_sth->fetchrow ) {
7618         # Try to get the planned date of the first serial
7619         $get_first_planneddate_sth->execute($subscriptionid);
7620         my ($first_planneddate) = $get_first_planneddate_sth->fetchrow;
7621         if ($first_planneddate and $first_planneddate =~ /^\d{4}-\d{2}-\d{2}$/) {
7622             $update_firstacquidate_sth->execute($first_planneddate, $subscriptionid);
7623         } else {
7624             # Defaults to subscription start date
7625             $update_firstacquidate_sth->execute($startdate, $subscriptionid);
7626         }
7627     }
7628
7629     print "Upgrade to $DBversion done (Bug 7688: add subscription_frequencies and subscription_numberpatterns tables)\n";
7630     SetVersion($DBversion);
7631 }
7632
7633 $DBversion = "3.13.00.034";
7634 if ( CheckVersion($DBversion) ) {
7635     $dbh->do("
7636         ALTER TABLE `import_batches`
7637         CHANGE `item_action` `item_action`
7638           ENUM( 'always_add', 'add_only_for_matches', 'add_only_for_new', 'ignore', 'replace' )
7639           NOT NULL DEFAULT 'always_add'
7640     ");
7641     print "Upgrade to $DBversion done (Bug 7131 - way to overlay items in in marc import)\n";
7642     SetVersion($DBversion);
7643 }
7644
7645 $DBversion ="3.13.00.035";
7646 if ( CheckVersion($DBversion) ) {
7647     $dbh->do(q{
7648 CREATE TABLE borrower_debarments (
7649   borrower_debarment_id int(11) NOT NULL AUTO_INCREMENT,
7650   borrowernumber int(11) NOT NULL,
7651   expiration date DEFAULT NULL,
7652   `type` enum('SUSPENSION','OVERDUES','MANUAL') NOT NULL DEFAULT 'MANUAL',
7653   `comment` text,
7654   manager_id int(11) DEFAULT NULL,
7655   created timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
7656   updated timestamp NULL DEFAULT NULL,
7657   PRIMARY KEY (borrower_debarment_id),
7658   KEY borrowernumber (borrowernumber) ,
7659   CONSTRAINT `borrower_debarments_ibfk_1` FOREIGN KEY (`borrowernumber`) REFERENCES `borrowers` (`borrowernumber`)
7660     ON DELETE CASCADE ON UPDATE CASCADE
7661 ) ENGINE=InnoDB  DEFAULT CHARSET=utf8;
7662     });
7663
7664     # debarments with end date
7665     $dbh->do(q{
7666 INSERT INTO borrower_debarments ( borrowernumber, expiration, comment ) SELECT borrowernumber, debarred, debarredcomment FROM borrowers WHERE debarred IS NOT NULL AND debarred <> '9999-12-31'
7667     });
7668     # debarments with no end date
7669     $dbh->do(q{
7670 INSERT INTO borrower_debarments ( borrowernumber, comment ) SELECT borrowernumber, debarredcomment FROM borrowers WHERE debarred = '9999-12-31'
7671     });
7672
7673     $dbh->do(q{
7674 INSERT IGNORE INTO systempreferences (variable,value,explanation,type) VALUES
7675 ('AutoRemoveOverduesRestrictions','0','Defines whether an OVERDUES debarment should be lifted automatically if all overdue items are returned by the patron.','YesNo')
7676     });
7677
7678     print "Upgrade to $DBversion done (Bug 2720 - Overdues which debar automatically should undebar automatically when returned)\n";
7679     SetVersion($DBversion);
7680 }
7681
7682 $DBversion = "3.13.00.036";
7683 if ( CheckVersion($DBversion) ) {
7684     $dbh->do(qq{
7685         INSERT INTO systempreferences (variable, value, explanation, options, type)
7686         VALUES ('StaffDetailItemSelection', '1', 'Enable item selection in record detail page', NULL, 'YesNo')
7687     });
7688     print "Upgrade to $DBversion done (Add system preference StaffDetailItemSelection)\n";
7689     SetVersion($DBversion);
7690 }
7691
7692 $DBversion = "3.13.00.037";
7693 if ( CheckVersion($DBversion) ) {
7694     #add phone if it is not there already (explains the ignore option)
7695     $dbh->do("
7696 INSERT IGNORE INTO message_transport_types (message_transport_type) values ('phone');
7697     ");
7698     print "Upgrade to $DBversion done (Bug 10572: Add phone to message_transport_types table for new installs)\n";
7699     SetVersion($DBversion);
7700 }
7701
7702 $DBversion = "3.13.00.038";
7703 if ( CheckVersion($DBversion) ) {
7704     $dbh->do("INSERT INTO permissions (module_bit, code, description) VALUES(15, 'superserials', 'Manage subscriptions from any branch (only applies when IndependentBranches is used)')");
7705     print "Upgrade to $DBversion done (Bug 8435: Add superserials permission)\n";
7706     SetVersion($DBversion);
7707 }
7708
7709 $DBversion = "3.13.00.039";
7710 if ( CheckVersion($DBversion) ) {
7711     $dbh->do("
7712         ALTER TABLE aqbasket ADD branch varchar(10) default NULL
7713     ");
7714     $dbh->do("
7715         ALTER TABLE aqbasket
7716         ADD CONSTRAINT aqbasket_ibfk_4 FOREIGN KEY (branch)
7717             REFERENCES branches (branchcode)
7718             ON UPDATE CASCADE ON DELETE SET NULL
7719     ");
7720     $dbh->do("
7721         DROP TABLE IF EXISTS aqbasketusers
7722     ");
7723     $dbh->do("
7724         CREATE TABLE aqbasketusers (
7725             basketno int(11) NOT NULL,
7726             borrowernumber int(11) NOT NULL,
7727             PRIMARY KEY (basketno,borrowernumber),
7728             CONSTRAINT aqbasketusers_ibfk_1 FOREIGN KEY (basketno) REFERENCES aqbasket (basketno) ON DELETE CASCADE ON UPDATE CASCADE,
7729             CONSTRAINT aqbasketusers_ibfk_2 FOREIGN KEY (borrowernumber) REFERENCES borrowers (borrowernumber) ON DELETE CASCADE ON UPDATE CASCADE
7730         ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
7731     ");
7732     $dbh->do("
7733         INSERT INTO permissions (module_bit, code, description)
7734         VALUES (11, 'order_manage_all', 'Manage all orders and baskets, regardless of restrictions on them')
7735     ");
7736
7737     print "Upgrade to $DBversion done (Add branch and users list to baskets. "
7738         . "New permission order_manage_all)\n";
7739     SetVersion($DBversion);
7740 }
7741
7742 $DBversion = "3.13.00.040";
7743 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
7744     $dbh->do("CREATE TABLE IF NOT EXISTS marc_modification_templates (
7745               template_id int(11) NOT NULL auto_increment,
7746               name text NOT NULL,
7747               PRIMARY KEY  (template_id)
7748               ) ENGINE=InnoDB  DEFAULT CHARSET=utf8;"
7749     );
7750
7751     $dbh->do("
7752       CREATE TABLE IF NOT EXISTS marc_modification_template_actions (
7753       mmta_id int(11) NOT NULL auto_increment,
7754       template_id int(11) NOT NULL,
7755       ordering int(3) NOT NULL,
7756       action enum('delete_field','update_field','move_field','copy_field') NOT NULL,
7757       field_number smallint(6) NOT NULL default '0',
7758       from_field varchar(3) NOT NULL,
7759       from_subfield varchar(1) NULL,
7760       field_value varchar(100) default NULL,
7761       to_field varchar(3) default NULL,
7762       to_subfield varchar(1) default NULL,
7763       to_regex_search text,
7764       to_regex_replace text,
7765       to_regex_modifiers varchar(8) default '',
7766       conditional enum('if','unless') default NULL,
7767       conditional_field varchar(3) default NULL,
7768       conditional_subfield varchar(1) default NULL,
7769       conditional_comparison enum('exists','not_exists','equals','not_equals') default NULL,
7770       conditional_value text,
7771       conditional_regex tinyint(1) NOT NULL default '0',
7772       description text,
7773       PRIMARY KEY  (mmta_id),
7774       CONSTRAINT `mmta_ibfk_1` FOREIGN KEY (`template_id`) REFERENCES `marc_modification_templates` (`template_id`) ON DELETE CASCADE ON UPDATE CASCADE
7775       ) ENGINE=InnoDB  DEFAULT CHARSET=utf8;
7776     ");
7777
7778     $dbh->do("INSERT INTO permissions (module_bit, code, description) VALUES ('13', 'marc_modification_templates', 'Manage marc modification templates')");
7779
7780     print "Upgrade to $DBversion done ( Bug 8015: Added tables for MARC Modification Framework )\n";
7781     SetVersion($DBversion);
7782 }
7783
7784 $DBversion = "3.13.00.041";
7785 if(CheckVersion($DBversion)) {
7786     $dbh->do(q{
7787         INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES('AcqItemSetSubfieldsWhenReceived','','Set subfields for item when items are created when receiving (e.g. o=5|a="foo bar")','','Free');
7788     });
7789     print "Upgrade to $DBversion done (Bug 10986: Added AcqItemSetSubfieldsWhenReceived syspref)\n";
7790     SetVersion($DBversion);
7791 }
7792
7793 $DBversion = "3.13.00.042";
7794 if(CheckVersion($DBversion)) {
7795     print "Upgrade to $DBversion done (Koha 3.14 beta)\n";
7796     SetVersion($DBversion);
7797 }
7798
7799 $DBversion = "3.13.00.043";
7800 if ( C4::Context->preference("Version") < TransformToNum($DBversion) ) {
7801     $dbh->do("INSERT IGNORE INTO systempreferences (variable,value,options,explanation,type) VALUES('SearchEngine','Zebra','Solr|Zebra','Search Engine','Choice')");
7802     print "Upgrade to $DBversion done (Bug 11196: Add system preference SearchEngine if missing )\n";
7803     SetVersion($DBversion);
7804 }
7805
7806 $DBversion = "3.14.00.000";
7807 if ( CheckVersion($DBversion) ) {
7808     print "Upgrade to $DBversion done (3.14.0 release)\n";
7809     SetVersion ($DBversion);
7810 }
7811
7812 $DBversion = '3.15.00.000';
7813 if ( CheckVersion($DBversion) ) {
7814     print "Upgrade to $DBversion done (the road goes ever on)\n";
7815     SetVersion ($DBversion);
7816 }
7817
7818 $DBversion = "3.15.00.001";
7819 if ( CheckVersion($DBversion) ) {
7820     $dbh->do("UPDATE systempreferences SET value='clear' where variable = 'CircAutoPrintQuickSlip' and value = '0'");
7821     $dbh->do("UPDATE systempreferences SET value='qslip' where variable = 'CircAutoPrintQuickSlip' and value = '1'");
7822     $dbh->do("UPDATE systempreferences SET explanation = 'Choose what should happen when an empty barcode field is submitted in circulation: Display a print quick slip window, Display a print slip window or Clear the screen.', type = 'Choice' where variable = 'CircAutoPrintQuickSlip'");
7823     print "Upgrade to $DBversion done (Bug 11040: Add option to print full slip when checking out a null barcode)\n";
7824     SetVersion($DBversion);
7825 }
7826
7827 $DBversion = "3.15.00.002";
7828 if(CheckVersion($DBversion)) {
7829     $dbh->do("ALTER TABLE deleteditems MODIFY materials text;");
7830     print "Upgrade to $DBversion done (Bug 11275: alter deleteditems.materials from varchar(10) to text)\n";
7831     SetVersion($DBversion);
7832 }
7833
7834 $DBversion = "3.15.00.003";
7835 if ( CheckVersion($DBversion) ) {
7836     $dbh->do(q{
7837         UPDATE accountlines
7838         SET description = ''
7839         WHERE description IN (
7840             ' New Card',
7841             ' Fine',
7842             ' Sundry',
7843             'Writeoff',
7844             ' Account Management fee',
7845             'Payment,thanks', 'Payment,thanks - ',
7846             ' Lost Item'
7847         )
7848     });
7849     print "Upgrade to $DBversion done (Bug 2546: Update fine descriptions)\n";
7850     SetVersion($DBversion);
7851 }
7852
7853 $DBversion = "3.15.00.004";
7854 if ( CheckVersion($DBversion) ) {
7855     if ( C4::Context->preference("marcflavour") eq 'MARC21' ) {
7856         $dbh->do(qq{
7857             INSERT IGNORE INTO marc_subfield_structure (tagfield, tagsubfield, liblibrarian, libopac, repeatable, mandatory,
7858             kohafield, tab, authorised_value, authtypecode, value_builder, isurl, hidden, frameworkcode, seealso, link,
7859             defaultvalue) VALUES
7860             ('015', 'q', 'Qualifying information', 'Qualifying information', 1, 0, '', 0, '', '', '', 0, 0, '', '', '', NULL),
7861             ('020', 'q', 'Qualifying information', 'Qualifying information', 1, 0, '', 0, '', '', '', 0, 0, '', '', '', NULL),
7862             ('024', 'q', 'Qualifying information', 'Qualifying information', 1, 0, '', 0, '', '', '', 0, 0, '', '', '', NULL),
7863             ('027', 'q', 'Qualifying information', 'Qualifying information', 1, 0, '', 0, '', '', '', 0, 0, '', '', '', NULL),
7864             ('800', '7', 'Control subfield', 'Control subfield', 0, 0, '', 8, '', '', '', NULL, -6, '', '', '', NULL),
7865             ('810', '7', 'Control subfield', 'Control subfield', 0, 0, '', 8, '', '', '', NULL, -6, '', '', '', NULL),
7866             ('811', '7', 'Control subfield', 'Control subfield', 0, 0, '', 8, '', '', '', NULL, -6, '', '', '', NULL),
7867             ('830', '7', 'Control subfield', 'Control subfield', 0, 0, '', 8, '', '', '', NULL, -6, '', '', '', NULL);
7868         });
7869         $dbh->do(qq{
7870             INSERT IGNORE INTO auth_subfield_structure (authtypecode, tagfield, tagsubfield, liblibrarian, libopac, repeatable,
7871             mandatory, tab, authorised_value, value_builder, seealso, isurl, hidden, linkid, kohafield, frameworkcode) VALUES
7872             ('', '020', 'q', 'Qualifying information', 'Qualifying information', 1, 0, 0, NULL, NULL, NULL, 0, 0, '', '', ''),
7873             ('', '024', 'q', 'Qualifying information', 'Qualifying information', 1, 0, 0, NULL, NULL, NULL, 0, 0, '', '', '');
7874         });
7875     }
7876     print "Upgrade to $DBversion done (Bug 10970 - Update MARC21 frameworks to Update Nr. 17 - DB update)\n";
7877     SetVersion($DBversion);
7878 }
7879
7880 $DBversion = "3.15.00.005";
7881 if ( CheckVersion($DBversion) ) {
7882    $dbh->do("INSERT INTO systempreferences (variable,value,options,explanation,type) VALUES('AcquisitionDetails', '1', '', 'Hide/Show acquisition details on the biblio detail page.', 'YesNo');");
7883    print "Upgrade to $DBversion done (Bug 8230: Add AcquisitionDetails system preference)\n";
7884    SetVersion ($DBversion);
7885 }
7886
7887 $DBversion = "3.15.00.006";
7888 if(CheckVersion($DBversion)) {
7889     $dbh->do(q{
7890         ALTER TABLE `borrowers`
7891         ADD KEY `surname_idx` (`surname`(255)),
7892         ADD KEY `firstname_idx` (`firstname`(255)),
7893         ADD KEY `othernames_idx` (`othernames`(255))
7894     });
7895     print "Upgrade to $DBversion done (Bug 11249 - Add DB indexes on borrower names)\n";
7896     SetVersion($DBversion);
7897 }
7898
7899 $DBversion = "3.15.00.007";
7900 if ( CheckVersion($DBversion) ) {
7901    $dbh->do("ALTER TABLE items ADD itemlost_on DATETIME NULL AFTER itemlost");
7902    $dbh->do("ALTER TABLE items ADD withdrawn_on DATETIME NULL AFTER withdrawn");
7903    $dbh->do("ALTER TABLE deleteditems ADD itemlost_on DATETIME NULL AFTER itemlost");
7904    $dbh->do("ALTER TABLE deleteditems ADD withdrawn_on DATETIME NULL AFTER withdrawn");
7905    print "Upgrade to $DBversion done (Bug 9673 - Track when items are marked as lost or withdrawn)\n";
7906    SetVersion ($DBversion);
7907 }
7908
7909 $DBversion = "3.15.00.008";
7910 if ( CheckVersion($DBversion) ) {
7911     $dbh->do(q{
7912         ALTER TABLE collections_tracking CHANGE ctId collections_tracking_id integer(11) NOT NULL auto_increment;
7913     });
7914     print "Upgrade to $DBversion done (Bug 11384) - change name of collections_tracker.ctId column)\n";
7915    SetVersion ($DBversion);
7916 }
7917
7918 $DBversion = "3.15.00.009";
7919 if ( CheckVersion($DBversion) ) {
7920     $dbh->do(q{
7921         ALTER TABLE suggestions MODIFY suggesteddate DATE NOT NULL
7922     });
7923     print "Upgrade to $DBversion done (Bug 11391) - drop default value on suggestions.suggesteddate column)\n";
7924    SetVersion ($DBversion);
7925 }
7926
7927 $DBversion = "3.15.00.010";
7928 if(CheckVersion($DBversion)) {
7929     $dbh->do("ALTER TABLE deleteditems DROP COLUMN marc");
7930     print "Upgrade to $DBversion done (Bug 6331: remove obsolete column in deleteditems.marc)\n";
7931     SetVersion ($DBversion);
7932 }
7933
7934 $DBversion = "3.15.00.011";
7935 if(CheckVersion($DBversion)) {
7936     $dbh->do("UPDATE marc_subfield_structure SET maxlength=9999 WHERE maxlength IS NULL OR maxlength=0;");
7937     print "Upgrade to $DBversion done (Bug 8018: set 9999 as default max length for subfields)\n";
7938     SetVersion ($DBversion);
7939 }
7940
7941 $DBversion = "3.15.00.012";
7942 if ( CheckVersion($DBversion) ) {
7943     $dbh->do(q{
7944         INSERT INTO permissions (module_bit, code, description) VALUES ( 1, 'force_checkout', 'Force checkout if a limitation exists')
7945     });
7946     $dbh->do(q{
7947         INSERT INTO permissions (module_bit, code, description) VALUES ( 1, 'manage_restrictions', 'Manage restrictions for accounts')
7948     });
7949     $dbh->do(q{
7950         INSERT INTO user_permissions (borrowernumber, module_bit, code)
7951             SELECT user_permissions.borrowernumber, 1, 'force_checkout'
7952             FROM user_permissions
7953             LEFT JOIN borrowers USING(borrowernumber)
7954             WHERE borrowers.flags & (1 << 1)
7955     });
7956     $dbh->do(q{
7957         INSERT INTO user_permissions (borrowernumber, module_bit, code)
7958             SELECT user_permissions.borrowernumber, 1, 'manage_restrictions'
7959             FROM user_permissions
7960             LEFT JOIN borrowers USING(borrowernumber)
7961             WHERE borrowers.flags & (1 << 1)
7962     });
7963
7964     print "Upgrade to $DBversion done (Bug 10863 - Add permissions force_checkout and manage_restrictions)\n";
7965     SetVersion($DBversion);
7966 }
7967
7968 $DBversion = "3.15.00.013";
7969 if(CheckVersion($DBversion)) {
7970     $dbh->do(q{
7971         UPDATE systempreferences
7972         SET explanation = 'Upon receiving items, update their subfields if they were created when placing an order (e.g. o=5|a="foo bar")'
7973         WHERE variable = "AcqItemSetSubfieldsWhenReceived"
7974     });
7975
7976     $dbh->do(q{
7977         UPDATE systempreferences
7978         SET value = ''
7979         WHERE variable = "AcqItemSetSubfieldsWhenReceived"
7980             AND value = "0"
7981     });
7982     print "Upgrade to $DBversion done (Bug 11237: Update explanation and default value for AcqItemSetSubfieldsWhenReceived syspref)\n";
7983     SetVersion($DBversion);
7984 }
7985
7986 $DBversion = "3.15.00.014";
7987 if (CheckVersion($DBversion)) {
7988     $dbh->do("INSERT INTO systempreferences (variable,value,options,explanation,type) VALUES('SelfCheckReceiptPrompt', '1', 'NULL', 'If ON, print receipt dialog pops up when self checkout is finished.', 'YesNo');");
7989     print "Upgrade to $DBversion done (Bug 11415: add system preference for automatic self checkout receipt printing)\n";
7990     SetVersion($DBversion);
7991 }
7992
7993 $DBversion = "3.15.00.015";
7994 if (CheckVersion($DBversion)) {
7995     $dbh->do("INSERT INTO systempreferences ( variable, value, options, explanation, type ) VALUES
7996         ('OpacSuggestionManagedBy',1,'','Show the name of the staff member who managed a suggestion in OPAC','YesNo');");
7997     print "Upgrade to $DBversion done (Bug 10907: Add OpacSuggestionManagedBy system preference)\n";
7998     SetVersion($DBversion);
7999 }
8000
8001 $DBversion = "3.15.00.016";
8002 if (CheckVersion($DBversion)) {
8003     $dbh->do("ALTER TABLE biblioitems CHANGE url url TEXT NULL DEFAULT NULL");
8004     $dbh->do("ALTER TABLE deletedbiblioitems CHANGE url url TEXT NULL DEFAULT NULL");
8005     print "Upgrade to $DBversion done (Bug 11268 - Biblioitems URL field is too small for some URLs)\n";
8006     SetVersion($DBversion);
8007 }
8008
8009 $DBversion = "3.15.00.017";
8010 if(CheckVersion($DBversion)) {
8011     $dbh->do(q{
8012         UPDATE systempreferences
8013         SET explanation = 'Define the contents of UNIMARC authority control field 100 position 08-35'
8014         WHERE variable = "UNIMARCAuthorityField100"
8015     });
8016     $dbh->do(q{
8017         UPDATE systempreferences
8018         SET explanation = 'Define the contents of MARC21 authority control field 008 position 06-39'
8019         WHERE variable = "MARCAuthorityControlField008"
8020     });
8021     $dbh->do(q{
8022         UPDATE systempreferences
8023         SET explanation = 'Define MARC Organization Code for MARC21 records - http://www.loc.gov/marc/organizations/orgshome.html'
8024         WHERE variable = "MARCOrgCode"
8025     });
8026     print "Upgrade to $DBversion done (Bug 11611 - fix possible confusion between UNIMARC and MARC21 in some sysprefs)\n";
8027     SetVersion($DBversion);
8028 }
8029
8030 $DBversion = "3.15.00.018";
8031 if ( CheckVersion($DBversion) ) {
8032     $dbh->{AutoCommit} = 0;
8033     $dbh->{RaiseError} = 1;
8034
8035     eval {
8036         $dbh->selectcol_arrayref(q|SELECT COUNT(*) FROM roadtype|);
8037     };
8038     unless ( $@ ) {
8039         my $av_added = $dbh->do(q|
8040             INSERT INTO authorised_values(category, authorised_value, lib, lib_opac)
8041                 SELECT 'ROADTYPE', roadtypeid, road_type, road_type
8042                 FROM roadtype;
8043         |);
8044
8045         my $rt_deleted = $dbh->do(q|
8046             DELETE FROM roadtype
8047         |);
8048
8049         if ( $av_added == $rt_deleted or $rt_deleted eq "0E0" ) {
8050             $dbh->do(q|
8051                 DROP TABLE roadtype;
8052             |);
8053             $dbh->commit;
8054             print "Upgrade to $DBversion done (Bug 7372: Move road types from the roadtype table to the ROADTYPE authorised values)\n";
8055             SetVersion($DBversion);
8056         } else {
8057             print "Upgrade to $DBversion failed (Bug 7372: Move road types from the roadtype table to the ROADTYPE authorised values.\nTransaction aborted because $@\n)";
8058             $dbh->rollback;
8059         }
8060     }
8061     $dbh->{AutoCommit} = 1;
8062     $dbh->{RaiseError} = 0;
8063 }
8064
8065 $DBversion = "3.15.00.019";
8066 if ( CheckVersion($DBversion) ) {
8067     $dbh->do("INSERT IGNORE INTO systempreferences (variable,value,options,explanation,type) VALUES('OpacMaxItemsToDisplay','50','','Max items to display at the OPAC on a biblio detail','Integer')");
8068     print "Upgrade to $DBversion done (Bug 11256: Add system preference OpacMaxItemsToDisplay)\n";
8069     SetVersion($DBversion);
8070 }
8071
8072 $DBversion = "3.15.00.020";
8073 if ( CheckVersion($DBversion) ) {
8074     $dbh->do(q|
8075         INSERT IGNORE INTO systempreferences (variable,value,options,explanation,type) VALUES('MaxItemsForBatch','1000',NULL,'Max number of items record to process in a batch (modification or deletion)','Integer')
8076     |);
8077     print "Upgrade to $DBversion done (Bug 11343: Add system preference MaxItemsForBatch )\n";
8078     SetVersion($DBversion);
8079 }
8080
8081 $DBversion = "3.15.00.021";
8082 if(CheckVersion($DBversion)) {
8083     $dbh->do(q{
8084         ALTER TABLE `action_logs`
8085             DROP KEY timestamp,
8086             ADD KEY `timestamp_idx` (`timestamp`),
8087             ADD KEY `user_idx` (`user`),
8088             ADD KEY `module_idx` (`module`(255)),
8089             ADD KEY `action_idx` (`action`(255)),
8090             ADD KEY `object_idx` (`object`),
8091             ADD KEY `info_idx` (`info`(255))
8092     });
8093     print "Upgrade to $DBversion done (Bug 3445: Add indexes to action_logs table)\n";
8094     SetVersion($DBversion);
8095 }
8096
8097 $DBversion = "3.15.00.022";
8098 if (CheckVersion($DBversion)) {
8099     $dbh->do(q|
8100         DELETE FROM systempreferences WHERE variable= "memberofinstitution"
8101     |);
8102     print "Upgrade to $DBversion done (Bug 11751: Remove memberofinstitytion system preference)\n";
8103     SetVersion($DBversion);
8104 }
8105
8106 $DBversion = "3.15.00.023";
8107 if ( CheckVersion($DBversion) ) {
8108    $dbh->do("
8109        INSERT INTO systempreferences (variable,value,options,explanation,type)
8110        VALUES('CardnumberLength', '', '', 'Set a length for card numbers.', 'Free');
8111     ");
8112    print "Upgrade to $DBversion done (Bug 10861: Add CardnumberLength syspref)\n";
8113    SetVersion ($DBversion);
8114 }
8115
8116 $DBversion = "3.15.00.024";
8117 if ( CheckVersion($DBversion) ) {
8118     $dbh->do(q{
8119         DELETE FROM systempreferences WHERE variable = 'NoZebraIndexes'
8120     });
8121     print "Upgrade to $DBversion done (Bug 10012 - remove last vestiges of NoZebra)\n";
8122     SetVersion($DBversion);
8123 }
8124
8125 $DBversion = "3.15.00.025";
8126 if ( CheckVersion($DBversion) ) {
8127     $dbh->do(q{
8128         DROP TABLE aqorderdelivery;
8129     });
8130     print "Upgrade to $DBversion done (Bug 11928 - remove unused table)\n";
8131     SetVersion($DBversion);
8132 }
8133
8134 $DBversion = "3.15.00.026";
8135 if ( CheckVersion($DBversion) ) {
8136     $dbh->do(q{
8137         UPDATE language_descriptions SET description = 'Հայերեն' WHERE subtag = 'hy' AND lang = 'hy';
8138     });
8139     print "Upgrade to $DBversion done (Bug 11973 - Fix Armenian language description)\n";
8140     SetVersion($DBversion);
8141 }
8142
8143 $DBversion = "3.15.00.027";
8144 if (CheckVersion($DBversion)) {
8145     $dbh->do(q{
8146         ALTER TABLE opac_news ADD branchcode varchar(10) DEFAULT NULL
8147                                   AFTER idnew,
8148                               ADD CONSTRAINT opac_news_branchcode_ibfk
8149                                   FOREIGN KEY (branchcode)
8150                                   REFERENCES branches (branchcode)
8151                                   ON DELETE CASCADE ON UPDATE CASCADE;
8152     });
8153     print "Upgrade to $DBversion done (Bug 7567: Add branchcode to opac_news)\n";
8154     SetVersion($DBversion);
8155 }
8156
8157 $DBversion = "3.15.00.028";
8158 if(CheckVersion($DBversion)) {
8159     $dbh->do(q{
8160         ALTER TABLE issuingrules ADD norenewalbefore int(4) default NULL AFTER renewalperiod
8161     });
8162     print "Upgrade to $DBversion done (Bug 7413: Allow OPAC renewal x days before due date)\n";
8163     SetVersion($DBversion);
8164 }
8165
8166 $DBversion = "3.15.00.029";
8167 if ( CheckVersion($DBversion) ) {
8168     $dbh->do(q{
8169         UPDATE borrower_debarments SET expiration = NULL WHERE expiration = '9999-12-31'
8170     });
8171     print "Upgrade to $DBversion done (Bug 11846 - correct borrower_debarments with expiration 9999-12-31)\n";
8172     SetVersion($DBversion);
8173 }
8174
8175 $DBversion = "3.15.00.030";
8176 if(CheckVersion($DBversion)) {
8177     $dbh->do(q|
8178         INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES ('OPACMySummaryNote','','','Note to display on the patron summary page. This note only appears if the patron is connected.','Free')
8179     |);
8180     print "Upgrade to $DBversion done (Bug 12052: Add OPACMySummaryNote syspref)\n";
8181     SetVersion($DBversion);
8182 }
8183
8184 $DBversion = "3.15.00.031";
8185 if ( CheckVersion($DBversion) ) {
8186    $dbh->do("INSERT INTO permissions (module_bit, code, description) VALUES ('10', 'writeoff', 'Write off fines and fees')");
8187    $dbh->do("INSERT INTO permissions (module_bit, code, description) VALUES ('10', 'remaining_permissions', 'Remaining permissions for managing fines and fees')");
8188    print "Upgrade to $DBversion done (Bug 9448 - Add separate permission for writing off fees)\n";
8189    SetVersion ($DBversion);
8190 }
8191
8192 $DBversion = "3.15.00.032";
8193 if ( CheckVersion($DBversion) ) {
8194     $dbh->do("ALTER TABLE aqorders CHANGE notes order_internalnote MEDIUMTEXT;");
8195     $dbh->do("ALTER TABLE aqorders ADD COLUMN order_vendornote MEDIUMTEXT AFTER order_internalnote;");
8196     print "Upgrade to $DBversion done (Bug 9416 - In each order, add a new note made for the vendor)\n";
8197    SetVersion ($DBversion);
8198 }
8199
8200 $DBversion = "3.15.00.033";
8201 if ( CheckVersion($DBversion) ) {
8202     $dbh->do("INSERT IGNORE INTO systempreferences (variable,value,options,explanation,type) VALUES ('NoLoginInstructions', '', '60|10', 'Instructions to display on the OPAC login form when a patron is not logged in', 'Textarea')");
8203     print "Upgrade to $DBversion done (Bug 10951: Add NoLoginInstructions pref)\n";
8204     SetVersion($DBversion);
8205 }
8206
8207 $DBversion = "3.15.00.034";
8208 if ( CheckVersion($DBversion) ) {
8209     $dbh->do("INSERT INTO systempreferences (variable,value,options,explanation,type) VALUES('AdvancedSearchLanguages','','','ISO 639-2 codes of languages you wish to see appear as an advanced search option.  Example: eng|fra|ita','Textarea')");
8210     print "Upgrade to $DBversion done (Bug 10986: system preferences to limit languages in advanced search )\n";
8211     SetVersion ($DBversion);
8212 }
8213
8214 $DBversion = "3.15.00.035";
8215 if ( CheckVersion($DBversion) ) {
8216     #insert a notice for sharing a list and accepting a share
8217     $dbh->do("
8218 INSERT INTO letter (module, code, branchcode, name, is_html, title, content)
8219 VALUES ( 'members', 'SHARE_INVITE', '', 'Invitation for sharing a list', '0', 'Share list <<listname>>', 'Dear patron,
8220
8221 One of our patrons, <<borrowers.firstname>> <<borrowers.surname>>, invites you to share a list <<listname>> in our library catalog.
8222
8223 To access this shared list, please click on the following URL or copy-and-paste it into your browser address bar.
8224
8225 <<shareurl>>
8226
8227 In case you are not a patron in our library or do not want to accept this invitation, please ignore this mail. Note also that this invitation expires within two weeks.
8228
8229 Thank you.
8230
8231 Your library.'
8232     )");
8233     $dbh->do("
8234 INSERT INTO letter (module, code, branchcode, name, is_html, title, content)
8235 VALUES ( 'members', 'SHARE_ACCEPT', '', 'Notification about an accepted share', '0', 'Share on list <<listname>> accepted', 'Dear patron,
8236
8237 We want to inform you that <<borrowers.firstname>> <<borrowers.surname>> accepted your invitation to share your list <<listname>> in our library catalog.
8238
8239 Thank you.
8240
8241 Your library.'
8242     )");
8243     print "Upgrade to $DBversion done (Bug 9032: Share a list)\n";
8244     SetVersion($DBversion);
8245 }
8246
8247 $DBversion = "3.15.00.036";
8248 if ( CheckVersion($DBversion) ) {
8249     $dbh->do(q{
8250         INSERT IGNORE INTO systempreferences (variable,value,explanation,options,type)
8251         VALUES('AllowMultipleIssuesOnABiblio',1,'Allow/Don\'t allow patrons to check out multiple items from one biblio','','YesNo')
8252     });
8253
8254     print "Upgrade to $DBversion done (Bug 10859 - Add system preference AllowMultipleIssuesOnABiblio)\n";
8255     SetVersion($DBversion);
8256 }
8257
8258 $DBversion = "3.15.00.037";
8259 if(CheckVersion($DBversion)) {
8260     $dbh->do(q{
8261         ALTER TABLE itemtypes ADD sip_media_type VARCHAR( 3 ) DEFAULT NULL AFTER checkinmsgtype
8262     });
8263     $dbh->do(q{
8264         INSERT INTO authorised_values (category, authorised_value, lib) VALUES
8265          ('SIP_MEDIA_TYPE', '000', 'Other'),
8266          ('SIP_MEDIA_TYPE', '001', 'Book'),
8267          ('SIP_MEDIA_TYPE', '002', 'Magazine'),
8268          ('SIP_MEDIA_TYPE', '003', 'Bound journal'),
8269          ('SIP_MEDIA_TYPE', '004', 'Audio tape'),
8270          ('SIP_MEDIA_TYPE', '005', 'Video tape'),
8271          ('SIP_MEDIA_TYPE', '006', 'CD/CDROM'),
8272          ('SIP_MEDIA_TYPE', '007', 'Diskette'),
8273          ('SIP_MEDIA_TYPE', '008', 'Book with diskette'),
8274          ('SIP_MEDIA_TYPE', '009', 'Book with CD'),
8275          ('SIP_MEDIA_TYPE', '010', 'Book with audio tape')
8276     });
8277     print "Upgrade to $DBversion done (Bug 11351 - Add support for SIP2 media type)\n";
8278     SetVersion($DBversion);
8279 }
8280
8281 $DBversion = '3.15.00.038';
8282 if ( CheckVersion($DBversion) ) {
8283     $dbh->do(q{
8284         INSERT INTO  systempreferences (
8285             variable,
8286             value,
8287             options,
8288             explanation,
8289             type
8290             )
8291         VALUES (
8292             'DisplayLibraryFacets',  'holding',  'home|holding|both',  'Defines which library facets to display.',  'Choice'
8293         );
8294     });
8295     print "Upgrade to $DBversion done (Bug 11334 - Add facet for home library)\n";
8296     SetVersion ($DBversion);
8297 }
8298
8299 $DBversion = "3.15.00.039";
8300 if ( CheckVersion($DBversion) ) {
8301
8302     $dbh->do( q{
8303         ALTER TABLE letter ADD COLUMN message_transport_type VARCHAR(20) NOT NULL DEFAULT 'email' AFTER content
8304     } );
8305
8306     $dbh->do( q{
8307         ALTER TABLE letter ADD CONSTRAINT message_transport_type_fk FOREIGN KEY (message_transport_type) REFERENCES message_transport_types(message_transport_type) ON DELETE CASCADE ON UPDATE CASCADE
8308     } );
8309
8310     $dbh->do( q{
8311         ALTER TABLE letter DROP PRIMARY KEY, ADD PRIMARY KEY (`module`,`code`,`branchcode`, message_transport_type);
8312     } );
8313
8314     $dbh->do( q{
8315         CREATE TABLE overduerules_transport_types(
8316             id INT(11) NOT NULL AUTO_INCREMENT,
8317             branchcode varchar(10) NOT NULL DEFAULT '',
8318             categorycode VARCHAR(10) NOT NULL DEFAULT '',
8319             letternumber INT(1) NOT NULL DEFAULT 1,
8320             message_transport_type VARCHAR(20) NOT NULL DEFAULT 'email',
8321             PRIMARY KEY (id),
8322             CONSTRAINT overduerules_fk FOREIGN KEY (branchcode, categorycode) REFERENCES overduerules (branchcode, categorycode) ON DELETE CASCADE ON UPDATE CASCADE,
8323             CONSTRAINT mtt_fk FOREIGN KEY (message_transport_type) REFERENCES message_transport_types (message_transport_type) ON DELETE CASCADE ON UPDATE CASCADE
8324         ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
8325     } );
8326
8327     my $sth = $dbh->prepare( q{
8328         SELECT * FROM overduerules;
8329     } );
8330
8331     $sth->execute;
8332     my $sth_insert_mtt = $dbh->prepare( q{
8333         INSERT INTO overduerules_transport_types (branchcode, categorycode, letternumber, message_transport_type) VALUES ( ?, ?, ?, ? )
8334     } );
8335     while ( my $row = $sth->fetchrow_hashref ) {
8336         my $branchcode = $row->{branchcode};
8337         my $categorycode = $row->{categorycode};
8338         for my $letternumber ( 1 .. 3 ) {
8339             next unless $row->{"letter$letternumber"};
8340             $sth_insert_mtt->execute(
8341                 $branchcode, $categorycode, $letternumber, 'email'
8342             );
8343         }
8344     }
8345
8346     print "Upgrade done (Bug 9016: Adds multi transport types management for notices)\n";
8347     SetVersion($DBversion);
8348 }
8349
8350 $DBversion = "3.15.00.040";
8351 if ( CheckVersion($DBversion) ) {
8352     $dbh->do(q|
8353         UPDATE message_transports SET letter_code='HOLD' WHERE letter_code='HOLD_PHONE' OR letter_code='HOLD_PRINT'
8354     |);
8355     $dbh->do(q|
8356         UPDATE letter SET code='HOLD', message_transport_type='print' WHERE code='HOLD_PRINT'
8357     |);
8358     $dbh->do(q|
8359         UPDATE letter SET code='HOLD', message_transport_type='phone' WHERE code='HOLD_PHONE'
8360     |);
8361     print "Upgrade to $DBversion done (Bug 10845: Multi transport types for holds)\n";
8362     SetVersion($DBversion);
8363 }
8364
8365 $DBversion = "3.15.00.041";
8366 if ( CheckVersion($DBversion) ) {
8367     my ( $name ) = $dbh->selectrow_array(q|
8368         SELECT name FROM letter WHERE code="HOLD"
8369     |);
8370     $dbh->do(q|
8371         UPDATE letter
8372         SET code="HOLD",
8373             message_transport_type="phone",
8374             name= ?
8375         WHERE code="HOLD_PHONE"
8376     |, {}, $name);
8377
8378     ( $name ) = $dbh->selectrow_array(q|
8379         SELECT name FROM letter WHERE code="PREDUE"
8380     |);
8381     $dbh->do(q|
8382         UPDATE letter
8383         SET code="PREDUE",
8384             message_transport_type="phone",
8385             name= ?
8386         WHERE code="PREDUE_PHONE"
8387     |, {}, $name);
8388
8389     ( $name ) = $dbh->selectrow_array(q|
8390         SELECT name FROM letter WHERE code="OVERDUE"
8391     |);
8392     $dbh->do(q|
8393         UPDATE letter
8394         SET code="OVERDUE",
8395             message_transport_type="phone",
8396             name= ?
8397         WHERE code="OVERDUE_PHONE"
8398     |, {}, $name);
8399
8400     print "Upgrade to $DBversion done (Bug 11867: Update letters *_PHONE)\n";
8401     SetVersion($DBversion);
8402 }
8403
8404 $DBversion = "3.15.00.042";
8405 if ( CheckVersion($DBversion) ) {
8406     $dbh->do(q{
8407         INSERT INTO systempreferences
8408             (variable,value,explanation,options,type)
8409         VALUES
8410             ('SpecifyReturnDate',0,'Define whether to display \"Specify Return Date\" form in Circulation','','YesNo')
8411     });
8412     print "Upgrade to $DBversion done (Bug 10694 - Allow arbitrary backdating of returns)\n";
8413     SetVersion($DBversion);
8414 }
8415
8416 $DBversion = "3.15.00.043";
8417 if ( CheckVersion($DBversion) ) {
8418     $dbh->do("INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES('MarcFieldsToOrder','','Set the mapping values for a new order line created from a MARC record in a staged file. In a YAML format.', NULL, 'textarea')");
8419    print "Upgrade to $DBversion done (Bug 7180: Added MarcFieldsToOrder syspref)\n";
8420    SetVersion ($DBversion);
8421 }
8422
8423 $DBversion = "3.15.00.044";
8424 if ( CheckVersion($DBversion) ) {
8425     $dbh->do("ALTER TABLE currency ADD isocode VARCHAR(5) default NULL AFTER symbol;");
8426     print "Upgrade to $DBversion done (Added isocode to the currency table)\n";
8427     SetVersion($DBversion);
8428 }
8429
8430 $DBversion = "3.15.00.045";
8431 if ( CheckVersion($DBversion) ) {
8432     $dbh->do("
8433         INSERT INTO systempreferences (variable,value,explanation,options,type)
8434         VALUES (
8435             'BlockExpiredPatronOpacActions',
8436             '0',
8437             'Set whether an expired patron can perform opac actions such as placing holds or renew books, can be overridden on a per patron-type basis',
8438             NULL,
8439             'YesNo'
8440         )
8441     ");
8442     $dbh->do("ALTER TABLE `categories` ADD COLUMN `BlockExpiredPatronOpacActions` TINYINT(1) DEFAULT -1 NOT NULL AFTER category_type");
8443     print "Upgraded to $DBversion done (Bug 6739 - expired patrons not blocked from opac actions)\n";
8444     SetVersion ($DBversion);
8445 }
8446
8447 $DBversion = "3.15.00.046";
8448 if ( CheckVersion($DBversion) ) {
8449     $dbh->do(q|
8450         ALTER TABLE search_history ADD COLUMN type VARCHAR(16) NOT NULL DEFAULT 'biblio' AFTER query_cgi
8451     |);
8452     print "Upgrade to $DBversion done (Bug 10807 - Add db field search_history.type)\n";
8453     SetVersion($DBversion);
8454 }
8455
8456 $DBversion = "3.15.00.047";
8457 if ( CheckVersion($DBversion) ) {
8458     $dbh->do(q|
8459         INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES ('EnableSearchHistory','0','','Enable or disable search history','YesNo')
8460     |);
8461     print "Upgrade to $DBversion done (Bug 10862: Add EnableSearchHistory syspref)\n";
8462     SetVersion($DBversion);
8463 }
8464
8465 $DBversion = "3.15.00.048";
8466 if ( CheckVersion($DBversion) ) {
8467     $dbh->do("INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES ('OpacSuppressionRedirect','1','Redirect the opac detail page for suppressed records to an explanatory page (otherwise redirect to 404 error page)','','YesNo')");
8468     $dbh->do("INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES ('OpacSuppressionMessage', '','Display this message on the redirect page for suppressed biblios','70|10','Textarea')");
8469     print "Upgrade to $DBversion done (Bug 10195: Records hidden with OpacSuppression can still be accessed)\n";
8470     SetVersion($DBversion);
8471 }
8472
8473 $DBversion = "3.15.00.049";
8474 if ( C4::Context->preference("Version") < TransformToNum($DBversion) ) {
8475     $dbh->do("ALTER TABLE biblioitems DROP INDEX isbn");
8476     $dbh->do("ALTER TABLE biblioitems DROP INDEX issn");
8477     $dbh->do("ALTER TABLE biblioitems DROP INDEX issn_idx");
8478     $dbh->do("ALTER TABLE biblioitems
8479               CHANGE isbn isbn MEDIUMTEXT NULL DEFAULT NULL,
8480               CHANGE issn issn MEDIUMTEXT NULL DEFAULT NULL
8481     ");
8482     $dbh->do("ALTER TABLE biblioitems
8483               ADD INDEX isbn ( isbn ( 255 ) ),
8484               ADD INDEX issn ( issn ( 255 ) )
8485     ");
8486
8487     $dbh->do("ALTER TABLE deletedbiblioitems DROP INDEX isbn");
8488     $dbh->do("ALTER TABLE deletedbiblioitems
8489               CHANGE isbn isbn MEDIUMTEXT NULL DEFAULT NULL,
8490               CHANGE issn issn MEDIUMTEXT NULL DEFAULT NULL
8491     ");
8492     $dbh->do("ALTER TABLE deletedbiblioitems
8493               ADD INDEX isbn ( isbn ( 255 ) )
8494     ");
8495
8496     print "Upgrade to $DBversion done (Bug 5377 - Biblioitems isbn and issn fields too small for multiple ISBN and ISSN)\n";
8497     SetVersion($DBversion);
8498 }
8499
8500 $DBversion = "3.15.00.050";
8501 if ( CheckVersion($DBversion) ) {
8502     $dbh->do("
8503         INSERT INTO systempreferences (
8504             variable,
8505             value,
8506             explanation,
8507             type
8508         ) VALUES (
8509             'AggressiveMatchOnISBN',
8510             '0',
8511             'If enabled, attempt to match aggressively by trying all variations of the ISBNs in the imported record as a phrase in the ISBN fields of already cataloged records when matching on ISBN with the record import tool',
8512             'YesNo'
8513         )
8514     ");
8515
8516     print "Upgrade to $DBversion done (Bug 10500 - Improve isbn matching when importing records)\n";
8517     SetVersion($DBversion);
8518 }
8519
8520 $DBversion = "3.15.00.051";
8521 if ( CheckVersion($DBversion) ) {
8522     print "Upgrade to $DBversion done (Koha 3.16 beta)\n";
8523     SetVersion($DBversion);
8524 }
8525
8526 $DBversion = "3.15.00.052";
8527 if ( CheckVersion($DBversion) ) {
8528     print "Upgrade to $DBversion done (Koha 3.16 RC)\n";
8529     SetVersion($DBversion);
8530 }
8531
8532 $DBversion = "3.16.00.000";
8533 if ( CheckVersion($DBversion) ) {
8534     print "Upgrade to $DBversion done (3.16.0 release)\n";
8535     SetVersion ($DBversion);
8536 }
8537
8538 $DBversion = '3.17.00.000';
8539 if ( CheckVersion($DBversion) ) {
8540     print "Upgrade to $DBversion done (there is no time to rest on our laurels)\n";
8541     SetVersion ($DBversion);
8542 }
8543
8544 $DBversion = '3.17.00.001';
8545 if ( CheckVersion($DBversion) ) {
8546    $dbh->do("UPDATE systempreferences SET variable = 'AuthoritySeparator' WHERE variable = 'authoritysep'");
8547    print "Upgrade to $DBversion done (Bug 10330 - Rename system preference authoritysep to AuthoritySeparator)\n";
8548    SetVersion ($DBversion);
8549 }
8550
8551 $DBversion = "3.17.00.002";
8552 if (CheckVersion($DBversion)) {
8553     $dbh->do("INSERT INTO systempreferences (variable,value,explanation,type) VALUES('AcqEnableFiles','0','If enabled, allows librarians to upload and attach arbitrary files to invoice records.','YesNo')");
8554     $dbh->do("
8555 CREATE TABLE IF NOT EXISTS `misc_files` (
8556   `file_id` int(11) NOT NULL AUTO_INCREMENT,
8557   `table_tag` varchar(255) NOT NULL,
8558   `record_id` int(11) NOT NULL,
8559   `file_name` varchar(255) NOT NULL,
8560   `file_type` varchar(255) NOT NULL,
8561   `file_description` varchar(255) DEFAULT NULL,
8562   `file_content` longblob NOT NULL, -- file content
8563   `date_uploaded` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
8564   PRIMARY KEY (`file_id`),
8565   KEY `table_tag` (`table_tag`),
8566   KEY `record_id` (`record_id`)
8567 ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
8568     ");
8569     print "Upgrade to $DBversion done (Bug 3050 - Add an option to upload scanned invoices)\n";
8570     SetVersion($DBversion);
8571 }
8572
8573 $DBversion = "3.17.00.003";
8574 if (CheckVersion($DBversion)) {
8575     $dbh->do("UPDATE systempreferences SET type = 'Choice', options = '0|1|force' WHERE variable = 'OPACItemHolds'");
8576     print "Upgrade to $DBversion done (Bug 7825 - Changed OPACItemHolds syspref to Choice)\n";
8577     SetVersion($DBversion);
8578 }
8579
8580 $DBversion = "3.17.00.004";
8581 if (CheckVersion($DBversion)) {
8582     $dbh->do("ALTER TABLE categories ADD default_privacy ENUM( 'default', 'never', 'forever' ) NOT NULL DEFAULT 'default' AFTER category_type");
8583     print "Upgrade to $DBversion done (Bug 6254 - can't set patron privacy by default)\n";
8584     SetVersion($DBversion);
8585 }
8586
8587 $DBversion = "3.17.00.005";
8588 if (CheckVersion($DBversion)) {
8589     $dbh->do(q|
8590         ALTER TABLE issuingrules
8591         ADD maxsuspensiondays INT(11) DEFAULT NULL AFTER finedays;
8592     |);
8593     print "Upgrade to $DBversion done (Bug 12230: Add new issuing rule maxsuspensiondays)\n";
8594     SetVersion($DBversion);
8595 }
8596
8597 $DBversion = "3.17.00.006";
8598 if ( CheckVersion($DBversion) ) {
8599     $dbh->do("INSERT INTO systempreferences (variable,value,options,explanation,type) VALUES ('OpacLocationBranchToDisplay',  'holding',  'holding|home|both',  'In the OPAC, under location show which branch for Location in the record details.',  'Choice')");
8600     $dbh->do("INSERT INTO systempreferences (variable,value,options,explanation,type) VALUES ('OpacLocationBranchToDisplayShelving',  'holding',  'holding|home|both',  'In the OPAC, display the shelving location under which which column',  'Choice')");
8601     print "Upgrade to $DBversion done (Bug 7720 - Ambiguity in OPAC Details location.)\n";
8602     SetVersion($DBversion);
8603 }
8604
8605 $DBversion = "3.17.00.007";
8606 if (CheckVersion($DBversion)) {
8607     $dbh->do("INSERT INTO systempreferences (variable,value,options,explanation,type) VALUES('UpdateNotForLoanStatusOnCheckin', '', 'NULL', 'This is a list of value pairs. When an item is checked in, if the not for loan value on the left matches the items not for loan value it will be updated to the right-hand value. E.g. ''-1: 0'' will cause an item that was set to ''Ordered'' to now be available for loan. Each pair of values should be on a separate line.', 'Free');");
8608     print "Upgrade to $DBversion done (Bug 11629 - Add ability to update not for loan status on checkin)\n";
8609     SetVersion($DBversion);
8610 }
8611
8612 $DBversion = "3.17.00.008";
8613 if ( CheckVersion($DBversion) ) {
8614     $dbh->do(q|
8615         INSERT IGNORE INTO systempreferences (variable,value,options,explanation,type) VALUES('OPACAcquisitionDetails','0', '','Show the acquisition details at the OPAC','YesNo')
8616     |);
8617     print "Upgrade to $DBversion done (Bug 11169 - Add OPACAcquisitionDetails syspref)\n";
8618     SetVersion($DBversion);
8619 }
8620
8621 $DBversion = "3.17.00.009";
8622 if ( CheckVersion($DBversion) ) {
8623     $dbh->do(q{
8624         DELETE FROM systempreferences WHERE variable = 'UseTablesortForCirc'
8625     });
8626
8627     print "Upgrade to $DBversion done (Bug 11703 - Remove UseTablesortForCirc syspref)\n";
8628     SetVersion($DBversion);
8629 }
8630
8631 $DBversion = "3.17.00.010";
8632 if ( CheckVersion($DBversion) ) {
8633     $dbh->do("DELETE FROM systempreferences WHERE variable='opacsmallimage'");
8634     print "Upgrade to $DBversion done (Bug 11347 - PROG/CCSR deprecation: Remove opacsmallimage system preference)\n";
8635     SetVersion($DBversion);
8636 }
8637
8638 $DBversion = "3.17.00.011";
8639 if ( CheckVersion($DBversion) ) {
8640     $dbh->do("INSERT INTO language_subtag_registry( subtag, type, description, added) VALUES ( 'hr', 'language', 'Croatian','2014-07-24' )");
8641     $dbh->do("INSERT INTO language_rfc4646_to_iso639(rfc4646_subtag,iso639_2_code) VALUES( 'hr','hrv')");
8642     $dbh->do("INSERT INTO language_descriptions(subtag, type, lang, description) VALUES( 'hr', 'language', 'hr', 'Hrvatski')");
8643     $dbh->do("INSERT INTO language_descriptions(subtag, type, lang, description) VALUES( 'hr', 'language', 'en', 'Croatian')");
8644     $dbh->do("INSERT INTO language_descriptions(subtag, type, lang, description) VALUES( 'hr', 'language', 'fr', 'Croate')");
8645     $dbh->do("INSERT INTO language_descriptions(subtag, type, lang, description) VALUES( 'hr', 'language', 'de', 'Kroatisch')");
8646     print "Upgrade to $DBversion done (Bug 12649: Add Croatian language)\n";
8647     SetVersion ($DBversion);
8648 }
8649
8650 $DBversion = "3.17.00.012";
8651 if ( CheckVersion($DBversion) ) {
8652     $dbh->do("DELETE FROM systempreferences WHERE variable='OpacShowFiltersPulldownMobile'");
8653     print "Upgrade to $DBversion done ( Bug 12512 - PROG/CCSR deprecation: Remove OpacShowFiltersPulldownMobile system preference )\n";
8654     SetVersion ($DBversion);
8655 }
8656
8657 $DBversion = "3.17.00.013";
8658 if ( CheckVersion($DBversion) ) {
8659     $dbh->do("INSERT IGNORE INTO systempreferences (variable,value,explanation,options,type) VALUES ('maxreserves',50,'System-wide maximum number of holds a patron can place','','Integer')");
8660     print "Upgrade to $DBversion done (Re-add system preference maxreserves)\n";
8661     SetVersion ($DBversion);
8662 }
8663
8664 $DBversion = '3.17.00.014';
8665 if ( CheckVersion($DBversion) ) {
8666     $dbh->do("
8667         INSERT INTO systempreferences (variable,value,explanation,type) VALUES
8668         ('OverdueNoticeCalendar',0,'Take calendar into consideration when working out sending overdue notices','YesNo')
8669     ");
8670     print "Upgrade to $DBversion done (Bug 12529 - Adding a syspref to allow the overdue notices to consider the calendar when generating notices)\n";
8671     SetVersion($DBversion);
8672 }
8673
8674 $DBversion = "3.17.00.015";
8675 if ( CheckVersion($DBversion) ) {
8676     $dbh->do(q{
8677         CREATE TABLE IF NOT EXISTS columns_settings (
8678             module varchar(255) NOT NULL,
8679             page varchar(255) NOT NULL,
8680             tablename varchar(255) NOT NULL,
8681             columnname varchar(255) NOT NULL,
8682             cannot_be_toggled int(1) NOT NULL DEFAULT 0,
8683             is_hidden int(1) NOT NULL DEFAULT 0,
8684             PRIMARY KEY(module, page, tablename, columnname)
8685         ) ENGINE=InnoDB DEFAULT CHARSET=utf8
8686     });
8687     print "Upgrade to $DBversion done (Bug 10212 - Create new table columns_settings)\n";
8688     SetVersion ($DBversion);
8689 }
8690
8691 $DBversion = "3.17.00.016";
8692 if ( CheckVersion($DBversion) ) {
8693     $dbh->do("CREATE TABLE aqcontacts (
8694         id int(11) NOT NULL auto_increment,
8695         name varchar(100) default NULL,
8696         position varchar(100) default NULL,
8697         phone varchar(100) default NULL,
8698         altphone varchar(100) default NULL,
8699         fax varchar(100) default NULL,
8700         email varchar(100) default NULL,
8701         notes mediumtext,
8702         claimacquisition BOOLEAN NOT NULL DEFAULT 0,
8703         claimissues BOOLEAN NOT NULL DEFAULT 0,
8704         acqprimary BOOLEAN NOT NULL DEFAULT 0,
8705         serialsprimary BOOLEAN NOT NULL DEFAULT 0,
8706         booksellerid int(11) not NULL,
8707         PRIMARY KEY  (id),
8708         CONSTRAINT booksellerid_aqcontacts_fk FOREIGN KEY (booksellerid)
8709             REFERENCES aqbooksellers (id) ON DELETE CASCADE ON UPDATE CASCADE
8710         ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;");
8711     $dbh->do("INSERT INTO aqcontacts (name, position, phone, altphone, fax,
8712             email, notes, booksellerid, claimacquisition, claimissues, acqprimary, serialsprimary)
8713         SELECT contact, contpos, contphone, contaltphone, contfax, contemail,
8714             contnotes, id, 1, 1, 1, 1 FROM aqbooksellers;");
8715     $dbh->do("ALTER TABLE aqbooksellers DROP COLUMN contact,
8716         DROP COLUMN contpos, DROP COLUMN contphone,
8717         DROP COLUMN contaltphone, DROP COLUMN contfax,
8718         DROP COLUMN contemail, DROP COLUMN contnotes;");
8719     $dbh->do("UPDATE letter SET content = replace(content, '<<aqbooksellers.contact>>', '<<aqcontacts.name>>')");
8720     $dbh->do("UPDATE letter SET content = replace(content, '<<aqbooksellers.contpos>>', '<<aqcontacts.position>>')");
8721     $dbh->do("UPDATE letter SET content = replace(content, '<<aqbooksellers.contphone>>', '<<aqcontacts.phone>>')");
8722     $dbh->do("UPDATE letter SET content = replace(content, '<<aqbooksellers.contaltphone>>', '<<aqcontacts.altphone>>')");
8723     $dbh->do("UPDATE letter SET content = replace(content, '<<aqbooksellers.contfax>>', '<<aqcontacts.contfax>>')");
8724     $dbh->do("UPDATE letter SET content = replace(content, '<<aqbooksellers.contemail>>', '<<aqcontacts.contemail>>')");
8725     $dbh->do("UPDATE letter SET content = replace(content, '<<aqbooksellers.contnotes>>', '<<aqcontacts.contnotes>>')");
8726     print "Upgrade to $DBversion done (Bug 10402: Move bookseller contacts to separate table)\n";
8727     SetVersion($DBversion);
8728 }
8729
8730 $DBversion = "3.17.00.017";
8731 if ( CheckVersion($DBversion) ) {
8732     # Correct invalid recordtypes (should be very exceptional)
8733     $dbh->do(q{
8734         UPDATE z3950servers set recordtype='biblio' WHERE recordtype NOT IN ('authority','biblio')
8735     });
8736     # Correct invalid server types (should also be very exceptional)
8737     $dbh->do(q{
8738         UPDATE z3950servers set type='zed' WHERE type <> 'zed'
8739     });
8740     # Adjust table
8741     $dbh->do(q{
8742         ALTER TABLE z3950servers
8743         DROP COLUMN icon,
8744         DROP COLUMN description,
8745         DROP COLUMN position,
8746         MODIFY COLUMN id int NOT NULL AUTO_INCREMENT FIRST,
8747         MODIFY COLUMN recordtype enum('authority','biblio') NOT NULL DEFAULT 'biblio',
8748         CHANGE COLUMN name servername mediumtext NOT NULL,
8749         CHANGE COLUMN type servertype enum('zed','sru') NOT NULL DEFAULT 'zed',
8750         ADD COLUMN sru_options varchar(255) default NULL,
8751         ADD COLUMN sru_fields mediumtext default NULL,
8752         ADD COLUMN add_xslt mediumtext default NULL
8753     });
8754     print "Upgrade to $DBversion done (Bug 6536: Z3950 improvements)\n";
8755     SetVersion ($DBversion);
8756 }
8757
8758 $DBversion = "3.17.00.018";
8759 if ( CheckVersion($DBversion) ) {
8760     $dbh->do("INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES ('HoldsInNoissuesCharge', '0', 'Hold charges block checkouts (added to noissuescharge).',NULL,'YesNo');");
8761     print "Upgrade to $DBversion done (Bug 12205: Add HoldsInNoissuesCharge systempreference)\n";
8762     SetVersion($DBversion);
8763 }
8764
8765 $DBversion = "3.17.00.019";
8766 if ( CheckVersion($DBversion) ) {
8767     $dbh->do("INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES('NotHighlightedWords','and|or|not',NULL,'List of words to NOT highlight when OpacHighlightedWords is enabled','free')"
8768     );
8769     print "Upgrade to $DBversion done (Bug 6149: Operator highlighted in search results)\n";
8770     SetVersion($DBversion);
8771 }
8772
8773 $DBversion = "3.17.00.020";
8774 if(C4::Context->preference("Version") < TransformToNum($DBversion) ) {
8775     $dbh->do("INSERT INTO systempreferences (variable,value,options,explanation,type) VALUES ('ExpireReservesOnHolidays', '1', NULL, 'If false, reserves at a library will not be canceled on days the library is not open.', 'YesNo')");
8776     print "Upgrade to $DBversion done (Bug 8735 - Expire holds waiting only on days the library is open)\n";
8777     SetVersion ($DBversion);
8778 }
8779
8780 $DBversion = "3.17.00.021";
8781 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
8782     my $pref = C4::Context->preference('HomeOrHoldingBranch');
8783     $dbh->do("INSERT INTO `systempreferences` (variable,value,options,explanation,type)
8784        VALUES ('StaffSearchResultsDisplayBranch', ?,'homebranch|holdingbranch','Controls the display of the home or holding branch for staff search results','choice')", undef, $pref);
8785     print "Upgrade to $DBversion done (Bug 12582 - Control of branch displayed in search results linked to HomeOrHoldingBranch)\n";
8786     SetVersion ($DBversion);
8787 }
8788
8789 $DBversion = '3.17.00.022';
8790 if ( CheckVersion($DBversion) ) {
8791     my @temp= $dbh->selectrow_array(qq|
8792         SELECT count(*)
8793         FROM marc_subfield_structure
8794         WHERE kohafield='permanent_location' OR kohafield='items.permanent_location'
8795     |);
8796     print "Upgrade to $DBversion done (Bug 7817: Check for permanent_location)\n";
8797     if( $temp[0] ) {
8798         print "WARNING for Koha administrator: Your database contains one or more mappings for permanent_location to the MARC structure. This item field however is for internal use and should not be linked to a MARC (sub)field. Please correct it. See also Bugzilla reports 7817 and 12818.\n";
8799     }
8800     SetVersion($DBversion);
8801 }
8802
8803 $DBversion = "3.17.00.023";
8804 if ( CheckVersion($DBversion) ) {
8805     $dbh->do(q{
8806         INSERT IGNORE INTO systempreferences (variable,value,options,explanation,type) VALUES('AcqItemSetSubfieldsWhenReceiptIsCancelled','', '','Upon cancelling a receipt, update the items subfields if they were created when placing an order (e.g. o=5|a="bar foo")', 'Free')
8807     });
8808     print "Upgrade to $DBversion done (Bug 11169 - Add AcqItemSetSubfieldsWhenReceiptIsCancelled syspref)\n";
8809     SetVersion($DBversion);
8810 }
8811
8812 $DBversion = "3.17.00.024";
8813 if(CheckVersion($DBversion)) {
8814     $dbh->do(q{
8815         ALTER TABLE issues ADD auto_renew BOOLEAN default FALSE AFTER renewals
8816     });
8817     $dbh->do(q{
8818         ALTER TABLE old_issues ADD auto_renew BOOLEAN default FALSE AFTER renewals
8819     });
8820     $dbh->do(q{
8821         ALTER TABLE issuingrules ADD auto_renew BOOLEAN default FALSE AFTER norenewalbefore
8822     });
8823     print "Upgrade to $DBversion done (Bug 11577: [ENH] Automatic renewal feature)\n";
8824     SetVersion($DBversion);
8825 }
8826
8827 $DBversion = '3.17.00.025';
8828 if ( CheckVersion($DBversion) ) {
8829     $dbh->do(qq{
8830         INSERT IGNORE INTO systempreferences (variable,value,explanation,options,type) VALUES('StatisticsFields','location|itype|ccode','Define fields (from the items table) used for statistics members',NULL,'Free')
8831     });
8832     print "Upgrade to $DBversion done (Bug 12728: Checked syspref StatisticsFields)\n";
8833 }
8834
8835 $DBversion = "3.17.00.026";
8836 if ( CheckVersion($DBversion) ) {
8837     if ( C4::Context->preference('marcflavour') eq 'MARC21' ) {
8838         $dbh->do("UPDATE marc_subfield_structure SET liblibrarian = 'Encoded bitrate', libopac = 'Encoded bitrate' WHERE tagfield = '347' AND tagsubfield = 'f'");
8839         $dbh->do("UPDATE marc_subfield_structure SET repeatable = 1 WHERE tagfield IN ('110','111','610','611','710','711','810','811') AND tagsubfield = 'c'");
8840         $dbh->do("UPDATE auth_subfield_structure SET repeatable = 1 WHERE tagfield IN ('110','111','410','411','510','511','710','711') AND tagsubfield = 'c'");
8841         print "Upgrade to $DBversion done (Bug 12435 - Update MARC21 frameworks to Update No. 18 (April 2014))\n";
8842     }
8843     SetVersion($DBversion);
8844 }
8845
8846 $DBversion = "3.17.00.027";
8847 if ( CheckVersion($DBversion) ) {
8848     $dbh->do(q{
8849         DELETE FROM systempreferences WHERE variable = 'SearchEngine'
8850     });
8851     print "Upgrade to $DBversion done (Bug 12538 - Remove SearchEngine syspref)\n";
8852     SetVersion($DBversion);
8853 }
8854
8855 $DBversion = "3.17.00.028";
8856 if ( CheckVersion($DBversion) ) {
8857     $dbh->do(q{
8858         INSERT INTO systempreferences (variable,value) VALUES('OpacCustomSearch','');
8859     });
8860     print "Upgrade to $DBversion done (Bug 12296 - search box replaceable with a system preference)\n";
8861     SetVersion($DBversion);
8862 }
8863
8864 $DBversion = "3.17.00.029";
8865 if ( CheckVersion($DBversion) ) {
8866     $dbh->do("ALTER TABLE  `items` CHANGE  `cn_sort`  `cn_sort` VARCHAR( 255 ) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL");
8867     $dbh->do("ALTER TABLE  `deleteditems` CHANGE  `cn_sort`  `cn_sort` VARCHAR( 255 ) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL");
8868     $dbh->do("ALTER TABLE  `biblioitems` CHANGE  `cn_sort`  `cn_sort` VARCHAR( 255 ) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL");
8869     $dbh->do("ALTER TABLE  `deletedbiblioitems` CHANGE  `cn_sort`  `cn_sort` VARCHAR( 255 ) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL");
8870     print "Upgrade to $DBversion done (Bug 12424 - ddc sorting of call numbers truncates long Cutter parts)\n";
8871     SetVersion ($DBversion);
8872 }
8873
8874 $DBversion = "3.17.00.030";
8875 if ( CheckVersion($DBversion) ) {
8876     $dbh->do(
8877         q{
8878        INSERT INTO systempreferences (variable, value, options, explanation, type )
8879        VALUES
8880         ('UsageStatsCountry', '', NULL, 'The country where your library is located, to be shown on the Hea Koha community website', 'Choice'),
8881         ('UsageStatsID', '', NULL, 'This preference is part of Koha but it should not be deleted or updated manually.',  'Free'),
8882         ('UsageStatsLastUpdateTime', '', NULL, 'This preference is part of Koha but it should not be deleted or updated manually.', 'Free'),
8883         ('UsageStatsLibraryName', '', NULL, 'The library name to be shown on Hea Koha community website', 'Free'),
8884         ('UsageStatsLibraryType', 'public', 'public|university', 'The library type to be shown on the Hea Koha community website', 'Choice'),
8885         ('UsageStatsLibraryUrl', '', NULL, 'The library URL to be shown on Hea Koha community website', 'Free'),
8886         ('UsageStats', 0, NULL, 'Share anonymous usage data on the Hea Koha community website.', 'YesNo')
8887     });
8888     print "Upgrade to $DBversion done (Bug 11926: Add UsageStats systempreferences (HEA))\n";
8889     SetVersion ($DBversion);
8890 }
8891
8892 $DBversion = "3.17.00.031";
8893 if ( CheckVersion($DBversion) ) {
8894    $dbh->do("ALTER TABLE saved_sql CHANGE report_name report_name VARCHAR( 255 ) NOT NULL DEFAULT '' ");
8895    print "Upgrade to $DBversion done (Bug 2969: Report Name should be mandatory for saved reports)\n";
8896    SetVersion ($DBversion);
8897 }
8898
8899 $DBversion = "3.17.00.032";
8900 if ( CheckVersion($DBversion) ) {
8901     $dbh->do(
8902 "INSERT INTO systempreferences (variable,value,options,explanation,type) VALUES ('ReplytoDefault',  '',  NULL,  'The default email address to be set as replyto.',  'Free')"
8903     );
8904     $dbh->do(
8905 "INSERT INTO systempreferences (variable,value,options,explanation,type) VALUES ('ReturnpathDefault',  '',  NULL,  'The default email address to be set as return-path',  'Free')"
8906     );
8907     $dbh->do("ALTER TABLE branches ADD branchreplyto mediumtext AFTER branchemail");
8908     $dbh->do("ALTER TABLE branches ADD branchreturnpath mediumtext AFTER branchreplyto");
8909     print "Upgrade to $DBversion done (Bug 9530: Adding replyto and returnpath addresses.)\n";
8910     SetVersion($DBversion);
8911 }
8912
8913 $DBversion = "3.17.00.033";
8914 if ( CheckVersion($DBversion) ) {
8915     $dbh->do(q{
8916         INSERT IGNORE INTO systempreferences (variable, value, explanation, options, type)
8917         VALUES('FacetMaxCount', '20','Specify the max facet count for each category',NULL,'Integer')
8918     });
8919     print "Upgrade to $DBversion done (Bug 13088 - Allow the user to specify a max amount of facets to show)\n";
8920     SetVersion($DBversion);
8921 }
8922
8923 $DBversion = "3.17.00.034";
8924 if ( CheckVersion($DBversion) ) {
8925     $dbh->do(q|
8926         ALTER TABLE aqorders DROP COLUMN cancelledby;
8927     |);
8928
8929     print "Upgrade to $DBversion done (Bug 11007 - DROP column aqorders.cancelledby)\n";
8930     SetVersion($DBversion);
8931 }
8932
8933 $DBversion = "3.17.00.035";
8934 if ( CheckVersion($DBversion) ) {
8935     $dbh->do(q|
8936         ALTER TABLE serial ADD COLUMN claims_count INT(11) DEFAULT 0 after claimdate
8937     |);
8938     $dbh->do(q|
8939         UPDATE serial
8940         SET claims_count = 1
8941         WHERE claimdate IS NOT NULL
8942     |);
8943     print "Upgrade to $DBversion done (Bug 5342: Add claims_count field in serial table)\n";
8944     SetVersion($DBversion);
8945 }
8946
8947 $DBversion = "3.17.00.036";
8948 if ( CheckVersion($DBversion) ) {
8949     $dbh->do("DELETE FROM systempreferences WHERE variable='OpacShowLibrariesPulldownMobile'");
8950     print "Upgrade to $DBversion done ( Bug 12513 - PROG/CCSR deprecation: Remove OpacShowLibrariesPulldownMobile system preference )\n";
8951     SetVersion ($DBversion);
8952 }
8953
8954 $DBversion = "3.17.00.037";
8955 if ( CheckVersion($DBversion) ) {
8956     $dbh->do("DELETE FROM systempreferences WHERE variable='OpacMainUserBlockMobile'");
8957     print "Upgrade to $DBversion done ( Bug 12246 - PROG/CCSR deprecation: Remove OpacMainUserBlockMobile system preference )\n";
8958     SetVersion ($DBversion);
8959 }
8960
8961 $DBversion = "3.17.00.038";
8962 if ( CheckVersion($DBversion) ) {
8963     $dbh->do("DELETE FROM systempreferences WHERE variable='OPACMobileUserCSS'");
8964     print "Upgrade to $DBversion done ( Bug 12245 - PROG/CCSR deprecation: Remove OPACMobileUserCSS system preference )\n";
8965     SetVersion ($DBversion);
8966 }
8967
8968 $DBversion = "3.17.00.039";
8969 if ( CheckVersion($DBversion) ) {
8970     $dbh->do("INSERT IGNORE INTO systempreferences (variable, value, options, explanation, type) VALUES
8971     ('OPACFallback', 'prog', 'bootstrap|prog', 'Define the fallback theme for the OPAC interface.', 'Themes')");
8972     print "Upgrade to $DBversion done (Bug 12539 - PROG/CCSR deprecation: Remove hardcoded theme from C4/Templates.pm)\n";
8973     SetVersion ($DBversion);
8974 }
8975
8976 $DBversion = "3.17.00.040";
8977 if ( CheckVersion($DBversion) ) {
8978     my $opac_theme = C4::Context->preference( 'opacthemes' );
8979     if ( !defined $opac_theme || $opac_theme eq 'prog' || $opac_theme eq 'ccsr' ) {
8980         $dbh->do("UPDATE systempreferences SET value='bootstrap' WHERE variable='opacthemes'");
8981     }
8982     print "Upgrade to $DBversion done (Bug 12223: 'prog' and 'ccsr' themes removed)\n";
8983     SetVersion($DBversion);
8984 }
8985
8986 $DBversion = "3.17.00.041";
8987 if ( CheckVersion($DBversion) ) {
8988     print "Upgrade to $DBversion done (Bug 11346: Deprecate the 'prog' and 'CCSR' themes)\n";
8989     SetVersion($DBversion);
8990 }
8991
8992 $DBversion = "3.17.00.042";
8993 if ( CheckVersion($DBversion) ) {
8994     $dbh->do("DELETE FROM systempreferences WHERE variable='yuipath'");
8995     print "Upgrade to $DBversion done (Bug 12494: Remove yuipath system preference)\n";
8996     SetVersion ($DBversion);
8997 }
8998
8999 $DBversion = "3.17.00.043";
9000 if ( CheckVersion($DBversion) ) {
9001     $dbh->do("
9002         ALTER TABLE aqorders
9003         ADD COLUMN cancellationreason TEXT DEFAULT NULL AFTER datecancellationprinted
9004     ");
9005     print "Upgrade to $DBversion done (Bug 7162: Add aqorders.cancellationreason)\n";
9006     SetVersion ($DBversion);
9007 }
9008
9009 $DBversion = "3.17.00.044";
9010 if ( CheckVersion($DBversion) ) {
9011     $dbh->do(q{
9012         INSERT IGNORE INTO systempreferences
9013             (variable,value,explanation,options,type)
9014             VALUES('OnSiteCheckouts','0','Enable/Disable the on-site checkouts feature','','YesNo');
9015     });
9016     $dbh->do(q{
9017         INSERT IGNORE INTO systempreferences
9018             (variable,value,explanation,options,type)
9019             VALUES('OnSiteCheckoutsForce','0','Enable/Disable the on-site for all cases (Even if a user is debarred, etc.)','','YesNo');
9020     });
9021     $dbh->do(q{
9022         ALTER TABLE issues ADD COLUMN onsite_checkout INT(1) NOT NULL DEFAULT 0 AFTER issuedate;
9023     });
9024     $dbh->do(q{
9025         ALTER TABLE old_issues ADD COLUMN onsite_checkout INT(1) NOT NULL DEFAULT 0 AFTER issuedate;
9026     });
9027     print "Upgrade to $DBversion done (Bug 10860: Add new system preference OnSiteCheckouts + fields [old_]issues.onsite_checkout)\n";
9028     SetVersion($DBversion);
9029 }
9030
9031 $DBversion = "3.17.00.045";
9032 if ( CheckVersion($DBversion) ) {
9033     $dbh->do(q{
9034         INSERT INTO systempreferences ( variable, value, options, explanation, type ) VALUES
9035         ('LocalHoldsPriority',  '0', NULL,  'Enables the LocalHoldsPriority feature',  'YesNo'),
9036         ('LocalHoldsPriorityItemControl',  'holdingbranch',  'holdingbranch|homebranch',  'decides if the feature operates using the item''s home or holding library.',  'Choice'),
9037         ('LocalHoldsPriorityPatronControl',  'PickupLibrary',  'HomeLibrary|PickupLibrary',  'decides if the feature operates using the library set as the patron''s home library, or the library set as the pickup library for the given hold.',  'Choice')
9038     });
9039     print "Upgrade to $DBversion done (Bug 11126 - Make the holds system optionally give precedence to local holds)\n";
9040     SetVersion($DBversion);
9041 }
9042
9043 $DBversion = "3.17.00.046";
9044 if ( CheckVersion($DBversion) ) {
9045     $dbh->do(q{
9046         CREATE TABLE IF NOT EXISTS items_search_fields (
9047           name VARCHAR(255) NOT NULL,
9048           label VARCHAR(255) NOT NULL,
9049           tagfield CHAR(3) NOT NULL,
9050           tagsubfield CHAR(1) NULL DEFAULT NULL,
9051           authorised_values_category VARCHAR(16) NULL DEFAULT NULL,
9052           PRIMARY KEY(name),
9053           CONSTRAINT items_search_fields_authorised_values_category
9054             FOREIGN KEY (authorised_values_category) REFERENCES authorised_values (category)
9055             ON DELETE SET NULL ON UPDATE CASCADE
9056         ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
9057     });
9058     print "Upgrade to $DBversion done (Bug 11425: Add items_search_fields table)\n";
9059     SetVersion($DBversion);
9060 }
9061
9062 $DBversion = "3.17.00.047";
9063 if ( CheckVersion($DBversion) ) {
9064     $dbh->do(q{
9065         ALTER TABLE collections
9066             CHANGE colBranchcode colBranchcode VARCHAR( 10 ) NULL DEFAULT NULL,
9067             ADD INDEX ( colBranchcode ),
9068             ADD CONSTRAINT collections_ibfk_1 FOREIGN KEY (colBranchcode) REFERENCES branches (branchcode) ON DELETE CASCADE ON UPDATE CASCADE
9069     });
9070     print "Upgrade to $DBversion done (Bug 8836 - Resurrect Rotating Collections)\n";
9071     SetVersion($DBversion);
9072 }
9073
9074 $DBversion = "3.17.00.048";
9075 if ( CheckVersion($DBversion) ) {
9076     $dbh->do(q|
9077         INSERT INTO systempreferences (variable,value,options,explanation,type) VALUES('RentalFeesCheckoutConfirmation', '0', NULL , 'Allow user to confirm when checking out an item with rental fees.', 'YesNo')
9078     |);
9079     print "Upgrade to $DBversion done (Bug 12448 - Add RentalFeesCheckoutConfirmation syspref)\n";
9080     SetVersion($DBversion);
9081 }
9082
9083 $DBversion = "3.17.00.049";
9084 if ( CheckVersion($DBversion) ) {
9085     $dbh->do("INSERT IGNORE INTO language_subtag_registry( subtag, type, description, added) VALUES ( 'am', 'language', 'Amharic','2014-10-29')");
9086     $dbh->do("INSERT IGNORE INTO language_rfc4646_to_iso639(rfc4646_subtag,iso639_2_code) VALUES ( 'am','amh')");
9087     $dbh->do("INSERT IGNORE INTO language_descriptions(subtag, type, lang, description) VALUES ( 'am', 'language', 'am', 'አማርኛ')");
9088     $dbh->do("INSERT IGNORE INTO language_descriptions(subtag, type, lang, description) VALUES ( 'am', 'language', 'en', 'Amharic')");
9089
9090     $dbh->do("UPDATE language_descriptions SET description = 'لعربية' WHERE subtag = 'ar' AND type = 'language' AND lang = 'ar'");
9091
9092     $dbh->do("INSERT IGNORE INTO language_subtag_registry( subtag, type, description, added) VALUES ( 'az', 'language', 'Azerbaijani','2014-10-30')");
9093     $dbh->do("INSERT IGNORE INTO language_rfc4646_to_iso639(rfc4646_subtag,iso639_2_code) VALUES ( 'az','aze')");
9094     $dbh->do("INSERT IGNORE INTO language_descriptions(subtag, type, lang, description) VALUES ( 'az', 'language', 'az', 'Azərbaycan dili')");
9095     $dbh->do("INSERT IGNORE INTO language_descriptions(subtag, type, lang, description) VALUES ( 'az', 'language', 'en', 'Azerbaijani')");
9096
9097     $dbh->do("INSERT IGNORE INTO language_subtag_registry( subtag, type, description, added) VALUES ( 'be', 'language', 'Byelorussian','2014-10-30')");
9098     $dbh->do("INSERT IGNORE INTO language_rfc4646_to_iso639(rfc4646_subtag,iso639_2_code) VALUES ( 'be','bel')");
9099     $dbh->do("INSERT IGNORE INTO language_descriptions(subtag, type, lang, description) VALUES ( 'be', 'language', 'be', 'Беларуская мова')");
9100     $dbh->do("INSERT IGNORE INTO language_descriptions(subtag, type, lang, description) VALUES ( 'be', 'language', 'en', 'Byelorussian')");
9101
9102     $dbh->do("INSERT IGNORE INTO language_subtag_registry( subtag, type, description, added) VALUES ( 'bn', 'language', 'Bengali','2014-10-30')");
9103     $dbh->do("INSERT IGNORE INTO language_rfc4646_to_iso639(rfc4646_subtag,iso639_2_code) VALUES ( 'bn','ben')");
9104     $dbh->do("INSERT IGNORE INTO language_descriptions(subtag, type, lang, description) VALUES ( 'bn', 'language', 'bn', 'বাংলা')");
9105     $dbh->do("INSERT IGNORE INTO language_descriptions(subtag, type, lang, description) VALUES ( 'bn', 'language', 'en', 'Bengali')");
9106
9107     $dbh->do("UPDATE language_descriptions SET description = 'Български' WHERE subtag = 'bg' AND type = 'language' AND lang = 'bg'");
9108     $dbh->do("UPDATE language_descriptions SET description = 'Ceština' WHERE subtag = 'cs' AND type = 'language' AND lang = 'cs'");
9109     $dbh->do("UPDATE language_descriptions SET description = 'Ελληνικά' WHERE subtag = 'el' AND type = 'language' AND lang = 'el'");
9110     $dbh->do("UPDATE language_descriptions SET description = 'Español' WHERE subtag = 'es' AND type = 'language' AND lang = 'es'");
9111
9112     $dbh->do("INSERT IGNORE INTO language_subtag_registry( subtag, type, description, added) VALUES ( 'eu', 'language', 'Basque','2014-10-30')");
9113     $dbh->do("INSERT IGNORE INTO language_rfc4646_to_iso639(rfc4646_subtag,iso639_2_code) VALUES ( 'eu','eus')");
9114     $dbh->do("INSERT IGNORE INTO language_descriptions(subtag, type, lang, description) VALUES ( 'eu', 'language', 'eu', 'Euskera')");
9115     $dbh->do("INSERT IGNORE INTO language_descriptions(subtag, type, lang, description) VALUES ( 'eu', 'language', 'en', 'Basque')");
9116
9117     $dbh->do("UPDATE language_descriptions SET description = 'فارسى' WHERE subtag = 'fa' AND type = 'language' AND lang = 'fa'");
9118     $dbh->do("UPDATE language_descriptions SET description = 'Suomi' WHERE subtag = 'fi' AND type = 'language' AND lang = 'fi'");
9119
9120     $dbh->do("INSERT IGNORE INTO language_subtag_registry( subtag, type, description, added) VALUES ( 'fo', 'language', 'Faroese','2014-10-30')");
9121     $dbh->do("INSERT IGNORE INTO language_rfc4646_to_iso639(rfc4646_subtag,iso639_2_code) VALUES ( 'fo','fao')");
9122     $dbh->do("INSERT IGNORE INTO language_descriptions(subtag, type, lang, description) VALUES ( 'fo', 'language', 'fo', 'Føroyskt')");
9123     $dbh->do("INSERT IGNORE INTO language_descriptions(subtag, type, lang, description) VALUES ( 'fo', 'language', 'en', 'Faroese')");
9124
9125     $dbh->do("UPDATE language_descriptions SET description = 'Français' WHERE subtag = 'fr' AND type = 'language' AND lang = 'fr'");
9126     $dbh->do("UPDATE language_descriptions SET description = 'עִבְרִית' WHERE subtag = 'he' AND type = 'language' AND lang = 'he'");
9127     $dbh->do("UPDATE language_descriptions SET description = 'हिन्दी' WHERE subtag = 'hi' AND type = 'language' AND lang = 'hi'");
9128
9129     $dbh->do("INSERT IGNORE INTO language_subtag_registry( subtag, type, description, added) VALUES ( 'is', 'language', 'Icelandic','2014-10-30')");
9130     $dbh->do("INSERT IGNORE INTO language_rfc4646_to_iso639(rfc4646_subtag,iso639_2_code) VALUES ( 'is','ice')");
9131     $dbh->do("INSERT IGNORE INTO language_descriptions(subtag, type, lang, description) VALUES ( 'is', 'language', 'is', 'Íslenska')");
9132     $dbh->do("INSERT IGNORE INTO language_descriptions(subtag, type, lang, description) VALUES ( 'is', 'language', 'en', 'Icelandic')");
9133
9134     $dbh->do("UPDATE language_descriptions SET description = '日本語' WHERE subtag = 'ja' AND type = 'language' AND lang = 'ja'");
9135
9136     $dbh->do("INSERT IGNORE INTO language_subtag_registry( subtag, type, description, added) VALUES ( 'ka', 'language', 'Kannada','2014-10-30')");
9137     $dbh->do("INSERT IGNORE INTO language_rfc4646_to_iso639(rfc4646_subtag,iso639_2_code) VALUES ( 'ka','kan')");
9138     $dbh->do("INSERT IGNORE INTO language_descriptions(subtag, type, lang, description) VALUES ( 'ka', 'language', 'ka', 'ಕನ್ನಡ')");
9139     $dbh->do("INSERT IGNORE INTO language_descriptions(subtag, type, lang, description) VALUES ( 'ka', 'language', 'en', 'Kannada')");
9140
9141     $dbh->do("INSERT IGNORE INTO language_subtag_registry( subtag, type, description, added) VALUES ( 'km', 'language', 'Khmer','2014-10-30')");
9142     $dbh->do("INSERT IGNORE INTO language_rfc4646_to_iso639(rfc4646_subtag,iso639_2_code) VALUES( 'km','khm')");
9143     $dbh->do("INSERT IGNORE INTO language_descriptions(subtag, type, lang, description) VALUES ( 'km', 'language', 'km', 'ភាសាខ្មែរ')");
9144     $dbh->do("INSERT IGNORE INTO language_descriptions(subtag, type, lang, description) VALUES( 'km', 'language', 'en', 'Khmer')");
9145
9146     $dbh->do("UPDATE language_descriptions SET description = '한국어' WHERE subtag = 'ko' AND type = 'language' AND lang = 'ko'");
9147
9148     $dbh->do("INSERT IGNORE INTO language_subtag_registry( subtag, type, description, added) VALUES ( 'ku', 'language', 'Kurdish','2014-05-13')");
9149     $dbh->do("INSERT IGNORE INTO language_rfc4646_to_iso639(rfc4646_subtag,iso639_2_code) VALUES ( 'ku','kur')");
9150     $dbh->do("INSERT IGNORE INTO language_descriptions(subtag, type, lang, description) VALUES ( 'ku', 'language', 'ku', 'کوردی')");
9151     $dbh->do("INSERT IGNORE INTO language_descriptions(subtag, type, lang, description) VALUES ( 'ku', 'language', 'en', 'Kurdish')");
9152     $dbh->do("INSERT IGNORE INTO language_descriptions(subtag, type, lang, description) VALUES ( 'ku', 'language', 'fr', 'Kurde')");
9153     $dbh->do("INSERT IGNORE INTO language_descriptions(subtag, type, lang, description) VALUES ( 'ku', 'language', 'de', 'Kurdisch')");
9154     $dbh->do("INSERT IGNORE INTO language_descriptions(subtag, type, lang, description) VALUES ( 'ku', 'language', 'es', 'Kurdo')");
9155
9156     $dbh->do("UPDATE language_descriptions SET description = 'ພາສາລາວ' WHERE subtag = 'lo' AND type = 'language' AND lang = 'lo'");
9157
9158     $dbh->do("INSERT IGNORE INTO language_subtag_registry( subtag, type, description, added) VALUES ( 'mi', 'language', 'Maori','2014-10-30')");
9159     $dbh->do("INSERT IGNORE INTO language_rfc4646_to_iso639(rfc4646_subtag,iso639_2_code) VALUES ( 'mi','mri')");
9160     $dbh->do("INSERT IGNORE INTO language_descriptions(subtag, type, lang, description) VALUES ( 'mi', 'language', 'mi', 'Te Reo Māori')");
9161     $dbh->do("INSERT IGNORE INTO language_descriptions(subtag, type, lang, description) VALUES ( 'mi', 'language', 'en', 'Maori')");
9162
9163     $dbh->do("INSERT IGNORE INTO language_subtag_registry( subtag, type, description, added) VALUES ( 'mn', 'language', 'Mongolian','2014-10-30')");
9164     $dbh->do("INSERT IGNORE INTO language_rfc4646_to_iso639(rfc4646_subtag,iso639_2_code) VALUES ( 'mn','mon')");
9165     $dbh->do("INSERT IGNORE INTO language_descriptions(subtag, type, lang, description) VALUES ( 'mn', 'language', 'mn', 'Mонгол')");
9166     $dbh->do("INSERT IGNORE INTO language_descriptions(subtag, type, lang, description) VALUES ( 'mn', 'language', 'en', 'Mongolian')");
9167
9168     $dbh->do("INSERT IGNORE INTO language_subtag_registry( subtag, type, description, added) VALUES ( 'mr', 'language', 'Marathi','2014-10-30')");
9169     $dbh->do("INSERT IGNORE INTO language_rfc4646_to_iso639(rfc4646_subtag,iso639_2_code) VALUES ( 'mr','mar')");
9170     $dbh->do("INSERT IGNORE INTO language_descriptions(subtag, type, lang, description) VALUES ( 'mr', 'language', 'mr', 'मराठी')");
9171     $dbh->do("INSERT IGNORE INTO language_descriptions(subtag, type, lang, description) VALUES ( 'mr', 'language', 'en', 'Marathi')");
9172
9173     $dbh->do("INSERT IGNORE INTO language_subtag_registry( subtag, type, description, added) VALUES ( 'ms', 'language', 'Malay','2014-10-30')");
9174     $dbh->do("INSERT IGNORE INTO language_rfc4646_to_iso639(rfc4646_subtag,iso639_2_code) VALUES ( 'ms','may')");
9175     $dbh->do("INSERT IGNORE INTO language_descriptions(subtag, type, lang, description) VALUES ( 'ms', 'language', 'ms', 'Bahasa melayu')");
9176     $dbh->do("INSERT IGNORE INTO language_descriptions(subtag, type, lang, description) VALUES ( 'ms', 'language', 'en', 'Malay')");
9177
9178     $dbh->do("UPDATE language_descriptions SET description = 'Norsk bokmål' WHERE subtag = 'nb' AND type = 'language' AND lang = 'nb'");
9179     $dbh->do("UPDATE language_descriptions SET description = 'Norwegian bokmål' WHERE subtag = 'nb' AND type = 'language' AND lang = 'en'");
9180     $dbh->do("UPDATE language_descriptions SET description = 'Norvégien bokmål' WHERE subtag = 'nb' AND type = 'language' AND lang = 'fr'");
9181     $dbh->do("UPDATE language_descriptions SET description = 'Norwegisch bokmål' WHERE subtag = 'nb' AND type = 'language' AND lang = 'de'");
9182
9183     $dbh->do("INSERT IGNORE INTO language_subtag_registry( subtag, type, description, added) VALUES ( 'ne', 'language', 'Nepali','2014-10-30')");
9184     $dbh->do("INSERT IGNORE INTO language_rfc4646_to_iso639(rfc4646_subtag,iso639_2_code) VALUES ( 'ne','nep')");
9185     $dbh->do("INSERT IGNORE INTO language_descriptions(subtag, type, lang, description)VALUES ( 'ne', 'language', 'ne', 'नेपाली')");
9186     $dbh->do("INSERT IGNORE INTO language_descriptions(subtag, type, lang, description) VALUES ( 'ne', 'language', 'en', 'Nepali')");
9187
9188     $dbh->do("INSERT IGNORE INTO language_subtag_registry( subtag, type, description, added) VALUES ( 'pbr', 'language', 'Pangwa','2014-10-30')");
9189     $dbh->do("INSERT IGNORE INTO language_rfc4646_to_iso639(rfc4646_subtag,iso639_2_code) VALUES ( 'pbr','pbr')");
9190     $dbh->do("INSERT IGNORE INTO language_descriptions(subtag, type, lang, description) VALUES ( 'pbr', 'language', 'pbr', 'Ekipangwa')");
9191     $dbh->do("INSERT IGNORE INTO language_descriptions(subtag, type, lang, description) VALUES ( 'pbr', 'language', 'en', 'Pangwa')");
9192
9193     $dbh->do("INSERT IGNORE INTO language_subtag_registry( subtag, type, description, added) VALUES ( 'prs', 'language', 'Dari','2014-10-30')");
9194     $dbh->do("INSERT IGNORE INTO language_rfc4646_to_iso639(rfc4646_subtag,iso639_2_code) VALUES ( 'prs','prs')");
9195     $dbh->do("INSERT IGNORE INTO language_descriptions(subtag, type, lang, description) VALUES ( 'prs', 'language', 'prs', 'درى')");
9196     $dbh->do("INSERT IGNORE INTO language_descriptions(subtag, type, lang, description) VALUES ( 'prs', 'language', 'en', 'Dari')");
9197
9198     $dbh->do("UPDATE language_descriptions SET description = 'Português' WHERE subtag = 'pt' AND type = 'language' AND lang = 'pt'");
9199     $dbh->do("UPDATE language_descriptions SET description = 'Român' WHERE subtag = 'ro' AND type = 'language' AND lang = 'ro'");
9200     $dbh->do("UPDATE language_descriptions SET description = 'Русский' WHERE subtag = 'ru' AND type = 'language' AND lang = 'ru'");
9201
9202     $dbh->do("INSERT IGNORE INTO language_subtag_registry( subtag, type, description, added) VALUES ( 'rw', 'language', 'Kinyarwanda','2014-10-30')");
9203     $dbh->do("INSERT IGNORE INTO language_rfc4646_to_iso639(rfc4646_subtag,iso639_2_code) VALUES ( 'rw','kin')");
9204     $dbh->do("INSERT IGNORE INTO language_descriptions(subtag, type, lang, description) VALUES ( 'rw', 'language', 'rw', 'Ikinyarwanda')");
9205     $dbh->do("INSERT IGNORE INTO language_descriptions(subtag, type, lang, description) VALUES ( 'rw', 'language', 'en', 'Kinyarwanda')");
9206
9207     $dbh->do("INSERT IGNORE INTO language_subtag_registry( subtag, type, description, added) VALUES ( 'sd', 'language', 'Sindhi','2014-10-30')");
9208     $dbh->do("INSERT IGNORE INTO language_rfc4646_to_iso639(rfc4646_subtag,iso639_2_code) VALUES ( 'sd','snd')");
9209     $dbh->do("INSERT IGNORE INTO language_descriptions(subtag, type, lang, description) VALUES ( 'sd', 'language', 'sd', 'سنڌي')");
9210     $dbh->do("INSERT IGNORE INTO language_descriptions(subtag, type, lang, description) VALUES ( 'sd', 'language', 'en', 'Sindhi')");
9211
9212     $dbh->do("INSERT IGNORE INTO language_subtag_registry( subtag, type, description, added) VALUES ( 'sk', 'language', 'Slovak','2014-10-30')");
9213     $dbh->do("INSERT IGNORE INTO language_rfc4646_to_iso639(rfc4646_subtag,iso639_2_code) VALUES ( 'sk','slk')");
9214     $dbh->do("INSERT IGNORE INTO language_descriptions(subtag, type, lang, description) VALUES ( 'sk', 'language', 'sk', 'Slovenčina')");
9215     $dbh->do("INSERT IGNORE INTO language_descriptions(subtag, type, lang, description) VALUES ( 'sk', 'language', 'en', 'Slovak')");
9216
9217     $dbh->do("INSERT IGNORE INTO language_subtag_registry( subtag, type, description, added) VALUES ( 'sl', 'language', 'Slovene','2014-10-30')");
9218     $dbh->do("INSERT IGNORE INTO language_rfc4646_to_iso639(rfc4646_subtag,iso639_2_code) VALUES ( 'sl','slv')");
9219     $dbh->do("INSERT IGNORE INTO language_descriptions(subtag, type, lang, description) VALUES ( 'sl', 'language', 'sl', 'Slovenščina')");
9220     $dbh->do("INSERT IGNORE INTO language_descriptions(subtag, type, lang, description) VALUES ( 'sl', 'language', 'en', 'Slovene')");
9221
9222     $dbh->do("INSERT IGNORE INTO language_subtag_registry( subtag, type, description, added) VALUES ( 'sq', 'language', 'Albanian','2014-10-30')");
9223     $dbh->do("INSERT IGNORE INTO language_rfc4646_to_iso639(rfc4646_subtag,iso639_2_code) VALUES ( 'sq','sqi')");
9224     $dbh->do("INSERT IGNORE INTO language_descriptions(subtag, type, lang, description) VALUES ( 'sq', 'language', 'sq', 'Shqip')");
9225     $dbh->do("INSERT IGNORE INTO language_descriptions(subtag, type, lang, description) VALUES ( 'sq', 'language', 'en', 'Albanian')");
9226
9227     $dbh->do("UPDATE language_descriptions SET description = 'Cрпски' WHERE subtag = 'sr' AND type = 'language' AND lang = 'sr'");
9228
9229     $dbh->do("INSERT IGNORE INTO language_subtag_registry( subtag, type, description, added) VALUES ( 'sw', 'language', 'Swahili','2014-10-30')");
9230     $dbh->do("INSERT IGNORE INTO language_rfc4646_to_iso639(rfc4646_subtag,iso639_2_code) VALUES ( 'sw','swa')");
9231     $dbh->do("INSERT IGNORE INTO language_descriptions(subtag, type, lang, description) VALUES ( 'sw', 'language', 'sw', 'Kiswahili')");
9232     $dbh->do("INSERT IGNORE INTO language_descriptions(subtag, type, lang, description) VALUES ( 'sw', 'language', 'en', 'Swahili')");
9233
9234     $dbh->do("INSERT IGNORE INTO language_subtag_registry( subtag, type, description, added) VALUES ( 'ta', 'language', 'Tamil','2014-10-30')");
9235     $dbh->do("INSERT IGNORE INTO language_rfc4646_to_iso639(rfc4646_subtag,iso639_2_code) VALUES ( 'ta','tam')");
9236     $dbh->do("INSERT IGNORE INTO language_descriptions(subtag, type, lang, description) VALUES ( 'ta', 'language', 'ta', 'தமிழ்')");
9237     $dbh->do("INSERT IGNORE INTO language_descriptions(subtag, type, lang, description) VALUES ( 'ta', 'language', 'en', 'Tamil')");
9238
9239     $dbh->do("UPDATE language_descriptions SET description = 'Tetun' WHERE subtag = 'tet' AND type = 'language' AND lang = 'tet'");
9240     $dbh->do("UPDATE language_descriptions SET description = 'ภาษาไทย' WHERE subtag = 'th' AND type = 'language' AND lang = 'th'");
9241
9242     $dbh->do("INSERT IGNORE INTO language_subtag_registry( subtag, type, description, added) VALUES ( 'tl', 'language', 'Tagalog','2014-10-30')");
9243     $dbh->do("INSERT IGNORE INTO language_rfc4646_to_iso639(rfc4646_subtag,iso639_2_code) VALUES ( 'tl','tgl')");
9244     $dbh->do("INSERT IGNORE INTO language_descriptions(subtag, type, lang, description) VALUES ( 'tl', 'language', 'tl', 'Tagalog')");
9245     $dbh->do("INSERT IGNORE INTO language_descriptions(subtag, type, lang, description) VALUES ( 'tl', 'language', 'en', 'Tagalog')");
9246
9247     $dbh->do("UPDATE language_descriptions SET description = 'Türkçe' WHERE subtag = 'tr' AND type = 'language' AND lang = 'tr'");
9248     $dbh->do("UPDATE language_descriptions SET description = 'Українська' WHERE subtag = 'uk' AND type = 'language' AND lang = 'uk'");
9249     $dbh->do("UPDATE language_descriptions SET description = 'اردو' WHERE subtag = 'ur' AND type = 'language' AND lang = 'ur'");
9250
9251     $dbh->do("INSERT IGNORE INTO language_subtag_registry( subtag, type, description, added) VALUES ( 'vi', 'language', 'Vietnamese','2014-10-30')");
9252     $dbh->do("INSERT IGNORE INTO language_rfc4646_to_iso639(rfc4646_subtag,iso639_2_code) VALUES ( 'vi','vie')");
9253     $dbh->do("INSERT IGNORE INTO language_descriptions(subtag, type, lang, description) VALUES ( 'vi', 'language', 'vi', '㗂越')");
9254     $dbh->do("INSERT IGNORE INTO language_descriptions(subtag, type, lang, description) VALUES ( 'vi', 'language', 'en', 'Vietnamese')");
9255
9256     $dbh->do("UPDATE language_descriptions SET description = '中文' WHERE subtag = 'zh' AND type = 'language' AND lang = 'zh'");
9257     $dbh->do("UPDATE language_descriptions SET description = '' WHERE subtag = 'Arab,script' AND type = 'Arab' AND lang = 'العربية'");
9258
9259     $dbh->do("INSERT IGNORE INTO language_subtag_registry( subtag, type, description, added) VALUES ( 'Armn', 'script', 'Armenian','2014-10-30')");
9260     $dbh->do("INSERT IGNORE INTO language_descriptions(subtag, type, lang, description) VALUES ( 'Armn', 'script', 'Armn', 'Հայոց այբուբեն')");
9261     $dbh->do("INSERT IGNORE INTO language_descriptions(subtag, type, lang, description) VALUES( 'Armn', 'script', 'en', 'Armenian')");
9262
9263     $dbh->do("UPDATE language_descriptions SET description = 'Кирилица' WHERE subtag = 'Cyrl' AND type = 'script' AND lang = 'Cyrl'");
9264
9265     $dbh->do("INSERT IGNORE INTO language_subtag_registry( subtag, type, description, added) VALUES ( 'Ethi', 'script', 'Ethiopic','2014-10-30')");
9266     $dbh->do("INSERT IGNORE INTO language_descriptions(subtag, type, lang, description) VALUES ( 'Ethi', 'script', 'Ethi', 'ግዕዝ')");
9267     $dbh->do("INSERT IGNORE INTO language_descriptions(subtag, type, lang, description) VALUES( 'Ethi', 'script', 'en', 'Ethiopic')");
9268
9269     $dbh->do("UPDATE language_descriptions SET description = 'Ελληνικό αλφάβητο' WHERE subtag = 'Grek' AND type = 'script' AND lang = 'Grek'");
9270     $dbh->do("UPDATE language_descriptions SET description = '简体字' WHERE subtag = 'Hans' AND type = 'script' AND lang = 'Hans'");
9271     $dbh->do("UPDATE language_descriptions SET description = '繁體字' WHERE subtag = 'Hant' AND type = 'script' AND lang = 'Hant'");
9272     $dbh->do("UPDATE language_descriptions SET description = 'אָלֶף־בֵּית עִבְרִי' WHERE subtag = 'Hebr' AND type = 'script' AND lang = 'Hebr'");
9273
9274     $dbh->do("INSERT IGNORE INTO language_subtag_registry( subtag, type, description, added) VALUES ( 'Jpan', 'script', 'Japanese','2014-10-30')");
9275     $dbh->do("INSERT IGNORE INTO language_descriptions(subtag, type, lang, description) VALUES ( 'Jpan', 'script', 'Jpan', '漢字')");
9276     $dbh->do("INSERT IGNORE INTO language_descriptions(subtag, type, lang, description) VALUES( 'Jpan', 'script', 'en', 'Japanese')");
9277
9278     $dbh->do("INSERT IGNORE INTO language_subtag_registry( subtag, type, description, added) VALUES ( 'Knda', 'script', 'Kannada','2014-10-30')");
9279     $dbh->do("INSERT IGNORE INTO language_descriptions(subtag, type, lang, description) VALUES ( 'Knda', 'script', 'Knda', 'ಕನ್ನಡ ಲಿಪಿ')");
9280     $dbh->do("INSERT IGNORE INTO language_descriptions(subtag, type, lang, description) VALUES( 'Knda', 'script', 'en', 'Kannada')");
9281
9282     $dbh->do("INSERT IGNORE INTO language_subtag_registry( subtag, type, description, added) VALUES ( 'Kore', 'script', 'Korean','2014-10-30')");
9283     $dbh->do("INSERT IGNORE INTO language_descriptions(subtag, type, lang, description) VALUES ( 'Kore', 'script', 'Kore', '한글')");
9284     $dbh->do("INSERT IGNORE INTO language_descriptions(subtag, type, lang, description) VALUES( 'Kore', 'script', 'en', 'Korean')");
9285
9286     $dbh->do("UPDATE language_descriptions SET description = 'ອັກສອນລາວ' WHERE subtag = 'Laoo' AND type = 'script' AND lang = 'Laoo'");
9287
9288     $dbh->do("INSERT IGNORE INTO language_subtag_registry( subtag, type, description, added) VALUES ( 'AL', 'region', 'Albania','2014-10-30')");
9289     $dbh->do("INSERT IGNORE INTO language_descriptions(subtag, type, lang, description) VALUES ( 'AL', 'region', 'en', 'Albania')");
9290     $dbh->do("INSERT IGNORE INTO language_descriptions(subtag, type, lang, description) VALUES ( 'AL', 'region', 'sq', 'Shqipërisë')");
9291
9292     $dbh->do("INSERT IGNORE INTO language_subtag_registry( subtag, type, description, added) VALUES ( 'AZ', 'region', 'Azerbaijan','2014-10-30')");
9293     $dbh->do("INSERT IGNORE INTO language_descriptions(subtag, type, lang, description) VALUES ( 'AZ', 'region', 'en', 'Azerbaijan')");
9294     $dbh->do("INSERT IGNORE INTO language_descriptions(subtag, type, lang, description) VALUES ( 'AZ', 'region', 'az', 'Azərbaycan')");
9295
9296     $dbh->do("INSERT IGNORE INTO language_subtag_registry( subtag, type, description, added) VALUES ( 'BE', 'region', 'Belgium','2014-10-30')");
9297     $dbh->do("INSERT IGNORE INTO language_descriptions(subtag, type, lang, description) VALUES ( 'BE', 'region', 'en', 'Belgium')");
9298     $dbh->do("INSERT IGNORE INTO language_descriptions(subtag, type, lang, description) VALUES ( 'BE', 'region', 'nl', 'België')");
9299
9300     $dbh->do("INSERT IGNORE INTO language_subtag_registry( subtag, type, description, added) VALUES ( 'BR', 'region', 'Brazil','2014-10-30')");
9301     $dbh->do("INSERT IGNORE INTO language_descriptions(subtag, type, lang, description) VALUES ( 'BR', 'region', 'en', 'Brazil')");
9302     $dbh->do("INSERT IGNORE INTO language_descriptions(subtag, type, lang, description) VALUES ( 'BR', 'region', 'pt', 'Brasil')");
9303
9304     $dbh->do("INSERT IGNORE INTO language_subtag_registry( subtag, type, description, added) VALUES ( 'BY', 'region', 'Belarus','2014-10-30')");
9305     $dbh->do("INSERT IGNORE INTO language_descriptions(subtag, type, lang, description) VALUES ( 'BY', 'region', 'en', 'Belarus')");
9306     $dbh->do("INSERT IGNORE INTO language_descriptions(subtag, type, lang, description) VALUES ( 'BY', 'region', 'be', 'Беларусь')");
9307
9308     $dbh->do("INSERT IGNORE INTO language_descriptions(subtag, type, lang, description) VALUES ( 'CA', 'region', 'fr', 'Canada')");
9309
9310     $dbh->do("INSERT IGNORE INTO language_subtag_registry( subtag, type, description, added) VALUES ( 'CH', 'region', 'Switzerland','2014-10-30')");
9311     $dbh->do("INSERT IGNORE INTO language_descriptions(subtag, type, lang, description) VALUES ( 'CH', 'region', 'en', 'Switzerland')");
9312     $dbh->do("INSERT IGNORE INTO language_descriptions(subtag, type, lang, description) VALUES ( 'CH', 'region', 'de', 'Schweiz')");
9313
9314     $dbh->do("INSERT IGNORE INTO language_subtag_registry( subtag, type, description, added) VALUES ( 'CN', 'region', 'China','2014-10-30')");
9315     $dbh->do("INSERT IGNORE INTO language_descriptions(subtag, type, lang, description) VALUES ( 'CN', 'region', 'en', 'China')");
9316     $dbh->do("INSERT IGNORE INTO language_descriptions(subtag, type, lang, description) VALUES ( 'CN', 'region', 'zh', '中国')");
9317
9318     $dbh->do("INSERT IGNORE INTO language_subtag_registry( subtag, type, description, added) VALUES ( 'CZ', 'region', 'Czech Republic','2014-10-30')");
9319     $dbh->do("INSERT IGNORE INTO language_descriptions(subtag, type, lang, description) VALUES ( 'CZ', 'region', 'en', 'Czech Republic')");
9320     $dbh->do("INSERT IGNORE INTO language_descriptions(subtag, type, lang, description) VALUES ( 'CZ', 'region', 'cs', 'Česká republika')");
9321
9322     $dbh->do("INSERT IGNORE INTO language_subtag_registry( subtag, type, description, added) VALUES ( 'DE', 'region', 'Germany','2014-10-30')");
9323     $dbh->do("INSERT IGNORE INTO language_descriptions(subtag, type, lang, description) VALUES ( 'DE', 'region', 'en', 'Germany')");
9324     $dbh->do("INSERT IGNORE INTO language_descriptions(subtag, type, lang, description) VALUES ( 'DE', 'region', 'de', 'Deutschland')");
9325
9326     $dbh->do("INSERT IGNORE INTO language_descriptions(subtag, type, lang, description) VALUES ( 'DK', 'region', 'en', 'Denmark')");
9327
9328     $dbh->do("INSERT IGNORE INTO language_subtag_registry( subtag, type, description, added) VALUES ( 'ES', 'region', 'Spain','2014-10-30')");
9329     $dbh->do("INSERT IGNORE INTO language_descriptions(subtag, type, lang, description) VALUES ( 'ES', 'region', 'en', 'Spain')");
9330     $dbh->do("INSERT IGNORE INTO language_descriptions(subtag, type, lang, description) VALUES ( 'ES', 'region', 'es', 'España')");
9331
9332     $dbh->do("INSERT IGNORE INTO language_subtag_registry( subtag, type, description, added) VALUES ( 'FI', 'region', 'Finland','2014-10-30')");
9333     $dbh->do("INSERT IGNORE INTO language_descriptions(subtag, type, lang, description) VALUES ( 'FI', 'region', 'en', 'Finland')");
9334     $dbh->do("INSERT IGNORE INTO language_descriptions(subtag, type, lang, description) VALUES ( 'FI', 'region', 'fi', 'Suomi')");
9335
9336     $dbh->do("INSERT IGNORE INTO language_subtag_registry( subtag, type, description, added) VALUES ( 'FO', 'region', 'Faroe Islands','2014-10-30')");
9337     $dbh->do("INSERT IGNORE INTO language_descriptions(subtag, type, lang, description) VALUES ( 'FO', 'region', 'en', 'Faroe Islands')");
9338     $dbh->do("INSERT IGNORE INTO language_descriptions(subtag, type, lang, description) VALUES ( 'FO', 'region', 'fo', 'Føroyar')");
9339
9340     $dbh->do("INSERT IGNORE INTO language_subtag_registry( subtag, type, description, added) VALUES ( 'GR', 'region', 'Greece','2014-10-30')");
9341     $dbh->do("INSERT IGNORE INTO language_descriptions(subtag, type, lang, description) VALUES ( 'GR', 'region', 'en', 'Greece')");
9342     $dbh->do("INSERT IGNORE INTO language_descriptions(subtag, type, lang, description) VALUES ( 'GR', 'region', 'el', 'Ελλάδα')");
9343
9344     $dbh->do("INSERT IGNORE INTO language_subtag_registry( subtag, type, description, added) VALUES ( 'HR', 'region', 'Croatia','2014-10-30')");
9345     $dbh->do("INSERT IGNORE INTO language_descriptions(subtag, type, lang, description) VALUES ( 'HR', 'region', 'en', 'Croatia')");
9346     $dbh->do("INSERT IGNORE INTO language_descriptions(subtag, type, lang, description) VALUES ( 'HR', 'region', 'hr', 'Hrvatska')");
9347
9348     $dbh->do("INSERT IGNORE INTO language_subtag_registry( subtag, type, description, added) VALUES ( 'HU', 'region', 'Hungary','2014-10-30')");
9349     $dbh->do("INSERT IGNORE INTO language_descriptions(subtag, type, lang, description) VALUES ( 'HU', 'region', 'en', 'Hungary')");
9350     $dbh->do("INSERT IGNORE INTO language_descriptions(subtag, type, lang, description) VALUES ( 'HU', 'region', 'hu', 'Magyarország')");
9351
9352     $dbh->do("INSERT IGNORE INTO language_subtag_registry( subtag, type, description, added) VALUES ( 'ID', 'region', 'Indonesia','2014-10-30')");
9353     $dbh->do("INSERT IGNORE INTO language_descriptions(subtag, type, lang, description) VALUES ( 'ID', 'region', 'en', 'Indonesia')");
9354     $dbh->do("INSERT IGNORE INTO language_descriptions(subtag, type, lang, description) VALUES ( 'ID', 'region', 'id', 'Indonesia')");
9355
9356     $dbh->do("INSERT IGNORE INTO language_subtag_registry( subtag, type, description, added) VALUES ( 'IS', 'region', 'Iceland','2014-10-30')");
9357     $dbh->do("INSERT IGNORE INTO language_descriptions(subtag, type, lang, description) VALUES ( 'IS', 'region', 'en', 'Iceland')");
9358     $dbh->do("INSERT IGNORE INTO language_descriptions(subtag, type, lang, description) VALUES ( 'IS', 'region', 'is', 'Ísland')");
9359
9360     $dbh->do("INSERT IGNORE INTO language_subtag_registry( subtag, type, description, added) VALUES ( 'IT', 'region', 'Italy','2014-10-30')");
9361     $dbh->do("INSERT IGNORE INTO language_descriptions(subtag, type, lang, description) VALUES ( 'IT', 'region', 'en', 'Italy')");
9362     $dbh->do("INSERT IGNORE INTO language_descriptions(subtag, type, lang, description) VALUES ( 'IT', 'region', 'it', 'Italia')");
9363
9364     $dbh->do("INSERT IGNORE INTO language_subtag_registry( subtag, type, description, added) VALUES ( 'JP', 'region', 'Japan','2014-10-30')");
9365     $dbh->do("INSERT IGNORE INTO language_descriptions(subtag, type, lang, description) VALUES ( 'JP', 'region', 'en', 'Japan')");
9366     $dbh->do("INSERT IGNORE INTO language_descriptions(subtag, type, lang, description) VALUES ( 'JP', 'region', 'ja', '日本')");
9367
9368     $dbh->do("INSERT IGNORE INTO language_subtag_registry( subtag, type, description, added) VALUES ( 'KE', 'region', 'Kenya','2014-10-30')");
9369     $dbh->do("INSERT IGNORE INTO language_descriptions(subtag, type, lang, description) VALUES ( 'KE', 'region', 'en', 'Kenya')");
9370     $dbh->do("INSERT IGNORE INTO language_descriptions(subtag, type, lang, description) VALUES ( 'KE', 'region', 'rw', 'Kenya')");
9371
9372     $dbh->do("INSERT IGNORE INTO language_subtag_registry( subtag, type, description, added) VALUES ( 'KH', 'region', 'Cambodia','2014-10-30')");
9373     $dbh->do("INSERT IGNORE INTO language_descriptions(subtag, type, lang, description) VALUES ( 'KH', 'region', 'en', 'Cambodia')");
9374     $dbh->do("INSERT IGNORE INTO language_descriptions(subtag, type, lang, description) VALUES ( 'KH', 'region', 'km', 'កម្ពុជា')");
9375
9376     $dbh->do("INSERT IGNORE INTO language_subtag_registry( subtag, type, description, added) VALUES ( 'KP', 'region', 'North Korea','2014-10-30')");
9377     $dbh->do("INSERT IGNORE INTO language_descriptions(subtag, type, lang, description) VALUES ( 'KP', 'region', 'en', 'North Korea')");
9378     $dbh->do("INSERT IGNORE INTO language_descriptions(subtag, type, lang, description) VALUES ( 'KP', 'region', 'ko', '조선민주주의인민공화국')");
9379
9380     $dbh->do("INSERT IGNORE INTO language_subtag_registry( subtag, type, description, added) VALUES ( 'LK', 'region', 'Sri Lanka','2014-10-30')");
9381     $dbh->do("INSERT IGNORE INTO language_descriptions(subtag, type, lang, description) VALUES ( 'LK', 'region', 'en', 'Sri Lanka')");
9382     $dbh->do("INSERT IGNORE INTO language_descriptions(subtag, type, lang, description) VALUES ( 'LK', 'region', 'ta', 'இலங்கை')");
9383
9384     $dbh->do("INSERT IGNORE INTO language_subtag_registry( subtag, type, description, added) VALUES ( 'MY', 'region', 'Malaysia','2014-10-30')");
9385     $dbh->do("INSERT IGNORE INTO language_descriptions(subtag, type, lang, description) VALUES ( 'MY', 'region', 'en', 'Malaysia')");
9386     $dbh->do("INSERT IGNORE INTO language_descriptions(subtag, type, lang, description) VALUES ( 'MY', 'region', 'ms', 'Malaysia')");
9387
9388     $dbh->do("INSERT IGNORE INTO language_subtag_registry( subtag, type, description, added) VALUES ( 'NE', 'region', 'Niger','2014-10-30')");
9389     $dbh->do("INSERT IGNORE INTO language_descriptions(subtag, type, lang, description) VALUES ( 'NE', 'region', 'en', 'Niger')");
9390     $dbh->do("INSERT IGNORE INTO language_descriptions(subtag, type, lang, description) VALUES ( 'NE', 'region', 'ne', 'Niger')");
9391
9392     $dbh->do("INSERT IGNORE INTO language_subtag_registry( subtag, type, description, added) VALUES ( 'NL', 'region', 'Netherlands','2014-10-30')");
9393     $dbh->do("INSERT IGNORE INTO language_descriptions(subtag, type, lang, description) VALUES ( 'NL', 'region', 'en', 'Netherlands')");
9394     $dbh->do("INSERT IGNORE INTO language_descriptions(subtag, type, lang, description) VALUES ( 'NL', 'region', 'nl', 'Nederland')");
9395
9396     $dbh->do("INSERT IGNORE INTO language_subtag_registry( subtag, type, description, added) VALUES ( 'NO', 'region', 'Norway','2014-10-30')");
9397     $dbh->do("INSERT IGNORE INTO language_descriptions(subtag, type, lang, description) VALUES ( 'NO', 'region', 'en', 'Norway')");
9398     $dbh->do("INSERT IGNORE INTO language_descriptions(subtag, type, lang, description) VALUES ( 'NO', 'region', 'ne', 'Noreg')");
9399     $dbh->do("INSERT IGNORE INTO language_descriptions(subtag, type, lang, description) VALUES ( 'NO', 'region', 'nn', 'Noreg')");
9400
9401     $dbh->do("INSERT IGNORE INTO language_subtag_registry( subtag, type, description, added) VALUES ( 'PH', 'region', 'Philippines','2014-10-30')");
9402     $dbh->do("INSERT IGNORE INTO language_descriptions(subtag, type, lang, description) VALUES ( 'PH', 'region', 'en', 'Philippines')");
9403     $dbh->do("INSERT IGNORE INTO language_descriptions(subtag, type, lang, description) VALUES ( 'PH', 'region', 'tl', 'Pilipinas')");
9404
9405     $dbh->do("INSERT IGNORE INTO language_subtag_registry( subtag, type, description, added) VALUES ( 'PK', 'region', 'Pakistan','2014-10-30')");
9406     $dbh->do("INSERT IGNORE INTO language_descriptions(subtag, type, lang, description) VALUES ( 'PK', 'region', 'en', 'Pakistan')");
9407     $dbh->do("INSERT IGNORE INTO language_descriptions(subtag, type, lang, description) VALUES ( 'PK', 'region', 'sd', 'پاكستان')");
9408
9409     $dbh->do("INSERT IGNORE INTO language_subtag_registry( subtag, type, description, added) VALUES ( 'PL', 'region', 'Poland','2014-10-30')");
9410     $dbh->do("INSERT IGNORE INTO language_descriptions(subtag, type, lang, description) VALUES ( 'PL', 'region', 'en', 'Poland')");
9411     $dbh->do("INSERT IGNORE INTO language_descriptions(subtag, type, lang, description) VALUES ( 'PL', 'region', 'pl', 'Polska')");
9412
9413     $dbh->do("INSERT IGNORE INTO language_subtag_registry( subtag, type, description, added) VALUES ( 'PT', 'region', 'Portugal','2014-10-30')");
9414     $dbh->do("INSERT IGNORE INTO language_descriptions(subtag, type, lang, description) VALUES ( 'PT', 'region', 'en', 'Portugal')");
9415     $dbh->do("INSERT IGNORE INTO language_descriptions(subtag, type, lang, description) VALUES ( 'PT', 'region', 'pt', 'Portugal')");
9416
9417     $dbh->do("INSERT IGNORE INTO language_subtag_registry( subtag, type, description, added) VALUES ( 'RO', 'region', 'Romania','2014-10-30')");
9418     $dbh->do("INSERT IGNORE INTO language_descriptions(subtag, type, lang, description) VALUES ( 'RO', 'region', 'en', 'Romania')");
9419     $dbh->do("INSERT IGNORE INTO language_descriptions(subtag, type, lang, description) VALUES ( 'RO', 'region', 'ro', 'România')");
9420
9421     $dbh->do("INSERT IGNORE INTO language_subtag_registry( subtag, type, description, added) VALUES ( 'RU', 'region', 'Russia','2014-10-30')");
9422     $dbh->do("INSERT IGNORE INTO language_descriptions(subtag, type, lang, description) VALUES ( 'RU', 'region', 'en', 'Russia')");
9423     $dbh->do("INSERT IGNORE INTO language_descriptions(subtag, type, lang, description) VALUES ( 'RU', 'region', 'ru', 'Россия')");
9424
9425     $dbh->do("INSERT IGNORE INTO language_subtag_registry( subtag, type, description, added) VALUES ( 'RW', 'region', 'Rwanda','2014-10-30')");
9426     $dbh->do("INSERT IGNORE INTO language_descriptions(subtag, type, lang, description) VALUES ( 'RW', 'region', 'en', 'Rwanda')");
9427     $dbh->do("INSERT IGNORE INTO language_descriptions(subtag, type, lang, description) VALUES ( 'RW', 'region', 'rw', 'Rwanda')");
9428
9429     $dbh->do("INSERT IGNORE INTO language_subtag_registry( subtag, type, description, added) VALUES ( 'SE', 'region', 'Sweden','2014-10-30')");
9430     $dbh->do("INSERT IGNORE INTO language_descriptions(subtag, type, lang, description) VALUES ( 'SE', 'region', 'en', 'Sweden')");
9431     $dbh->do("INSERT IGNORE INTO language_descriptions(subtag, type, lang, description) VALUES ( 'SE', 'region', 'sv', 'Sverige')");
9432
9433     $dbh->do("INSERT IGNORE INTO language_subtag_registry( subtag, type, description, added) VALUES ( 'SI', 'region', 'Slovenia','2014-10-30')");
9434     $dbh->do("INSERT IGNORE INTO language_descriptions(subtag, type, lang, description) VALUES ( 'SI', 'region', 'en', 'Slovenia')");
9435     $dbh->do("INSERT IGNORE INTO language_descriptions(subtag, type, lang, description) VALUES ( 'SI', 'region', 'sl', 'Slovenija')");
9436
9437     $dbh->do("INSERT IGNORE INTO language_subtag_registry( subtag, type, description, added) VALUES ( 'SK', 'region', 'Slovakia','2014-10-30')");
9438     $dbh->do("INSERT IGNORE INTO language_descriptions(subtag, type, lang, description) VALUES ( 'SK', 'region', 'en', 'Slovakia')");
9439     $dbh->do("INSERT IGNORE INTO language_descriptions(subtag, type, lang, description) VALUES ( 'SK', 'region', 'sk', 'Slovensko')");
9440
9441     $dbh->do("INSERT IGNORE INTO language_subtag_registry( subtag, type, description, added) VALUES ( 'TH', 'region', 'Thailand','2014-10-30')");
9442     $dbh->do("INSERT IGNORE INTO language_descriptions(subtag, type, lang, description) VALUES ( 'TH', 'region', 'en', 'Thailand')");
9443     $dbh->do("INSERT IGNORE INTO language_descriptions(subtag, type, lang, description) VALUES ( 'TH', 'region', 'th', 'ประเทศไทย')");
9444
9445     $dbh->do("INSERT IGNORE INTO language_subtag_registry( subtag, type, description, added) VALUES ( 'TR', 'region', 'Turkey','2014-10-30')");
9446     $dbh->do("INSERT IGNORE INTO language_descriptions(subtag, type, lang, description) VALUES ( 'TR', 'region', 'en', 'Turkey')");
9447     $dbh->do("INSERT IGNORE INTO language_descriptions(subtag, type, lang, description) VALUES ( 'TR', 'region', 'tr', 'Türkiye')");
9448
9449     $dbh->do("INSERT IGNORE INTO language_subtag_registry( subtag, type, description, added) VALUES ( 'TW', 'region', 'Taiwan','2014-10-30')");
9450     $dbh->do("INSERT IGNORE INTO language_descriptions(subtag, type, lang, description) VALUES ( 'TW', 'region', 'en', 'Taiwan')");
9451     $dbh->do("INSERT IGNORE INTO language_descriptions(subtag, type, lang, description) VALUES ( 'TW', 'region', 'zh', '台灣')");
9452
9453     $dbh->do("INSERT IGNORE INTO language_subtag_registry( subtag, type, description, added) VALUES ( 'UA', 'region', 'Ukraine','2014-10-30')");
9454     $dbh->do("INSERT IGNORE INTO language_descriptions(subtag, type, lang, description) VALUES ( 'UA', 'region', 'en', 'Ukraine')");
9455     $dbh->do("INSERT IGNORE INTO language_descriptions(subtag, type, lang, description) VALUES ( 'UA', 'region', 'uk', 'Україна')");
9456
9457     $dbh->do("INSERT IGNORE INTO language_subtag_registry( subtag, type, description, added) VALUES ( 'VN', 'region', 'Vietnam','2014-10-30')");
9458     $dbh->do("INSERT IGNORE INTO language_descriptions(subtag, type, lang, description) VALUES ( 'VN', 'region', 'en', 'Vietnam')");
9459     $dbh->do("INSERT IGNORE INTO language_descriptions(subtag, type, lang, description) VALUES ( 'VN', 'region', 'vi', 'Việt Nam')");
9460
9461     print "Upgrade to $DBversion done (Bug 12250: Update descriptions for languages, scripts and regions)\n";
9462     SetVersion($DBversion);
9463 }
9464
9465 $DBversion = "3.17.00.050";
9466 if ( CheckVersion($DBversion) ) {
9467     $dbh->do(q|
9468         INSERT INTO permissions (module_bit, code, description) VALUES
9469           (13, 'records_batchdel', 'Perform batch deletion of records (bibliographic or authority)')
9470     |);
9471     print "Upgrade to $DBversion done (Bug 12403: Add permission tools_records_batchdelitem)\n";
9472     SetVersion($DBversion);
9473 }
9474
9475 $DBversion = "3.17.00.051";
9476 if ( CheckVersion($DBversion) ) {
9477     $dbh->do("INSERT INTO systempreferences (variable,value,options,explanation,type) VALUES('GoogleIndicTransliteration','0','','GoogleIndicTransliteration on the OPAC.','YesNo')");
9478     print "Upgrade to $DBversion done (Bug 13211: Added system preferences GoogleIndicTransliteration on the OPAC)\n";
9479     SetVersion($DBversion);
9480 }
9481
9482 $DBversion = "3.17.00.052";
9483 if ( CheckVersion($DBversion) ) {
9484     $dbh->do(q{
9485         INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES('OpacAdvSearchOptions','pubdate|itemtype|language|sorting|location','Show search options','pubdate|itemtype|language|subtype|sorting|location','multiple');
9486     });
9487
9488     $dbh->do(q{
9489         INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES('OpacAdvSearchMoreOptions','pubdate|itemtype|language|subtype|sorting|location','Show search options for the expanded view (More options)','pubdate|itemtype|language|subtype|sorting|location','multiple');
9490    });
9491    print "Upgrade to $DBversion done (Bug 9043: Add system preference OpacAdvSearchOptions and OpacAdvSearchMoreOptions)\n";
9492    SetVersion ($DBversion);
9493 }
9494
9495 $DBversion = "3.17.00.053";
9496 if ( CheckVersion($DBversion) ) {
9497     $dbh->do(q{
9498         INSERT INTO permissions (module_bit, code, description) VALUES ('9', 'edit_items_restricted', 'Limit item modification to subfields defined in the SubfieldsToAllowForRestrictedEditing preference (please note that edit_item is still required)');
9499     });
9500
9501     $dbh->do(q{
9502         INSERT INTO permissions (module_bit, code, description) VALUES ('9', 'delete_all_items', 'Delete all items at once');
9503     });
9504
9505     $dbh->do(q{
9506         INSERT INTO permissions (module_bit, code, description) VALUES ('13', 'items_batchmod_restricted', 'Limit batch item modification to subfields defined in the SubfieldsToAllowForRestrictedBatchmod preference (please note that items_batchmod is still required)');
9507     });
9508
9509     # The delete_all_items permission should be added to users having the edit_items permission.
9510     $dbh->do(q{
9511         INSERT INTO user_permissions (borrowernumber, module_bit, code) SELECT borrowernumber, module_bit, "delete_all_items" FROM user_permissions WHERE code="edit_items";
9512     });
9513
9514     # Add 2 new prefs
9515     $dbh->do(q{
9516         INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES ('SubfieldsToAllowForRestrictedEditing','','Define a list of subfields for which edition is authorized when edit_items_restricted permission is enabled, separated by spaces. Example: 995\$f 995\$h 995\$j','','Free');
9517     });
9518
9519     $dbh->do(q{
9520         INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES ('SubfieldsToAllowForRestrictedBatchmod','','Define a list of subfields for which edition is authorized when items_batchmod_restricted permission is enabled, separated by spaces. Example: 995\$f 995\$h 995\$j','','Free');
9521     });
9522
9523     print "Upgrade to $DBversion done (Bug 7673: Adds 2 new prefs (SubfieldsToAllowForRestrictedEditing and SubfieldsToAllowForRestrictedBatchmod) and 3 new permissions (edit_items_restricted and delete_all_items and items_batchmod_restricted))\n";
9524     SetVersion($DBversion);
9525 }
9526
9527 $DBversion = "3.17.00.054";
9528 if (CheckVersion($DBversion)) {
9529     $dbh->do(q{
9530         INSERT INTO systempreferences ( variable, value, options, explanation, type ) VALUES
9531         ('AllowRenewalIfOtherItemsAvailable','0',NULL,'If enabled, allow a patron to renew an item with unfilled holds if other available items can fill that hold.','YesNo')
9532     });
9533     print "Upgrade to $DBversion done (Bug 11634 - Allow renewal of item with unfilled holds if other available items can fill those holds)\n";
9534     SetVersion($DBversion);
9535 }
9536
9537 $DBversion = "3.17.00.055";
9538 if ( CheckVersion($DBversion) ) {
9539     $dbh->do("INSERT IGNORE INTO systempreferences (variable,value,options,explanation,type) VALUES ('NorwegianPatronDBEnable', '0', NULL, 'Enable communication with the Norwegian national patron database.', 'YesNo')");
9540     $dbh->do("INSERT IGNORE INTO systempreferences (variable,value,options,explanation,type) VALUES ('NorwegianPatronDBEndpoint', '', NULL, 'Which NL endpoint to use.', 'Free')");
9541     $dbh->do("INSERT IGNORE INTO systempreferences (variable,value,options,explanation,type) VALUES ('NorwegianPatronDBUsername', '', NULL, 'Username for communication with the Norwegian national patron database.', 'Free')");
9542     $dbh->do("INSERT IGNORE INTO systempreferences (variable,value,options,explanation,type) VALUES ('NorwegianPatronDBPassword', '', NULL, 'Password for communication with the Norwegian national patron database.', 'Free')");
9543     $dbh->do("INSERT IGNORE INTO systempreferences (variable,value,options,explanation,type) VALUES ('NorwegianPatronDBSearchNLAfterLocalHit','0',NULL,'Search NL if a search has already given one or more local hits?.','YesNo')");
9544     $dbh->do("
9545 CREATE TABLE borrower_sync (
9546     borrowersyncid int(11) NOT NULL AUTO_INCREMENT,
9547     borrowernumber int(11) NOT NULL,
9548     synctype varchar(32) NOT NULL,
9549     sync tinyint(1) NOT NULL DEFAULT '0',
9550     syncstatus varchar(10) DEFAULT NULL,
9551     lastsync varchar(50) DEFAULT NULL,
9552     hashed_pin varchar(64) DEFAULT NULL,
9553     PRIMARY KEY (borrowersyncid),
9554     KEY borrowernumber (borrowernumber),
9555     CONSTRAINT borrower_sync_ibfk_1 FOREIGN KEY (borrowernumber) REFERENCES borrowers (borrowernumber) ON DELETE CASCADE ON UPDATE CASCADE
9556 ) ENGINE=InnoDB DEFAULT CHARSET=utf8"
9557 );
9558     print "Upgrade to $DBversion done (Bug 11401 - Add support for Norwegian national library card)\n";
9559     SetVersion($DBversion);
9560 }
9561
9562 $DBversion = "3.17.00.056";
9563 if ( CheckVersion($DBversion) ) {
9564     $dbh->do(q{
9565         UPDATE systempreferences SET value = 'pubdate,itemtype,language,sorting,location' WHERE variable='OpacAdvSearchOptions'
9566     });
9567
9568     $dbh->do(q{
9569         UPDATE systempreferences SET value = 'pubdate,itemtype,language,subtype,sorting,location' WHERE variable='OpacAdvSearchMoreOptions'
9570     });
9571
9572     print "Upgrade to $DBversion done (Bug 9043 - Update the values for OpacAdvSearchOptions and OpacAdvSearchOptions)\n";
9573     SetVersion($DBversion);
9574 }
9575
9576 $DBversion = "3.17.00.057";
9577 if ( CheckVersion($DBversion) ) {
9578     print "Upgrade to $DBversion done (Koha 3.18 beta)\n";
9579     SetVersion ($DBversion);
9580 }
9581
9582 $DBversion = "3.17.00.058";
9583 if( CheckVersion($DBversion) ){
9584     $dbh->do("INSERT INTO systempreferences (variable, explanation, type) VALUES('DefaultLongOverdueChargeValue','Charge a lost item to the borrower account when the LOST value of the item changes to n',  'integer')");
9585     $dbh->do("INSERT INTO systempreferences (variable, explanation, type) VALUES('DefaultLongOverdueLostValue', 'Set the LOST value of an item to n when the item has been overdue for more than defaultlongoverduedays days.', 'integer')");
9586     $dbh->do("INSERT INTO systempreferences (variable, explanation, type) VALUES('DefaultLongOverdueDays', 'Set the LOST value of an item when the item has been overdue for more than n days.',  'integer')");
9587     print "Upgrade to $DBversion done (Bug 8337: System preferences for longoverdue cron)\n";
9588     SetVersion($DBversion);
9589 }
9590
9591 $DBversion = "3.17.00.059";
9592 if ( CheckVersion($DBversion) ) {
9593     $dbh->do(q{
9594         UPDATE permissions SET description = "Add and delete budgets (but can't modifiy budgets)" WHERE description = "Add and delete budgets (but cant modify budgets)";
9595     });
9596     print "Upgrade to $DBversion done (Bug 10749: Fix typo in budget_add_del permission description)\n";
9597     SetVersion ($DBversion);
9598 }
9599
9600 $DBversion = "3.17.00.060";
9601 if ( CheckVersion($DBversion) ) {
9602     my $count_l = $dbh->selectcol_arrayref(q|
9603         SELECT COUNT(*) FROM letter WHERE message_transport_type='feed'
9604     |);
9605     my $count_mq = $dbh->selectcol_arrayref(q|
9606         SELECT COUNT(*) FROM message_queue WHERE message_transport_type='feed'
9607     |);
9608     my $count_ott = $dbh->selectcol_arrayref(q|
9609         SELECT COUNT(*) FROM overduerules_transport_types WHERE message_transport_type='feed'
9610     |);
9611     my $count_mt = $dbh->selectcol_arrayref(q|
9612         SELECT COUNT(*) FROM message_transports WHERE message_transport_type='feed'
9613     |);
9614     my $count_bmtp = $dbh->selectcol_arrayref(q|
9615         SELECT COUNT(*) FROM borrower_message_transport_preferences WHERE message_transport_type='feed'
9616     |);
9617
9618     my $deleted = 0;
9619     if ( $count_l->[0] == 0 and $count_mq->[0] == 0 and $count_ott->[0] == 0 and $count_mt->[0] == 0 and $count_bmtp->[0] == 0 ) {
9620         $deleted = $dbh->do(q|
9621             DELETE FROM message_transport_types where message_transport_type='feed'
9622         |);
9623         $deleted = $deleted ne '0E0' ? 1 : 0;
9624     }
9625
9626     print "Upgrade to $DBversion done (Bug 12298: Delete the 'feed' message transport type " . ($deleted ? '(deleted!)' : '(not deleted)') . ")\n";
9627     SetVersion($DBversion);
9628 }
9629
9630 $DBversion = "3.18.00.000";
9631 if ( CheckVersion($DBversion) ) {
9632     print "Upgrade to $DBversion done (3.18.0 release)\n";
9633     SetVersion($DBversion);
9634 }
9635
9636 $DBversion = "3.19.00.000";
9637 if ( CheckVersion($DBversion) ) {
9638     print "Upgrade to $DBversion done (there's life after 3.18)\n";
9639     SetVersion ($DBversion);
9640 }
9641
9642 $DBversion = "3.19.00.001";
9643 if ( CheckVersion($DBversion) ) {
9644     $dbh->do("
9645         UPDATE systempreferences
9646         SET options = 'public|school|academic|research|private|societyAssociation|corporate|government|religiousOrg|subscription'
9647         WHERE variable = 'UsageStatsLibraryType'
9648     ");
9649     if ( C4::Context->preference("UsageStatsLibraryType") eq "university" ) {
9650         C4::Context->set_preference("UsageStatsLibraryType", "academic")
9651     }
9652     print "Upgrade to $DBversion done (Bug 13436: Add more options to UsageStatsLibraryType)\n";
9653     SetVersion ($DBversion);
9654 }
9655
9656 $DBversion = "3.19.00.002";
9657 if ( CheckVersion($DBversion) ) {
9658     $dbh->do(q|
9659         UPDATE suggestions SET branchcode="" WHERE branchcode="__ANY__"
9660     |);
9661     print "upgrade to $DBversion done (Bug 10753: replace __ANY__ with empty string in suggestions.branchcode)\n";
9662     SetVersion ($DBversion);
9663 }
9664
9665 $DBversion = "3.19.00.003";
9666 if ( CheckVersion($DBversion) ) {
9667     my ($count) = $dbh->selectrow_array("SELECT COUNT(*) FROM borrowers GROUP BY userid HAVING COUNT(userid) > 1");
9668
9669     if ( $count ) {
9670         print "Upgrade to $DBversion done (Bug 1861 - Unique patrons logins not (totally) enforced) FAILED!\n";
9671         print "Your database has users with duplicate user logins. Please have your administrator deduplicate your user logins.\n";
9672         print "Afterward, your Koha administrator should execute the following database query: ALTER TABLE borrowers DROP INDEX userid, ADD UNIQUE userid (userid)";
9673     } else {
9674         $dbh->do(q{
9675             ALTER TABLE borrowers
9676                 DROP INDEX userid ,
9677                 ADD UNIQUE userid (userid)
9678         });
9679         print "Upgrade to $DBversion done (Bug 1861: Unique patrons logins not (totally) enforced)\n";
9680     }
9681     SetVersion ($DBversion);
9682 }
9683
9684 $DBversion = "3.19.00.004";
9685 if ( CheckVersion($DBversion) ) {
9686     my $pref_value = C4::Context->preference('OpacExportOptions');
9687     $pref_value =~ s/\|/,/g; # multiple is separated by ,
9688     $dbh->do(q{
9689         UPDATE systempreferences
9690             SET value = ?,
9691                 type = 'multiple'
9692         WHERE variable = 'OpacExportOptions'
9693     }, {}, $pref_value );
9694     print "Upgrade to $DBversion done (Bug 13346: OpacExportOptions is now multiple)\n";
9695     SetVersion ($DBversion);
9696 }
9697
9698 $DBversion = "3.19.00.005";
9699 if(CheckVersion($DBversion)) {
9700     $dbh->do(q{
9701         ALTER TABLE authorised_values MODIFY COLUMN category VARCHAR(32) NOT NULL DEFAULT ''
9702     });
9703
9704     $dbh->do(q{
9705         ALTER TABLE borrower_attribute_types MODIFY COLUMN authorised_value_category VARCHAR(32) DEFAULT NULL
9706     });
9707
9708     print "Upgrade to $DBversion done (Bug 13379: Modify authorised_values.category to varchar(32))\n";
9709     SetVersion($DBversion);
9710 }
9711
9712 $DBversion = "3.19.00.006";
9713 if ( CheckVersion($DBversion) ) {
9714     $dbh->do(q|SET foreign_key_checks = 0|);
9715     my $sth = $dbh->table_info( '','','','TABLE' );
9716     my ( $cat, $schema, $name, $type, $remarks );
9717     while ( ( $cat, $schema, $name, $type, $remarks ) = $sth->fetchrow_array ) {
9718         my $table_sth = $dbh->prepare(qq|SHOW CREATE TABLE $name|);
9719         $table_sth->execute;
9720         my @table = $table_sth->fetchrow_array;
9721         unless ( $table[1] =~ /COLLATE=utf8mb4_unicode_ci/ ) { #catches utf8mb4 collated tables
9722             if ( $name eq 'marc_subfield_structure' ) {
9723                 $dbh->do(q|
9724                     ALTER TABLE marc_subfield_structure
9725                     MODIFY COLUMN tagfield varchar(3) COLLATE utf8_unicode_ci NOT NULL DEFAULT '',
9726                     MODIFY COLUMN tagsubfield varchar(1) COLLATE utf8_bin NOT NULL DEFAULT '',
9727                     MODIFY COLUMN liblibrarian varchar(255) COLLATE utf8_unicode_ci NOT NULL DEFAULT '',
9728                     MODIFY COLUMN libopac varchar(255) COLLATE utf8_unicode_ci NOT NULL DEFAULT '',
9729                     MODIFY COLUMN kohafield varchar(40) COLLATE utf8_unicode_ci DEFAULT NULL,
9730                     MODIFY COLUMN authorised_value varchar(20) COLLATE utf8_unicode_ci DEFAULT NULL,
9731                     MODIFY COLUMN authtypecode varchar(20) COLLATE utf8_unicode_ci DEFAULT NULL,
9732                     MODIFY COLUMN value_builder varchar(80) COLLATE utf8_unicode_ci DEFAULT NULL,
9733                     MODIFY COLUMN frameworkcode varchar(4) COLLATE utf8_unicode_ci NOT NULL DEFAULT '',
9734                     MODIFY COLUMN seealso varchar(1100) COLLATE utf8_unicode_ci DEFAULT NULL,
9735                     MODIFY COLUMN link varchar(80) COLLATE utf8_unicode_ci DEFAULT NULL
9736                 |);
9737                 $dbh->do(qq|ALTER TABLE $name CHARACTER SET utf8 COLLATE utf8_unicode_ci|);
9738             }
9739             else {
9740                 $dbh->do(qq|ALTER TABLE $name CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci|);
9741             }
9742         }
9743     }
9744     $dbh->do(q|SET foreign_key_checks = 1|);;
9745
9746     print "Upgrade to $DBversion done (Bug 11944: Convert DB tables to utf8_unicode_ci)\n";
9747     SetVersion($DBversion);
9748 }
9749
9750 $DBversion = "3.19.00.007";
9751 if ( CheckVersion($DBversion) ) {
9752     my $orphan_budgets = $dbh->selectall_arrayref(q|
9753         SELECT budget_id, budget_name, budget_code
9754         FROM aqbudgets
9755         WHERE   budget_parent_id IS NOT NULL
9756             AND budget_parent_id NOT IN (
9757                 SELECT DISTINCT budget_id FROM aqbudgets
9758             )
9759     |, { Slice => {} } );
9760
9761     if ( @$orphan_budgets ) {
9762         for my $b ( @$orphan_budgets ) {
9763             print "Fund $b->{budget_name} (code:$b->{budget_code}, id:$b->{budget_id}) does not have a parent, it may cause problem\n";
9764         }
9765         print "Upgrade to $DBversion done (Bug 12905: Check budget integrity: FAIL)\n";
9766     } else {
9767         print "Upgrade to $DBversion done (Bug 12905: Check budget integrity: OK)\n";
9768     }
9769     SetVersion ($DBversion);
9770 }
9771
9772 $DBversion = "3.19.00.008";
9773 if ( CheckVersion($DBversion) ) {
9774     my $number_of_orders_not_linked = $dbh->selectcol_arrayref(q|
9775         SELECT COUNT(*)
9776         FROM aqorders o
9777         WHERE NOT EXISTS (
9778             SELECT NULL
9779             FROM aqbudgets b
9780             WHERE b.budget_id = o.budget_id
9781         );
9782     |);
9783
9784     if ( $number_of_orders_not_linked->[0] > 0 ) {
9785         $dbh->do(q|
9786             INSERT INTO aqbudgetperiods(budget_period_startdate, budget_period_enddate, budget_period_active, budget_period_description, budget_period_total) VALUES ( CAST(NOW() AS date), CAST(NOW() AS date), 0, "WARNING: This budget has been automatically created by the updatedatabase script, please see bug 12601 for more information", 0)
9787         |);
9788         my $budget_period_id = $dbh->last_insert_id( undef, undef, 'aqbudgetperiods', undef );
9789         $dbh->do(qq|
9790             INSERT INTO aqbudgets(budget_code, budget_name, budget_amount, budget_period_id) VALUES ( "BACKUP_TMP", "WARNING: fund created by the updatedatabase script, please see bug 12601", 0, $budget_period_id );
9791         |);
9792         my $budget_id = $dbh->last_insert_id( undef, undef, 'aqbudgets', undef );
9793         $dbh->do(qq|
9794             UPDATE aqorders o
9795             SET budget_id = $budget_id
9796             WHERE NOT EXISTS (
9797                 SELECT NULL
9798                 FROM aqbudgets b
9799                 WHERE b.budget_id = o.budget_id
9800             )
9801         |);
9802     }
9803
9804     $dbh->do(q|
9805         ALTER TABLE aqorders
9806         ADD CONSTRAINT aqorders_budget_id_fk FOREIGN KEY (budget_id) REFERENCES aqbudgets(budget_id) ON DELETE CASCADE ON UPDATE CASCADE
9807     |);
9808
9809     print "Upgrade to $DBversion done (Bug 12601: Add new foreign key aqorders.budget_id" . ( ( $number_of_orders_not_linked->[0] > 0 )  ? ' WARNING: temporary budget and fund have been created (search for "BACKUP_TMP"). At least one of your order was not linked to a budget' : '' ) . ")\n";
9810     SetVersion($DBversion);
9811 }
9812
9813 $DBversion = "3.19.00.009";
9814 if ( CheckVersion($DBversion) ) {
9815     $dbh->do(q|
9816         UPDATE suggestions s SET s.budgetid = NULL
9817         WHERE NOT EXISTS (
9818             SELECT NULL
9819             FROM aqbudgets b
9820             WHERE b.budget_id = s.budgetid
9821         );
9822     |);
9823
9824     $dbh->do(q|
9825         ALTER TABLE suggestions
9826         ADD CONSTRAINT suggestions_budget_id_fk FOREIGN KEY (budgetid) REFERENCES aqbudgets(budget_id) ON DELETE SET NULL ON UPDATE CASCADE
9827     |);
9828
9829     print "Upgrade to $DBversion done (Bug 13007: Add new foreign key suggestions.budgetid)\n";
9830     SetVersion($DBversion);
9831 }
9832
9833 $DBversion = "3.19.00.010";
9834 if ( CheckVersion($DBversion) ) {
9835     $dbh->do(q|
9836         INSERT IGNORE INTO systempreferences (variable,value,explanation,options,type)
9837         VALUES('SessionRestrictionByIP','1','Check for Change in  Remote IP address for Session Security. Disable when remote ip address changes frequently.','','YesNo')
9838     |);
9839     print "Upgrade to $DBversion done (Bug 5511: SessionRestrictionByIP)\n";
9840     SetVersion ($DBversion);
9841 }
9842
9843 $DBversion = "3.19.00.011";
9844 if ( CheckVersion($DBversion) ) {
9845     $dbh->do(q|
9846         INSERT INTO userflags (bit, flag, flagdesc, defaulton) VALUES
9847         (20, 'lists', 'Lists', 0)
9848     |);
9849     $dbh->do(q|
9850         INSERT INTO permissions (module_bit, code, description) VALUES
9851         (20, 'delete_public_lists', 'Delete public lists')
9852     |);
9853     print "Upgrade to $DBversion done (Bug 13417: Add permission to delete public lists)\n";
9854     SetVersion ($DBversion);
9855 }
9856
9857 $DBversion = "3.19.00.012";
9858 if(CheckVersion($DBversion)) {
9859     $dbh->do(q{
9860         ALTER TABLE biblioitems MODIFY COLUMN marcxml longtext
9861     });
9862
9863     $dbh->do(q{
9864         ALTER TABLE deletedbiblioitems MODIFY COLUMN marcxml longtext
9865     });
9866
9867     print "Upgrade to $DBversion done (Bug 13523 Remove NOT NULL restriction on field marcxml due to mysql STRICT_TRANS_TABLES)\n";
9868     SetVersion ($DBversion);
9869 }
9870
9871 $DBversion = "3.19.00.013";
9872 if ( CheckVersion($DBversion) ) {
9873     $dbh->do(q|
9874         INSERT INTO permissions (module_bit, code, description) VALUES
9875           (13, 'records_batchmod', 'Perform batch modification of records (biblios or authorities)')
9876     |);
9877     print "Upgrade to $DBversion done (Bug 11395: Add permission tools_records_batchmod)\n";
9878     SetVersion($DBversion);
9879 }
9880
9881 $DBversion = "3.19.00.014";
9882 if ( CheckVersion($DBversion) ) {
9883     $dbh->do(q|
9884         CREATE TABLE aqorder_users (
9885             ordernumber int(11) NOT NULL,
9886             borrowernumber int(11) NOT NULL,
9887             PRIMARY KEY (ordernumber, borrowernumber),
9888             CONSTRAINT aqorder_users_ibfk_1 FOREIGN KEY (ordernumber) REFERENCES aqorders (ordernumber) ON DELETE CASCADE ON UPDATE CASCADE,
9889             CONSTRAINT aqorder_users_ibfk_2 FOREIGN KEY (borrowernumber) REFERENCES borrowers (borrowernumber) ON DELETE CASCADE ON UPDATE CASCADE
9890         ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
9891     |);
9892
9893     $dbh->do(q|
9894         INSERT INTO letter(module, code, branchcode, name, title, content, message_transport_type)
9895         VALUES ('acquisition', 'ACQ_NOTIF_ON_RECEIV', '', 'Notification on receiving', 'Order received', 'Dear <<borrowers.firstname>> <<borrowers.surname>>,\n\n The order <<aqorders.ordernumber>> (<<biblio.title>>) has been received.\n\nYour library.', 'email')
9896     |);
9897     print "Upgrade to $DBversion done (Bug 12648: Add letter ACQ_NOTIF_ON_RECEIV )\n";
9898     SetVersion ($DBversion);
9899 }
9900
9901 $DBversion = "3.19.00.015";
9902 if ( CheckVersion($DBversion) ) {
9903     $dbh->do(q|
9904         ALTER TABLE search_history ADD COLUMN id INT(11) NOT NULL AUTO_INCREMENT FIRST, ADD PRIMARY KEY(id);
9905     |);
9906     print "Upgrade to $DBversion done (Bug 11430: Add primary key for search_history)\n";
9907     SetVersion ($DBversion);
9908 }
9909
9910 $DBversion = "3.19.00.016";
9911 if(CheckVersion($DBversion)) {
9912     my @order_cancellation_reason = $dbh->selectrow_array("SELECT count(*) FROM authorised_values WHERE category='ORDER_CANCELLATION_REASON'");
9913     if ($order_cancellation_reason[0] == 0) {
9914         $dbh->do(q{
9915             INSERT INTO authorised_values (category, authorised_value, lib) VALUES
9916              ('ORDER_CANCELLATION_REASON', 0, 'No reason provided'),
9917              ('ORDER_CANCELLATION_REASON', 1, 'Out of stock'),
9918              ('ORDER_CANCELLATION_REASON', 2, 'Restocking')
9919         });
9920
9921         my $already_existing_reasons = $dbh->selectcol_arrayref(q{
9922             SELECT DISTINCT( cancellationreason )
9923             FROM aqorders;
9924         }, { Slice => {} });
9925
9926         my $update_orders_sth = $dbh->prepare(q{
9927             UPDATE aqorders
9928             SET cancellationreason = ?
9929             WHERE cancellationreason = ?
9930         });
9931
9932         my $insert_av_sth = $dbh->prepare(q{
9933             INSERT INTO authorised_values (category, authorised_value, lib) VALUES
9934              ('ORDER_CANCELLATION_REASON', ?, ?)
9935         });
9936         my $i = 3;
9937         for my $reason ( @$already_existing_reasons ) {
9938             next unless $reason;
9939             $insert_av_sth->execute( $i, $reason );
9940             $update_orders_sth->execute( $i, $reason );
9941             $i++;
9942         }
9943         print "Upgrade to $DBversion done (Bug 13380: Add the ORDER_CANCELLATION_REASON authorised value)\n";
9944     }
9945     else {
9946         print "Upgrade to $DBversion done (Bug 13380: ORDER_CANCELLATION_REASON authorised value already existed from earlier update!)\n";
9947     }
9948
9949     SetVersion($DBversion);
9950 }
9951
9952 $DBversion = '3.19.00.017';
9953 if ( CheckVersion($DBversion) ) {
9954     # First create the column
9955     $dbh->do("ALTER TABLE issuingrules ADD onshelfholds tinyint(1) default 0 NOT NULL");
9956     # Now update the column
9957     if (C4::Context->preference("AllowOnShelfHolds")){
9958         # Pref is on, set allow for all rules
9959         $dbh->do("UPDATE issuingrules SET onshelfholds=1");
9960     } else {
9961         # If the preference is not set, leave off
9962         $dbh->do("UPDATE issuingrules SET onshelfholds=0");
9963     }
9964     # Remove from the systempreferences table
9965     $dbh->do("DELETE FROM systempreferences WHERE variable = 'AllowOnShelfHolds'");
9966
9967     # First create the column
9968     $dbh->do("ALTER TABLE issuingrules ADD opacitemholds char(1) DEFAULT 'N' NOT NULL");
9969     # Now update the column
9970     my $opacitemholds = C4::Context->preference("OPACItemHolds") || '';
9971     if (lc ($opacitemholds) eq 'force') {
9972         $opacitemholds = 'F';
9973     }
9974     else {
9975         $opacitemholds = $opacitemholds ? 'Y' : 'N';
9976     }
9977     # Set allow for all rules
9978     $dbh->do("UPDATE issuingrules SET opacitemholds='$opacitemholds'");
9979
9980     # Remove from the systempreferences table
9981     $dbh->do("DELETE FROM systempreferences WHERE variable = 'OPACItemHolds'");
9982
9983     print "Upgrade to $DBversion done (Bug 5786: Move AllowOnShelfHolds to circulation matrix; Move OPACItemHolds system preference to circulation matrix)\n";
9984     SetVersion ($DBversion);
9985 }
9986
9987
9988 $DBversion = "3.19.00.018";
9989 if ( CheckVersion($DBversion) ) {
9990     $dbh->do(q|
9991         UPDATE systempreferences set variable="OpacAdditionalStylesheet" WHERE variable="opaccolorstylesheet"
9992     |);
9993     print "Upgrade to $DBversion done (Bug 10328: Rename opaccolorstylesheet to OpacAdditionalStylesheet\n";
9994     SetVersion ($DBversion);
9995 }
9996
9997 $DBversion = "3.19.00.019";
9998 if ( CheckVersion($DBversion) ) {
9999     $dbh->do(q{
10000         INSERT IGNORE INTO systempreferences (variable, value, explanation, options, type)
10001         VALUES('Coce','0', 'If on, enables cover retrieval from the configured Coce server', NULL, 'YesNo')
10002     });
10003     $dbh->do(q{
10004         INSERT IGNORE INTO systempreferences (variable, value, explanation, options, type)
10005         VALUES('CoceHost', NULL, 'Coce server URL', NULL,'Free')
10006     });
10007     $dbh->do(q{
10008         INSERT IGNORE INTO systempreferences (variable, value, explanation, options, type)
10009         VALUES('CoceProviders', NULL, 'Coce providers', 'aws,gb,ol', 'multiple')
10010     });
10011     print "Upgrade to $DBversion done (Bug 9580: Cover image from Coce, a remote image URL cache)\n";
10012     SetVersion($DBversion);
10013 }
10014
10015 $DBversion = "3.19.00.020";
10016 if ( CheckVersion($DBversion) ) {
10017     $dbh->do(q|
10018         ALTER TABLE aqorders DROP COLUMN supplierreference;
10019     |);
10020
10021     print "Upgrade to $DBversion done (Bug 11008: DROP column aqorders.supplierreference)\n";
10022     SetVersion($DBversion);
10023 }
10024
10025 $DBversion = "3.19.00.021";
10026 if ( CheckVersion($DBversion) ) {
10027     $dbh->do(q|
10028         ALTER TABLE issues DROP COLUMN issuingbranch
10029     |);
10030     $dbh->do(q|
10031         ALTER TABLE old_issues DROP COLUMN issuingbranch
10032     |);
10033     print "Upgrade to $DBversion done (Bug 2806: Remove issuingbranch columns)\n";
10034     SetVersion ($DBversion);
10035 }
10036
10037 $DBversion = '3.19.00.022';
10038 if ( CheckVersion($DBversion) ) {
10039     $dbh->do(q{
10040         ALTER TABLE suggestions DROP COLUMN mailoverseeing;
10041     });
10042     print "Upgrade to $DBversion done (Bug 13006: Drop column suggestion.mailoverseeing)\n";
10043     SetVersion($DBversion);
10044 }
10045
10046 $DBversion = "3.19.00.023";
10047 if ( CheckVersion($DBversion) ) {
10048     $dbh->do(q|
10049         DELETE FROM systempreferences where variable = 'AddPatronLists'
10050     |);
10051     print "Upgrade to $DBversion done (Bug 13497: Remove the AddPatronLists system preferences)\n";
10052     SetVersion ($DBversion);
10053 }
10054
10055 $DBversion = "3.19.00.024";
10056 if ( CheckVersion($DBversion) ) {
10057     $dbh->do(qq|DROP table patroncards;|);
10058     print "Upgrade to $DBversion done (Bug 13539: Remove table patroncards from database as it's no longer in use)\n";
10059     SetVersion ($DBversion);
10060 }
10061
10062 $DBversion = "3.19.00.025";
10063 if ( CheckVersion($DBversion) ) {
10064     $dbh->do(q|
10065         INSERT INTO systempreferences ( variable, value, options, explanation, type ) VALUES
10066         ('SearchWithISBNVariations','0',NULL,'If enabled, search on all variations of the ISBN','YesNo')
10067     |);
10068     print "Upgrade to $DBversion done (Bug 13528: Add the SearchWithISBNVariations syspref)\n";
10069     SetVersion ($DBversion);
10070 }
10071
10072 $DBversion = "3.19.00.026";
10073 if( CheckVersion($DBversion) ) {
10074     if ( C4::Context->preference('marcflavour') eq 'MARC21' ) {
10075     $dbh->do(q{
10076         INSERT IGNORE INTO auth_tag_structure (authtypecode, tagfield, liblibrarian, libopac, repeatable, mandatory, authorised_value) VALUES
10077         ('', '388', 'TIME PERIOD OF CREATION', 'TIME PERIOD OF CREATION', 1, 0, NULL);
10078     });
10079
10080     $dbh->do(q{
10081         INSERT IGNORE INTO auth_subfield_structure (authtypecode, tagfield, tagsubfield, liblibrarian, libopac, repeatable,
10082         mandatory, tab, authorised_value, value_builder, seealso, isurl, hidden, linkid, kohafield, frameworkcode) VALUES
10083         ('', '388', '0', 'Authority record control number or standard number', 'Authority record control number or standard number', 1, 0, 3, NULL, NULL, NULL, 0, 0, '', '', ''),
10084         ('', '388', '2', 'Source of term', 'Source of term', 0, 0, 3, NULL, NULL, NULL, 0, 0, '', '', ''),
10085         ('', '388', '3', 'Materials specified', 'Materials specified', 0, 0, 3, NULL, NULL, NULL, 0, 0, '', '', ''),
10086         ('', '388', '6', 'Linkage', 'Linkage', 0, 0, 3, NULL, NULL, NULL, 0, 0, '', '', ''),
10087         ('', '388', '8', 'Field link and sequence number', 'Field link and sequence number', 1, 0, 3, NULL, NULL, NULL, 0, 0, '', '', ''),
10088         ('', '388', 'a', 'Time period of creation term', 'Time period of creation term', 1, 0, 3, NULL, NULL, NULL, 0, 0, '', '', '');
10089     });
10090
10091     $dbh->do(q{
10092         UPDATE IGNORE auth_subfield_structure SET repeatable = 1 WHERE tagsubfield = 'g' AND tagfield IN
10093         ('100','110','111','130','400','410','411','430','500','510','511','530','700','710','730');
10094     });
10095
10096     $dbh->do(q{
10097         INSERT IGNORE INTO auth_subfield_structure (authtypecode, tagfield, tagsubfield, liblibrarian, libopac, repeatable,
10098         mandatory, tab, authorised_value, value_builder, seealso, isurl, hidden, linkid, kohafield, frameworkcode) VALUES
10099         ('', '150', 'g', 'Miscellaneous information', 'Miscellaneous information', 1, 0, 1, NULL, NULL, NULL, 0, 0, '', '', ''),
10100         ('', '151', 'g', 'Miscellaneous information', 'Miscellaneous information', 1, 0, 1, NULL, NULL, NULL, 0, 0, '', '', ''),
10101         ('', '450', 'g', 'Miscellaneous information', 'Miscellaneous information', 1, 0, 4, NULL, NULL, NULL, 0, 0, '', '', ''),
10102         ('', '451', 'g', 'Miscellaneous information', 'Miscellaneous information', 1, 0, 4, NULL, NULL, NULL, 0, 0, '', '', ''),
10103         ('', '550', 'g', 'Miscellaneous information', 'Miscellaneous information', 1, 0, 5, NULL, NULL, NULL, 0, 0, '', '', ''),
10104         ('', '551', 'g', 'Miscellaneous information', 'Miscellaneous information', 1, 0, 5, NULL, NULL, NULL, 0, 0, '', '', ''),
10105         ('', '750', 'g', 'Miscellaneous information', 'Miscellaneous information', 1, 0, 7, NULL, NULL, NULL, 0, 0, '', '', ''),
10106         ('', '751', 'g', 'Miscellaneous information', 'Miscellaneous information', 1, 0, 7, NULL, NULL, NULL, 0, 0, '', '', ''),
10107         ('', '748', 'i', 'Relationship information', 'Relationship information', 1, 0, 7, NULL, NULL, NULL, 0, 0, '', '', ''),
10108         ('', '755', 'i', 'Relationship information', 'Relationship information', 1, 0, 7, NULL, NULL, NULL, 0, 0, '', '', ''),
10109         ('', '780', 'i', 'Relationship information', 'Relationship information', 1, 0, 7, NULL, NULL, NULL, 0, 0, '', '', ''),
10110         ('', '781', 'i', 'Relationship information', 'Relationship information', 1, 0, 7, NULL, NULL, NULL, 0, 0, '', '', ''),
10111         ('', '782', 'i', 'Relationship information', 'Relationship information', 1, 0, 7, NULL, NULL, NULL, 0, 0, '', '', ''),
10112         ('', '785', 'i', 'Relationship information', 'Relationship information', 1, 0, 7, NULL, NULL, NULL, 0, 0, '', '', ''),
10113         ('', '710', '4', 'Relationship code', 'Relationship code', 1, 0, 7, NULL, NULL, NULL, 0, 0, '', '', ''),
10114         ('', '730', '4', 'Relationship code', 'Relationship code', 1, 0, 7, NULL, NULL, NULL, 0, 0, '', '', ''),
10115         ('', '748', '4', 'Relationship code', 'Relationship code', 1, 0, 7, NULL, NULL, NULL, 0, 0, '', '', ''),
10116         ('', '750', '4', 'Relationship code', 'Relationship code', 1, 0, 7, NULL, NULL, NULL, 0, 0, '', '', ''),
10117         ('', '751', '4', 'Relationship code', 'Relationship code', 1, 0, 7, NULL, NULL, NULL, 0, 0, '', '', ''),
10118         ('', '755', '4', 'Relationship code', 'Relationship code', 1, 0, 7, NULL, NULL, NULL, 0, 0, '', '', ''),
10119         ('', '762', '4', 'Relationship code', 'Relationship code', 1, 0, 7, NULL, NULL, NULL, 0, 0, '', '', ''),
10120         ('', '780', '4', 'Relationship code', 'Relationship code', 1, 0, 7, NULL, NULL, NULL, 0, 0, '', '', ''),
10121         ('', '781', '4', 'Relationship code', 'Relationship code', 1, 0, 7, NULL, NULL, NULL, 0, 0, '', '', ''),
10122         ('', '782', '4', 'Relationship code', 'Relationship code', 1, 0, 7, NULL, NULL, NULL, 0, 0, '', '', ''),
10123         ('', '785', '4', 'Relationship code', 'Relationship code', 1, 0, 7, NULL, NULL, NULL, 0, 0, '', '', ''),
10124         ('', '788', '4', 'Relationship code', 'Relationship code', 1, 0, 7, NULL, NULL, NULL, 0, 0, '', '', '');
10125     });
10126
10127     $dbh->do(q{
10128         UPDATE IGNORE auth_subfield_structure SET liblibrarian = 'Relationship information', libopac = 'Relationship information'
10129         WHERE tagsubfield = 'i' AND tagfield IN ('700','710','730','750','751','762');
10130     });
10131
10132     $dbh->do(q{
10133         UPDATE IGNORE auth_subfield_structure SET liblibrarian = 'Relationship code', libopac = 'Relationship code'
10134         WHERE tagsubfield = '4' AND tagfield IN ('700','710');
10135     });
10136
10137     $dbh->do(q{
10138         INSERT IGNORE INTO marc_tag_structure (tagfield, liblibrarian, libopac, repeatable, mandatory, authorised_value, frameworkcode) VALUES
10139         ('370', 'ASSOCIATED PLACE', 'ASSOCIATED PLACE', 1, 0, NULL, ''),
10140         ('388', 'TIME PERIOD OF CREATION', 'TIME PERIOD OF CREATION', 1, 0, NULL, '');
10141     });
10142
10143     $dbh->do(q{
10144         INSERT IGNORE INTO marc_subfield_structure (tagfield, tagsubfield, liblibrarian, libopac, repeatable, mandatory,
10145         kohafield, tab, authorised_value, authtypecode, value_builder, isurl, hidden, frameworkcode, seealso, link, defaultvalue) VALUES
10146         ('370', '0', 'Authority record control number or standard number', 'Authority record control number or standard number', 1, 0, '', 3, '', '', '', NULL, -6, '', '', '', NULL),
10147         ('370', '2', 'Source of term', 'Source of term', 0, 0, '', 3, '', '', '', NULL, -6, '', '', '', NULL),
10148         ('370', '6', 'Linkage', 'Linkage', 0, 0, '', 3, '', '', '', NULL, -6, '', '', '', NULL),
10149         ('370', '8', 'Field link and sequence number', 'Field link and sequence number', 1, 0, '', 3, '', '', '', NULL, -6, '', '', '', NULL),
10150         ('370', 'c', 'Associated country', 'Associated country', 1, 0, '', 3, '', '', '', NULL, -6, '', '', '', NULL),
10151         ('370', 'f', 'Other associated place', 'Other associated place', 1, 0, '', 3, '', '', '', NULL, -6, '', '', '', NULL),
10152         ('370', 'g', 'Place of origin of work', 'Place of origin of work', 1, 0, '', 3, '', '', '', NULL, -6, '', '', '', NULL),
10153         ('370', 's', 'Start period', 'Start period', 0, 0, '', 3, '', '', '', NULL, -6, '', '', '', NULL),
10154         ('370', 't', 'End period', 'End period', 0, 0, '', 3, '', '', '', NULL, -6, '', '', '', NULL),
10155         ('370', 'u', 'Uniform Resource Identifier', 'Uniform Resource Identifier', 1, 0, '', 3, '', '', '', NULL, -6, '', '', '', NULL),
10156         ('370', 'v', 'Source of information', 'Source of information', 1, 0, '', 3, '', '', '', NULL, -6, '', '', '', NULL),
10157         ('377', 'l', 'Language term', 'Language term', 1, 0, '', 3, '', '', '', NULL, -6, '', '', '', NULL),
10158         ('382', 's', 'Total number of performers', 'Total number of performers', 0, 0, '', 3, '', '', '', NULL, -6, '', '', '', NULL),
10159         ('388', '0', 'Authority record control number or standard number', 'Authority record control number or standard number', 1, 0, '', 3, '', '', '', NULL, -6, '', '', '', NULL),
10160         ('388', '2', 'Source of term', 'Source of term', 0, 0, '', 3, '', '', '', NULL, -6, '', '', '', NULL),
10161         ('388', '3', ' Materials specified', ' Materials specified', 0, 0, '', 3, '', '', '', NULL, -6, '', '', '', NULL),
10162         ('388', '6', ' Linkage', ' Linkage', 0, 0, '', 3, '', '', '', NULL, -6, '', '', '', NULL),
10163         ('388', '8', 'Field link and sequence number', 'Field link and sequence number', 1, 0, '', 3, '', '', '', NULL, -6, '', '', '', NULL),
10164         ('388', 'a', 'Time period of creation term', 'Time period of creation term', 1, 0, '', 3, '', '', '', NULL, -6, '', '', '', NULL),
10165         ('650', 'g', 'Miscellaneous information', 'Miscellaneous information', 1, 0, '', 6, '', '', '', 0, -1, '', '', '', NULL),
10166         ('651', 'g', 'Miscellaneous information', 'Miscellaneous information', 1, 0, '', 6, '', '', '', 0, -1, '', '', '', NULL);
10167     });
10168
10169     $dbh->do(q{
10170         UPDATE IGNORE marc_subfield_structure SET repeatable = 1 WHERE tagsubfield = 'g' AND
10171         tagfield IN ('100','110','111','130','240','243','246','247','600','610','611','630','700','710','711','730','800','810','811','830');
10172     });
10173     }
10174
10175     print "Upgrade to $DBversion done (Bug 13322: Update MARC21 frameworks to Update No. 19 - October 2014)\n";
10176     SetVersion($DBversion);
10177 }
10178
10179 $DBversion = '3.19.00.027';
10180 if ( CheckVersion($DBversion) ) {
10181     $dbh->do("ALTER TABLE items ADD COLUMN itemnotes_nonpublic MEDIUMTEXT AFTER itemnotes");
10182     $dbh->do("ALTER TABLE deleteditems ADD COLUMN itemnotes_nonpublic MEDIUMTEXT AFTER itemnotes");
10183     print "Upgrade to $DBversion done (Bug 4222: Nonpublic note not appearing in the staff client) <b>Please check each of your frameworks to ensure your non-public item notes are mapped to items.itemnotes_nonpublic. After doing so please have your administrator run misc/batchRebuildItemsTables.pl </b>)\n";
10184     SetVersion($DBversion);
10185 }
10186
10187 $DBversion = "3.19.00.028";
10188 if( CheckVersion($DBversion) ) {
10189     eval {
10190         local $dbh->{PrintError} = 0;
10191         $dbh->do(q{
10192             ALTER TABLE issues DROP PRIMARY KEY
10193         });
10194     };
10195
10196     $dbh->do(q{
10197         ALTER TABLE old_issues ADD issue_id INT( 11 ) NOT NULL AUTO_INCREMENT PRIMARY KEY FIRST
10198     });
10199
10200     $dbh->do(q{
10201         ALTER TABLE old_issues CHANGE issue_id issue_id INT( 11 ) NOT NULL
10202     });
10203
10204     $dbh->do(q{
10205         ALTER TABLE issues ADD issue_id INT( 11 ) NOT NULL AUTO_INCREMENT PRIMARY KEY FIRST
10206     });
10207
10208     $dbh->do(q{
10209         UPDATE issues SET issue_id = issue_id + ( SELECT COUNT(*) FROM old_issues ) ORDER BY issue_id DESC
10210     });
10211
10212     my $max_issue_id = $schema->resultset('Issue')->get_column('issue_id')->max();
10213     if ($max_issue_id) {
10214         $max_issue_id++;
10215         $dbh->do(qq{
10216             ALTER TABLE issues AUTO_INCREMENT = $max_issue_id
10217         });
10218     }
10219
10220     print "Upgrade to $DBversion done (Bug 13790: Add unique id issue_id to issues and oldissues tables)\n";
10221     SetVersion($DBversion);
10222 }
10223
10224 $DBversion = "3.19.00.029";
10225 if ( CheckVersion($DBversion) ) {
10226     $dbh->do(q|
10227          ALTER TABLE sessions CHANGE COLUMN a_session a_session MEDIUMTEXT
10228     |);
10229     print "Upgrade to $DBversion done (Bug 13606: Upgrade sessions.a_session to MEDIUMTEXT)\n";
10230     SetVersion($DBversion);
10231 }
10232
10233 $DBversion = "3.19.00.030";
10234 if ( CheckVersion($DBversion) ) {
10235     $dbh->do(q|
10236 UPDATE language_subtag_registry SET subtag = 'kn' WHERE subtag = 'ka' AND description = 'Kannada';
10237     |);
10238     $dbh->do(q|
10239 UPDATE language_rfc4646_to_iso639 SET rfc4646_subtag = 'kn' WHERE rfc4646_subtag = 'ka' AND iso639_2_code = 'kan';
10240     |);
10241     $dbh->do(q|
10242 UPDATE language_descriptions SET subtag = 'kn', lang = 'kn' WHERE subtag = 'ka' AND lang = 'ka' AND description = 'ಕನ್ನಡ';
10243     |);
10244     $dbh->do(q|
10245 UPDATE language_descriptions SET subtag = 'kn' WHERE subtag = 'ka' AND description = 'Kannada';
10246     |);
10247     $dbh->do(q|
10248 INSERT IGNORE INTO language_subtag_registry( subtag, type, description, added) VALUES ( 'ka', 'language', 'Georgian','2015-04-20');
10249     |);
10250     $dbh->do(q|
10251 DELETE FROM language_subtag_registry
10252        WHERE NOT id IN
10253          (SELECT id FROM
10254            (SELECT MIN(id) as id,subtag,type,description,added
10255             FROM language_subtag_registry
10256             GROUP BY subtag,type,description,added)
10257            AS subtable);
10258     |);
10259     $dbh->do(q|
10260 INSERT IGNORE INTO language_rfc4646_to_iso639(rfc4646_subtag,iso639_2_code) VALUES ( 'ka', 'geo');
10261     |);
10262     $dbh->do(q|
10263 DELETE FROM language_rfc4646_to_iso639
10264        WHERE NOT id IN
10265          (SELECT id FROM
10266            (SELECT MIN(id) as id,rfc4646_subtag,iso639_2_code
10267             FROM language_rfc4646_to_iso639
10268             GROUP BY rfc4646_subtag,iso639_2_code)
10269            AS subtable);
10270     |);
10271     $dbh->do(q|
10272 INSERT IGNORE INTO language_descriptions(subtag, type, lang, description) VALUES ( 'ka', 'language', 'ka', 'ქართული');
10273     |);
10274     $dbh->do(q|
10275 INSERT IGNORE INTO language_descriptions(subtag, type, lang, description) VALUES ( 'ka', 'language', 'en', 'Georgian');
10276     |);
10277     $dbh->do(q|
10278 INSERT IGNORE INTO language_descriptions(subtag, type, lang, description) VALUES ( 'ka', 'language', 'fr', 'Géorgien');
10279     |);
10280     $dbh->do(q|
10281 INSERT IGNORE INTO language_descriptions(subtag, type, lang, description) VALUES ( 'ka', 'language', 'de', 'Georgisch');
10282     |);
10283     $dbh->do(q|
10284 INSERT IGNORE INTO language_descriptions(subtag, type, lang, description) VALUES ( 'ka', 'language', 'es', 'Georgiano');
10285     |);
10286     $dbh->do(q|
10287 DELETE FROM language_descriptions
10288        WHERE NOT id IN
10289          (SELECT id FROM
10290            (SELECT MIN(id) as id,subtag,type,lang,description
10291             FROM language_descriptions GROUP BY subtag,type,lang,description)
10292            AS subtable);
10293     |);
10294     print "Upgrade to $DBversion done (Bug 14030: Add Georgian language and fix Kannada language code)\n";
10295     SetVersion($DBversion);
10296 }
10297
10298 $DBversion = "3.19.00.031";
10299 if ( CheckVersion($DBversion) ) {
10300     $dbh->do(q{
10301         INSERT IGNORE INTO systempreferences (variable,value,explanation,options,type)
10302         VALUES('IdRef','0','Disable/enable the IdRef webservice from the OPAC detail page.',NULL,'YesNo')
10303     });
10304     print "Upgrade to $DBversion done (Bug 8992: Add system preference IdRef))\n";
10305     SetVersion($DBversion);
10306 }
10307
10308 $DBversion = "3.19.00.032";
10309 if ( CheckVersion($DBversion) ) {
10310     $dbh->do(q|
10311         INSERT IGNORE INTO systempreferences (variable,value,explanation,options,type)
10312         VALUES('AddressFormat','us','Choose format to display postal addresses','','Choice')
10313     |);
10314     print "Upgrade to $DBversion done (Bug 4041: Address Format as a I18N/L10N system preference\n";
10315     SetVersion ($DBversion);
10316 }
10317
10318 $DBversion = "3.19.00.033";
10319 if ( CheckVersion($DBversion) ) {
10320     $dbh->do(q|
10321         ALTER TABLE auth_header
10322         CHANGE COLUMN datemodified modification_time TIMESTAMP NOT NULL default CURRENT_TIMESTAMP
10323     |);
10324     $dbh->do(q|
10325         ALTER TABLE auth_header
10326         CHANGE COLUMN modification_time modification_time TIMESTAMP NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP
10327     |);
10328     print "Upgrade to $DBversion done (Bug 11165: Update auth_header.datemodified when updated)\n";
10329     SetVersion ($DBversion);
10330 }
10331
10332 $DBversion = "3.19.00.034";
10333 if ( CheckVersion($DBversion) ) {
10334     $dbh->do(q|
10335         INSERT IGNORE INTO systempreferences (variable,value,options,explanation,type)
10336         VALUES('CardnumberLength', '', '', 'Set a length for card numbers.', 'Free')
10337     |);
10338     print "Upgrade to $DBversion done (Bug 13984: CardnumberLength syspref missing on some setups\n";
10339     SetVersion ($DBversion);
10340 }
10341
10342 $DBversion = "3.19.00.035";
10343 if ( CheckVersion($DBversion) ) {
10344     $dbh->do(q|
10345         INSERT IGNORE INTO systempreferences (variable,value,explanation,options,type) VALUES('useDischarge','','Allows librarians to discharge borrowers and borrowers to request a discharge','','YesNo')
10346     |);
10347     $dbh->do(q|
10348         INSERT IGNORE INTO letter (module, code, name, title, content) VALUES('members', 'DISCHARGE', 'Discharge', 'Discharge for <<borrowers.firstname>> <<borrowers.surname>>', '<h1>Discharge</h1>\r\n\r\nThe library <<borrowers.branchcode>> certifies that the following borrower :\r\n\r\n    <<borrowers.firstname>> <<borrowers.surname>>\r\n   Cardnumber : <<borrowers.cardnumber>>\r\n\r\nreturned all his documents.')
10349     |);
10350
10351     $dbh->do(q|
10352         ALTER TABLE borrower_debarments CHANGE type type ENUM('SUSPENSION','OVERDUES','MANUAL','DISCHARGE') NOT NULL DEFAULT 'MANUAL'
10353     |);
10354
10355     $dbh->do(q|
10356         CREATE TABLE discharges (
10357           borrower int(11) DEFAULT NULL,
10358           needed timestamp NULL DEFAULT NULL,
10359           validated timestamp NULL DEFAULT NULL,
10360           KEY borrower_discharges_ibfk1 (borrower),
10361           CONSTRAINT borrower_discharges_ibfk1 FOREIGN KEY (borrower) REFERENCES borrowers (borrowernumber) ON DELETE CASCADE ON UPDATE CASCADE
10362         ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
10363     |);
10364
10365     print "Upgrade to $DBversion done (Bug 8007: Add System Preferences useDischarge, the discharge notice and the new table discharges)\n";
10366     SetVersion($DBversion);
10367 }
10368
10369 $DBversion = "3.19.00.036";
10370 if ( CheckVersion($DBversion) ) {
10371     $dbh->do(q|
10372         INSERT IGNORE INTO systempreferences (variable,value,explanation,options,type)
10373         VALUES ('CronjobLog','0',NULL,'If ON, log information from cron jobs.','YesNo')
10374     |);
10375     print "Upgrade to $DBversion done (Bug 13889: Add cron jobs information to system log)\n";
10376     SetVersion ($DBversion);
10377 }
10378
10379 $DBversion = "3.19.00.037";
10380 if ( CheckVersion($DBversion) ) {
10381     $dbh->do(q|
10382         ALTER TABLE marc_subfield_structure
10383         MODIFY COLUMN tagsubfield varchar(1) COLLATE utf8_bin NOT NULL DEFAULT ''
10384     |);
10385     print "Upgrade to $DBversion done (Bug 13810: Change collate for tagsubfield (utf8_bin))\n";
10386     SetVersion ($DBversion);
10387 }
10388
10389 $DBversion = "3.19.00.038";
10390 if ( CheckVersion($DBversion) ) {
10391     $dbh->do(q|
10392         ALTER TABLE virtualshelves
10393         ADD COLUMN created_on DATETIME NOT NULL AFTER lastmodified
10394     |);
10395     # Set created_on = lastmodified
10396     # I would say it's better than 0000-00-00
10397     # Set modified to the existing value (do not get the current ts!)
10398     $dbh->do(q|
10399         UPDATE virtualshelves
10400         SET created_on = lastmodified, lastmodified = lastmodified
10401     |);
10402     print "Upgrade to $DBversion done (Bug 13421: Add DB field virtualshelves.created_on)\n";
10403     SetVersion ($DBversion);
10404 }
10405
10406 $DBversion = "3.19.00.039";
10407 if ( CheckVersion($DBversion) ) {
10408     print "Upgrade to $DBversion done (Koha 3.20 beta)\n";
10409     SetVersion ($DBversion);
10410 }
10411
10412 $DBversion = "3.19.00.040";
10413 if ( CheckVersion($DBversion) ) {
10414     $dbh->do(q|
10415         ALTER TABLE aqorders DROP COLUMN totalamount
10416     |);
10417     print "Upgrade to $DBversion done (Bug 11006: Drop column aqorders.totalamount)\n";
10418     SetVersion ($DBversion);
10419 }
10420
10421 $DBversion = "3.19.00.041";
10422 if ( CheckVersion($DBversion) ) {
10423     unless ( index_exists( 'suggestions', 'status' ) ) {
10424         $dbh->do(q|
10425             ALTER TABLE suggestions ADD KEY status (STATUS)
10426         |);
10427     }
10428     unless ( index_exists( 'suggestions', 'biblionumber' ) ) {
10429         $dbh->do(q|
10430             ALTER TABLE suggestions ADD KEY biblionumber (biblionumber)
10431         |);
10432     }
10433     unless ( index_exists( 'suggestions', 'branchcode' ) ) {
10434         $dbh->do(q|
10435             ALTER TABLE suggestions ADD KEY branchcode (branchcode)
10436         |);
10437     }
10438     print "Upgrade to $DBversion done (Bug 14132: suggestions table is missing indexes)\n";
10439     SetVersion ($DBversion);
10440 }
10441
10442 $DBversion = "3.19.00.042";
10443 if ( CheckVersion($DBversion) ) {
10444     $dbh->do(q{
10445         DELETE ass.*
10446         FROM auth_subfield_structure AS ass
10447         LEFT JOIN auth_types USING(authtypecode)
10448         WHERE auth_types.authtypecode IS NULL
10449     });
10450
10451     unless ( foreign_key_exists( 'auth_subfield_structure', 'auth_subfield_structure_ibfk_1' ) ) {
10452         $dbh->do(q{
10453             ALTER TABLE auth_subfield_structure
10454             ADD CONSTRAINT auth_subfield_structure_ibfk_1
10455             FOREIGN KEY (authtypecode) REFERENCES auth_types(authtypecode)
10456             ON DELETE CASCADE ON UPDATE CASCADE
10457         });
10458     }
10459
10460     print "Upgrade to $DBversion done (Bug 8480: Add foreign key on auth_subfield_structure.authtypecode)\n";
10461     SetVersion($DBversion);
10462 }
10463
10464 $DBversion = "3.19.00.043";
10465 if ( CheckVersion($DBversion) ) {
10466     $dbh->do(q|
10467         INSERT IGNORE INTO authorised_values (category, authorised_value, lib) VALUES
10468         ('REPORT_GROUP', 'SER', 'Serials')
10469     |);
10470
10471     print "Upgrade to $DBversion done (Bug 5338: Add Serial to the report groups if does not exist)\n";
10472     SetVersion ($DBversion);
10473 }
10474
10475 $DBversion = "3.20.00.000";
10476 if ( CheckVersion($DBversion) ) {
10477     print "Upgrade to $DBversion done (Koha 3.20)\n";
10478     SetVersion ($DBversion);
10479 }
10480
10481 $DBversion = "3.21.00.000";
10482 if ( CheckVersion($DBversion) ) {
10483     print "Upgrade to $DBversion done (El tiempo vuela, un nuevo ciclo comienza.)\n";
10484     SetVersion ($DBversion);
10485 }
10486
10487 $DBversion = "3.21.00.001";
10488 if ( CheckVersion($DBversion) ) {
10489     $dbh->do(q|
10490         UPDATE systempreferences SET variable='IntranetUserJS' where variable='intranetuserjs'
10491     |);
10492     print "Upgrade to $DBversion done (Bug 12160: Rename intranetuserjs to IntranetUserJS)\n";
10493     SetVersion ($DBversion);
10494 }
10495
10496 $DBversion = "3.21.00.002";
10497 if ( CheckVersion($DBversion) ) {
10498     $dbh->do(q|
10499         UPDATE systempreferences SET variable='OPACUserJS' where variable='opacuserjs'
10500     |);
10501     print "Upgrade to $DBversion done (Bug 12160: Rename opacuserjs to OPACUserJS)\n";
10502     SetVersion ($DBversion);
10503 }
10504
10505 $DBversion = "3.21.00.003";
10506 if ( CheckVersion($DBversion) ) {
10507     $dbh->do(q|
10508         INSERT IGNORE INTO language_subtag_registry( subtag, type, description, added)
10509         VALUES ( 'IN', 'region', 'India','2015-05-28');
10510     |);
10511     $dbh->do(q|
10512         INSERT IGNORE INTO language_descriptions(subtag, type, lang, description)
10513         VALUES ( 'IN', 'region', 'en', 'India');
10514     |);
10515     $dbh->do(q|
10516         INSERT IGNORE INTO language_descriptions(subtag, type, lang, description)
10517         VALUES ( 'IN', 'region', 'bn', 'ভারত');
10518     |);
10519     print "Upgrade to $DBversion done (Bug 14285: Add new region India)\n";
10520     SetVersion ($DBversion);
10521 }
10522
10523 $DBversion = '3.21.00.004';
10524 if ( CheckVersion($DBversion) ) {
10525     my $OPACBaseURL = C4::Context->preference('OPACBaseURL');
10526     if (defined($OPACBaseURL) && substr($OPACBaseURL,0,4) ne "http") {
10527         my $explanation = q{Specify the Base URL of the OPAC, e.g., http://opac.mylibrary.com, including the protocol (http:// or https://). Otherwise, the http:// will be added automatically by Koha upon saving.};
10528         $OPACBaseURL = 'http://' . $OPACBaseURL;
10529         my $sth_OPACBaseURL = $dbh->prepare( q{
10530             UPDATE systempreferences SET value=?,explanation=?
10531             WHERE variable='OPACBaseURL'; } );
10532         $sth_OPACBaseURL->execute($OPACBaseURL,$explanation);
10533     }
10534     if (defined($OPACBaseURL)) {
10535         $dbh->do( q{ UPDATE letter
10536                      SET content=replace(content,
10537                                          'http://<<OPACBaseURL>>',
10538                                          '<<OPACBaseURL>>')
10539                      WHERE content LIKE "%http://<<OPACBaseURL>>%"; } );
10540     }
10541
10542     print "Upgrade to $DBversion done (Bug 5010: Fix OPACBaseURL to include protocol)\n";
10543     SetVersion($DBversion);
10544 }
10545
10546 $DBversion = "3.21.00.005";
10547 if ( CheckVersion($DBversion) ) {
10548     $dbh->do(q|
10549         INSERT IGNORE INTO systempreferences (variable,value,explanation,options,type)
10550         VALUES ('ReportsLog','0',NULL,'If ON, log information about reports.','YesNo')
10551     |);
10552     print "Upgrade to $DBversion done (Bug 14024: Add reports to action logs)\n";
10553     SetVersion ($DBversion);
10554 }
10555
10556 $DBversion = "3.21.00.006";
10557 if ( CheckVersion($DBversion) ) {
10558     # Remove the borrow permission flag (bit 7)
10559     $dbh->do(q|
10560         UPDATE borrowers
10561         SET flags = flags - ( flags & (1<<7) )
10562         WHERE flags IS NOT NULL
10563             AND flags > 0
10564     |);
10565     $dbh->do(q|
10566         DELETE FROM userflags WHERE bit=7;
10567     |);
10568     print "Upgrade to $DBversion done (Bug 7976: Remove the 'borrow' permission)\n";
10569     SetVersion($DBversion);
10570 }
10571
10572 $DBversion = "3.21.00.007";
10573 if ( CheckVersion($DBversion) ) {
10574     unless ( index_exists( 'aqbasket', 'authorisedby' ) ) {
10575         $dbh->do(q|
10576             ALTER TABLE aqbasket
10577                 ADD KEY authorisedby (authorisedby)
10578         |);
10579     }
10580     unless ( index_exists( 'aqbooksellers', 'name' ) ) {
10581         $dbh->do(q|
10582             ALTER TABLE aqbooksellers
10583                 ADD KEY name (name(255))
10584         |);
10585     }
10586     unless ( index_exists( 'aqbudgets', 'budget_parent_id' ) ) {
10587         $dbh->do(q|
10588             ALTER TABLE aqbudgets
10589                 ADD KEY budget_parent_id (budget_parent_id)|);
10590         }
10591     unless ( index_exists( 'aqbudgets', 'budget_code' ) ) {
10592         $dbh->do(q|
10593             ALTER TABLE aqbudgets
10594                 ADD KEY budget_code (budget_code)|);
10595     }
10596     unless ( index_exists( 'aqbudgets', 'budget_branchcode' ) ) {
10597         $dbh->do(q|
10598             ALTER TABLE aqbudgets
10599                 ADD KEY budget_branchcode (budget_branchcode)|);
10600     }
10601     unless ( index_exists( 'aqbudgets', 'budget_period_id' ) ) {
10602         $dbh->do(q|
10603             ALTER TABLE aqbudgets
10604                 ADD KEY budget_period_id (budget_period_id)|);
10605     }
10606     unless ( index_exists( 'aqbudgets', 'budget_owner_id' ) ) {
10607         $dbh->do(q|
10608             ALTER TABLE aqbudgets
10609                 ADD KEY budget_owner_id (budget_owner_id)|);
10610     }
10611     unless ( index_exists( 'aqbudgets_planning', 'budget_period_id' ) ) {
10612         $dbh->do(q|
10613             ALTER TABLE aqbudgets_planning
10614                 ADD KEY budget_period_id (budget_period_id)|);
10615     }
10616     unless ( index_exists( 'aqorders', 'parent_ordernumber' ) ) {
10617         $dbh->do(q|
10618             ALTER TABLE aqorders
10619                 ADD KEY parent_ordernumber (parent_ordernumber)|);
10620     }
10621     unless ( index_exists( 'aqorders', 'orderstatus' ) ) {
10622         $dbh->do(q|
10623             ALTER TABLE aqorders
10624                 ADD KEY orderstatus (orderstatus)|);
10625     }
10626     print "Upgrade to $DBversion done (Bug 14053: Acquisition db tables are missing indexes)\n";
10627     SetVersion ($DBversion);
10628 }
10629
10630 $DBversion = "3.21.00.008";
10631 if ( CheckVersion($DBversion) ) {
10632     $dbh->do(q{
10633         DELETE IGNORE FROM systempreferences
10634         WHERE variable = 'HomeOrHoldingBranchReturn';
10635     });
10636     print "Upgrade to $DBversion done (Bug 7981: Transfer message on return. HomeOrHoldingBranchReturn syspref removed in favour of circulation rules.)\n";
10637     SetVersion($DBversion);
10638 }
10639
10640 $DBversion = "3.21.00.009";
10641 if ( CheckVersion($DBversion) ) {
10642
10643     sanitize_zero_date('aqorders', 'datecancellationprinted');
10644
10645     $dbh->do(q|
10646         UPDATE aqorders SET orderstatus='cancelled'
10647         WHERE (datecancellationprinted IS NOT NULL)
10648     |);
10649
10650     print "Upgrade to $DBversion done (Bug 13993: Correct orderstatus for transferred orders)\n";
10651     SetVersion($DBversion);
10652 }
10653
10654 $DBversion = "3.21.00.010";
10655 if ( CheckVersion($DBversion) ) {
10656     $dbh->do(q|
10657         ALTER TABLE message_queue
10658             DROP message_id
10659     |);
10660     $dbh->do(q|
10661         ALTER TABLE message_queue
10662             ADD message_id INT( 11 ) NOT NULL AUTO_INCREMENT PRIMARY KEY FIRST
10663     |);
10664     print "Upgrade to $DBversion done (Bug 7793: redefine the field message_id as PRIMARY KEY of message_queue)\n";
10665     SetVersion ($DBversion);
10666 }
10667
10668 $DBversion = "3.21.00.011";
10669 if ( CheckVersion($DBversion) ) {
10670     $dbh->do(q{
10671         INSERT IGNORE INTO systempreferences (variable,value,options,explanation,type)
10672         VALUES ('OpacLangSelectorMode','footer','top|both|footer','Select the location to display the language selector','Choice')
10673     });
10674     print "Upgrade to $DBversion done (Bug 14252: Make the OPAC language switcher available in the masthead navbar, footer, or both)\n";
10675     SetVersion ($DBversion);
10676 }
10677
10678 $DBversion = "3.21.00.012";
10679 if ( CheckVersion($DBversion) ) {
10680     $dbh->do(q|
10681         INSERT INTO letter (module, code, name, title, content, message_transport_type)
10682         VALUES
10683         ('suggestions','TO_PROCESS','Notify fund owner', 'A suggestion is ready to be processed','Dear <<borrowers.firstname>> <<borrowers.surname>>,\n\nA new suggestion is ready to be processed: <<suggestions.title>> by <<suggestions.autho    r>>.\n\nThank you,\n\n<<branches.branchname>>', 'email')
10684     |);
10685     print "Upgrade to $DBversion done (Bug 13014: Add the TO_PROCESS letter code)\n";
10686     SetVersion($DBversion);
10687 }
10688
10689 $DBversion = "3.21.00.013";
10690 if ( CheckVersion($DBversion) ) {
10691     my $msg;
10692     if ( C4::Context->preference('OPACPrivacy') ) {
10693         if ( my $anonymous_patron = C4::Context->preference('AnonymousPatron') ) {
10694             my $anonymous_patron_exists = $dbh->selectcol_arrayref(q|
10695                 SELECT COUNT(*)
10696                 FROM borrowers
10697                 WHERE borrowernumber=?
10698             |, {}, $anonymous_patron);
10699             unless ( $anonymous_patron_exists->[0] ) {
10700                 $msg = "Configuration WARNING: OPACPrivacy is set but AnonymousPatron is not linked to an existing patron";
10701             }
10702         }
10703         else {
10704             $msg = "Configuration WARNING: OPACPrivacy is set but AnonymousPatron is not";
10705         }
10706     }
10707     else {
10708         my $patrons_have_required_anonymity = $dbh->selectcol_arrayref(q|
10709             SELECT COUNT(*)
10710             FROM borrowers
10711             WHERE privacy = 2
10712         |, {} );
10713         if ( $patrons_have_required_anonymity->[0] ) {
10714             $msg = "Configuration WARNING: OPACPrivacy is not set but $patrons_have_required_anonymity->[0] patrons have required anonymity (perhaps in a previous configuration). You should fix that asap.";
10715         }
10716     }
10717
10718     $msg //= "Privacy is correctly set";
10719     print "Upgrade to $DBversion done (Bug 9942: $msg)\n";
10720     SetVersion ($DBversion);
10721 }
10722
10723 $DBversion = "3.21.00.014";
10724 if ( CheckVersion($DBversion) ) {
10725     $dbh->do(q{
10726         INSERT IGNORE INTO systempreferences (variable,value,explanation,options,type)
10727         VALUES ('OAI-PMH:DeletedRecord','persistent','Koha\'s deletedbiblio table will never be deleted (persistent) or might be deleted (transient)','transient|persistent','Choice')
10728     });
10729
10730     if ( foreign_key_exists( 'oai_sets_biblios', 'oai_sets_biblios_ibfk_1' ) ) {
10731         $dbh->do(q|
10732             ALTER TABLE oai_sets_biblios DROP FOREIGN KEY oai_sets_biblios_ibfk_1
10733         |);
10734     }
10735     print "Upgrade to $DBversion done (Bug 3206: OAI repository deleted record support)\n";
10736     SetVersion ($DBversion);
10737 }
10738
10739 $DBversion = "3.21.00.015";
10740 if ( CheckVersion($DBversion) ) {
10741     $dbh->do(q{
10742         UPDATE systempreferences SET value='0' WHERE variable='CalendarFirstDayOfWeek' AND value='Sunday';
10743     });
10744     $dbh->do(q{
10745         UPDATE systempreferences SET value='1' WHERE variable='CalendarFirstDayOfWeek' AND value='Monday';
10746     });
10747     $dbh->do(q{
10748         UPDATE systempreferences SET options='0|1|2|3|4|5|6' WHERE variable='CalendarFirstDayOfWeek';
10749     });
10750
10751     print "Upgrade to $DBversion done (Bug 12137: Extend functionality of CalendarFirstDayOfWeek to be any day)\n";
10752     SetVersion($DBversion);
10753 }
10754
10755 $DBversion = "3.21.00.016";
10756 if ( CheckVersion($DBversion) ) {
10757     my $rs = $schema->resultset('Systempreference');
10758     $rs->find_or_create(
10759         {
10760             variable => 'DumpTemplateVarsIntranet',
10761             value    => 0,
10762             explanation => 'If enabled, dump all Template Toolkit variable to a comment in the html source for the staff intranet.',
10763             type => 'YesNo',
10764         }
10765     );
10766     $rs->find_or_create(
10767         {
10768             variable => 'DumpTemplateVarsOpac',
10769             value    => 0,
10770             explanation => 'If enabled, dump all Template Toolkit variable to a comment in the html source for the opac.',
10771             type => 'YesNo',
10772         }
10773     );
10774     print "Upgrade to $DBversion done (Bug 13948: Add ability to dump template toolkit variables to html comment)\n";
10775     SetVersion($DBversion);
10776 }
10777
10778 $DBversion = "3.21.00.017";
10779 if ( CheckVersion($DBversion) ) {
10780     $dbh->do("
10781         CREATE TABLE uploaded_files (
10782             id int(11) NOT NULL AUTO_INCREMENT,
10783             hashvalue CHAR(40) NOT NULL,
10784             filename TEXT NOT NULL,
10785             dir TEXT NOT NULL,
10786             filesize int(11),
10787             dtcreated timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
10788             categorycode tinytext,
10789             owner int(11),
10790             PRIMARY KEY (id)
10791         ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
10792     ");
10793
10794     print "Upgrade to $DBversion done (Bug 6874: New cataloging plugin upload.pl)\n";
10795     print "This plugin comes with a new config variable (upload_path) and a new table (uploaded_files)\n";
10796     print "To use it, set 'upload_path' config variable and 'OPACBaseURL' system preference and link this plugin to a subfield (856\$u for instance)\n";
10797     SetVersion($DBversion);
10798 }
10799
10800 $DBversion = "3.21.00.018";
10801 if ( CheckVersion($DBversion) ) {
10802     $dbh->do(q{
10803         INSERT IGNORE INTO systempreferences (variable,value,options,explanation,type)
10804         VALUES
10805             ('RestrictedPageLocalIPs','',NULL,'Beginning of IP addresses considered as local (comma separated ex: \"127.0.0,127.0.2\")','Free'),
10806             ('RestrictedPageContent','',NULL,'HTML content of the restricted page','TextArea'),
10807             ('RestrictedPageTitle','',NULL,'Title of the restricted page (breadcrumb and header)','Free')
10808     });
10809     print "Upgrade to $DBversion done (Bug 13485: Add a page to display links to restricted sites)\n";
10810     SetVersion ($DBversion);
10811 }
10812
10813 $DBversion = "3.21.00.019";
10814 if ( CheckVersion($DBversion) ) {
10815     if ( column_exists( 'reserves', 'constrainttype' ) ) {
10816         $dbh->do(q{
10817             ALTER TABLE reserves DROP constrainttype
10818         });
10819         $dbh->do(q{
10820             ALTER TABLE old_reserves DROP constrainttype
10821         });
10822     }
10823     $dbh->do(q{
10824         DROP TABLE IF EXISTS reserveconstraints
10825     });
10826     print "Upgrade to $DBversion done (Bug 9809: Get rid of reserveconstraints)\n";
10827     SetVersion ($DBversion);
10828 }
10829
10830 $DBversion = "3.21.00.020";
10831 if ( CheckVersion($DBversion) ) {
10832     $dbh->do(q{
10833         INSERT IGNORE INTO `systempreferences` (`variable`, `value`, `options`, `explanation`, `type`)
10834         VALUES ('FeeOnChangePatronCategory','1','','If set, when a patron changes to a category with enrolment fee, a fee is charged','YesNo')
10835     });
10836     print "Upgrade to $DBversion done (Bug 13697: Option to don't charge a fee, if the patron changes to a category with enrolment fee)\n";
10837     SetVersion($DBversion);
10838 }
10839
10840 $DBversion = "3.21.00.021";
10841 if ( CheckVersion($DBversion) ) {
10842     $dbh->do(q{
10843         INSERT IGNORE INTO systempreferences (variable,value,explanation,options,type)
10844         VALUES ('UseWYSIWYGinSystemPreferences','0','','Show WYSIWYG editor when editing certain HTML system preferences.','YesNo')
10845     });
10846     print "Upgrade to $DBversion done (Bug 11584: Add wysiwyg editor to system preferences dealing with HTML)\n";
10847     SetVersion($DBversion);
10848 }
10849
10850 $DBversion = "3.21.00.022";
10851 if ( CheckVersion($DBversion) ) {
10852     $dbh->do(q{
10853         DELETE cr.*
10854         FROM course_reserves AS cr
10855         LEFT JOIN course_items USING(ci_id)
10856         WHERE course_items.ci_id IS NULL
10857     });
10858
10859     my ($print_error) = $dbh->{PrintError};
10860     $dbh->{RaiseError} = 0;
10861     $dbh->{PrintError} = 0;
10862     if ( foreign_key_exists('course_reserves', 'course_reserves_ibfk_2') ) {
10863         $dbh->do(q{ALTER TABLE course_reserves DROP FOREIGN KEY course_reserves_ibfk_2});
10864         $dbh->do(q{ALTER TABLE course_reserves DROP INDEX course_reserves_ibfk_2});
10865     }
10866     $dbh->{PrintError} = $print_error;
10867
10868     $dbh->do(q{
10869         ALTER TABLE course_reserves
10870             ADD CONSTRAINT course_reserves_ibfk_2
10871                 FOREIGN KEY (ci_id) REFERENCES course_items (ci_id)
10872                 ON DELETE CASCADE ON UPDATE CASCADE
10873     });
10874     print "Upgrade to $DBversion done (Bug 14205: Deleting an Item/Record does not remove link to course reserve)\n";
10875     SetVersion($DBversion);
10876 }
10877
10878 $DBversion = "3.21.00.023";
10879 if ( CheckVersion($DBversion) ) {
10880
10881     sanitize_zero_date('borrowers', 'debarred');
10882     sanitize_zero_date('borrowers', 'dateexpiry');
10883     sanitize_zero_date('borrowers', 'dateofbirth');
10884     sanitize_zero_date('borrowers', 'dateenrolled');
10885
10886     print "Upgrade to $DBversion done (Bug 14717: Prevent 0000-00-00 dates in patron data)\n";
10887     SetVersion($DBversion);
10888 }
10889
10890 $DBversion = "3.21.00.024";
10891 if ( CheckVersion($DBversion) ) {
10892     $dbh->do(q{
10893         ALTER TABLE marc_modification_template_actions
10894         MODIFY COLUMN action
10895             ENUM('delete_field','update_field','move_field','copy_field','copy_and_replace_field')
10896             NOT NULL
10897     });
10898     print "Upgrade to $DBversion done (Bug 14098: Regression in Marc Modification Templates)\n";
10899     SetVersion($DBversion);
10900 }
10901
10902 $DBversion = "3.21.00.025";
10903 if ( CheckVersion($DBversion) ) {
10904     $dbh->do(q{
10905         INSERT IGNORE INTO systempreferences (variable,value,options,explanation,type)
10906         VALUES ('RisExportAdditionalFields',  '', NULL ,  'Define additional RIS tags to export from MARC records in YAML format as an associative array with either a marc tag/subfield combination as the value, or a list of tag/subfield combinations.',  'textarea')
10907     });
10908     $dbh->do(q{
10909         INSERT IGNORE INTO systempreferences (variable,value,options,explanation,type)
10910         VALUES ('BibtexExportAdditionalFields',  '', NULL ,  'Define additional BibTex tags to export from MARC records in YAML format as an associative array with either a marc tag/subfield combination as the value, or a list of tag/subfield combinations.',  'textarea')
10911     });
10912     print "Upgrade to $DBversion done (Bug 12357: Enhancements to RIS and BibTeX exporting)\n";
10913     SetVersion($DBversion);
10914 }
10915
10916 $DBversion = "3.21.00.026";
10917 if ( CheckVersion($DBversion) ) {
10918     $dbh->do(q{
10919         UPDATE matchpoints
10920         SET search_index='issn'
10921         WHERE matcher_id IN (SELECT matcher_id FROM marc_matchers WHERE code = 'ISSN')
10922     });
10923     print "Upgrade to $DBversion done (Bug 14472: Wrong ISSN search index in record matching rules)\n";
10924     SetVersion($DBversion);
10925 }
10926
10927 $DBversion = "3.21.00.027";
10928 if ( CheckVersion($DBversion) ) {
10929     $dbh->do(q|
10930         INSERT IGNORE INTO permissions (module_bit, code, description)
10931         VALUES (1, 'self_checkout', 'Perform self checkout at the OPAC. It should be used for the patron matching the AutoSelfCheckID')
10932     |);
10933
10934     my $AutoSelfCheckID = C4::Context->preference('AutoSelfCheckID');
10935
10936     $dbh->do(q|
10937         UPDATE borrowers
10938         SET flags=0
10939         WHERE userid=?
10940     |, undef, $AutoSelfCheckID);
10941
10942     $dbh->do(q|
10943         DELETE FROM user_permissions
10944         WHERE borrowernumber=(SELECT borrowernumber FROM borrowers WHERE userid=?)
10945     |, undef, $AutoSelfCheckID);
10946
10947     $dbh->do(q|
10948         INSERT INTO user_permissions(borrowernumber, module_bit, code)
10949         SELECT borrowernumber, 1, 'self_checkout' FROM borrowers WHERE userid=?
10950     |, undef, $AutoSelfCheckID);
10951     print "Upgrade to $DBversion done (Bug 14298: AutoSelfCheckID user should only be able to access SCO)\n";
10952     SetVersion($DBversion);
10953 }
10954
10955 $DBversion = "3.21.00.028";
10956 if ( CheckVersion($DBversion) ) {
10957     unless ( column_exists('uploaded_files', 'public') ) {
10958         $dbh->do(q{
10959             ALTER TABLE uploaded_files
10960                 ADD COLUMN public tinyint,
10961                 ADD COLUMN permanent tinyint
10962         });
10963         $dbh->do(q{
10964             UPDATE uploaded_files SET public=1, permanent=1
10965         });
10966         $dbh->do(q{
10967             ALTER TABLE uploaded_files
10968                 CHANGE COLUMN categorycode uploadcategorycode tinytext
10969         });
10970     }
10971     print "Upgrade to $DBversion done (Bug 14321: Merge UploadedFile and UploadedFiles into Koha::Upload)\n";
10972     SetVersion($DBversion);
10973 }
10974
10975 $DBversion = "3.21.00.029";
10976 if ( CheckVersion($DBversion) ) {
10977     unless ( column_exists('discharges', 'discharge_id') ) {
10978         $dbh->do(q{
10979             ALTER TABLE discharges
10980                 ADD COLUMN discharge_id int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY FIRST
10981         });
10982     }
10983     print "Upgrade to $DBversion done (Bug 14368: Add discharges history)\n";
10984     SetVersion($DBversion);
10985 }
10986
10987 $DBversion = "3.21.00.030";
10988 if ( CheckVersion($DBversion) ) {
10989     $dbh->do(q{
10990         UPDATE marc_subfield_structure
10991         SET value_builder='marc21_leader.pl'
10992         WHERE value_builder='marc21_leader_book.pl'
10993     });
10994     $dbh->do(q{
10995         UPDATE marc_subfield_structure
10996         SET value_builder='marc21_leader.pl'
10997         WHERE value_builder='marc21_leader_computerfile.pl'
10998     });
10999     $dbh->do(q{
11000         UPDATE marc_subfield_structure
11001         SET value_builder='marc21_leader.pl'
11002         WHERE value_builder='marc21_leader_video.pl'
11003     });
11004     print "Upgrade to $DBversion done (Bug 14201: Remove unused code or template from some MARC21 leader plugins )\n";
11005     SetVersion($DBversion);
11006 }
11007
11008 $DBversion = "3.21.00.031";
11009 if ( CheckVersion($DBversion) ) {
11010     $dbh->do(q{
11011         INSERT IGNORE INTO systempreferences (variable,value,options,explanation,type)
11012         VALUES
11013             ('SMSSendPassword', '', '', 'Password used to send SMS messages', 'free'),
11014             ('SMSSendUsername', '', '', 'Username/Login used to send SMS messages', 'free')
11015     });
11016     print "Upgrade to $DBversion done (Bug 14820: SMSSendUsername and SMSSendPassword are not listed in the system preferences)\n";
11017     SetVersion($DBversion);
11018 }
11019
11020 $DBversion = "3.21.00.032";
11021 if ( CheckVersion($DBversion) ) {
11022     $dbh->do(q{
11023         CREATE TABLE additional_fields (
11024             id int(11) NOT NULL AUTO_INCREMENT,
11025             tablename varchar(255) NOT NULL DEFAULT '',
11026             name varchar(255) NOT NULL DEFAULT '',
11027             authorised_value_category varchar(16) NOT NULL DEFAULT '',
11028             marcfield varchar(16) NOT NULL DEFAULT '',
11029             searchable tinyint(1) NOT NULL DEFAULT '0',
11030             PRIMARY KEY (id),
11031             UNIQUE KEY fields_uniq (tablename,name)
11032         ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
11033     });
11034     $dbh->do(q{
11035         CREATE TABLE additional_field_values (
11036             id int(11) NOT NULL AUTO_INCREMENT,
11037             field_id int(11) NOT NULL,
11038             record_id int(11) NOT NULL,
11039             value varchar(255) NOT NULL DEFAULT '',
11040             PRIMARY KEY (id),
11041             UNIQUE KEY field_record (field_id,record_id),
11042             CONSTRAINT afv_fk FOREIGN KEY (field_id) REFERENCES additional_fields (id) ON DELETE CASCADE ON UPDATE CASCADE
11043         ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
11044     });
11045     print "Upgrade to $DBversion done (Bug 10855: Additional fields for subscriptions)\n";
11046     SetVersion($DBversion);
11047 }
11048
11049 $DBversion = "3.21.00.033";
11050 if ( CheckVersion($DBversion) ) {
11051
11052     my $done = 0;
11053     my $count_ethnicity = $dbh->selectrow_arrayref(q|
11054         SELECT COUNT(*) FROM ethnicity
11055     |);
11056     my $count_borrower_modifications = $dbh->selectrow_arrayref(q|
11057         SELECT COUNT(*)
11058         FROM borrower_modifications
11059         WHERE ethnicity IS NOT NULL
11060             OR ethnotes IS NOT NULL
11061     |);
11062     my $count_borrowers = $dbh->selectrow_arrayref(q|
11063         SELECT COUNT(*)
11064         FROM borrowers
11065         WHERE ethnicity IS NOT NULL
11066             OR ethnotes IS NOT NULL
11067     |);
11068     # We don't care about the ethnicity of the deleted borrowers, right?
11069     if ( $count_ethnicity->[0] == 0
11070             and $count_borrower_modifications->[0] == 0
11071             and $count_borrowers->[0] == 0
11072     ) {
11073         $dbh->do(q|
11074             DROP TABLE ethnicity
11075         |);
11076         $dbh->do(q|
11077             ALTER TABLE borrower_modifications
11078             DROP COLUMN ethnicity,
11079             DROP COLUMN ethnotes
11080         |);
11081         $dbh->do(q|
11082             ALTER TABLE borrowers
11083             DROP COLUMN ethnicity,
11084             DROP COLUMN ethnotes
11085         |);
11086         $dbh->do(q|
11087             ALTER TABLE deletedborrowers
11088             DROP COLUMN ethnicity,
11089             DROP COLUMN ethnotes
11090         |);
11091         $done = 1;
11092     }
11093     if ( $done ) {
11094         print "Upgrade to $DBversion done (Bug 10020: Drop table ethnicity and columns ethnicity and ethnotes)\n";
11095     }
11096     else {
11097         print "Upgrade to $DBversion done (Bug 10020: This database contains data related to 'ethnicity'. No change will be done on the DB structure but note that the Koha codebase does not use it)\n";
11098     }
11099
11100     SetVersion ($DBversion);
11101 }
11102
11103 $DBversion = "3.21.00.034";
11104 if ( CheckVersion($DBversion) ) {
11105     $dbh->do(q{
11106         INSERT IGNORE INTO systempreferences (variable,value,explanation,options,type)
11107         VALUES('MembershipExpiryDaysNotice',NULL,'Send an account expiration notice that a patron''s card is about to expire after',NULL,'Integer')
11108     });
11109     $dbh->do(q{
11110         INSERT IGNORE INTO letter (module, code, branchcode, name, title, content, message_transport_type)
11111         VALUES('members','MEMBERSHIP_EXPIRY','','Account expiration','Account expiration','Dear <<borrowers.title>> <<borrowers.firstname>> <<borrowers.surname>>,\r\n\r\nYour library card will expire soon, on:\r\n\r\n<<borrowers.dateexpiry>>\r\n\r\nThank you,\r\n\r\nLibrarian\r\n\r\n<<branches.branchname>>', 'email')
11112     });
11113     print "Upgrade to $DBversion done (Bug 6810: Send membership expiry reminder notices)\n";
11114     SetVersion($DBversion);
11115 }
11116
11117 $DBversion = "3.21.00.035";
11118 if ( CheckVersion($DBversion) ) {
11119     $dbh->do(q|
11120         ALTER TABLE branch_borrower_circ_rules ADD COLUMN maxonsiteissueqty int(4) DEFAULT NULL AFTER maxissueqty;
11121     |);
11122     $dbh->do(q|
11123         UPDATE branch_borrower_circ_rules SET maxonsiteissueqty = maxissueqty;
11124     |);
11125     $dbh->do(q|
11126         ALTER TABLE default_borrower_circ_rules ADD COLUMN maxonsiteissueqty int(4) DEFAULT NULL AFTER maxissueqty;
11127     |);
11128     $dbh->do(q|
11129         UPDATE default_borrower_circ_rules SET maxonsiteissueqty = maxissueqty;
11130     |);
11131     $dbh->do(q|
11132         ALTER TABLE default_branch_circ_rules ADD COLUMN maxonsiteissueqty int(4) DEFAULT NULL AFTER maxissueqty;
11133     |);
11134     $dbh->do(q|
11135         UPDATE default_branch_circ_rules SET maxonsiteissueqty = maxissueqty;
11136     |);
11137     $dbh->do(q|
11138         ALTER TABLE default_circ_rules ADD COLUMN maxonsiteissueqty int(4) DEFAULT NULL AFTER maxissueqty;
11139     |);
11140     $dbh->do(q|
11141         UPDATE default_circ_rules SET maxonsiteissueqty = maxissueqty;
11142     |);
11143     $dbh->do(q|
11144         ALTER TABLE issuingrules ADD COLUMN maxonsiteissueqty int(4) DEFAULT NULL AFTER maxissueqty;
11145     |);
11146     $dbh->do(q|
11147         UPDATE issuingrules SET maxonsiteissueqty = maxissueqty;
11148     |);
11149     $dbh->do(q|
11150         INSERT IGNORE INTO systempreferences (variable,value,explanation,options,type)
11151         VALUES ('ConsiderOnSiteCheckoutsAsNormalCheckouts','1',NULL,'Consider on-site checkouts as normal checkouts','YesNo');
11152     |);
11153
11154     print "Upgrade to $DBversion done (Bug 14045: Add DB fields maxonsiteissueqty and pref ConsiderOnSiteCheckoutsAsNormalCheckouts)\n";
11155     SetVersion ($DBversion);
11156 }
11157
11158 $DBversion = "3.21.00.036";
11159 if ( CheckVersion($DBversion) ) {
11160    $dbh->do(q{
11161         ALTER TABLE authorised_values_branches
11162         DROP FOREIGN KEY authorised_values_branches_ibfk_1,
11163         DROP FOREIGN KEY authorised_values_branches_ibfk_2
11164     });
11165     $dbh->do(q{
11166         ALTER TABLE authorised_values_branches
11167         MODIFY av_id INT( 11 ) NOT NULL,
11168         MODIFY branchcode VARCHAR( 10 ) NOT NULL,
11169         ADD FOREIGN KEY (`av_id`) REFERENCES `authorised_values` (`id`) ON DELETE CASCADE,
11170         ADD FOREIGN KEY (`branchcode`) REFERENCES `branches` (`branchcode`) ON DELETE CASCADE
11171    });
11172    print "Upgrade to $DBversion done (Bug 10363: There is no package for authorised values)\n";
11173    SetVersion($DBversion);
11174 }
11175
11176 $DBversion = "3.21.00.037";
11177 if ( CheckVersion($DBversion) ) {
11178    $dbh->do(q{
11179        INSERT IGNORE INTO systempreferences (variable,value,explanation,options,type)
11180        VALUES ('OverduesBlockRenewing','allow','If any of a patron checked out documents is late, should renewal be allowed, blocked only on overdue items or blocked on whatever checked out document','allow|blockitem|block','Choice')
11181    });
11182    $dbh->do(q{
11183        INSERT IGNORE INTO systempreferences (variable,value,explanation,options,type)
11184        VALUES ('RestrictionBlockRenewing','0','If patron is restricted, should renewal be allowed or blocked',NULL,'YesNo')
11185     });
11186    print "Upgrade to $DBversion done (Bug 8236: Prevent renewing if overdue or restriction)\n";
11187    SetVersion($DBversion);
11188 }
11189
11190 $DBversion = "3.21.00.038";
11191 if ( CheckVersion($DBversion) ) {
11192     $dbh->do(q|
11193         INSERT IGNORE INTO systempreferences ( variable, value, options, explanation, type )
11194         VALUES ('BatchCheckouts','0','','Enable or disable batch checkouts','YesNo')
11195     |);
11196     $dbh->do(q|
11197         INSERT IGNORE INTO systempreferences ( variable, value, options, explanation, type )
11198         VALUES ('BatchCheckoutsValidCategories','',NULL,'Patron categories allowed to checkout in a batch','Free')
11199     |);
11200     print "Upgrade to $DBversion done (Bug 11759: Add the batch checkout feature)\n";
11201     SetVersion($DBversion);
11202 }
11203
11204 $DBversion = "3.21.00.039";
11205 if ( CheckVersion($DBversion) ) {
11206     $dbh->do(q|
11207         ALTER TABLE creator_layouts ADD COLUMN oblique_title INT(1) NULL DEFAULT 1 AFTER guidebox
11208     |);
11209     print "Upgrade to $DBversion done (Bug 12194: Add column oblique_title to layouts)\n";
11210     SetVersion($DBversion);
11211 }
11212
11213 $DBversion = "3.21.00.040";
11214 if ( CheckVersion($DBversion) ) {
11215     $dbh->do(q{
11216         ALTER TABLE itemtypes
11217             ADD hideinopac TINYINT(1) NOT NULL DEFAULT 0
11218               AFTER sip_media_type,
11219             ADD searchcategory VARCHAR(80) DEFAULT NULL
11220               AFTER hideinopac;
11221     });
11222     print "Upgrade to $DBversion done (Bug 10937: Option to hide and group itemtypes from advanced search)\n";
11223     SetVersion($DBversion);
11224 }
11225
11226 $DBversion = "3.21.00.041";
11227 if ( CheckVersion($DBversion) ) {
11228     $dbh->do(q|
11229         ALTER TABLE issuingrules
11230             ADD chargeperiod_charge_at BOOLEAN NOT NULL DEFAULT  '0' AFTER chargeperiod
11231     |);
11232     print "Upgrade to $DBversion done (Bug 13590: Add ability to charge fines at start of charge period)\n";
11233     SetVersion($DBversion);
11234 }
11235
11236 $DBversion = "3.21.00.042";
11237 if ( CheckVersion($DBversion) ) {
11238     $dbh->do(q|
11239         ALTER TABLE items_search_fields
11240             MODIFY COLUMN authorised_values_category VARCHAR(32) DEFAULT NULL
11241     |);
11242     print "Upgrade to $DBversion done (Bug 15069: items_search_fields.authorised_values_category is still a varchar(32))\n";
11243     SetVersion($DBversion);
11244 }
11245
11246 $DBversion = "3.21.00.043";
11247 if ( CheckVersion($DBversion) ) {
11248     $dbh->do(q|
11249         INSERT IGNORE INTO systempreferences ( variable, value, options, explanation, type )
11250         VALUES ('EnableAdvancedCatalogingEditor','0','','Enable the Rancor advanced cataloging editor','YesNo')
11251     |);
11252     print "Upgrade to $DBversion done (Bug 11559: Professional cataloger's interface)\n";
11253     SetVersion($DBversion);
11254 }
11255
11256 $DBversion = "3.21.00.044";
11257 if ( CheckVersion($DBversion) ) {
11258     $dbh->do(q|
11259         CREATE TABLE localization (
11260             localization_id int(11) NOT NULL AUTO_INCREMENT,
11261             entity varchar(16) COLLATE utf8_unicode_ci NOT NULL,
11262             code varchar(64) COLLATE utf8_unicode_ci NOT NULL,
11263             lang varchar(25) COLLATE utf8_unicode_ci NOT NULL,
11264             translation text COLLATE utf8_unicode_ci,
11265             PRIMARY KEY (localization_id),
11266             UNIQUE KEY entity_code_lang (entity,code,lang)
11267         ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
11268     |);
11269     print "Upgrade to $DBversion done (Bug 14100: Generic solution for language overlay)\n";
11270     SetVersion($DBversion);
11271 }
11272
11273 $DBversion = "3.21.00.045";
11274 if ( CheckVersion($DBversion) ) {
11275     $dbh->do(q|
11276         ALTER TABLE opac_news
11277             ADD borrowernumber int(11) default NULL
11278                 AFTER number
11279     |);
11280     $dbh->do(q|
11281         ALTER TABLE opac_news
11282             ADD CONSTRAINT borrowernumber_fk
11283                 FOREIGN KEY (borrowernumber)
11284                 REFERENCES borrowers (borrowernumber)
11285                 ON DELETE SET NULL ON UPDATE CASCADE
11286     |);
11287     print "Upgrade to $DBversion done (Bug 14246: (newsauthor) Add borrowernumber to koha_news)\n";
11288     SetVersion($DBversion);
11289 }
11290
11291 $DBversion = "3.21.00.046";
11292 if ( CheckVersion($DBversion) ) {
11293     $dbh->do(q{
11294         INSERT IGNORE INTO systempreferences ( variable, value, options, explanation, type )
11295         VALUES ('NewsAuthorDisplay','none','none|opac|staff|both','Display the author name for news items.','Choice')
11296     });
11297     print "Upgrade to $DBversion done (Bug 14247: (newsauthor) System preference for news author display)\n";
11298     SetVersion($DBversion);
11299 }
11300
11301 $DBversion = "3.21.00.047";
11302 if(CheckVersion($DBversion)) {
11303     $dbh->do(q{
11304         INSERT IGNORE INTO systempreferences (variable,value,explanation,options,type)
11305         VALUES ('IndependentBranchesPatronModifications','0','Show only modification request for the logged in branch','','YesNo')
11306     });
11307     print "Upgrade to $DBversion done (Bug 10904: Limit patron update request management by branch)\n";
11308     SetVersion($DBversion);
11309 }
11310
11311 $DBversion = '3.21.00.048';
11312 if ( CheckVersion($DBversion) ) {
11313     my $create_table_issues = @{ $dbh->selectall_arrayref(q|SHOW CREATE TABLE issues|) }[0]->[1];
11314     if ($create_table_issues !~ m|UNIQUE KEY.*itemnumber| ) {
11315         $dbh->do(q|ALTER TABLE issues ADD CONSTRAINT UNIQUE KEY (itemnumber)|);
11316     }
11317     print "Upgrade to $DBversion done (Bug 14978: Make sure issues.itemnumber is a unique key)\n";
11318     SetVersion($DBversion);
11319 }
11320
11321 $DBversion = "3.21.00.049";
11322 if ( CheckVersion($DBversion) ) {
11323     $dbh->do(q{UPDATE systempreferences SET variable = 'AudioAlerts' WHERE variable = 'soundon'});
11324
11325     $dbh->do(q{
11326         CREATE TABLE audio_alerts (
11327             id int(11) NOT NULL AUTO_INCREMENT,
11328             precedence smallint(5) unsigned NOT NULL,
11329             selector varchar(255) NOT NULL,
11330             sound varchar(255) NOT NULL,
11331             PRIMARY KEY (id),
11332             KEY precedence (precedence)
11333         ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
11334     });
11335
11336     $dbh->do(q{
11337         INSERT IGNORE INTO audio_alerts VALUES
11338         (1, 1, '.audio-alert-action', 'opening.ogg'),
11339         (2, 2, '.audio-alert-warning', 'critical.ogg'),
11340         (3, 3, '.audio-alert-success', 'beep.ogg');
11341     });
11342
11343     print "Upgrade to $DBversion done (Bug 11431: Add additional sound options for warnings)\n";
11344     SetVersion($DBversion);
11345 }
11346
11347 $DBversion = "3.21.00.050";
11348 if(CheckVersion($DBversion)) {
11349     $dbh->do(q{
11350         INSERT INTO letter ( module, code, branchcode, name, is_html, title, content, message_transport_type )
11351         VALUES ( 'circulation', 'OVERDUES_SLIP', '', 'Overdues Slip', '0', 'OVERDUES_SLIP', 'The following item(s) is/are currently overdue:
11352
11353 <item>"<<biblio.title>>" by <<biblio.author>>, <<items.itemcallnumber>>, Barcode: <<items.barcode>> Fine: <<items.fine>></item>
11354 ', 'print' )
11355     });
11356     print "Upgrade to $DBversion done (Bug 12933: Add ability to print overdue slip from staff intranet)\n";
11357     SetVersion($DBversion);
11358 }
11359
11360 $DBversion = "3.21.00.051";
11361 if ( CheckVersion($DBversion) ) {
11362     $dbh->do(q{
11363         ALTER TABLE virtualshelves
11364             CHANGE COLUMN sortfield sortfield VARCHAR(16) DEFAULT 'title'
11365     });
11366     $dbh->do(q{
11367         UPDATE virtualshelves
11368         SET sortfield='title'
11369             WHERE sortfield IS NULL;
11370     });
11371     print "Upgrade to $DBversion done (Bug 14544: Move the list related code to Koha::Virtualshelves)\n";
11372     SetVersion($DBversion);
11373 }
11374
11375 $DBversion = "3.21.00.052";
11376 if ( CheckVersion($DBversion) ) {
11377     $dbh->do(q{
11378         ALTER TABLE serial
11379             ADD COLUMN publisheddatetext VARCHAR(100) DEFAULT NULL AFTER publisheddate
11380     });
11381     print "Upgrade to $DBversion done (Bug 8296: Add descriptive (text) published date field for serials)\n";
11382     SetVersion($DBversion);
11383 }
11384
11385 $DBversion = "3.21.00.053";
11386 if ( CheckVersion($DBversion) ) {
11387     my $query = q{ SELECT * FROM itemtypes ORDER BY description };
11388     my $sth   = C4::Context->dbh->prepare($query);
11389     $sth->execute;
11390     my $suggestion_formats = $sth->fetchall_arrayref( {} );
11391
11392     foreach my $format (@$suggestion_formats) {
11393         $dbh->do(
11394             q|
11395             INSERT IGNORE INTO authorised_values (category, authorised_value, lib, lib_opac, imageurl)
11396             VALUES (?, ?, ?, ?, ?)
11397         |, {},
11398             'SUGGEST_FORMAT', $format->{itemtype}, $format->{description}, $format->{description},
11399             $format->{imageurl}
11400         );
11401     }
11402     print "Upgrade to $DBversion done (Bug 9468: create new SUGGEST_FORMAT authorised_value list)\n";
11403     SetVersion($DBversion);
11404 }
11405
11406 $DBversion = "3.21.00.054";
11407 if(CheckVersion($DBversion)) {
11408     $dbh->do(q{
11409         INSERT IGNORE INTO systempreferences (variable,value,explanation,options,type)
11410         VALUES('MergeReportFields','','Displayed fields for deleted MARC records after merge',NULL,'Free')
11411     });
11412     print "Upgrade to $DBversion done (Bug 8064: Merge several biblio records)\n";
11413     SetVersion($DBversion);
11414 }
11415
11416 $DBversion = "3.21.00.055";
11417 if ( CheckVersion($DBversion) ) {
11418     print "Upgrade to $DBversion done (Koha 3.22 beta)\n";
11419     SetVersion($DBversion);
11420 }
11421
11422 $DBversion = "3.21.00.056";
11423 if(CheckVersion($DBversion)) {
11424     $dbh->do(q{
11425         UPDATE systempreferences
11426         SET
11427             options='metric|us|iso|dmydot',
11428             explanation='Define global date format (us mm/dd/yyyy, metric dd/mm/yyy, ISO yyyy-mm-dd, DMY separated by dots dd.mm.yyyy)'
11429         WHERE variable='dateformat'
11430     });
11431     print "Upgrade to $DBversion done (Bug 12072: New dateformat dd.mm.yyyy)\n";
11432     SetVersion($DBversion);
11433 }
11434
11435 $DBversion = "3.22.00.000";
11436 if ( CheckVersion($DBversion) ) {
11437     print "Upgrade to $DBversion done (Koha 3.22)\n";
11438     SetVersion($DBversion);
11439 }
11440
11441 $DBversion = "3.23.00.000";
11442 if ( CheckVersion($DBversion) ) {
11443     print "Upgrade to $DBversion done (The year of the monkey will be here soon.)\n";
11444     SetVersion ($DBversion);
11445 }
11446
11447 $DBversion = "3.23.00.001";
11448 if(CheckVersion($DBversion)) {
11449     $dbh->do(q{
11450         INSERT IGNORE INTO systempreferences ( variable, value, options, explanation, type )
11451         VALUES (
11452             'DefaultToLoggedInLibraryCircRules',  '0', NULL ,  'If enabled, circ rules editor will default to the logged in library''s rules, rather than the ''all libraries'' rules.',  'YesNo'
11453         ), (
11454             'DefaultToLoggedInLibraryNoticesSlips',  '0', NULL ,  'If enabled,slips and notices editor will default to the logged in library''s rules, rather than the ''all libraries'' rules.',  'YesNo'
11455         )
11456     });
11457
11458     print "Upgrade to $DBversion done (Bug 11625 - Add pref DefaultToLoggedInLibraryCircRules and DefaultToLoggedInLibraryNoticesSlips)\n";
11459     SetVersion($DBversion);
11460 }
11461
11462 $DBversion = "3.23.00.002";
11463 if(CheckVersion($DBversion)) {
11464     $dbh->do(q{
11465         INSERT IGNORE INTO systempreferences ( variable, value, options, explanation, type )
11466         VALUES ('DefaultToLoggedInLibraryOverdueTriggers',  '0', NULL,  'If enabled, overdue status triggers editor will default to the logged in library''s rules, rather than the ''default'' rules.',  'YesNo')
11467     });
11468
11469     print "Upgrade to $DBversion done (Bug 11747 - add pref DefaultToLoggedInLibraryOverdueTriggers)\n";
11470     SetVersion($DBversion);
11471 }
11472
11473 $DBversion = "3.23.00.003";
11474 if(CheckVersion($DBversion)) {
11475     $dbh->do(q{
11476         UPDATE letter SET name = "Hold Slip" WHERE name = "Reserve Slip"
11477     });
11478     $dbh->do(q{
11479         UPDATE letter SET title = "Hold Slip" WHERE title = "Reserve Slip";
11480     });
11481
11482     print "Upgrade to $DBversion done (Bug 8085 - Rename 'Reserve slip' to 'Hold slip')\n";
11483     SetVersion($DBversion);
11484 }
11485
11486 $DBversion = "3.23.00.004";
11487 if ( CheckVersion($DBversion) ) {
11488     $dbh->do(q{
11489         DROP TABLE IF EXISTS `stopwords`;
11490     });
11491     print "Upgrade to $DBversion done (Bug 9819 - stopwords related code should be removed)\n";
11492     SetVersion($DBversion);
11493 }
11494
11495 $DBversion = "3.23.00.005";
11496 if ( CheckVersion($DBversion) ) {
11497     $dbh->do(q{
11498         UPDATE permissions SET description = 'Manage circulation rules' WHERE description = 'manage circulation rules'
11499     });
11500     $dbh->do(q{
11501         UPDATE permissions SET description = 'Manage staged MARC records, including completing and reversing imports' WHERE description = 'Managed staged MARC records, including completing and reversing imports'
11502     });
11503     print "Upgrade to $DBversion done (Bug 11569 - Typo in userpermissions.sql)\n";
11504     SetVersion($DBversion);
11505 }
11506 $DBversion = "3.23.00.006";
11507 if ( C4::Context->preference("Version") < TransformToNum($DBversion) ) {
11508    $dbh->do("
11509        ALTER TABLE serial
11510         ADD serialseq_x VARCHAR( 100 ) NULL DEFAULT NULL AFTER serialseq,
11511         ADD serialseq_y VARCHAR( 100 ) NULL DEFAULT NULL AFTER serialseq_x,
11512         ADD serialseq_z VARCHAR( 100 ) NULL DEFAULT NULL AFTER serialseq_y
11513    ");
11514
11515     my $sth = $dbh->prepare("SELECT * FROM subscription");
11516     $sth->execute();
11517
11518     my $sth2 = $dbh->prepare("SELECT * FROM subscription_numberpatterns WHERE id = ?");
11519
11520     my $sth3 = $dbh->prepare("UPDATE serial SET serialseq_x = ?, serialseq_y = ?, serialseq_z = ? WHERE serialid = ?");
11521
11522     foreach my $subscription ( $sth->fetchrow_hashref() ) {
11523         next if !defined($subscription);
11524         $sth2->execute( $subscription->{numberpattern} );
11525         my $number_pattern = $sth2->fetchrow_hashref();
11526
11527         my $numbering_method = $number_pattern->{numberingmethod};
11528         # Get all the data between the enumeration values, we need
11529         # to split each enumeration string based on these values.
11530         my @splits = split( /\{[XYZ]\}/, $numbering_method );
11531         # Get the order in which the X Y and Z values are used
11532         my %indexes;
11533         foreach my $i (qw(X Y Z)) {
11534             $indexes{$i} = index( $numbering_method, "{$i}" );
11535             delete $indexes{$i} if $indexes{$i} == -1;
11536         }
11537         my @indexes = sort { $indexes{$a} <=> $indexes{$b} } keys(%indexes);
11538
11539         my @serials = @{
11540             $dbh->selectall_arrayref(
11541                 "SELECT * FROM serial WHERE subscriptionid = $subscription->{subscriptionid}",
11542                 { Slice => {} }
11543             )
11544         };
11545
11546         foreach my $serial (@serials) {
11547             my $serialseq = $serial->{serialseq};
11548             my %enumeration_data;
11549
11550             ## We cannot split on multiple values at once,
11551             ## so let's replace each of those values with __SPLIT__
11552             if (@splits) {
11553                 for my $split_item (@splits) {
11554                     my $quoted_split = quotemeta($split_item);
11555                     $serialseq =~ s/$quoted_split/__SPLIT__/;
11556                 }
11557                 (
11558                     undef,
11559                     $enumeration_data{ $indexes[0] // q{} },
11560                     $enumeration_data{ $indexes[1] // q{} },
11561                     $enumeration_data{ $indexes[2] // q{} }
11562                 ) = split( /__SPLIT__/, $serialseq );
11563             }
11564             else
11565             {    ## Nothing to split on means the only thing in serialseq is a single placeholder e.g. {X}
11566                 $enumeration_data{ $indexes[0] } = $serialseq;
11567             }
11568
11569             $sth3->execute(
11570                     $enumeration_data{'X'},
11571                     $enumeration_data{'Y'},
11572                     $enumeration_data{'Z'},
11573                     $serial->{serialid},
11574             );
11575         }
11576     }
11577
11578     print "Upgrade to $DBversion done ( Bug 8956 - Split serials enumeration data into separate fields )\n";
11579     SetVersion($DBversion);
11580 }
11581
11582 $DBversion = "3.23.00.007";
11583 if ( CheckVersion($DBversion) ) {
11584     $dbh->do("SET FOREIGN_KEY_CHECKS=0");
11585     $dbh->do("ALTER TABLE overduerules RENAME old_overduerules");
11586     $dbh->do("CREATE TABLE overduerules (
11587         `overduerules_id` int(11) NOT NULL AUTO_INCREMENT,
11588         `branchcode` varchar(10) NOT NULL DEFAULT '',
11589         `categorycode` varchar(10) NOT NULL DEFAULT '',
11590         `delay1` int(4) DEFAULT NULL,
11591         `letter1` varchar(20) DEFAULT NULL,
11592         `debarred1` varchar(1) DEFAULT '0',
11593         `delay2` int(4) DEFAULT NULL,
11594         `debarred2` varchar(1) DEFAULT '0',
11595         `letter2` varchar(20) DEFAULT NULL,
11596         `delay3` int(4) DEFAULT NULL,
11597         `letter3` varchar(20) DEFAULT NULL,
11598         `debarred3` int(1) DEFAULT '0',
11599         PRIMARY KEY (`overduerules_id`),
11600         UNIQUE KEY `overduerules_branch_cat` (`branchcode`,`categorycode`)
11601         ) ENGINE=InnoDB DEFAULT CHARSET=utf8;");
11602     $dbh->do("INSERT INTO overduerules(branchcode, categorycode, delay1, letter1, debarred1, delay2, debarred2, letter2, delay3, letter3, debarred3) SELECT * FROM old_overduerules");
11603     $dbh->do("DROP TABLE old_overduerules");
11604     $dbh->do("ALTER TABLE overduerules_transport_types
11605               ADD COLUMN overduerules_id int(11) NOT NULL");
11606     my $mtts = $dbh->selectall_arrayref("SELECT * FROM overduerules_transport_types", { Slice => {} });
11607     $dbh->do("DELETE FROM overduerules_transport_types");
11608     $dbh->do("ALTER TABLE overduerules_transport_types
11609               DROP FOREIGN KEY overduerules_fk,
11610               ADD FOREIGN KEY overduerules_transport_types_fk (overduerules_id) REFERENCES overduerules (overduerules_id) ON DELETE CASCADE ON UPDATE CASCADE,
11611               DROP COLUMN branchcode,
11612               DROP COLUMN categorycode");
11613     my $s = $dbh->prepare("INSERT INTO overduerules_transport_types (overduerules_id, id, letternumber, message_transport_type) "
11614                          ." VALUES((SELECT overduerules_id FROM overduerules WHERE branchcode = ? AND categorycode = ?),?,?,?)");
11615     foreach my $mtt(@$mtts){
11616         $s->execute($mtt->{branchcode}, $mtt->{categorycode}, $mtt->{id}, $mtt->{letternumber}, $mtt->{message_transport_type} );
11617     }
11618     $dbh->do("SET FOREIGN_KEY_CHECKS=1");
11619
11620     print "Upgrade to $DBversion done (Bug 13624 - Remove columns branchcode, categorytype from table overduerules_transport_types)\n";
11621     SetVersion($DBversion);
11622 }
11623
11624 $DBversion = "3.23.00.008";
11625 if ( CheckVersion($DBversion) ) {
11626
11627     $dbh->do(q{ALTER TABLE borrowers ADD privacy_guarantor_checkouts BOOLEAN NOT NULL DEFAULT '0' AFTER privacy});
11628
11629     $dbh->do(q{ALTER TABLE deletedborrowers ADD privacy_guarantor_checkouts BOOLEAN NOT NULL DEFAULT '0' AFTER privacy});
11630
11631     $dbh->do(q{
11632         INSERT IGNORE INTO systempreferences (variable, value, options, explanation, type )
11633         VALUES (
11634             'AllowStaffToSetCheckoutsVisibilityForGuarantor',  '0', NULL,
11635             'If enabled, library staff can set a patron''s checkouts to be visible to linked patrons from the opac.',  'YesNo'
11636         ), (
11637             'AllowPatronToSetCheckoutsVisibilityForGuarantor',  '0', NULL,
11638             'If enabled, the patron can set checkouts to be visible to  his or her guarantor',  'YesNo'
11639         )
11640     });
11641
11642     print "Upgrade to $DBversion done (Bug 9303 - relative's checkouts in the opac)\n";
11643     SetVersion($DBversion);
11644 }
11645
11646 $DBversion = "3.23.00.009";
11647 if ( CheckVersion($DBversion) ) {
11648     $dbh->do(q{
11649         INSERT IGNORE INTO systempreferences (variable, value, options, explanation, type ) VALUES
11650         ( 'EnablePayPalOpacPayments',  '0', NULL ,  'Enables the ability to pay fees and fines from  the OPAC via PayPal',  'YesNo' ),
11651         ( 'PayPalChargeDescription',  'Koha fee payment', NULL ,  'This preference defines what the user will see the charge listed as in PayPal',  'Free' ),
11652         ( 'PayPalPwd',  '', NULL ,  'Your PayPal API password',  'Free' ),
11653         ( 'PayPalSandboxMode',  '1', NULL ,  'If enabled, the system will use PayPal''s sandbox server for testing, rather than the production server.',  'YesNo' ),
11654         ( 'PayPalSignature',  '', NULL ,  'Your PayPal API signature',  'Free' ),
11655         ( 'PayPalUser',  '', NULL ,  'Your PayPal API username ( email address )',  'Free' )
11656     });
11657
11658     print "Upgrade to $DBversion done (Bug 11622 - Add ability to pay fees and fines from OPAC via PayPal)\n";
11659     SetVersion($DBversion);
11660 }
11661
11662 $DBversion = "3.23.00.010";
11663 if ( CheckVersion($DBversion) ) {
11664     $dbh->do(q{
11665         ALTER TABLE issuingrules ADD cap_fine_to_replacement_price BOOLEAN NOT NULL DEFAULT '0' AFTER overduefinescap
11666     });
11667
11668     print "Upgrade to $DBversion done (Bug 9129 - Add the ability to set the maximum fine for an item to its replacement price)\n";
11669     SetVersion($DBversion);
11670 }
11671
11672 $DBversion = "3.23.00.011";
11673 if ( CheckVersion($DBversion) ) {
11674     $dbh->do(q{
11675         INSERT IGNORE INTO systempreferences ( `variable`, `value`, `options`, `explanation`, `type` ) VALUES ('HoldFeeMode','not_always','always|not_always','Set the hold fee mode','Choice')
11676     });
11677
11678     print "Upgrade to $DBversion done (Bug 13592 - Hold fee not being applied on placing a hold)\n";
11679     SetVersion($DBversion);
11680 }
11681
11682 $DBversion = "3.23.00.012";
11683 if ( CheckVersion($DBversion) ) {
11684     $dbh->do(q{
11685         INSERT IGNORE INTO systempreferences ( `variable`, `value`, `explanation`, `options`, `type` ) VALUES('MaxSearchResultsItemsPerRecordStatusCheck','20','Max number of items per record for which to check transit and hold status','','Integer')
11686     });
11687
11688     print "Upgrade to $DBversion done (Bug 15380 - Move the authority types related code to Koha::Authority::Type[s] - part 1)\n";
11689     SetVersion($DBversion);
11690 }
11691
11692 $DBversion = "3.23.00.013";
11693 if ( CheckVersion($DBversion) ) {
11694     $dbh->do(q{
11695         INSERT IGNORE INTO systempreferences ( `variable`, `value`, `options`, `explanation`, `type` ) VALUES ('StoreLastBorrower','0','','If ON, the last borrower to return an item will be stored in items.last_returned_by','YesNo')
11696     });
11697     $dbh->do(q{
11698         CREATE TABLE IF NOT EXISTS `items_last_borrower` (
11699   `id` int(11) NOT NULL AUTO_INCREMENT,
11700   `itemnumber` int(11) NOT NULL,
11701   `borrowernumber` int(11) NOT NULL,
11702   `created_on` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
11703   PRIMARY KEY (`id`),
11704   UNIQUE KEY `itemnumber` (`itemnumber`),
11705   KEY `borrowernumber` (`borrowernumber`),
11706   CONSTRAINT `items_last_borrower_ibfk_2` FOREIGN KEY (`borrowernumber`) REFERENCES `borrowers` (`borrowernumber`) ON DELETE CASCADE ON UPDATE CASCADE,
11707   CONSTRAINT `items_last_borrower_ibfk_1` FOREIGN KEY (`itemnumber`) REFERENCES `items` (`itemnumber`) ON DELETE CASCADE ON UPDATE CASCADE
11708 ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
11709     });
11710
11711     print "Upgrade to $DBversion done (Bug 14945 - Add the ability to store the last patron to return an item)\n";
11712     SetVersion($DBversion);
11713
11714 }
11715
11716 $DBversion = "3.23.00.014";
11717 if ( CheckVersion($DBversion) ) {
11718     $dbh->do(q{
11719         INSERT IGNORE INTO systempreferences ( `variable`, `value`, `options`, `explanation`, `type` )
11720 VALUES ('ClaimsBccCopy','0','','Bcc the ClaimAcquisition and ClaimIssues alerts','YesNo')
11721     });
11722
11723     print "Upgrade to $DBversion done (Bug 10076 - Add Bcc syspref for claimacquisition and clamissues)\n";
11724     SetVersion($DBversion);
11725 }
11726
11727 $DBversion = "3.23.00.015";
11728 if ( CheckVersion($DBversion) ) {
11729     $dbh->do(q{
11730         UPDATE letter SET code = "HOLD_SLIP" WHERE code = "RESERVESLIP";
11731     });
11732
11733     print "Upgrade to $DBversion done (Bug 15443 - Re-code RESERVESLIP as HOLD_SLIP)\n";
11734     SetVersion($DBversion);
11735 }
11736
11737 $DBversion = "3.23.00.016";
11738 if ( CheckVersion($DBversion) ) {
11739     $dbh->do(q{
11740     INSERT IGNORE INTO systempreferences (variable,value,options,explanation,type)
11741     VALUES ('OpacResetPassword',  '0','','Shows the ''Forgot your password?'' link in the OPAC','YesNo');
11742 });
11743     $dbh->do(q{
11744     CREATE TABLE IF NOT EXISTS borrower_password_recovery (
11745       borrowernumber int(11) NOT NULL,
11746       uuid varchar(128) NOT NULL,
11747       valid_until timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
11748       PRIMARY KEY (borrowernumber),
11749       KEY borrowernumber (borrowernumber)
11750     ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
11751 });
11752     $dbh->do(q{
11753     INSERT IGNORE INTO `letter` (module, code, branchcode, name, is_html, title, content, message_transport_type)
11754     VALUES ('members','PASSWORD_RESET','','Online password reset',1,'Koha password recovery','<html>\r\n<p>This email has been sent in response to your password recovery request for the account <strong><<user>></strong>.\r\n</p>\r\n<p>\r\nYou can now create your new password using the following link:\r\n<br/><a href=\"<<passwordreseturl>>\"><<passwordreseturl>></a>\r\n</p>\r\n<p>This link will be valid for 2 days from this email\'s reception, then you must reapply if you do not change your password.</p>\r\n<p>Thank you.</p>\r\n</html>\r\n','email');
11755
11756     });
11757
11758     print "Upgrade to $DBversion done (Bug 8753 - Add forgot password link to OPAC)\n";
11759     SetVersion($DBversion);
11760 }
11761
11762 $DBversion = "3.23.00.017";
11763 if ( CheckVersion($DBversion) ) {
11764
11765 $dbh->do(q{
11766     DELETE FROM uploaded_files
11767     WHERE COALESCE(permanent,0)=0 AND dir='koha_upload'
11768 });
11769
11770 my $tmp = C4::Context->temporary_directory . '/koha_upload';
11771 remove_tree( $tmp ) if -d $tmp;
11772
11773     print "Upgrade to $DBversion done (Bug 14893 - Separate temporary storage per instance in Upload.pm)\n";
11774     SetVersion($DBversion);
11775
11776 }
11777
11778 $DBversion = "3.23.00.018";
11779 if ( CheckVersion($DBversion) ) {
11780     $dbh->do(q{
11781         UPDATE systempreferences SET value="0" where type="YesNo" and value="";
11782     });
11783
11784     print "Upgrade to $DBversion done (Bug 15446 - Fix systempreferences rows where type=YesNo and value='')\n";
11785     SetVersion($DBversion);
11786 }
11787
11788 $DBversion = "3.23.00.019";
11789 if ( CheckVersion($DBversion) ) {
11790     $dbh->do(q{
11791         UPDATE `authorised_values` SET `lib`='Non-fiction' WHERE `lib`='Non Fiction';
11792     });
11793
11794     print "Upgrade to $DBversion done (Bug 15411 - Change Non Fiction to Non-fiction in authorised_values)\n";
11795     SetVersion($DBversion);
11796 }
11797
11798 $DBversion = "3.23.00.020";
11799 if ( CheckVersion($DBversion) ) {
11800     $dbh->do(q{
11801         CREATE TABLE  sms_providers (
11802            id INT( 11 ) NOT NULL AUTO_INCREMENT PRIMARY KEY ,
11803            name VARCHAR( 255 ) NOT NULL ,
11804            domain VARCHAR( 255 ) NOT NULL ,
11805            UNIQUE (
11806                name
11807            )
11808         ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
11809     });
11810
11811     $dbh->do(q{
11812         ALTER TABLE borrowers ADD sms_provider_id INT( 11 ) NULL DEFAULT NULL AFTER smsalertnumber;
11813     });
11814     $dbh->do(q{
11815         ALTER TABLE borrowers ADD FOREIGN KEY ( sms_provider_id ) REFERENCES sms_providers ( id ) ON UPDATE CASCADE ON DELETE SET NULL;
11816     });
11817     $dbh->do(q{
11818         ALTER TABLE deletedborrowers ADD sms_provider_id INT( 11 ) NULL DEFAULT NULL AFTER smsalertnumber;
11819     });
11820
11821     print "Upgrade to $DBversion done (Bug 9021 - Add SMS via email as an alternative to SMS services via SMS::Send drivers)\n";
11822     SetVersion($DBversion);
11823 }
11824
11825 $DBversion = "3.23.00.021";
11826 if ( CheckVersion($DBversion) ) {
11827     $dbh->do(q{
11828         INSERT IGNORE INTO systempreferences ( `variable`, `value`, `options`, `explanation`, `type` ) VALUES ('ShowAllCheckins', '0', '', 'Show all checkins', 'YesNo');
11829     });
11830
11831     print "Upgrade to $DBversion done (Bug 15736 - Add a preference to control whether all items should be shown in checked-in items list)\n";
11832     SetVersion($DBversion);
11833 }
11834
11835 $DBversion = "3.23.00.022";
11836 if ( CheckVersion($DBversion) ) {
11837     $dbh->do(q{ ALTER TABLE tags_all MODIFY COLUMN borrowernumber INT(11) });
11838     $dbh->do(q{ ALTER TABLE tags_all drop FOREIGN KEY tags_borrowers_fk_1 });
11839     $dbh->do(q{ ALTER TABLE tags_all ADD CONSTRAINT `tags_borrowers_fk_1` FOREIGN KEY (`borrowernumber`) REFERENCES `borrowers` (`borrowernumber`) ON DELETE SET NULL ON UPDATE CASCADE });
11840     $dbh->do(q{ ALTER TABLE tags_approval DROP FOREIGN KEY tags_approval_borrowers_fk_1 });
11841     $dbh->do(q{ ALTER TABLE tags_approval ADD CONSTRAINT `tags_approval_borrowers_fk_1` FOREIGN KEY (`approved_by`) REFERENCES `borrowers` (`borrowernumber`) ON DELETE SET NULL ON UPDATE CASCADE });
11842
11843     print "Upgrade to $DBversion done (Bug 13534 - Deleting staff patron will delete tags approved by this patron)\n";
11844     SetVersion($DBversion);
11845 }
11846
11847 $DBversion = "3.23.00.023";
11848 if ( CheckVersion($DBversion) ) {
11849     $dbh->do(q{
11850         INSERT IGNORE INTO systempreferences (variable,value,explanation,options,type)
11851         VALUES('OpenLibrarySearch','0','If Yes Open Library search results will show in OPAC',NULL,'YesNo');
11852     });
11853
11854     print "Upgrade to $DBversion done (Bug 6624 - Allow Koha to use the new read API from OpenLibrary)\n";
11855     SetVersion($DBversion);
11856 }
11857
11858 $DBversion = "3.23.00.024";
11859 if ( CheckVersion($DBversion) ) {
11860     $dbh->do(q{
11861         ALTER TABLE deletedborrowers MODIFY COLUMN userid VARCHAR(75) DEFAULT NULL;
11862     });
11863
11864     $dbh->do(q{
11865         ALTER TABLE deletedborrowers MODIFY COLUMN password VARCHAR(60) DEFAULT NULL;
11866     });
11867
11868     print "Upgrade to $DBversion done (Bug 15517 - Tables borrowers and deletedborrowers differ again)\n";
11869     SetVersion($DBversion);
11870 }
11871
11872 $DBversion = "3.23.00.025";
11873 if ( CheckVersion($DBversion) ) {
11874     $dbh->do(q{
11875         DROP TABLE IF EXISTS nozebra;
11876     });
11877
11878     print "Upgrade to $DBversion done (Bug 15526 - Drop nozebra database table)\n";
11879     SetVersion($DBversion);
11880 }
11881
11882 $DBversion = "3.23.00.026";
11883 if ( CheckVersion($DBversion) ) {
11884     $dbh->do(q{
11885         UPDATE systempreferences SET value = CONCAT_WS('|', IF(value='', NULL, value), "password") WHERE variable="PatronSelfRegistrationBorrowerUnwantedField" AND value NOT LIKE "%password%";
11886     });
11887
11888     print "Upgrade to $DBversion done (Bug 15343 - Allow patrons to choose their own password on self registration)\n";
11889     SetVersion($DBversion);
11890 }
11891
11892 $DBversion = "3.23.00.027";
11893 if ( CheckVersion($DBversion) ) {
11894     my ( $db_value ) = $dbh->selectrow_array(q|SELECT count(*) FROM branches|);
11895     my $pref_value = C4::Context->preference("singleBranchMode") || 0;
11896     if ( $db_value > 1 and $pref_value == 1 ) {
11897         warn "WARNING: You have more than 1 libraries in your branches tables but the singleBranchMode system preference is on.\n";
11898         warn "This configuration does not make sense. The system preference is going to be deleted,\n";
11899         warn "and this parameter will be based on the number of libraries defined.\n";
11900     }
11901     $dbh->do(q|DELETE FROM systempreferences WHERE variable="singleBranchMode"|);
11902
11903     print "Upgrade to $DBversion done (Bug 4941 - Can't set branch in staff client when singleBranchMode is enabled)\n";
11904     SetVersion($DBversion);
11905 }
11906
11907 $DBversion = "3.23.00.028";
11908 if ( CheckVersion($DBversion) ) {
11909     $dbh->do(q{
11910         INSERT IGNORE INTO systempreferences ( `variable`, `value`, `options`, `explanation`, `type` ) SELECT 'PatronSelfModificationBorrowerUnwantedField',value,NULL,'Name the fields you don\'t want to display when a patron is editing their information via the OPAC.','free' FROM systempreferences WHERE variable = 'PatronSelfRegistrationBorrowerUnwantedField';
11911     });
11912
11913     print "Upgrade to $DBversion done (Bug 14658 - Split PatronSelfRegistrationBorrowerUnwantedField into two preferences for creating and editing)\n";
11914     SetVersion($DBversion);
11915 }
11916
11917 $DBversion = "3.23.00.029";
11918 if ( CheckVersion($DBversion) ) {
11919
11920     # move marc21_field_003.pl 040c and 040d to marc21_orgcode.pl
11921     $dbh->do(q{
11922         update marc_subfield_structure set value_builder='marc21_orgcode.pl' where value_builder IN ( 'marc21_field_003.pl', 'marc21_field_040c.pl', 'marc21_field_040d.pl' );
11923     });
11924     $dbh->do(q{
11925         update auth_subfield_structure set value_builder='marc21_orgcode.pl' where value_builder IN ( 'marc21_field_003.pl', 'marc21_field_040c.pl', 'marc21_field_040d.pl' );
11926     });
11927
11928     print "Upgrade to $DBversion done (Bug 14199 - Unify all organization code plugins)\n";
11929     SetVersion($DBversion);
11930 }
11931
11932 $DBversion = "3.23.00.030";
11933 if(CheckVersion($DBversion)) {
11934     $dbh->do(q{
11935         INSERT IGNORE INTO systempreferences (variable,value,options,explanation,type)
11936         VALUES ('OpacMaintenanceNotice','','','A user-defined block of HTML to appear on screen when OpacMaintenace is enabled','Textarea')
11937     });
11938
11939     print "Upgrade to $DBversion done (Bug 15311: Let libraries set text to display when OpacMaintenance = on)\n";
11940     SetVersion($DBversion);
11941 }
11942
11943 $DBversion = "3.23.00.031";
11944 if(CheckVersion($DBversion)) {
11945     $dbh->do(q{
11946         INSERT IGNORE INTO systempreferences (variable,value,explanation,options,type)
11947         VALUES ('NoRenewalBeforePrecision', 'date', 'Calculate "No renewal before" based on date or exact time. Only relevant for loans calculated in days, hourly loans are not affected.', 'date|exact_time', 'Choice')
11948     });
11949
11950     print "Upgrade to $DBversion done (Bug 14395 - Two different ways to calculate 'No renewal before')\n";
11951     SetVersion($DBversion);
11952 }
11953
11954 $DBversion = "3.23.00.032";
11955 if ( CheckVersion($DBversion) ) {
11956     $dbh->do(q{
11957    -- Add issue_id to accountlines table
11958     ALTER TABLE accountlines ADD issue_id INT(11) NULL DEFAULT NULL AFTER accountlines_id;
11959     });
11960
11961 ## Close out any accruing fines with no current issue
11962     $dbh->do(q{
11963     UPDATE accountlines LEFT JOIN issues USING ( itemnumber, borrowernumber ) SET accounttype = 'F' WHERE accounttype = 'FU' and issues.issue_id IS NULL;
11964     });
11965
11966 ## Close out any extra not really accruing fines, keep only the latest accring fine
11967     $dbh->do(q{
11968     UPDATE accountlines a1
11969     LEFT JOIN (SELECT MAX(accountlines_id) AS keeper,
11970                       borrowernumber,
11971                       itemnumber
11972                FROM   accountlines
11973                WHERE  accounttype = 'FU'
11974                GROUP BY borrowernumber, itemnumber
11975               ) a2 USING ( borrowernumber, itemnumber )
11976     SET    a1.accounttype = 'F'
11977     WHERE  a1.accounttype = 'FU'
11978     AND  a1.accountlines_id != a2.keeper;
11979     });
11980
11981 ## Update the unclosed fines to add the current issue_id to them
11982     $dbh->do(q{
11983     UPDATE accountlines LEFT JOIN issues USING ( itemnumber ) SET accountlines.issue_id = issues.issue_id WHERE accounttype = 'FU'; 
11984     });
11985
11986     print "Upgrade to $DBversion done (Bug 15675 - Add issue_id column to accountlines and use it for updating fines)\n";
11987     SetVersion($DBversion);
11988 }
11989
11990 $DBversion = "3.23.00.033";
11991 if ( CheckVersion($DBversion) ) {
11992     $dbh->do(q{
11993     UPDATE systempreferences SET value = CONCAT_WS('|', IF(value = '', NULL, value), 'cardnumber') WHERE variable = 'PatronSelfRegistrationBorrowerUnwantedField' AND value NOT LIKE '%cardnumber%';
11994     });
11995
11996     $dbh->do(q{
11997     UPDATE systempreferences SET value = CONCAT_WS('|', IF(value = '', NULL, value), 'categorycode') WHERE variable = 'PatronSelfRegistrationBorrowerUnwantedField' AND value NOT LIKE '%categorycode%';
11998     });
11999
12000     print "Upgrade to $DBversion done (Bug 14659 - Allow patrons to enter card number and patron category on OPAC registration page)\n";
12001     SetVersion($DBversion);
12002 }
12003
12004 $DBversion = "3.23.00.034";
12005 if ( C4::Context->preference("Version") < TransformToNum($DBversion) ) {
12006     $dbh->do(q{
12007         ALTER TABLE `items` ADD `new` VARCHAR(32) NULL AFTER `stocknumber`;
12008     });
12009     $dbh->do(q{
12010         ALTER TABLE `deleteditems` ADD `new` VARCHAR(32) NULL AFTER `stocknumber`;
12011     });
12012     print "Upgrade to $DBversion done (Bug 11023: Adds field 'new' in items and deleteditems tables)\n";
12013     SetVersion($DBversion);
12014 }
12015
12016 $DBversion = "3.23.00.035";
12017 if ( C4::Context->preference("Version") < TransformToNum($DBversion) ) {
12018     $dbh->do(q{
12019         INSERT IGNORE INTO systempreferences (variable,value,explanation,options,type) VALUES ('HTML5MediaYouTube',0,'Embed|Don\'t embed','YouTube links as videos','YesNo');
12020     });
12021     print "Upgrade to $DBversion done (Bug 14168 - enhance streaming cataloging to include youtube)\n";
12022
12023     SetVersion($DBversion);
12024     }
12025
12026 $DBversion = "3.23.00.036";
12027 if ( C4::Context->preference("Version") < TransformToNum($DBversion) ) {
12028     $dbh->do(q{
12029     INSERT IGNORE INTO systempreferences (variable,value,explanation,type) VALUES ('HoldsQueueSkipClosed', '0', 'If enabled, any libraries that are closed when the holds queue is built will be ignored for the purpose of filling holds.', 'YesNo');
12030     });
12031     print "Upgrade to $DBversion done (Bug 12803 - Add ability to skip closed libraries when generating the holds queue)\n";
12032     SetVersion($DBversion);
12033     }
12034
12035 $DBversion = "3.23.00.037";
12036 if ( C4::Context->preference("Version") < TransformToNum($DBversion) ) {
12037 ## Add the new currency.archived column
12038     $dbh->do(q{
12039     ALTER TABLE currency ADD column archived tinyint(1) DEFAULT 0;
12040     });
12041 ## Set currency=NULL if empty (just in case)
12042     $dbh->do(q{
12043     UPDATE aqorders SET currency=NULL WHERE currency="";
12044     });
12045 ## Insert the missing currency and mark them as archived before adding the FK
12046     $dbh->do(q{
12047     INSERT INTO currency(currency, archived) SELECT distinct currency, 1 FROM aqorders WHERE currency NOT IN (SELECT currency FROM currency);
12048     });
12049 ## Correct the field length in aqorders before adding FK too
12050     $dbh->do(q{ ALTER TABLE aqorders MODIFY COLUMN currency varchar(10) default NULL; });
12051 ## And finally add the FK
12052     $dbh->do(q{
12053     ALTER TABLE aqorders ADD FOREIGN KEY (currency) REFERENCES currency(currency) ON DELETE SET NULL ON UPDATE SET null;
12054     });
12055
12056     print "Upgrade to $DBversion done (Bug 15084 - Move the currency related code to Koha::Acquisition::Currenc[y|ies])\n";
12057     SetVersion($DBversion);
12058 }
12059
12060 $DBversion = "3.23.00.038";
12061 if ( C4::Context->preference("Version") < TransformToNum($DBversion) ) {
12062     $dbh->do(q{
12063     INSERT IGNORE INTO systempreferences ( `variable`, `value`, `options`, `explanation`, `type` ) VALUES ('decreaseLoanHighHoldsControl', 'static', 'static|dynamic', "Chooses between static and dynamic high holds checking", 'Choice'), ('decreaseLoanHighHoldsIgnoreStatuses', '', 'damaged|itemlost|notforloan|withdrawn', "Ignore items with these statuses for dynamic high holds checking", 'Choice');
12064     });
12065     print "Upgrade to $DBversion done (Bug 14694 - Make decreaseloanHighHolds more flexible)\n";
12066     SetVersion($DBversion);
12067 }
12068
12069 $DBversion = "3.23.00.039";
12070 if ( C4::Context->preference("Version") < TransformToNum($DBversion) ) {
12071
12072     $dbh->do(q{
12073     ALTER TABLE suggestions
12074     MODIFY COLUMN currency varchar(10) default NULL;
12075     });
12076     $dbh->do(q{
12077     ALTER TABLE aqbooksellers
12078     MODIFY COLUMN currency varchar(10) default NULL;
12079     });
12080     print "Upgrade to $DBversion done (Bug 15084 - Move the currency related code to Koha::Acquisition::Currenc[y|ies])\n";
12081     SetVersion($DBversion);
12082 }
12083
12084
12085 $DBversion = "3.23.00.040";
12086 if ( C4::Context->preference("Version") < TransformToNum($DBversion) ) {
12087
12088     my $c = $dbh->selectrow_array('SELECT COUNT(*) FROM systempreferences WHERE variable="intranetcolorstylesheet" AND value="blue.css"');
12089
12090     if ( $c ) {
12091         print "WARNING: You are using a stylesheeet which has been removed from the Koha codebase.\n";
12092         print "Update your intranetcolorstylesheet.\n";
12093     }
12094     print "Upgrade to $DBversion done (Bug 16019 - Check intranetcolorstylesheet for blue.css)\n";
12095     SetVersion($DBversion);
12096 }
12097
12098 $DBversion = "3.23.00.041";
12099 if ( C4::Context->preference("Version") < TransformToNum($DBversion) ) {
12100
12101     my $dbh = C4::Context->dbh;
12102     my ($print_error) = $dbh->{PrintError};
12103     $dbh->{RaiseError} = 0;
12104     $dbh->{PrintError} = 0;
12105     $dbh->do("ALTER TABLE overduerules_transport_types ADD COLUMN letternumber INT(1) NOT NULL DEFAULT 1 AFTER id");
12106     $dbh->{PrintError} = $print_error;
12107
12108     print "Upgrade to $DBversion done (Bug 16007: Make sure overduerules_transport_types.letternumber exists)\n";
12109     SetVersion($DBversion);
12110 }
12111
12112 $DBversion = "3.23.00.042";
12113 if ( C4::Context->preference("Version") < TransformToNum($DBversion) ) {
12114
12115     $dbh->do(q{
12116             ALTER TABLE items CHANGE new new_status VARCHAR(32) NULL;
12117             });
12118     $dbh->do(q{
12119             ALTER TABLE deleteditems CHANGE new new_status VARCHAR(32) NULL;
12120             });
12121     $dbh->do(q{
12122             UPDATE systempreferences SET value=REPLACE(value, '"items.new"', '"items.new_status"') WHERE variable="automatic_item_modification_by_age_configuration";
12123             });
12124
12125     print "Upgrade to $DBversion done (Bug 16004 - Replace items.new with items.new_status)\n";
12126     SetVersion($DBversion);
12127 }
12128
12129 $DBversion = "3.23.00.043";
12130 if ( C4::Context->preference("Version") < TransformToNum($DBversion) ) {
12131     $dbh->do(q{
12132             UPDATE systempreferences SET value="" WHERE value IS NULL;
12133             });
12134
12135     print "Upgrade to $DBversion done (Bug 16070 - Empty (undef) system preferences may cause some issues in combination with memcache)\n";
12136     SetVersion($DBversion);
12137 }
12138
12139 $DBversion = "3.23.00.044";
12140 if ( C4::Context->preference("Version") < TransformToNum($DBversion) ) {
12141     $dbh->do(q{
12142             INSERT IGNORE INTO systempreferences (variable,value,explanation,options,type) VALUES
12143             ('GoogleOpenIDConnect', '0', NULL, 'if ON, allows the use of Google OpenID Connect for login', 'YesNo'),
12144             ('GoogleOAuth2ClientID', '', NULL, 'Client ID for the web app registered with Google', 'Free'),
12145             ('GoogleOAuth2ClientSecret', '', NULL, 'Client Secret for the web app registered with Google', 'Free'),
12146             ('GoogleOpenIDConnectDomain', '', NULL, 'Restrict OpenID Connect to this domain (or subdomains of this domain). Leave blank for all Google domains', 'Free');
12147             });
12148
12149     print "Upgrade to $DBversion done (Bug 10988 - Allow login via Google OAuth2 (OpenID Connect))\n";
12150     SetVersion($DBversion);
12151 }
12152
12153 $DBversion = "3.23.00.045";
12154 if ( CheckVersion($DBversion) ) {
12155 ## Holds details for vendors supplying goods by EDI
12156    $dbh->do(q{
12157            CREATE TABLE IF NOT EXISTS vendor_edi_accounts (
12158                    id INT(11) NOT NULL auto_increment,
12159                    description TEXT NOT NULL,
12160                    host VARCHAR(40),
12161                    username VARCHAR(40),
12162                    password VARCHAR(40),
12163                    last_activity DATE,
12164                    vendor_id INT(11) REFERENCES aqbooksellers( id ),
12165                    download_directory TEXT,
12166                    upload_directory TEXT,
12167                    san VARCHAR(20),
12168                    id_code_qualifier VARCHAR(3) default '14',
12169                    transport VARCHAR(6) default 'FTP',
12170                    quotes_enabled TINYINT(1) not null default 0,
12171                    invoices_enabled TINYINT(1) not null default 0,
12172                    orders_enabled TINYINT(1) not null default 0,
12173                    responses_enabled TINYINT(1) not null default 0,
12174                    auto_orders TINYINT(1) not null default 0,
12175                    shipment_budget INTEGER(11) REFERENCES aqbudgets( budget_id ),
12176                    PRIMARY KEY  (id),
12177                    KEY vendorid (vendor_id),
12178                    KEY shipmentbudget (shipment_budget),
12179                    CONSTRAINT vfk_vendor_id FOREIGN KEY ( vendor_id ) REFERENCES aqbooksellers ( id ),
12180                    CONSTRAINT vfk_shipment_budget FOREIGN KEY ( shipment_budget ) REFERENCES aqbudgets ( budget_id )
12181                        ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
12182    });
12183
12184 ## Hold the actual edifact messages with links to associated baskets
12185    $dbh->do(q{
12186            CREATE TABLE IF NOT EXISTS edifact_messages (
12187                    id INT(11) NOT NULL auto_increment,
12188                    message_type VARCHAR(10) NOT NULL,
12189                    transfer_date DATE,
12190                    vendor_id INT(11) REFERENCES aqbooksellers( id ),
12191                    edi_acct  INTEGER REFERENCES vendor_edi_accounts( id ),
12192                    status TEXT,
12193                    basketno INT(11) REFERENCES aqbasket( basketno),
12194                    raw_msg MEDIUMTEXT,
12195                    filename TEXT,
12196                    deleted BOOLEAN NOT NULL DEFAULT 0,
12197                    PRIMARY KEY  (id),
12198                    KEY vendorid ( vendor_id),
12199                    KEY ediacct (edi_acct),
12200                    KEY basketno ( basketno),
12201                    CONSTRAINT emfk_vendor FOREIGN KEY ( vendor_id ) REFERENCES aqbooksellers ( id ),
12202                    CONSTRAINT emfk_edi_acct FOREIGN KEY ( edi_acct ) REFERENCES vendor_edi_accounts ( id ),
12203                    CONSTRAINT emfk_basketno FOREIGN KEY ( basketno ) REFERENCES aqbasket ( basketno )
12204                        ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
12205             });
12206
12207 ## invoices link back to the edifact message it was generated from
12208    $dbh->do(q{
12209            ALTER TABLE aqinvoices ADD COLUMN message_id INT(11) REFERENCES edifact_messages( id );
12210            });
12211
12212 ## clean up link on deletes
12213    $dbh->do(q{
12214            ALTER TABLE aqinvoices ADD CONSTRAINT edifact_msg_fk FOREIGN KEY ( message_id ) REFERENCES edifact_messages ( id ) ON DELETE SET NULL;
12215            });
12216
12217 ## Hold the supplier ids from quotes for ordering
12218 ## although this is an EAN-13 article number the standard says 35 characters ???
12219    $dbh->do(q{
12220            ALTER TABLE aqorders ADD COLUMN line_item_id VARCHAR(35);
12221            });
12222
12223 ## The suppliers unique reference usually a quotation line number ('QLI')
12224 ## Otherwise Suppliers unique orderline reference ('SLI')
12225    $dbh->do(q{
12226            ALTER TABLE aqorders ADD COLUMN suppliers_reference_number VARCHAR(35);
12227            });
12228    $dbh->do(q{
12229            ALTER TABLE aqorders ADD COLUMN suppliers_reference_qualifier VARCHAR(3);
12230            });
12231    $dbh->do(q{
12232            ALTER TABLE aqorders ADD COLUMN suppliers_report text;
12233            });
12234
12235 ## hold the EAN/SAN used in ordering
12236    $dbh->do(q{
12237            CREATE TABLE IF NOT EXISTS edifact_ean (
12238                    ee_id int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
12239                    description VARCHAR(128) NULL DEFAULT NULL,
12240                    branchcode VARCHAR(10) NOT NULL REFERENCES branches (branchcode),
12241                    ean VARCHAR(15) NOT NULL,
12242                    id_code_qualifier VARCHAR(3) NOT NULL DEFAULT '14',
12243                    CONSTRAINT efk_branchcode FOREIGN KEY ( branchcode ) REFERENCES branches ( branchcode )
12244                    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
12245            });
12246
12247 ## Add a permission for managing EDI
12248    $dbh->do(q{
12249            INSERT INTO permissions (module_bit, code, description) values (11, 'edi_manage', 'Manage EDIFACT transmissions');
12250            });
12251
12252    print "Upgrade to $DBversion done (Bug 7736 - Edifact QUOTE and ORDER functionality))\n";
12253    SetVersion($DBversion);
12254 }
12255
12256 $DBversion = "3.23.00.046";
12257 if ( C4::Context->preference("Version") < TransformToNum($DBversion) ) {
12258
12259     $dbh->do(q{
12260     ALTER TABLE vendor_edi_accounts ADD COLUMN plugin VARCHAR(256) NOT NULL DEFAULT "";
12261     });
12262
12263     print "Upgrade to $DBversion done (Bug 15630 - Make Edifact module pluggable))\n";
12264     SetVersion($DBversion);
12265 }
12266
12267 $DBversion = "3.23.00.047";
12268 if ( C4::Context->preference("Version") < TransformToNum($DBversion) ) {
12269
12270     $dbh->do(q{
12271          INSERT IGNORE INTO systempreferences (variable,value,explanation,options,type) VALUES ('IntranetReportsHomeHTML', '', 'Show the following HTML in a div on the bottom of the reports home page', NULL, 'Free');
12272          });
12273     $dbh->do(q{
12274          INSERT IGNORE INTO systempreferences (variable,value,explanation,options,type) VALUES ('IntranetCirculationHomeHTML', '', 'Show the following HTML in a div on the bottom of the reports home page', NULL, 'Free');
12275          });
12276
12277     print "Upgrade to $DBversion done (Bug 15008 - Add custom HTML areas to circulation and reports home pages)\n";
12278     SetVersion($DBversion);
12279 }
12280
12281 $DBversion = "3.23.00.048";
12282 if ( C4::Context->preference("Version") < TransformToNum($DBversion) ) {
12283     $dbh->do(q{
12284     INSERT IGNORE INTO `systempreferences` (variable,value,options,explanation,type)  SELECT 'OPACISBD', value, '70|10', 'Allows to define ISBD view in OPAC', 'Textarea' FROM `systempreferences` WHERE variable = 'ISBD';
12285     });
12286
12287     print "Upgrade to $DBversion done (Bug 5979 - Add separate OPACISBD system preference)\n";
12288     SetVersion($DBversion);
12289 }
12290
12291
12292
12293 $DBversion = "3.23.00.049";
12294 if ( C4::Context->preference("Version") < TransformToNum($DBversion) ) {
12295 my $dbh = C4::Context->dbh;
12296 my ( $column_has_been_used ) = $dbh->selectrow_array(q|
12297             SELECT COUNT(*)
12298                 FROM borrower_attributes
12299                     WHERE password IS NOT NULL
12300                     |);
12301
12302 if ( $column_has_been_used ) {
12303         print q|WARNING: The columns borrower_attribute_types.password_allowed and borrower_attributes.password have been removed from the Koha codebase. They were not used. However your installation has at least one borrower_attributes.password defined. In order not to alter your data, the columns have been kept, please save the information elsewhere and remove these columns manually.|;
12304 } else {
12305         $dbh->do(q|
12306         ALTER TABLE borrower_attribute_types DROP column password_allowed
12307         |);
12308         $dbh->do(q|
12309         ALTER TABLE borrower_attributes DROP column password;
12310         |);
12311     }
12312     print "Upgrade to $DBversion done (Bug 12267 - Allow password option in Patron Attribute non functional)\n";
12313         SetVersion($DBversion);
12314 }
12315
12316
12317 $DBversion = "3.23.00.050";
12318 if ( CheckVersion($DBversion) ) {
12319
12320     $dbh->do(q|INSERT IGNORE INTO systempreferences (variable,value,explanation,options,type)
12321                     VALUES('SearchEngine','Zebra','Choose Search Engine','','Choice')|);
12322
12323
12324     $dbh->do(q|DROP TABLE IF EXISTS search_marc_to_field|);
12325     $dbh->do(q|DROP TABLE IF EXISTS search_marc_map|);
12326     $dbh->do(q|DROP TABLE IF EXISTS search_field|);
12327
12328 # This specifies the fields that will be stored in the search engine.
12329  $dbh->do(q|
12330          CREATE TABLE `search_field` (
12331              `id` int(11) NOT NULL AUTO_INCREMENT, 
12332              `name` varchar(255) NOT NULL COMMENT 'the name of the field as it will be stored in the search engine',
12333              `label` varchar(255) NOT NULL COMMENT 'the human readable name of the field, for display', 
12334              `type` ENUM('', 'string', 'date', 'number', 'boolean', 'sum') NOT NULL COMMENT 'what type of data this holds, relevant when storing it in the search engine',
12335              PRIMARY KEY (`id`),
12336              UNIQUE KEY (`name`)
12337              ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
12338          |);
12339 # This contains a MARC field specifier for a given index, marc type, and marc
12340 # field.
12341 $dbh->do(q|
12342         CREATE TABLE `search_marc_map` (
12343             id int(11) NOT NULL AUTO_INCREMENT,
12344             index_name ENUM('biblios','authorities') NOT NULL COMMENT 'what storage index this map is for',
12345             marc_type ENUM('marc21', 'unimarc', 'normarc') NOT NULL COMMENT 'what MARC type this map is for',
12346             marc_field VARCHAR(255) NOT NULL COMMENT 'the MARC specifier for this field',
12347             PRIMARY KEY(`id`),
12348             unique key( index_name, marc_field, marc_type),
12349             INDEX (`index_name`)
12350             ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
12351         |);
12352
12353 # This joins the two search tables together. We can have any combination:
12354 # one marc field could have many search fields (maybe you want one value
12355 # to go to 'author' and 'corporate-author) and many marc fields could go
12356 # to one search field (e.g. all the various author fields going into
12357 # 'author'.)
12358 #
12359 # a note about the sort field:
12360 # * if all the entries for a mapping are 'null', nothing special is done with that mapping.
12361 # * if any of the entries are not null, then a __sort field is created in ES for this mapping. In this case:
12362 #   * any mapping with sort == false WILL NOT get copied into a __sort field
12363 #   * any mapping with sort == true or is null WILL get copied into a __sort field
12364 #   * any sorts on the field name will be applied to $fieldname.'__sort' instead.
12365 # this means that we can have search for author that includes 1xx, 245$c, and 7xx, but the sort only applies to 1xx.
12366
12367 $dbh->do(q|
12368         CREATE TABLE `search_marc_to_field` (
12369             search_marc_map_id int(11) NOT NULL,
12370             search_field_id int(11) NOT NULL,
12371             facet boolean DEFAULT FALSE COMMENT 'true if a facet field should be generated for this',
12372             suggestible boolean DEFAULT FALSE COMMENT 'true if this field can be used to generate suggestions for browse',
12373             sort boolean DEFAULT NULL COMMENT 'true/false creates special sort handling, null doesn''t',
12374             PRIMARY KEY(search_marc_map_id, search_field_id),
12375             FOREIGN KEY(search_marc_map_id) REFERENCES search_marc_map(id) ON DELETE CASCADE ON UPDATE CASCADE,
12376             FOREIGN KEY(search_field_id) REFERENCES search_field(id) ON DELETE CASCADE ON UPDATE CASCADE
12377             ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
12378         |);
12379
12380     print "WARNING: If you plan to use Elasticsearch you should go to 'Home › Administration › Search engine configuration' and reset the mappings\n";
12381     print "Upgrade to $DBversion done (Bug 12478 - Elasticsearch support for Koha)\n";
12382     SetVersion($DBversion);
12383 }
12384
12385
12386 $DBversion = "3.23.00.051";
12387 if ( CheckVersion($DBversion) ) {
12388 $dbh->do(q{
12389         ALTER TABLE edifact_messages
12390         DROP FOREIGN KEY emfk_vendor,
12391         DROP FOREIGN KEY emfk_edi_acct,
12392         DROP FOREIGN KEY emfk_basketno;
12393         });
12394
12395 $dbh->do(q{
12396         ALTER TABLE edifact_messages
12397         ADD CONSTRAINT emfk_vendor FOREIGN KEY ( vendor_id ) REFERENCES aqbooksellers ( id ) ON DELETE CASCADE ON UPDATE CASCADE,
12398         ADD CONSTRAINT emfk_edi_acct FOREIGN KEY ( edi_acct ) REFERENCES vendor_edi_accounts ( id ) ON DELETE CASCADE ON UPDATE CASCADE,
12399         ADD CONSTRAINT emfk_basketno FOREIGN KEY ( basketno ) REFERENCES aqbasket ( basketno ) ON DELETE CASCADE ON UPDATE CASCADE;
12400         });
12401
12402     print "Upgrade to $DBversion done (Bug 16354 - Fix FK constraints for edifact_messages table)\n";
12403     SetVersion($DBversion);
12404 }
12405
12406
12407 $DBversion = "3.23.00.052";
12408 if ( CheckVersion($DBversion) ) {
12409 ## Insert permission
12410
12411     $dbh->do(q{
12412         INSERT IGNORE INTO permissions (module_bit, code, description) VALUES
12413         (13, 'upload_general_files', 'Upload any file'),
12414         (13, 'upload_manage', 'Manage uploaded files');
12415         });
12416 ## Update user_permissions for current users (check count in uploaded_files)
12417 ## Note 9 == edit_catalogue and 13 == tools
12418 ## We do not insert if someone is superlibrarian, does not have edit_catalogue,
12419 ## or already has all tools
12420
12421         $dbh->do(q{
12422                 INSERT IGNORE INTO user_permissions (borrowernumber, module_bit, code)
12423                 SELECT borrowernumber, 13, 'upload_general_files'
12424                 FROM borrowers bo
12425                 WHERE flags<>1 AND flags & POW(2,13) = 0 AND
12426                 ( flags & POW(2,9) > 0 OR 
12427                   (SELECT COUNT(*) FROM user_permissions
12428                    WHERE borrowernumber=bo.borrowernumber AND module_bit=9 ) > 0 )
12429                 AND ( SELECT COUNT(*) FROM uploaded_files ) > 0
12430                 });
12431
12432     print "Upgrade to $DBversion done (Bug 14686 - New menu option and permission for file uploading)\n";
12433     SetVersion($DBversion);
12434 }
12435
12436 $DBversion = "3.23.00.053";
12437 if ( CheckVersion($DBversion) ) {
12438     my $letters = $dbh->selectall_arrayref(
12439         q|
12440         SELECT code, name
12441         FROM letter
12442         WHERE message_transport_type="email"
12443         |, { Slice => {} }
12444     );
12445     for my $letter (@$letters) {
12446         $dbh->do(
12447             q|
12448                 UPDATE letter
12449                 SET name = ?
12450                 WHERE code = ?
12451                 AND message_transport_type <> "email"
12452                 |, undef, $letter->{name}, $letter->{code}
12453         );
12454     }
12455
12456     print "Upgrade to $DBversion done (Bug 16217 - Notice' names may have diverged)\n";
12457     SetVersion($DBversion);
12458 }
12459
12460 $DBversion = "3.23.00.054";
12461 if ( CheckVersion($DBversion) ) {
12462     $dbh->do(q{
12463         ALTER TABLE branch_item_rules ADD COLUMN hold_fulfillment_policy ENUM('any', 'homebranch', 'holdingbranch') NOT NULL DEFAULT 'any' AFTER holdallowed;
12464     });
12465     $dbh->do(q{
12466         ALTER TABLE default_branch_circ_rules ADD COLUMN hold_fulfillment_policy ENUM('any', 'homebranch', 'holdingbranch') NOT NULL DEFAULT 'any' AFTER holdallowed;
12467     });
12468     $dbh->do(q{
12469         ALTER TABLE default_branch_item_rules ADD COLUMN hold_fulfillment_policy ENUM('any', 'homebranch', 'holdingbranch') NOT NULL DEFAULT 'any' AFTER holdallowed;
12470     });
12471     $dbh->do(q{
12472         ALTER TABLE default_circ_rules ADD COLUMN hold_fulfillment_policy ENUM('any', 'homebranch', 'holdingbranch') NOT NULL DEFAULT 'any' AFTER holdallowed;
12473     });
12474
12475     print "Upgrade to $DBversion done (Bug 15532 - Add ability to allow only items whose home/holding branch matches the hold's pickup branch to fill a given hold)\n";
12476     SetVersion($DBversion);
12477 }
12478
12479 $DBversion = "3.23.00.055";
12480 if ( CheckVersion($DBversion) ) {
12481     $dbh->do(q{
12482         ALTER TABLE reserves ADD COLUMN itemtype VARCHAR(10) NULL DEFAULT NULL AFTER suspend_until;
12483     });
12484     $dbh->do(q{
12485         ALTER TABLE reserves ADD KEY `itemtype` (`itemtype`);
12486     });
12487     $dbh->do(q{
12488         ALTER TABLE reserves ADD CONSTRAINT `reserves_ibfk_5` FOREIGN KEY (`itemtype`) REFERENCES `itemtypes` (`itemtype`) ON DELETE CASCADE ON UPDATE CASCADE;
12489     });
12490     $dbh->do(q{
12491         ALTER TABLE old_reserves ADD COLUMN itemtype VARCHAR(10) NULL DEFAULT NULL AFTER suspend_until;
12492     });
12493     $dbh->do(q{
12494         ALTER TABLE old_reserves ADD KEY `itemtype` (`itemtype`);
12495     });
12496     $dbh->do(q{
12497         ALTER TABLE old_reserves ADD CONSTRAINT `old_reserves_ibfk_4` FOREIGN KEY (`itemtype`) REFERENCES `itemtypes` (`itemtype`) ON DELETE CASCADE ON UPDATE CASCADE;
12498     });
12499
12500     $dbh->do(q{
12501         INSERT IGNORE INTO systempreferences ( `variable`, `value`, `options`, `explanation`, `type` ) VALUES
12502         ('AllowHoldItemTypeSelection','0','','If enabled, patrons and staff will be able to select the itemtype when placing a hold','YesNo');
12503     });
12504
12505     print "Upgrade to $DBversion done (Bug 15533 - Allow patrons and librarians to select itemtype when placing hold)\n";
12506     SetVersion($DBversion);
12507 }
12508
12509 $DBversion = "3.23.00.056";
12510 if ( CheckVersion($DBversion) ) {
12511     $dbh->do(q{
12512         INSERT IGNORE INTO systempreferences ( `variable`, `value`, `options`, `explanation`, `type` ) VALUES
12513         ('NoIssuesChargeGuarantees','','','Define maximum amount withstanding before check outs are blocked','Integer');
12514     });
12515
12516     print "Upgrade to $DBversion done (Bug 14577 - Allow restriction of checkouts based on fines of guarantor/guarantee)\n";
12517     SetVersion($DBversion);
12518 }
12519
12520 $DBversion = "3.23.00.057";
12521 if ( CheckVersion($DBversion) ) {
12522     $dbh->do(q{
12523         ALTER TABLE aqbasket ADD COLUMN is_standing TINYINT(1) NOT NULL DEFAULT 0 AFTER branch;
12524     });
12525
12526     print "Upgrade to $DBversion done (Bug 15531 - Add support for standing orders)\n";
12527     SetVersion($DBversion);
12528 }
12529
12530 $DBversion = "3.23.00.058";
12531 if ( CheckVersion($DBversion) ) {
12532
12533     my ($count_imageurl) = $dbh->selectrow_array(q|
12534         SELECT COUNT(*)
12535         FROM authorised_values
12536         WHERE imageurl IS NOT NULL
12537             AND imageurl <> ""
12538     |);
12539
12540     unless ($count_imageurl) {
12541         if (   C4::Context->preference('AuthorisedValueImages')
12542             or C4::Context->preference('StaffAuthorisedValueImages') )
12543         {
12544             $dbh->do(q|
12545                 UPDATE systempreferences
12546                 SET value = 0
12547                 WHERE variable = "AuthorisedValueImages"
12548                    or variable = "StaffAuthorisedValueImages"
12549             |);
12550             warn "The system preferences AuthorisedValueImages and StaffAuthorisedValueImages have been turned off\n";
12551             warn "authorised_values.imageurl is not populated, that means you are not using this feature\n";
12552         }
12553     }
12554     else {
12555         warn "At least one authorised value has an icon defined (imageurl)\n";
12556         warn "The system preference AuthorisedValueImages or StaffAuthorisedValueImages could be turned off if you are not aware of this feature\n";
12557     }
12558
12559     print "Upgrade to $DBversion done (Bug 16041 - StaffAuthorisedValueImages & AuthorisedValueImages preferences - impact on search performance)\n";
12560     SetVersion($DBversion);
12561 }
12562
12563 $DBversion = "3.23.00.059";
12564 if ( CheckVersion($DBversion) ) {
12565     $dbh->do(q{
12566         DELETE FROM systempreferences WHERE variable="AuthorisedValueImages" OR variable="StaffAuthorisedValueImages";
12567     });
12568
12569     print "Upgrade to $DBversion done (Bug 16167 - Remove prefs to drive authorised value images)\n";
12570     SetVersion($DBversion);
12571 }
12572
12573 $DBversion = "3.23.00.060";
12574 if ( CheckVersion($DBversion) ) {
12575     $dbh->do(q{
12576         INSERT IGNORE INTO systempreferences ( value, variable, options, explanation,type )
12577         SELECT value ,'EnhancedMessagingPreferencesOPAC', NULL, 'If ON, allows patrons to select to receive additional messages about items due or nearly due.', 'YesNo' FROM systempreferences WHERE variable = 'EnhancedMessagingPreferences';
12578     });
12579
12580     print "Upgrade to $DBversion done (Bug 12528 - Enable staff to deny message setting access to patrons on the OPAC)\n";
12581     SetVersion($DBversion);
12582 }
12583
12584 $DBversion = "3.23.00.061";
12585 if ( CheckVersion($DBversion) ) {
12586     my ( $cnt ) = $dbh->selectrow_array( q|
12587         SELECT COUNT(*) FROM items it
12588         LEFT JOIN biblio bi ON bi.biblionumber=it.biblionumber
12589         LEFT JOIN biblioitems bii USING (biblioitemnumber)
12590         WHERE bi.biblionumber IS NULL
12591     |);
12592     if( $cnt ) {
12593         print "WARNING: You have corrupted data in your items table!! The table contains $cnt references to biblio records that do not exist.\nPlease correct your data IMMEDIATELY after this upgrade and manually add the foreign key constraint for biblionumber in the items table.\n";
12594     } else {
12595         # now add FK
12596         $dbh->do( q|
12597             ALTER TABLE items
12598             ADD FOREIGN KEY (`biblionumber`) REFERENCES `biblio` (`biblionumber`) ON DELETE CASCADE ON UPDATE CASCADE
12599         |);
12600         print "Upgrade to $DBversion done (Bug 16170 - Add FK for biblionumber in items)\n";
12601     }
12602     SetVersion($DBversion);
12603 }
12604
12605 $DBversion = "3.23.00.062";
12606 if ( CheckVersion($DBversion) ) {
12607     $dbh->do( q|
12608             ALTER TABLE aqorders DROP COLUMN budgetgroup_id;
12609             |);
12610     print "Upgrade to $DBversion done (Bug 16414 - aqorders.budgetgroup_id has never been used and can be removed)\n";
12611 SetVersion($DBversion);
12612 }
12613
12614 $DBversion = "3.23.00.063";
12615 if ( CheckVersion($DBversion) ) {
12616     $dbh->do(q{
12617         UPDATE letter SET branchcode='' WHERE branchcode IS NULL;
12618     });
12619     $dbh->do(q{
12620         ALTER TABLE letter MODIFY COLUMN branchcode varchar(10) NOT NULL DEFAULT ''
12621     });
12622     $dbh->do(q{
12623         ALTER TABLE permissions MODIFY COLUMN code varchar(64) NOT NULL DEFAULT '';
12624     });
12625     print "Upgrade to $DBversion done (Bug 16402: Fix DB structure to work on MySQL 5.7)\n";
12626     SetVersion($DBversion);
12627 }
12628
12629 $DBversion = "3.23.00.064";
12630 if ( CheckVersion($DBversion) ) {
12631     $dbh->do(q{
12632         ALTER TABLE creator_layouts MODIFY layout_name char(25) NOT NULL DEFAULT 'DEFAULT';
12633     });
12634     print "Upgrade to $DBversion done (Bug 15086 - Creators layout and template sql has warnings)\n";
12635     SetVersion($DBversion);
12636 }
12637
12638 $DBversion = "16.05.00.000";
12639 if ( CheckVersion($DBversion) ) {
12640     print "Upgrade to $DBversion done (Koha 16.05)\n";
12641     SetVersion($DBversion);
12642 }
12643
12644 $DBversion = "16.06.00.000";
12645 if ( CheckVersion($DBversion) ) {
12646     print "Upgrade to $DBversion done (Koha 16.06 - starting a new dev line at KohaCon16 in Thessaloniki, Greece! Koha is great!)\n";
12647     SetVersion($DBversion);
12648 }
12649
12650 $DBversion = "16.06.00.001";
12651 if ( CheckVersion($DBversion) ) {
12652     $dbh->do(q{
12653         UPDATE accountlines SET accounttype='HE', description=itemnumber WHERE (description REGEXP '^Hold waiting too long [0-9]+') AND accounttype='F';
12654     });
12655
12656     print "Upgrade to $DBversion done (Bug 16200 - 'Hold waiting too long' fee has a translation problem)\n";
12657     SetVersion($DBversion);
12658 }
12659
12660 $DBversion = "16.06.00.002";
12661 if ( CheckVersion($DBversion) ) {
12662     unless ( column_exists('borrowers', 'updated_on') ) {
12663         $dbh->do(q{
12664             ALTER TABLE borrowers
12665                 ADD COLUMN updated_on timestamp NULL DEFAULT CURRENT_TIMESTAMP
12666                 ON UPDATE CURRENT_TIMESTAMP
12667                 AFTER privacy_guarantor_checkouts;
12668         });
12669         $dbh->do(q{
12670             ALTER TABLE deletedborrowers
12671                 ADD COLUMN updated_on timestamp NULL DEFAULT CURRENT_TIMESTAMP
12672                 ON UPDATE CURRENT_TIMESTAMP
12673                 AFTER privacy_guarantor_checkouts;
12674         });
12675     }
12676
12677     print "Upgrade to $DBversion done (Bug 10459 - borrowers should have a timestamp)\n";
12678     SetVersion($DBversion);
12679 }
12680
12681 $DBversion = "16.06.00.003";
12682 if ( CheckVersion($DBversion) ) {
12683     $dbh->do(q{
12684         INSERT IGNORE INTO systempreferences ( variable, value, options, explanation, type )
12685         SELECT 'MaxItemsToProcessForBatchMod', value, NULL, 'Process up to a given number of items in a single item modification batch.', 'Integer' FROM systempreferences WHERE variable='MaxItemsForBatch';
12686     });
12687     $dbh->do(q{
12688         INSERT IGNORE INTO systempreferences ( variable, value, options, explanation, type )
12689         SELECT 'MaxItemsToDisplayForBatchDel', value, NULL, 'Display up to a given number of items in a single item deletionbatch.', 'Integer' FROM systempreferences WHERE variable='MaxItemsForBatch';
12690     });
12691     $dbh->do(q{
12692         DELETE FROM systempreferences WHERE variable="MaxItemsForBatch";
12693     });
12694
12695     print "Upgrade to $DBversion done (Bug 11490 - MaxItemsForBatch should be split into two new prefs)\n";
12696     SetVersion($DBversion);
12697 }
12698
12699 $DBversion = '16.06.00.004';
12700 if ( CheckVersion($DBversion) ) {
12701     $dbh->do(q{
12702         INSERT IGNORE INTO systempreferences ( variable, value, options, explanation, type )
12703          SELECT 'OPACXSLTListsDisplay', COALESCE(value,''), '', 'Enable XSLT stylesheet control over lists pages display on OPAC', 'Free'
12704          FROM systempreferences WHERE variable='OPACXSLTResultsDisplay';
12705     });
12706
12707     $dbh->do(q{
12708         INSERT IGNORE INTO systempreferences ( variable, value, options, explanation, type )
12709          SELECT 'XSLTListsDisplay', COALESCE(value,''), '', 'Enable XSLT stylesheet control over lists pages display on intranet', 'Free'
12710          FROM systempreferences WHERE variable='XSLTResultsDisplay';
12711     });
12712
12713     print "Upgrade to $DBversion done (Bug 15485: Allow choosing different XSLTs for lists)\n";
12714     SetVersion($DBversion);
12715 }
12716
12717 $DBversion = '16.06.00.005';
12718 if ( CheckVersion($DBversion) ) {
12719     $dbh->do(q{
12720         UPDATE `systempreferences` set options = 'US|FR|CH' where variable = 'CurrencyFormat';
12721     });
12722
12723     print "Upgrade to $DBversion done (Bug 16768 - Add official number format for Switzerland: 1'234'567.89)\n";
12724     SetVersion($DBversion);
12725 }
12726
12727 $DBversion = "16.06.00.006";
12728 if ( CheckVersion($DBversion) ) {
12729     $dbh->do(q{
12730         CREATE TABLE `refund_lost_item_fee_rules` (
12731           `branchcode` varchar(10) NOT NULL default '',
12732           `refund` tinyint(1) NOT NULL default 0,
12733           PRIMARY KEY  (`branchcode`)
12734         ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
12735     });
12736     $dbh->do(q{
12737         INSERT IGNORE INTO systempreferences (variable,value,explanation,options,type)
12738         VALUES( 'RefundLostOnReturnControl',
12739                 'CheckinLibrary',
12740                 'If a lost item is returned, choose which branch to pick rules for refunding.',
12741                 'CheckinLibrary|PatronLibrary|ItemHomeBranch|ItemHoldingbranch',
12742                 'Choice')
12743     });
12744     # Pick the old syspref as the default rule
12745     $dbh->do(q{
12746         INSERT INTO refund_lost_item_fee_rules (branchcode,refund)
12747             SELECT '*', COALESCE(value,'1') FROM systempreferences WHERE variable='RefundLostItemFeeOnReturn'
12748     });
12749     # Delete the old syspref
12750     $dbh->do(q{
12751         DELETE IGNORE FROM systempreferences
12752         WHERE variable='RefundLostItemFeeOnReturn'
12753     });
12754
12755     print "Upgrade to $DBversion done (Bug 14048: Change RefundLostItemFeeOnReturn to be branch specific)\n";
12756     SetVersion($DBversion);
12757 }
12758
12759 $DBversion = '16.06.00.007';
12760 if ( CheckVersion($DBversion) ) {
12761     $dbh->do(q{
12762         INSERT IGNORE INTO systempreferences (variable,value,explanation,options,type) 
12763         VALUES ('PatronQuickAddFields', '', 'A list of fields separated by "|" to be displayed along with mandatory fields in the patron quick add form if chosen at patron entry', NULL, 'Free');
12764     });
12765
12766     print "Upgrade to $DBversion done (Bug 3534 - Patron quick add form)\n";
12767     SetVersion($DBversion);
12768 }
12769
12770 $DBversion = '16.06.00.008';
12771 if ( CheckVersion($DBversion) ) {
12772     $dbh->do(q{
12773         INSERT IGNORE INTO systempreferences (variable,value,options,explanation,type)
12774         VALUES('CheckPrevCheckout','hardno','hardyes|softyes|softno|hardno','By default, for every item checked out, should we warn if the patron has checked out that item in the past?','Choice');
12775     });
12776     $dbh->do(q{
12777         ALTER TABLE categories
12778         ADD COLUMN `checkprevcheckout` varchar(7) NOT NULL default 'inherit'
12779         AFTER `default_privacy`;
12780     });
12781     $dbh->do(q{
12782         ALTER TABLE borrowers
12783         ADD COLUMN `checkprevcheckout` varchar(7) NOT NULL default 'inherit'
12784         AFTER `privacy_guarantor_checkouts`;
12785     });
12786     $dbh->do(q{
12787         ALTER TABLE deletedborrowers
12788         ADD COLUMN `checkprevcheckout` varchar(7) NOT NULL default 'inherit'
12789         AFTER `privacy_guarantor_checkouts`;
12790     });
12791
12792     print "Upgrade to $DBversion done (Bug 6906 - show 'Borrower has previously issued \$ITEM' alert on checkout)\n";
12793     SetVersion($DBversion);
12794 }
12795
12796 $DBversion = '16.06.00.009';
12797 if ( CheckVersion($DBversion) ) {
12798     $dbh->do(q{
12799         INSERT IGNORE INTO systempreferences (variable,value,options,explanation,type) 
12800         VALUES ('IntranetCatalogSearchPulldown','0',NULL,'Show a search field pulldown for \"Search the catalog\" boxes. ','YesNo');
12801     });
12802
12803     print "Upgrade to $DBversion done (Bug 14902 - Add qualifier menu to staff side 'Search the Catalog')\n";
12804     SetVersion($DBversion);
12805 }
12806
12807 $DBversion = '16.06.00.010';
12808 if ( CheckVersion($DBversion) ) {
12809     $dbh->do(q{
12810         INSERT IGNORE INTO systempreferences (variable,value,options,explanation,type)
12811         VALUES ('MaxOpenSuggestions','',NULL,'Limit the number of open suggestions a patron can have at once, unlimited if blank','Integer')
12812     });
12813
12814     print "Upgrade to $DBversion done (Bug 15128 - Add ability to limit the number of open purchase suggestions a patron can make)\n";
12815     SetVersion($DBversion);
12816 }
12817
12818 $DBversion = '16.06.00.011';
12819 if ( CheckVersion($DBversion) ) {
12820     $dbh->do(q{
12821         INSERT IGNORE INTO systempreferences (variable,value,options,explanation,type) VALUES
12822         ('NovelistSelectStaffEnabled','0',NULL,'Enable  Novelist Select content to the Staff Interface (requires that you have entered in a user profile and password, which can be seen in image links)','YesNo'),
12823         ('NovelistSelectStaffView','tab','tab|above|below','Where to display Novelist Select content','Choice');
12824     });
12825
12826     print "Upgrade to $DBversion done (Bug 11606 - Novelist Select in Staff Client)\n";
12827     SetVersion($DBversion);
12828 }
12829
12830 $DBversion = '16.06.00.012';
12831 if ( CheckVersion($DBversion) ) {
12832     $dbh->do(q{
12833         ALTER TABLE virtualshelves MODIFY COLUMN created_on DATETIME not NULL;
12834     });
12835
12836     print "Upgrade to $DBversion done (Bug 16573 - Web installer fails to load structure and sample data on MySQL 5.7)\n";
12837     SetVersion($DBversion);
12838 }
12839
12840 $DBversion = '16.06.00.013';
12841 if ( CheckVersion($DBversion) ) {
12842     $dbh->do(q{
12843         INSERT IGNORE INTO systempreferences (variable, value, options, explanation, type) VALUES
12844         ('OPACResultsLibrary', 'homebranch', 'homebranch|holdingbranch', 'Defines whether the OPAC displays the holding or home branch in search results when using XSLT', 'Choice');
12845     });
12846
12847     print "Upgrade to $DBversion done (Bug 7441 - Search results showing wrong branch)\n";
12848     SetVersion($DBversion);
12849 }
12850
12851 $DBversion = "16.06.00.014";
12852 if ( CheckVersion($DBversion) ) {
12853     $dbh->do(q{
12854         ALTER TABLE `action_logs` ADD COLUMN `interface` VARCHAR(30) DEFAULT NULL AFTER `info`;
12855     });
12856
12857     $dbh->do(q{
12858         ALTER TABLE `action_logs` ADD KEY `interface` (`interface`);
12859     });
12860
12861     print "Upgrade to $DBversion done (Bug 16829: action_logs should have an 'interface' column)\n";
12862     SetVersion($DBversion);
12863 }
12864
12865 $DBversion = "16.06.00.015";
12866 if ( CheckVersion($DBversion) ) {
12867     $dbh->do(q{
12868         INSERT IGNORE INTO systempreferences ( variable, value, options, explanation, type ) VALUES
12869         ('HoldsLog','0',NULL,'If ON, log create/cancel/suspend/resume actions on holds.','YesNo');
12870     });
12871
12872     print "Upgrade to $DBversion done (Bug 14642: Add logging of hold modifications)\n";
12873     SetVersion($DBversion);
12874 }
12875
12876 $DBversion = "16.06.00.016";
12877 if ( CheckVersion($DBversion) ) {
12878     $dbh->do(q{
12879         update marc_subfield_structure set defaultvalue=REPLACE(defaultvalue, 'YYYY', '<<YYYY>>') where defaultvalue like "%YYYY%" and defaultvalue not like "%<<YYYY>>%";
12880     });
12881     $dbh->do(q{
12882         update marc_subfield_structure set defaultvalue=REPLACE(defaultvalue, 'MM', '<<MM>>') where defaultvalue like "%MM%" and defaultvalue not like "%<<MM>>%";
12883     });
12884     $dbh->do(q{
12885         update marc_subfield_structure set defaultvalue=REPLACE(defaultvalue, 'DD', '<<DD>>') where defaultvalue like "%DD%" and defaultvalue not like "%<<DD>>%";
12886     });
12887     $dbh->do(q{
12888         update marc_subfield_structure set defaultvalue=REPLACE(defaultvalue, 'user', '<<USER>>') where defaultvalue like "%user%" and defaultvalue not like "%<<USER>>%";
12889     });
12890
12891     print "Upgrade to $DBversion done (Bug 7045 - Default-value substitution inconsistent)\n";
12892     SetVersion($DBversion);
12893 }
12894
12895 $DBversion = "16.06.00.017";
12896 if ( CheckVersion($DBversion) ) {
12897     $dbh->do(q{
12898         INSERT IGNORE INTO systempreferences (`variable`, `value`, `options`, `explanation`, `type`) VALUES ('OPACSuggestionMandatoryFields','title','','Define the mandatory fields for a patron purchase suggestions made via OPAC.','multiple');
12899     });
12900
12901     print "Upgrade to $DBversion done (Bug 10848 - Allow configuration of mandatory/required fields on the suggestion form in OPAC)\n";
12902     SetVersion($DBversion);
12903 }
12904
12905 $DBversion = "16.06.00.018";
12906 if ( CheckVersion($DBversion) ) {
12907     $dbh->do(q{
12908         ALTER TABLE issuingrules ADD COLUMN holds_per_record SMALLINT(6) NOT NULL DEFAULT 1 AFTER reservesallowed;
12909     });
12910
12911     print "Upgrade to $DBversion done (Bug 14695 - Add ability to place multiple item holds on a given record per patron)\n";
12912     SetVersion($DBversion);
12913 }
12914
12915 $DBversion = "16.06.00.019";
12916 if ( CheckVersion($DBversion) ) {
12917     $dbh->do(q{
12918         ALTER TABLE reviews CHANGE COLUMN approved approved tinyint(4) DEFAULT 0;
12919     });
12920     $dbh->do(q{
12921         UPDATE reviews SET approved=0 WHERE approved IS NULL;
12922     });
12923
12924     print "Upgrade to $DBversion done (Bug 15839 - Move the reviews related code to Koha::Reviews)\n";
12925     SetVersion($DBversion);
12926 }
12927
12928 $DBversion = "16.06.00.020";
12929 if ( CheckVersion($DBversion) ) {
12930     $dbh->do(q{
12931         INSERT IGNORE INTO systempreferences (variable,value,explanation,options,type) VALUES ('SwitchOnSiteCheckouts', '0', 'Automatically switch an on-site checkout to a normal checkout', NULL, 'YesNo');
12932     });
12933
12934     print "Upgrade to $DBversion done (Bug 16272 - Transform checkout from on-site checkout to regular checkout)\n";
12935     SetVersion($DBversion);
12936 }
12937
12938 $DBversion = "16.06.00.021";
12939 if ( CheckVersion($DBversion) ) {
12940     $dbh->do(q{
12941         INSERT IGNORE INTO systempreferences (variable,value,explanation,options,type) VALUES ('PatronSelfRegistrationEmailMustBeUnique', '0', 'If set, the field borrowers.email will be considered as a unique field on self registering', NULL, 'YesNo');
12942     });
12943
12944     print "Upgrade to $DBversion done (Bug 16275 - Prevent patron self registration if the email already filled in borrowers.email)\n";
12945     SetVersion($DBversion);
12946 }
12947
12948 $DBversion = "16.06.00.022";
12949 if ( CheckVersion($DBversion) ) {
12950     $dbh->do(q{
12951         INSERT IGNORE INTO `permissions`
12952         (module_bit, code,             description) VALUES
12953         (16,         'delete_reports', 'Delete SQL reports');
12954     });
12955     $dbh->do(q{
12956         INSERT IGNORE INTO user_permissions
12957         (borrowernumber,      module_bit,code)
12958         SELECT borrowernumber,module_bit,'delete_reports'
12959             FROM user_permissions
12960             WHERE module_bit=16 AND code='create_reports';
12961     });
12962
12963     print "Upgrade to $DBversion done (Bug 16978 - Add delete reports user permission)\n";
12964     SetVersion($DBversion);
12965 }
12966
12967 $DBversion = "16.06.00.023";
12968 if ( CheckVersion($DBversion) ) {
12969     my $pref = C4::Context->preference('timeout');
12970     if( !$pref || $pref eq '12000000' ) {
12971         # update if pref is null or equals old default value
12972         $dbh->do(q|
12973             UPDATE systempreferences SET value = '1d', type = 'Free'
12974             WHERE variable = 'timeout'
12975         |);
12976         print "Upgrade to $DBversion done (Bug 17187)\nNote: Pref value for timeout has been adjusted.\n";
12977     } else {
12978         # only update pref type
12979         $dbh->do(q|
12980             UPDATE systempreferences SET type = 'Free'
12981             WHERE variable = 'timeout'
12982         |);
12983         print "Upgrade to $DBversion done (Bug 17187)\nNote: Pref value for timeout has not been adjusted.\n";
12984     }
12985     SetVersion($DBversion);
12986 }
12987
12988 $DBversion = "16.06.00.024";
12989 if ( CheckVersion($DBversion) ) {
12990     $dbh->do(q{
12991         UPDATE language_descriptions SET description = 'Română' WHERE subtag = 'ro' AND type = 'language' AND lang = 'ro';
12992     });
12993
12994     print "Upgrade to $DBversion done (Bug 16311 - Advanced search language limit typo for Romanian)\n";
12995     SetVersion($DBversion);
12996 }
12997
12998 $DBversion = "16.06.00.025";
12999 if ( CheckVersion($DBversion) ) {
13000     $dbh->do(q{
13001         ALTER TABLE `subscription` ADD `itemtype` VARCHAR( 10 ) NULL AFTER reneweddate, ADD `previousitemtype` VARCHAR( 10 ) NULL AFTER itemtype;
13002     });
13003     $dbh->do(q{
13004         INSERT IGNORE INTO systempreferences (variable,value,explanation,options,type) VALUES
13005         ('makePreviousSerialAvailable','0','make previous serial automatically available when collecting a new serial. Please note that the item-level_itypes syspref must be set to specific item.','','YesNo');
13006     });
13007
13008     print "Upgrade to $DBversion done (Bug 7677 - Subscriptions: Ability to define default itemtype and automatically change itemtype of older issues on receive of next issue)\n";
13009     SetVersion($DBversion);
13010 }
13011
13012 $DBversion = "16.06.00.026";
13013 if ( CheckVersion($DBversion) ) {
13014     $dbh->do(q{
13015         INSERT IGNORE INTO systempreferences (variable,value,explanation,options,type) VALUES ('PatronSelfRegistrationLibraryList', '', 'Only display libraries listed. If empty, all libraries are displayed.', NULL, 'Free');
13016     });
13017
13018     print "Upgrade to $DBversion done (Bug 16274 - Make the selfregistration branchcode selection configurable)\n";
13019     SetVersion($DBversion);
13020 }
13021
13022 $DBversion = "16.06.00.027";
13023 if ( CheckVersion($DBversion) ) {
13024     unless ( column_exists('borrowers', 'lastseen') ) {
13025         $dbh->do(q{
13026             ALTER TABLE borrowers ADD COLUMN lastseen datetime default NULL AFTER updated_on;
13027         });
13028         $dbh->do(q{
13029             ALTER TABLE deletedborrowers ADD COLUMN lastseen datetime default NULL AFTER updated_on;
13030         });
13031     }
13032     $dbh->do(q{
13033         INSERT IGNORE INTO systempreferences (variable,value,explanation,options,type) VALUES ('TrackLastPatronActivity', '0', 'If set, the field borrowers.lastseen will be updated everytime a patron is seen', NULL, 'YesNo');
13034     });
13035
13036     print "Upgrade to $DBversion done (Bug 16276: Add a new pref TrackLastPatronActivity and new column borrowers.lastseen)\n";
13037     SetVersion($DBversion);
13038 }
13039
13040 $DBversion = '16.06.00.028';
13041 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
13042     {
13043         print "Attempting upgrade to $DBversion (Bug 17135) ...\n";
13044         my $maintenance_script = C4::Context->config("intranetdir") . "/installer/data/mysql/fix_unclosed_nonaccruing_fines_bug17135.pl";
13045         system("perl $maintenance_script --confirm");
13046
13047         print "Upgrade to $DBversion done (Bug 17135 - Fine for the previous overdue may get overwritten by the next one)\n";
13048
13049         unless ($original_version < TransformToNum("3.23.00.032")) { ## Bug 15675
13050             print "WARNING: There is a possibility (= just a possibility, it's configuration dependent etc.) that - due to regression introduced by Bug 15675 - some old fine records for overdued items (items which got renewed 1+ time while being overdue) may have been overwritten in your production 16.05+ database. See Bugzilla reports for Bug 14390 and Bug 17135 for more details.\n";
13051             print "WARNING: Please note that this upgrade does not try to recover such overwitten old fine records (if any) - it's just an follow-up for Bug 14390, its sole purpose is preventing eventual further-on overwrites from happening in the future. Optional recovery of the overwritten fines (again, if any) is like, totally outside of the scope of this particular upgrade!\n";
13052         }
13053         SetVersion ($DBversion);
13054     }
13055 }
13056
13057 $DBversion = "16.06.00.029";
13058 if ( CheckVersion($DBversion) ) {
13059     $dbh->do(q{
13060         UPDATE systempreferences SET type="Choice" WHERE variable="UsageStatsLibraryType";
13061     });
13062     $dbh->do(q{
13063         UPDATE systempreferences SET value="Canada" WHERE variable="UsageStatsCountry" AND value="CANADA";
13064     });
13065     $dbh->do(q{
13066         UPDATE systempreferences SET value="Czech Republic" WHERE variable="UsageStatsCountry" AND value="CZ";
13067     });
13068     $dbh->do(q{
13069         UPDATE systempreferences SET value="United Kingdom" WHERE variable="UsageStatsCountry" AND (value="England" OR value="UK");
13070     });
13071     $dbh->do(q{
13072         UPDATE systempreferences SET value="Spain" WHERE variable="UsageStatsCountry" AND value="España";
13073     });
13074     $dbh->do(q{
13075         UPDATE systempreferences SET value="Greece" WHERE variable="UsageStatsCountry" AND value="GR";
13076     });
13077     $dbh->do(q{
13078         UPDATE systempreferences SET value="Ireland" WHERE variable="UsageStatsCountry" AND value="Irelanbd";
13079     });
13080     $dbh->do(q{
13081         UPDATE systempreferences SET value="Mexico" WHERE variable="UsageStatsCountry" AND value="México";
13082     });
13083     $dbh->do(q{
13084         UPDATE systempreferences SET value="Peru" WHERE variable="UsageStatsCountry" AND value="Perú";
13085     });
13086     $dbh->do(q{
13087         UPDATE systempreferences SET value="Dominican Rep." WHERE variable="UsageStatsCountry" AND value="República Dominicana";
13088     });
13089     $dbh->do(q{
13090         UPDATE systempreferences SET value="Trinidad & Tob." WHERE variable="UsageStatsCountry" AND value="Trinidad";
13091     });
13092     $dbh->do(q{
13093         UPDATE systempreferences SET value="Turkey" WHERE variable="UsageStatsCountry" AND value="Türkiye";
13094     });
13095     $dbh->do(q{
13096         UPDATE systempreferences SET value="USA" WHERE variable="UsageStatsCountry" AND (value="United States" OR value="United States of America" OR value="US");
13097     });
13098     $dbh->do(q{
13099         UPDATE systempreferences SET value="Zimbabwe" WHERE variable="UsageStatsCountry" AND value="Zimbabbwe";
13100     });
13101
13102     print "Upgrade to $DBversion done (Bug 14707 - Change UsageStatsCountry from free text to a dropdown list)\n";
13103     SetVersion($DBversion);
13104 }
13105
13106 $DBversion = "16.06.00.030";
13107 if ( CheckVersion($DBversion) ) {
13108     $dbh->do(q{
13109         INSERT IGNORE INTO systempreferences ( `variable`, `value`, `options`, `explanation`, `type` ) VALUES
13110         ('OPACHoldingsDefaultSortField','first_column','first_column|homebranch|holdingbranch','Default sort field for the holdings table at the OPAC','choice');
13111     });
13112
13113     print "Upgrade to $DBversion done (Bug 16552 - Add the ability to change the default holdings sort)\n";
13114     SetVersion($DBversion);
13115 }
13116
13117 $DBversion = "16.06.00.031";
13118 if ( CheckVersion($DBversion) ) {
13119     $dbh->do(q{
13120         INSERT IGNORE INTO systempreferences (variable,value,explanation,options,type) VALUES ('PatronSelfRegistrationPrefillForm', '1', 'Display password and prefill login form after a patron has self registered', NULL, 'YesNo');
13121     });
13122
13123     print "Upgrade to $DBversion done (Bug 16273 - Prevent selfregistration from printing the borrower password and filling the logging form)\n";
13124     SetVersion($DBversion);
13125 }
13126
13127 $DBversion = "16.06.00.032";
13128 if ( CheckVersion($DBversion) ) {
13129     $dbh->do(q{
13130         UPDATE marc_subfield_structure SET authorised_value="WITHDRAWN" WHERE authorised_value="WTHDRAWN";
13131     });
13132
13133     print "Upgrade to $DBversion done (Bug 17357 - WTHDRAWN is still used in installer files)\n";
13134     SetVersion($DBversion);
13135 }
13136
13137
13138 $DBversion = "16.06.00.033";
13139 if ( CheckVersion($DBversion) ) {
13140     $dbh->do(q{
13141         CREATE TABLE authorised_value_categories (
13142         category_name VARCHAR(32) NOT NULL,
13143         primary key (category_name)
13144         ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
13145         });
13146 ## Add authorised value categories
13147     $dbh->do(q{
13148     INSERT INTO authorised_value_categories (category_name )
13149     SELECT DISTINCT category FROM authorised_values;
13150     });
13151     
13152 ## Add special categories
13153     $dbh->do(q{
13154     INSERT IGNORE INTO authorised_value_categories( category_name )
13155     VALUES
13156     ('Asort1'),
13157     ('Asort2'),
13158     ('Bsort1'),
13159     ('Bsort2'),
13160     ('SUGGEST'),
13161     ('DAMAGED'),
13162     ('LOST'),
13163     ('REPORT_GROUP'),
13164     ('REPORT_SUBGROUP'),
13165     ('DEPARTMENT'),
13166     ('TERM'),
13167     ('SUGGEST_STATUS'),
13168     ('ITEMTYPECAT');
13169     });
13170
13171 ## Add very special categories
13172     $dbh->do(q{
13173     INSERT IGNORE INTO authorised_value_categories( category_name )
13174     VALUES
13175     ('branches'),
13176     ('itemtypes'),
13177     ('cn_source');
13178     });
13179
13180     $dbh->do(q{
13181     INSERT IGNORE INTO authorised_value_categories( category_name )
13182     VALUES
13183     ('WITHDRAWN'),
13184     ('RESTRICTED'),
13185     ('NOT_LOAN'),
13186     ('CCODE'),
13187     ('LOC'),
13188     ('STACK');
13189     });
13190
13191 ## Update the FK
13192     $dbh->do(q{
13193     ALTER TABLE items_search_fields
13194     DROP FOREIGN KEY items_search_fields_authorised_values_category;
13195     });
13196
13197     $dbh->do(q{
13198     ALTER TABLE items_search_fields
13199     ADD CONSTRAINT `items_search_fields_authorised_values_category` FOREIGN KEY (`authorised_values_category`) REFERENCES `authorised_value_categories` (`category_name`) ON DELETE SET NULL ON UPDATE CASCADE;
13200     });
13201
13202     $dbh->do(q{
13203     ALTER TABLE authorised_values
13204     ADD CONSTRAINT `authorised_values_authorised_values_category` FOREIGN KEY (`category`) REFERENCES `authorised_value_categories` (`category_name`) ON DELETE CASCADE ON UPDATE CASCADE;
13205     });
13206
13207     $dbh->do(q{
13208             INSERT IGNORE INTO authorised_value_categories( category_name ) SELECT DISTINCT(authorised_value) FROM marc_subfield_structure;
13209             });
13210
13211     $dbh->do(q{
13212             UPDATE marc_subfield_structure SET authorised_value = NULL WHERE authorised_value = '';
13213             });
13214
13215     # If the DB has been created before 3.19.00.006, the default collate for marc_subfield_structure if not set to utf8_unicode_ci and the new FK will not be create (MariaDB or MySQL will raise err 150)
13216     my $table_sth = $dbh->prepare(qq|SHOW CREATE TABLE marc_subfield_structure|);
13217     $table_sth->execute;
13218     my @table = $table_sth->fetchrow_array;
13219     if ( $table[1] !~ /COLLATE=utf8_unicode_ci/ and $table[1] !~ /COLLATE=utf8mb4_unicode_ci/ ) { #catches utf8mb4 collated tables
13220         $dbh->do(qq|ALTER TABLE marc_subfield_structure CHARACTER SET utf8 COLLATE utf8_unicode_ci|);
13221     }
13222     $dbh->do(q{
13223             ALTER TABLE marc_subfield_structure
13224             MODIFY COLUMN authorised_value VARCHAR(32) DEFAULT NULL,
13225             ADD CONSTRAINT marc_subfield_structure_ibfk_1 FOREIGN KEY (authorised_value) REFERENCES authorised_value_categories (category_name) ON UPDATE CASCADE ON DELETE SET NULL;
13226             });
13227
13228       print "Upgrade to $DBversion done (Bug 17216 - Add a new table to store authorized value categories)\n";
13229       SetVersion($DBversion);
13230 }
13231
13232 $DBversion = "16.06.00.034";
13233 if ( CheckVersion($DBversion) ) {
13234     $dbh->do(q{
13235         ALTER TABLE biblioitems DROP COLUMN marc;
13236     });
13237     $dbh->do(q{
13238         ALTER TABLE deletedbiblioitems DROP COLUMN marc;
13239     });
13240
13241     print "Upgrade to $DBversion done (Bug 10455 - remove redundant 'biblioitems.marc' field)\n";
13242     SetVersion($DBversion);
13243 }
13244
13245 $DBversion = '16.06.00.035';
13246 if ( CheckVersion($DBversion) ) {
13247     $dbh->do(q{
13248         INSERT IGNORE INTO systempreferences ( variable, value, options, explanation, type )
13249          SELECT 'AllowItemsOnHoldCheckoutSCO',COALESCE(value,0),'','Do not generate RESERVE_WAITING and RESERVED warning in the SCO module when checking out items reserved to someone else. This allows self checkouts for those items.','YesNo'
13250          FROM systempreferences WHERE variable='AllowItemsOnHoldCheckout';
13251     });
13252
13253     print "Upgrade to $DBversion done (Bug 15131: Give SCO separate control for AllowItemsOnHoldCheckout)\n";
13254     SetVersion($DBversion);
13255 }
13256
13257 $DBversion = '16.06.00.036';
13258 if ( CheckVersion($DBversion) ) {
13259     $dbh->do(q{
13260         CREATE TABLE IF NOT EXISTS `housebound_profile` (
13261           `borrowernumber` int(11) NOT NULL, -- Number of the borrower associated with this profile.
13262           `day` text NOT NULL,  -- The preferred day of the week for delivery.
13263           `frequency` text NOT NULL, -- The Authorised_Value definining the pattern for delivery.
13264           `fav_itemtypes` text default NULL, -- Free text describing preferred itemtypes.
13265           `fav_subjects` text default NULL, -- Free text describing preferred subjects.
13266           `fav_authors` text default NULL, -- Free text describing preferred authors.
13267           `referral` text default NULL, -- Free text indicating how the borrower was added to the service.
13268           `notes` text default NULL, -- Free text for additional notes.
13269           PRIMARY KEY  (`borrowernumber`),
13270           CONSTRAINT `housebound_profile_bnfk`
13271             FOREIGN KEY (`borrowernumber`)
13272             REFERENCES `borrowers` (`borrowernumber`)
13273             ON UPDATE CASCADE ON DELETE CASCADE
13274         ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
13275     });
13276     $dbh->do(q{
13277         CREATE TABLE IF NOT EXISTS `housebound_visit` (
13278           `id` int(11) NOT NULL auto_increment, -- ID of the visit.
13279           `borrowernumber` int(11) NOT NULL, -- Number of the borrower, & the profile, linked to this visit.
13280           `appointment_date` date default NULL, -- Date of visit.
13281           `day_segment` varchar(10),  -- Rough time frame: 'morning', 'afternoon' 'evening'
13282           `chooser_brwnumber` int(11) default NULL, -- Number of the borrower to choose items  for delivery.
13283           `deliverer_brwnumber` int(11) default NULL, -- Number of the borrower to deliver items.
13284           PRIMARY KEY  (`id`),
13285           CONSTRAINT `houseboundvisit_bnfk`
13286             FOREIGN KEY (`borrowernumber`)
13287             REFERENCES `housebound_profile` (`borrowernumber`)
13288             ON UPDATE CASCADE ON DELETE CASCADE,
13289           CONSTRAINT `houseboundvisit_bnfk_1`
13290             FOREIGN KEY (`chooser_brwnumber`)
13291             REFERENCES `borrowers` (`borrowernumber`)
13292             ON UPDATE CASCADE ON DELETE CASCADE,
13293           CONSTRAINT `houseboundvisit_bnfk_2`
13294             FOREIGN KEY (`deliverer_brwnumber`)
13295             REFERENCES `borrowers` (`borrowernumber`)
13296             ON UPDATE CASCADE ON DELETE CASCADE
13297         ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
13298     });
13299     $dbh->do(q{
13300         CREATE TABLE IF NOT EXISTS `housebound_role` (
13301           `borrowernumber_id` int(11) NOT NULL, -- borrowernumber link
13302           `housebound_chooser` tinyint(1) NOT NULL DEFAULT 0, -- set to 1 to indicate this patron is a housebound chooser volunteer
13303           `housebound_deliverer` tinyint(1) NOT NULL DEFAULT 0, -- set to 1 to indicate this patron is a housebound deliverer volunteer
13304           PRIMARY KEY (`borrowernumber_id`),
13305           CONSTRAINT `houseboundrole_bnfk`
13306             FOREIGN KEY (`borrowernumber_id`)
13307             REFERENCES `borrowers` (`borrowernumber`)
13308             ON UPDATE CASCADE ON DELETE CASCADE
13309         ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
13310     });
13311     $dbh->do(q{
13312         INSERT IGNORE INTO systempreferences
13313                (variable,value,options,explanation,type) VALUES
13314                ('HouseboundModule',0,'',
13315                'If ON, enable housebound module functionality.','YesNo');
13316     });
13317     $dbh->do(q{
13318         INSERT IGNORE INTO authorised_value_categories( category_name ) VALUES
13319             ('HSBND_FREQ');
13320     });
13321     $dbh->do(q{
13322         INSERT IGNORE INTO authorised_values (category, authorised_value, lib) VALUES
13323                ('HSBND_FREQ','EW','Every week');
13324     });
13325
13326     print "Upgrade to $DBversion done (Bug 5670 - Housebound Readers Module)\n";
13327     SetVersion($DBversion);
13328 }
13329
13330 $DBversion = "16.06.00.037";
13331 if ( CheckVersion($DBversion) ) {
13332     $dbh->do(q{
13333         ALTER TABLE `issuingrules` ADD `article_requests` ENUM( 'no', 'yes', 'bib_only', 'item_only' ) NOT NULL DEFAULT 'no' AFTER `opacitemholds`;
13334     });
13335     $dbh->do(q{
13336         INSERT INTO `systempreferences` (`variable`, `value`, `options`, `explanation`, `type`) VALUES
13337             ('ArticleRequests', '0', NULL, 'Enables the article request feature', 'YesNo'),
13338             ('ArticleRequestsMandatoryFields', '', NULL, 'Comma delimited list of required fields for bibs where article requests rule = ''yes''', 'multiple'),
13339             ('ArticleRequestsMandatoryFieldsItemsOnly', '', NULL, 'Comma delimited list of required fields for bibs where article requests rule = ''item_only''', 'multiple'),
13340             ('ArticleRequestsMandatoryFieldsRecordOnly', '', NULL, 'Comma delimited list of required fields for bibs where article requests rule = ''bib_only''', 'multiple');
13341     });
13342     $dbh->do(q{
13343         CREATE TABLE IF NOT EXISTS `article_requests` (
13344           `id` int(11) NOT NULL AUTO_INCREMENT,
13345           `borrowernumber` int(11) NOT NULL,
13346           `biblionumber` int(11) NOT NULL,
13347           `itemnumber` int(11) DEFAULT NULL,
13348           `branchcode` varchar(10) CHARACTER SET utf8 COLLATE utf8_unicode_ci DEFAULT NULL,
13349           `title` text,
13350           `author` text,
13351           `volume` text,
13352           `issue` text,
13353           `date` text,
13354           `pages` text,
13355           `chapters` text,
13356           `patron_notes` text,
13357           `status` enum('PENDING','PROCESSING','COMPLETED','CANCELED') NOT NULL DEFAULT 'PENDING',
13358           `notes` text,
13359           `created_on` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
13360           `updated_on` timestamp NULL DEFAULT NULL,
13361           PRIMARY KEY (`id`),
13362           KEY `borrowernumber` (`borrowernumber`),
13363           KEY `biblionumber` (`biblionumber`),
13364           KEY `itemnumber` (`itemnumber`),
13365           KEY `branchcode` (`branchcode`),
13366           CONSTRAINT `article_requests_ibfk_1` FOREIGN KEY (`borrowernumber`) REFERENCES `borrowers` (`borrowernumber`) ON DELETE CASCADE ON UPDATE CASCADE,
13367           CONSTRAINT `article_requests_ibfk_2` FOREIGN KEY (`biblionumber`) REFERENCES `biblio` (`biblionumber`) ON DELETE CASCADE ON UPDATE CASCADE,
13368           CONSTRAINT `article_requests_ibfk_3` FOREIGN KEY (`itemnumber`) REFERENCES `items` (`itemnumber`) ON DELETE SET NULL ON UPDATE CASCADE,
13369           CONSTRAINT `article_requests_ibfk_4` FOREIGN KEY (`branchcode`) REFERENCES `branches` (`branchcode`) ON DELETE SET NULL ON UPDATE CASCADE
13370         ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
13371     });
13372     $dbh->do(q{
13373         INSERT INTO `letter` (`module`, `code`, `branchcode`, `name`, `is_html`, `title`, `content`, `message_transport_type`) VALUES
13374         ('circulation', 'AR_CANCELED', '', 'Article Request - Email - Canceled', 0, 'Article Request Canceled', '<<borrowers.firstname>> <<borrowers.surname>> (<<borrowers.cardnumber>>)\r\n\r\nYour request for an article from <<biblio.title>> (<<items.barcode>>) has been canceled for the following reason:\r\n\r\n<<article_requests.notes>>\r\n\r\nArticle requested:\r\nTitle: <<article_requests.title>>\r\nAuthor: <<article_requests.author>>\r\nVolume: <<article_requests.volume>>\r\nIssue: <<article_requests.issue>>\r\nDate: <<article_requests.date>>\r\nPages: <<article_requests.pages>>\r\nChapters: <<article_requests.chapters>>\r\nNotes: <<article_requests.patron_notes>>\r\n', 'email'),
13375         ('circulation', 'AR_COMPLETED', '', 'Article Request - Email - Completed', 0, 'Article Request Completed', '<<borrowers.firstname>> <<borrowers.surname>> (<<borrowers.cardnumber>>)\r\n\r\nWe are have completed your request for an article from <<biblio.title>> (<<items.barcode>>).\r\n\r\nArticle requested:\r\nTitle: <<article_requests.title>>\r\nAuthor: <<article_requests.author>>\r\nVolume: <<article_requests.volume>>\r\nIssue: <<article_requests.issue>>\r\nDate: <<article_requests.date>>\r\nPages: <<article_requests.pages>>\r\nChapters: <<article_requests.chapters>>\r\nNotes: <<article_requests.patron_notes>>\r\n\r\nYou may pick your article up at <<branches.branchname>>.\r\n\r\nThank you!', 'email'),
13376         ('circulation', 'AR_PENDING', '', 'Article Request - Email - Open', 0, 'Article Request Received', '<<borrowers.firstname>> <<borrowers.surname>> (<<borrowers.cardnumber>>)\r\n\r\nWe have received your request for an article from <<biblio.title>> (<<items.barcode>>).\r\n\r\nArticle requested:\r\nTitle: <<article_requests.title>>\r\nAuthor: <<article_requests.author>>\r\nVolume: <<article_requests.volume>>\r\nIssue: <<article_requests.issue>>\r\nDate: <<article_requests.date>>\r\nPages: <<article_requests.pages>>\r\nChapters: <<article_requests.chapters>>\r\nNotes: <<article_requests.patron_notes>>\r\n\r\n\r\nThank you!', 'email'),
13377         ('circulation', 'AR_SLIP', '', 'Article Request - Print Slip', 0, 'Test', 'Article Request:\r\n\r\n<<borrowers.firstname>> <<borrowers.surname>> (<<borrowers.cardnumber>>)\r\n\r\nTitle: <<biblio.title>>\r\nBarcode: <<items.barcode>>\r\n\r\nArticle requested:\r\nTitle: <<article_requests.title>>\r\nAuthor: <<article_requests.author>>\r\nVolume: <<article_requests.volume>>\r\nIssue: <<article_requests.issue>>\r\nDate: <<article_requests.date>>\r\nPages: <<article_requests.pages>>\r\nChapters: <<article_requests.chapters>>\r\nNotes: <<article_requests.patron_notes>>\r\n', 'print'),
13378         ('circulation', 'AR_PROCESSING', '', 'Article Request - Email - Processing', 0, 'Article Request Processing', '<<borrowers.firstname>> <<borrowers.surname>> (<<borrowers.cardnumber>>)\r\n\r\nWe are now processing your request for an article from <<biblio.title>> (<<items.barcode>>).\r\n\r\nArticle requested:\r\nTitle: <<article_requests.title>>\r\nAuthor: <<article_requests.author>>\r\nVolume: <<article_requests.volume>>\r\nIssue: <<article_requests.issue>>\r\nDate: <<article_requests.date>>\r\nPages: <<article_requests.pages>>\r\nChapters: <<article_requests.chapters>>\r\nNotes: <<article_requests.patron_notes>>\r\n\r\nThank you!', 'email');
13379     });
13380
13381     print "Upgrade to $DBversion done (Bug 14610 - Add ability to place article requests in Koha)\n";
13382     SetVersion($DBversion);
13383 }
13384
13385 $DBversion = '16.06.00.038';
13386 if ( CheckVersion($DBversion) ) {
13387     $dbh->do(q{
13388         INSERT IGNORE INTO systempreferences (variable,value,options,explanation,type) VALUES ('DefaultPatronSearchFields','surname,firstname,othernames,cardnumber,userid',NULL,'Comma separated list defining the default fields to be used during a patron search','free');
13389     });
13390
13391     print "Upgrade to $DBversion done (Bug 14874 - Add ability to search for patrons by date of birth from checkout and patron quick searches)\n";
13392     SetVersion($DBversion);
13393 }
13394
13395 $DBversion = "16.06.00.039";
13396 if ( CheckVersion($DBversion) ) {
13397
13398     my $sth = $dbh->prepare(q{
13399         SELECT s.itemnumber, i.itype, b.itemtype
13400         FROM
13401          ( SELECT DISTINCT itemnumber
13402            FROM statistics
13403            WHERE ( type = "return" OR type = "localuse" ) AND
13404                  itemtype IS NULL
13405          ) s
13406         LEFT JOIN
13407          ( SELECT itemnumber,biblionumber, itype
13408              FROM items
13409            UNION
13410            SELECT itemnumber,biblionumber, itype
13411              FROM deleteditems
13412          ) i
13413         ON (s.itemnumber=i.itemnumber)
13414         LEFT JOIN
13415          ( SELECT biblionumber, itemtype
13416              FROM biblioitems
13417            UNION
13418            SELECT biblionumber, itemtype
13419              FROM deletedbiblioitems
13420          ) b
13421         ON (i.biblionumber=b.biblionumber);
13422     });
13423     $sth->execute();
13424
13425     my $update_sth = $dbh->prepare(q{
13426         UPDATE statistics
13427         SET itemtype=?
13428         WHERE itemnumber=? AND itemtype IS NULL
13429     });
13430     my $ilevel_itypes = C4::Context->preference('item-level_itypes');
13431
13432     while ( my ($itemnumber,$item_itype,$biblio_itype) = $sth->fetchrow_array ) {
13433
13434         my $effective_itemtype = $ilevel_itypes
13435                                     ? $item_itype // $biblio_itype
13436                                     : $biblio_itype;
13437         warn "item-level_itypes set but no itype defined for item ($itemnumber)"
13438             if $ilevel_itypes and !defined $item_itype;
13439         $update_sth->execute( $effective_itemtype, $itemnumber );
13440     }
13441
13442     print "Upgrade to $DBversion done (Bug 14598: itemtype is not set on statistics by C4::Circulation::AddReturn)\n";
13443     SetVersion($DBversion);
13444 }
13445
13446 $DBversion = '16.06.00.040';
13447 if ( CheckVersion($DBversion) ) {
13448     $dbh->do(q{
13449         ALTER TABLE `aqcontacts` ADD `orderacquisition` BOOLEAN NOT NULL DEFAULT 0 AFTER `notes`;
13450     });
13451     $dbh->do(q{
13452         INSERT IGNORE INTO `letter` (module, code, name, title, content, message_transport_type) VALUES
13453         ('orderacquisition','ACQORDER','Acquisition order','Order','<<aqbooksellers.name>>\r\n<<aqbooksellers.address1>>\r\n<<aqbooksellers.address2>>\r\n<<aqbooksellers.address3>>\r\n<<aqbooksellers.address4>>\r\n<<aqbooksellers.phone>>\r\n\r\nPlease order for the library:\r\n\r\n<order>Ordernumber <<aqorders.ordernumber>> (<<biblio.title>>) (quantity: <<aqorders.quantity>>) ($<<aqorders.listprice>> each).</order>\r\n\r\nThank you,\n\n<<branches.branchname>>', 'email');
13454     });
13455
13456     print "Upgrade to $DBversion done (Bug 5260 - Add option to send an order by e-mail to the acquisition module)\n";
13457     SetVersion($DBversion);
13458 }
13459
13460 $DBversion = '16.06.00.041';
13461 if ( CheckVersion($DBversion) ) {
13462     $dbh->do(q{
13463         INSERT IGNORE INTO systempreferences (variable,value,explanation,options,type) VALUES ('AggressiveMatchOnISSN','0','If enabled, attempt to match aggressively by trying all variations of the ISSNs in the imported record as a phrase in the ISSN fields of already cataloged records when matching on ISSN with the record import tool','','YesNo')
13464     });
13465
13466     print "Upgrade to $DBversion done (Bug 14629 - Add aggressive ISSN matching feature equivalent to the aggressive ISBN matcher)\n";
13467     SetVersion($DBversion);
13468 }
13469
13470 $DBversion = '16.06.00.042';
13471 if ( CheckVersion($DBversion) ) {
13472     $dbh->do(q|
13473         ALTER TABLE aqorders
13474             ADD COLUMN unitprice_tax_excluded decimal(28,6) default NULL AFTER unitprice,
13475             ADD COLUMN unitprice_tax_included decimal(28,6) default NULL AFTER unitprice_tax_excluded,
13476             ADD COLUMN rrp_tax_excluded decimal(28,6) default NULL AFTER rrp,
13477             ADD COLUMN rrp_tax_included decimal(28,6) default NULL AFTER rrp_tax_excluded,
13478             ADD COLUMN ecost_tax_excluded decimal(28,6) default NULL AFTER ecost,
13479             ADD COLUMN ecost_tax_included decimal(28,6) default NULL AFTER ecost_tax_excluded,
13480             ADD COLUMN tax_value decimal(6,4) default NULL AFTER gstrate
13481     |);
13482
13483     # rename gstrate with tax_rate
13484     $dbh->do(q|ALTER TABLE aqorders CHANGE COLUMN gstrate tax_rate decimal(6,4) DEFAULT NULL|);
13485     $dbh->do(q|ALTER TABLE aqbooksellers CHANGE COLUMN gstrate tax_rate decimal(6,4) DEFAULT NULL|);
13486
13487     # Fill the new columns
13488     my $orders = $dbh->selectall_arrayref(q|
13489         SELECT * FROM aqorders
13490     |, { Slice => {} } );
13491
13492     my $sth_update_order = $dbh->prepare(q|
13493         UPDATE aqorders
13494         SET unitprice_tax_excluded = ?,
13495             unitprice_tax_included = ?,
13496             rrp_tax_excluded = ?,
13497             rrp_tax_included = ?,
13498             ecost_tax_excluded = ?,
13499             ecost_tax_included = ?,
13500             tax_value = ?
13501         WHERE ordernumber = ?
13502     |);
13503
13504     my $sth_get_bookseller = $dbh->prepare(q|
13505         SELECT aqbooksellers.*
13506         FROM aqbooksellers
13507         LEFT JOIN aqbasket ON aqbasket.booksellerid = aqbooksellers.id
13508         LEFT JOIN aqorders ON aqorders.basketno = aqbasket.basketno
13509         WHERE ordernumber = ?
13510     |);
13511
13512     require Number::Format;
13513     my $format = Number::Format->new;
13514     my $precision = 2;
13515     for my $order ( @$orders ) {
13516         $sth_get_bookseller->execute( $order->{ordernumber} );
13517         my ( $bookseller ) = $sth_get_bookseller->fetchrow_hashref;
13518         $order->{rrp}   = $format->round( $order->{rrp}, $precision );
13519         $order->{ecost} = $format->round( $order->{ecost}, $precision );
13520         $order->{tax_rate} ||= 0 ; # tax_rate can be NULL in DB
13521         # Ordering
13522         if ( $bookseller->{listincgst} ) {
13523             $order->{rrp_tax_included} = $order->{rrp};
13524             $order->{rrp_tax_excluded} = $format->round(
13525                 $order->{rrp_tax_included} / ( 1 + $order->{tax_rate} ), $precision );
13526             $order->{ecost_tax_included} = $order->{ecost};
13527             $order->{ecost_tax_excluded} = $format->round(
13528                 $order->{ecost} / ( 1 + $order->{tax_rate} ), $precision );
13529         }
13530         else {
13531             $order->{rrp_tax_excluded} = $order->{rrp};
13532             $order->{rrp_tax_included} = $format->round(
13533                 $order->{rrp} * ( 1 + $order->{tax_rate} ), $precision );
13534             $order->{ecost_tax_excluded} = $order->{ecost};
13535             $order->{ecost_tax_included} = $format->round(
13536                 $order->{ecost} * ( 1 + $order->{tax_rate} ), $precision );
13537         }
13538
13539         #receiving
13540         if ( $bookseller->{listincgst} ) {
13541             $order->{unitprice_tax_included} = $format->round( $order->{unitprice}, $precision );
13542             $order->{unitprice_tax_excluded} = $format->round(
13543               $order->{unitprice_tax_included} / ( 1 + $order->{tax_rate} ), $precision );
13544         }
13545         else {
13546             $order->{unitprice_tax_excluded} = $format->round( $order->{unitprice}, $precision );
13547             $order->{unitprice_tax_included} = $format->round(
13548               $order->{unitprice_tax_excluded} * ( 1 + $order->{tax_rate} ), $precision );
13549         }
13550
13551         # If the order is received, the tax is calculated from the unit price
13552         if ( $order->{orderstatus} eq 'complete' ) {
13553             $order->{tax_value} = $format->round(
13554               ( $order->{unitprice_tax_included} - $order->{unitprice_tax_excluded} )
13555               * $order->{quantity}, $precision );
13556         } else {
13557             # otherwise the ecost is used
13558             $order->{tax_value} = $format->round(
13559                 ( $order->{ecost_tax_included} - $order->{ecost_tax_excluded} ) *
13560                   $order->{quantity}, $precision );
13561         }
13562
13563         $sth_update_order->execute(
13564             $order->{unitprice_tax_excluded},
13565             $order->{unitprice_tax_included},
13566             $order->{rrp_tax_excluded},
13567             $order->{rrp_tax_included},
13568             $order->{ecost_tax_excluded},
13569             $order->{ecost_tax_included},
13570             $order->{tax_value},
13571             $order->{ordernumber},
13572         );
13573     }
13574
13575     print "Upgrade to $DBversion done (Bug 13321 - Tax and prices calculation need to be fixed)\n";
13576     SetVersion($DBversion);
13577 }
13578
13579 $DBversion = '16.06.00.043';
13580 if ( CheckVersion($DBversion) ) {
13581     # Add the new columns
13582     $dbh->do(q|
13583         ALTER TABLE aqorders
13584             ADD COLUMN tax_rate_on_ordering   decimal(6,4) default NULL AFTER tax_rate,
13585             ADD COLUMN tax_rate_on_receiving  decimal(6,4) default NULL AFTER tax_rate_on_ordering,
13586             ADD COLUMN tax_value_on_ordering  decimal(28,6) default NULL AFTER tax_value,
13587             ADD COLUMN tax_value_on_receiving decimal(28,6) default NULL AFTER tax_value_on_ordering
13588     |);
13589
13590     my $orders = $dbh->selectall_arrayref(q|
13591         SELECT * FROM aqorders
13592     |, { Slice => {} } );
13593
13594     my $sth_update_order = $dbh->prepare(q|
13595         UPDATE aqorders
13596         SET tax_rate_on_ordering = tax_rate,
13597             tax_rate_on_receiving = tax_rate,
13598             tax_value_on_ordering = ?,
13599             tax_value_on_receiving = ?
13600         WHERE ordernumber = ?
13601     |);
13602
13603     for my $order (@$orders) {
13604         my $tax_value_on_ordering =
13605           $order->{quantity} *
13606           $order->{ecost_tax_excluded} *
13607           $order->{tax_rate};
13608
13609         my $tax_value_on_receiving =
13610           ( defined $order->{unitprice_tax_excluded} )
13611           ? $order->{quantity} * $order->{unitprice_tax_excluded} * $order->{tax_rate}
13612           : undef;
13613
13614         $sth_update_order->execute( $tax_value_on_ordering,
13615             $tax_value_on_receiving, $order->{ordernumber} );
13616     }
13617
13618     # Remove the old columns
13619     $dbh->do(q|
13620         ALTER TABLE aqorders
13621             CHANGE COLUMN tax_value tax_value_bak  decimal(28,6) default NULL,
13622             CHANGE COLUMN tax_rate tax_rate_bak decimal(6,4) default NULL
13623     |);
13624
13625     print "Upgrade to $DBversion done (Bug 13323 - Change the tax rate on receiving)\n";
13626     SetVersion($DBversion);
13627 }
13628
13629 $DBversion = '16.06.00.044';
13630 if ( CheckVersion($DBversion) ) {
13631     $dbh->do(q{
13632         ALTER TABLE `messages`
13633         ADD `manager_id` int(11) NULL,
13634         ADD FOREIGN KEY (`manager_id`) REFERENCES `borrowers` (`borrowernumber`) ON DELETE SET NULL;
13635     });
13636
13637     print "Upgrade to $DBversion done (Bug 17397 - Show name of librarian who created circulation message)\n";
13638     SetVersion($DBversion);
13639 }
13640
13641 $DBversion = '16.06.00.045';
13642 if ( CheckVersion($DBversion) ) {
13643     $dbh->do(q{
13644         UPDATE systempreferences SET options = "now|dateexpiry|combination", explanation = "Set whether the borrower renewal date should be counted from the dateexpiry, from the current date or by combination: if the dateexpiry is in future use dateexpiry, else use current date " WHERE variable = "BorrowerRenewalPeriodBase";
13645     });
13646
13647     print "Upgrade to $DBversion done (Bug 17443 - Make possible to renew patron by later of expiry and current date)\n";
13648     SetVersion($DBversion);
13649 }
13650
13651 $DBversion = '16.06.00.046';
13652 if ( CheckVersion($DBversion) ) {
13653     $dbh->do(q{
13654         ALTER TABLE issuingrules ADD COLUMN no_auto_renewal_after INT(4) DEFAULT NULL AFTER auto_renew;
13655     });
13656
13657     print "Upgrade to $DBversion done (Bug 15581 - Add a circ rule to not allow auto-renewals after defined loan period)\n";
13658     SetVersion($DBversion);
13659 }
13660
13661 $DBversion = '16.06.00.047';
13662 if ( CheckVersion($DBversion) ) {
13663     $dbh->do(q{
13664         UPDATE language_descriptions SET description = 'Čeština' WHERE subtag = 'cs' AND type = 'language' AND lang = 'cs'
13665     });
13666
13667     print "Upgrade to $DBversion done (Bug 17518: Displayed language name for Czech is wrong)\n";
13668     SetVersion($DBversion);
13669 }
13670
13671 $DBversion = '16.06.00.048';
13672 if( CheckVersion( $DBversion ) ) {
13673     $dbh->do(q|
13674         INSERT IGNORE INTO permissions (module_bit, code, description) VALUES
13675         (13, 'upload_general_files', 'Upload any file'),
13676         (13, 'upload_manage', 'Manage uploaded files');
13677     |);
13678
13679     # Update user_permissions for current users (check count in uploaded_files)
13680     # Note 9 == edit_catalogue and 13 == tools
13681     # We do not insert if someone is superlibrarian, does not have edit_catalogue,
13682     # or already has all tools
13683     $dbh->do(q|
13684         INSERT IGNORE INTO user_permissions (borrowernumber, module_bit, code)
13685         SELECT borrowernumber, 13, 'upload_general_files'
13686         FROM borrowers bo
13687         WHERE flags<>1 AND flags & POW(2,13) = 0 AND
13688             ( flags & POW(2,9) > 0 OR (
13689                 SELECT COUNT(*) FROM user_permissions
13690                 WHERE borrowernumber=bo.borrowernumber AND module_bit=9 ) > 0 )
13691             AND ( SELECT COUNT(*) FROM uploaded_files ) > 0;
13692     |);
13693
13694     SetVersion( $DBversion );
13695     print "Upgrade to $DBversion done (Bug 17663 - Forgotten userpermissions)\n";
13696 }
13697
13698 $DBversion = '16.06.00.049';
13699 if( CheckVersion( $DBversion ) ) {
13700     $dbh->do(q|
13701         INSERT IGNORE INTO systempreferences (variable,value,options,explanation,type) 
13702         VALUES ('ReplytoDefault',  '',  NULL,  'The default email address to be set as replyto.',  'Free');
13703     |);
13704
13705     $dbh->do(q|
13706         INSERT IGNORE INTO systempreferences (variable,value,options,explanation,type)
13707         VALUES ('ReturnpathDefault',  '',  NULL,  'The default email address to be set as return-path',  'Free');
13708     |);
13709
13710     SetVersion( $DBversion );
13711     print "Upgrade to $DBversion done (Bug 17391 - ReturnpathDefault and ReplyToDefault missing from syspref.sql)\n";
13712 }
13713
13714 $DBversion = "16.06.00.050";
13715 if ( CheckVersion($DBversion) ) {
13716
13717     # If index issn_idx still exists, we assume that dbrev 3.15.00.049 failed,
13718     # and we repeat it (partially).
13719     # Note: the db rev only pertains to biblioitems and is not needed for
13720     # deletedbiblioitems.
13721
13722     my $temp = $dbh->selectall_arrayref( "SHOW INDEXES FROM biblioitems WHERE key_name = 'issn_idx'" );
13723
13724     if( @$temp > 0 ) {
13725         $dbh->do( "ALTER TABLE biblioitems DROP INDEX isbn" );
13726         $dbh->do( "ALTER TABLE biblioitems DROP INDEX issn" );
13727         $dbh->do( "ALTER TABLE biblioitems DROP INDEX issn_idx" );
13728         $dbh->do( "ALTER TABLE biblioitems CHANGE isbn isbn MEDIUMTEXT NULL DEFAULT NULL, CHANGE issn issn MEDIUMTEXT NULL DEFAULT NULL" );
13729         $dbh->do( "ALTER TABLE biblioitems ADD INDEX isbn ( isbn ( 255 ) ), ADD INDEX issn ( issn ( 255 ) )" );
13730         print "Upgrade to $DBversion done (Bug 8835). Removed issn_idx.\n";
13731     } else {
13732         print "Upgrade to $DBversion done (Bug 8835). Everything is fine.\n";
13733     }
13734
13735     SetVersion($DBversion);
13736 }
13737
13738 $DBversion = "16.11.00.000";
13739 if ( CheckVersion($DBversion) ) {
13740     print "Upgrade to $DBversion done (Koha 16.11)\n";
13741     SetVersion($DBversion);
13742 }
13743
13744 $DBversion = "16.12.00.000";
13745 if ( CheckVersion($DBversion) ) {
13746     print "Upgrade to $DBversion done (Koha 16.12 - Our battered suitcases were piled on the sidewalk again; we had longer ways to go. But no matter, the road is life.)\n";
13747     SetVersion($DBversion);
13748 }
13749
13750 $DBversion = "16.12.00.001";
13751 if ( CheckVersion($DBversion) ) {
13752     $dbh->do(q{
13753         ALTER TABLE borrower_modifications
13754         ADD COLUMN extended_attributes text DEFAULT NULL
13755         AFTER privacy
13756     });
13757
13758     print "Upgrade to $DBversion done (Bug 17767 - Let Koha::Patron::Modification handle extended attributes)\n";
13759     SetVersion($DBversion);
13760 }
13761
13762 $DBversion = '16.12.00.002';
13763 if ( CheckVersion($DBversion) ) {
13764     unless (column_exists( 'branchtransfers', 'branchtransfer_id' )
13765         and index_exists( 'branchtransfers', 'PRIMARY' ) )
13766     {
13767         $dbh->do(
13768             "ALTER TABLE branchtransfers
13769                  ADD COLUMN branchtransfer_id int(12) NOT NULL auto_increment FIRST, ADD CONSTRAINT PRIMARY KEY (branchtransfer_id);"
13770         );
13771     }
13772
13773     SetVersion($DBversion);
13774     print "Upgrade to $DBversion done (Bug 14187 - branchtransfer needs a primary key (id) for DBIx and common sense.)\n";
13775 }
13776
13777 $DBversion = '16.12.00.003';
13778 if ( CheckVersion($DBversion) ) {
13779     $dbh->do(q{DELETE FROM systempreferences WHERE variable="Persona"});
13780     SetVersion($DBversion);
13781     print "Upgrade to $DBversion done (Bug 17486 - Remove 'Mozilla Persona' as an authentication method)\n";
13782 }
13783
13784 $DBversion = '16.12.00.004';
13785 if ( CheckVersion($DBversion) ) {
13786     $dbh->do(q{
13787         CREATE TABLE biblio_metadata (
13788             `id` INT(11) NOT NULL AUTO_INCREMENT,
13789             `biblionumber` INT(11) NOT NULL,
13790             `format` VARCHAR(16) NOT NULL,
13791             `marcflavour` VARCHAR(16) NOT NULL,
13792             `metadata` LONGTEXT NOT NULL,
13793             PRIMARY KEY(id),
13794             UNIQUE KEY `biblio_metadata_uniq_key` (`biblionumber`,`format`,`marcflavour`),
13795             CONSTRAINT `biblio_metadata_fk_1` FOREIGN KEY (biblionumber) REFERENCES biblio (biblionumber) ON DELETE CASCADE ON UPDATE CASCADE
13796         ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
13797     });
13798     $dbh->do(q{
13799         CREATE TABLE deletedbiblio_metadata (
13800             `id` INT(11) NOT NULL AUTO_INCREMENT,
13801             `biblionumber` INT(11) NOT NULL,
13802             `format` VARCHAR(16) NOT NULL,
13803             `marcflavour` VARCHAR(16) NOT NULL,
13804             `metadata` LONGTEXT NOT NULL,
13805             PRIMARY KEY(id),
13806             UNIQUE KEY `deletedbiblio_metadata_uniq_key` (`biblionumber`,`format`,`marcflavour`),
13807             CONSTRAINT `deletedbiblio_metadata_fk_1` FOREIGN KEY (biblionumber) REFERENCES deletedbiblio (biblionumber) ON DELETE CASCADE ON UPDATE CASCADE
13808         ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
13809     });
13810     $dbh->do(q{
13811         INSERT INTO biblio_metadata ( biblionumber, format, marcflavour, metadata ) SELECT biblionumber, 'marcxml', 'CHANGEME', marcxml FROM biblioitems;
13812     });
13813     $dbh->do(q{
13814         INSERT INTO deletedbiblio_metadata ( biblionumber, format, marcflavour, metadata ) SELECT biblionumber, 'marcxml', 'CHANGEME', marcxml FROM deletedbiblioitems;
13815     });
13816     $dbh->do(q{
13817         UPDATE biblio_metadata SET marcflavour = (SELECT value FROM systempreferences WHERE variable="marcflavour");
13818     });
13819     $dbh->do(q{
13820         UPDATE deletedbiblio_metadata SET marcflavour = (SELECT value FROM systempreferences WHERE variable="marcflavour");
13821     });
13822     $dbh->do(q{
13823         ALTER TABLE biblioitems DROP COLUMN marcxml;
13824     });
13825     $dbh->do(q{
13826         ALTER TABLE deletedbiblioitems DROP COLUMN marcxml;
13827     });
13828     SetVersion($DBversion);
13829     print "Upgrade to $DBversion done (Bug 17196 - Move marcxml out of the biblioitems table)\n";
13830 }
13831
13832 $DBversion = '16.12.00.005';
13833 if( CheckVersion( $DBversion ) ) {
13834     $dbh->do( "INSERT IGNORE INTO systempreferences (variable,value,options,explanation,type) VALUES('AuthorityMergeMode','loose','loose|strict','Authority merge mode','Choice')");
13835
13836     SetVersion( $DBversion );
13837     print "Upgrade to $DBversion done (Bug 17913 - AuthorityMergeMode)\n";
13838 }
13839
13840 $DBversion = "16.12.00.006";
13841 if ( CheckVersion($DBversion) ) {
13842     unless (     column_exists( 'borrower_attributes', 'id' )
13843              and index_exists( 'borrower_attributes', 'PRIMARY' ) )
13844     {
13845         $dbh->do(q{
13846             ALTER TABLE `borrower_attributes`
13847                 ADD `id` int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY FIRST
13848         });
13849     }
13850
13851     print "Upgrade to $DBversion done (Bug 17813: Table borrower_attributes needs a primary key\n";
13852     SetVersion($DBversion);
13853 }
13854
13855 $DBversion = "16.12.00.007";
13856 if( CheckVersion( $DBversion ) ) {
13857
13858     if ( column_exists('opac_news', 'new' ) ) {
13859         $dbh->do(q|ALTER TABLE opac_news CHANGE COLUMN new content text NOT NULL|);
13860     }
13861
13862     $dbh->do(q|
13863         UPDATE letter SET content = REPLACE(content, "<<opac_news.new>>", "<<opac_news.content>>") WHERE content LIKE "%<<opac_news.new>>%"
13864     |);
13865
13866     SetVersion( $DBversion );
13867     print "Upgrade to $DBversion done (Bug 17960 - Rename opac_news with opac_news.content (template notices have been updated!))\n";
13868 }
13869
13870 $DBversion = "16.12.00.008";
13871 if( CheckVersion( $DBversion ) ) {
13872     $dbh->do(q{
13873         INSERT IGNORE INTO systempreferences (variable,value,explanation,options,type) VALUES
13874         ('MarcItemFieldsToOrder','','Set the mapping values for new item records created from a MARC record in a staged file. In a YAML format.', NULL, 'textarea');
13875     });
13876
13877     SetVersion( $DBversion );
13878     print "Upgrade to $DBversion done (Bug 15503 - Grab Item Information from Order Files)\n";
13879 }
13880
13881 $DBversion = "16.12.00.009";
13882 if( CheckVersion( $DBversion ) ) {
13883     $dbh->do(q{
13884         INSERT IGNORE INTO systempreferences (variable,value,explanation,options,type) VALUES
13885         ('OPACHoldsIfAvailableAtPickup','1','','Allow to pickup up holds at libraries where the item is available','YesNo');
13886     });
13887
13888     $dbh->do(q{
13889         INSERT IGNORE INTO systempreferences (variable,value,explanation,options,type) VALUES
13890         ('OPACHoldsIfAvailableAtPickupExceptions','','','List the patron categories not affected by OPACHoldsIfAvailableAtPickup if off','Free');
13891     });
13892
13893     SetVersion( $DBversion );
13894     print "Upgrade to $DBversion done (Bug 17453 - Inter-site holds improvement)\n";
13895 }
13896
13897 $DBversion = "16.12.00.010";
13898 if( CheckVersion( $DBversion ) ) {
13899     $dbh->do(q{
13900         ALTER TABLE borrowers ADD overdrive_auth_token text default NULL AFTER lastseen;
13901     });
13902
13903     $dbh->do(q{
13904         ALTER TABLE deletedborrowers ADD overdrive_auth_token text default NULL AFTER lastseen;
13905     });
13906
13907     $dbh->do(q{
13908         INSERT IGNORE INTO systempreferences (variable,value,explanation,options,type)
13909         VALUES ('OverDriveCirculation','0','Enable client to see their OverDrive account','','YesNo');
13910     });
13911
13912     SetVersion( $DBversion );
13913     print "Upgrade to $DBversion done (Bug 16034 - Integration with OverDrive Patron API)\n";
13914 }
13915
13916 $DBversion = "16.12.00.011";
13917 if( CheckVersion( $DBversion ) ) {
13918     $dbh->do(q{
13919         ALTER TABLE search_field CHANGE COLUMN type type ENUM('', 'string', 'date', 'number', 'boolean', 'sum') NOT NULL
13920         COMMENT 'what type of data this holds, relevant when storing it in the search engine';
13921     });
13922
13923     SetVersion( $DBversion );
13924     print "Upgrade to $DBversion done (Bug 17260 - updatedatabase.pl fails on invalid entries in ENUM and BOOLEAN columns)\n";
13925 }
13926
13927 $DBversion = "16.12.00.012";
13928 if( CheckVersion( $DBversion ) ) {
13929     $dbh->do(q{
13930         INSERT IGNORE INTO `systempreferences` (`variable`, `value`, `options`, `explanation`, `type`)
13931         VALUES ('OpacNewsLibrarySelect', '0', '', 'Show selector for branches on OPAC news page', 'YesNo');
13932     });
13933
13934     SetVersion( $DBversion );
13935     print "Upgrade to $DBversion done (Bug 14764 - Add OPAC News branch selector)\n";
13936 }
13937
13938 $DBversion = "16.12.00.013";
13939 if( CheckVersion( $DBversion ) ) {
13940     $dbh->do(q{
13941         INSERT IGNORE INTO systempreferences (`variable`, `value`, `options`, `explanation`, `type`)
13942         VALUES ('CircSidebar','0','','Activate or deactivate the navigation sidebar on all Circulation pages','YesNo');
13943     });
13944
13945     SetVersion( $DBversion );
13946     print "Upgrade to $DBversion done (Bug 16530 - Add a circ sidebar navigation menu)\n";
13947 }
13948
13949 $DBversion = "16.12.00.014";
13950 if( CheckVersion( $DBversion ) ) {
13951     $dbh->do(q{
13952             INSERT INTO systempreferences ( `variable`, `value`, `options`, `explanation`, `type` ) VALUES
13953             ('LoadSearchHistoryToTheFirstLoggedUser', '1', NULL, 'If ON, the next user will automatically get the last searches in his history', 'YesNo');
13954             });
13955             SetVersion( $DBversion );
13956             print "Upgrade to $DBversion done (Bug 8010 - Search history can be added to the wrong patron)\n";
13957             }
13958
13959 $DBversion = "16.12.00.015";
13960 if( CheckVersion( $DBversion ) ) {
13961     unless( column_exists( 'branches', 'geolocation' ) ) {
13962         $dbh->do(q|
13963                 ALTER TABLE branches ADD COLUMN geolocation VARCHAR(255) DEFAULT NULL after opac_info
13964                 |);
13965     }
13966
13967     $dbh->do(q|
13968             INSERT IGNORE INTO systempreferences (variable, value, options, explanation, type ) VALUES ('UsageStatsGeolocation', '', NULL, 'Geolocation of the main library', 'Free');
13969             |);
13970     $dbh->do(q|
13971             INSERT IGNORE INTO systempreferences (variable, value, options, explanation, type ) VALUES ('UsageStatsLibrariesInfo', '', NULL, 'Share libraries information', 'YesNo');
13972             |);
13973     $dbh->do(q|
13974             INSERT IGNORE INTO systempreferences (variable, value, options, explanation, type ) VALUES ('UsageStatsPublicID', '', NULL, 'Public ID for Hea website', 'Free');
13975             |);
13976         
13977         SetVersion( $DBversion );
13978     print "Upgrade to $DBversion done (Bug 18066 - Hea version 2)\n";
13979 }
13980
13981 $DBversion = "16.12.00.016";
13982 if ( CheckVersion($DBversion) ) {
13983     unless ( column_exists( 'borrower_attribute_types', 'opac_editable' ) )
13984     {
13985         $dbh->do(q{
13986             ALTER TABLE borrower_attribute_types
13987                 ADD COLUMN `opac_editable` tinyint(1) NOT NULL default 0 AFTER `opac_display`
13988         });
13989     }
13990
13991     print "Upgrade to $DBversion done (Bug 13757: Make patron attributes editable in the opac if set to 'editable in OPAC)'\n";
13992     SetVersion($DBversion);
13993 }
13994
13995 $DBversion = "16.12.00.017";
13996 if ( CheckVersion($DBversion) ) {
13997     $dbh->do(q{
13998         INSERT IGNORE INTO systempreferences (variable,value,options,explanation,type)
13999         VALUES ('CumulativeRestrictionPeriods',  0,  NULL,  'Cumulate the restriction periods instead of keeping the highest',  'YesNo')
14000     });
14001
14002     print "Upgrade to $DBversion done (Bug 14146 - Additional days are not added to restriction period when checking-in several overdues for same patron)'\n";
14003     SetVersion($DBversion);
14004 }
14005
14006 $DBversion = "16.12.00.018";
14007 if ( CheckVersion($DBversion) ) {
14008     $dbh->do(q{
14009         INSERT IGNORE INTO systempreferences ( variable, value, options, explanation, type )
14010             SELECT 'ExportCircHistory', COUNT(*), NULL, "Display the export circulation options",  'YesNo'
14011             FROM systempreferences
14012             WHERE ( variable = 'ExportRemoveFields' AND value != "" AND value IS NOT NULL )
14013                 OR ( variable = 'ExportWithCsvProfile' AND value != "" AND value IS NOT NULL );
14014     });
14015
14016     $dbh->do(q{
14017         DELETE FROM systempreferences WHERE variable="ExportWithCsvProfile";
14018     });
14019
14020     print "Upgrade to $DBversion done (Bug 15498 - Replace ExportWithCsvProfile with ExportCircHistory)'\n";
14021     SetVersion($DBversion);
14022 }
14023
14024 $DBversion = "16.12.00.019";
14025 if( CheckVersion( $DBversion ) ) {
14026     if ( column_exists( 'issues', 'return' ) ) {
14027         $dbh->do(q|ALTER TABLE issues DROP column `return`|);
14028     }
14029
14030     if ( column_exists( 'old_issues', 'return' ) ) {
14031         $dbh->do(q|ALTER TABLE old_issues DROP column `return`|);
14032     }
14033
14034     SetVersion( $DBversion );
14035     print "Upgrade to $DBversion done (Bug 18173 - Remove issues.return DB field)\n";
14036 }
14037
14038 $DBversion = "16.12.00.020";
14039 if( CheckVersion( $DBversion ) ) {
14040     $dbh->do(q{
14041         UPDATE systempreferences SET options="any_time_is_placed|not_always|any_time_is_collected" WHERE variable="HoldFeeMode";
14042     });
14043
14044     $dbh->do(q{
14045         UPDATE systempreferences SET value="any_time_is_placed" WHERE variable="HoldFeeMode" AND value="always";
14046     });
14047
14048     SetVersion( $DBversion );
14049     print "Upgrade to $DBversion done (Bug 17560 - Hold fee placement at point of checkout)\n";
14050 }
14051
14052 $DBversion = "16.12.00.021";
14053 if( CheckVersion( $DBversion ) ) {
14054     $dbh->do(q{
14055         INSERT IGNORE INTO systempreferences ( `variable`, `value`, `options`, `explanation`, `type` ) VALUES
14056         ('RenewalLog','0','','If ON, log information about renewals','YesNo');
14057     });
14058
14059     SetVersion( $DBversion );
14060     print "Upgrade to $DBversion done (Bug 17708 - Renewal log seems empty)\n";
14061 }
14062
14063 $DBversion = "16.12.00.022";
14064 if( CheckVersion( $DBversion ) ) {
14065     print "NOTE: The sender for claim notifications has been corrected. The email address of the staff member is no longer used. We will use the branch email address or KohaAdminEmailAddress, as is done for other notices.\n";
14066     SetVersion( $DBversion );
14067     print "Upgrade to $DBversion done (Bug 17866 - Change sender for serial claim notifications)\n";
14068 }
14069
14070 $DBversion = '16.12.00.023';
14071 if( CheckVersion( $DBversion ) ) {
14072     my $oldval = C4::Context->preference('dontmerge');
14073     my $newval = $oldval ? 0 : 50;
14074
14075     # Remove dontmerge, add AuthorityMergeLimit
14076     $dbh->do(q{
14077         DELETE FROM systempreferences WHERE variable = 'dontmerge';
14078     });
14079     $dbh->do(qq{
14080         INSERT IGNORE INTO systempreferences ( variable, value, options, explanation, type ) VALUES ('AuthorityMergeLimit','$newval',NULL,'Maximum number of biblio records updated immediately when an authority record has been modified.','integer');
14081     });
14082
14083     $dbh->do(q{
14084         ALTER TABLE need_merge_authorities
14085             ADD COLUMN authid_new BIGINT AFTER authid,
14086             ADD COLUMN reportxml text AFTER authid_new,
14087             ADD COLUMN timestamp timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP;
14088     });
14089
14090     $dbh->do(q{
14091         UPDATE need_merge_authorities SET authid_new=authid WHERE done <> 1
14092     });
14093
14094     SetVersion( $DBversion );
14095     if( $newval == 0 ) {
14096         print "NOTE: Since dontmerge was enabled, we have initialized AuthorityMergeLimit to 0 records. Please consider raising this value. This will allow for performing smaller merges directly and only postponing larger merges.\n";
14097     }
14098     print "IMPORTANT NOTE: If you are not using a Debian package install, please verify that you no longer use misc/migration_tools/merge_authority.pl in your cron files AND add misc/cronjobs/merge_authorities.pl to cron now. This job is no longer optional! You need it to perform larger authority merges.\n";
14099     print "Upgrade to $DBversion done (Bug 9988 - Add AuthorityMergeLimit)\n";
14100 }
14101
14102 $DBversion = '16.12.00.024';
14103 if( CheckVersion( $DBversion ) ) {
14104     $dbh->do(q{
14105         UPDATE systempreferences SET variable="NoticeBcc" WHERE variable="OverdueNoticeBcc";
14106     });
14107
14108     SetVersion( $DBversion );
14109     print "Upgrade to $DBversion done (Bug 14537 - The system preference 'OverdueNoticeBcc' is mis-named.)\n";
14110 }
14111
14112 $DBversion = '16.12.00.025';
14113 if( CheckVersion( $DBversion ) ) {
14114     $dbh->do(q|
14115         INSERT IGNORE INTO systempreferences ( `variable`, `value`, `options`, `explanation`, `type` )
14116         VALUES ('UploadPurgeTemporaryFilesDays','',NULL,'If not empty, number of days used when automatically deleting temporary uploads','integer');
14117     |);
14118
14119     my ( $cnt ) = $dbh->selectrow_array( "SELECT COUNT(*) FROM uploaded_files WHERE permanent IS NULL or permanent=0" );
14120     if( $cnt ) {
14121         print "NOTE: You have $cnt temporary uploads. You could benefit from setting pref UploadPurgeTemporaryFilesDays now to automatically delete them.\n";
14122     }
14123
14124     SetVersion( $DBversion );
14125     print "Upgrade to $DBversion done (Bug 17669 - Introduce preference for deleting temporary uploads)\n";
14126 }
14127
14128 $DBversion = '16.12.00.026';
14129 if( CheckVersion( $DBversion ) ) {
14130
14131     # In order to be overcomplete, we check if the situation is what we expect
14132     if( !index_exists( 'serialitems', 'PRIMARY' ) ) {
14133         if( index_exists( 'serialitems', 'serialitemsidx' ) ) {
14134             $dbh->do(q|
14135                 ALTER TABLE serialitems ADD PRIMARY KEY (itemnumber), DROP INDEX serialitemsidx;
14136             |);
14137         } else {
14138             $dbh->do(q|ALTER TABLE serialitems ADD PRIMARY KEY (itemnumber)|);
14139         }
14140     }
14141
14142     SetVersion( $DBversion );
14143     print "Upgrade to $DBversion done (Bug 18427 - Add a primary key to serialitems)\n";
14144 }
14145
14146 $DBversion = '16.12.00.027';
14147 if( CheckVersion( $DBversion ) ) {
14148
14149     $dbh->do(q{
14150         CREATE TABLE IF NOT EXISTS club_templates (
14151           id int(11) NOT NULL AUTO_INCREMENT,
14152           `name` tinytext NOT NULL,
14153           description text,
14154           is_enrollable_from_opac tinyint(1) NOT NULL DEFAULT '0',
14155           is_email_required tinyint(1) NOT NULL DEFAULT '0',
14156           branchcode varchar(10) NULL DEFAULT NULL,
14157           date_created timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
14158           date_updated timestamp NULL DEFAULT NULL,
14159           is_deletable tinyint(1) NOT NULL DEFAULT '1',
14160           PRIMARY KEY (id),
14161           KEY ct_branchcode (branchcode),
14162           CONSTRAINT `club_templates_ibfk_1` FOREIGN KEY (branchcode) REFERENCES `branches` (branchcode) ON DELETE CASCADE ON UPDATE CASCADE
14163         ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
14164     });
14165
14166     $dbh->do(q{
14167         CREATE TABLE IF NOT EXISTS clubs (
14168           id int(11) NOT NULL AUTO_INCREMENT,
14169           club_template_id int(11) NOT NULL,
14170           `name` tinytext NOT NULL,
14171           description text,
14172           date_start date DEFAULT NULL,
14173           date_end date DEFAULT NULL,
14174           branchcode varchar(10) NULL DEFAULT NULL,
14175           date_created timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
14176           date_updated timestamp NULL DEFAULT NULL,
14177           PRIMARY KEY (id),
14178           KEY club_template_id (club_template_id),
14179           KEY branchcode (branchcode),
14180           CONSTRAINT clubs_ibfk_1 FOREIGN KEY (club_template_id) REFERENCES club_templates (id) ON DELETE CASCADE ON UPDATE CASCADE,
14181           CONSTRAINT clubs_ibfk_2 FOREIGN KEY (branchcode) REFERENCES branches (branchcode)
14182         ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
14183     });
14184
14185     $dbh->do(q{
14186         CREATE TABLE IF NOT EXISTS club_enrollments (
14187           id int(11) NOT NULL AUTO_INCREMENT,
14188           club_id int(11) NOT NULL,
14189           borrowernumber int(11) NOT NULL,
14190           date_enrolled timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
14191           date_canceled timestamp NULL DEFAULT NULL,
14192           date_created timestamp NULL DEFAULT NULL,
14193           date_updated timestamp NULL DEFAULT NULL,
14194           branchcode varchar(10) NULL DEFAULT NULL,
14195           PRIMARY KEY (id),
14196           KEY club_id (club_id),
14197           KEY borrowernumber (borrowernumber),
14198           KEY branchcode (branchcode),
14199           CONSTRAINT club_enrollments_ibfk_1 FOREIGN KEY (club_id) REFERENCES clubs (id) ON DELETE CASCADE ON UPDATE CASCADE,
14200           CONSTRAINT club_enrollments_ibfk_2 FOREIGN KEY (borrowernumber) REFERENCES borrowers (borrowernumber) ON DELETE CASCADE ON UPDATE CASCADE,
14201           CONSTRAINT club_enrollments_ibfk_3 FOREIGN KEY (branchcode) REFERENCES branches (branchcode) ON DELETE SET NULL ON UPDATE CASCADE
14202         ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
14203     });
14204
14205     $dbh->do(q{
14206         CREATE TABLE IF NOT EXISTS club_template_enrollment_fields (
14207           id int(11) NOT NULL AUTO_INCREMENT,
14208           club_template_id int(11) NOT NULL,
14209           `name` tinytext NOT NULL,
14210           description text,
14211           authorised_value_category varchar(16) DEFAULT NULL,
14212           PRIMARY KEY (id),
14213           KEY club_template_id (club_template_id),
14214           CONSTRAINT club_template_enrollment_fields_ibfk_1 FOREIGN KEY (club_template_id) REFERENCES club_templates (id) ON DELETE CASCADE ON UPDATE CASCADE
14215         ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
14216     });
14217
14218     $dbh->do(q{
14219         CREATE TABLE IF NOT EXISTS club_enrollment_fields (
14220           id int(11) NOT NULL AUTO_INCREMENT,
14221           club_enrollment_id int(11) NOT NULL,
14222           club_template_enrollment_field_id int(11) NOT NULL,
14223           `value` text NOT NULL,
14224           PRIMARY KEY (id),
14225           KEY club_enrollment_id (club_enrollment_id),
14226           KEY club_template_enrollment_field_id (club_template_enrollment_field_id),
14227           CONSTRAINT club_enrollment_fields_ibfk_1 FOREIGN KEY (club_enrollment_id) REFERENCES club_enrollments (id) ON DELETE CASCADE ON UPDATE CASCADE,
14228           CONSTRAINT club_enrollment_fields_ibfk_2 FOREIGN KEY (club_template_enrollment_field_id) REFERENCES club_template_enrollment_fields (id) ON DELETE CASCADE ON UPDATE CASCADE
14229         ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
14230     });
14231
14232     $dbh->do(q{
14233         CREATE TABLE IF NOT EXISTS club_template_fields (
14234           id int(11) NOT NULL AUTO_INCREMENT,
14235           club_template_id int(11) NOT NULL,
14236           `name` tinytext NOT NULL,
14237           description text,
14238           authorised_value_category varchar(16) DEFAULT NULL,
14239           PRIMARY KEY (id),
14240           KEY club_template_id (club_template_id),
14241           CONSTRAINT club_template_fields_ibfk_1 FOREIGN KEY (club_template_id) REFERENCES club_templates (id) ON DELETE CASCADE ON UPDATE CASCADE
14242         ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
14243     });
14244
14245     $dbh->do(q{
14246         CREATE TABLE IF NOT EXISTS club_fields (
14247           id int(11) NOT NULL AUTO_INCREMENT,
14248           club_template_field_id int(11) NOT NULL,
14249           club_id int(11) NOT NULL,
14250           `value` text,
14251           PRIMARY KEY (id),
14252           KEY club_template_field_id (club_template_field_id),
14253           KEY club_id (club_id),
14254           CONSTRAINT club_fields_ibfk_3 FOREIGN KEY (club_template_field_id) REFERENCES club_template_fields (id) ON DELETE CASCADE ON UPDATE CASCADE,
14255           CONSTRAINT club_fields_ibfk_4 FOREIGN KEY (club_id) REFERENCES clubs (id) ON DELETE CASCADE ON UPDATE CASCADE
14256         ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
14257     });
14258
14259     $dbh->do(q{
14260         INSERT IGNORE INTO userflags (bit, flag, flagdesc, defaulton) VALUES (21, 'clubs', 'Patron clubs', '0');
14261     });
14262
14263     $dbh->do(q{
14264         INSERT IGNORE INTO permissions (module_bit, code, description) VALUES
14265            (21, 'edit_templates', 'Create and update club templates'),
14266            (21, 'edit_clubs', 'Create and update clubs'),
14267            (21, 'enroll', 'Enroll patrons in clubs')
14268         ;
14269     });
14270
14271     SetVersion( $DBversion );
14272     print "Upgrade to $DBversion done (Bug 12461 - Add patron clubs feature)\n";
14273 }
14274
14275 $DBversion = '16.12.00.028';
14276 if( CheckVersion( $DBversion ) ) {
14277     $dbh->do(q{
14278         UPDATE systempreferences  SET options = 'us|de|fr' WHERE variable = 'AddressFormat';
14279     });
14280
14281     SetVersion( $DBversion );
14282     print "Upgrade to $DBversion done (Bug 18110 - Adds FR to the syspref AddressFormat)\n";
14283 }
14284
14285 $DBversion = '16.12.00.029';
14286 if( CheckVersion( $DBversion ) ) {
14287     unless( column_exists( 'issues', 'note' ) ) {
14288         $dbh->do(q|ALTER TABLE issues ADD note mediumtext default NULL AFTER onsite_checkout|);
14289     }
14290     unless( column_exists( 'issues', 'notedate' ) ) {
14291         $dbh->do(q|ALTER TABLE issues ADD notedate datetime default NULL AFTER note|);
14292     }
14293     unless( column_exists( 'old_issues', 'note' ) ) {
14294         $dbh->do(q|ALTER TABLE old_issues ADD note mediumtext default NULL AFTER onsite_checkout|);
14295     }
14296     unless( column_exists( 'old_issues', 'notedate' ) ) {
14297         $dbh->do(q|ALTER TABLE old_issues ADD notedate datetime default NULL AFTER note|);
14298     }
14299
14300     $dbh->do(q|
14301         INSERT IGNORE INTO letter (`module`, `code`, `branchcode`, `name`, `is_html`, `title`, `content`, `message_transport_type`)
14302         VALUES ('circulation', 'CHECKOUT_NOTE', '', 'Checkout note on item set by patron', '0', 'Checkout note', '<<borrowers.firstname>> <<borrowers.surname>> has added a note to the item <<biblio.title>> - <<biblio.author>> (<<biblio.biblionumber>>).','email');
14303     |);
14304
14305     $dbh->do(q|
14306         INSERT IGNORE INTO systempreferences (`variable`, `value`, `options`, `explanation`,`type`)
14307         VALUES ('AllowCheckoutNotes', '0', NULL, 'Allow patrons to submit notes about checked out items.','YesNo');
14308     |);
14309
14310     SetVersion( $DBversion );
14311     print "Upgrade to $DBversion done (Bug 14224: Add column issues.note and issues.notedate)\n";
14312 }
14313
14314 $DBversion = '16.12.00.030';
14315 if( CheckVersion( $DBversion ) ) {
14316     unless( column_exists( 'issuingrules', 'no_auto_renewal_after_hard_limit' ) ) {
14317         $dbh->do(q{
14318             ALTER TABLE issuingrules ADD COLUMN no_auto_renewal_after_hard_limit DATE DEFAULT NULL AFTER no_auto_renewal_after;
14319         });
14320     }
14321
14322     SetVersion( $DBversion );
14323     print "Upgrade to $DBversion done (Bug 16344 - Add a circ rule to limit the auto renewals given a specific date)\n";
14324 }
14325
14326 $DBversion = '16.12.00.031';
14327 if( CheckVersion( $DBversion ) ) {
14328     if ( !index_exists( 'biblioitems', 'timestamp' ) ) {
14329         $dbh->do("ALTER TABLE biblioitems ADD KEY `timestamp` (`timestamp`);");
14330     }
14331     if ( !index_exists( 'deletedbiblioitems', 'timestamp' ) ) {
14332         $dbh->do("ALTER TABLE deletedbiblioitems ADD KEY `timestamp` (`timestamp`);");
14333     }
14334     if ( !index_exists( 'items', 'timestamp' ) ) {
14335         $dbh->do("ALTER TABLE items ADD KEY `timestamp` (`timestamp`);");
14336     }
14337     if ( !index_exists( 'deleteditems', 'timestamp' ) ) {
14338         $dbh->do("ALTER TABLE deleteditems ADD KEY `timestamp` (`timestamp`);");
14339     }
14340
14341     SetVersion( $DBversion );
14342     print "Upgrade to $DBversion done (Bug 15108: OAI-PMH provider improvements)\n";
14343 }
14344
14345 $DBversion = '16.12.00.032';
14346 if( CheckVersion( $DBversion ) ) {
14347     require Koha::Calendar;
14348
14349     $dbh->do(q{
14350         INSERT IGNORE INTO systempreferences (variable,value,explanation,options,type) 
14351         VALUES ('ExcludeHolidaysFromMaxPickUpDelay', '0', 'If ON, reserves max pickup delay takes into account the closed days.', NULL, 'Integer');
14352     });
14353
14354     my $waiting_holds = $dbh->selectall_arrayref(q|
14355         SELECT expirationdate, waitingdate, branchcode
14356         FROM reserves
14357         WHERE found = 'W' AND priority = 0
14358     |, { Slice => {} });
14359     my $update_sth = $dbh->prepare(q|
14360         UPDATE reserves
14361         SET expirationdate = ?
14362         WHERE reserve_id = ?
14363     |);
14364     my $max_pickup_delay = C4::Context->preference("ReservesMaxPickUpDelay");
14365     for my $hold ( @$waiting_holds ) {
14366
14367         my $requested_expiration;
14368         if ($hold->{expirationdate}) {
14369             $requested_expiration = dt_from_string($hold->{expirationdate});
14370         }
14371
14372         my $expirationdate = dt_from_string($hold->{waitingdate});
14373         if ( C4::Context->preference("ExcludeHolidaysFromMaxPickUpDelay") ) {
14374             my $calendar = Koha::Calendar->new( branchcode => $hold->{branchcode}, days_mode => C4::Context->preference('useDaysMode') );
14375             $expirationdate = $calendar->days_forward( $expirationdate, $max_pickup_delay );
14376         } else {
14377             $expirationdate->add( days => $max_pickup_delay );
14378         }
14379
14380         my $cmp = $requested_expiration ? DateTime->compare($requested_expiration, $expirationdate) : 0;
14381         $update_sth->execute($cmp == -1 ? $requested_expiration->ymd : $expirationdate->ymd, $hold->{reserve_id});
14382     }
14383
14384     SetVersion( $DBversion );
14385     print "Upgrade to $DBversion done (Bug 12063 - Update reserves.expirationdate)\n";
14386 }
14387
14388 $DBversion = '16.12.00.033';
14389 if( CheckVersion( $DBversion ) ) {
14390
14391     if( !column_exists( 'letter', 'lang' ) ) {
14392         $dbh->do( "ALTER TABLE letter ADD COLUMN lang VARCHAR(25) NOT NULL DEFAULT 'default' AFTER message_transport_type" );
14393     }
14394
14395     if( !column_exists( 'borrowers', 'lang' ) ) {
14396         $dbh->do( "ALTER TABLE borrowers ADD COLUMN lang VARCHAR(25) NOT NULL DEFAULT 'default' AFTER lastseen" );
14397         $dbh->do( "ALTER TABLE deletedborrowers ADD COLUMN lang VARCHAR(25) NOT NULL DEFAULT 'default' AFTER lastseen" );
14398     }
14399
14400     # Add test on existene of this key
14401     $dbh->do( "ALTER TABLE message_transports DROP FOREIGN KEY message_transports_ibfk_3 ");
14402     $dbh->do( "ALTER TABLE letter DROP PRIMARY KEY ");
14403     $dbh->do( "ALTER TABLE letter ADD PRIMARY KEY (`module`, `code`, `branchcode`, `message_transport_type`, `lang`) ");
14404
14405     $dbh->do( "INSERT IGNORE INTO systempreferences (variable,value,options,explanation,type)
14406         VALUES ('TranslateNotices',  '0',  NULL,  'Allow notices to be translated',  'YesNo') ");
14407
14408     SetVersion( $DBversion );
14409     print "Upgrade to $DBversion done (Bug 17762 - Add columns letter.lang and borrowers.lang to allow translation of notices)\n";
14410 }
14411
14412 $DBversion = '16.12.00.034';
14413 if( CheckVersion( $DBversion ) ) {
14414     $dbh->do(q{
14415         INSERT IGNORE INTO systempreferences ( `variable`, `value`, `options`, `explanation`, `type` )
14416         VALUES ('OPACFineNoRenewalsBlockAutoRenew','0','','Block/Allow auto renewals if the patron owe more than OPACFineNoRenewals','YesNo')
14417     });
14418
14419     SetVersion( $DBversion );
14420     print "Upgrade to $DBversion done (Bug 15582 - Ability to block auto renewals if the OPACFineNoRenewals amount is reached)\n";
14421 }
14422
14423 $DBversion = '16.12.00.035';
14424 if( CheckVersion( $DBversion ) ) {
14425     if( !column_exists( 'issues', 'auto_renew_error' ) ) {
14426         $dbh->do(q{
14427            ALTER TABLE issues ADD COLUMN auto_renew_error VARCHAR(32) DEFAULT NULL AFTER auto_renew;
14428         });
14429     }
14430
14431     if( !column_exists( 'old_issues', 'auto_renew_error' ) ) {
14432         $dbh->do(q{
14433             ALTER TABLE old_issues ADD COLUMN auto_renew_error VARCHAR(32) DEFAULT NULL AFTER auto_renew;
14434         });
14435     }
14436
14437     $dbh->do(q{
14438             INSERT INTO letter (module, code, name, title, content, message_transport_type) VALUES ('circulation', 'AUTO_RENEWALS', 'Notification of automatic renewal', 'Automatic renewal notice',
14439         "Dear [% borrower.firstname %] [% borrower.surname %],
14440 [% IF checkout.auto_renew_error %]
14441 The following item, [% biblio.title %], has not been renewed because:
14442 [% IF checkout.auto_renew_error == 'too_many' %]
14443 You have reached the maximum number of checkouts possible.
14444 [% ELSIF checkout.auto_renew_error == 'on_reserve' %]
14445 This item is on hold for another patron.
14446 [% ELSIF checkout.auto_renew_error == 'restriction' %]
14447 You are currently restricted.
14448 [% ELSIF checkout.auto_renew_error == 'overdue' %]
14449 You have overdue items.
14450 [% ELSIF checkout.auto_renew_error == 'auto_too_late' %]
14451 It\'s too late to renew this item.
14452 [% ELSIF checkout.auto_renew_error == 'auto_too_much_oweing' %]
14453 Your total unpaid fines are too high.
14454 [% END %]
14455 [% ELSE %]
14456 The following item, [% biblio.title %], has correctly been renewed and is now due on [% checkout.date_due | $KohaDates as_due_date => 1 %]
14457 [% END %]", 'email');
14458     });
14459
14460     SetVersion( $DBversion );
14461     print "Upgrade to $DBversion done (Bug 15705 - Notify the user on auto renewing)\n";
14462 }
14463
14464 $DBversion = '16.12.00.036';
14465 if( CheckVersion( $DBversion ) ) {
14466     $dbh->do(q{
14467         INSERT IGNORE INTO systempreferences (`variable`, `value`, `options`, `explanation`, `type`)
14468         VALUES ('NumSavedReports', '20', NULL, 'By default, show this number of saved reports.', 'Integer');
14469     });
14470
14471     SetVersion( $DBversion );
14472     print "Upgrade to $DBversion done (Bug 17465 - Add a System Preference to control number of Saved Reports displayed)\n";
14473 }
14474
14475 $DBversion = '16.12.00.037';
14476 if( CheckVersion( $DBversion ) ) {
14477     $dbh->do( q|
14478         INSERT IGNORE INTO systempreferences (`variable`, `value`, `options`, `explanation`, `type`)
14479         VALUES ('FailedLoginAttempts','','','Number of login attempts before lockout the patron account','Integer');
14480     |);
14481
14482     unless( column_exists( 'borrowers', 'login_attempts' ) ) {
14483         $dbh->do(q|
14484             ALTER TABLE borrowers ADD COLUMN login_attempts INT(4) DEFAULT 0 AFTER lastseen
14485         |);
14486         $dbh->do(q|
14487             ALTER TABLE deletedborrowers ADD COLUMN login_attempts INT(4) DEFAULT 0 AFTER lastseen
14488         |);
14489     }
14490
14491     SetVersion( $DBversion );
14492     print "Upgrade to $DBversion done (Bug 18314 - Add FailedLoginAttempts and borrowers.login_attempts)\n";
14493 }
14494
14495 $DBversion = '16.12.00.038';
14496 if( CheckVersion( $DBversion ) ) {
14497     $dbh->do(q{
14498         INSERT IGNORE INTO systempreferences ( `variable`, `value`, `options`, `explanation`, `type` ) VALUES
14499         ('ExportRemoveFields','',NULL,'List of fields for non export in circulation.pl (separated by a space)','Free');
14500     });
14501
14502     SetVersion( $DBversion );
14503     print "Upgrade to $DBversion done (Bug 18663 - Missing db update for ExportRemoveFields)\n";
14504 }
14505
14506 $DBversion = '16.12.00.039';
14507 if( CheckVersion( $DBversion ) ) {
14508     $dbh->do(q{
14509         INSERT IGNORE INTO systempreferences ( `variable`, `value`, `options`, `explanation`, `type` ) VALUES
14510         ('TalkingTechItivaPhoneNotification','0',NULL,'If ON, enables Talking Tech I-tiva phone notifications','YesNo');
14511     });
14512
14513     SetVersion( $DBversion );
14514     print "Upgrade to $DBversion done (Bug 18600 - Missing db update for TalkingTechItivaPhoneNotification)\n";
14515 }
14516
14517 $DBversion = '17.05.00.000';
14518 if( CheckVersion( $DBversion ) ) {
14519
14520     SetVersion( $DBversion );
14521     print "Upgrade to $DBversion done (Koha 17.05)\n";
14522 }
14523
14524 $DBversion = '17.06.00.000';
14525 if( CheckVersion( $DBversion ) ) {
14526     SetVersion( $DBversion );
14527     print "Upgrade to $DBversion done (He pai ake te iti i te kore)\n";
14528 }
14529
14530 $DBversion = '17.06.00.001';
14531 if( CheckVersion( $DBversion ) ) {
14532
14533     unless ( column_exists( 'export_format', 'used_for' ) ) {
14534         $dbh->do(q|ALTER TABLE export_format ADD used_for varchar(255) DEFAULT 'export_records' AFTER type|);
14535
14536         $dbh->do(q|UPDATE export_format SET used_for = 'late_issues' WHERE type = 'sql'|);
14537         $dbh->do(q|UPDATE export_format SET used_for = 'export_records' WHERE type = 'marc'|);
14538     }
14539     SetVersion( $DBversion );
14540     print "Upgrade to $DBversion done (Bug 8612 - Add new column export_format.used_for)\n";
14541 }
14542
14543 $DBversion = '17.06.00.002';
14544 if ( CheckVersion($DBversion) ) {
14545
14546     unless ( column_exists('virtualshelves', 'allow_change_from_owner' ) ) {
14547         $dbh->do(q|
14548             ALTER TABLE virtualshelves
14549             ADD COLUMN allow_change_from_owner tinyint(1) default 1,
14550             ADD COLUMN allow_change_from_others tinyint(1) default 0
14551         |);
14552
14553         # Conversion:
14554         # Since we had no readonly lists, change_from_owner is set to true.
14555         # When adding or delete_other was granted, change_from_others is true.
14556         # Note: In my opinion the best choice; there is no exact match.
14557         $dbh->do(q|
14558             UPDATE virtualshelves
14559             SET allow_change_from_owner = 1,
14560                 allow_change_from_others = CASE WHEN allow_add=1 OR allow_delete_other=1 THEN 1 ELSE 0 END
14561         |);
14562
14563         # Remove the old columns
14564         $dbh->do(q|
14565             ALTER TABLE virtualshelves
14566             DROP COLUMN allow_add,
14567             DROP COLUMN allow_delete_own,
14568             DROP COLUMN allow_delete_other
14569         |);
14570     }
14571
14572     SetVersion($DBversion);
14573     print "Upgrade to $DBversion done (Bug 18228 - Alter table virtualshelves to simplify permissions)\n";
14574 }
14575
14576 $DBversion = '17.06.00.003';
14577 if ( CheckVersion($DBversion) ) {
14578
14579     # Fetch all auth types
14580     my $authtypes = $dbh->selectcol_arrayref(q|SELECT authtypecode FROM auth_types|);
14581
14582     if ( grep { $_ eq 'Default' } @$authtypes ) {
14583
14584         # If this exists as an authtypecode, we don't do anything
14585     }
14586     else {
14587         # Replace the incorrect Default by empty string
14588         $dbh->do(q|
14589             UPDATE auth_header SET authtypecode='' WHERE authtypecode='Default'
14590         |);
14591     }
14592
14593     SetVersion($DBversion);
14594     print "Upgrade to $DBversion done (Bug 18801 - Update incorrect Default auth type codes)\n";
14595 }
14596
14597 $DBversion = '17.06.00.004';
14598 if( CheckVersion( $DBversion ) ) {
14599     $dbh->do(q{
14600         INSERT IGNORE INTO systempreferences ( `variable`, `value`, `options`, `explanation`, `type` ) VALUES
14601         ('GoogleOpenIDConnectAutoRegister',   '0',NULL,' Google OpenID Connect logins to auto-register patrons.','YesNo'),
14602         ('GoogleOpenIDConnectDefaultCategory','','','This category code will be used to create Google OpenID Connect patrons.','Textarea'),
14603         ('GoogleOpenIDConnectDefaultBranch',  '','','This branch code will be used to create Google OpenID Connect patrons.','Textarea');
14604     });
14605
14606     SetVersion( $DBversion );
14607     print "Upgrade to $DBversion done (Bug 16892: Add automatic patron registration via OAuth2 login)\n";
14608 }
14609
14610 $DBversion = '17.06.00.005';
14611 if( CheckVersion( $DBversion ) ) {
14612     $dbh->do(q{
14613         INSERT IGNORE INTO systempreferences (`variable`, `value`, `options`, `explanation`, `type`) VALUES  ('StaffLangSelectorMode','footer','top|both|footer','Select the location to display the language selector in staff client','Choice')
14614         });
14615
14616     SetVersion( $DBversion );
14617     print "Upgrade to $DBversion done (Bug 18718 - Language selector in staff header menu similar to OPAC )\n";
14618 }
14619
14620 $DBversion = '17.06.00.006';
14621 if( CheckVersion( $DBversion ) ) {
14622     print q{WARNING: Bug 18811 fixed an inconsistency in the visibility settings for authority frameworks. It is recommended that you run script misc/maintenance/auth_show_hidden_data.pl to check if you have data in hidden fields and adjust your frameworks accordingly to prevent data loss when editing such records.};
14623     print "\n";
14624
14625     SetVersion( $DBversion );
14626     print "Upgrade to $DBversion done (Bug 18811 - Visibility settings inconsistent between framework and authority editor)\n";
14627 }
14628
14629 $DBversion = '17.06.00.007';
14630 if( CheckVersion( $DBversion ) ) {
14631     if( !column_exists( 'branches', 'marcorgcode' ) ) {
14632         $dbh->do( "ALTER TABLE branches ADD COLUMN marcorgcode VARCHAR(16) default NULL AFTER geolocation" );
14633     }
14634
14635     SetVersion( $DBversion );
14636     print "Upgrade to $DBversion done (Bug 10132 - MARCOrgCode on branch level (branches.marcorgcode))\n";
14637 }
14638
14639 $DBversion = '17.06.00.008';
14640 if( CheckVersion( $DBversion ) ) {
14641     unless ( column_exists( 'borrowers', 'date_renewed' ) ) {
14642         $dbh->do(q{
14643             ALTER TABLE borrowers ADD COLUMN date_renewed DATE NULL DEFAULT NULL AFTER dateexpiry;
14644         });
14645     }
14646
14647     unless ( column_exists( 'deletedborrowers', 'date_renewed' ) ) {
14648         $dbh->do(q{
14649             ALTER TABLE deletedborrowers ADD COLUMN date_renewed DATE NULL DEFAULT NULL AFTER dateexpiry;
14650         });
14651     }
14652
14653     unless ( column_exists( 'borrower_modifications', 'date_renewed' ) ) {
14654         $dbh->do(q{
14655             ALTER TABLE borrower_modifications ADD COLUMN date_renewed DATE NULL DEFAULT NULL AFTER dateexpiry;
14656         });
14657     }
14658
14659     SetVersion( $DBversion );
14660     print "Upgrade to $DBversion done (Bug 6758 - Capture membership renewal date for reporting purposes (borrowers.date_renewed))\n";
14661 }
14662
14663 $DBversion = '17.06.00.009';
14664 if( CheckVersion( $DBversion ) ) {
14665     $dbh->do(q{
14666         ALTER TABLE borrowers MODIFY COLUMN login_attempts int(4) DEFAULT 0 AFTER lang;
14667     });
14668     $dbh->do(q{
14669         ALTER TABLE deletedborrowers MODIFY COLUMN login_attempts int(4) DEFAULT 0 AFTER lang;
14670     });
14671
14672     SetVersion( $DBversion );
14673     print "Upgrade to $DBversion done (Bug 19344 -  Reorder lang and login_attempts in the [deleted]borrowers tables)\n";
14674 }
14675
14676 $DBversion = '17.06.00.010';
14677 if ( CheckVersion($DBversion) ) {
14678     $dbh->do(q{
14679         INSERT IGNORE INTO systempreferences ( `variable`, `value`, `options`, `explanation`, `type` )
14680         VALUES (
14681             'DefaultCountryField008','','',
14682             'Fill in the default country code for field 008 Range 15-17 of MARC21 - Place of publication, production, or execution. See <a href=\"http://www.loc.gov/marc/countries/countries_code.html\">MARC Code List for Countries</a>','Free')
14683     });
14684     SetVersion($DBversion);
14685     print "Upgrade to $DBversion done (Bug 13912 - System preference for default place of publication (country code) for field 008, range 15-17)\n";
14686 }
14687
14688 $DBversion = '17.06.00.011';
14689 if ( CheckVersion($DBversion) ) {
14690     # Drop index that might exist because of bug 5337
14691     if( index_exists('biblioitems', 'ean')) {
14692         $dbh->do(q{ ALTER TABLE biblioitems DROP INDEX ean });
14693     }
14694     if( index_exists('deletedbiblioitems', 'ean')) {
14695         $dbh->do(q{ ALTER TABLE deletedbiblioitems DROP INDEX ean });
14696     }
14697
14698     # Change data type of column
14699     $dbh->do(q{ ALTER TABLE biblioitems MODIFY COLUMN ean MEDIUMTEXT default NULL });
14700     $dbh->do(q{ ALTER TABLE deletedbiblioitems MODIFY COLUMN ean MEDIUMTEXT default NULL });
14701
14702     # Add indexes
14703     $dbh->do(q{ ALTER TABLE biblioitems ADD INDEX ean ( ean(255) )});
14704     $dbh->do(q{ ALTER TABLE deletedbiblioitems ADD INDEX ean ( ean(255 ) )});
14705
14706     SetVersion($DBversion);
14707     print "Upgrade to $DBversion done (Bug 13766 - Make ean mediumtext and add ean indexes)\n";
14708 }
14709
14710 $DBversion = '17.06.00.012';
14711 if( CheckVersion( $DBversion ) ) {
14712     my $where = q|host='clio-db.cc.columbia.edu' AND port=7090|;
14713     my $sql = "SELECT COUNT(*) FROM z3950servers WHERE $where";
14714     my ( $cnt ) = $dbh->selectrow_array( $sql );
14715     if( $cnt ) {
14716         $dbh->do( "DELETE FROM z3950servers WHERE $where" );
14717         print "Removed $cnt Z39.50 target(s) for Columbia University\n";
14718     }
14719
14720     SetVersion( $DBversion );
14721     print "Upgrade to $DBversion done (Bug 19043 - Z39.50 target for Columbia University is no longer publicly available.)\n";
14722 }
14723
14724 $DBversion = '17.06.00.013';
14725 if( CheckVersion( $DBversion ) ) {
14726     $dbh->do( "UPDATE systempreferences SET value = CONCAT('http://', value) WHERE variable = 'staffClientBaseURL' AND value <> '' AND value NOT LIKE 'http%'" );
14727
14728     my ( $staffClientBaseURL_used_in_notices ) = $dbh->selectrow_array(q|
14729         SELECT COUNT(*) FROM letter where content like "%staffClientBaseURL%"
14730     |);
14731     if ( $staffClientBaseURL_used_in_notices ) {
14732         warn "\tYou may need to update one or more notice templates if they contain 'staffClientBaseURL'\n";
14733     }
14734
14735     SetVersion( $DBversion );
14736     print "Upgrade to $DBversion done (Bug 16401 - fix potentialy bad set staffClientBaseURL preference)\n";
14737 }
14738
14739 $DBversion = '17.06.00.014';
14740 if( CheckVersion( $DBversion ) ) {
14741     unless( column_exists('aqbasket','create_items') ){
14742         $dbh->do(q{
14743             ALTER TABLE aqbasket
14744                 ADD COLUMN create_items ENUM('ordering', 'receiving', 'cataloguing') default NULL AFTER is_standing
14745         });
14746     }
14747
14748     SetVersion( $DBversion );
14749     print "Upgrade to $DBversion done (Bug 15685 - Allow creation of items (AcqCreateItem) to be customizable per-basket)\n";
14750 }
14751
14752 $DBversion = '17.06.00.015';
14753 if( CheckVersion( $DBversion ) ) {
14754     $dbh->do(q{
14755         INSERT IGNORE INTO systempreferences (`variable`, `value`, `options`, `explanation`, `type`) VALUES
14756         ('SelfCheckoutByLogin','0',NULL,'Have patrons login into the web-based self checkout system with their username/password or their cardnumber','YesNo')
14757     });
14758
14759     SetVersion( $DBversion );
14760     print "Upgrade to $DBversion done (Bug 19186 - Insert system preference SelfCheckoutByLogin if missing)\n";
14761 }
14762
14763 $DBversion = '17.06.00.016';
14764 if( CheckVersion( $DBversion ) ) {
14765     $dbh->do(q{
14766         INSERT IGNORE INTO systempreferences (`variable`, `value`, `options`, `explanation`, `type`)
14767         VALUES ('RequireStrongPassword','0','','Require a strong login password for staff and patrons','YesNo');
14768     });
14769
14770     SetVersion( $DBversion );
14771     print "Upgrade to $DBversion done (Bug 18298 - Allow enforcing password complexity (system preference RequireStrongPassword))\n";
14772 }
14773
14774 $DBversion = '17.06.00.017';
14775 if( CheckVersion( $DBversion ) ) {
14776     unless (TableExists('account_offsets')) {
14777         $dbh->do(q{
14778             DROP TABLE IF EXISTS `accountoffsets`;
14779         });
14780
14781         $dbh->do(q{
14782             CREATE TABLE IF NOT EXISTS `account_offset_types` (
14783               `type` varchar(16) NOT NULL, -- The type of offset this is
14784               PRIMARY KEY (`type`)
14785             ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
14786         });
14787
14788         $dbh->do(q{
14789             CREATE TABLE IF NOT EXISTS `account_offsets` (
14790               `id` int(11) NOT NULL auto_increment, -- unique identifier for each offset
14791               `credit_id` int(11) NULL DEFAULT NULL, -- The id of the accountline the increased the patron's balance
14792               `debit_id` int(11) NULL DEFAULT NULL, -- The id of the accountline that decreased the patron's balance
14793               `type` varchar(16) NOT NULL, -- The type of offset this is
14794               `amount` decimal(26,6) NOT NULL, -- The amount of the change
14795               `created_on` timestamp NOT NULL default CURRENT_TIMESTAMP,
14796               PRIMARY KEY (`id`),
14797               CONSTRAINT `account_offsets_ibfk_p` FOREIGN KEY (`credit_id`) REFERENCES `accountlines` (`accountlines_id`) ON DELETE CASCADE ON UPDATE CASCADE,
14798               CONSTRAINT `account_offsets_ibfk_f` FOREIGN KEY (`debit_id`) REFERENCES `accountlines` (`accountlines_id`) ON DELETE CASCADE ON UPDATE CASCADE,
14799               CONSTRAINT `account_offsets_ibfk_t` FOREIGN KEY (`type`) REFERENCES `account_offset_types` (`type`) ON DELETE CASCADE ON UPDATE CASCADE
14800             ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
14801         });
14802
14803         $dbh->do(q{
14804             INSERT IGNORE INTO account_offset_types ( type ) VALUES
14805             ('Writeoff'),
14806             ('Payment'),
14807             ('Lost Item'),
14808             ('Processing Fee'),
14809             ('Manual Debit'),
14810             ('Reverse Payment'),
14811             ('Forgiven'),
14812             ('Dropbox'),
14813             ('Rental Fee'),
14814             ('Fine Update'),
14815             ('Fine');
14816         });
14817     }
14818
14819     SetVersion( $DBversion );
14820     print "Upgrade to $DBversion done (Bug 14826 - Resurrect account offsets table (Add new tables account_offsets and account_offset_types))\n";
14821 }
14822
14823 $DBversion = '17.06.00.018';
14824 if( CheckVersion( $DBversion ) ) {
14825     $dbh->do(q{
14826         INSERT IGNORE INTO systempreferences (variable,value,explanation,type) VALUES ('useDefaultReplacementCost',0,'default replacement cost defined in item type','YesNo');
14827     });
14828     $dbh->do(q{
14829         INSERT IGNORE INTO systempreferences (variable,value,explanation,type) VALUES ('ProcessingFeeNote','','Set the text to be recorded in the column note, table accountlines when the processing fee (defined in item type) is applied','textarea');
14830     });
14831     $dbh->do(q{
14832         ALTER TABLE `itemtypes` MODIFY COLUMN `rentalcharge` DECIMAL(28,6) NULL DEFAULT NULL;
14833     });
14834     unless ( column_exists( 'itemtypes', 'defaultreplacecost' ) ) {
14835         $dbh->do(q{
14836             ALTER TABLE `itemtypes` ADD `defaultreplacecost` DECIMAL(28,6) NULL DEFAULT NULL AFTER `rentalcharge`;
14837         });
14838     }
14839     unless ( column_exists( 'itemtypes', 'processfee' ) ) {
14840         $dbh->do(q{
14841             ALTER TABLE `itemtypes` ADD `processfee` DECIMAL(28,6) NULL DEFAULT NULL AFTER `defaultreplacecost`;
14842         });
14843
14844     }
14845     SetVersion( $DBversion );
14846     print "Upgrade to $DBversion done (Bug 12768 - Insert system preferences useDefaultReplacementCost and ProcessingFeeNote + Add new columns defaultreplacecost and processfee to the itemtypes table)\n";
14847 }
14848
14849 $DBversion = '17.06.00.019';
14850 if( CheckVersion( $DBversion ) ) {
14851     $dbh->do(q{
14852         INSERT IGNORE INTO account_offset_types ( type ) VALUES ( 'Processing Fee' );
14853     });
14854
14855     SetVersion( $DBversion );
14856     print "Upgrade to $DBversion done (Bug 12768 - Add 'Processing Fee' to the account_offset_types table if missing)\n";
14857 }
14858
14859 $DBversion = '17.06.00.020';
14860 if( CheckVersion( $DBversion ) ) {
14861     $dbh->do(q{
14862         UPDATE systempreferences
14863         SET
14864             variable='OpacLocationOnDetail',
14865             options='holding|home|both|column',
14866             explanation='In the OPAC detail, display the shelving location on its own column or under a library columns.'
14867         WHERE
14868             variable='OpacLocationBranchToDisplayShelving'
14869     });
14870
14871     SetVersion( $DBversion );
14872     print "Upgrade to $DBversion done (Bug 19028: Add 'shelving location' to holdings table in detail page (Rename syspref OpacLocationBranchToDisplayShelving with OpacLocationOnDetail))\n";
14873 }
14874
14875 $DBversion = '17.06.00.021';
14876 if( CheckVersion( $DBversion ) ) {
14877     $dbh->do(q{
14878         INSERT IGNORE INTO systempreferences (`variable`, `value`, `options`, `explanation`, `type` ) VALUES ('SCOMainUserBlock','','70|10','Add a block of HTML that will display on the self checkout screen','Textarea')
14879     });
14880
14881     SetVersion( $DBversion );
14882     print "Upgrade to $DBversion done (Bug 17381 - Add system preference SCOMainUserBlock)\n";
14883 }
14884
14885 $DBversion = '17.06.00.022';
14886 if( CheckVersion( $DBversion ) ) {
14887     my $hide_barcode = C4::Context->preference('OPACShowBarcode') ? 0 : 1;
14888     $dbh->do(q{
14889         DELETE FROM systempreferences
14890         WHERE
14891             variable='OPACShowBarcode'
14892     });
14893
14894     # Configure column visibility if it isn't
14895     $dbh->do(q{
14896         INSERT IGNORE INTO columns_settings
14897             (module,page,tablename,columnname,cannot_be_toggled,is_hidden)
14898         VALUES
14899             ('opac','biblio-detail','holdingst','item_barcode',0,?)
14900     }, undef, $hide_barcode);
14901
14902     SetVersion( $DBversion );
14903     print "Upgrade to $DBversion done (Bug 19038: Remove OPACShowBarcode syspref)\n";
14904 }
14905
14906 $DBversion = '17.06.00.023';
14907 if( CheckVersion( $DBversion ) ) {
14908     $dbh->do(q{
14909         INSERT IGNORE INTO systempreferences ( `variable`, `value`, `options`, `explanation`, `type` ) VALUES
14910         ('MarkLostItemsAsReturned','1','','Mark items as returned when flagged as lost','YesNo');
14911     });
14912
14913     SetVersion( $DBversion );
14914     print "Upgrade to $DBversion done (Bug 12363 - Add system preference MarkLostItemsAsReturned)\n";
14915 }
14916
14917 $DBversion = '17.06.00.024';
14918 if( CheckVersion( $DBversion ) ) {
14919     $dbh->do(q{
14920         INSERT IGNORE INTO systempreferences (`variable`,`value`,`options`,`explanation`,`type`) VALUES
14921         ('OPACUserSummary', 1, NULL, "Show the summary of a logged in user's checkouts, overdues, holds and fines on the mainpage", 'YesNo');
14922     });
14923
14924     SetVersion( $DBversion );
14925     print "Upgrade to $DBversion done (Bug 2093 - Add system preference OPACUserSummary)\n";
14926 }
14927
14928 $DBversion = '17.06.00.025';
14929 if( CheckVersion( $DBversion ) ) {
14930     $dbh->do(q{
14931         ALTER TABLE borrowers MODIFY cardnumber varchar(32);
14932     });
14933     $dbh->do(q{
14934         ALTER TABLE borrower_modifications MODIFY cardnumber varchar(32);
14935     });
14936     $dbh->do(q{
14937         ALTER TABLE deletedborrowers MODIFY cardnumber varchar(32);
14938     });
14939     $dbh->do(q{
14940         ALTER TABLE pending_offline_operations MODIFY cardnumber varchar(32);
14941     });
14942     $dbh->do(q{
14943         ALTER TABLE tmp_holdsqueue MODIFY cardnumber varchar(32);
14944     });
14945
14946     SetVersion( $DBversion );
14947     print "Upgrade to $DBversion done (Bug 13178 - Increase cardnumber fields to VARCHAR(32))\n";
14948 }
14949
14950 $DBversion = '17.06.00.026';
14951 if( CheckVersion( $DBversion ) ) {
14952     $dbh->do(q{
14953         INSERT IGNORE INTO systempreferences ( `variable`, `value`, `options`, `explanation`, `type` ) VALUES
14954         ('BlockReturnOfLostItems','0','0','If enabled, items that are marked as lost cannot be returned.','YesNo');
14955     });
14956
14957     SetVersion( $DBversion );
14958     print "Upgrade to $DBversion done (Bug 10748 - Add system preference BlockReturnOfLostItems)\n";
14959 }
14960
14961 $DBversion = '17.06.00.027';
14962 if( CheckVersion( $DBversion ) ) {
14963     if ( !column_exists( 'statistics', 'location' ) ) {
14964         $dbh->do('ALTER TABLE statistics ADD COLUMN location VARCHAR(80) default NULL AFTER itemtype');
14965     }
14966
14967     SetVersion($DBversion);
14968     print "Upgrade to $DBversion done (Bug 18882 - Add location code to statistics table for checkouts and renewals)\n";
14969 }
14970
14971 $DBversion = '17.06.00.028';
14972 if( CheckVersion( $DBversion ) ) {
14973     if ( !TableExists( 'illrequests' ) ) {
14974         $dbh->do(q{
14975             CREATE TABLE illrequests (
14976                illrequest_id serial PRIMARY KEY,           -- ILL request number
14977                borrowernumber integer DEFAULT NULL,        -- Patron associated with request
14978                biblio_id integer DEFAULT NULL,             -- Potential bib linked to request
14979                branchcode varchar(50) NOT NULL,            -- The branch associated with the request
14980                status varchar(50) DEFAULT NULL,            -- Current Koha status of request
14981                placed date DEFAULT NULL,                   -- Date the request was placed
14982                replied date DEFAULT NULL,                  -- Last API response
14983                updated timestamp DEFAULT CURRENT_TIMESTAMP -- Last modification to request
14984                  ON UPDATE CURRENT_TIMESTAMP,
14985                completed date DEFAULT NULL,                -- Date the request was completed
14986                medium varchar(30) DEFAULT NULL,            -- The Koha request type
14987                accessurl varchar(500) DEFAULT NULL,        -- Potential URL for accessing item
14988                cost varchar(20) DEFAULT NULL,              -- Cost of request
14989                notesopac text DEFAULT NULL,                -- Patron notes attached to request
14990                notesstaff text DEFAULT NULL,               -- Staff notes attached to request
14991                orderid varchar(50) DEFAULT NULL,           -- Backend id attached to request
14992                backend varchar(20) DEFAULT NULL,           -- The backend used to create request
14993                CONSTRAINT `illrequests_bnfk`
14994                  FOREIGN KEY (`borrowernumber`)
14995                  REFERENCES `borrowers` (`borrowernumber`)
14996                  ON UPDATE CASCADE ON DELETE CASCADE,
14997                CONSTRAINT `illrequests_bcfk_2`
14998                  FOREIGN KEY (`branchcode`)
14999                  REFERENCES `branches` (`branchcode`)
15000                  ON UPDATE CASCADE ON DELETE CASCADE
15001            ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
15002         });
15003     }
15004
15005     if ( !TableExists( 'illrequestattributes' ) ) {
15006         $dbh->do(q{
15007             CREATE TABLE illrequestattributes (
15008                 illrequest_id bigint(20) unsigned NOT NULL, -- ILL request number
15009                 type varchar(200) NOT NULL,                 -- API ILL property name
15010                 value text NOT NULL,                        -- API ILL property value
15011                 PRIMARY KEY  (`illrequest_id`,`type`),
15012                 CONSTRAINT `illrequestattributes_ifk`
15013                   FOREIGN KEY (illrequest_id)
15014                   REFERENCES `illrequests` (`illrequest_id`)
15015                   ON UPDATE CASCADE ON DELETE CASCADE
15016             ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
15017         });
15018     }
15019
15020     # System preferences
15021     $dbh->do(q{
15022         INSERT IGNORE INTO systempreferences (variable,value,explanation,options,type) VALUES
15023             ('ILLModule','0','If ON, enables the interlibrary loans module.','','YesNo');
15024     });
15025
15026     $dbh->do(q{
15027         INSERT IGNORE INTO systempreferences (variable,value,explanation,options,type) VALUES
15028             ('ILLModuleCopyrightClearance','','70|10','Enter text to enable the copyright clearance stage of request creation. Text will be displayed','Textarea');
15029     });
15030     # userflags
15031     $dbh->do(q{
15032         INSERT IGNORE INTO userflags (bit,flag,flagdesc,defaulton) VALUES
15033             (22,'ill','The Interlibrary Loans Module',0);
15034     });
15035
15036     SetVersion( $DBversion );
15037     print "Upgrade to $DBversion done (Bug 7317 - Add an Interlibrary Loan Module to Circulation and OPAC)\n";
15038 }
15039
15040 $DBversion = '17.11.00.000';
15041 if( CheckVersion( $DBversion ) ) {
15042     SetVersion( $DBversion );
15043     print "Upgrade to $DBversion done (Koha 17.11)\n";
15044 }
15045
15046 $DBversion = '17.12.00.000';
15047 if( CheckVersion( $DBversion ) ) {
15048     SetVersion( $DBversion );
15049     print "Upgrade to $DBversion done (Tē tōia, tē haumatia)\n";
15050 }
15051
15052 $DBversion = '17.12.00.001';
15053 if( CheckVersion( $DBversion ) ) {
15054     foreach my $table (qw(biblio_metadata deletedbiblio_metadata)) {
15055         if (!column_exists($table, 'timestamp')) {
15056             $dbh->do(qq{
15057                 ALTER TABLE `$table`
15058                 ADD COLUMN `timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP AFTER `metadata`,
15059                 ADD KEY `timestamp` (`timestamp`)
15060             });
15061             $dbh->do(qq{
15062                 UPDATE $table metadata
15063                     LEFT JOIN biblioitems ON (biblioitems.biblionumber = metadata.biblionumber)
15064                     LEFT JOIN biblio ON (biblio.biblionumber = metadata.biblionumber)
15065                 SET metadata.timestamp = GREATEST(biblioitems.timestamp, biblio.timestamp);
15066             });
15067         }
15068     }
15069
15070     SetVersion( $DBversion );
15071     print "Upgrade to $DBversion done (Bug 19724 - Add [deleted]biblio_metadata.timestamp)\n";
15072 }
15073
15074 $DBversion = '17.12.00.002';
15075 if( CheckVersion( $DBversion ) ) {
15076
15077     my $msss = $dbh->selectall_arrayref(q|
15078         SELECT kohafield, tagfield, tagsubfield, frameworkcode
15079         FROM marc_subfield_structure
15080         WHERE   frameworkcode != ''
15081     |, { Slice => {} });
15082
15083
15084     my $sth = $dbh->prepare(q|
15085         SELECT kohafield
15086         FROM marc_subfield_structure
15087         WHERE frameworkcode = ''
15088         AND tagfield = ?
15089         AND tagsubfield = ?
15090     |);
15091
15092     my @exceptions;
15093     for my $mss ( @$msss ) {
15094         $sth->execute($mss->{tagfield}, $mss->{tagsubfield} );
15095         my ( $default_kohafield ) = $sth->fetchrow_array();
15096         if( $mss->{kohafield} ) {
15097             push @exceptions, { frameworkcode => $mss->{frameworkcode}, tagfield => $mss->{tagfield}, tagsubfield => $mss->{tagsubfield}, kohafield => $mss->{kohafield} } if not $default_kohafield or $default_kohafield ne $mss->{kohafield};
15098         } else {
15099             push @exceptions, { frameworkcode => $mss->{frameworkcode}, tagfield => $mss->{tagfield}, tagsubfield => $mss->{tagsubfield}, kohafield => q{} } if $default_kohafield;
15100         }
15101     }
15102
15103     if (@exceptions) {
15104         print "WARNING: The Default framework is now considered as authoritative for Koha to MARC mappings. We have found that your additional frameworks contained "
15105           . scalar(@exceptions)
15106           . " mapping(s) that deviate from the standard mappings. Please look at the following list and consider if you need to add them again in Default (possibly as a second mapping).\n";
15107         for my $exception (@exceptions) {
15108             print "Field "
15109               . $exception->{tagfield} . '$'
15110               . $exception->{tagsubfield}
15111               . " in framework "
15112               . $exception->{frameworkcode} . ': ';
15113             if ( $exception->{kohafield} ) {
15114                 print "Mapping to "
15115                   . $exception->{kohafield}
15116                   . " has been adjusted.\n";
15117             }
15118             else {
15119                 print "Mapping has been reset.\n";
15120             }
15121         }
15122
15123         # Sync kohafield
15124
15125         # Clear the destination frameworks first
15126         $dbh->do(q|
15127             UPDATE marc_subfield_structure
15128             SET kohafield = NULL
15129             WHERE   frameworkcode > ''
15130                 AND     Kohafield > ''
15131         |);
15132
15133         # Now copy from Default
15134         my $msss = $dbh->selectall_arrayref(q|
15135             SELECT kohafield, tagfield, tagsubfield
15136             FROM marc_subfield_structure
15137             WHERE   frameworkcode = ''
15138                 AND     kohafield > ''
15139         |, { Slice => {} });
15140         my $sth = $dbh->prepare(q|
15141             UPDATE marc_subfield_structure
15142             SET kohafield = ?
15143             WHERE frameworkcode > ''
15144             AND tagfield = ?
15145             AND tagsubfield = ?
15146         |);
15147         for my $mss (@$msss) {
15148             $sth->execute( $mss->{kohafield}, $mss->{tagfield},
15149                 $mss->{tagsubfield} );
15150         }
15151
15152         # Clear the cache
15153         my @frameworkcodes = $dbh->selectall_arrayref(q|
15154             SELECT frameworkcode FROM biblio_framework WHERE frameworkcode > ''
15155         |);
15156         for my $frameworkcode (@frameworkcodes) {
15157             Koha::Caches->get_instance->clear_from_cache("MarcSubfieldStructure-$frameworkcode");
15158         }
15159         Koha::Caches->get_instance->clear_from_cache("default_value_for_mod_marc-");
15160     }
15161
15162     SetVersion( $DBversion );
15163     print "Upgrade to $DBversion done (Bug 19096 - Make Default authoritative for Koha to MARC mappings)\n";
15164 }
15165
15166 $DBversion = '17.12.00.003';
15167 if( CheckVersion( $DBversion ) ) {
15168     $dbh->do(q|DROP TABLE IF EXISTS notifys|);
15169
15170     if( column_exists( 'accountlines', 'notify_id' ) ) {
15171         $dbh->do(q|ALTER TABLE accountlines DROP COLUMN notify_id|);
15172         $dbh->do(q|ALTER TABLE accountlines DROP COLUMN notify_level|);
15173     }
15174
15175     SetVersion( $DBversion );
15176     print "Upgrade to $DBversion done (Bug 10021 - Drop notifys-related table and columns)\n";
15177 }
15178
15179 $DBversion = '17.12.00.004';
15180 if( CheckVersion( $DBversion ) ) {
15181     $dbh->do(q{
15182         INSERT IGNORE INTO systempreferences ( `variable`, `value`, `options`, `explanation`, `type` )
15183         VALUES
15184             ('RESTdefaultPageSize','20','','Set the default number of results returned by the REST API endpoints','Integer')
15185     });
15186
15187     SetVersion( $DBversion );
15188     print "Upgrade to $DBversion done (Bug 19278 - Add a configurable default page size for REST endpoints)\n";
15189 }
15190
15191 $DBversion = '17.12.00.005';
15192 if( CheckVersion( $DBversion ) ) {
15193     # For installations having the note already
15194     $dbh->do(q{
15195         UPDATE letter
15196         SET code    = 'CHECKOUT_NOTE',
15197             name    = 'Checkout note on item set by patron',
15198             title   = 'Checkout note',
15199             content = REPLACE(content, "<<biblio.item>>", "<<biblio.title>>")
15200         WHERE code = 'PATRON_NOTE'
15201     });
15202     # For installations coming from 17.11
15203     $dbh->do(q{
15204         INSERT IGNORE INTO `letter` (`module`, `code`, `branchcode`, `name`, `is_html`, `title`, `content`, `message_transport_type`)
15205         VALUES ('circulation', 'CHECKOUT_NOTE', '', 'Checkout note on item set by patron', '0', 'Checkout note', '<<borrowers.firstname>> <<borrowers.surname>> has added a note to the item <<biblio.title>> - <<biblio.author>> (<<biblio.biblionumber>>).','email')
15206     });
15207
15208     SetVersion( $DBversion );
15209     print "Upgrade to $DBversion done (Bug 18915 - Correct CHECKOUT_NOTE notice template)\n";
15210 }
15211
15212 $DBversion = '17.12.00.006';
15213 if( CheckVersion( $DBversion ) ) {
15214     $dbh->do(q{
15215         UPDATE systempreferences SET value=replace(value, "http://www.scholar", "https://scholar") WHERE variable='OPACSearchForTitleIn';
15216     });
15217
15218     SetVersion( $DBversion );
15219     print "Upgrade to $DBversion done (Bug 17682 - Update URL for Google Scholar in OPACSearchForTitleIn)\n";
15220 }
15221
15222 $DBversion = '17.12.00.007';
15223 if( CheckVersion( $DBversion ) ) {
15224
15225     unless ( TableExists( 'library_groups' ) ) {
15226         $dbh->do(q{
15227             CREATE TABLE library_groups (
15228                 id INT(11) NOT NULL auto_increment,    -- unique id for each group
15229                 parent_id INT(11) NULL DEFAULT NULL,   -- if this is a child group, the id of the parent group
15230                 branchcode VARCHAR(10) NULL DEFAULT NULL, -- The branchcode of a branch belonging to the parent group
15231                 title VARCHAR(100) NULL DEFAULT NULL,     -- Short description of the goup
15232                 description TEXT NULL DEFAULT NULL,    -- Longer explanation of the group, if necessary
15233                 created_on TIMESTAMP NULL,             -- Date and time of creation
15234                 updated_on TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, -- Date and time of last
15235                 PRIMARY KEY id ( id ),
15236                 FOREIGN KEY (parent_id) REFERENCES library_groups(id) ON UPDATE CASCADE ON DELETE CASCADE,
15237                 FOREIGN KEY (branchcode) REFERENCES branches(branchcode) ON UPDATE CASCADE ON DELETE CASCADE,
15238                 UNIQUE KEY title ( title )
15239             ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
15240         });
15241     }
15242
15243     SetVersion( $DBversion );
15244     print "Upgrade to $DBversion done (Bug 15707 - Add new table library_groups)\n";
15245 }
15246
15247 $DBversion = '17.12.00.008';
15248 if ( CheckVersion($DBversion) ) {
15249
15250     if ( TableExists( 'branchcategories' ) and TableExists('branchrelations' )) {
15251         $dbh->do(q{
15252             INSERT INTO library_groups ( title, description, created_on ) VALUES ( '__SEARCH_GROUPS__', 'Library search groups', NOW() )
15253         });
15254         my $search_groups_root_id = $dbh->last_insert_id(undef, undef, 'library_groups', undef);
15255
15256         my $sth = $dbh->prepare("SELECT * FROM branchcategories");
15257
15258         my $sth2 = $dbh->prepare("INSERT INTO library_groups ( parent_id, title, description, created_on ) VALUES ( ?, ?, ?, NOW() )");
15259
15260         my $sth3 = $dbh->prepare("SELECT * FROM branchrelations WHERE categorycode = ?");
15261
15262         my $sth4 = $dbh->prepare("INSERT INTO library_groups ( parent_id, branchcode, created_on ) VALUES ( ?, ?, NOW() )");
15263
15264         $sth->execute();
15265         while ( my $lc = $sth->fetchrow_hashref ) {
15266             my $description = $lc->{categorycode};
15267             $description .= " - " . $lc->{codedescription} if $lc->{codedescription};
15268
15269             $sth2->execute($search_groups_root_id, $lc->{categoryname}, $description);
15270
15271             my $subgroup_id = $dbh->last_insert_id(undef, undef, 'library_groups', undef);
15272
15273             $sth3->execute( $lc->{categorycode} );
15274
15275             while ( my $l = $sth3->fetchrow_hashref ) {
15276                 $sth4->execute( $subgroup_id, $l->{branchcode} );
15277             }
15278         }
15279
15280         $dbh->do("DROP TABLE branchrelations");
15281         $dbh->do("DROP TABLE branchcategories");
15282     }
15283
15284     print "Upgrade to $DBversion done (Bug 16735 - Migrate library search groups into the new hierarchical groups)\n";
15285     SetVersion($DBversion);
15286 }
15287
15288 $DBversion = '17.12.00.009';
15289 if ( CheckVersion($DBversion) ) {
15290     $dbh->do(q|
15291         INSERT IGNORE INTO permissions (module_bit, code, description) VALUES
15292         (4, 'edit_borrowers', 'Add, modify and view patron information'),
15293         (4, 'view_borrower_infos_from_any_libraries', 'View patron infos from any libraries');
15294     |);
15295
15296     # We are lucky here, there is nothing else to do: flags 4-borrowers did not contain sub permissions
15297
15298     SetVersion( $DBversion );
15299     print "Upgrade to $DBversion done (Bug 18403 - Add the view_borrower_infos_from_any_libraries permission )\n";
15300 }
15301
15302 $DBversion = '17.12.00.010';
15303 if( CheckVersion( $DBversion ) ) {
15304
15305     if( !column_exists( 'library_groups', 'ft_hide_patron_info' ) ) {
15306         $dbh->do( "ALTER TABLE library_groups ADD COLUMN ft_hide_patron_info tinyint(1) NOT NULL DEFAULT 0 AFTER description" );
15307     }
15308
15309     SetVersion( $DBversion );
15310     print "Upgrade to $DBversion done (Bug 20133 - Add library_groups.ft_hide_patron_info)\n";
15311 }
15312
15313 $DBversion = '17.12.00.011';
15314 if( CheckVersion( $DBversion ) ) {
15315
15316     if( !column_exists( 'library_groups', 'ft_search_groups_opac' ) ) {
15317         $dbh->do( "ALTER TABLE library_groups ADD COLUMN ft_search_groups_opac tinyint(1) NOT NULL DEFAULT 0 AFTER ft_hide_patron_info" );
15318         $dbh->do( "ALTER TABLE library_groups ADD COLUMN ft_search_groups_staff tinyint(1) NOT NULL DEFAULT 0 AFTER ft_search_groups_opac" );
15319         $dbh->do( "UPDATE library_groups SET ft_search_groups_staff = 1 AND ft_search_groups_opac = 1 WHERE title = '__SEARCH_GROUPS__'" );
15320     }
15321
15322     SetVersion( $DBversion );
15323     print "Upgrade to $DBversion done (Bug 20157 - Use group 'features' to decide which groups to use for group searching functionality)\n";
15324 }
15325
15326 $DBversion = '17.12.00.012';
15327 if( CheckVersion( $DBversion ) ) {
15328
15329     $dbh->do( q|
15330         INSERT IGNORE INTO systempreferences (variable,value,options,explanation,type)
15331         VALUES ('AutoSwitchPatron', '0', '', 'Auto switch to patron', 'YesNo');
15332     |);
15333
15334     SetVersion( $DBversion );
15335     print "Upgrade to $DBversion done (Bug 15752 - Add system preference AutoSwitchPatron)\n";
15336 }
15337
15338 $DBversion = '17.12.00.013';
15339 if( CheckVersion( $DBversion ) ) {
15340
15341     $dbh->do(q|
15342         ALTER TABLE club_enrollments MODIFY date_created timestamp NULL DEFAULT NULL;
15343     |);
15344
15345     SetVersion( $DBversion );
15346     print "Upgrade to $DBversion done (Bug 20175 - Set DEFAULT NULL value for club_enrollments.date_created)\n";
15347 }
15348
15349 $DBversion = '17.12.00.014';
15350 if( CheckVersion( $DBversion ) ) {
15351     $dbh->do( "UPDATE marc_subfield_structure SET kohafield=NULL where kohafield='additionalauthors.author'" );
15352     SetVersion( $DBversion );
15353     print "Upgrade to $DBversion done (Bug 19790 - Remove additionalauthors.author from installer files)\n";
15354 }
15355
15356 $DBversion = '17.12.00.015';
15357 if( CheckVersion( $DBversion ) ) {
15358     $dbh->do(q|
15359         ALTER TABLE borrowers
15360         MODIFY surname MEDIUMTEXT,
15361         MODIFY address MEDIUMTEXT,
15362         MODIFY city MEDIUMTEXT
15363     |);
15364     $dbh->do(q|
15365         ALTER TABLE deletedborrowers
15366         MODIFY surname MEDIUMTEXT,
15367         MODIFY address MEDIUMTEXT,
15368         MODIFY city MEDIUMTEXT
15369     |);
15370
15371     $dbh->do(q|
15372         ALTER TABLE export_format
15373         MODIFY csv_separator VARCHAR(2) NOT NULL DEFAULT ',',
15374         MODIFY field_separator VARCHAR(2),
15375         MODIFY subfield_separator VARCHAR(2)
15376     |);
15377     $dbh->do(q|
15378         ALTER TABLE export_format MODIFY encoding VARCHAR(255) NOT NULL DEFAULT 'utf8'
15379     |);
15380
15381     $dbh->do(q|
15382         ALTER TABLE reserves MODIFY lowestPriority tinyint(1) NOT NULL DEFAULT 0
15383     |);
15384     $dbh->do(q|
15385         ALTER TABLE old_reserves MODIFY lowestPriority tinyint(1) NOT NULL DEFAULT 0
15386     |);
15387
15388     SetVersion( $DBversion );
15389     print "Upgrade to $DBversion done (Bug 20144 - Adapt DB structure to work with new SQL modes)\n";
15390 }
15391
15392 $DBversion = '17.12.00.016';
15393 if( CheckVersion( $DBversion ) ) {
15394     $dbh->do(q|SET foreign_key_checks = 0|);
15395     my $sth = $dbh->table_info( '','','','TABLE' );
15396
15397     while ( my ( $cat, $schema, $name, $type, $remarks ) = $sth->fetchrow_array ) {
15398         my $table_sth = $dbh->prepare(qq|SHOW CREATE TABLE $name|);
15399         $table_sth->execute;
15400         my @table = $table_sth->fetchrow_array;
15401         unless ( $table[1] =~ /COLLATE=utf8mb4_unicode_ci/ ) {
15402             # Some users might have done the upgrade to utf8mb4 on their own
15403             # to support supplemental chars (japanese, chinese, etc)
15404             if ( $name eq 'additional_fields' ) {
15405                 $dbh->do(qq|
15406                     ALTER TABLE $name
15407                         DROP KEY `fields_uniq`,
15408                         ADD UNIQUE KEY `fields_uniq` (`tablename` (191), `name` (191))
15409                 |);
15410                 $dbh->do(qq|ALTER TABLE $name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci|);
15411             }
15412             elsif ( $name eq 'authorised_values' ) {
15413                 $dbh->do(qq|
15414                     ALTER TABLE $name
15415                         DROP KEY `lib`,
15416                         ADD KEY `lib` (`lib` (191))
15417                 |);
15418                 $dbh->do(qq|ALTER TABLE $name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci|);
15419             }
15420             elsif ( $name eq 'borrower_modifications' ) {
15421                 $dbh->do(qq|
15422                     ALTER TABLE $name
15423                         DROP PRIMARY KEY,
15424                         DROP KEY `verification_token`,
15425                         ADD PRIMARY KEY (`verification_token` (191),`borrowernumber`),
15426                         ADD KEY `verification_token` (`verification_token` (191))
15427                 |);
15428                 $dbh->do(qq|ALTER TABLE $name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci|);
15429             }
15430             elsif ( $name eq 'columns_settings' ) {
15431                 $dbh->do(qq|
15432                     ALTER TABLE $name
15433                         DROP PRIMARY KEY,
15434                         ADD PRIMARY KEY (`module` (191), `page` (191), `tablename` (191), `columnname` (191))
15435                 |);
15436                 $dbh->do(qq|ALTER TABLE $name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci|);
15437             }
15438             elsif ( $name eq 'illrequestattributes' ) {
15439                 $dbh->do(qq|
15440                     ALTER TABLE $name
15441                         DROP PRIMARY KEY,
15442                         ADD PRIMARY KEY  (`illrequest_id`, `type` (191))
15443                 |);
15444                 $dbh->do(qq|ALTER TABLE $name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci|);
15445             }
15446             elsif ( $name eq 'items_search_fields' ) {
15447                 $dbh->do(qq|
15448                     ALTER TABLE $name
15449                         DROP PRIMARY KEY,
15450                         ADD PRIMARY KEY (`name` (191))
15451                 |);
15452                 $dbh->do(qq|ALTER TABLE $name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci|);
15453             }
15454             elsif ( $name eq 'marc_subfield_structure' ) {
15455                 # In this case we convert each column explicitly
15456                 # to preserve 'tagsubield' collation (utf8mb4_bin)
15457                 $dbh->do(qq|
15458                     ALTER TABLE $name
15459                         MODIFY COLUMN tagfield
15460                             VARCHAR(3) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '',
15461                         MODIFY COLUMN tagsubfield
15462                             VARCHAR(1) COLLATE utf8mb4_bin NOT NULL DEFAULT '',
15463                         MODIFY COLUMN liblibrarian
15464                             VARCHAR(255) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '',
15465                         MODIFY COLUMN libopac
15466                             VARCHAR(255) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '',
15467                         MODIFY COLUMN kohafield
15468                             VARCHAR(40) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
15469                         MODIFY COLUMN authorised_value
15470                             VARCHAR(32) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
15471                         MODIFY COLUMN authtypecode
15472                             VARCHAR(20) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
15473                         MODIFY COLUMN value_builder
15474                             VARCHAR(80) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
15475                         MODIFY COLUMN frameworkcode
15476                             VARCHAR(4) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '',
15477                         MODIFY COLUMN seealso
15478                             VARCHAR(1100) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
15479                         MODIFY COLUMN link
15480                             VARCHAR(80) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
15481                         MODIFY COLUMN defaultvalue
15482                             MEDIUMTEXT COLLATE utf8mb4_unicode_ci default NULL
15483                 |);
15484                 $dbh->do(qq|ALTER TABLE $name CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci|);
15485             }
15486             elsif ( $name eq 'plugin_data' ) {
15487                 $dbh->do(qq|
15488                     ALTER TABLE $name
15489                         DROP PRIMARY KEY,
15490                         ADD PRIMARY KEY (`plugin_class` (191), `plugin_key` (191))
15491                 |);
15492                 $dbh->do(qq|ALTER TABLE $name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci|);
15493             }
15494             elsif ( $name eq 'search_field' ) {
15495                 $dbh->do(qq|
15496                     ALTER TABLE $name
15497                         DROP KEY `name`,
15498                         ADD UNIQUE KEY `name` (`name` (191))
15499                 |);
15500                 $dbh->do(qq|ALTER TABLE $name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci|);
15501             }
15502             elsif ( $name eq 'search_marc_map' ) {
15503                 $dbh->do(qq|
15504                     ALTER TABLE $name
15505                         DROP KEY `index_name`,
15506                         ADD UNIQUE KEY `index_name` (`index_name`, `marc_field` (191), `marc_type`)
15507                 |);
15508                 $dbh->do(qq|ALTER TABLE $name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci|);
15509             }
15510             elsif ( $name eq 'sms_providers' ) {
15511                 $dbh->do(qq|
15512                     ALTER TABLE $name
15513                         DROP KEY `name`,
15514                         ADD UNIQUE KEY `name` (`name` (191))
15515                 |);
15516                 $dbh->do(qq|ALTER TABLE $name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci|);
15517             }
15518             elsif ( $name eq 'tags' ) {
15519                 $dbh->do(qq|
15520                     ALTER TABLE $name
15521                         DROP PRIMARY KEY,
15522                         ADD PRIMARY KEY (`entry` (191))
15523                 |);
15524                 $dbh->do(qq|ALTER TABLE $name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci|);
15525             }
15526             elsif ( $name eq 'tags_approval' ) {
15527                 $dbh->do(qq|
15528                     ALTER TABLE $name
15529                         MODIFY COLUMN `term` VARCHAR(191) NOT NULL
15530                 |);
15531                 $dbh->do(qq|ALTER TABLE $name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci|);
15532             }
15533             elsif ( $name eq 'tags_index' ) {
15534                 $dbh->do(qq|
15535                     ALTER TABLE $name
15536                         MODIFY COLUMN `term` VARCHAR(191) NOT NULL
15537                 |);
15538                 $dbh->do(qq|ALTER TABLE $name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci|);
15539             }
15540             else {
15541                 $dbh->do(qq|ALTER TABLE $name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci|);
15542             }
15543         }
15544     }
15545     $dbh->do(q|SET foreign_key_checks = 1|);
15546
15547     print "Upgrade to $DBversion done (Bug 18336 - Convert DB tables to utf8mb4 🎁)\n";
15548     SetVersion($DBversion);
15549 }
15550
15551
15552 $DBversion = '17.12.00.017';
15553 if( CheckVersion( $DBversion ) ) {
15554
15555     if( !column_exists( 'items', 'damaged_on' ) ) {
15556         $dbh->do( "ALTER TABLE items ADD COLUMN damaged_on DATETIME NULL AFTER damaged");
15557     }
15558     if( !column_exists( 'deleteditems', 'damaged_on' ) ) {
15559         $dbh->do( "ALTER TABLE deleteditems ADD COLUMN damaged_on DATETIME NULL AFTER damaged");
15560     }
15561
15562     SetVersion( $DBversion );
15563     print "Upgrade to $DBversion done (Bug 17672 - Add damaged_on to items and deleteditems tables)\n";
15564 }
15565
15566 $DBversion = '17.12.00.018';
15567 if( CheckVersion( $DBversion ) ) {
15568
15569     $dbh->do( q|
15570         INSERT IGNORE INTO systempreferences (`variable`, `value`, `options`, `explanation`, `type`) VALUES  ('BrowseResultSelection','0',NULL,'Enable/Disable browsing search results fromt the bibliographic record detail page in staff client','YesNo')
15571     |);
15572
15573     SetVersion( $DBversion );
15574     print "Upgrade to $DBversion done (Bug 19290 - Add system preference BrowseResultSelection)\n";
15575 }
15576
15577 $DBversion = '17.12.00.019';
15578 if( CheckVersion( $DBversion ) ) {
15579
15580     $dbh->do(q|UPDATE auth_subfield_structure SET hidden=1 WHERE hidden<>0|);
15581
15582     SetVersion( $DBversion );
15583     print "Upgrade to $DBversion done (Bug 20074 - Auth_subfield_structure changes hidden attribute)\n";
15584 }
15585
15586 $DBversion = '17.12.00.020';
15587 if( CheckVersion( $DBversion ) ) {
15588
15589     $dbh->do(q|
15590         INSERT IGNORE INTO language_descriptions(subtag, type, lang, description)
15591         VALUES ('vi', 'language', 'de', 'Vietnamesisch')
15592     |);
15593
15594     $dbh->do(q|
15595         UPDATE language_descriptions SET description = 'Tiếng Việt'
15596         WHERE subtag = 'vi' and type = 'language' and lang = 'vi'
15597     |);
15598
15599     SetVersion( $DBversion );
15600     print "Upgrade to $DBversion done (Bug 20082 - Update descriptions of Vietnamese language)\n";
15601 }
15602
15603 $DBversion = '17.12.00.021';
15604 if( CheckVersion( $DBversion ) ) {
15605
15606     $dbh->do(q|
15607         INSERT IGNORE INTO systempreferences ( `variable`, `value`, `options`, `explanation`, `type` ) VALUES
15608         ('PurgeSuggestionsOlderThan', '', NULL, 'Default value for cronjob purge_suggestions.pl', 'Integer');
15609     |);
15610
15611     SetVersion( $DBversion );
15612     print "Upgrade to $DBversion done (Bug 13287 - Add system preference PurgeSuggestionsOlderThan)\n";
15613 }
15614
15615 $DBversion = '17.12.00.022';
15616 if( CheckVersion( $DBversion ) ) {
15617
15618     if( !column_exists( 'currency', 'p_sep_by_space' ) ) {
15619         $dbh->do(q|
15620             ALTER TABLE currency ADD COLUMN p_sep_by_space tinyint(1) default 0 after archived
15621         |);
15622     }
15623
15624     SetVersion( $DBversion );
15625     print "Upgrade to $DBversion done (Bug 4078 - Add column currency.p_sep_by_space)\n";
15626 }
15627
15628 $DBversion = '17.12.00.023';
15629 if( CheckVersion( $DBversion ) ) {
15630     $dbh->do(q{
15631         DELETE FROM systempreferences
15632         WHERE variable='checkdigit'
15633     });
15634
15635     SetVersion( $DBversion );
15636     print "Upgrade to $DBversion done (Bug 20264 - Remove system preference 'checkdigit')\n";
15637 }
15638
15639 $DBversion = '17.12.00.024';
15640 if( CheckVersion( $DBversion ) ) {
15641
15642     $dbh->do(q{
15643         INSERT IGNORE INTO systempreferences (variable,value,options,explanation,type)
15644         VALUES ('SelfCheckInMainUserBlock', '', '70|10', 'Add a block of HTML that will display on the self check-in screen.', 'Textarea');
15645     });
15646
15647     $dbh->do(q{
15648         INSERT IGNORE INTO systempreferences (variable,value,options,explanation,type)
15649         VALUES ('SelfCheckInModule', 0, NULL, 'Enable the standalone self-checkin module.', 'YesNo');
15650     });
15651
15652     $dbh->do(q{
15653         INSERT IGNORE INTO systempreferences (variable,value,options,explanation,type)
15654         VALUES ('SelfCheckInModuleUserID', NULL, NULL, 'Patron ID (borrowernumber) to be allowed on the self-checkin module.', 'Integer');
15655     });
15656
15657     $dbh->do(q{
15658         INSERT IGNORE INTO systempreferences (variable,value,options,explanation,type)
15659         VALUES ('SelfCheckInTimeout', 120, NULL, 'Define the number of seconds before the self check-in module times out.', 'Integer');
15660     });
15661
15662     $dbh->do(q{
15663         INSERT IGNORE INTO systempreferences (variable,value,options,explanation,type)
15664         VALUES ('SelfCheckInUserCSS', '', NULL, 'Add CSS to be included in the self check-in module in an embedded <style> tag.', 'free');
15665     });
15666
15667     $dbh->do(q{
15668         INSERT IGNORE INTO systempreferences (variable,value,options,explanation,type)
15669         VALUES ('SelfCheckInUserJS', '', NULL, 'Define custom javascript for inclusion in the self check-in module.', 'free');
15670     });
15671
15672     # Add new userflag for self check
15673     $dbh->do(q{
15674         INSERT IGNORE INTO userflags (bit,flag,flagdesc,defaulton) VALUES
15675             (23,'self_check','Self check modules',0);
15676     });
15677
15678     # Add self check-in module subpermission
15679     $dbh->do(q{
15680         INSERT IGNORE INTO permissions (module_bit,code,description)
15681         VALUES (23, 'self_checkin_module', 'Log into the self check-in module');
15682     });
15683
15684     # Add self check-in module subpermission
15685     $dbh->do(q{
15686         INSERT IGNORE INTO permissions (module_bit,code,description)
15687         VALUES (23, 'self_checkout_module', 'Perform self checkout at the OPAC. It should be used for the patron matching the AutoSelfCheckID');
15688     });
15689
15690     # Update patrons with self_checkout permission
15691     # IMPORTANT: Needs to happen before removing the old subpermission
15692     $dbh->do(q{
15693         UPDATE user_permissions
15694         SET module_bit = 23,
15695                   code = 'self_checkout_module'
15696         WHERE module_bit = 1 AND code = 'self_checkout';
15697     });
15698
15699     # Remove old self_checkout permission
15700     $dbh->do(q{
15701         DELETE IGNORE FROM permissions
15702         WHERE  code='self_checkout';
15703     });
15704
15705     SetVersion( $DBversion );
15706     print "Upgrade to $DBversion done (Bug 15492 - Add a standalone self-checkin module)\n";
15707 }
15708
15709 $DBversion = '17.12.00.025';
15710 if( CheckVersion( $DBversion ) ) {
15711     $dbh->do(q|
15712         INSERT IGNORE INTO systempreferences (variable,value,explanation,options,type)
15713         VALUES ('StaffLoginInstructions','','HTML to go into the login box for the staff client',NULL,'Free')
15714     |);
15715     $dbh->do(q|
15716         UPDATE systempreferences
15717         SET variable = 'OpacLoginInstructions'
15718         WHERE variable = 'NoLoginInstructions'
15719     |);
15720
15721     SetVersion( $DBversion );
15722     print "Upgrade to $DBversion done (Bug 20291 - Add StaffLoginInstructions system preference and rename NoLoginInstructions with OpacLoginInstructions)\n";
15723 }
15724
15725 $DBversion = '17.12.00.026';
15726 if( CheckVersion( $DBversion ) ) {
15727     if( !column_exists( 'issuingrules', 'suspension_chargeperiod' ) ) {
15728         $dbh->do(q|
15729             ALTER TABLE issuingrules ADD COLUMN suspension_chargeperiod int(11) DEFAULT '1' AFTER maxsuspensiondays;
15730         |);
15731     }
15732
15733     SetVersion( $DBversion );
15734     print "Upgrade to $DBversion done (Bug 19804 - Add issuingrules.suspension_chargeperiod)\n";
15735 }
15736
15737 $DBversion = '17.12.00.027';
15738 if( CheckVersion( $DBversion ) ) {
15739     $dbh->do(q|
15740         INSERT IGNORE INTO systempreferences (`variable`, `value`, `options`, `explanation`, `type`)
15741         VALUES ('UseACQFrameworkForBiblioRecords','0','','Use the ACQ framework for the catalog details','YesNo')
15742     |);
15743
15744     SetVersion( $DBversion );
15745     print "Upgrade to $DBversion done (Bug 19289 - Add system preference UseACQFrameworkForBiblioRecords)\n";
15746 }
15747
15748 $DBversion = '17.12.00.028';
15749 if( CheckVersion( $DBversion ) ) {
15750     if( !column_exists( 'marc_tag_structure', 'ind1_defaultvalue' ) ) {
15751         $dbh->do(q|
15752             ALTER TABLE marc_tag_structure
15753             ADD COLUMN ind2_defaultvalue VARCHAR(1) NOT NULL DEFAULT '' AFTER authorised_value,
15754             ADD COLUMN ind1_defaultvalue VARCHAR(1) NOT NULL DEFAULT '' AFTER authorised_value;
15755         |);
15756     }
15757
15758     SetVersion( $DBversion );
15759     print "Upgrade to $DBversion done (Bug 9701 - Add default indicators (marc_tag_structure.indX_defaultvalue))\n";
15760 }
15761
15762 $DBversion = '17.12.00.029';
15763 if( CheckVersion( $DBversion ) ) {
15764     my $pref =
15765 q|# PERSO_NAME  100 600 696 700 796 800 896
15766 marc21, 100, ind1:auth1
15767 marc21, 600, ind1:auth1, ind2:thesaurus
15768 marc21, 696, ind1:auth1
15769 marc21, 700, ind1:auth1
15770 marc21, 796, ind1:auth1
15771 marc21, 800, ind1:auth1
15772 marc21, 896, ind1:auth1
15773 # CORPO_NAME  110 610 697 710 797 810 897
15774 marc21, 110, ind1:auth1
15775 marc21, 610, ind1:auth1, ind2:thesaurus
15776 marc21, 697, ind1:auth1
15777 marc21, 710, ind1:auth1
15778 marc21, 797, ind1:auth1
15779 marc21, 810, ind1:auth1
15780 marc21, 897, ind1:auth1
15781 # MEETI_NAME    111 611 698 711 798 811 898
15782 marc21, 111, ind1:auth1
15783 marc21, 611, ind1:auth1, ind2:thesaurus
15784 marc21, 698, ind1:auth1
15785 marc21, 711, ind1:auth1
15786 marc21, 798, ind1:auth1
15787 marc21, 811, ind1:auth1
15788 marc21, 898, ind1:auth1
15789 # UNIF_TITLE        130 440 630 699 730 799 830 899 / 240
15790 marc21, 130, ind1:auth2
15791 marc21, 240, , ind2:auth2
15792 marc21, 440, , ind2:auth2
15793 marc21, 630, ind1:auth2, ind2:thesaurus
15794 marc21, 699, ind1:auth2
15795 marc21, 730, ind1:auth2
15796 marc21, 799, ind1:auth2
15797 marc21, 830, , ind2:auth2
15798 marc21, 899, ind1:auth2
15799 # CHRON_TERM    648
15800 marc21, 648, , ind2:thesaurus
15801 # TOPIC_TERM      650 654 656 657 658 690
15802 marc21, 650, , ind2:thesaurus
15803 # GEOGR_NAME   651 662 691 / 751
15804 marc21, 651, , ind2:thesaurus
15805 # GENRE/FORM    655
15806 marc21, 655, , ind2:thesaurus
15807
15808 # UNIMARC: Always copy the indicators from the authority
15809 unimarc, *, ind1:auth1, ind2:auth2|;
15810
15811     $dbh->do( q|
15812         INSERT IGNORE INTO systempreferences (variable,value,explanation,options,type)
15813         VALUES ( 'AuthorityControlledIndicators', ?, 'Authority controlled indicators per biblio field', NULL, 'Free' );
15814     |, undef, $pref );
15815
15816     SetVersion( $DBversion );
15817     print "Upgrade to $DBversion done (Bug 14769 - Authorities merge: Set correct indicators in biblio field (new system preference AuthorityControlledIndicators))\n";
15818 }
15819
15820 $DBversion = '17.12.00.030';
15821 if( CheckVersion( $DBversion ) ) {
15822     $dbh->do(q|
15823         INSERT IGNORE INTO systempreferences (variable,value,explanation,options,type)
15824         VALUES ('NovelistSelectStaffProfile',NULL,'Novelist staff client user Profile',NULL,'free')
15825     |);
15826
15827     SetVersion( $DBversion );
15828     print "Upgrade to $DBversion done (Bug 19882 - Add system preference NovelistSelectStaffProfile)\n";
15829 }
15830
15831 $DBversion = '17.12.00.031';
15832 if( CheckVersion( $DBversion ) ) {
15833     $dbh->do(q|
15834         INSERT IGNORE INTO systempreferences (`variable`, `value`, `options`, `explanation`, `type`)
15835         VALUES ('MarcFieldDocURL', NULL, NULL, 'URL used for MARC field documentation. Following substitutions are available: {MARC} = marc flavour, eg. \"MARC21\" or \"UNIMARC\". {FIELD} = field number, eg. \"000\" or \"048\". {LANG} = user language, eg. \"en\" or \"fi-FI\"', 'free')
15836     |);
15837
15838     SetVersion( $DBversion );
15839     print "Upgrade to $DBversion done (Bug 11674 - Add system preference MarcFieldDocURL)\n";
15840 }
15841
15842 $DBversion = '17.12.00.032';
15843 if( CheckVersion( $DBversion ) ) {
15844     $dbh->do(q|
15845         UPDATE letter SET code = "SERIAL_ALERT" WHERE code = "RLIST";
15846     |);
15847     $dbh->do(q|
15848         UPDATE letter SET name = "New serial issue" WHERE name = "Routing List";
15849     |);
15850     $dbh->do(q|
15851         UPDATE subscription SET letter = "SERIAL_ALERT" WHERE letter = "RLIST";
15852     |);
15853
15854     SetVersion( $DBversion );
15855     print "Upgrade to $DBversion done (Bug 19794 - Rename RLIST notice to SERIAL_ALERT)\n";
15856 }
15857
15858 $DBversion = '17.12.00.033';
15859 if( CheckVersion( $DBversion ) ) {
15860     if ( !column_exists( 'accountlines', 'payment_type' ) ) {
15861         $dbh->do(q{
15862             ALTER TABLE accountlines ADD payment_type varchar(80) default NULL AFTER accounttype
15863         });
15864     }
15865
15866     $dbh->do(q{
15867         INSERT IGNORE INTO authorised_value_categories( category_name ) VALUES ('PAYMENT_TYPE')
15868     });
15869
15870     SetVersion( $DBversion );
15871     print "Upgrade to $DBversion done (Bug 18786 - Add ability to create custom payment types)\n";
15872 }
15873
15874 $DBversion = '17.12.00.034';
15875 if( CheckVersion( $DBversion ) ) {
15876
15877     $dbh->do( q{
15878         INSERT IGNORE INTO account_offset_types ( type ) VALUES ('Void Payment')
15879     } );
15880
15881     SetVersion( $DBversion );
15882     print "Upgrade to $DBversion done (Bug 18790 - Add ability to void payment)\n";
15883 }
15884
15885 $DBversion = '17.12.00.035';
15886 if( CheckVersion( $DBversion ) ) {
15887     my ( $original_value ) = $dbh->selectrow_array(q|
15888         SELECT value FROM systempreferences WHERE variable="MarkLostItemsAsReturned"
15889     |);
15890     if ( $original_value and $original_value eq '1' ) {
15891         $dbh->do(q{
15892             UPDATE systempreferences
15893             SET type="multiple",
15894                 options="batchmod|moredetail|cronjob|additem",
15895                 value="batchmod,moredetail,cronjob,additem"
15896             WHERE variable="MarkLostItemsAsReturned"
15897         });
15898     } else {
15899         $dbh->do(q{
15900             UPDATE systempreferences
15901             SET type="multiple",
15902                 options="batchmod|moredetail|cronjob|additem",
15903                 value=""
15904             WHERE variable="MarkLostItemsAsReturned"
15905         });
15906     }
15907
15908     SetVersion( $DBversion );
15909     print "Upgrade to $DBversion done (Bug 19974 - Make MarkLostItemsAsReturned multiple)\n";
15910 }
15911
15912 $DBversion = '17.12.00.036';
15913 if( CheckVersion( $DBversion ) ) {
15914
15915     $dbh->do( q{
15916         INSERT IGNORE INTO systempreferences ( `variable`, `value`, `options`, `explanation`, `type` ) VALUES ('CanMarkHoldsToPullAsLost','do_not_allow','do_not_allow|allow|allow_and_notify','Add a button to the "Holds to pull" screen to mark an item as lost and notify the patron.','Choice');
15917     } );
15918     $dbh->do( q{
15919         INSERT IGNORE INTO letter(module, code, branchcode, name, is_html, title, content, message_transport_type, lang) VALUES ('reserves', 'CANCEL_HOLD_ON_LOST', '', 'Hold has been cancelled', 0, "Hold has been cancelled", "Dear [% borrower.firstname %] [% borrower.surname %],\n\nWe regret to inform you, that the following item can not be provided due to it being missing. Your hold was cancelled.\n\nTitle: [% biblio.title %]\nAuthor: [% biblio.author %]\nCopy: [% item.copynumber %]\nLocation: [% branch.branchname %]", 'email', 'default');
15920     } );
15921     $dbh->do( q{
15922         INSERT IGNORE INTO systempreferences ( `variable`, `value`, `options`, `explanation`, `type` ) VALUES ('UpdateItemWhenLostFromHoldList','',NULL,'This is a list of values to update an item when it is marked as lost from the holds to pull screen','Free');
15923     } );
15924     $dbh->do( q{
15925         UPDATE systempreferences SET options="batchmod|moredetail|cronjob|additem|pendingreserves" WHERE variable="MarkLostItemsAsReturned";
15926     } );
15927
15928     SetVersion( $DBversion );
15929     print "Upgrade to $DBversion done (Bug 19287 - Add ability to mark an item 'Lost' from 'Holds to pull' list (CanMarkHoldsToPullAsLost, UpdateItemWhenLostFromHoldList and CANCEL_HOLD_ON_LOST))\n";
15930 }
15931
15932 $DBversion = '17.12.00.037';
15933 if( CheckVersion( $DBversion ) ) {
15934
15935     SetVersion( $DBversion );
15936     print "Upgrade to $DBversion done (This change has been reverted, nothing done!)\n";
15937 }
15938
15939 $DBversion = '17.12.00.038';
15940 if( CheckVersion( $DBversion ) ) {
15941
15942     $dbh->do( q{
15943         UPDATE language_rfc4646_to_iso639 SET iso639_2_code = 'slo' WHERE iso639_2_code = 'slk' AND rfc4646_subtag = 'sk';
15944     } );
15945
15946     SetVersion( $DBversion );
15947     print "Upgrade to $DBversion done (Bug 20245 - Use Bibliographic code value for Slovak language)\n";
15948 }
15949
15950 $DBversion = '17.12.00.039';
15951 if( CheckVersion( $DBversion ) ) {
15952
15953     $dbh->do( q{
15954         UPDATE language_rfc4646_to_iso639 SET iso639_2_code = 'baq' WHERE iso639_2_code = 'eus' AND rfc4646_subtag = 'eu';
15955     } );
15956     $dbh->do( q{
15957         UPDATE language_rfc4646_to_iso639 SET iso639_2_code = 'mao' WHERE iso639_2_code = 'mri' AND rfc4646_subtag = 'mi';
15958     } );
15959     $dbh->do( q{
15960         UPDATE language_rfc4646_to_iso639 SET iso639_2_code = 'alb' WHERE iso639_2_code = 'sqi' AND rfc4646_subtag = 'sq';
15961     } );
15962
15963     SetVersion( $DBversion );
15964     print "Upgrade to $DBversion done (Bug 20482 - Use Bibliographic code value for Basque, Maori and Albanian languages)\n";
15965 }
15966
15967 $DBversion = '17.12.00.040';
15968 if( CheckVersion( $DBversion ) ) {
15969
15970     $dbh->do( q{
15971         INSERT IGNORE INTO systempreferences ( value, variable, options, explanation, type )
15972         VALUES ( '0', 'ProtectSuperlibrarianPrivileges', NULL, 'If enabled, non-superlibrarians cannot set superlibrarian privileges', 'YesNo' )
15973     } );
15974
15975     SetVersion( $DBversion );
15976     print "Upgrade to $DBversion done (Bug 20100 - Add new system preference ProtectSuperlibrarianPrivileges)\n";
15977 }
15978
15979 $DBversion = '17.12.00.041';
15980 if( CheckVersion( $DBversion ) ) {
15981
15982     $dbh->do( q{
15983         INSERT IGNORE INTO permissions (module_bit, code, description) VALUES (13, 'access_files', 'Access to the files stored on the server');
15984     } );
15985
15986     SetVersion( $DBversion );
15987     print "Upgrade to $DBversion done (Bug 11317 - Add a new permission to access files stored on the server)\n";
15988 }
15989
15990 $DBversion = '17.12.00.042';
15991 if( CheckVersion( $DBversion ) ) {
15992
15993     if (!TableExists('oauth_access_tokens')) {
15994         $dbh->do(q{
15995             CREATE TABLE oauth_access_tokens (
15996                 `access_token` VARCHAR(191) NOT NULL,
15997                 `client_id`    VARCHAR(191) NOT NULL,
15998                 `expires`      INT NOT NULL,
15999                 PRIMARY KEY (`access_token`)
16000             ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
16001         });
16002     }
16003
16004     SetVersion( $DBversion );
16005     print "Upgrade to $DBversion done (Bug 20402 - Implement OAuth2 authentication for REST API)\n";
16006 }
16007
16008 $DBversion = '17.12.00.043';
16009 if(CheckVersion($DBversion)) {
16010
16011     if (!TableExists('api_keys')) {
16012         $dbh->do(q{
16013             CREATE TABLE `api_keys` (
16014                 `client_id`   VARCHAR(191) NOT NULL,
16015                 `secret`      VARCHAR(191) NOT NULL,
16016                 `description` VARCHAR(255) NOT NULL,
16017                 `patron_id`   INT(11) NOT NULL,
16018                 `active`      TINYINT(1) DEFAULT 1 NOT NULL,
16019                 PRIMARY KEY `client_id` (`client_id`),
16020                 UNIQUE KEY `secret` (`secret`),
16021                 KEY `patron_id` (`patron_id`),
16022                 CONSTRAINT `api_keys_fk_patron_id`
16023                   FOREIGN KEY (`patron_id`)
16024                   REFERENCES `borrowers` (`borrowernumber`)
16025                   ON DELETE CASCADE ON UPDATE CASCADE
16026             ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
16027         });
16028     }
16029
16030     print "Upgrade to $DBversion done (Bug 20568 - Add API key management interface for patrons)\n";
16031     SetVersion($DBversion);
16032 }
16033
16034 $DBversion = '17.12.00.044';
16035 if(CheckVersion($DBversion)) {
16036
16037     $dbh->do(q{
16038         INSERT IGNORE INTO systempreferences (`variable`,`value`,`options`,`explanation`,`type`)
16039         VALUES
16040             ('RESTOAuth2ClientCredentials','0',NULL,'If enabled, the OAuth2 client credentials flow is enabled for the REST API.','YesNo');
16041     });
16042
16043     print "Upgrade to $DBversion done (Bug 20624 - Disable OAuth2 client credentials grant by default)\n";
16044     SetVersion($DBversion);
16045 }
16046
16047 $DBversion = '18.05.00.000';
16048 if( CheckVersion( $DBversion ) ) {
16049     SetVersion( $DBversion );
16050     print "Upgrade to $DBversion done (Koha 18.05)\n";
16051 }
16052
16053 $DBversion = '18.06.00.000';
16054 if( CheckVersion( $DBversion ) ) {
16055     SetVersion( $DBversion );
16056     print "Upgrade to $DBversion done (Koha 18.06 - It's Adventure time!)\n";
16057 }
16058
16059 $DBversion = '18.06.00.001';
16060 if( CheckVersion( $DBversion ) ) {
16061     $dbh->do(q{UPDATE permissions SET description = 'Manage budgets' WHERE code = 'period_manage';});
16062     $dbh->do(q{UPDATE permissions SET description = 'Manage funds' WHERE code = 'budget_manage';});
16063     $dbh->do(q{UPDATE permissions SET description = 'Modify funds (can''t create lines, but can modify existing ones)' WHERE code = 'budget_modify';});
16064     $dbh->do(q{UPDATE permissions SET description = 'Manage baskets and order lines' WHERE code = 'order_manage';});
16065     $dbh->do(q{UPDATE permissions SET description = 'Manage all baskets and order lines, regardless of restrictions on them' WHERE code = 'order_manage_all';});
16066     $dbh->do(q{UPDATE permissions SET description = 'Manage basket groups' WHERE code = 'group_manage';});
16067     $dbh->do(q{UPDATE permissions SET description = 'Receive orders and manage shipments' WHERE code = 'order_receive';});
16068     $dbh->do(q{UPDATE permissions SET description = 'Add and delete funds (but can''t modify funds)' WHERE code = 'budget_add_del';});
16069     $dbh->do(q{UPDATE permissions SET description = 'Manage all funds' WHERE code = 'budget_manage_all';});
16070     SetVersion( $DBversion );
16071     print "Upgrade to $DBversion done (Bug 3849- Improve descriptions of granular acquisition permissions)\n";
16072 }
16073
16074 $DBversion = '18.06.00.002';
16075 if( CheckVersion( $DBversion ) ) {
16076     $dbh->do(q{DELETE FROM userflags WHERE bit = 12 AND flag = 'management';});
16077     $dbh->do(q{UPDATE borrowers SET flags = flags - ( flags & (1<<12) ) WHERE flags & (1 << 12);});
16078     SetVersion( $DBversion );
16079     print "Upgrade to $DBversion done (Bug 2426 - Remove deprecated management permission)\n";
16080 }
16081
16082 $DBversion = '18.06.00.003';
16083 if( CheckVersion( $DBversion ) ) {
16084     $dbh->do( "ALTER TABLE search_field CHANGE COLUMN type type ENUM('', 'string', 'date', 'number', 'boolean', 'sum', 'isbn', 'stdno') NOT NULL COMMENT 'what type of data this holds, relevant when storing it in the search engine'" );
16085     SetVersion( $DBversion );
16086     print "Upgrade to $DBversion done (Bug 20073 - Add new types for Elasticsearch fields)\n";
16087 }
16088
16089 $DBversion = '18.06.00.004';
16090 if( CheckVersion( $DBversion ) ) {
16091
16092     # Add 'Manual Credit' offset type
16093     $dbh->do(q{
16094         INSERT IGNORE INTO `account_offset_types` (`type`) VALUES ('Manual Credit');
16095     });
16096
16097     # Fix wrong account offsets / Manual credits
16098     $dbh->do(q{
16099         UPDATE account_offsets
16100         SET credit_id=debit_id,
16101             debit_id=NULL,
16102             type='Manual Credit'
16103         WHERE amount < 0 AND
16104               type='Manual Debit' AND
16105               debit_id IN
16106                 (SELECT accountlines_id AS debit_id
16107                  FROM accountlines
16108                  WHERE accounttype='C');
16109     });
16110
16111     # Fix wrong account offsets / Manually forgiven amounts
16112     $dbh->do(q{
16113         UPDATE account_offsets
16114         SET credit_id=debit_id,
16115             debit_id=NULL,
16116             type='Writeoff'
16117         WHERE amount < 0 AND
16118               type='Manual Debit' AND
16119               debit_id IN
16120                 (SELECT accountlines_id AS debit_id
16121                  FROM accountlines
16122                  WHERE accounttype='FOR');
16123     });
16124
16125     SetVersion( $DBversion );
16126     print "Upgrade to $DBversion done (Bug 20980 - Manual credit offsets are stored as debits)\n";
16127 }
16128
16129 $DBversion = '18.06.00.005';
16130 if( CheckVersion( $DBversion ) ) {
16131     unless ( column_exists('aqorders', 'created_by') ) {
16132         $dbh->do( "ALTER TABLE aqorders ADD COLUMN created_by int(11) NULL DEFAULT NULL AFTER quantityreceived;" );
16133         unless ( foreign_key_exists('aqorders', 'aqorders_created_by') ) {
16134             $dbh->do( "ALTER TABLE aqorders ADD CONSTRAINT aqorders_created_by FOREIGN KEY (created_by) REFERENCES borrowers (borrowernumber) ON DELETE SET NULL ON UPDATE CASCADE;" );
16135         }
16136         $dbh->do( "UPDATE aqbasket LEFT JOIN borrowers ON ( aqbasket.authorisedby = borrowers.borrowernumber ) SET aqbasket.authorisedby = NULL WHERE borrowers.borrowernumber IS NULL;" );
16137         $dbh->do( "UPDATE aqorders LEFT JOIN aqbasket ON ( aqorders.basketno = aqbasket.basketno ) SET aqorders.created_by = aqbasket.authorisedby WHERE aqorders.created_by IS NULL;" );
16138     }
16139     SetVersion( $DBversion );
16140     print "Upgrade to $DBversion done (Bug 12395 - Save order line's creator)\n";
16141 }
16142
16143 $DBversion = '18.06.00.006';
16144 if( CheckVersion( $DBversion ) ) {
16145     unless ( column_exists('patron_lists', 'shared') ) {
16146         $dbh->do( "ALTER TABLE patron_lists ADD COLUMN shared tinyint(1) default 0 AFTER owner;" );
16147     }
16148     SetVersion( $DBversion );
16149     print "Upgrade to $DBversion done (Bug 19524 - Share patron lists between staff)\n";
16150 }
16151
16152 $DBversion = '18.06.00.007';
16153 if( CheckVersion( $DBversion ) ) {
16154     $dbh->do( "INSERT IGNORE INTO permissions (module_bit, code, description) VALUES (11, 'currencies_manage', 'Manage currencies and exchange rates');" );
16155     $dbh->do(q{
16156         INSERT IGNORE INTO user_permissions (borrowernumber, module_bit, code)
16157             SELECT borrowernumber, 11, 'currencies_manage' FROM borrowers WHERE flags & (1 << 3) OR borrowernumber IN
16158             (SELECT borrowernumber FROM user_permissions WHERE code = 'parameters_remaining_permissions');
16159     });
16160     SetVersion( $DBversion );
16161     print "Upgrade to $DBversion done (Bug 7651 - Add separate permission for managing currencies and exchange rates)\n";
16162 }
16163
16164 $DBversion = '18.06.00.008';
16165 if( CheckVersion( $DBversion ) ) {
16166     $dbh->do( "ALTER TABLE marc_modification_template_actions CHANGE action action ENUM('delete_field','add_field','update_field','move_field','copy_field','copy_and_replace_field')" );
16167     SetVersion( $DBversion );
16168     print "Upgrade to $DBversion done (Bug 13560 - need an add option in marc modification templates)\n";
16169 }
16170
16171 $DBversion = '18.06.00.009';
16172 if( CheckVersion( $DBversion ) ) {
16173     $dbh->do( "
16174         CREATE TABLE IF NOT EXISTS aqinvoice_adjustments (
16175             adjustment_id int(11) NOT NULL AUTO_INCREMENT,
16176             invoiceid int(11) NOT NULL,
16177             adjustment decimal(28,6),
16178             reason varchar(80) default NULL,
16179             note mediumtext default NULL,
16180             budget_id int(11) default NULL,
16181             encumber_open smallint(1) NOT NULL default 1,
16182             timestamp timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
16183             PRIMARY KEY (adjustment_id),
16184             CONSTRAINT aqinvoice_adjustments_fk_invoiceid FOREIGN KEY (invoiceid) REFERENCES aqinvoices (invoiceid) ON DELETE CASCADE ON UPDATE CASCADE,
16185             CONSTRAINT aqinvoice_adjustments_fk_budget_id FOREIGN KEY (budget_id) REFERENCES aqbudgets (budget_id) ON DELETE SET NULL ON UPDATE CASCADE
16186         ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
16187         " );
16188     $dbh->do("INSERT IGNORE INTO authorised_value_categories (category_name) VALUES ('ADJ_REASON')");
16189     SetVersion( $DBversion );
16190     print "Upgrade to $DBversion done (Bug 19166 - Add the ability to add adjustments to an invoice)\n";
16191 }
16192
16193 $DBversion = '18.06.00.010';
16194 if( CheckVersion( $DBversion ) ) {
16195     $dbh->do(q{
16196         INSERT IGNORE INTO `letter` (`module`, `code`, `branchcode`, `name`, `is_html`, `title`, `content`, `message_transport_type`, `lang`)
16197         VALUES
16198             ('circulation', 'ACCOUNT_PAYMENT', '', 'Account payment', 0, 'Account payment', '[%- USE Price -%]\r\nA payment of [% credit.amount * -1 | $Price %] has been applied to your account.\r\n\r\nThis payment affected the following fees:\r\n[%- FOREACH o IN offsets %]\r\nDescription: [% o.debit.description %]\r\nAmount paid: [% o.amount * -1 | $Price %]\r\nAmount remaining: [% o.debit.amountoutstanding | $Price %]\r\n[% END %]', 'email', 'default'),
16199                 ('circulation', 'ACCOUNT_WRITEOFF', '', 'Account writeoff', 0, 'Account writeoff', '[%- USE Price -%]\r\nAn account writeoff of [% credit.amount * -1 | $Price %] has been applied to your account.\r\n\r\nThis writeoff affected the following fees:\r\n[%- FOREACH o IN offsets %]\r\nDescription: [% o.debit.description %]\r\nAmount paid: [% o.amount * -1 | $Price %]\r\nAmount remaining: [% o.debit.amountoutstanding | $Price %]\r\n[% END %]', 'email', 'default');
16200     });
16201     $dbh->do(q{
16202         INSERT IGNORE INTO systempreferences (`variable`, `value`, `options`, `explanation`, `type`)
16203         VALUES ('UseEmailReceipts','0','','Send email receipts for payments and write-offs','YesNo')
16204     });
16205     SetVersion( $DBversion );
16206     print "Upgrade to $DBversion done (Bug 19191 - Add ability to email receipts for account payments and write-offs)\n";
16207 }
16208
16209 $DBversion = '18.06.00.011';
16210 if( CheckVersion( $DBversion ) ) {
16211     unless( column_exists( 'issues', 'noteseen' ) ) {
16212         $dbh->do(q|ALTER TABLE issues ADD COLUMN noteseen int(1) default NULL AFTER notedate|);
16213     }
16214
16215     unless( column_exists( 'old_issues', 'noteseen' ) ) {
16216         $dbh->do(q|ALTER TABLE old_issues ADD COLUMN noteseen int(1) default NULL AFTER notedate|);
16217     }
16218     $dbh->do(q|INSERT IGNORE INTO permissions (module_bit, code, description) VALUES ( 1, 'manage_checkout_notes', 'Mark checkout notes as seen/not seen');|);
16219     SetVersion( $DBversion );
16220     print "Upgrade to $DBversion done (Bug 17698: Add column issues.noteseen and old_issues.noteseen)\n";
16221 }
16222
16223 $DBversion = '18.06.00.012';
16224 if( CheckVersion( $DBversion ) ) {
16225     $dbh->do(q|INSERT IGNORE INTO permissions (module_bit, code, description) VALUES (11, 'suggestions_manage', 'Manage purchase suggestions');|);
16226     $dbh->do(q|INSERT IGNORE INTO user_permissions (borrowernumber, module_bit, code) SELECT borrowernumber, 11, 'suggestions_manage' FROM borrowers WHERE flags & (1 << 2);|);
16227     SetVersion( $DBversion );
16228     print "Upgrade to $DBversion done (Bug 11911 - Add separate permission for managing suggestions)\n";
16229 }
16230
16231 $DBversion = '18.06.00.013';
16232 if( CheckVersion( $DBversion ) ) {
16233     $dbh->do(q{
16234         INSERT IGNORE INTO `account_offset_types` (`type`) VALUES ('Credit Applied');
16235     });
16236     SetVersion( $DBversion );
16237     print "Upgrade to $DBversion done (Bug 20997 - Add Koha::Account::Line::apply)\n";
16238 }
16239
16240 $DBversion = '18.06.00.014';
16241 if( CheckVersion( $DBversion ) ) {
16242     $dbh->do(q{
16243             INSERT IGNORE INTO  systempreferences (variable, value, options, explanation) VALUES ('HidePersonalPatronDetailOnCirculation', 0, 'YesNo', 'Hide patrons phone number, email address, street address and city in the circulation page');
16244     });
16245     SetVersion( $DBversion );
16246     print "Upgrade to $DBversion done (Bug 21121 - New syspref to allow hiding of private patron data in circulation page)\n";
16247 }
16248
16249 $DBversion = '18.06.00.015';
16250 if( CheckVersion( $DBversion ) ) {
16251     $dbh->do(q{DELETE FROM systempreferences where variable="OCLCAffiliateID";});
16252     $dbh->do(q{DELETE FROM systempreferences where variable="XISBN";});
16253     $dbh->do(q{DELETE FROM systempreferences where variable="XISBNDailyLimit";});
16254     SetVersion( $DBversion );
16255     print "Upgrade to $DBversion done (Bug 21226 - Remove prefs OCLCAffiliateID, XISBN and XISBNDailyLimit)\n";
16256 }
16257
16258 $DBversion = '18.06.00.016';
16259 if( CheckVersion( $DBversion ) ) {
16260     my $dtf  = Koha::Database->new->schema->storage->datetime_parser;
16261     my $days = C4::Context->preference('MaxPickupDelay') || 7;
16262     my $date = dt_from_string()->add( days => $days );
16263     my $sql  = q|UPDATE reserves SET expirationdate = ? WHERE expirationdate IS NULL AND waitingdate IS NOT NULL|;
16264     $dbh->do( $sql, undef, $dtf->format_datetime($date) );
16265     SetVersion( $DBversion );
16266     print "Upgrade to $DBversion done (Bug 20773 - expirationdate filled for waiting holds)\n";
16267 }
16268
16269 $DBversion = '18.06.00.017';
16270 if( CheckVersion( $DBversion ) ) {
16271     $dbh->do(q|INSERT IGNORE INTO authorised_value_categories (category_name) VALUES ('ROADTYPE');|);
16272     SetVersion( $DBversion );
16273     print "Upgrade to $DBversion done (Bug 21144: Add ROADTYPE to default authorised values categories)\n";
16274 }
16275
16276 $DBversion = '18.06.00.018';
16277 if( CheckVersion( $DBversion ) ) {
16278     $dbh->do( q|
16279 UPDATE items LEFT JOIN issues USING (itemnumber)
16280 SET items.onloan = NULL
16281 WHERE issues.itemnumber IS NULL
16282     |);
16283     SetVersion( $DBversion );
16284     print "Upgrade to $DBversion done (Bug 20487: Clear items.onloan for unissued items)\n";
16285 }
16286
16287 $DBversion = '18.06.00.019';
16288 if( CheckVersion( $DBversion ) ) {
16289     $dbh->do( q|
16290 INSERT IGNORE INTO columns_settings (module, page, tablename, columnname, cannot_be_toggled, is_hidden) VALUES
16291 ("circ", "circulation", "issues-table", "collection", 0, 1),
16292 ("members", "moremember", "issues-table", "collection", 0, 1);
16293     |);
16294     SetVersion( $DBversion );
16295     print "Upgrade to $DBversion done (Bug 19719: Default to hiding collection code column)\n";
16296 }
16297
16298 $DBversion = '18.06.00.020';
16299 if( CheckVersion( $DBversion ) ) {
16300     if( !column_exists( 'branch_borrower_circ_rules', 'max_holds' ) ) {
16301         $dbh->do(q{
16302             ALTER TABLE branch_borrower_circ_rules ADD COLUMN max_holds INT(4) NULL DEFAULT NULL AFTER maxonsiteissueqty
16303         });
16304     }
16305     if( !column_exists( 'default_borrower_circ_rules', 'max_holds' ) ) {
16306         $dbh->do(q{
16307             ALTER TABLE default_borrower_circ_rules ADD COLUMN max_holds INT(4) NULL DEFAULT NULL AFTER maxonsiteissueqty
16308         });
16309     }
16310     SetVersion( $DBversion );
16311     print "Upgrade to $DBversion done (Bug 15524 - Set limit on maximum possible holds per patron by category)\n";
16312 }
16313
16314 $DBversion = '18.06.00.021';
16315 if( CheckVersion( $DBversion ) ) {
16316     my $dbh = C4::Context->dbh;
16317     unless ( C4::Context->preference('NorwegianPatronDBEnable') ) {
16318         $dbh->do(q|
16319             DELETE FROM systempreferences
16320             WHERE variable IN ('NorwegianPatronDBEnable', 'NorwegianPatronDBEndpoint', 'NorwegianPatronDBUsername', 'NorwegianPatronDBPassword', 'NorwegianPatronDBSearchNLAfterLocalHit')
16321         |);
16322         if ( TableExists('borrower_sync') ) {
16323             $dbh->do(q|DROP TABLE borrower_sync|);
16324         }
16325     }
16326     SetVersion( $DBversion );
16327     print "Upgrade to $DBversion done (Bug 21068 - Remove system preferences NorwegianPatronDB*)\n";
16328 }
16329
16330 $DBversion = '18.06.00.022';
16331 if( CheckVersion( $DBversion ) ) {
16332     my $dbh = C4::Context->dbh;
16333     $dbh->do(q|
16334         INSERT IGNORE INTO systempreferences ( `variable`, `value`, `options`, `explanation`, `type` ) VALUES
16335         ('HoldsAutoFill','0',NULL,'If on, librarian will not be asked if hold should be filled, it will be filled automatically','YesNo'),
16336         ('HoldsAutoFillPrintSlip','0',NULL,'If on, hold slip print dialog will be displayed automatically','YesNo')
16337     |);
16338     SetVersion( $DBversion );
16339     print "Upgrade to $DBversion done (Bug 19383 - Add ability to print hold receipts automatically)\n";
16340 }
16341
16342 $DBversion = '18.06.00.023';
16343 if( CheckVersion( $DBversion ) ) {
16344     if( !column_exists( 'aqorders', 'replacementprice' ) ){
16345         $dbh->do( "ALTER TABLE aqorders ADD COLUMN replacementprice DECIMAL(28,6)" );
16346         $dbh->do( "UPDATE aqorders set replacementprice = rrp WHERE replacementprice IS NULL" );
16347     }
16348     SetVersion( $DBversion );
16349     print "Upgrade to $DBversion done (Bug 18639 - Add replacementprice field to aqorders table)\n";
16350 }
16351
16352 $DBversion = '18.06.00.024';
16353 if( CheckVersion( $DBversion ) ) {
16354     if( !column_exists( 'branches', 'pickup_location' ) ){
16355         $dbh->do( "ALTER TABLE branches ADD COLUMN pickup_location TINYINT(1) not null default 1" );
16356     }
16357     SetVersion( $DBversion );
16358     print "Upgrade to $DBversion done (Bug 7534 - Let libraries have configuration for pickup locations)\n";
16359 }
16360
16361 $DBversion = '18.06.00.025';
16362 if( CheckVersion( $DBversion ) ) {
16363     $dbh->do(q{
16364         INSERT IGNORE INTO systempreferences ( `variable`, `value`, `options`, `explanation`, `type` ) VALUES
16365         ('KohaManualBaseURL','https://koha-community.org/manual/','','Where is the Koha manual/documentation located?','Free'),
16366         ('KohaManualLanguage','en','en|ar|cs|es|de|fr|it|pt_BR|tr|zh_TW','What is the language of the online manual you want to use?','Choice')
16367     });
16368     SetVersion( $DBversion );
16369     print "Upgrade to $DBversion done (Bug 19817: Add pref KohaManualLanguage and KohaManualBaseURL)\n";
16370 }
16371
16372 $DBversion = '18.06.00.026';
16373 if( CheckVersion( $DBversion ) ) {
16374     $dbh->do(q|
16375 INSERT IGNORE INTO  systempreferences (variable, value, options, explanation, type) VALUES ('ArticleRequestsLinkControl', 'always', 'always\|calc', 'Control display of article request link on search results', 'Choice')
16376     |);
16377     SetVersion( $DBversion );
16378     print "Upgrade to $DBversion done (Bug 17530 - Add pref ArticleRequestsLinkControl)\n";
16379 }
16380
16381 $DBversion = '18.06.00.027';
16382 if( CheckVersion( $DBversion ) ) {
16383     $dbh->do( "DROP TABLE IF EXISTS services_throttle" );
16384     SetVersion( $DBversion );
16385     print "Upgrade to $DBversion done (Bug 21235: Remove table services_throttle)\n";
16386 }
16387
16388 $DBversion = '18.06.00.028';
16389 if( CheckVersion( $DBversion ) ) {
16390     $dbh->do(q{
16391 INSERT IGNORE INTO systempreferences ( `variable`, `value`, `options`, `explanation`, `type` ) VALUES
16392 ('HoldsSplitQueue','nothing','nothing|branch|itemtype|branch_itemtype','In the staff client, split the holds view by the given criteria','Choice'),
16393 ('HoldsSplitQueueNumbering', 'actual', 'actual|virtual', 'If the holds queue is split, decide if the acual priorities should be displayed', 'Choice');
16394 });
16395     SetVersion( $DBversion );
16396     print "Upgrade to $DBversion done (Bug 19469 - Add ability to split view of holds view on record by pickup library and/or itemtype)\n";
16397 }
16398
16399 $DBversion = '18.06.00.029';
16400 if( CheckVersion( $DBversion ) ) {
16401     unless ( index_exists( 'subscription', 'by_biblionumber' ) ) {
16402         $dbh->do(q{
16403             CREATE INDEX `by_biblionumber` ON `subscription` (`biblionumber`)
16404         });
16405     }
16406     SetVersion( $DBversion );
16407     print "Upgrade to $DBversion done (Bug 21288: Slowness in acquisition caused by GetInvoices\n";
16408 }
16409
16410 $DBversion = '18.06.00.030';
16411 if( CheckVersion( $DBversion ) ) {
16412     if ( column_exists( 'accountlines', 'dispute' ) ) {
16413         $dbh->do(q{
16414             ALTER TABLE `accountlines`
16415                 DROP COLUMN `dispute`
16416         });
16417     }
16418     SetVersion( $DBversion );
16419     print "Upgrade to $DBversion done (Bug 20777 - Remove unused field accountlines.dispute)\n";
16420 }
16421
16422 $DBversion = '18.06.00.031';
16423 if( CheckVersion( $DBversion ) ) {
16424     # Add table and add column
16425     unless (TableExists('patron_consent')) {
16426         $dbh->do(q|
16427     CREATE TABLE patron_consent (id int AUTO_INCREMENT, borrowernumber int NOT NULL, type enum('GDPR_PROCESSING' ), given_on datetime, refused_on datetime, PRIMARY KEY (id), FOREIGN KEY (borrowernumber) REFERENCES borrowers (borrowernumber) ON DELETE CASCADE ON UPDATE CASCADE )
16428         |);
16429     }
16430     unless ( column_exists( 'borrower_modifications', 'gdpr_proc_consent' ) ) {
16431         $dbh->do(q|
16432     ALTER TABLE borrower_modifications ADD COLUMN gdpr_proc_consent datetime
16433         |);
16434     }
16435     # Add two sysprefs too
16436     $dbh->do(q|
16437 INSERT IGNORE INTO systempreferences ( variable, value, options, explanation, type ) VALUES ('PrivacyPolicyURL','',NULL,'This URL is used in messages about GDPR consents.', 'Free')
16438     |);
16439     $dbh->do(q|
16440 INSERT IGNORE INTO systempreferences ( variable, value, options, explanation, type ) VALUES ('GDPR_Policy','','Enforced\|Permissive\|Disabled','General Data Protection Regulation - policy', 'Choice')
16441     |);
16442     SetVersion( $DBversion );
16443     print "Upgrade to $DBversion done (Bug 20819: Add patron_consent)\n";
16444 }
16445
16446 $DBversion = '18.06.00.032';
16447 if( CheckVersion( $DBversion ) ) {
16448     $dbh->do(q|ALTER TABLE items                   CHANGE COLUMN ccode ccode varchar(80) default NULL|);
16449     $dbh->do(q|ALTER TABLE deleteditems            CHANGE COLUMN ccode ccode varchar(80) default NULL|);
16450     $dbh->do(q|ALTER TABLE branch_transfer_limits  CHANGE COLUMN ccode ccode varchar(80) default NULL|);
16451     $dbh->do(q|ALTER TABLE course_items            CHANGE COLUMN ccode ccode varchar(80) default NULL|);
16452     SetVersion( $DBversion );
16453     print "Upgrade to $DBversion done (Bug 5458: length of items.ccode disagrees with authorised_values.authorised_value)\n";
16454 }
16455
16456 $DBversion = '18.06.00.033';
16457 if( CheckVersion( $DBversion ) ) {
16458     $dbh->do(q|
16459         INSERT IGNORE INTO systempreferences (variable,value,options,explanation,type) VALUES ('AdditionalFieldsInZ3950ResultSearch', '', 'NULL', 'Determines which MARC field/subfields are displayed in -Additional field- column in the result of a search Z3950', 'Free')
16460     |);
16461     SetVersion( $DBversion );
16462     print "Upgrade to $DBversion done (Bug 12747 - Add AdditionalFieldsInZ3950ResultSearch system preference)\n";
16463 }
16464
16465 $DBversion = '18.06.00.034';
16466 if( CheckVersion( $DBversion ) ) {
16467     $dbh->do(q|
16468         INSERT IGNORE INTO systempreferences (variable,value,options,explanation,type)
16469         VALUES ('RecordedBooksClientSecret','','30','Client key for RecordedBooks integration','YesNo'),
16470                ('RecordedBooksLibraryID','','','Library ID for RecordedBooks integration','Integer'),
16471                ('RecordedBooksDomain','','','RecordedBooks domain','Free');
16472     |);
16473     SetVersion( $DBversion );
16474     print "Upgrade to $DBversion done (Bug 17602 - Integrate support for OneClickdigital/Recorded Books API)\n";
16475 }
16476
16477 $DBversion = '18.06.00.035';
16478 if( CheckVersion( $DBversion ) ) {
16479     $dbh->do(q{
16480         UPDATE `systempreferences` SET options = 'US|CA|DE|FR|IN|JP|UK' WHERE variable = 'AmazonLocale' AND options='US|CA|DE|FR|JP|UK';
16481     });
16482     SetVersion( $DBversion );
16483     print "Upgrade to $DBversion done (Bug 21403 - Add Indian Amazon Affiliate option to AmazonLocale setting)\n";
16484 }
16485
16486
16487 $DBversion = '18.06.00.036';
16488 if( CheckVersion( $DBversion ) ) {
16489     unless (TableExists('circulation_rules')){
16490         $dbh->do(q{
16491             CREATE TABLE `circulation_rules` (
16492               `id` int(11) NOT NULL auto_increment,
16493               `branchcode` varchar(10) NULL default NULL,
16494               `categorycode` varchar(10) NULL default NULL,
16495               `itemtype` varchar(10) NULL default NULL,
16496               `rule_name` varchar(32) NOT NULL,
16497               `rule_value` varchar(32) NOT NULL,
16498               PRIMARY KEY (`id`),
16499               CONSTRAINT `circ_rules_ibfk_1` FOREIGN KEY (`branchcode`) REFERENCES `branches` (`branchcode`) ON DELETE CASCADE ON UPDATE CASCADE,
16500               CONSTRAINT `circ_rules_ibfk_2` FOREIGN KEY (`categorycode`) REFERENCES `categories` (`categorycode`) ON DELETE CASCADE ON UPDATE CASCADE,
16501               CONSTRAINT `circ_rules_ibfk_3` FOREIGN KEY (`itemtype`) REFERENCES `itemtypes` (`itemtype`) ON DELETE CASCADE ON UPDATE CASCADE,
16502               KEY `rule_name` (`rule_name`),
16503               UNIQUE (`branchcode`,`categorycode`,`itemtype`,`rule_name`)
16504             ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
16505         });
16506     }
16507     if (column_exists('branch_borrower_circ_rules', 'max_holds') ){
16508         $dbh->do(q{
16509             INSERT IGNORE INTO circulation_rules ( branchcode, categorycode, itemtype, rule_name, rule_value )
16510             SELECT branchcode, categorycode, NULL, 'max_holds', COALESCE( max_holds, '' ) FROM branch_borrower_circ_rules
16511         });
16512         $dbh->do(q{
16513             ALTER TABLE branch_borrower_circ_rules DROP COLUMN max_holds
16514         });
16515     }
16516     if (column_exists('default_borrower_circ_rules', 'max_holds') ){
16517         $dbh->do(q{
16518             INSERT IGNORE INTO circulation_rules ( branchcode, categorycode, itemtype, rule_name, rule_value )
16519             SELECT NULL, categorycode, NULL, 'max_holds', COALESCE( max_holds, '' ) FROM default_borrower_circ_rules
16520         });
16521         $dbh->do(q{
16522             ALTER TABLE default_borrower_circ_rules DROP COLUMN max_holds
16523         });
16524     }
16525     SetVersion( $DBversion );
16526     print "Upgrade to $DBversion done (Bug 18887 - Introduce new table 'circulation_rules', use for 'max_holds' rules)\n";
16527 }
16528
16529 $DBversion = '18.06.00.037';
16530 if( CheckVersion( $DBversion ) ) {
16531     unless (TableExists('branches_overdrive')){
16532         $dbh->do( q|
16533             CREATE TABLE branches_overdrive (
16534                 `branchcode` VARCHAR( 10 ) NOT NULL ,
16535                 `authname` VARCHAR( 255 ) NOT NULL ,
16536                 PRIMARY KEY (`branchcode`) ,
16537                 CONSTRAINT `branches_overdrive_ibfk_1` FOREIGN KEY (`branchcode`) REFERENCES `branches` (`branchcode`) ON DELETE CASCADE ON UPDATE CASCADE
16538             ) ENGINE = INNODB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci |
16539         );
16540     }
16541     $dbh->do("INSERT IGNORE INTO systempreferences (variable,value,explanation,options,type) VALUES ('OverDriveAuthname', '', 'Authname for OverDrive Patron Authentication, will be used as fallback if individual branch authname not set', NULL, 'Free');");
16542     $dbh->do("INSERT IGNORE INTO systempreferences (variable,value,explanation,options,type) VALUES ('OverDriveWebsiteID','', 'WebsiteID provided by OverDrive', NULL, 'Free');");
16543     $dbh->do("INSERT IGNORE INTO systempreferences (variable,value,explanation,options,type) VALUES ('OverDrivePasswordRequired','', 'Does the library require passwords for OverDrive SIP authentication', NULL, 'YesNo');");
16544     SetVersion( $DBversion );
16545     print "Upgrade to $DBversion done (Bug 21082 - Add overdrive patron auth method)\n";
16546 }
16547
16548 $DBversion = '18.06.00.038';
16549 if( CheckVersion( $DBversion ) ) {
16550     $dbh->do( "ALTER TABLE edifact_ean MODIFY branchcode VARCHAR(10) NULL DEFAULT NULL" );
16551     SetVersion( $DBversion );
16552     print "Upgrade to $DBversion done (Bug 21417 - EDI ordering fails when basket and EAN libraries do not match)\n";
16553 }
16554
16555 $DBversion = '18.06.00.039';
16556 if( CheckVersion( $DBversion ) ) {
16557     $dbh->do(q{
16558         INSERT IGNORE INTO `permissions` (module_bit, code, description) VALUES(3, 'manage_circ_rules_from_any_libraries', 'Manage circ rules for any libraries');
16559     });
16560     SetVersion( $DBversion );
16561     print "Upgrade to $DBversion done (Bug 15520 - Add more granular permission for only editing own library's circ rules)\n";
16562 }
16563
16564 $DBversion = '18.06.00.040';
16565 if( CheckVersion( $DBversion ) ) {
16566     # Stock Rotation Rotas
16567     unless (TableExists('stockrotationrotas')){
16568         $dbh->do(q{
16569           CREATE TABLE `stockrotationrotas` (
16570             `rota_id` int(11) auto_increment,         -- Stockrotation rota ID
16571             `title` varchar(100) NOT NULL,            -- Title for this rota
16572             `description` text NOT NULL,              -- Description for this rota
16573             `cyclical` tinyint(1) NOT NULL default 0, -- Should items on this rota keep cycling?
16574             `active` tinyint(1) NOT NULL default 0,   -- Is this rota currently active?
16575             PRIMARY KEY (`rota_id`),
16576             CONSTRAINT `stockrotationrotas_title`
16577             UNIQUE (`title`)
16578           ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
16579         });
16580     }
16581     # Stock Rotation Stages
16582     unless (TableExists('stockrotationstages')){
16583         $dbh->do(q{
16584           CREATE TABLE `stockrotationstages` (
16585               `stage_id` int(11) auto_increment,     -- Unique stage ID
16586               `position` int(11) NOT NULL,           -- The position of this stage within its rota
16587               `rota_id` int(11) NOT NULL,            -- The rota this stage belongs to
16588               `branchcode_id` varchar(10) NOT NULL,  -- Branch this stage relates to
16589               `duration` int(11) NOT NULL default 4, -- The number of days items shoud occupy this stage
16590               PRIMARY KEY (`stage_id`),
16591               CONSTRAINT `stockrotationstages_rifk`
16592                 FOREIGN KEY (`rota_id`)
16593                 REFERENCES `stockrotationrotas` (`rota_id`)
16594                 ON UPDATE CASCADE ON DELETE CASCADE,
16595               CONSTRAINT `stockrotationstages_bifk`
16596                 FOREIGN KEY (`branchcode_id`)
16597                 REFERENCES `branches` (`branchcode`)
16598                 ON UPDATE CASCADE ON DELETE CASCADE
16599           ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
16600         });
16601     }
16602     # Stock Rotation Items
16603     unless (TableExists('stockrotationitems')){
16604         $dbh->do(q{
16605           CREATE TABLE `stockrotationitems` (
16606               `itemnumber_id` int(11) NOT NULL,         -- Itemnumber to link to a stage & rota
16607               `stage_id` int(11) NOT NULL,              -- stage ID to link the item to
16608               `indemand` tinyint(1) NOT NULL default 0, -- Should this item be skipped for rotation?
16609               `fresh` tinyint(1) NOT NULL default 0,    -- Flag showing item is only just added to rota
16610               PRIMARY KEY (itemnumber_id),
16611               CONSTRAINT `stockrotationitems_iifk`
16612                 FOREIGN KEY (`itemnumber_id`)
16613                 REFERENCES `items` (`itemnumber`)
16614                 ON UPDATE CASCADE ON DELETE CASCADE,
16615               CONSTRAINT `stockrotationitems_sifk`
16616                 FOREIGN KEY (`stage_id`)
16617                 REFERENCES `stockrotationstages` (`stage_id`)
16618                 ON UPDATE CASCADE ON DELETE CASCADE
16619           ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
16620         });
16621     }
16622     # System preferences
16623     $dbh->do(q{
16624         INSERT IGNORE INTO `systempreferences` (`variable`,`value`,`explanation`,`options`,`type`)
16625         VALUES ('StockRotation','0','If ON, enables the stock rotation module','','YesNo'),
16626                ('RotationPreventTransfers','0','If ON, prevent any transfers for items on stock rotation rotas, except for stock rotation transfers','','YesNo');
16627     });
16628     # Permissions
16629     $dbh->do(q{
16630         INSERT IGNORE INTO `userflags` (`bit`, `flag`, `flagdesc`, `defaulton`)
16631         VALUES (24, 'stockrotation', 'Manage stockrotation operations', 0);
16632     });
16633     $dbh->do(q{
16634         INSERT IGNORE INTO `permissions` (`module_bit`, `code`, `description`)
16635         VALUES (24, 'manage_rotas', 'Create, edit and delete rotas'),
16636                (24, 'manage_rota_items', 'Add and remove items from rotas');
16637     });
16638     # Notices
16639     $dbh->do(q{
16640         INSERT IGNORE INTO `letter` (`module`, `code`, `branchcode`, `name`, `is_html`, `title`, `content`, `message_transport_type`)
16641         VALUES ('circulation', 'SR_SLIP', '', 'Stock Rotation Slip', 0, 'Stockrotation Report', 'Stockrotation report for [% branch.name %]:\r\n\r\n[% IF branch.items.size %][% branch.items.size %] items to be processed for this branch.\r\n[% ELSE %]No items to be processed for this branch\r\n[% END %][% FOREACH item IN branch.items %][% IF item.reason ne \'in-demand\' %]Title: [% item.title %]\r\nAuthor: [% item.author %]\r\nCallnumber: [% item.callnumber %]\r\nLocation: [% item.location %]\r\nBarcode: [% item.barcode %]\r\nOn loan?: [% item.onloan %]\r\nStatus: [% item.reason %]\r\nCurrent Library: [% item.branch.branchname %] [% item.branch.branchcode %]\r\n\r\n[% END %][% END %]', 'email');
16642     });
16643     print "Upgrade to $DBversion done (Bug 11897 - Add Stock Rotation Feature)\n";
16644     SetVersion( $DBversion );
16645 }
16646
16647 $DBversion = '18.06.00.041';
16648 if( CheckVersion( $DBversion ) ) {
16649
16650      if( !column_exists( 'illrequests', 'price_paid' ) ) {
16651         $dbh->do(q{
16652             ALTER TABLE illrequests
16653                 ADD COLUMN price_paid varchar(20) DEFAULT NULL
16654                 AFTER cost
16655         });
16656      }
16657
16658      if( !column_exists( 'illrequestattributes', 'readonly' ) ) {
16659         $dbh->do(q{
16660             ALTER TABLE illrequestattributes
16661                 ADD COLUMN readonly tinyint(1) NOT NULL DEFAULT 1
16662                 AFTER value
16663         });
16664         $dbh->do(q{
16665             UPDATE illrequestattributes SET readonly = 1
16666         });
16667      }
16668
16669     SetVersion( $DBversion );
16670     print "Upgrade to $DBversion done (Bug 20772 - Add illrequestattributes.readonly and illrequest.price_paid columns)\n";
16671 }
16672
16673 $DBversion = '18.06.00.042';
16674 if( CheckVersion( $DBversion ) ) {
16675     $dbh->do( "alter table statistics change column ccode ccode varchar(80) default NULL" );
16676
16677     SetVersion( $DBversion );
16678     print "Upgrade to $DBversion done (Bug 21617: Make statistics.ccode longer)\n";
16679 }
16680
16681 $DBversion = "18.06.00.043";
16682 if ( CheckVersion($DBversion) ) {
16683     if ( !column_exists( 'issuingrules', 'holds_per_day' ) ) {
16684         $dbh->do(q{
16685             ALTER TABLE `issuingrules`
16686                 ADD COLUMN `holds_per_day` SMALLINT(6) DEFAULT NULL
16687                 AFTER `holds_per_record`
16688         });
16689     }
16690     print "Upgrade to $DBversion done (Bug 15486: Restrict number of holds placed by day)\n";
16691     SetVersion($DBversion);
16692 }
16693
16694 $DBversion = '18.06.00.044';
16695 if( CheckVersion( $DBversion ) ) {
16696     unless( column_exists( 'creator_batches', 'description' ) ) {
16697         $dbh->do(q|ALTER TABLE creator_batches ADD description mediumtext default NULL AFTER batch_id|);
16698     }
16699     SetVersion( $DBversion );
16700     print "Upgrade to $DBversion done (Bug 15766: Add column creator_batches.description)\n";
16701 }
16702
16703 $DBversion = '18.06.00.045';
16704 if( CheckVersion( $DBversion ) ) {
16705     $dbh->do(q(
16706         INSERT IGNORE INTO message_transports
16707         (message_attribute_id,message_transport_type,is_digest,letter_module,letter_code)
16708         VALUES
16709         (2, 'phone', 0, 'circulation', 'PREDUE'),
16710         (2, 'phone', 1, 'circulation', 'PREDUEDGST'),
16711         (4, 'phone', 0, 'reserves',    'HOLD')
16712         ));
16713     SetVersion( $DBversion );
16714     print "Upgrade to $DBversion done (Bug 21639 - Add phone transports by default)\n";
16715 }
16716
16717 $DBversion = '18.06.00.046';
16718 if( CheckVersion( $DBversion ) ) {
16719     unless (TableExists('illcomments')) {
16720         $dbh->do(q{
16721             CREATE TABLE illcomments (
16722                 illcomment_id int(11) NOT NULL AUTO_INCREMENT, -- Unique ID of the comment
16723                 illrequest_id bigint(20) unsigned NOT NULL,    -- ILL request number
16724                 borrowernumber integer DEFAULT NULL,           -- Link to the user who made the comment (could be librarian, patron or ILL partner library)
16725                 comment text DEFAULT NULL,                     -- The text of the comment
16726                 timestamp timestamp DEFAULT CURRENT_TIMESTAMP, -- Date and time when the comment was made
16727                 PRIMARY KEY  ( illcomment_id ),
16728                 CONSTRAINT illcomments_bnfk
16729                   FOREIGN KEY ( borrowernumber )
16730                   REFERENCES  borrowers  ( borrowernumber )
16731                   ON UPDATE CASCADE ON DELETE CASCADE,
16732                 CONSTRAINT illcomments_ifk
16733                   FOREIGN KEY (illrequest_id)
16734                   REFERENCES illrequests ( illrequest_id )
16735                   ON UPDATE CASCADE ON DELETE CASCADE
16736             ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
16737         });
16738     }
16739
16740     SetVersion( $DBversion );
16741     print "Upgrade to $DBversion done (Bug 18591 - Add comments to ILL requests)\n";
16742 }
16743
16744 $DBversion = '18.06.00.047';
16745 if( CheckVersion( $DBversion ) ) {
16746     # insert the authorized_value_category for CONTROL_NUM_SEQUENCE
16747     $dbh->do( "INSERT IGNORE INTO authorised_value_categories values ('CONTROL_NUM_SEQUENCE');" );
16748     SetVersion( $DBversion );
16749     print "Upgrade to $DBversion done (Bug 19263 - Advanced Editor - Rancor - Add auto control number (001) widget)\n";
16750 }
16751
16752 $DBversion = '18.06.00.048';
16753 if( CheckVersion( $DBversion ) ) {
16754     $dbh->do( "ALTER TABLE stockrotationrotas CHANGE COLUMN description description text" );
16755     SetVersion( $DBversion );
16756     print "Upgrade to $DBversion done (Bug 21682 - Remove default on stockrotationrotas.description)\n";
16757 }
16758
16759 $DBversion = '18.06.00.049';
16760 if( CheckVersion( $DBversion ) ) {
16761     $dbh->do(q{
16762         UPDATE letter SET content = REPLACE(content,"item.reason ne \'in-demand\'","item.reason != \'in-demand\'")
16763         WHERE code="SR_SLIP";
16764     });
16765     print "Upgrade to $DBversion done (Bug 21656 - Stock Rotation Notice, Template Toolkit Syntax Correction)\n";
16766     SetVersion( $DBversion );
16767 }
16768
16769 $DBversion = '18.06.00.050';
16770 if( CheckVersion( $DBversion ) ) {
16771     $dbh->do(q{
16772         INSERT IGNORE INTO systempreferences (`variable`, `value`, `options`, `explanation`, `type`) VALUES ('OpacHiddenItemsExceptions','',NULL,'List of borrower categories, separated by |, that can see items otherwise hidden by OpacHiddenItems','Textarea');
16773     });
16774     print "Upgrade to $DBversion done (Bug 14385 - Add OpacHiddenItemExceptions)\n";
16775     SetVersion( $DBversion );
16776 }
16777
16778 $DBversion = '18.06.00.051';
16779 if( CheckVersion( $DBversion ) ) {
16780     $dbh->do(q{
16781         INSERT IGNORE INTO `systempreferences` (`variable`, `value`, `options`, `explanation`, `type`) VALUES
16782         ('AdlibrisCoversEnabled', '0', NULL, 'Display cover images in OPAC results and detail listing from Swedish retailer Adlibris.','YesNo'),
16783         ('AdlibrisCoversURL', 'http://www.adlibris.com/se/organisationer/showimagesafe.aspx', NULL, 'Base URL for Adlibris cover image web service.', 'Free');
16784     });
16785     print "Upgrade to $DBversion done (Bug 8630 - Add covers from AdLibris to the OPAC and Intranet)\n";
16786     SetVersion( $DBversion );
16787 }
16788
16789 $DBversion = '18.06.00.052';
16790 if( CheckVersion( $DBversion ) ) {
16791     $dbh->do(q{
16792         INSERT IGNORE INTO permissions (module_bit, code, description) VALUES
16793            ( 3, 'manage_sysprefs', 'Manage global system preferences'),
16794            ( 3, 'manage_libraries', 'Manage libraries and library groups'),
16795            ( 3, 'manage_itemtypes', 'Manage item types'),
16796            ( 3, 'manage_auth_values', 'Manage authorized values'),
16797            ( 3, 'manage_patron_categories', 'Manage patron categories'),
16798            ( 3, 'manage_patron_attributes', 'Manage extended patron attributes'),
16799            ( 3, 'manage_transfers', 'Manage library transfer limits and transport cost matrix'),
16800            ( 3, 'manage_item_circ_alerts', 'Manage item circulation alerts'),
16801            ( 3, 'manage_cities', 'Manage cities and towns'),
16802            ( 3, 'manage_marc_frameworks', 'Manage MARC bibliographic and authority frameworks'),
16803            ( 3, 'manage_keywords2koha_mappings', 'Manage keywords to Koha mappings'),
16804            ( 3, 'manage_classifications', 'Manage classification sources'),
16805            ( 3, 'manage_matching_rules', 'Manage record matching rules'),
16806            ( 3, 'manage_oai_sets', 'Manage OAI sets'),
16807            ( 3, 'manage_item_search_fields', 'Manage item search fields'),
16808            ( 3, 'manage_search_engine_config', 'Manage search engine configuration'),
16809            ( 3, 'manage_search_targets', 'Manage Z39.50 and SRU server configuration'),
16810            ( 3, 'manage_didyoumean', 'Manage Did you mean? configuration'),
16811            ( 3, 'manage_column_config', 'Manage column configuration'),
16812            ( 3, 'manage_sms_providers', 'Manage SMS cellular providers'),
16813            ( 3, 'manage_audio_alerts', 'Manage audio alerts'),
16814            ( 3, 'manage_usage_stats', 'Manage usage statistics settings');
16815     });
16816     $dbh->do(q{
16817         INSERT INTO user_permissions (borrowernumber, module_bit, code)
16818             SELECT borrowernumber, 3, 'manage_sysprefs' FROM borrowers WHERE borrowernumber IN (SELECT borrowernumber FROM user_permissions WHERE code = 'parameters_remaining_permissions');
16819     });
16820     $dbh->do(q{
16821         INSERT INTO user_permissions (borrowernumber, module_bit, code)
16822             SELECT borrowernumber, 3, 'manage_libraries' FROM borrowers WHERE borrowernumber IN (SELECT borrowernumber FROM user_permissions WHERE code = 'parameters_remaining_permissions');
16823     });
16824     $dbh->do(q{
16825         INSERT INTO user_permissions (borrowernumber, module_bit, code)
16826             SELECT borrowernumber, 3, 'manage_itemtypes' FROM borrowers WHERE borrowernumber IN (SELECT borrowernumber FROM user_permissions WHERE code = 'parameters_remaining_permissions');
16827     });
16828     $dbh->do(q{
16829         INSERT INTO user_permissions (borrowernumber, module_bit, code)
16830             SELECT borrowernumber, 3, 'manage_auth_values' FROM borrowers WHERE borrowernumber IN (SELECT borrowernumber FROM user_permissions WHERE code = 'parameters_remaining_permissions');
16831     });
16832     $dbh->do(q{
16833         INSERT INTO user_permissions (borrowernumber, module_bit, code)
16834             SELECT borrowernumber, 3, 'manage_patron_categories' FROM borrowers WHERE borrowernumber IN (SELECT borrowernumber FROM user_permissions WHERE code = 'parameters_remaining_permissions');
16835     });
16836     $dbh->do(q{
16837         INSERT INTO user_permissions (borrowernumber, module_bit, code)
16838             SELECT borrowernumber, 3, 'manage_patron_attributes' FROM borrowers WHERE borrowernumber IN (SELECT borrowernumber FROM user_permissions WHERE code = 'parameters_remaining_permissions');
16839     });
16840     $dbh->do(q{
16841         INSERT INTO user_permissions (borrowernumber, module_bit, code)
16842             SELECT borrowernumber, 3, 'manage_transfers' FROM borrowers WHERE borrowernumber IN (SELECT borrowernumber FROM user_permissions WHERE code = 'parameters_remaining_permissions');
16843     });
16844     $dbh->do(q{
16845         INSERT INTO user_permissions (borrowernumber, module_bit, code)
16846             SELECT borrowernumber, 3, 'manage_item_circ_alerts' FROM borrowers WHERE borrowernumber IN (SELECT borrowernumber FROM user_permissions WHERE code = 'parameters_remaining_permissions');
16847     });
16848     $dbh->do(q{
16849         INSERT INTO user_permissions (borrowernumber, module_bit, code)
16850             SELECT borrowernumber, 3, 'manage_cities' FROM borrowers WHERE borrowernumber IN (SELECT borrowernumber FROM user_permissions WHERE code = 'parameters_remaining_permissions');
16851     });
16852     $dbh->do(q{
16853         INSERT INTO user_permissions (borrowernumber, module_bit, code)
16854             SELECT borrowernumber, 3, 'manage_marc_frameworks' FROM borrowers WHERE borrowernumber IN (SELECT borrowernumber FROM user_permissions WHERE code = 'parameters_remaining_permissions');
16855     });
16856     $dbh->do(q{
16857         INSERT INTO user_permissions (borrowernumber, module_bit, code)
16858             SELECT borrowernumber, 3, 'manage_keywords2koha_mappings' FROM borrowers WHERE borrowernumber IN (SELECT borrowernumber FROM user_permissions WHERE code = 'parameters_remaining_permissions');
16859     });
16860     $dbh->do(q{
16861         INSERT INTO user_permissions (borrowernumber, module_bit, code)
16862             SELECT borrowernumber, 3, 'manage_classifications' FROM borrowers WHERE borrowernumber IN (SELECT borrowernumber FROM user_permissions WHERE code = 'parameters_remaining_permissions');
16863     });
16864     $dbh->do(q{
16865         INSERT INTO user_permissions (borrowernumber, module_bit, code)
16866             SELECT borrowernumber, 3, 'manage_matching_rules' FROM borrowers WHERE borrowernumber IN (SELECT borrowernumber FROM user_permissions WHERE code = 'parameters_remaining_permissions');
16867     });
16868     $dbh->do(q{
16869         INSERT INTO user_permissions (borrowernumber, module_bit, code)
16870             SELECT borrowernumber, 3, 'manage_oai_sets' FROM borrowers WHERE borrowernumber IN (SELECT borrowernumber FROM user_permissions WHERE code = 'parameters_remaining_permissions');
16871     });
16872     $dbh->do(q{
16873         INSERT INTO user_permissions (borrowernumber, module_bit, code)
16874             SELECT borrowernumber, 3, 'manage_item_search_fields' FROM borrowers WHERE borrowernumber IN (SELECT borrowernumber FROM user_permissions WHERE code = 'parameters_remaining_permissions');
16875     });
16876     $dbh->do(q{
16877         INSERT INTO user_permissions (borrowernumber, module_bit, code)
16878             SELECT borrowernumber, 3, 'manage_search_engine_config' FROM borrowers WHERE borrowernumber IN (SELECT borrowernumber FROM user_permissions WHERE code = 'parameters_remaining_permissions');
16879     });
16880     $dbh->do(q{
16881         INSERT INTO user_permissions (borrowernumber, module_bit, code)
16882             SELECT borrowernumber, 3, 'manage_search_targets' FROM borrowers WHERE borrowernumber IN (SELECT borrowernumber FROM user_permissions WHERE code = 'parameters_remaining_permissions');
16883     });
16884     $dbh->do(q{
16885         INSERT INTO user_permissions (borrowernumber, module_bit, code)
16886             SELECT borrowernumber, 3, 'manage_didyoumean' FROM borrowers WHERE borrowernumber IN (SELECT borrowernumber FROM user_permissions WHERE code = 'parameters_remaining_permissions');
16887     });
16888     $dbh->do(q{
16889         INSERT INTO user_permissions (borrowernumber, module_bit, code)
16890             SELECT borrowernumber, 3, 'manage_column_config' FROM borrowers WHERE borrowernumber IN (SELECT borrowernumber FROM user_permissions WHERE code = 'parameters_remaining_permissions');
16891     });
16892     $dbh->do(q{
16893         INSERT INTO user_permissions (borrowernumber, module_bit, code)
16894             SELECT borrowernumber, 3, 'manage_sms_providers' FROM borrowers WHERE borrowernumber IN (SELECT borrowernumber FROM user_permissions WHERE code = 'parameters_remaining_permissions');
16895     });
16896     $dbh->do(q{
16897         INSERT INTO user_permissions (borrowernumber, module_bit, code)
16898             SELECT borrowernumber, 3, 'manage_audio_alerts' FROM borrowers WHERE borrowernumber IN (SELECT borrowernumber FROM user_permissions WHERE code = 'parameters_remaining_permissions');
16899     });
16900     $dbh->do(q{
16901         INSERT INTO user_permissions (borrowernumber, module_bit, code)
16902             SELECT borrowernumber, 3, 'manage_usage_stats' FROM borrowers WHERE borrowernumber IN (SELECT borrowernumber FROM user_permissions WHERE code = 'parameters_remaining_permissions');
16903     });
16904     $dbh->do(q{
16905         INSERT INTO user_permissions (borrowernumber, module_bit, code)
16906             SELECT borrowernumber, 3, 'manage_item_search_fields' FROM borrowers WHERE flags & (1 << 2);
16907     });
16908     SetVersion( $DBversion );
16909     print "Upgrade to $DBversion done (Bug 14391: Add granular permissions to the administration module)\n";
16910 }
16911
16912 $DBversion = '18.06.00.053';
16913 if( CheckVersion( $DBversion ) ) {
16914     $dbh->do( "INSERT IGNORE INTO systempreferences (variable,value,options,explanation,type) VALUES ('ItemsDeniedRenewal','','','This syspref allows to define custom rules for denying renewal of specific items.','Textarea')" );
16915     SetVersion( $DBversion );
16916     print "Upgrade to $DBversion done (Bug 15494 - Block renewals by arbitrary item values)\n";
16917 }
16918
16919 $DBversion = '18.06.00.054';
16920 if( CheckVersion( $DBversion ) ) {
16921     if( !column_exists( 'search_field', 'weight' ) ) {
16922         $dbh->do( "ALTER TABLE `search_field` ADD COLUMN `weight` decimal(5,2) DEFAULT NULL AFTER `type`" );
16923     }
16924     SetVersion( $DBversion );
16925     print "Upgrade to $DBversion done (Bug 18316 - Add column search_field.weight)\n";
16926 }
16927
16928 $DBversion = '18.06.00.055';
16929 if( CheckVersion( $DBversion ) ) {
16930     unless( column_exists( 'issuingrules', 'note' ) ) {
16931         $dbh->do(q|ALTER TABLE `issuingrules` ADD `note` varchar(100) default NULL AFTER `article_requests`|);
16932     }
16933     SetVersion( $DBversion );
16934     print "Upgrade to $DBversion done (Bug 12365: Add column issuingrules.note)\n";
16935 }
16936
16937 $DBversion = '18.06.00.056';
16938 if( CheckVersion( $DBversion ) ) {
16939
16940     # All attributes we're potentially interested in
16941     my $ff_req = $dbh->selectall_arrayref(
16942         'SELECT a.illrequest_id, a.type, a.value '.
16943         'FROM illrequests r, illrequestattributes a '.
16944         'WHERE r.illrequest_id = a.illrequest_id '.
16945         'AND r.backend = "FreeForm"',
16946         { Slice => {} }
16947     );
16948
16949     # Before we go any further, identify whether we've done
16950     # this before, we test for the presence of "container_title"
16951     # We stop as soon as we find one
16952     foreach my $req(@{$ff_req}) {
16953         if ($req->{type} eq 'container_title') {
16954             warn "Upgrade already carried out";
16955         }
16956     }
16957
16958     # Transform into a hashref with the key of the request ID
16959     my $requests = {};
16960     foreach my $request(@{$ff_req}) {
16961         my $id = $request->{illrequest_id};
16962         if (!exists $requests->{$id}) {
16963             $requests->{$id} = {};
16964         }
16965         $requests->{$id}->{$request->{type}} = $request->{value};
16966     }
16967
16968     # Transform any article requests
16969     my $transformed = {};
16970     foreach my $id(keys %{$requests}) {
16971         if (lc($requests->{$id}->{type}) eq 'article') {
16972             $transformed->{$id} = $requests->{$id};
16973             $transformed->{$id}->{type} = 'article';
16974             $transformed->{$id}->{container_title} = $transformed->{$id}->{title}
16975                 if defined $transformed->{$id}->{title} &&
16976                     length $transformed->{$id}->{title} > 0;
16977             $transformed->{$id}->{title} = $transformed->{$id}->{article_title}
16978                 if defined $transformed->{$id}->{article_title} &&
16979                     length $transformed->{$id}->{article_title} > 0;
16980             $transformed->{$id}->{author} = $transformed->{$id}->{article_author}
16981                 if defined $transformed->{$id}->{article_author} &&
16982                     length $transformed->{$id}->{article_author} > 0;
16983             $transformed->{$id}->{pages} = $transformed->{$id}->{article_pages}
16984                 if defined $transformed->{$id}->{article_pages} &&
16985                     length $transformed->{$id}->{article_pages} > 0;
16986         }
16987     }
16988
16989     # Now write back the transformed data
16990     # Rather than selectively replace, we just remove all attributes we've
16991     # transformed and re-write them
16992     my @changed = keys %{$transformed};
16993     my $changed_str = join(',', @changed);
16994
16995     if (scalar @changed > 0) {
16996         my ($raise_error) = $dbh->{RaiseError};
16997         $dbh->{AutoCommit} = 0;
16998         $dbh->{RaiseError} = 1;
16999         eval {
17000             my $del = $dbh->do(
17001                 "DELETE FROM illrequestattributes ".
17002                 "WHERE illrequest_id IN ($changed_str)"
17003             );
17004             foreach my $reqid(keys %{$transformed}) {
17005                 my $attr = $transformed->{$reqid};
17006                 foreach my $key(keys %{$attr}) {
17007                     my $sth = $dbh->prepare(
17008                         'INSERT INTO illrequestattributes '.
17009                         '(illrequest_id, type, value) '.
17010                         'VALUES '.
17011                         '(?, ?, ?)'
17012                     );
17013                     $sth->execute(
17014                         $reqid,
17015                         $key,
17016                         $attr->{$key}
17017                     );
17018                 }
17019             }
17020             $dbh->commit;
17021         };
17022
17023         if ($@) {
17024             warn "Upgrade to $DBversion failed: $@\n";
17025             eval { $dbh->rollback };
17026         } else {
17027             SetVersion( $DBversion );
17028             print "Upgrade to $DBversion done (Bug 21079 - Unify metadata schema across backends)\n";
17029         }
17030
17031         $dbh->{AutoCommit} = 1;
17032         $dbh->{RaiseError} = $raise_error;
17033     }
17034
17035 }
17036
17037 $DBversion = '18.06.00.057';
17038 if( CheckVersion( $DBversion ) ) {
17039     # System preferences
17040     $dbh->do(q{
17041         INSERT IGNORE INTO `systempreferences` (`variable`,`value`,`explanation`,`options`,`type`)
17042         VALUES ('showLastPatron','0','','If ON, enables the last patron feature in the intranet','YesNo');
17043     });
17044     SetVersion( $DBversion );
17045     print "Upgrade to $DBversion done (Bug 20312 - Add showLastPatron systempreference)\n";
17046 }
17047
17048 $DBversion = '18.06.00.058';
17049 if( CheckVersion( $DBversion ) ) {
17050     $dbh->do(q{
17051         INSERT IGNORE INTO systempreferences (`variable`, `value`, `options`, `explanation`, `type`) VALUES
17052         ('MarcFieldForCreatorId','',NULL,'Where to store the borrowernumber of the record''s creator','Free'),
17053         ('MarcFieldForCreatorName','',NULL,'Where to store the name of the record''s creator','Free'),
17054         ('MarcFieldForModifierId','',NULL,'Where to store the borrowernumber of the record''s last modifier','Free'),
17055         ('MarcFieldForModifierName','',NULL,'Where to store the name of the record''s last modifier','Free')
17056     });
17057
17058     SetVersion( $DBversion );
17059     print "Upgrade to $DBversion done (Bug 19349 - Add system preferences MarcFieldForCreatorId, MarcFieldForCreatorName, MarcFieldForModifierId, MarcFieldForModifierName)\n";
17060 }
17061
17062 $DBversion = '18.06.00.059';
17063 if( CheckVersion( $DBversion ) ) {
17064     $dbh->do(q{
17065         INSERT IGNORE INTO systempreferences ( `variable`, `value`, `options`, `explanation`, `type`) VALUES  ('EmailSMSSendDriverFromAddress', '', '', 'Email SMS send driver from address override', 'Free');
17066     });
17067     SetVersion( $DBversion );
17068     print "Upgrade to $DBversion done (Bug 20356 - Add EmailSMSSendDriverFromAddress system preference)\n";
17069 }
17070
17071 $DBversion = '18.06.00.060';
17072 if( CheckVersion( $DBversion ) ) {
17073     unless( TableExists( 'class_split_rules' ) ) {
17074         $dbh->do(q|
17075             CREATE TABLE class_split_rules (
17076               class_split_rule varchar(10) NOT NULL default '',
17077               description LONGTEXT,
17078               split_routine varchar(30) NOT NULL default '',
17079               split_regex varchar(255) NOT NULL default '',
17080               PRIMARY KEY (class_split_rule),
17081               UNIQUE KEY class_split_rule_idx (class_split_rule)
17082             ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
17083         |);
17084
17085         $dbh->do(q|
17086             ALTER TABLE class_sources
17087             ADD COLUMN class_split_rule varchar(10) NOT NULL default ''
17088             AFTER class_sort_rule
17089         |);
17090
17091         $dbh->do(q|
17092             UPDATE class_sources
17093             SET class_split_rule = class_sort_rule
17094         |);
17095
17096         $dbh->do(q|
17097             UPDATE class_sources
17098             SET class_split_rule = 'generic'
17099             WHERE class_split_rule NOT IN('dewey', 'generic', 'lcc')
17100         |);
17101
17102         $dbh->do(q|
17103             INSERT INTO class_split_rules(class_split_rule, description, split_routine)
17104             VALUES
17105             ('dewey', 'Default sorting rules for DDC', 'Dewey'),
17106             ('lcc', 'Default sorting rules for LCC', 'LCC'),
17107             ('generic', 'Generic call number sorting rules', 'Generic')
17108         |);
17109
17110         $dbh->do(q|
17111             ALTER TABLE class_sources
17112             ADD CONSTRAINT class_source_ibfk_2 FOREIGN KEY (class_split_rule)
17113             REFERENCES class_split_rules (class_split_rule)
17114         |);
17115     }
17116
17117     SetVersion( $DBversion );
17118     print "Upgrade to $DBversion done (Bug 15836 - Add class_sort_rules.split_routine and split_regex)\n";
17119 }
17120
17121 $DBversion = '18.06.00.061';
17122 if ( CheckVersion($DBversion) ) {
17123     $dbh->do(q{
17124         INSERT IGNORE INTO `systempreferences` (`variable`,`value`,`explanation`,`options`,`type`) VALUES
17125         ('ElasticsearchIndexStatus_biblios', '0', 'Biblios index status', NULL, NULL),
17126         ('ElasticsearchIndexStatus_authorities', '0', 'Authorities index status', NULL, NULL)
17127     });
17128     SetVersion($DBversion);
17129     print "Upgrade to $DBversion done (Bug 19893 - Add elasticsearch index status preferences)\n";
17130 }
17131
17132 $DBversion = '18.06.00.062';
17133 if( CheckVersion( $DBversion ) ) {
17134     $dbh->do( "INSERT IGNORE INTO authorised_value_categories (category_name) VALUES ('PA_CLASS');");
17135     SetVersion( $DBversion );
17136     print "Upgrade to $DBversion done (Bug 21730: Add new authorised value category PA_CLASS)\n";
17137 }
17138
17139 $DBversion = '18.11.00.000';
17140 if( CheckVersion( $DBversion ) ) {
17141     SetVersion( $DBversion );
17142     print "Upgrade to $DBversion done (18.11.00 release)\n";
17143 }
17144
17145 $DBversion = '18.12.00.000';
17146 if( CheckVersion( $DBversion ) ) {
17147     SetVersion( $DBversion );
17148     print "Upgrade to $DBversion done (...and Steven!)\n";
17149 }
17150
17151 $DBversion = '18.12.00.001';
17152 if( CheckVersion( $DBversion ) ) {
17153     $dbh->do(q{
17154         UPDATE permissions SET code = 'manage_didyoumean' WHERE code = 'manage_didyouean';
17155     });
17156     $dbh->do(q{
17157         UPDATE user_permissions SET code = 'manage_didyoumean' WHERE code = 'manage_didyouean';
17158     });
17159     SetVersion( $DBversion );
17160     print "Upgrade to $DBversion (Bug 21961 - Fix typo in manage_didyoumean permission)\n";
17161 }
17162
17163 $DBversion = '18.12.00.002';
17164 if( CheckVersion( $DBversion ) ) {
17165     my $sth = $dbh->prepare(q|SELECT * FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE CONSTRAINT_NAME='accountlines_ibfk_1'|);
17166     $sth->execute;
17167     if ($sth->fetchrow_hashref) {
17168         $dbh->do(q|
17169             ALTER TABLE accountlines DROP FOREIGN KEY accountlines_ibfk_1;
17170         |);
17171         $dbh->do(q|
17172             ALTER TABLE accountlines CHANGE COLUMN borrowernumber borrowernumber INT(11) DEFAULT NULL;
17173         |);
17174         $dbh->do(q|
17175             ALTER TABLE accountlines ADD CONSTRAINT accountlines_ibfk_borrowers FOREIGN KEY (borrowernumber) REFERENCES borrowers (borrowernumber) ON DELETE SET NULL ON UPDATE CASCADE;
17176         |);
17177     }
17178     SetVersion( $DBversion );
17179     print "Upgrade to $DBversion done (Bug 21065 - Set ON DELETE SET NULL on accountlines.borrowernumber)\n";
17180 }
17181
17182 $DBversion = '18.12.00.003';
17183 if( CheckVersion( $DBversion ) ) {
17184     # On a new installation the class_sources.sql will have failed, so we need to add all missing data
17185     my( $sort_cnt ) = $dbh->selectrow_array( q|SELECT COUNT(*) FROM class_sort_rules|);
17186     if( !$sort_cnt ) {
17187         $dbh->do(q|INSERT INTO `class_sort_rules` (`class_sort_rule`, `description`, `sort_routine`) VALUES
17188                                ('dewey', 'Default filing rules for DDC', 'Dewey'),
17189                                ('lcc', 'Default filing rules for LCC', 'LCC'),
17190                                ('generic', 'Generic call number filing rules', 'Generic')
17191             |);
17192     }
17193
17194     my ( $split_cnt ) = $dbh->selectrow_array( q|SELECT COUNT(*) FROM class_split_rules|);
17195     if( !$split_cnt ) {
17196         $dbh->do(q|INSERT INTO `class_split_rules` (`class_split_rule`, `description`, `split_routine`) VALUES
17197                                ('dewey', 'Default splitting rules for DDC', 'Dewey'),
17198                                ('lcc', 'Default splitting rules for LCC', 'LCC'),
17199                                ('generic', 'Generic call number splitting rules', 'Generic')
17200             |);
17201     }
17202
17203     my( $source_cnt ) = $dbh->selectrow_array( q|SELECT COUNT(*) FROM class_sources|);
17204     if( !$source_cnt ) {
17205         $dbh->do(q|INSERT INTO `class_sources` (`cn_source`, `description`, `used`, `class_sort_rule`, `class_split_rule`) VALUES
17206                             ('ddc', 'Dewey Decimal Classification', 1, 'dewey', 'dewey'),
17207                             ('lcc', 'Library of Congress Classification', 1, 'lcc', 'lcc'),
17208                             ('udc', 'Universal Decimal Classification', 0, 'generic', 'generic'),
17209                             ('sudocs', 'SuDoc Classification (U.S. GPO)', 0, 'generic', 'generic'),
17210                             ('anscr', 'ANSCR (Sound Recordings)', 0, 'generic', 'generic'),
17211                             ('z', 'Other/Generic Classification Scheme', 0, 'generic', 'generic')
17212             |);
17213
17214     }
17215
17216     SetVersion( $DBversion );
17217     print "Upgrade to $DBversion done (Bug 22024 - Add missing splitting rule definitions)\n";
17218 }
17219
17220 $DBversion = '18.12.00.004';
17221 if( CheckVersion( $DBversion ) ) {
17222     if( !column_exists( 'accountlines', 'branchcode' ) ) {
17223         $dbh->do("ALTER TABLE accountlines ADD branchcode VARCHAR( 10 ) NULL DEFAULT NULL AFTER manager_id");
17224         $dbh->do("ALTER TABLE accountlines ADD CONSTRAINT accountlines_ibfk_branches FOREIGN KEY (branchcode) REFERENCES branches (branchcode) ON DELETE SET NULL ON UPDATE CASCADE");
17225     }
17226     SetVersion( $DBversion );
17227     print "Upgrade to $DBversion done (Bug 19066 - Add branchcode to accountlines)\n";
17228 }
17229
17230 $DBversion = '18.12.00.005';
17231 if( CheckVersion( $DBversion ) ) {
17232     $dbh->do(q{
17233         INSERT IGNORE INTO systempreferences ( `variable`, `value`, `options`, `explanation`, `type` ) VALUES
17234         ('OverDriveUsername','cardnumber','cardnumber|userid','Which patron information should be passed as OverDrive username','Choice')
17235     });
17236     SetVersion( $DBversion );
17237     print "Upgrade to $DBversion done (Bug 22030: Add OverDriveUsername syspref)\n";
17238 }
17239
17240 $DBversion = '18.12.00.006';
17241 if( CheckVersion( $DBversion ) ) {
17242     $dbh->do(q{
17243         INSERT IGNORE INTO systempreferences (variable,value,explanation,options,type) VALUES
17244         ('AccountAutoReconcile','0','If enabled, patron balances will get reconciled automatically on each transaction.',NULL,'YesNo');
17245     });
17246     SetVersion($DBversion);
17247     print "Upgrade to $DBversion done (Bug 21915 - Add a way to automatically reconcile balance for patrons)\n";
17248 }
17249
17250 $DBversion = '18.12.00.007';
17251 if( CheckVersion( $DBversion ) ) {
17252     if( column_exists( 'issuingrules', 'chargename' ) ) {
17253         $dbh->do( "ALTER TABLE issuingrules DROP chargename" );
17254     }
17255     SetVersion( $DBversion );
17256     print "Upgrade to $DBversion done (Bug 21753: Drop chargename from issuingrules )\n";
17257 }
17258
17259 $DBversion = '18.12.00.008';
17260 if( CheckVersion( $DBversion ) ) {
17261     if( !column_exists( 'subscription', 'mana_id' ) ) {
17262         $dbh->do( "ALTER TABLE subscription ADD mana_id int(11) NULL DEFAULT NULL" );
17263     }
17264
17265     if( !column_exists( 'saved_sql', 'mana_id' ) ) {
17266         $dbh->do( "ALTER TABLE saved_sql ADD mana_id int(11) NULL DEFAULT NULL" );
17267     }
17268     $dbh->do(q{
17269         INSERT IGNORE INTO systempreferences ( `variable`, `value`, `options`, `explanation`, `type` ) VALUES
17270         ('Mana','2',NULL,'request to Mana Webservice. Mana centralize common information between other Koha to facilitate the creation of new subscriptions, vendors, report queries etc... You can search, share, import and comment the content of Mana.','Choice');
17271     });
17272     $dbh->do(q{
17273         INSERT IGNORE INTO systempreferences ( `variable`, `value`, `options`, `explanation`, `type` ) VALUES
17274         ('AutoShareWithMana','','','defines datas automatically shared with mana','multiple');
17275     });
17276     $dbh->do(q{
17277         INSERT IGNORE INTO systempreferences ( `variable`, `value`, `options`, `explanation`, `type` ) VALUES
17278         ('ManaToken','',NULL,'Security token used for authentication on Mana KB service (anti spam)','Textarea');
17279     });
17280     SetVersion( $DBversion );
17281     print "Upgrade to $DBversion done (Bug 17047 - Mana knowledge base)\n";
17282 }
17283
17284 $DBversion = '18.12.00.009';
17285 if( CheckVersion( $DBversion ) ) {
17286     $dbh->do(q{
17287         INSERT IGNORE INTO systempreferences (variable, value, options, explanation, type) VALUES ('FallbackToSMSIfNoEmail', 0, 'Enable|Disable', 'Send messages by SMS if no patron email is defined', 'YesNo');
17288     });
17289     SetVersion( $DBversion );
17290     print "Upgrade to $DBversion done (Bug 21241 - Add FallbackToSMSIfNoEmail syspref )\n";
17291 }
17292
17293 $DBversion = '18.12.00.010';
17294 if( CheckVersion( $DBversion ) ) {
17295     $dbh->do(q{
17296         INSERT IGNORE INTO systempreferences
17297             ( variable, value, options, explanation, type )
17298         VALUES
17299             ('RESTPublicAPI','1',NULL,'If enabled, the REST API will expose the /public endpoints.','YesNo')
17300     });
17301
17302     # Always end with this (adjust the bug info)
17303     SetVersion( $DBversion );
17304     print "Upgrade to $DBversion done (Bug 22061 - Add a /public namespace that can be switched on/off)\n";
17305 }
17306
17307 $DBversion = '18.12.00.011';
17308 if( CheckVersion( $DBversion ) ) {
17309     if ( column_exists( 'biblio_metadata', 'marcflavour' ) ) {
17310         $dbh->do(q{
17311             ALTER TABLE biblio_metadata
17312                 CHANGE COLUMN marcflavour `schema` VARCHAR(16)
17313         });
17314     }
17315     if ( column_exists( 'deletedbiblio_metadata', 'marcflavour' ) ) {
17316         $dbh->do(q{
17317             ALTER TABLE deletedbiblio_metadata
17318                 CHANGE COLUMN marcflavour `schema` VARCHAR(16)
17319         });
17320     }
17321     SetVersion( $DBversion );
17322     print "Upgrade to $DBversion done (Bug 22155 - biblio_metadata.marcflavour should be renamed 'schema')\n";
17323 }
17324
17325 $DBversion = '18.12.00.012';
17326 if( CheckVersion( $DBversion ) ) {
17327     $dbh->do(q{
17328         INSERT IGNORE INTO systempreferences
17329             (variable, value, options, explanation, type )
17330         VALUES
17331             ('RESTBasicAuth','0',NULL,'If enabled, Basic authentication is enabled for the REST API.','YesNo')
17332     });
17333     SetVersion( $DBversion );
17334     print "Upgrade to $DBversion done (Bug 22132 - Add Basic authentication)\n";
17335 }
17336
17337 $DBversion = '18.12.00.013';
17338 if( CheckVersion( $DBversion ) ) {
17339     $dbh->do(q{
17340         INSERT IGNORE INTO permissions (module_bit, code, description) VALUES ( 3, 'manage_mana', 'Manage Mana KB content sharing');
17341     });
17342     SetVersion( $DBversion );
17343     print "Upgrade to $DBversion done (Bug 22198 - Add ghranular permission setting for Mana KB)\n";
17344 }
17345
17346 $DBversion = '18.12.00.014';
17347 if( CheckVersion( $DBversion ) ) {
17348     unless( foreign_key_exists( 'messages', 'messages_borrowernumber' ) ) {
17349         $dbh->do(q|
17350             DELETE m FROM messages m
17351             LEFT JOIN borrowers b ON m.borrowernumber=b.borrowernumber
17352             WHERE b.borrowernumber IS NULL
17353         |);
17354         $dbh->do(q|
17355             ALTER TABLE messages
17356             ADD CONSTRAINT messages_borrowernumber
17357             FOREIGN KEY (borrowernumber) REFERENCES borrowers (borrowernumber) ON DELETE CASCADE ON UPDATE CASCADE
17358         |);
17359     }
17360     SetVersion( $DBversion );
17361     print "Upgrade to $DBversion done (Bug 13515 - Add a FOREIGN KEY constaint on messages.borrowernumber)\n";
17362 }
17363
17364 $DBversion = '18.12.00.015';
17365 if( CheckVersion( $DBversion ) ) {
17366     $dbh->do( "UPDATE action_logs SET info = REPLACE(info,'cardnumber_replaced','cardnumber'), timestamp = timestamp WHERE module='MEMBERS' AND action='MODIFY'" );
17367     $dbh->do( "UPDATE action_logs SET info = REPLACE(info,'previous_cardnumber','before'), timestamp = timestamp WHERE module='MEMBERS' AND action='MODIFY'" );
17368     $dbh->do( "UPDATE action_logs SET info = REPLACE(info,'new_cardnumber','after'), timestamp = timestamp WHERE module='MEMBERS' AND action='MODIFY'" );
17369
17370     SetVersion( $DBversion );
17371     print "Upgrade to $DBversion done (Bug 3820 - Update patron modification logs)\n";
17372 }
17373
17374 $DBversion = '18.12.00.016';
17375 if( CheckVersion( $DBversion ) ) {
17376
17377     if ( !column_exists( 'illrequests', 'status_alias' ) ) {
17378         # Fresh upgrade, just add the column and constraint
17379         $dbh->do( "ALTER TABLE illrequests ADD COLUMN status_alias varchar(80) DEFAULT NULL AFTER status" );
17380     } else {
17381         # Migrate all existing foreign keys from referencing authorised_values.id
17382         # to referencing authorised_values.authorised_value
17383         # First remove the foreign key constraint and index
17384         if ( foreign_key_exists( 'illrequests', 'illrequests_safk' ) ) {
17385             $dbh->do( "ALTER TABLE illrequests DROP FOREIGN KEY illrequests_safk");
17386         }
17387         if ( index_exists( 'illrequests', 'illrequests_safk' ) ) {
17388             $dbh->do( "DROP INDEX illrequests_safk ON illrequests" );
17389         }
17390         # Now change the illrequests.status_alias column definition from int to varchar
17391         $dbh->do( "ALTER TABLE illrequests MODIFY COLUMN status_alias varchar(80)" );
17392         # Now replace all references to authorised_values.id with their
17393         # corresponding authorised_values.authorised_value
17394         my $sth = $dbh->prepare( "SELECT illrequest_id, status_alias FROM illrequests WHERE status_alias IS NOT NULL" );
17395         $sth->execute();
17396         while (my @row = $sth->fetchrow_array()) {
17397             my $r_id = $row[0];
17398             my $av_id = $row[1];
17399             # Get the authorised value's authorised_value value
17400             my ($av_val) = $dbh->selectrow_array( "SELECT authorised_value FROM authorised_values WHERE id = ?", {}, $av_id );
17401             # Now update illrequests.status_alias
17402             if ($av_val) {
17403                 $dbh->do( "UPDATE illrequests SET status_alias = ? WHERE illrequest_id = ?", {}, ($av_val, $r_id) );
17404             }
17405         }
17406     }
17407     if ( !foreign_key_exists( 'illrequests', 'illrequests_safk' ) ) {
17408         $dbh->do( "ALTER TABLE illrequests ADD CONSTRAINT illrequests_safk FOREIGN KEY (status_alias) REFERENCES authorised_values(authorised_value) ON UPDATE CASCADE ON DELETE SET NULL" );
17409     }
17410     $dbh->do( "INSERT IGNORE INTO authorised_value_categories SET category_name = 'ILLSTATUS'");
17411
17412     SetVersion( $DBversion );
17413     print "Upgrade to $DBversion done (Bug 20581 - Allow manual selection of custom ILL request statuses)\n";
17414 }
17415
17416 $DBversion = '18.12.00.017';
17417 if( CheckVersion( $DBversion ) ) {
17418     $dbh->do(q{
17419         INSERT IGNORE INTO account_offset_types ( type ) VALUES ( 'fine_increase' ), ( 'fine_decrease' );
17420     });
17421     $dbh->do(q{
17422         UPDATE account_offsets SET type = 'fine_increase' WHERE type = 'Fine Update' AND amount > 0;
17423     });
17424     $dbh->do(q{
17425         UPDATE account_offsets SET type = 'fine_decrease' WHERE type = 'Fine Update' AND amount < 0;
17426     });
17427
17428     $dbh->do(q{
17429         DELETE FROM account_offset_types WHERE type = 'Fine Update';
17430     });
17431     SetVersion( $DBversion );
17432     print "Upgrade to $DBversion done (Bug 21747 - Update account_offset_types to include 'fine_increase' and 'fine_decrease')\n";
17433 }
17434
17435 $DBversion = '18.12.00.018';
17436 if( CheckVersion( $DBversion ) ) {
17437   $dbh->do( "UPDATE `search_field` SET `name` = 'date-of-publication', `label` = 'date-of-publication' WHERE `name` = 'pubdate'" );
17438   $dbh->do( "UPDATE `search_field` SET `name` = 'title-series', `label` = 'title-series' WHERE `name` = 'se'" );
17439   $dbh->do( "UPDATE `search_field` SET `name` = 'identifier-standard', `label` = 'identifier-standard' WHERE `name` = 'identifier-standard'" );
17440   $dbh->do( "UPDATE `search_field` SET `name` = 'author', `label` = 'author' WHERE `name` = 'author'" );
17441   $dbh->do( "UPDATE `search_field` SET `name` = 'control-number', `label` = 'control-number' WHERE `name` = 'control-number'" );
17442   $dbh->do( "UPDATE `search_field` SET `name` = 'place-of-publication', `label` = 'place-of-publication' WHERE `name` = 'place'" );
17443   $dbh->do( "UPDATE `search_field` SET `name` = 'date-of-acquisition', `label` = 'date-of-acquisition' WHERE `name` = 'acqdate'" );
17444   $dbh->do( "UPDATE `search_field` SET `name` = 'isbn', `label` = 'isbn' WHERE `name` = 'isbn'" );
17445   $dbh->do( "UPDATE `search_field` SET `name` = 'koha-auth-number', `label` = 'koha-auth-number' WHERE `name` = 'an'" );
17446   $dbh->do( "UPDATE `search_field` SET `name` = 'subject', `label` = 'subject' WHERE `name` = 'subject'" );
17447   $dbh->do( "UPDATE `search_field` SET `name` = 'publisher', `label` = 'publisher' WHERE `name` = 'publisher'" );
17448   $dbh->do( "UPDATE `search_field` SET `name` = 'record-source', `label` = 'record-source' WHERE `name` = 'record-source'" );
17449   $dbh->do( "UPDATE `search_field` SET `name` = 'title', `label` = 'title' WHERE `name` = 'title'" );
17450   $dbh->do( "UPDATE `search_field` SET `name` = 'local-classification', `label` = 'local-classification' WHERE `name` = 'local-classification'" );
17451   $dbh->do( "UPDATE `search_field` SET `name` = 'bib-level', `label` = 'bib-level' WHERE `name` = 'bib-level'" );
17452   $dbh->do( "UPDATE `search_field` SET `name` = 'microform-generation', `label` = 'microform-generation' WHERE `name` = 'microform-generation'" );
17453   $dbh->do( "UPDATE `search_field` SET `name` = 'material-type', `label` = 'material-type' WHERE `name` = 'material-type'" );
17454   $dbh->do( "UPDATE `search_field` SET `name` = 'bgf-number', `label` = 'bgf-number' WHERE `name` = 'bgf-number'" );
17455   $dbh->do( "UPDATE `search_field` SET `name` = 'number-db', `label` = 'number-db' WHERE `name` = 'number-db'" );
17456   $dbh->do( "UPDATE `search_field` SET `name` = 'number-natl-biblio', `label` = 'number-natl-biblio' WHERE `name` = 'number-natl-biblio'" );
17457   $dbh->do( "UPDATE `search_field` SET `name` = 'number-legal-deposit', `label` = 'number-legal-deposit' WHERE `name` = 'number-legal-deposit'" );
17458   $dbh->do( "UPDATE `search_field` SET `name` = 'issn', `label` = 'issn' WHERE `name` = 'issn'" );
17459   $dbh->do( "UPDATE `search_field` SET `name` = 'local-number', `label` = 'local-number' WHERE `name` = 'local-number'" );
17460   $dbh->do( "UPDATE `search_field` SET `name` = 'suppress', `label` = 'supress' WHERE `name` = 'suppress'" );
17461   $dbh->do( "UPDATE `search_field` SET `name` = 'bnb-card-number', `label` = 'bnb-card-number' WHERE `name` = 'bnb-card-number'" );
17462   $dbh->do( "UPDATE `search_field` SET `name` = 'date/time-last-modified', `label` = 'date/time-last-modified' WHERE `name` = 'date-time-last-modified'" );
17463   $dbh->do( "DELETE FROM `search_field` WHERE `name` = 'lc-cardnumber'" );
17464   $dbh->do( "DELETE FROM `search_marc_map` WHERE `id` NOT IN(SELECT `search_marc_map_id` FROM `search_marc_to_field`)" );
17465   SetVersion( $DBversion );
17466   print "Upgrade to $DBversion done (Bug 19575 - Use canonical field names and resolve aliased fields)\n";
17467 }
17468
17469 $DBversion = '18.12.00.019';
17470 if( CheckVersion( $DBversion ) ) {
17471     $dbh->do(q{
17472         INSERT IGNORE INTO account_offset_types ( type ) VALUES ( 'Reserve Fee' );
17473     });
17474
17475     SetVersion( $DBversion );
17476     print "Upgrade to $DBversion done (Bug 21728 - Add 'Reserve Fee' to the account_offset_types table if missing)\n";
17477 }
17478
17479 $DBversion = '18.12.00.020';
17480 if( CheckVersion( $DBversion ) ) {
17481     if ( TableExists( 'branch_borrower_circ_rules' ) ) {
17482         if ( column_exists( 'branch_borrower_circ_rules', 'maxissueqty' ) ) {
17483             $dbh->do("
17484                 INSERT INTO circulation_rules ( categorycode, branchcode, itemtype, rule_name, rule_value )
17485                 SELECT categorycode, branchcode, NULL, 'patron_maxissueqty', COALESCE( maxissueqty, '' )
17486                 FROM branch_borrower_circ_rules
17487             ");
17488             $dbh->do("
17489                 INSERT INTO circulation_rules ( categorycode, branchcode, itemtype, rule_name, rule_value )
17490                 SELECT categorycode, branchcode, NULL, 'patron_maxonsiteissueqty', COALESCE( maxonsiteissueqty, '' )
17491                 FROM branch_borrower_circ_rules
17492             ");
17493             $dbh->do("DROP TABLE branch_borrower_circ_rules");
17494         }
17495     }
17496
17497     if ( TableExists( 'default_borrower_circ_rules' ) ) {
17498         if ( column_exists( 'default_borrower_circ_rules', 'maxissueqty' ) ) {
17499             $dbh->do("
17500                 INSERT INTO circulation_rules ( categorycode, branchcode, itemtype, rule_name, rule_value )
17501                 SELECT categorycode, NULL, NULL, 'patron_maxissueqty', COALESCE( maxissueqty, '' )
17502                 FROM default_borrower_circ_rules
17503             ");
17504             $dbh->do("
17505                 INSERT INTO circulation_rules ( categorycode, branchcode, itemtype, rule_name, rule_value )
17506                 SELECT categorycode, NULL, NULL, 'patron_maxonsiteissueqty', COALESCE( maxonsiteissueqty, '' )
17507                 FROM default_borrower_circ_rules
17508             ");
17509             $dbh->do("DROP TABLE default_borrower_circ_rules");
17510         }
17511     }
17512
17513     if ( column_exists( 'default_circ_rules', 'maxissueqty' ) ) {
17514         $dbh->do("
17515             INSERT INTO circulation_rules ( categorycode, branchcode, itemtype, rule_name, rule_value )
17516             SELECT NULL, NULL, NULL, 'patron_maxissueqty', COALESCE( maxissueqty, '' )
17517             FROM default_circ_rules
17518         ");
17519         $dbh->do("
17520             INSERT INTO circulation_rules ( categorycode, branchcode, itemtype, rule_name, rule_value )
17521             SELECT NULL, NULL, NULL, 'patron_maxonsiteissueqty', COALESCE( maxonsiteissueqty, '' )
17522             FROM default_circ_rules
17523         ");
17524         $dbh->do("ALTER TABLE default_circ_rules DROP COLUMN maxissueqty, DROP COLUMN maxonsiteissueqty");
17525     }
17526
17527     if ( column_exists( 'default_branch_circ_rules', 'maxissueqty' ) ) {
17528         $dbh->do("
17529             INSERT INTO circulation_rules ( categorycode, branchcode, itemtype, rule_name, rule_value )
17530             SELECT NULL, branchcode, NULL, 'patron_maxissueqty', COALESCE( maxissueqty, '' )
17531             FROM default_branch_circ_rules
17532         ");
17533         $dbh->do("
17534             INSERT INTO circulation_rules ( categorycode, branchcode, itemtype, rule_name, rule_value )
17535             SELECT NULL, NULL, NULL, 'patron_maxonsiteissueqty', COALESCE( maxonsiteissueqty, '' )
17536             FROM default_branch_circ_rules
17537         ");
17538         $dbh->do("ALTER TABLE default_branch_circ_rules DROP COLUMN maxissueqty, DROP COLUMN maxonsiteissueqty");
17539     }
17540
17541     if ( column_exists( 'issuingrules', 'maxissueqty' ) ) {
17542         # Cleaning invalid rules before, to avoid FK contraints to fail
17543         $dbh->do(q|
17544             DELETE FROM issuingrules WHERE categorycode != '*' AND categorycode NOT IN (SELECT categorycode FROM categories);
17545         |);
17546         $dbh->do(q|
17547             DELETE FROM issuingrules WHERE branchcode != '*' AND branchcode NOT IN (SELECT branchcode FROM branches);
17548         |);
17549         $dbh->do(q|
17550             DELETE FROM issuingrules WHERE itemtype != '*' AND itemtype NOT IN (SELECT itemtype FROM itemtypes);
17551         |);
17552
17553         $dbh->do("
17554             INSERT INTO circulation_rules ( categorycode, branchcode, itemtype, rule_name, rule_value )
17555             SELECT IF(categorycode='*', NULL, categorycode),
17556                    IF(branchcode='*', NULL, branchcode),
17557                    IF(itemtype='*', NULL, itemtype),
17558                    'maxissueqty',
17559                    COALESCE( maxissueqty, '' )
17560             FROM issuingrules
17561         ");
17562         $dbh->do("
17563             INSERT INTO circulation_rules ( categorycode, branchcode, itemtype, rule_name, rule_value )
17564             SELECT IF(categorycode='*', NULL, categorycode),
17565                    IF(branchcode='*', NULL, branchcode),
17566                    IF(itemtype='*', NULL, itemtype),
17567                    'maxonsiteissueqty',
17568                    COALESCE( maxonsiteissueqty, '' )
17569             FROM issuingrules
17570         ");
17571         $dbh->do("ALTER TABLE issuingrules DROP COLUMN maxissueqty, DROP COLUMN maxonsiteissueqty");
17572     }
17573
17574     SetVersion( $DBversion );
17575     print "Upgrade to $DBversion done (Bug 18925 - Move maxissueqty and maxonsiteissueqty to circulation_rules)\n";
17576 }
17577
17578 $DBversion = '18.12.00.021';
17579 if ( CheckVersion($DBversion) ) {
17580
17581     if ( !column_exists( 'itemtypes', 'rentalcharge_daily' ) ) {
17582         $dbh->do("ALTER TABLE `itemtypes` ADD COLUMN `rentalcharge_daily` decimal(28,6) default NULL AFTER `rentalcharge`");
17583     }
17584
17585     if ( !column_exists( 'itemtypes', 'rentalcharge_hourly' ) ) {
17586         $dbh->do("ALTER TABLE `itemtypes` ADD COLUMN `rentalcharge_hourly` decimal(28,6) default NULL AFTER `rentalcharge_daily`");
17587     }
17588
17589     if ( column_exists( 'itemtypes', 'rental_charge_daily' ) ) {
17590         $dbh->do("UPDATE `itemtypes` SET `rentalcharge_daily` = `rental_charge_daily`");
17591         $dbh->do("ALTER TABLE `itemtypes` DROP COLUMN `rental_charge_daily`");
17592     }
17593
17594     SetVersion($DBversion);
17595     print "Upgrade to $DBversion done (Bug 20912 - Support granular rental charges)\n";
17596 }
17597
17598 $DBversion = '18.12.00.022';
17599 if( CheckVersion( $DBversion ) ) {
17600     $dbh->do( q{
17601         INSERT IGNORE INTO permissions (module_bit,code,description)
17602         VALUES
17603         (3,'manage_additional_fields','Add, edit, or delete additional custom fields for baskets or subscriptions (also requires order_manage or edit_subscription permissions)')
17604     });
17605     $dbh->do( q{
17606         INSERT INTO user_permissions (borrowernumber, module_bit, code)
17607         SELECT borrowernumber, 3, 'manage_additional_fields' FROM borrowers WHERE borrowernumber IN (SELECT DISTINCT borrowernumber FROM user_permissions WHERE code = 'order_manage' OR code = 'edit_subscription');
17608     });
17609     $dbh->do( q{
17610         INSERT INTO user_permissions (borrowernumber, module_bit, code)
17611         SELECT borrowernumber, 3, 'manage_additional_fields' FROM borrowers WHERE borrowernumber IN (SELECT borrowernumber FROM borrowers WHERE MOD(flags DIV POWER(2,11),2)=1 OR MOD(flags DIV POWER(2,15),2) =1);
17612     });
17613     SetVersion( $DBversion );
17614     print "Upgrade to $DBversion done (Bug 15774 - Add permission for managing additional fields)\n";
17615 }
17616
17617 $DBversion = '18.12.00.023';
17618 if( CheckVersion( $DBversion ) ) {
17619     $dbh->do(q|
17620       INSERT IGNORE INTO systempreferences (variable,value,explanation,options,type)
17621       VALUES ('ILLOpacbackends',NULL,NULL,'ILL backends to enabled for OPAC initiated requests','multiple');
17622     |);
17623
17624     # Always end with this (adjust the bug info)
17625     SetVersion( $DBversion );
17626     print "Upgrade to $DBversion done (Bug 20639 - Add ILLOpacbackends syspref)\n";
17627 }
17628
17629 $DBversion = '18.12.00.024';
17630 if ( CheckVersion($DBversion) ) {
17631
17632     # Fixup any pre-existing bad suggestedby, manageddate, accepteddate dates
17633     eval {
17634         local $dbh->{PrintError} = 0;
17635         $dbh->do(
17636             "UPDATE suggestions SET suggesteddate = '1970-01-01' WHERE suggesteddate = '0000-00-00';"
17637         );
17638         $dbh->do(
17639             "UPDATE suggestions SET manageddate = '1970-01-01' WHERE manageddate = '0000-00-00';"
17640         );
17641         $dbh->do(
17642             "UPDATE suggestions SET accepteddate = '1970-01-01' WHERE accepteddate = '0000-00-00';"
17643         );
17644     };
17645
17646     # Add constraint for suggestedby
17647     unless ( foreign_key_exists( 'suggestions', 'suggestions_ibfk_suggestedby' ) )
17648     {
17649         $dbh->do(
17650 "ALTER TABLE suggestions CHANGE COLUMN suggestedby suggestedby INT(11) NULL DEFAULT NULL;"
17651         );
17652         $dbh->do(
17653 "UPDATE suggestions LEFT JOIN borrowers ON (suggestions.suggestedby = borrowers.borrowernumber) SET suggestedby = null WHERE borrowernumber IS null"
17654         );
17655         $dbh->do(
17656 "ALTER TABLE suggestions ADD CONSTRAINT `suggestions_ibfk_suggestedby` FOREIGN KEY (`suggestedby`) REFERENCES `borrowers` (`borrowernumber`) ON DELETE SET NULL ON UPDATE CASCADE"
17657         );
17658     }
17659
17660     # Add constraint for managedby
17661     unless ( foreign_key_exists( 'suggestions', 'suggestions_ibfk_managedby' ) )
17662     {
17663         $dbh->do(
17664 "UPDATE suggestions LEFT JOIN borrowers ON (suggestions.managedby = borrowers.borrowernumber) SET managedby = null WHERE borrowernumber IS NULL"
17665         );
17666         $dbh->do(
17667 "ALTER TABLE suggestions ADD CONSTRAINT `suggestions_ibfk_managedby` FOREIGN KEY (`managedby`) REFERENCES `borrowers` (`borrowernumber`) ON DELETE SET NULL ON UPDATE CASCADE"
17668         );
17669     }
17670
17671     # Add constraint for acceptedby
17672     unless (
17673         foreign_key_exists( 'suggestions', 'suggestions_ibfk_acceptedby' ) )
17674     {
17675         $dbh->do(
17676 "UPDATE suggestions LEFT JOIN borrowers ON (suggestions.acceptedby = borrowers.borrowernumber) SET acceptedby = null WHERE borrowernumber IS NULL"
17677         );
17678         $dbh->do(
17679 "ALTER TABLE suggestions ADD CONSTRAINT `suggestions_ibfk_acceptedby` FOREIGN KEY (`acceptedby`) REFERENCES `borrowers` (`borrowernumber`) ON DELETE SET NULL ON UPDATE CASCADE"
17680         );
17681     }
17682
17683     # Add constraint for rejectedby
17684     unless (
17685         foreign_key_exists( 'suggestions', 'suggestions_ibfk_rejectedby' ) )
17686     {
17687         $dbh->do(
17688 "UPDATE suggestions LEFT JOIN borrowers ON (suggestions.rejectedby = borrowers.borrowernumber) SET rejectedby = null WHERE borrowernumber IS null"
17689         );
17690         $dbh->do(
17691 "ALTER TABLE suggestions ADD CONSTRAINT `suggestions_ibfk_rejectedby` FOREIGN KEY (`rejectedby`) REFERENCES `borrowers` (`borrowernumber`) ON DELETE SET NULL ON UPDATE CASCADE"
17692         );
17693     }
17694
17695     # Add constraint for biblionumber
17696     unless (
17697         foreign_key_exists( 'suggestions', 'suggestions_ibfk_biblionumber' ) )
17698     {
17699         $dbh->do(
17700 "UPDATE suggestions s LEFT JOIN biblio b ON (s.biblionumber = b.biblionumber) SET s.biblionumber = null WHERE b.biblionumber IS null"
17701         );
17702         $dbh->do(
17703 "ALTER TABLE suggestions ADD CONSTRAINT `suggestions_ibfk_biblionumber` FOREIGN KEY (`biblionumber`) REFERENCES `biblio` (`biblionumber`) ON DELETE SET NULL ON UPDATE CASCADE"
17704         );
17705     }
17706
17707     # Add constraint for branchcode
17708     unless (
17709         foreign_key_exists( 'suggestions', 'suggestions_ibfk_branchcode' ) )
17710     {
17711         $dbh->do(
17712 "UPDATE suggestions s LEFT JOIN branches b ON (s.branchcode = b.branchcode) SET s.branchcode = null WHERE b.branchcode IS null"
17713         );
17714         $dbh->do(
17715 "ALTER TABLE suggestions ADD CONSTRAINT `suggestions_ibfk_branchcode` FOREIGN KEY (`branchcode`) REFERENCES `branches` (`branchcode`) ON DELETE SET NULL ON UPDATE CASCADE"
17716         );
17717     }
17718
17719     SetVersion($DBversion);
17720     print
17721 "Upgrade to $DBversion done (Bug 22368 - Add missing constraints to suggestions)\n";
17722 }
17723
17724 $DBversion = '18.12.00.025';
17725 if( CheckVersion( $DBversion ) ) {
17726
17727     $dbh->do('SET FOREIGN_KEY_CHECKS=0');
17728
17729     # Change columns accordingly
17730     $dbh->do(q{
17731         ALTER TABLE tags_index
17732             MODIFY COLUMN term VARCHAR(191) COLLATE utf8mb4_bin NOT NULL;
17733     });
17734
17735     $dbh->do(q{
17736         ALTER TABLE tags_approval
17737             MODIFY COLUMN term VARCHAR(191) COLLATE utf8mb4_bin NOT NULL;
17738     });
17739
17740     $dbh->do(q{
17741         ALTER TABLE tags_all
17742             MODIFY COLUMN term VARCHAR(191) COLLATE utf8mb4_bin NOT NULL;
17743     });
17744
17745     $dbh->do('SET FOREIGN_KEY_CHECKS=1');
17746
17747     SetVersion( $DBversion );
17748     print "Upgrade to $DBversion done (Bug 21846 - Using emoji as tags has broken weights)\n";
17749     my $maintenance_script = C4::Context->config("intranetdir") . "/misc/maintenance/fix_tags_weight.pl";
17750     print "WARNING: (Bug 21846) You need to manually run $maintenance_script to fix possible issues with tags.\n";
17751 }
17752
17753 $DBversion = '18.12.00.026';
17754 if( CheckVersion( $DBversion ) ) {
17755     $dbh->do( "INSERT IGNORE INTO systempreferences (variable, value, explanation, type) VALUES ('IllLog', 0, 'If ON, log information about ILL requests', 'YesNo')" );
17756
17757     SetVersion( $DBversion );
17758     print "Upgrade to $DBversion done (Bug 20750 - Allow timestamped auditing of ILL request events)\n";
17759 }
17760
17761 $DBversion = '18.12.00.027';
17762 if( CheckVersion( $DBversion ) ) {
17763     $dbh->do(q{
17764 INSERT IGNORE INTO systempreferences (variable,value,explanation,options,type) VALUES
17765        ('ILLModuleUnmediated','0','','If enabled, try to immediately progress newly placed ILL requests.','YesNo');
17766     });
17767     SetVersion( $DBversion );
17768     print "Upgrade to $DBversion done (Bug 18837: Add ILLModuleUnmediated Syspref)\n";
17769 }
17770
17771 $DBversion = '18.12.00.028';
17772 if( CheckVersion( $DBversion ) ) {
17773     $dbh->do(q{
17774         INSERT IGNORE INTO account_offset_types ( type ) VALUES ( 'Account Fee' );
17775     });
17776
17777     $dbh->do(q{
17778         INSERT IGNORE INTO account_offset_types ( type ) VALUES ( 'Hold Expired' );
17779     });
17780
17781     SetVersion( $DBversion );
17782     print "Upgrade to $DBversion done (Bug 21756 - Add 'Account Fee' and 'Hold Expired' to the account_offset_types table if missing)\n";
17783 }
17784
17785 $DBversion = '18.12.00.029';
17786 if( CheckVersion( $DBversion ) ) {
17787     $dbh->do( "INSERT IGNORE INTO systempreferences (variable,value,explanation,options,type) VALUES ('OrderPriceRounding',NULL,'Local preference for rounding orders before calculations to ensure correct calculations','|nearest_cent','Choice')" );
17788
17789     SetVersion( $DBversion );
17790     print "Upgrade to $DBversion done (Bug 18736 - Add syspref to control order rounding)\n";
17791 }
17792
17793 $DBversion = '18.12.00.030';
17794 if( CheckVersion( $DBversion ) ) {
17795     if( column_exists( 'accountlines', 'accountno' ) ) {
17796         $dbh->do( "ALTER TABLE accountlines DROP COLUMN accountno" );
17797     }
17798     if( column_exists( 'statistics', 'proccode' ) ) {
17799         $dbh->do( "ALTER TABLE statistics DROP COLUMN proccode" );
17800     }
17801     SetVersion( $DBversion );
17802     print "Upgrade to $DBversion done (Bug 21683 - Remove accountlines.accountno and statistics.proccode fields)\n";
17803 }
17804
17805 $DBversion = '18.12.00.031';
17806 if( CheckVersion( $DBversion ) ) {
17807
17808     # Add constraint for manager_id
17809     unless( foreign_key_exists( 'accountlines', 'accountlines_ibfk_borrowers_2' ) ) {
17810         $dbh->do("ALTER TABLE accountlines CHANGE COLUMN manager_id manager_id INT(11) NULL DEFAULT NULL");
17811         $dbh->do("UPDATE accountlines a LEFT JOIN borrowers b ON ( a.manager_id = b.borrowernumber) SET a.manager_id = NULL WHERE b.borrowernumber IS NULL");
17812         $dbh->do("ALTER TABLE accountlines ADD CONSTRAINT `accountlines_ibfk_borrowers_2` FOREIGN KEY (`manager_id`) REFERENCES `borrowers` (`borrowernumber`) ON DELETE SET NULL ON UPDATE CASCADE");
17813     }
17814
17815     # Rename accountlines_ibfk_2 to accountlines_ibfk_items
17816     if ( foreign_key_exists( 'accountlines', 'accountlines_ibfk_2' ) ) {
17817         $dbh->do("ALTER TABLE accountlines DROP FOREIGN KEY accountlines_ibfk_2");
17818     }
17819     unless ( foreign_key_exists( 'accountlines', 'accountlines_ibfk_items' ) ) {
17820         $dbh->do("ALTER TABLE accountlines ADD CONSTRAINT `accountlines_ibfk_items` FOREIGN KEY (`itemnumber`) REFERENCES `items` (`itemnumber`) ON DELETE SET NULL ON UPDATE CASCADE");
17821     }
17822
17823     SetVersion( $DBversion );
17824     print "Upgrade to $DBversion done (Bug 22008 - Add missing constraints for accountlines.manager_id)\n";
17825 }
17826
17827 $DBversion = '18.12.00.032';
17828 if( CheckVersion( $DBversion ) ) {
17829     if( !column_exists( 'search_field', 'facet_order' ) ) {
17830         $dbh->do("ALTER TABLE search_field ADD COLUMN facet_order TINYINT(4) DEFAULT NULL AFTER weight");
17831     }
17832     $dbh->do("UPDATE search_field SET facet_order=1 WHERE name='author'");
17833     $dbh->do("UPDATE search_field SET facet_order=2 WHERE name='itype'");
17834     $dbh->do("UPDATE search_field SET facet_order=3 WHERE name='location'");
17835     $dbh->do("UPDATE search_field SET facet_order=4 WHERE name='su-geo'");
17836     $dbh->do("UPDATE search_field SET facet_order=5 WHERE name='title-series'");
17837     $dbh->do("UPDATE search_field SET facet_order=6 WHERE name='subject'");
17838     $dbh->do("UPDATE search_field SET facet_order=7 WHERE name='ccode'");
17839     $dbh->do("UPDATE search_field SET facet_order=8 WHERE name='holdingbranch'");
17840     $dbh->do("UPDATE search_field SET facet_order=9 WHERE name='homebranch'");
17841     SetVersion( $DBversion );
17842     print "Upgrade to $DBversion done (Bug 18235 - Elastic search - make facets configurable)\n";
17843 }
17844
17845 $DBversion = '18.12.00.033';
17846 if( CheckVersion( $DBversion ) ) {
17847     $dbh->do( "UPDATE search_field SET facet_order=10 WHERE name='ln'" );
17848     SetVersion( $DBversion );
17849     print "Upgrade to $DBversion done (Bug 18213 - Add language facets to Elasticsearch)\n";
17850 }
17851
17852 $DBversion = '18.12.00.034';
17853 if( CheckVersion( $DBversion ) ) {
17854
17855     if ( column_exists( 'accountlines', 'lastincrement' ) ) {
17856         $dbh->do("ALTER TABLE `accountlines` DROP COLUMN `lastincrement`");
17857     }
17858
17859     SetVersion( $DBversion );
17860     print "Upgrade to $DBversion done (Bug 22516 - Drop deprecated accountlines.lastincrement field)\n";
17861 }
17862
17863 $DBversion = '18.12.00.035';
17864 if( CheckVersion( $DBversion ) ) {
17865     $dbh->do( "INSERT IGNORE INTO systempreferences (variable, value, options, explanation, type)
17866                VALUES ('MaxItemsToDisplayForBatchMod','1000',NULL,'Display up to a given number of items in a single item modification batch.','Integer')"
17867             );
17868     SetVersion( $DBversion );
17869     print "Upgrade to $DBversion done (Bug 19722 - Add a MaxItemsToDisplayForBatchMod preference)\n";
17870 }
17871
17872 $DBversion = '18.12.00.036';
17873 if ( CheckVersion($DBversion) ) {
17874
17875     my $rows = $dbh->do(
17876         qq{
17877         UPDATE `accountlines`
17878         SET
17879           `accounttype` = 'FU'
17880         WHERE
17881           `accounttype` = 'O'
17882       }
17883     );
17884
17885     SetVersion($DBversion);
17886     printf "Upgrade to $DBversion done (Bug 22518 - Fix accounttype 'O' to 'FU' - %d updated)\n", $rows;
17887 }
17888
17889 $DBversion = '18.12.00.037';
17890 if( CheckVersion( $DBversion ) ) {
17891
17892     $dbh->do( "UPDATE issues SET renewals = 0 WHERE renewals IS NULL" );
17893     $dbh->do( "UPDATE old_issues SET renewals = 0 WHERE renewals IS NULL" );
17894
17895     $dbh->do( "ALTER TABLE issues MODIFY COLUMN renewals tinyint(4) NOT NULL default 0");
17896     $dbh->do( "ALTER TABLE old_issues MODIFY COLUMN renewals tinyint(4) NOT NULL default 0");
17897
17898     # Always end with this (adjust the bug info)
17899     SetVersion( $DBversion );
17900     print "Upgrade to $DBversion done (Bug 22607 - Set default value of issues.renewals to 0)\n";
17901 }
17902
17903 $DBversion = '18.12.00.038';
17904 if ( CheckVersion($DBversion) ) {
17905
17906     if ( !column_exists( 'accountlines', 'status' ) ) {
17907         $dbh->do(
17908             qq{
17909             ALTER TABLE `accountlines`
17910             ADD
17911               `status` varchar(16) DEFAULT NULL
17912             AFTER
17913               `accounttype`
17914           }
17915         );
17916     }
17917
17918     SetVersion($DBversion);
17919     print "Upgrade to $DBversion done (Bug 22512 - Add status to accountlines)\n";
17920 }
17921
17922 $DBversion = '18.12.00.039';
17923 if ( CheckVersion($DBversion) ) {
17924
17925     if ( !column_exists( 'accountlines', 'interface' ) ) {
17926         $dbh->do(
17927             qq{
17928             ALTER TABLE `accountlines`
17929             ADD
17930               `interface` varchar(16)
17931             AFTER
17932               `manager_id`;
17933           }
17934         );
17935     }
17936
17937     $dbh->do(qq{
17938         UPDATE
17939           `accountlines`
17940         SET
17941           interface = 'opac'
17942         WHERE
17943           borrowernumber = manager_id;
17944     });
17945
17946     $dbh->do(qq{
17947         UPDATE
17948           `accountlines`
17949         SET
17950           interface = 'cron'
17951         WHERE
17952           manager_id IS NULL
17953         AND
17954           branchcode IS NULL;
17955     });
17956
17957     $dbh->do(qq{
17958         UPDATE
17959           `accountlines`
17960         SET
17961           interface = 'intranet'
17962         WHERE
17963           interface IS NULL;
17964     });
17965
17966     $dbh->do(qq{
17967         ALTER TABLE `accountlines`
17968         MODIFY COLUMN `interface` varchar(16) NOT NULL;
17969     });
17970
17971     SetVersion($DBversion);
17972     print "Upgrade to $DBversion done (Bug 22600 - Add interface to accountlines)\n";
17973 }
17974
17975 $DBversion = '18.12.00.040';
17976 if( CheckVersion( $DBversion ) ) {
17977     $dbh->do("UPDATE accountlines SET description = REPLACE(description, 'Reserve Charge - ', '') WHERE description LIKE 'Reserve Charge - %'");
17978     SetVersion( $DBversion );
17979     print "Upgrade to $DBversion done (Bug 12166 - Remove 'Reserve Charge' text from accountlines description)\n";
17980 }
17981
17982 $DBversion = '18.12.00.041';
17983 if( CheckVersion( $DBversion ) ) {
17984     my $table_sth = $dbh->prepare('SHOW CREATE TABLE `search_marc_map`');
17985     $table_sth->execute();
17986     my @table = $table_sth->fetchrow_array();
17987     unless ( $table[1] =~ /`marc_field`.*COLLATE utf8mb4_bin/ ) { #catches utf8mb4 collated tables
17988         $dbh->do("ALTER TABLE `search_marc_map` MODIFY `marc_field` VARCHAR(255) NOT NULL COLLATE utf8mb4_bin COMMENT 'the MARC specifier for this field'");
17989     }
17990
17991     # Always end with this (adjust the bug info)
17992     SetVersion( $DBversion );
17993         print "Upgrade to $DBversion done (Bug 19670 - Change collation of marc_field to allow mixed case search field mappings)\n";
17994 }
17995
17996 $DBversion = '18.12.00.042';
17997 if( CheckVersion( $DBversion ) ) {
17998     $dbh->do( "UPDATE systempreferences SET value = 'default' WHERE variable = 'XSLTDetailsDisplay' AND value = ''" );
17999     SetVersion( $DBversion );
18000     print "Upgrade to $DBversion done (Bug 29891 - Remove non-XSLT detail view in the staff client)\n";
18001 }
18002
18003 $DBversion = '18.12.00.043';
18004 if ( CheckVersion($DBversion) ) {
18005     $dbh->do("UPDATE accountlines SET description = REPLACE(description, 'Lost Item ', '') WHERE description LIKE 'Lost Item %'");
18006     SetVersion($DBversion);
18007     print "Upgrade to $DBversion done (Bug 21953 - Remove 'Lost Item' text from accountlines description)\n";
18008 }
18009
18010 $DBversion = '18.12.00.044';
18011 if( CheckVersion( $DBversion ) ) {
18012
18013     if ( !column_exists( 'categories', 'reset_password' ) ) {
18014         $dbh->do(q{
18015             ALTER TABLE categories
18016                 ADD COLUMN reset_password TINYINT(1) NULL DEFAULT NULL
18017                 AFTER checkprevcheckout
18018         });
18019     }
18020
18021     SetVersion( $DBversion );
18022     print "Upgrade to $DBversion done (Bug 21890 - Patron password reset by category)\n";
18023 }
18024
18025 $DBversion = '18.12.00.045';
18026 if( CheckVersion( $DBversion ) ) {
18027
18028     if ( !column_exists( 'categories', 'change_password' ) ) {
18029         $dbh->do(q{
18030             ALTER TABLE categories
18031                 ADD COLUMN change_password TINYINT(1) NULL DEFAULT NULL
18032                 AFTER reset_password
18033         });
18034     }
18035
18036     SetVersion( $DBversion );
18037     print "Upgrade to $DBversion done (Bug 10796 - Patron password change by category)\n";
18038 }
18039
18040 $DBversion = '18.12.00.046';
18041 if( CheckVersion( $DBversion ) ) {
18042     $dbh->do( "UPDATE systempreferences SET value = 'default' WHERE variable = 'XSLTResultsDisplay' AND value = ''" );
18043     SetVersion( $DBversion );
18044     print "Upgrade to $DBversion done (Bug 22695 - Remove non-XSLT search results view from the staff client)\n";
18045 }
18046
18047 $DBversion = '18.12.00.047';
18048 if( CheckVersion( $DBversion ) ) {
18049     $dbh->do(q|
18050         INSERT IGNORE INTO systempreferences (variable,value,explanation,options,type) VALUES ('LibrisKey', '', 'This key must be obtained at http://api.libris.kb.se/. It is unique for the IP of the server.', NULL, 'Free');
18051     |);
18052     $dbh->do(q|
18053         INSERT IGNORE INTO systempreferences (variable,value,explanation,options,type) VALUES ('LibrisURL', 'http://api.libris.kb.se/bibspell/', 'This is the base URL for the Libris spellchecking API.',NULL,'Free');
18054     |);
18055     SetVersion( $DBversion );
18056     print "Upgrade to $DBversion done (Bug 14557: Add Libris spellchecking system preferences)\n";
18057 }
18058
18059 $DBversion = '18.12.00.048';
18060 if( CheckVersion( $DBversion ) ) {
18061     $dbh->do( q{
18062         INSERT IGNORE INTO systempreferences (variable,value,explanation,options,type)
18063         VALUES ('NoRenewalBeforePrecision', 'exact_time', 'Calculate "No renewal before" based on date or exact time. Only relevant for loans calculated in days, hourly loans are not affected.', 'date|exact_time', 'Choice');
18064     });
18065     $dbh->do("UPDATE systempreferences SET value='exact_time' WHERE variable='NoRenewalBeforePrecision' AND value IS NULL;" );
18066     SetVersion( $DBversion );
18067     print "Upgrade to $DBversion done (Bug 22044 - Set a default value for NoRenewalBeforePrecision)\n";
18068 }
18069
18070 $DBversion = '18.12.00.049';
18071 if( CheckVersion( $DBversion ) ) {
18072
18073     $dbh->do(q{
18074         ALTER TABLE borrowers
18075             ADD COLUMN flgAnonymized tinyint DEFAULT 0
18076             AFTER overdrive_auth_token
18077     }) if !column_exists('borrowers', 'flgAnonymized');
18078
18079     $dbh->do(q{
18080         ALTER TABLE deletedborrowers
18081             ADD COLUMN flgAnonymized tinyint DEFAULT 0
18082             AFTER overdrive_auth_token
18083     }) if !column_exists('deletedborrowers', 'flgAnonymized');
18084
18085     SetVersion( $DBversion );
18086     print "Upgrade to $DBversion done (Bug 21336 - Add field flgAnonymized)\n";
18087 }
18088
18089 $DBversion = '18.12.00.050';
18090 if( CheckVersion( $DBversion ) ) {
18091     $dbh->do( q|
18092 INSERT IGNORE INTO systempreferences ( `variable`, `value`, `options`, `explanation`, `type` )
18093 VALUES
18094 ('UnsubscribeReflectionDelay','',NULL,'Delay for locking unsubscribers', 'Integer'),
18095 ('PatronAnonymizeDelay','',NULL,'Delay for anonymizing patrons', 'Integer'),
18096 ('PatronRemovalDelay','',NULL,'Delay for removing anonymized patrons', 'Integer')
18097     |);
18098     SetVersion( $DBversion );
18099     print "Upgrade to $DBversion done (Bug 21336 - Add preferences)\n";
18100 }
18101
18102 $DBversion = '18.12.00.051';
18103 if( CheckVersion( $DBversion ) ) {
18104     my $failed_attempts = C4::Context->preference('FailedLoginAttempts');
18105     $dbh->do( "UPDATE borrowers SET login_attempts = ? WHERE login_attempts > ?", undef, $failed_attempts, $failed_attempts ) if $failed_attempts && $failed_attempts > 0;
18106     SetVersion( $DBversion );
18107     print "Upgrade to $DBversion done (Bug 21336 - Reset login_attempts)\n";
18108 }
18109
18110 $DBversion = '18.12.00.052';
18111 if( CheckVersion( $DBversion ) ) {
18112     $dbh->do(q{
18113         INSERT IGNORE INTO systempreferences ( `variable`, `value`, `options`, `explanation`, `type` ) VALUES
18114         ('OpacMoreSearches', '', NULL, 'Add additional elements to the OPAC more searches bar', 'Textarea')
18115     } );
18116
18117     SetVersion( $DBversion );
18118     print "Upgrade to $DBversion done (Bug 22311 - Add a SysPref to allow adding content to the #moresearches div in the opac)\n";
18119 }
18120
18121 $DBversion = '18.12.00.053';
18122 if( CheckVersion( $DBversion ) ) {
18123     $dbh->do(q{
18124         INSERT IGNORE INTO `systempreferences` (`variable`, `value`, `options`, `explanation`, `type`) VALUES
18125         ('AutoReturnCheckedOutItems', '0', '', 'If disabled, librarian must confirm return of checked out item when checking out to another.', 'YesNo');
18126     });
18127
18128     SetVersion( $DBversion );
18129     print "Upgrade to $DBversion done (Bug 17171 - Add a syspref to allow currently issued items to be issued to a new patron without staff confirmation)\n";
18130 }
18131
18132 $DBversion = '18.12.00.054';
18133 if( CheckVersion( $DBversion ) ) {
18134     $dbh->do(q{
18135         INSERT IGNORE permissions (module_bit, code, description)
18136         VALUES
18137         (9,'advanced_editor','Use the advanced cataloging editor')
18138     });
18139     if( C4::Context->preference('EnableAdvancedCatalogingEditor') ){
18140         $dbh->do(q{
18141             INSERT INTO user_permissions (borrowernumber, module_bit, code)
18142             SELECT borrowernumber, 9, 'advanced_editor' FROM borrowers WHERE borrowernumber IN (SELECT DISTINCT borrowernumber FROM user_permissions WHERE code = 'edit_catalogue');
18143         });
18144     }
18145     SetVersion( $DBversion );
18146     print "Upgrade to $DBversion done (Bug 20128: Add permission for Advanced Cataloging Editor)\n";
18147 }
18148
18149 $DBversion = '18.12.00.055';
18150 if ( CheckVersion($DBversion) ) {
18151
18152     $dbh->do(qq{
18153         UPDATE
18154           `account_offset_types`
18155         SET
18156           type = 'OVERDUE'
18157         WHERE
18158           type = 'Fine';
18159     });
18160
18161     $dbh->do(qq{
18162         UPDATE
18163           `account_offset_types`
18164         SET
18165           type = 'OVERDUE_INCREASE'
18166         WHERE
18167           type = 'fine_increase';
18168     });
18169
18170     $dbh->do(qq{
18171         UPDATE
18172           `account_offset_types`
18173         SET
18174           type = 'OVERDUE_DECREASE'
18175         WHERE
18176           type = 'fine_decrease';
18177     });
18178
18179     if ( column_exists( 'accountlines', 'accounttype' ) ) {
18180         $dbh->do(
18181             qq{
18182             ALTER TABLE `accountlines`
18183             CHANGE COLUMN `accounttype`
18184               `accounttype` varchar(16) DEFAULT NULL;
18185           }
18186         );
18187     }
18188
18189     $dbh->do(qq{
18190         UPDATE
18191           accountlines
18192         SET
18193           accounttype = 'OVERDUE',
18194           status = 'UNRETURNED'
18195         WHERE
18196           accounttype = 'FU';
18197     });
18198
18199     $dbh->do(qq{
18200         UPDATE
18201           accountlines
18202         SET
18203           accounttype = 'OVERDUE',
18204           status = 'FORGIVEN'
18205         WHERE
18206           accounttype = 'FFOR';
18207     });
18208
18209     $dbh->do(qq{
18210         UPDATE
18211           accountlines
18212         SET
18213           accounttype = 'OVERDUE',
18214           status = 'RETURNED'
18215         WHERE
18216           accounttype = 'F';
18217     });
18218     SetVersion($DBversion);
18219     print "Upgrade to $DBversion done (Bug 22521 - Update accountlines.accounttype to varchar(16), and map new statuses)\n";
18220 }
18221
18222 $DBversion = '18.12.00.056';
18223 if( CheckVersion( $DBversion ) ) {
18224     $dbh->do( "UPDATE systempreferences SET explanation = 'This syspref allows to define custom rules for hiding specific items at the OPAC. See http://wiki.koha-community.org/wiki/OpacHiddenItems for more information.' WHERE variable = 'OpacHiddenItems'");
18225     SetVersion( $DBversion );
18226     print "Upgrade to $DBversion done (Bug 8701 - Update OpacHiddenItems system preference description)\n";
18227 }
18228
18229 $DBversion = '18.12.00.057';
18230 if( CheckVersion( $DBversion ) ) {
18231     if( column_exists('statistics', 'associatedborrower') ) {
18232         $dbh->do(q{ ALTER TABLE statistics DROP COLUMN associatedborrower });
18233     }
18234     if( column_exists('statistics', 'usercode') ) {
18235         $dbh->do(q{ ALTER TABLE statistics DROP COLUMN usercode });
18236     }
18237
18238     SetVersion($DBversion);
18239     print "Upgrade to $DBversion done (Bug 13795 - Delete unused fields from statistics table)\n";
18240 }
18241
18242 $DBversion = '18.12.00.058';
18243 if( CheckVersion( $DBversion ) ) {
18244     my $opaclang = C4::Context->preference("opaclanguages");
18245     my @langs;
18246     push @langs, split ( '\,', $opaclang );
18247     # Get any existing value from the OpacNavRight system preference
18248     my ($OpacNavRight) = $dbh->selectrow_array( q|
18249         SELECT value FROM systempreferences WHERE variable='OpacNavRight';
18250     |);
18251     if( $OpacNavRight ){
18252         # If there is a value in the OpacNavRight preference, insert it into opac_news
18253         $dbh->do("INSERT INTO opac_news (branchcode, lang, title, content ) VALUES (NULL, ?, '', ?)", undef, "OpacNavRight_$langs[0]", $OpacNavRight);
18254     }
18255     # Remove the OpacNavRight system preference
18256     $dbh->do("DELETE FROM systempreferences WHERE variable='OpacNavRight'");
18257     SetVersion ($DBversion);
18258     print "Upgrade to $DBversion done (Bug 22318: Move contents of OpacNavRight preference to Koha news system)\n";
18259 }
18260
18261 $DBversion = '18.12.00.059';
18262 if( CheckVersion( $DBversion ) ) {
18263     if( column_exists( 'import_records', 'z3950random' ) ) {
18264         $dbh->do( "ALTER TABLE import_records DROP COLUMN z3950random" );
18265     }
18266
18267     # Always end with this (adjust the bug info)
18268     SetVersion( $DBversion );
18269     print "Upgrade to $DBversion done (Bug 22532 - Remove import_records z3950random column)\n";
18270 }
18271
18272 $DBversion = '18.12.00.060';
18273 if ( CheckVersion($DBversion) ) {
18274
18275     my $rows = $dbh->do(
18276         qq{
18277         UPDATE `accountlines`
18278         SET
18279           `accounttype` = 'L',
18280           `status`      = 'REPLACED'
18281         WHERE
18282           `accounttype` = 'Rep'
18283       }
18284     );
18285
18286     SetVersion($DBversion);
18287     printf "Upgrade to $DBversion done (Bug 22564 - Fix accounttype 'Rep' - %d updated)\n", $rows;
18288 }
18289
18290 $DBversion = '18.12.00.061';
18291 if( CheckVersion( $DBversion ) ) {
18292
18293     if ( column_exists( 'borrowers', 'flgAnonymized' ) ) {
18294         $dbh->do(q{
18295             UPDATE borrowers SET flgAnonymized = 0 WHERE flgAnonymized IS NULL
18296         });
18297         $dbh->do(q{
18298             ALTER TABLE borrowers
18299                 CHANGE `flgAnonymized` `anonymized` TINYINT(1) NOT NULL DEFAULT 0
18300         });
18301     }
18302
18303     if ( column_exists( 'deletedborrowers', 'flgAnonymized' ) ) {
18304         $dbh->do(q{
18305             UPDATE deletedborrowers SET flgAnonymized = 0 WHERE flgAnonymized IS NULL
18306         });
18307         $dbh->do(q{
18308             ALTER TABLE deletedborrowers
18309                 CHANGE `flgAnonymized` `anonymized` TINYINT(1) NOT NULL DEFAULT 0
18310         });
18311     }
18312
18313     SetVersion( $DBversion );
18314     print "Upgrade to $DBversion done (Bug 21336 - (follow-up) Rename flgAnonymized column)\n";
18315 }
18316
18317 $DBversion = '18.12.00.062';
18318 if( CheckVersion( $DBversion ) ) {
18319     $dbh->do( q|
18320         UPDATE search_marc_map SET marc_field='007_/0'
18321           WHERE marc_type IN ('marc21', 'normarc') AND marc_field='007_/1' AND id IN
18322             (SELECT search_marc_map_id FROM search_marc_to_field WHERE search_field_id IN
18323               (SELECT id FROM search_field WHERE label='ff7-00')
18324             )
18325     |);
18326
18327     $dbh->do( q|
18328         UPDATE search_marc_map SET marc_field='007_/1'
18329           WHERE marc_type IN ('marc21', 'normarc') AND marc_field='007_/2' AND id IN
18330             (SELECT search_marc_map_id FROM search_marc_to_field WHERE search_field_id IN
18331               (SELECT id FROM search_field WHERE label='ff7-01')
18332             )
18333     |);
18334
18335     $dbh->do( q|
18336         UPDATE search_marc_map SET marc_field='007_/2'
18337           WHERE marc_type IN ('marc21', 'normarc') AND marc_field='007_/3' AND id IN
18338             (SELECT search_marc_map_id FROM search_marc_to_field WHERE search_field_id IN
18339               (SELECT id FROM search_field WHERE label='ff7-02')
18340             )
18341     |);
18342
18343     # N.B. ff7-01-02 really is 00-01!
18344     $dbh->do( q|
18345         UPDATE search_marc_map SET marc_field='007_/0-1'
18346           WHERE marc_type IN ('marc21', 'normarc') AND marc_field='007_/1-2' AND id IN
18347             (SELECT search_marc_map_id FROM search_marc_to_field WHERE search_field_id IN
18348               (SELECT id FROM search_field WHERE label='ff7-01-02')
18349             )
18350     |);
18351
18352     $dbh->do( q|
18353         UPDATE search_marc_map SET marc_field='008_/0-5'
18354           WHERE marc_type IN ('marc21', 'normarc') AND marc_field='008_/1-5' AND id IN
18355             (SELECT search_marc_map_id FROM search_marc_to_field WHERE search_field_id IN
18356               (SELECT id FROM search_field WHERE label='date-entered-on-file')
18357             )
18358     |);
18359
18360     $dbh->do( q|
18361         UPDATE search_marc_map SET marc_field='leader_/0-4'
18362           WHERE marc_type IN ('marc21', 'normarc') AND marc_field='leader_/1-5' AND id IN
18363             (SELECT search_marc_map_id FROM search_marc_to_field WHERE search_field_id IN
18364               (SELECT id FROM search_field WHERE label='llength')
18365             )
18366     |);
18367
18368     # Always end with this (adjust the bug info)
18369     SetVersion( $DBversion );
18370     print "Upgrade to $DBversion done (Bug 22339 - Fix search field mappings of MARC fixed fields)\n";
18371 }
18372
18373 $DBversion = '18.12.00.063';
18374 if ( CheckVersion($DBversion) ) {
18375
18376     my $types_map = {
18377         'Writeoff'      => 'W',
18378         'Payment'       => 'Pay',
18379         'Lost Item'     => 'CR',
18380         'Manual Credit' => 'C',
18381         'Forgiven'      => 'FOR'
18382     };
18383
18384     my $sth = $dbh->prepare( "SELECT accountlines_id FROM accountlines WHERE accounttype = 'VOID'" );
18385     my $sth2 = $dbh->prepare( "SELECT type FROM account_offsets WHERE credit_id = ? ORDER BY created_on LIMIT 1" );
18386     my $sth3 = $dbh->prepare( "UPDATE accountlines SET accounttype = ?, status = 'VOID' WHERE accountlines_id = ?" );
18387     $sth->execute();
18388     while (my $row = $sth->fetchrow_hashref) {
18389         $sth2->execute($row->{accountlines_id});
18390         my $result = $sth2->fetchrow_hashref;
18391         my $type = $types_map->{$result->{'type'}} // 'Pay';
18392         $sth3->execute($type,$row->{accountlines_id});
18393     }
18394
18395     SetVersion($DBversion);
18396     print "Upgrade to $DBversion done (Bug 22511 - Update existing VOID accountlines)\n";
18397 }
18398
18399 $DBversion = '18.12.00.064';
18400 if( CheckVersion( $DBversion ) ) {
18401     $dbh->do(q{
18402         INSERT IGNORE INTO systempreferences (variable,value,options,explanation,type) VALUES ('UpdateItemLocationOnCheckin', 'PROC: _PERM_\n', 'NULL', 'This is a list of value pairs.\n Examples:\n PROC: FIC - causes an item in the Processing Center location to be updated into the Fiction location on check in.\n FIC: GEN - causes an item in the Fiction location to be updated into the General stacks location on check in.\n _BLANK_:FIC - causes an item that has no location to be updated into the Fiction location on check in.\nFIC: _BLANK_ - causes an item in location FIC to be updated to a blank location on check in.\n_ALL_:FIC - causes all items to be updated into the Fiction location on check in.\nPROC: _PERM_ - causes an item that is in the Processing Center to be updated to it''s permanent location.\nGeneral rule: if the location value on the left matches the item''s current location, it will be updated to match the location value on the right.\nNote: PROC and CART are special values, for these locations only can location and permanent_location differ, in all other cases an update will affect both. Items in the CART location will be returned to their permanent location on checkout.\nThe special term _BLANK_ may be used on either side of a value pair to update or remove the location from items with no location assigned. The special term _ALL_ is used on the left side of the colon (:) to affect all items.\nThe special term _PERM_ is used on the right side of the colon (:) to return items to their permanent location.', 'Free');
18403     });
18404     $dbh->do(q{
18405         UPDATE systempreferences s1, (SELECT IF(value,'PROC: CART\n','') AS p2c FROM systempreferences WHERE variable='InProcessingToShelvingCart') s2 SET s1.value= CONCAT(s2.p2c, REPLACE(s1.value,'PROC: _PERM_\n','') ) WHERE s1.variable='UpdateItemLocationOnCheckin' AND s1.value NOT LIKE '%PROC: CART%';
18406     });
18407     $dbh->do(q{
18408         DELETE FROM systempreferences WHERE variable='InProcessingToShelvingCart';
18409     });
18410     $dbh->do(q{
18411         UPDATE systempreferences s1, (SELECT IF(value,'_ALL_: CART\n','') AS rtc FROM systempreferences WHERE variable='ReturnToShelvingCart') s2 SET s1.value= CONCAT(s2.rtc,s1.value) WHERE s1.variable='UpdateItemLocationOnCheckin' AND s1.value NOT LIKE '%_ALL_: CART%';
18412     });
18413     $dbh->do(q{
18414         DELETE FROM systempreferences WHERE variable='ReturnToShelvingCart';
18415     });
18416     SetVersion( $DBversion );
18417     print "Upgrade to $DBversion done (Bug 14576: Add UpdateItemLocationOnCheckin syspref)\n";
18418 }
18419
18420 $DBversion = '18.12.00.065';
18421 if( CheckVersion( $DBversion ) ) {
18422     $dbh->do( q{
18423         INSERT IGNORE INTO systempreferences ( `variable`, `value`, `options`, `explanation`, `type` )
18424         SELECT 'IndependentBranchesTransfers', value, NULL, 'Allow non-superlibrarians to transfer items between libraries','YesNo'
18425         FROM systempreferences WHERE variable = 'IndependentBranches'
18426     });
18427     SetVersion( $DBversion );
18428     print "Upgrade to $DBversion done (Bug 10300 - Allow transferring of items to be have separate IndependentBranches syspref)\n";
18429 }
18430
18431 $DBversion = '18.12.00.066';
18432 if ( CheckVersion($DBversion) ) {
18433     $dbh->do(q{
18434         INSERT IGNORE INTO `systempreferences` (`variable`, `value`, `explanation`, `options`, `type`) VALUES
18435           ('OpenURLResolverURL', '', 'URL of OpenURL Resolver', NULL, 'Free'),
18436           ('OpenURLText', '', 'Text of OpenURL links (or image title if OpenURLImageLocation is defined)', NULL, 'Free'),
18437           ('OpenURLImageLocation', '', 'Location of image for OpenURL links', NULL, 'Free'),
18438           ('OPACShowOpenURL', '', 'Enable display of OpenURL links in OPAC search results and detail page', NULL, 'YesNo'),
18439           ('OPACOpenURLItemTypes', '', 'Show the OpenURL link only for these item types', NULL, 'Free');
18440     });
18441
18442     SetVersion($DBversion);
18443     print
18444 "Upgrade to $DBversion done (Bug 8995 - Add new preferences for OpenURLResolvers)\n";
18445 }
18446
18447 $DBversion = '18.12.00.067';
18448 if ( CheckVersion($DBversion) ) {
18449     $dbh->do(q{
18450         INSERT IGNORE INTO systempreferences (variable,value,options,explanation,type)
18451         VALUES ('SendAllEmailsTo','',NULL,'All emails will be redirected to this email if it is not empty','free');
18452     });
18453     SetVersion($DBversion);
18454     print
18455 "Upgrade to $DBversion done (Bug 8000 - Add new preferences for SendAllEmailsTo)\n";
18456 }
18457
18458 $DBversion = '18.12.00.068';
18459 if ( CheckVersion($DBversion) ) {
18460     $dbh->do(q{
18461         INSERT IGNORE INTO systempreferences (variable,value,explanation,options,type) VALUES
18462         ('AllowRenewalOnHoldOverride','0','','If on, allow items on hold to be renewed with a specified due date','YesNo');
18463     });
18464     SetVersion($DBversion);
18465     print "Upgrade to $DBversion done (Bug 7088: Cannot renew items on hold even with override)\n";
18466 }
18467
18468 $DBversion = '18.12.00.069';
18469 if( CheckVersion( $DBversion ) ) {
18470
18471     $dbh->do(q{
18472         INSERT INTO plugin_data
18473             (plugin_class, plugin_key, plugin_value)
18474         SELECT
18475             plugin_class,
18476             '__ENABLED__',
18477             1
18478         FROM plugin_data
18479         WHERE plugin_key='__INSTALLED_VERSION__'
18480     });
18481
18482     # Always end with this (adjust the bug info)
18483     SetVersion( $DBversion );
18484     print "Upgrade to $DBversion done (Bug 22053 - enable all plugins)\n";
18485 }
18486
18487 $DBversion = '18.12.00.070';
18488 if ( CheckVersion($DBversion) ) {
18489     $dbh->do(q{
18490         INSERT IGNORE INTO systempreferences
18491             ( `variable`, `value`, `options`, `explanation`, `type` )
18492         VALUES
18493         ('SelfCheckAllowByIPRanges','',NULL,'(Leave blank if not used. Use ranges or simple ip addresses separated by spaces, like <code>192.168.1.1 192.168.0.0/24</code>.)','Short');
18494     });
18495     SetVersion($DBversion);
18496     print "Upgrade to $DBversion done (Bug 14407 - Limit web-based self-checkout to specific IP addresses)\n";
18497 }
18498
18499 $DBversion = '18.12.00.071';
18500 if( CheckVersion( $DBversion ) ) {
18501     $dbh->do(q{
18502 INSERT IGNORE INTO `letter` (`module`, `code`, `branchcode`, `name`, `is_html`, `title`, `content`, `message_transport_type`, `lang`) VALUES
18503 ('circulation', 'ACCOUNT_CREDIT', '', 'Account payment', 0, 'Account payment', '<table>
18504 [% IF ( LibraryName ) %]
18505  <tr>
18506     <th colspan="4" class="centerednames">
18507         <h3>[% LibraryName | html %]</h3>
18508     </th>
18509  </tr>
18510 [% END %]
18511  <tr>
18512     <th colspan="4" class="centerednames">
18513         <h2><u>Fee receipt</u></h2>
18514     </th>
18515  </tr>
18516  <tr>
18517     <th colspan="4" class="centerednames">
18518         <h2>[% Branches.GetName( patron.branchcode ) | html %]</h2>
18519     </th>
18520  </tr>
18521  <tr>
18522     <th colspan="4">
18523         Received with thanks from  [% patron.firstname | html %] [% patron.surname | html %] <br />
18524         Card number: [% patron.cardnumber | html %]<br />
18525     </th>
18526  </tr>
18527   <tr>
18528     <th>Date</th>
18529     <th>Description of charges</th>
18530     <th>Note</th>
18531     <th>Amount</th>
18532  </tr>
18533
18534   [% FOREACH account IN accounts %]
18535     <tr class="highlight">
18536       <td>[% account.date | $KohaDates %]</td>
18537       <td>
18538         [% PROCESS account_type_description account=account %]
18539         [%- IF account.description %], [% account.description | html %][% END %]
18540       </td>
18541       <td>[% account.note | html %]</td>
18542       [% IF ( account.amountcredit ) %]<td class="credit">[% ELSE %]<td class="debit">[% END %][% account.amount | $Price %]</td>
18543     </tr>
18544
18545   [% END %]
18546 <tfoot>
18547   <tr>
18548     <td colspan="3">Total outstanding dues as on date: </td>
18549     [% IF ( totalcredit ) %]<td class="credit">[% ELSE %]<td class="debit">[% END %][% total | $Price %]</td>
18550   </tr>
18551 </tfoot>
18552 </table>', 'print', 'default');
18553     });
18554     SetVersion( $DBversion );
18555     print "Upgrade to $DBversion done (Bug 22809 - Move 'ACCOUNT_CREDIT' from template to a slip)\n";
18556 }
18557
18558 $DBversion = '18.12.00.072';
18559 if( CheckVersion( $DBversion ) ) {
18560     $dbh->do(q{
18561 INSERT IGNORE INTO `letter` (`module`, `code`, `branchcode`, `name`, `is_html`, `title`, `content`, `message_transport_type`, `lang`) VALUES
18562 ('circulation', 'ACCOUNT_DEBIT', '', 'Account fee', 0, 'Account fee', '<table>
18563   [% IF ( LibraryName ) %]
18564     <tr>
18565       <th colspan="5" class="centerednames">
18566         <h3>[% LibraryName | html %]</h3>
18567       </th>
18568     </tr>
18569   [% END %]
18570
18571   <tr>
18572     <th colspan="5" class="centerednames">
18573       <h2><u>INVOICE</u></h2>
18574     </th>
18575   </tr>
18576   <tr>
18577     <th colspan="5" class="centerednames">
18578       <h2>[% Branches.GetName( patron.branchcode ) | html %]</h2>
18579     </th>
18580   </tr>
18581   <tr>
18582     <th colspan="5" >
18583       Bill to: [% patron.firstname | html %] [% patron.surname | html %] <br />
18584       Card number: [% patron.cardnumber | html %]<br />
18585     </th>
18586   </tr>
18587   <tr>
18588     <th>Date</th>
18589     <th>Description of charges</th>
18590     <th>Note</th>
18591     <th style="text-align:right;">Amount</th>
18592     <th style="text-align:right;">Amount outstanding</th>
18593   </tr>
18594
18595   [% FOREACH account IN accounts %]
18596     <tr class="highlight">
18597       <td>[% account.date | $KohaDates%]</td>
18598       <td>
18599         [% PROCESS account_type_description account=account %]
18600         [%- IF account.description %], [% account.description | html %][% END %]
18601       </td>
18602       <td>[% account.note | html %]</td>
18603       [% IF ( account.amountcredit ) %]<td class="credit">[% ELSE %]<td class="debit">[% END %][% account.amount | $Price %]</td>
18604       [% IF ( account.amountoutstandingcredit ) %]<td class="credit">[% ELSE %]<td class="debit">[% END %][% account.amountoutstanding | $Price %]</td>
18605     </tr>
18606   [% END %]
18607
18608   <tfoot>
18609     <tr>
18610       <td colspan="4">Total outstanding dues as on date: </td>
18611       [% IF ( totalcredit ) %]<td class="credit">[% ELSE %]<td class="debit">[% END %][% total | $Price %]</td>
18612     </tr>
18613   </tfoot>
18614 </table>', 'print', 'default');
18615     });
18616     SetVersion( $DBversion );
18617     print "Upgrade to $DBversion done (Bug 22809 - Move 'INVOICE' from template to a slip)\n";
18618 }
18619
18620 $DBversion = '18.12.00.073';
18621 if( CheckVersion( $DBversion ) ) {
18622     $dbh->do( q{
18623             INSERT IGNORE INTO systempreferences (variable,value,options,explanation,type) VALUES
18624             ('EmailPurchaseSuggestions','0','0|EmailAddressForSuggestions|BranchEmailAddress|KohaAdminEmailAddress','Choose email address that will be sent new purchase suggestions','Choice'),
18625             ('EmailAddressForSuggestions','','','If you choose EmailAddressForSuggestions you should enter a valid email address','free')
18626     });
18627
18628     $dbh->do( q{
18629             INSERT IGNORE INTO `letter` (module, code, name, title, content, is_html, message_transport_type) VALUES
18630             ('suggestions','NEW_SUGGESTION','New suggestion','New suggestion','<h3>Suggestion pending approval</h3>
18631                 <p><h4>Suggested by</h4>
18632                     <ul>
18633                         <li><<borrowers.firstname>> <<borrowers.surname>></li>
18634                         <li><<borrowers.cardnumber>></li>
18635                         <li><<borrowers.phone>></li>
18636                         <li><<borrowers.email>></li>
18637                     </ul>
18638                 </p>
18639                 <p><h4>Title suggested</h4>
18640                     <ul>
18641                         <li><b>Library:</b> <<branches.branchname>></li>
18642                         <li><b>Title:</b> <<suggestions.title>></li>
18643                         <li><b>Author:</b> <<suggestions.author>></li>
18644                         <li><b>Copyright date:</b> <<suggestions.copyrightdate>></li>
18645                         <li><b>Standard number (ISBN, ISSN or other):</b> <<suggestions.isbn>></li>
18646                         <li><b>Publisher:</b> <<suggestions.publishercode>></li>
18647                         <li><b>Collection title:</b> <<suggestions.collectiontitle>></li>
18648                         <li><b>Publication place:</b> <<suggestions.place>></li>
18649                         <li><b>Quantity:</b> <<suggestions.quantity>></li>
18650                         <li><b>Item type:</b> <<suggestions.itemtype>></li>
18651                         <li><b>Reason for suggestion:</b> <<suggestions.patronreason>></li>
18652                         <li><b>Notes:</b> <<suggestions.note>></li>
18653                     </ul>
18654                 </p>',1, 'email')
18655     });
18656
18657     SetVersion( $DBversion );
18658     print "Upgrade to $DBversion done (Bug 5770 - Email librarian when purchase suggestion made)\n";
18659 }
18660
18661 $DBversion = '18.12.00.074';
18662 if( CheckVersion( $DBversion ) ) {
18663     unless ( TableExists( 'keyboard_shortcuts' ) ) {
18664         $dbh->do(q|
18665             CREATE TABLE keyboard_shortcuts (
18666             shortcut_name varchar(80) NOT NULL,
18667             shortcut_keys varchar(80) NOT NULL,
18668             PRIMARY KEY (shortcut_name)
18669             ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;|
18670         );
18671     }
18672     $dbh->do(q|
18673         INSERT IGNORE INTO keyboard_shortcuts (shortcut_name, shortcut_keys) VALUES
18674         ("insert_copyright","Alt-C"),
18675         ("insert_copyright_sound","Alt-P"),
18676         ("insert_delimiter","Ctrl-D"),
18677         ("subfield_help","Ctrl-H"),
18678         ("link_authorities","Shift-Ctrl-L"),
18679         ("delete_field","Ctrl-X"),
18680         ("delete_subfield","Shift-Ctrl-X"),
18681         ("new_line","Enter"),
18682         ("line_break","Shift-Enter"),
18683         ("next_position","Tab"),
18684         ("prev_position","Shift-Tab")
18685         ;|
18686     );
18687     $dbh->do(q|
18688         INSERT IGNORE permissions (module_bit, code, description)
18689         VALUES
18690         (3,'manage_keyboard_shortcuts','Manage keyboard shortcuts for advanced cataloging editor')
18691         ;|
18692     );
18693     SetVersion( $DBversion );
18694     print "Upgrade to $DBversion done (Bug 21411 - Add keyboard_shortcuts table)\n";
18695 }
18696
18697 $DBversion = '18.12.00.075';
18698 if( CheckVersion( $DBversion ) ) {
18699     # you can use $dbh here like:
18700     unless ( foreign_key_exists( 'tmp_holdsqueue', 'tmp_holdsqueue_ibfk_1' ) ) {
18701         $dbh->do(q{
18702             DELETE t FROM tmp_holdsqueue t
18703             LEFT JOIN items i ON t.itemnumber=i.itemnumber
18704             WHERE i.itemnumber IS NULL
18705         });
18706         $dbh->do(q{
18707             ALTER TABLE tmp_holdsqueue
18708             ADD CONSTRAINT `tmp_holdsqueue_ibfk_1` FOREIGN KEY (`itemnumber`)
18709             REFERENCES `items` (`itemnumber`) ON DELETE CASCADE ON UPDATE CASCADE
18710         });
18711     }
18712     SetVersion( $DBversion );
18713     print "Upgrade to $DBversion done (Bug 22899 - Add items constraint to tmp_holdsqueue)\n";
18714 }
18715
18716 $DBversion = '19.05.00.000';
18717 if( CheckVersion( $DBversion ) ) {
18718     SetVersion( $DBversion );
18719     print "Upgrade to $DBversion done (19.05.00 release)\n";
18720 }
18721
18722 $DBversion = '19.06.00.000';
18723 if( CheckVersion( $DBversion ) ) {
18724     SetVersion( $DBversion );
18725     print "Upgrade to $DBversion done (Wingardium Leviosa!)\n";
18726 }
18727
18728 $DBversion = '19.06.00.001'; 
18729 if( CheckVersion( $DBversion ) ) {
18730     $dbh->do( q{
18731         UPDATE systempreferences 
18732         SET explanation = 'This is a list of value pairs.\n Examples:\n PROC: FIC - causes an item in the Processing Center location to be updated into the Fiction location on check in.\n FIC: GEN - causes an item in the Fiction location to be updated into the General stacks location on check in.\n _BLANK_:FIC - causes an item that has no location to be updated into the Fiction location on check in.\nFIC: _BLANK_ - causes an item in location FIC to be updated to a blank location on check in.\n_ALL_:FIC - causes all items to be updated into the Fiction location on check in.\nPROC: _PERM_ - causes an item that is in the Processing Center to be updated to it''s permanent location.\nGeneral rule: if the location value on the left matches the item''s current location, it will be updated to match the location value on the right.\nNote: PROC and CART are special values, for these locations only can location and permanent_location differ, in all other cases an update will affect both. Items in the CART location will be returned to their permanent location on checkout.\nThe special term _BLANK_ may be used on either side of a value pair to update or remove the location from items with no location assigned. The special term _ALL_ is used on the left side of the colon (:) to affect all items.\nThe special term _PERM_ is used on the right side of the colon (:) to return items to their permanent location.' 
18733         WHERE variable = 'UpdateItemLocationOnCheckin'
18734     });
18735     SetVersion( $DBversion );
18736     print "Upgrade to $DBversion done (Bug 22960: Fix typo in syspref description)\n";
18737 }
18738
18739 $DBversion = '19.06.00.002';
18740 if ( CheckVersion($DBversion) ) {
18741
18742     $dbh->do(q{ALTER TABLE subscriptionhistory CHANGE opacnote opacnote LONGTEXT NULL});
18743     $dbh->do(q{ALTER TABLE subscriptionhistory CHANGE librariannote librariannote LONGTEXT NULL});
18744
18745     $dbh->do(q{UPDATE subscriptionhistory SET opacnote = NULL WHERE opacnote = ''});
18746     $dbh->do(q{UPDATE subscriptionhistory SET librariannote = NULL WHERE librariannote = ''});
18747
18748     SetVersion ($DBversion);
18749     print "Upgrade to $DBversion done (Bug 10215: Increase the size of opacnote and librariannote for table subscriptionhistory)\n";
18750 }
18751
18752 $DBversion = '19.06.00.003';
18753 if( CheckVersion( $DBversion ) ) {
18754     $dbh->do(q{UPDATE systempreferences SET value = REPLACE( value, ' ', '|' ) WHERE variable = 'UniqueItemFields'; });
18755
18756     SetVersion( $DBversion );
18757     print "Upgrade to $DBversion done (Bug 22867: UniqueItemFields preference value should be pipe-delimited)\n";
18758 }
18759
18760 $DBversion = '19.06.00.004';
18761 if( CheckVersion( $DBversion ) ) {
18762     $dbh->do( 'UPDATE language_descriptions SET description = "Griechisch (Modern 1453-)"
18763       WHERE subtag = "el" and type = "language" and lang ="de"' );
18764     SetVersion( $DBversion );
18765     print "Upgrade to $DBversion done (Bug 22770: Fix typo in language description for el in German)\n";
18766 }
18767
18768 $DBversion = '19.06.00.005';
18769 if( CheckVersion( $DBversion ) ) {
18770     unless ( column_exists( 'reserves', 'item_level_hold' ) ) {
18771         $dbh->do( "ALTER TABLE reserves ADD COLUMN item_level_hold BOOLEAN NOT NULL DEFAULT 0 AFTER itemtype" );
18772     }
18773     unless ( column_exists( 'old_reserves', 'item_level_hold' ) ) {
18774         $dbh->do( "ALTER TABLE old_reserves ADD COLUMN item_level_hold BOOLEAN NOT NULL DEFAULT 0 AFTER itemtype" );
18775     }
18776
18777     SetVersion( $DBversion );
18778     print "Upgrade to $DBversion done (Bug  9834: Add the reserves.item_level_hold column)\n";
18779 }
18780
18781 $DBversion = '19.06.00.006';
18782 if( CheckVersion( $DBversion ) ) {
18783
18784     unless ( TableExists('plugin_methods') ) {
18785         $dbh->do(q{
18786             CREATE TABLE plugin_methods (
18787               plugin_class varchar(255) NOT NULL,
18788               plugin_method varchar(255) NOT NULL,
18789               PRIMARY KEY ( `plugin_class` (191), `plugin_method` (191) )
18790             ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
18791         });
18792     }
18793
18794     require Koha::Plugins;
18795     Koha::Plugins->new({ enable_plugins => 1 })->InstallPlugins;
18796
18797     SetVersion( $DBversion );
18798     print "Upgrade to $DBversion done (Bug 21073: Improve plugin performance)\n";
18799 }
18800
18801 $DBversion = '19.06.00.007';
18802 if( CheckVersion( $DBversion ) ) {
18803     $dbh->do( "DELETE FROM systempreferences WHERE variable = 'RotationPreventTransfers'" );
18804     SetVersion( $DBversion );
18805     print "Upgrade to $DBversion done (Bug 22653: Remove unimplemented RotationPreventTransfers system preference)\n";
18806 }
18807
18808 $DBversion = '19.06.00.008';
18809 if( CheckVersion( $DBversion ) ) {
18810     $dbh->do( "UPDATE userflags SET flagdesc = 'Allow staff members to modify permissions and passwords for other staff members' WHERE flag = 'staffaccess'" );
18811     SetVersion( $DBversion );
18812     print "Upgrade to $DBversion done (Bug 23109: Improve description of staffaccess permission)\n";
18813 }
18814
18815 $DBversion = '19.06.00.009';
18816 if( CheckVersion( $DBversion ) ) {
18817     $dbh->do(q{
18818         INSERT IGNORE INTO keyboard_shortcuts (shortcut_name, shortcut_keys)
18819             VALUES ("toggle_keyboard", "Shift-Ctrl-K")
18820     });
18821
18822     SetVersion( $DBversion );
18823     print "Upgrade to $DBversion done (Bug 17178: add shortcut to keyboard_shortcuts)\n";
18824 }
18825
18826 $DBversion = '19.06.00.010';
18827 if( CheckVersion( $DBversion ) ) {
18828
18829     if ( TableExists('default_circ_rules') ) {
18830         if ( column_exists( 'default_circ_rules', 'holdallowed' ) ) {
18831             $dbh->do("
18832                 INSERT IGNORE INTO circulation_rules ( categorycode, branchcode, itemtype, rule_name, rule_value )
18833                 SELECT NULL, NULL, NULL, 'holdallowed', holdallowed
18834                 FROM default_circ_rules
18835             ");
18836             $dbh->do("
18837                 INSERT IGNORE INTO circulation_rules ( categorycode, branchcode, itemtype, rule_name, rule_value )
18838                 SELECT NULL, NULL, NULL, 'hold_fulfillment_policy', hold_fulfillment_policy
18839                 FROM default_circ_rules
18840             ");
18841             $dbh->do("
18842                 INSERT IGNORE INTO circulation_rules ( categorycode, branchcode, itemtype, rule_name, rule_value )
18843                 SELECT NULL, NULL, NULL, 'returnbranch', returnbranch
18844                 FROM default_circ_rules
18845             ");
18846             $dbh->do("DROP TABLE default_circ_rules");
18847         }
18848     }
18849
18850     if ( TableExists('default_branch_circ_rules') ) {
18851         if ( column_exists( 'default_branch_circ_rules', 'holdallowed' ) ) {
18852             $dbh->do("
18853                 INSERT IGNORE INTO circulation_rules ( categorycode, branchcode, itemtype, rule_name, rule_value )
18854                 SELECT NULL, branchcode, NULL, 'holdallowed', holdallowed
18855                 FROM default_branch_circ_rules
18856             ");
18857             $dbh->do("
18858                 INSERT IGNORE INTO circulation_rules ( categorycode, branchcode, itemtype, rule_name, rule_value )
18859                 SELECT NULL, branchcode, NULL, 'hold_fulfillment_policy', hold_fulfillment_policy
18860                 FROM default_branch_circ_rules
18861             ");
18862             $dbh->do("
18863                 INSERT IGNORE INTO circulation_rules ( categorycode, branchcode, itemtype, rule_name, rule_value )
18864                 SELECT NULL, branchcode, NULL, 'returnbranch', returnbranch
18865                 FROM default_branch_circ_rules
18866             ");
18867             $dbh->do("DROP TABLE default_branch_circ_rules");
18868         }
18869     }
18870
18871     if ( TableExists('branch_item_rules') ) {
18872         if ( column_exists( 'branch_item_rules', 'holdallowed' ) ) {
18873             $dbh->do("
18874                 INSERT IGNORE INTO circulation_rules ( categorycode, branchcode, itemtype, rule_name, rule_value )
18875                 SELECT NULL, branchcode, itemtype, 'holdallowed', holdallowed
18876                 FROM branch_item_rules
18877             ");
18878             $dbh->do("
18879                 INSERT IGNORE INTO circulation_rules ( categorycode, branchcode, itemtype, rule_name, rule_value )
18880                 SELECT NULL, branchcode, itemtype, 'hold_fulfillment_policy', hold_fulfillment_policy
18881                 FROM branch_item_rules
18882             ");
18883             $dbh->do("
18884                 INSERT IGNORE INTO circulation_rules ( categorycode, branchcode, itemtype, rule_name, rule_value )
18885                 SELECT NULL, branchcode, itemtype, 'returnbranch', returnbranch
18886                 FROM branch_item_rules
18887             ");
18888             $dbh->do("DROP TABLE branch_item_rules");
18889         }
18890     }
18891
18892     if ( TableExists('default_branch_item_rules') ) {
18893         if ( column_exists( 'default_branch_item_rules', 'holdallowed' ) ) {
18894             $dbh->do("
18895                 INSERT IGNORE INTO circulation_rules ( categorycode, branchcode, itemtype, rule_name, rule_value )
18896                 SELECT NULL, NULL, itemtype, 'holdallowed', holdallowed
18897                 FROM default_branch_item_rules
18898             ");
18899             $dbh->do("
18900                 INSERT IGNORE INTO circulation_rules ( categorycode, branchcode, itemtype, rule_name, rule_value )
18901                 SELECT NULL, NULL, itemtype, 'hold_fulfillment_policy', hold_fulfillment_policy
18902                 FROM default_branch_item_rules
18903             ");
18904             $dbh->do("
18905                 INSERT IGNORE INTO circulation_rules ( categorycode, branchcode, itemtype, rule_name, rule_value )
18906                 SELECT NULL, NULL, itemtype, 'returnbranch', returnbranch
18907                 FROM default_branch_item_rules
18908             ");
18909             $dbh->do("DROP TABLE default_branch_item_rules");
18910         }
18911     }
18912
18913     SetVersion( $DBversion );
18914     print "Upgrade to $DBversion done (Bug 18928: Move holdallowed, hold_fulfillment_policy, returnbranch to circulation_rules)\n";
18915 }
18916
18917 $DBversion = '19.06.00.011';
18918 if( CheckVersion( $DBversion ) ) {
18919
18920     if ( TableExists('refund_lost_item_fee_rules') ) {
18921         if ( column_exists( 'refund_lost_item_fee_rules', 'refund' ) ) {
18922             $dbh->do("
18923                 INSERT INTO circulation_rules ( categorycode, branchcode, itemtype, rule_name, rule_value )
18924                 SELECT NULL, IF(branchcode='*', NULL, branchcode), NULL, 'refund', refund
18925                 FROM refund_lost_item_fee_rules
18926             ");
18927             $dbh->do("DROP TABLE refund_lost_item_fee_rules");
18928         }
18929     }
18930
18931     SetVersion( $DBversion );
18932     print "Upgrade to $DBversion done (Bug 18930: Move lost item refund rules to circulation_rules table)\n";
18933 }
18934
18935 $DBversion = '19.06.00.012';
18936 if ( CheckVersion($DBversion) ) {
18937
18938     # Find and correct pathological cases of LR becoming a credit
18939     my $sth = $dbh->prepare( "SELECT accountlines_id, issue_id, borrowernumber, itemnumber, amount, manager_id FROM accountlines WHERE accounttype = 'LR' AND amount < 0" );
18940     $sth->execute();
18941     while ( my $row = $sth->fetchrow_hashref ) {
18942         $dbh->do(
18943             "INSERT INTO accountlines (accounttype, issue_id, borrowernumber, itemnumber, amount, manager_id, interface) VALUES ( ?, ?, ?, ?, ?, ?, ? );",
18944             {},
18945             (
18946                 'CR',                   $row->{issue_id},
18947                 $row->{borrowernumber}, $row->{itemnumber},
18948                 $row->{amount},         $row->{manager_id},
18949                 'upgrade'
18950             )
18951         );
18952         my $credit_id = $dbh->last_insert_id(undef, undef, 'accountlines', undef);
18953         my $amount = $row->{amount} * -1;
18954         $dbh->do("INSERT INTO account_offsets (credit_id, debit_id, type, amount) VALUES (?,?,?,?);",{},($credit_id, $row->{accountlines_id}, 'Lost Item', $amount));
18955         $dbh->do("UPDATE accountlines SET amount = '$amount' WHERE accountlines_id = '$row->{accountlines_id}';");
18956     }
18957
18958     $dbh->do(qq{
18959         UPDATE
18960           accountlines
18961         SET
18962           accounttype = 'LOST',
18963           status = 'RETURNED'
18964         WHERE
18965           accounttype = 'LR';
18966     });
18967
18968     # Find and correct pathalogical cases of L having been converted to W
18969     $sth = $dbh->prepare( "SELECT accountlines_id, issue_id, borrowernumber, itemnumber, amount, manager_id FROM accountlines WHERE accounttype = 'W' AND itemnumber IS NOT NULL" );
18970     $sth->execute();
18971     while ( my $row = $sth->fetchrow_hashref ) {
18972         my $amount = $row->{amount} * -1;
18973         $dbh->do(
18974             "INSERT INTO accountlines (accounttype, issue_id, borrowernumber, itemnumber, amount, manager_id, interface) VALUES ( ?, ?, ?, ?, ?, ?, ? );",
18975             {},
18976             (
18977                 'LOST', $row->{issue_id}, $row->{borrowernumber},
18978                 $row->{itemnumber}, $amount, $row->{manager_id},
18979                 'upgrade'
18980             )
18981         );
18982         my $debit_id = $dbh->last_insert_id(undef, undef, 'accountlines', undef);
18983         $dbh->do(
18984             "INSERT INTO account_offsets (credit_id, debit_id, type, amount) VALUES (?,?,?,?);",
18985             {},
18986             (
18987                 $row->{accountlines_id}, $debit_id,
18988                 'Lost Item',    $amount
18989             )
18990         );
18991     }
18992
18993     $dbh->do(qq{
18994         UPDATE
18995           accountlines
18996         SET
18997           accounttype = 'LOST'
18998         WHERE
18999           accounttype = 'L';
19000     });
19001
19002     $dbh->do(qq{
19003         UPDATE
19004           accountlines
19005         SET
19006           accounttype = 'LOST_RETURN'
19007         WHERE
19008           accounttype = 'CR';
19009     });
19010
19011     SetVersion($DBversion);
19012     print "Upgrade to $DBversion done (Bug 22563: Fix accounttypes for 'L', 'LR' and 'CR')\n";
19013 }
19014
19015 $DBversion = '19.06.00.013';
19016 if ( CheckVersion( $DBversion ) ) {
19017     unless ( column_exists( 'borrower_modifications', 'changed_fields' ) ) {
19018         $dbh->do("ALTER TABLE borrower_modifications ADD changed_fields MEDIUMTEXT AFTER verification_token;");
19019     }
19020     SetVersion( $DBversion );
19021     print "Upgrade to $DBversion done (Bug 23151: Add borrower_modifications.changed_fields column)\n";
19022 }
19023
19024 $DBversion = '19.06.00.014';
19025 if ( CheckVersion($DBversion) ) {
19026
19027     $dbh->do(qq{
19028         UPDATE
19029           accountlines
19030         SET
19031           accounttype = 'RENT_DAILY_RENEW'
19032         WHERE
19033           accounttype = 'Rent'
19034         AND
19035           description LIKE 'Renewal of Daily Rental Item%';
19036     });
19037
19038     $dbh->do(qq{
19039         UPDATE
19040           accountlines
19041         SET
19042           accounttype = 'RENT_DAILY'
19043         WHERE
19044           accounttype = 'Rent'
19045         AND
19046           description LIKE 'Daily rental';
19047     });
19048
19049
19050     $dbh->do(qq{
19051         UPDATE
19052           accountlines
19053         SET
19054           accounttype = 'RENT_RENEW'
19055         WHERE
19056           accounttype = 'Rent'
19057         AND
19058           description LIKE 'Renewal of Rental Item%';
19059     });
19060
19061     $dbh->do(qq{
19062         UPDATE
19063           accountlines
19064         SET
19065           accounttype = 'RENT'
19066         WHERE
19067           accounttype = 'Rent';
19068     });
19069
19070     SetVersion($DBversion);
19071     print "Upgrade to $DBversion done (Bug 11573: Fix accounttypes for 'Rent')\n";
19072 }
19073
19074 $DBversion = '19.06.00.015';
19075 if( CheckVersion( $DBversion ) ) {
19076     $dbh->do( "UPDATE `search_field` SET `name` = 'date-time-last-modified', `label` = 'date-time-last-modified' WHERE `name` = 'date/time-last-modified'" );
19077
19078     SetVersion( $DBversion );
19079     print "Upgrade to $DBversion done (Bug 22524: Fix date/time-last-modified search with Elasticsearch)\n";
19080 }
19081
19082 $DBversion = '19.06.00.016';
19083 if( CheckVersion( $DBversion ) ) {
19084
19085     $dbh->do(q|
19086         INSERT IGNORE INTO keyboard_shortcuts (shortcut_name, shortcut_keys) VALUES
19087             ("insert_copyright","Alt-C"),
19088             ("insert_copyright_sound","Alt-P"),
19089             ("insert_delimiter","Ctrl-D"),
19090             ("subfield_help","Ctrl-H"),
19091             ("link_authorities","Shift-Ctrl-L"),
19092             ("delete_field","Ctrl-X"),
19093             ("delete_subfield","Shift-Ctrl-X"),
19094             ("new_line","Enter"),
19095             ("line_break","Shift-Enter"),
19096             ("next_position","Tab"),
19097             ("prev_position","Shift-Tab"),
19098             ("toggle_keyboard", "Shift-Ctrl-K")
19099     ;|);
19100
19101     SetVersion( $DBversion );
19102     print "Upgrade to $DBversion done (Bug 23396: Fix missing keyboard_shortcuts table)\n";
19103 }
19104
19105 $DBversion = '19.06.00.017';
19106 if ( CheckVersion($DBversion) ) {
19107
19108     $dbh->do(qq{
19109         INSERT INTO
19110           authorised_values (category,authorised_value,lib)
19111         VALUES
19112           ('PAYMENT_TYPE','SIP00','Cash via SIP2'),
19113           ('PAYMENT_TYPE','SIP01','VISA via SIP2'),
19114           ('PAYMENT_TYPE','SIP02','Creditcard via SIP2')
19115     });
19116
19117     $dbh->do(qq{
19118         UPDATE
19119           accountlines
19120         SET
19121           accounttype  = 'Pay',
19122           payment_type = 'SIP00'
19123         WHERE
19124           accounttype = 'Pay00';
19125     });
19126
19127     $dbh->do(qq{
19128         UPDATE
19129           accountlines
19130         SET
19131           accounttype  = 'Pay',
19132           payment_type = 'SIP01'
19133         WHERE
19134           accounttype = 'Pay01';
19135     });
19136
19137     $dbh->do(qq{
19138         UPDATE
19139           accountlines
19140         SET
19141           accounttype  = 'Pay',
19142           payment_type = 'SIP02'
19143         WHERE
19144           accounttype = 'Pay02';
19145     });
19146
19147     my $sth = $dbh->prepare( q{SELECT * FROM accountlines WHERE accounttype REGEXP '^Pay[[:digit:]]{2}$' } );
19148     $sth->execute();
19149     my $seen = {};
19150     while (my $row = $sth->fetchrow_hashref) {
19151         my $type = $row->{accounttype};
19152         my $sipcode = $type;
19153         $sipcode =~ s/Pay/SIP/g;
19154         unless ($seen->{$sipcode}) {
19155             $dbh->do(qq{
19156                 INSERT INTO
19157                   authorised_values (category,authorised_value,lib)
19158                 VALUES
19159                   ('PAYMENT_TYPE',"$sipcode",'Unrecognised SIP2 payment type')
19160             });
19161
19162              $dbh->do(qq{
19163                 UPDATE
19164                   accountlines
19165                 SET
19166                   accounttype  = 'Pay',
19167                   payment_type = "$sipcode"
19168                 WHERE
19169                   accounttype = "$type";
19170             });
19171
19172             $seen->{$sipcode} = 1;
19173         }
19174     }
19175
19176     SetVersion($DBversion);
19177     print "Upgrade to $DBversion done (Bug 22610: Fix accounttypes for SIP2 payments)\n";
19178 }
19179
19180 $DBversion = '19.06.00.018';
19181 if( CheckVersion( $DBversion ) ) {
19182     if( !column_exists( 'biblio', 'subtitle' ) ) {
19183         $dbh->do( "ALTER TABLE biblio ADD COLUMN medium LONGTEXT AFTER title" );
19184         $dbh->do( "ALTER TABLE biblio ADD COLUMN subtitle LONGTEXT AFTER medium" );
19185         $dbh->do( "ALTER TABLE biblio ADD COLUMN part_number LONGTEXT AFTER subtitle" );
19186         $dbh->do( "ALTER TABLE biblio ADD COLUMN part_name LONGTEXT AFTER part_number" );
19187
19188         $dbh->do( "ALTER TABLE deletedbiblio ADD COLUMN medium LONGTEXT AFTER title" );
19189         $dbh->do( "ALTER TABLE deletedbiblio ADD COLUMN subtitle LONGTEXT AFTER medium" );
19190         $dbh->do( "ALTER TABLE deletedbiblio ADD COLUMN part_number LONGTEXT AFTER subtitle" );
19191         $dbh->do( "ALTER TABLE deletedbiblio ADD COLUMN part_name LONGTEXT AFTER part_number" );
19192     }
19193
19194     $dbh->do( "UPDATE marc_subfield_structure SET kohafield='biblio.subtitle' WHERE kohafield='bibliosubtitle.subtitle'" );
19195
19196     my $marcflavour = C4::Context->preference('marcflavour');
19197
19198     if ( $marcflavour eq 'UNIMARC' ) {
19199         $dbh->do(qq{
19200             UPDATE marc_subfield_structure SET kohafield='biblio.medium'
19201             WHERE (kohafield IS NULL OR kohafield='') AND frameworkcode='' AND tagfield='200' AND tagsubfield='b'
19202         });
19203         $dbh->do(qq{
19204             UPDATE marc_subfield_structure SET kohafield='biblio.subtitle'
19205             WHERE (kohafield IS NULL OR kohafield='') AND frameworkcode='' AND tagfield='200' AND tagsubfield='e'
19206         });
19207         $dbh->do(qq{
19208             UPDATE marc_subfield_structure SET kohafield='biblio.part_number'
19209             WHERE (kohafield IS NULL OR kohafield='') AND frameworkcode='' AND tagfield='200' AND tagsubfield='h'
19210         });
19211         $dbh->do(qq{
19212             UPDATE marc_subfield_structure SET kohafield='biblio.part_name'
19213             WHERE (kohafield IS NULL OR kohafield='') AND frameworkcode='' AND tagfield='200' AND tagsubfield='i'
19214         });
19215     } else {
19216         $dbh->do(qq{
19217             UPDATE marc_subfield_structure SET kohafield='biblio.medium'
19218             WHERE (kohafield IS NULL OR kohafield='') AND frameworkcode='' AND tagfield='245' AND tagsubfield='h'
19219         });
19220         $dbh->do(qq{
19221             UPDATE marc_subfield_structure SET kohafield='biblio.subtitle'
19222             WHERE (kohafield IS NULL OR kohafield='') AND frameworkcode='' AND tagfield='245' AND tagsubfield='b'
19223         });
19224         $dbh->do(qq{
19225             UPDATE marc_subfield_structure SET kohafield='biblio.part_number'
19226             WHERE (kohafield IS NULL OR kohafield='') AND frameworkcode='' AND tagfield='245' AND tagsubfield='n'
19227         });
19228         $dbh->do(qq{
19229             UPDATE marc_subfield_structure SET kohafield='biblio.part_name'
19230             WHERE (kohafield IS NULL OR kohafield='') AND frameworkcode='' AND tagfield='245' AND tagsubfield='p'
19231         });
19232     }
19233
19234     $sth = $dbh->prepare("SELECT * FROM fieldmapping");
19235     $sth->execute;
19236     my @fails_11529;
19237     if ( $sth->rows ) {
19238         while ( my $value = $sth->fetchrow_hashref() ) {
19239             my $framework =
19240               $value->{frameworkcode} eq ""
19241               ? "Default"
19242               : $value->{frameworkcode};
19243             push @fails_11529,
19244               {
19245                 field        => $value->{field},
19246                 fieldcode    => $value->{fieldcode},
19247                 subfieldcode => $value->{subfieldcode},
19248                 framework    => $framework
19249               };
19250         }
19251     }
19252
19253     $dbh->do( "DROP TABLE IF EXISTS fieldmapping" );
19254
19255     $dbh->do( "DELETE FROM user_permissions WHERE code='manage_keywords2koha_mappings'" );
19256
19257     $dbh->do( "DELETE FROM permissions WHERE code='manage_keywords2koha_mappings'" );
19258
19259     # Always end with this (adjust the bug info)
19260     SetVersion( $DBversion );
19261     print "Upgrade to $DBversion done (Bug 11529: Add medium, subtitle and part information to biblio table)\n";
19262     if ( @fails_11529 ) {
19263         print "WARNING: Keyword to MARC Mappings:\n";
19264         for my $fail_11529 ( @fails_11529 ) {
19265             print "    keyword: "
19266               . $fail_11529->{field}
19267               . " to field: "
19268               . $fail_11529->{fieldcode} . "\$"
19269               . $fail_11529->{subfieldcode} . " for "
19270               . $fail_11529->{framework}
19271               . " framework\n";
19272         }
19273         print "The keyword to marc mapping feature is no longer supported. Above find the\n";
19274         print "mappings that had been defined in your system. You will need to remap any\n";
19275         print "desired MARC fields to the Koha field you desire in the Koha to MARC mappings\n";
19276         print "page under Administration\n";
19277     }
19278     print "NOTE: misc/batchRebuildBiblioTables.pl should be run to populate the fields introduced in bug 11529. It may take some time for larger databases.\n\n"
19279 }
19280
19281 $DBversion = '19.06.00.019';
19282 if ( CheckVersion($DBversion) ) {
19283     $dbh->do(q{
19284         INSERT IGNORE INTO systempreferences (variable, value, options, explanation, type)
19285         VALUES
19286           (
19287             'FinePaymentAutoPopup',
19288             '0',
19289             NULL,
19290             'If enabled, automatically display a print dialog for a payment receipt when making a payment.',
19291             'YesNo'
19292           )
19293     });
19294
19295     SetVersion($DBversion);
19296     print
19297 "Upgrade to $DBversion done (Bug 23228: Add option to automatically display payment receipt for printing after making a payment)\n";
19298 }
19299
19300 $DBversion = '19.06.00.020';
19301 if( CheckVersion( $DBversion ) ) {
19302     $dbh->do(q|
19303         INSERT IGNORE INTO systempreferences ( `variable`, `value`, `options`, `explanation`, `type` ) VALUES
19304         ('PreserveSerialNotes','1','','When a new "Expected" issue is generated, should it be prefilled with last created issue notes?','YesNo');
19305     |);
19306
19307     SetVersion( $DBversion );
19308     print "Upgrade to $DBversion done (Bug 23416: Add PreserveSerialNotes syspref)\n";
19309 }
19310
19311 $DBversion = '19.06.00.021';
19312 if( CheckVersion( $DBversion ) ) {
19313
19314     $dbh->do(q|
19315         ALTER TABLE marc_subfield_structure CHANGE COLUMN hidden hidden TINYINT(1) DEFAULT 8 NOT NULL;
19316     |);
19317     # Always end with this (adjust the bug info)
19318     SetVersion( $DBversion );
19319     print "Upgrade to $DBversion done (Bug 23309: Can't add new subfields to bibliographic frameworks in strict mode)\n";
19320 }
19321
19322 $DBversion = '19.06.00.022';
19323 if ( CheckVersion($DBversion) ) {
19324
19325     unless ( TableExists('borrower_relationships') ) {
19326         $dbh->do(q{
19327             CREATE TABLE `borrower_relationships` (
19328                   id INT(11) NOT NULL AUTO_INCREMENT,
19329                   guarantor_id INT(11) NOT NULL,
19330                   guarantee_id INT(11) NOT NULL,
19331                   relationship VARCHAR(100) NOT NULL,
19332                   PRIMARY KEY (id),
19333                   UNIQUE KEY `guarantor_guarantee_idx` ( `guarantor_id`, `guarantee_id` ),
19334                   CONSTRAINT r_guarantor FOREIGN KEY ( guarantor_id ) REFERENCES borrowers ( borrowernumber ) ON UPDATE CASCADE ON DELETE CASCADE,
19335                   CONSTRAINT r_guarantee FOREIGN KEY ( guarantee_id ) REFERENCES borrowers ( borrowernumber ) ON UPDATE CASCADE ON DELETE CASCADE
19336             ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
19337         });
19338
19339         $dbh->do(q{
19340             UPDATE borrowers
19341             LEFT JOIN borrowers guarantor ON ( borrowers.guarantorid = guarantor.borrowernumber )
19342             SET borrowers.guarantorid = NULL WHERE guarantor.borrowernumber IS NULL;
19343         });
19344
19345         # Bad data handling: guarantorid IS NOT NULL AND relationship IS NULL
19346         $dbh->do(q{
19347             UPDATE borrowers
19348             SET relationship = '_bad_data'
19349             WHERE guarantorid IS NOT NULL AND
19350                   relationship IS NULL
19351         });
19352
19353         $dbh->do(q{
19354             INSERT INTO borrower_relationships ( guarantor_id, guarantee_id, relationship )
19355             SELECT guarantorid, borrowernumber, relationship FROM borrowers WHERE guarantorid IS NOT NULL;
19356         });
19357
19358         # Clean migrated guarantor data
19359         $dbh->do(q{
19360             UPDATE borrowers
19361             SET contactname=NULL,
19362                 contactfirstname=NULL,
19363                 relationship=NULL
19364             WHERE guarantorid IS NOT NULL
19365         });
19366     }
19367
19368     if ( column_exists( 'borrowers', 'guarantorid' ) ) {
19369         $dbh->do(q{
19370             ALTER TABLE borrowers DROP guarantorid;
19371         });
19372     }
19373
19374     if ( column_exists( 'deletedborrowers', 'guarantorid' ) ) {
19375         $dbh->do(q{
19376             ALTER TABLE deletedborrowers DROP guarantorid;
19377         });
19378     }
19379
19380     if ( column_exists( 'borrower_modifications', 'guarantorid' ) ) {
19381         $dbh->do(q{
19382             ALTER TABLE borrower_modifications DROP guarantorid;
19383         });
19384     }
19385
19386     SetVersion($DBversion);
19387     print "Upgrade to $DBversion done (Bug 14570: Make it possible to add multiple guarantors to a record)\n";
19388 }
19389
19390 $DBversion = '19.06.00.023';
19391 if( CheckVersion( $DBversion ) ) {
19392     $dbh->do(q{
19393         INSERT IGNORE INTO `systempreferences` (`variable`,`value`,`explanation`,`options`,`type`) VALUES
19394         ('ElasticsearchMARCFormat', 'ISO2709', 'ISO2709|ARRAY', 'Elasticsearch MARC format. ISO2709 format is recommended as it is faster and takes less space, whereas array is searchable.', 'Choice')
19395     });
19396
19397     SetVersion( $DBversion );
19398     print "Upgrade to $DBversion done (Bug 22258: Add ElasticsearchMARCFormat preference)\n";
19399 }
19400
19401 $DBversion = '19.06.00.024';
19402 if( CheckVersion( $DBversion ) ) {
19403     $dbh->do(q{ALTER TABLE accountlines CHANGE COLUMN accounttype accounttype varchar(80) default NULL});
19404
19405     SetVersion( $DBversion );
19406     print "Upgrade to $DBversion done (Bug 23539: accountlines.accounttype should match authorised_values.authorised_value in size)\n";
19407 }
19408
19409 $DBversion = '19.06.00.025';
19410 if( CheckVersion( $DBversion ) ) {
19411     $dbh->do( q/INSERT IGNORE INTO systempreferences (variable,value,options,explanation,type) VALUES (?, ?, ?, ?, ?)/, undef, 'BarcodeSeparators','\s\r\n','','Splitting characters for barcodes','Free' );
19412     SetVersion( $DBversion );
19413     print "Upgrade to $DBversion done (Bug 22996: Add pref BarcodeSeparators)\n";
19414 }
19415
19416 $DBversion = '19.06.00.026';
19417 if( CheckVersion( $DBversion ) ) {
19418
19419     unless ( column_exists( 'borrowers', 'privacy_guarantor_fines' ) ) {
19420         $dbh->do(q{
19421             ALTER TABLE borrowers
19422                 ADD privacy_guarantor_fines TINYINT(1) NOT NULL DEFAULT '0' AFTER privacy;
19423         });
19424     }
19425
19426     unless ( column_exists( 'deletedborrowers', 'privacy_guarantor_fines' ) ) {
19427         $dbh->do(q{
19428             ALTER TABLE deletedborrowers
19429                 ADD privacy_guarantor_fines TINYINT(1) NOT NULL DEFAULT '0' AFTER privacy;
19430         });
19431     }
19432
19433     $dbh->do(q{
19434         INSERT IGNORE INTO systempreferences (variable, value, options, explanation, type )
19435         VALUES (
19436             'AllowStaffToSetFinesVisibilityForGuarantor',  '0', NULL,
19437             'If enabled, library staff can set a patron''s fines to be visible to linked patrons from the opac.',  'YesNo'
19438         ), (
19439             'AllowPatronToSetFinesVisibilityForGuarantor',  '0', NULL,
19440             'If enabled, the patron can set fines to be visible to  his or her guarantor',  'YesNo'
19441         )
19442     });
19443
19444     SetVersion( $DBversion );
19445     print "Upgrade to $DBversion done (Bug 20691: Add ability for guarantors to view guarantee's fines in OPAC)\n";
19446 }
19447
19448 $DBversion = '19.06.00.027';
19449 if( CheckVersion( $DBversion ) ) {
19450
19451     if( !TableExists( 'itemtypes_branches' ) ) {
19452        $dbh->do( "
19453             CREATE TABLE itemtypes_branches( -- association table between authorised_values and branches
19454                 itemtype VARCHAR(10) NOT NULL,
19455                 branchcode VARCHAR(10) NOT NULL,
19456                 FOREIGN KEY (itemtype) REFERENCES itemtypes(itemtype) ON DELETE CASCADE,
19457                 FOREIGN KEY (branchcode) REFERENCES branches(branchcode) ON DELETE CASCADE
19458             ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
19459         ");
19460     }
19461
19462     SetVersion( $DBversion );
19463     print "Upgrade to $DBversion done (Bug 15497: Add itemtypes_branches table)\n";
19464 }
19465
19466 $DBversion = '19.06.00.028';
19467 if ( CheckVersion($DBversion) ) {
19468
19469     $dbh->do(qq{
19470         UPDATE
19471           accountlines
19472         SET
19473           accounttype = 'ACCOUNT'
19474         WHERE
19475           accounttype = 'A';
19476     });
19477
19478     SetVersion($DBversion);
19479     print "Upgrade to $DBversion done (Bug 11573: Fix accounttypes for 'A')\n";
19480 }
19481
19482 $DBversion = '19.06.00.029';
19483 if ( CheckVersion($DBversion) ) {
19484
19485     unless ( TableExists( 'cash_registers' ) ) {
19486         $dbh->do(qq{
19487     CREATE TABLE `cash_registers` (
19488     `id` int(11) NOT NULL auto_increment, -- unique identifier for each account register
19489     `name` varchar(24) NOT NULL, -- the user friendly identifier for each account register
19490     `description` longtext NOT NULL, -- the user friendly description for each account register
19491     `branch` varchar(10) NOT NULL, -- the foreign key the library this account register belongs
19492     `branch_default` tinyint(1) NOT NULL DEFAULT 0, -- boolean flag to denote that this till is the branch default
19493     `starting_float` decimal(28, 6), -- the starting float this account register should be assigned
19494     `archived` tinyint(1) NOT NULL DEFAULT 0, -- boolean flag to denote if this till is archived or not
19495     PRIMARY KEY (`id`),
19496     UNIQUE KEY `name` (`name`,`branch`),
19497     CONSTRAINT cash_registers_branch FOREIGN KEY (branch) REFERENCES branches (branchcode) ON UPDATE CASCADE ON DELETE CASCADE
19498     ) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
19499         });
19500     }
19501
19502     unless ( column_exists( 'accountlines', 'register_id' ) ) {
19503         $dbh->do(qq{ALTER TABLE `accountlines` ADD `register_id` int(11) NULL DEFAULT NULL AFTER `manager_id`});
19504         $dbh->do(qq{
19505             ALTER TABLE `accountlines`
19506             ADD CONSTRAINT `accountlines_ibfk_registers` FOREIGN KEY (`register_id`)
19507             REFERENCES `cash_registers` (`id`) ON DELETE SET NULL ON UPDATE CASCADE
19508         });
19509     }
19510
19511     $dbh->do(qq{
19512         INSERT IGNORE INTO `userflags` (`bit`, `flag`, `flagdesc`, `defaulton`)
19513         VALUES (25, 'cash_management', 'Cash management', 0)
19514     });
19515
19516     $dbh->do(qq{
19517         INSERT IGNORE permissions (module_bit, code, description)
19518         VALUES
19519         (25, 'manage_cash_registers', 'Add and remove cash registers')
19520     });
19521
19522     $dbh->do(qq{
19523         INSERT IGNORE INTO systempreferences (variable,value,options,explanation,type) VALUES
19524         ('UseCashRegisters','0','','Use cash registers with the accounting system and assign patron transactions to them.','YesNo')
19525     });
19526
19527     SetVersion($DBversion);
19528     print "Upgrade to $DBversion done (Bug 23321: Add cash_registers table, permissions and preferences)\n";
19529 }
19530
19531 $DBversion = '19.06.00.030';
19532 if( CheckVersion( $DBversion ) ) {
19533
19534     if ( !TableExists('club_holds') ) {
19535         $dbh->do(q|
19536             CREATE TABLE club_holds (
19537                 id        INT(11) NOT NULL AUTO_INCREMENT,
19538                 club_id   INT(11) NOT NULL, -- id for the club the hold was generated for
19539                 biblio_id INT(11) NOT NULL, -- id for the bibliographic record the hold has been placed against
19540                 item_id   INT(11) NULL DEFAULT NULL, -- If item-level, the id for the item the hold has been placed agains
19541                 date_created TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, -- Timestamp for the placed hold
19542                 PRIMARY KEY (id),
19543                 -- KEY club_id (club_id),
19544                 CONSTRAINT clubs_holds_ibfk_1 FOREIGN KEY (club_id)   REFERENCES clubs  (id) ON DELETE CASCADE ON UPDATE CASCADE,
19545                 CONSTRAINT clubs_holds_ibfk_2 FOREIGN KEY (biblio_id) REFERENCES biblio (biblionumber) ON DELETE CASCADE ON UPDATE CASCADE,
19546                 CONSTRAINT clubs_holds_ibfk_3 FOREIGN KEY (item_id)   REFERENCES items  (itemnumber) ON DELETE CASCADE ON UPDATE CASCADE
19547             ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
19548         |);
19549     }
19550
19551     if ( !TableExists('club_holds_to_patron_holds') ) {
19552         $dbh->do(q|
19553             CREATE TABLE club_holds_to_patron_holds (
19554                 id              INT(11) NOT NULL AUTO_INCREMENT,
19555                 club_hold_id    INT(11) NOT NULL,
19556                 patron_id       INT(11) NOT NULL,
19557                 hold_id         INT(11),
19558                 error_code      ENUM ( 'damaged', 'ageRestricted', 'itemAlreadyOnHold',
19559                                     'tooManyHoldsForThisRecord', 'tooManyReservesToday',
19560                                     'tooManyReserves', 'notReservable', 'cannotReserveFromOtherBranches',
19561                                     'libraryNotFound', 'libraryNotPickupLocation', 'cannotBeTransferred'
19562                                 ) NULL DEFAULT NULL,
19563                 error_message   varchar(100) NULL DEFAULT NULL,
19564                 PRIMARY KEY (id),
19565                 -- KEY club_hold_id (club_hold_id),
19566                 CONSTRAINT clubs_holds_paton_holds_ibfk_1 FOREIGN KEY (club_hold_id) REFERENCES club_holds (id) ON DELETE CASCADE ON UPDATE CASCADE,
19567                 CONSTRAINT clubs_holds_paton_holds_ibfk_2 FOREIGN KEY (patron_id) REFERENCES borrowers (borrowernumber) ON DELETE CASCADE ON UPDATE CASCADE,
19568                 CONSTRAINT clubs_holds_paton_holds_ibfk_3 FOREIGN KEY (hold_id) REFERENCES reserves (reserve_id) ON DELETE CASCADE ON UPDATE CASCADE
19569             ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
19570         |);
19571     }
19572
19573     # Always end with this (adjust the bug info)
19574     SetVersion( $DBversion );
19575     print "Upgrade to $DBversion done (Bug 19618: add club_holds tables)\n";
19576 }
19577
19578 $DBversion = '19.06.00.031';
19579 if( CheckVersion( $DBversion ) ) {
19580     $dbh->do(q|
19581         INSERT IGNORE INTO systempreferences ( `variable`, `value`, `options`, `explanation`, `type` ) VALUES
19582         ('OPACDetailQRCode','0','','Enable the display of a QR Code on the OPAC detail page','YesNo');
19583     |);
19584
19585     SetVersion( $DBversion );
19586     print "Upgrade to $DBversion done (Bug 23566: Add OPACDetailQRCode system preference)\n";
19587 }
19588
19589 $DBversion = '19.06.00.032';
19590 if ( CheckVersion($DBversion) ) {
19591     if ( !column_exists( 'search_marc_to_field', 'search' ) ) {
19592         $dbh->do(q|
19593             ALTER TABLE `search_marc_to_field` ADD COLUMN `search` tinyint(1) NOT NULL DEFAULT 1
19594         |);
19595     }
19596     if ( !column_exists( 'search_field', 'staff_client' ) ) {
19597         $dbh->do(q|
19598             ALTER TABLE `search_field` ADD COLUMN `staff_client` tinyint(1) NOT NULL DEFAULT 1
19599         |);
19600     }
19601     if ( !column_exists( 'search_field', 'opac' ) ) {
19602         $dbh->do(q|
19603             ALTER TABLE `search_field` ADD COLUMN `opac` tinyint(1) NOT NULL DEFAULT 1
19604         |);
19605     }
19606
19607     SetVersion($DBversion);
19608     print
19609 "Upgrade to $DBversion done (Bug 20589: Add field boosting and use elastic query fields parameter instead of depricated _all)\n";
19610 }
19611
19612 $DBversion = '19.06.00.033';
19613 if( CheckVersion( $DBversion ) ) {
19614
19615     $dbh->do(qq{
19616         INSERT IGNORE INTO systempreferences (variable,value,options,explanation,type) VALUES
19617         ('OnSiteCheckoutAutoCheck','0','','Enable/Do not enable onsite checkout by default if last checkout was an onsite checkout','YesNo')
19618     });
19619     SetVersion( $DBversion );
19620     print "Upgrade to $DBversion done (Bug 23686: Add OnSiteCheckoutAutoCheck system preference)\n";
19621 }
19622
19623 $DBversion = '19.06.00.034';
19624 if( CheckVersion( $DBversion ) ) {
19625     $dbh->do(q{
19626         INSERT IGNORE INTO systempreferences ( `variable`, `value`, `options`, `explanation`, `type` ) VALUES
19627         ('TransfersBlockCirc','1',NULL,'Should the transfer modal block circulation staff from continuing scanning items','YesNo')
19628     });
19629     SetVersion( $DBversion );
19630     print "Upgrade to $DBversion done (Bug 23007: Make transfer modals optionally block circ)\n";
19631 }
19632
19633 $DBversion = '19.06.00.035';
19634 if( CheckVersion( $DBversion ) ) {
19635
19636     $dbh->do(q{
19637         INSERT IGNORE INTO systempreferences (variable,value,options,explanation,type) VALUES
19638         ( 'IntranetCoce','0', NULL, 'If on, enables cover retrieval from the configured Coce server in the staff client', 'YesNo')
19639     });
19640
19641     $dbh->do(qq{
19642         UPDATE systempreferences SET 
19643           variable = 'OpacCoce', 
19644           explanation = 'If on, enables cover retrieval from the configured Coce server in the OPAC'
19645         WHERE 
19646           variable = 'Coce'
19647     });
19648
19649     SetVersion( $DBversion );
19650     print "Upgrade to $DBversion done (Bug 18421: Add Coce image cache to the Intranet)\n";
19651 }
19652
19653 $DBversion = '19.06.00.036';
19654 if( CheckVersion( $DBversion ) ) {
19655
19656     $dbh->do(q{
19657         INSERT IGNORE INTO systempreferences ( `variable`, `value`, `options`, `explanation`, `type`) VALUES  
19658         ('QueryRegexEscapeOptions', 'escape', 'dont_escape|escape|unescape_escaped', 'Escape option for regexps delimiters in Elasicsearch queries.', 'Choice')
19659     });
19660
19661     SetVersion( $DBversion );
19662     print "Upgrade to $DBversion done (Bug 20334: Add elasticsearch escape options preference)\n";
19663 }
19664
19665 $DBversion = '19.06.00.037';
19666 if( CheckVersion( $DBversion ) ) {
19667     $dbh->do(q{
19668         INSERT IGNORE INTO systempreferences ( `variable`, `value`, `options`, `explanation`, `type` )
19669         VALUES ('PayPalReturnURL','BaseURL','BaseURL|OPACAlias','Specify whether PayPal will return to the url specified in the OPACBaseURL option or to the OPAC\'s alias url.','Choice')
19670     });
19671
19672     SetVersion( $DBversion );
19673     print "Upgrade to $DBversion done (Bug 21701: PayPal return URL option)\n";
19674 }
19675
19676 $DBversion = '19.06.00.038';
19677 if( CheckVersion( $DBversion ) ) {
19678     $dbh->do( "UPDATE systempreferences SET variable='PatronAutoComplete' WHERE variable='CircAutocompl' LIMIT 1" );
19679     SetVersion( $DBversion );
19680     print "Upgrade to $DBversion done (Bug 23697: Rename CircAutocompl system preference to PatronAutoComplete)\n";
19681 }
19682
19683 $DBversion = '19.06.00.039';
19684 if( CheckVersion( $DBversion ) ) {
19685     $dbh->do(q|
19686         INSERT IGNORE INTO keyboard_shortcuts (shortcut_name, shortcut_keys) VALUES
19687         ("copy_line","Ctrl-C"),
19688         ("copy_subfield","Shift-Ctrl-C"),
19689         ("paste_line","Ctrl-P"),
19690         ("insert_line","Ctrl-I")
19691         ;
19692     |);
19693     SetVersion( $DBversion );
19694     print "Upgrade to $DBversion done (Bug 17179: Add additional keyboard_shortcuts)\n";
19695 }
19696
19697 $DBversion = '19.06.00.040';
19698 if( CheckVersion( $DBversion ) ) {
19699     $dbh->do(q|
19700         INSERT IGNORE INTO systempreferences
19701         (variable,value,explanation,options,type)
19702         VALUES
19703         ('RoundFinesAtPayment','0','If enabled any fines with fractions of a cent will be rounded to the nearest cent when payments are collected. e.g. 1.004 will be paid off by a 1.00 payment','0','YesNo')
19704     |);
19705
19706     SetVersion( $DBversion );
19707     print "Upgrade to $DBversion done (Bug 17140: Add pref to allow rounding fines at payment)\n";
19708 }
19709
19710 $DBversion = '19.06.00.041';
19711 if( CheckVersion( $DBversion ) ) {
19712     my ($socialnetworks) = $dbh->selectrow_array( q|
19713         SELECT value FROM systempreferences WHERE variable='socialnetworks';
19714     |);
19715     if( $socialnetworks ){
19716         # If the socialnetworks preference is enabled, enable all social networks
19717         $dbh->do("UPDATE systempreferences SET value = 'email,facebook,linkedin,twitter', explanation = 'email|facebook|linkedin|twitter', type = 'multiple'  WHERE variable = 'SocialNetworks'");
19718     } else {
19719         $dbh->do("UPDATE systempreferences SET value = '', explanation = 'email|facebook|linkedin|twitter', type = 'multiple'  WHERE variable = 'SocialNetworks'");
19720     }
19721     SetVersion ($DBversion);
19722     print "Upgrade to $DBversion done (Bug 22880: Allow granular control of socialnetworks preference)\n";
19723 }
19724
19725 $DBversion = '19.06.00.042';
19726 if( CheckVersion( $DBversion ) ) {
19727     $dbh->do(q{
19728         INSERT IGNORE INTO systempreferences
19729             ( variable, value, options, explanation, type )
19730         VALUES
19731             ('CustomCoverImages','0',NULL,'If enabled, the custom cover images will be displayed in the staff client. CustomCoverImagesURL must be defined.','YesNo'),
19732             ('OPACCustomCoverImages','0',NULL,'If enabled, the custom cover images will be displayed at the OPAC. CustomCoverImagesURL must be defined.','YesNo'),
19733             ('CustomCoverImagesURL','',NULL,'Define an URL serving book cover images, using the following patterns: {issn}, {isbn}, {normalized_isbn}, {field$subfield} (use it with CustomCoverImages and/or OPACCustomCoverImages)','free')
19734     });
19735
19736     SetVersion( $DBversion );
19737     print "Upgrade to $DBversion done (Bug 22445: Add new pref *CustomCoverImages*)\n";
19738 }
19739
19740 $DBversion = '19.06.00.043';
19741 if ( CheckVersion($DBversion) ) {
19742
19743     # Adding account_debit_types
19744     if ( !TableExists('account_debit_types') ) {
19745         $dbh->do(
19746             qq{
19747                 CREATE TABLE account_debit_types (
19748                   code varchar(80) NOT NULL,
19749                   description varchar(200) NULL,
19750                   can_be_added_manually tinyint(4) NOT NULL DEFAULT 1,
19751                   default_amount decimal(28, 6) NULL,
19752                   is_system tinyint(1) NOT NULL DEFAULT 0,
19753                   archived tinyint(1) NOT NULL DEFAULT 0,
19754                   PRIMARY KEY (code)
19755                 ) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_unicode_ci
19756               }
19757         );
19758     }
19759
19760     # Adding account_debit_types_branches
19761     if ( !TableExists('account_debit_types_branches') ) {
19762         $dbh->do(
19763             qq{
19764                 CREATE TABLE account_debit_types_branches (
19765                     debit_type_code VARCHAR(80),
19766                     branchcode VARCHAR(10),
19767                     FOREIGN KEY (debit_type_code) REFERENCES account_debit_types(code) ON DELETE CASCADE,
19768                     FOREIGN KEY (branchcode) REFERENCES branches(branchcode) ON DELETE CASCADE
19769                 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
19770             }
19771         );
19772     }
19773
19774     # Populating account_debit_types
19775     $dbh->do(
19776         qq{
19777             INSERT IGNORE INTO account_debit_types (
19778               code,
19779               description,
19780               can_be_added_manually,
19781               default_amount,
19782               is_system
19783             )
19784             VALUES
19785               ('ACCOUNT', 'Account creation fee', 0, NULL, 1),
19786               ('ACCOUNT_RENEW', 'Account renewal fee', 0, NULL, 1),
19787               ('RESERVE_EXPIRED', 'Hold waiting too long', 0, NULL, 1),
19788               ('LOST', 'Lost item', 1, NULL, 1),
19789               ('MANUAL', 'Manual fee', 1, NULL, 0),
19790               ('NEW_CARD', 'New card fee', 1, NULL, 1),
19791               ('OVERDUE', 'Overdue fine', 0, NULL, 1),
19792               ('PROCESSING', 'Lost item processing fee', 0, NULL, 1),
19793               ('RENT', 'Rental fee', 0, NULL, 1),
19794               ('RENT_DAILY', 'Daily rental fee', 0, NULL, 1),
19795               ('RENT_RENEW', 'Renewal of rental item', 0, NULL, 1),
19796               ('RENT_DAILY_RENEW', 'Renewal of daily rental item', 0, NULL, 1),
19797               ('RESERVE', 'Hold fee', 0, NULL, 1)
19798         }
19799     );
19800
19801     # Update accountype 'Res' to 'RESERVE'
19802     $dbh->do(
19803         qq{
19804           UPDATE accountlines SET accounttype = 'RESERVE' WHERE accounttype = 'Res'
19805         }
19806     );
19807
19808     # Update accountype 'PF' to 'PROCESSING'
19809     $dbh->do(
19810         qq{
19811           UPDATE accountlines SET accounttype = 'PROCESSING' WHERE accounttype = 'PF'
19812         }
19813     );
19814
19815     # Update accountype 'HE' to 'RESERVE_EXPIRED'
19816     $dbh->do(
19817         qq{
19818           UPDATE accountlines SET accounttype = 'RESERVE_EXPIRED' WHERE accounttype = 'HE'
19819         }
19820     );
19821
19822     # Update accountype 'N' to 'NEW_CARD'
19823     $dbh->do(
19824         qq{
19825           UPDATE accountlines SET accounttype = 'NEW_CARD' WHERE accounttype = 'N'
19826         }
19827     );
19828
19829     # Update accountype 'M' to 'MANUAL'
19830     $dbh->do(
19831         qq{
19832           UPDATE accountlines SET accounttype = 'MANUAL' WHERE accounttype = 'M'
19833         }
19834     );
19835
19836     # Catch 'F' cases introduced since bug 22521
19837     $dbh->do(qq{
19838         UPDATE
19839           accountlines
19840         SET
19841           accounttype = 'OVERDUE',
19842           status = 'RETURNED'
19843         WHERE
19844           accounttype = 'F';
19845     });
19846
19847     # Moving MANUAL_INV to account_debit_types
19848     $dbh->do(
19849         qq{
19850             INSERT IGNORE INTO account_debit_types (
19851               code,
19852               default_amount,
19853               description,
19854               can_be_added_manually,
19855               is_system
19856             )
19857             SELECT
19858               authorised_value,
19859               lib,
19860               authorised_value,
19861               1,
19862               0
19863             FROM
19864               authorised_values
19865             WHERE
19866               category = 'MANUAL_INV'
19867           }
19868     );
19869
19870     # Update uncaught partial accounttypes left behind after bugs 23539 and 22521
19871     my $sth = $dbh->prepare( "SELECT code, SUBSTR(code, 1,5) AS subcode FROM account_debit_types" );
19872     $sth->execute();
19873     while ( my $row = $sth->fetchrow_hashref ) {
19874         $dbh->do(
19875             qq{
19876               UPDATE accountlines SET accounttype = ? WHERE accounttype = ?
19877             },
19878             {},
19879             (
19880                 $row->{code},
19881                 $row->{subcode}
19882             )
19883         );
19884     }
19885
19886     # Add any unexpected accounttype codes to debit_types as appropriate
19887     $dbh->do(
19888         qq{
19889           INSERT IGNORE INTO account_debit_types (
19890             code,
19891             description,
19892             can_be_added_manually,
19893             default_amount,
19894             is_system
19895           )
19896           SELECT
19897             DISTINCT(accounttype),
19898             "Unexpected type found during upgrade",
19899             1,
19900             NULL,
19901             0
19902           FROM
19903             accountlines
19904           WHERE
19905             amount >= 0
19906         }
19907     );
19908
19909     # Adding debit_type_code to accountlines
19910     unless ( column_exists('accountlines', 'debit_type_code') ) {
19911         $dbh->do(
19912             qq{
19913                 ALTER TABLE accountlines
19914                 ADD
19915                   debit_type_code varchar(80) DEFAULT NULL
19916                 AFTER
19917                   accounttype
19918               }
19919         );
19920     }
19921
19922     # Linking debit_type_code in accountlines to code in account_debit_types
19923     unless ( foreign_key_exists( 'accountlines', 'accountlines_ibfk_debit_type' ) ) {
19924         $dbh->do(
19925             qq{
19926             ALTER TABLE accountlines ADD CONSTRAINT `accountlines_ibfk_debit_type` FOREIGN KEY (`debit_type_code`) REFERENCES `account_debit_types` (`code`) ON DELETE RESTRICT ON UPDATE CASCADE
19927               }
19928         );
19929     }
19930
19931     # Populating debit_type_code
19932     $dbh->do(
19933         qq{
19934         UPDATE accountlines SET debit_type_code = accounttype, accounttype = NULL WHERE accounttype IN (SELECT code from account_debit_types) AND amount >= 0
19935         }
19936     );
19937
19938     # Remove MANUAL_INV
19939     $dbh->do(
19940         qq{
19941         DELETE FROM authorised_values WHERE category = 'MANUAL_INV'
19942         }
19943     );
19944     $dbh->do(
19945         qq{
19946         DELETE FROM authorised_value_categories WHERE category_name = 'MANUAL_INV'
19947         }
19948     );
19949
19950     # Add new permission
19951     $dbh->do(
19952         q{
19953             INSERT IGNORE INTO permissions (module_bit, code, description)
19954             VALUES
19955               (
19956                 3,
19957                 'manage_accounts',
19958                 'Manage Account Debit and Credit Types'
19959               )
19960         }
19961     );
19962
19963     SetVersion($DBversion);
19964     print "Upgrade to $DBversion done (Bug 23049: Add account debit_types)\n";
19965 }
19966
19967 $DBversion = '19.06.00.044';
19968 if ( CheckVersion($DBversion) ) {
19969
19970     # Adding account_credit_types
19971     if ( !TableExists('account_credit_types') ) {
19972         $dbh->do(
19973             qq{
19974                 CREATE TABLE account_credit_types (
19975                   code varchar(80) NOT NULL,
19976                   description varchar(200) NULL,
19977                   can_be_added_manually tinyint(4) NOT NULL DEFAULT 1,
19978                   is_system tinyint(1) NOT NULL DEFAULT 0,
19979                   PRIMARY KEY (code)
19980                 ) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_unicode_ci
19981               }
19982         );
19983     }
19984
19985     # Adding account_credit_types_branches
19986     if ( !TableExists('account_credit_types_branches') ) {
19987         $dbh->do(
19988             qq{
19989                 CREATE TABLE account_credit_types_branches (
19990                     credit_type_code VARCHAR(80),
19991                     branchcode VARCHAR(10),
19992                     FOREIGN KEY (credit_type_code) REFERENCES account_credit_types(code) ON DELETE CASCADE,
19993                     FOREIGN KEY (branchcode) REFERENCES branches(branchcode) ON DELETE CASCADE
19994                 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
19995             }
19996         );
19997     }
19998
19999     # Populating account_credit_types
20000     $dbh->do(
20001         qq{
20002             INSERT IGNORE INTO account_credit_types (
20003               code,
20004               description,
20005               can_be_added_manually,
20006               is_system
20007             )
20008             VALUES
20009               ('PAYMENT', 'Payment', 0, 1),
20010               ('WRITEOFF', 'Writeoff', 0, 1),
20011               ('FORGIVEN', 'Forgiven', 1, 1),
20012               ('CREDIT', 'Credit', 1, 1),
20013               ('LOST_RETURN', 'Lost item fee refund', 0, 1)
20014         }
20015     );
20016
20017     # Adding credit_type_code to accountlines
20018     unless ( column_exists('accountlines', 'credit_type_code') ) {
20019         $dbh->do(
20020             qq{
20021                 ALTER TABLE accountlines
20022                 ADD
20023                   credit_type_code varchar(80) DEFAULT NULL
20024                 AFTER
20025                   accounttype
20026               }
20027         );
20028     }
20029
20030     # Catch LOST_RETURNED cases from original bug 22563 update
20031     $dbh->do(
20032         qq{
20033             UPDATE accountlines
20034             SET accounttype = 'LOST_RETURN'
20035             WHERE accounttype = 'LOST_RETURNED'
20036     });
20037
20038     # Linking credit_type_code in accountlines to code in account_credit_types
20039     unless ( foreign_key_exists( 'accountlines', 'accountlines_ibfk_credit_type' ) ) {
20040         $dbh->do(
20041             qq{
20042                 ALTER TABLE accountlines
20043                 ADD CONSTRAINT
20044                   `accountlines_ibfk_credit_type`
20045                 FOREIGN KEY (`credit_type_code`) REFERENCES `account_credit_types` (`code`)
20046                 ON DELETE RESTRICT
20047                 ON UPDATE CASCADE
20048               }
20049         );
20050     }
20051
20052     # Update accountype 'C' to 'CREDIT'
20053     $dbh->do(
20054         qq{
20055           UPDATE accountlines SET accounttype = 'CREDIT' WHERE accounttype = 'C' OR accounttype = 'CR'
20056         }
20057     );
20058
20059     # Update accountype 'FOR' to 'FORGIVEN'
20060     $dbh->do(
20061         qq{
20062           UPDATE accountlines SET accounttype = 'FORGIVEN' WHERE accounttype = 'FOR' OR accounttype = 'FORW'
20063         }
20064     );
20065
20066     # Update accountype 'Pay' to 'PAYMENT'
20067     $dbh->do(
20068         qq{
20069           UPDATE accountlines SET accounttype = 'PAYMENT' WHERE accounttype = 'Pay' OR accounttype = 'PAY'
20070         }
20071     );
20072
20073     # Update accountype 'W' to 'WRITEOFF'
20074     $dbh->do(
20075         qq{
20076           UPDATE accountlines SET accounttype = 'WRITEOFF' WHERE accounttype = 'W' OR accounttype = 'WO'
20077         }
20078     );
20079
20080     # Add any unexpected accounttype codes to credit_types as appropriate
20081     $dbh->do(
20082         qq{
20083           INSERT IGNORE INTO account_credit_types (
20084             code,
20085             description,
20086             can_be_added_manually,
20087             is_system
20088           )
20089           SELECT
20090             DISTINCT(accounttype),
20091             "Unexpected type found during upgrade",
20092             1,
20093             0
20094           FROM
20095             accountlines
20096           WHERE
20097             amount < 0
20098         }
20099     );
20100
20101     # Populating credit_type_code
20102     $dbh->do(
20103         qq{
20104           UPDATE
20105             accountlines 
20106           SET
20107             credit_type_code = accounttype, accounttype = NULL
20108           WHERE accounttype IN (SELECT code from account_credit_types)
20109         }
20110     );
20111
20112     # Drop accounttype field
20113     $dbh->do(
20114         qq{
20115           ALTER TABLE accountlines
20116           DROP COLUMN `accounttype`
20117         }
20118     );
20119
20120     SetVersion($DBversion);
20121     print "Upgrade to $DBversion done (Bug 23805: Add account credit_types)\n";
20122 }
20123
20124 $DBversion = '19.06.00.045';
20125 if( CheckVersion( $DBversion ) ) {
20126     $dbh->do( "UPDATE systempreferences SET value = '2' WHERE value = '0' AND variable = 'UsageStats'" );
20127
20128     SetVersion( $DBversion );
20129     print "Upgrade to $DBversion done (Bug 23866: Set HEA syspref to prompt for review)\n";
20130 }
20131
20132 $DBversion = '19.06.00.046';
20133 if( CheckVersion( $DBversion ) ) {
20134     $dbh->do(qq{
20135         UPDATE systempreferences
20136         SET 
20137           options = "Calendar|Days|Datedue|Dayweek", 
20138           explanation = "Choose the method for calculating due date: select Calendar, Datedue or Dayweek to use the holidays module, and Days to ignore the holidays module"
20139         WHERE
20140           variable = "useDaysMode"
20141     });
20142
20143     # Always end with this (adjust the bug info)
20144     SetVersion( $DBversion );
20145     print "Upgrade to $DBversion done (Bug 15260: Option for extended loan with useDaysMode)\n";
20146 }
20147
20148 $DBversion = '19.06.00.047';
20149 if ( CheckVersion($DBversion) ) {
20150     if ( !TableExists('return_claims') ) {
20151         $dbh->do(
20152             q{
20153             CREATE TABLE return_claims (
20154                 id int(11) auto_increment,                             -- Unique ID of the return claim
20155                 itemnumber int(11) NOT NULL,                           -- ID of the item
20156                 issue_id int(11) NULL DEFAULT NULL,                    -- ID of the checkout that triggered the claim
20157                 borrowernumber int(11) NOT NULL,                       -- ID of the patron
20158                 notes MEDIUMTEXT DEFAULT NULL,                         -- Notes about the claim
20159                 created_on TIMESTAMP NULL,                             -- Time and date the claim was created
20160                 created_by int(11) NULL DEFAULT NULL,                  -- ID of the staff member that registered the claim
20161                 updated_on TIMESTAMP NULL ON UPDATE CURRENT_TIMESTAMP, -- Time and date of the latest change on the claim (notes)
20162                 updated_by int(11) NULL DEFAULT NULL,                  -- ID of the staff member that updated the claim
20163                 resolution  varchar(80) NULL DEFAULT NULL,             -- Resolution code (RETURN_CLAIM_RESOLUTION AVs)
20164                 resolved_on TIMESTAMP NULL DEFAULT NULL,               -- Time and date the claim was resolved
20165                 resolved_by int(11) NULL DEFAULT NULL,                 -- ID of the staff member that resolved the claim
20166                 PRIMARY KEY (`id`),
20167                 KEY `itemnumber` (`itemnumber`),
20168                 CONSTRAINT UNIQUE `issue_id` ( issue_id ),
20169                 CONSTRAINT `issue_id` FOREIGN KEY (`issue_id`) REFERENCES `issues` (`issue_id`) ON DELETE SET NULL ON UPDATE CASCADE,
20170                 CONSTRAINT `rc_items_ibfk` FOREIGN KEY (`itemnumber`) REFERENCES `items` (`itemnumber`) ON DELETE CASCADE ON UPDATE CASCADE,
20171                 CONSTRAINT `rc_borrowers_ibfk` FOREIGN KEY (`borrowernumber`) REFERENCES `borrowers` (`borrowernumber`) ON DELETE CASCADE ON UPDATE CASCADE,
20172                 CONSTRAINT `rc_created_by_ibfk` FOREIGN KEY (`created_by`) REFERENCES `borrowers` (`borrowernumber`) ON DELETE SET NULL ON UPDATE CASCADE,
20173                 CONSTRAINT `rc_updated_by_ibfk` FOREIGN KEY (`updated_by`) REFERENCES `borrowers` (`borrowernumber`) ON DELETE SET NULL ON UPDATE CASCADE,
20174                 CONSTRAINT `rc_resolved_by_ibfk` FOREIGN KEY (`resolved_by`) REFERENCES `borrowers` (`borrowernumber`) ON DELETE SET NULL ON UPDATE CASCADE
20175             ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
20176         }
20177         );
20178     }
20179
20180     $dbh->do(
20181         q{
20182         INSERT IGNORE INTO systempreferences ( `variable`, `value`, `options`, `explanation`, `type` ) VALUES
20183         ('ClaimReturnedChargeFee', 'ask', 'ask|charge|no_charge', 'Controls whether or not a lost item fee is charged for return claims', 'Choice'),
20184         ('ClaimReturnedLostValue', '', '', 'Sets the LOST AV value that represents "Claims returned" as a lost value', 'Free'),
20185         ('ClaimReturnedWarningThreshold', '', '', 'Sets the number of return claims past which the librarian will be warned the patron has many return claims', 'Integer');
20186     }
20187     );
20188
20189     $dbh->do(
20190         q{
20191         INSERT IGNORE INTO authorised_value_categories ( category_name ) VALUES
20192             ('RETURN_CLAIM_RESOLUTION');
20193     }
20194     );
20195
20196     $dbh->do(
20197         q{
20198         INSERT IGNORE INTO `authorised_values` ( category, authorised_value, lib )
20199         VALUES
20200           ('RETURN_CLAIM_RESOLUTION', 'RET_BY_PATRON', 'Returned by patron'),
20201           ('RETURN_CLAIM_RESOLUTION', 'FOUND_IN_LIB', 'Found in library');
20202     }
20203     );
20204
20205     SetVersion($DBversion);
20206     print
20207 "Upgrade to $DBversion done (Bug 14697: Extend and enhance 'Claims returned' lost status)\n";
20208 }
20209
20210 $DBversion = '19.06.00.048';
20211 if( CheckVersion( $DBversion ) ) {
20212     # you can use $dbh here like:
20213     $dbh->do( qq{
20214         INSERT IGNORE INTO systempreferences ( `variable`, `value`, `options`, `explanation`, `type` )
20215         VALUES  ('OPACShowMusicalInscripts','0','','Display musical inscripts on the OPAC record details page when available.','YesNo'),
20216                 ('OPACPlayMusicalInscripts','0','','If displayed musical inscripts, play midi conversion on the OPAC record details page.','YesNo')
20217     } );
20218
20219     SetVersion( $DBversion );
20220     print "Upgrade to $DBversion done (Bug 22581: add new OPACShowMusicalInscripts and OPACPlayMusicalInscripts system preferences)\n";
20221 }
20222
20223 $DBversion = '19.06.00.049';
20224 if( CheckVersion( $DBversion ) ) {
20225
20226     $dbh->do(q{
20227         INSERT IGNORE INTO systempreferences (variable,value,options,explanation,type)
20228         SELECT
20229             'SuspensionsCalendar',
20230             IF( value='noFinesWhenClosed', 'noSuspensionsWhenClosed', 'ignoreCalendar'),
20231             'ignoreCalendar|noSuspensionsWhenClosed',
20232             'Specify whether to use the Calendar in calculating suspensions',
20233             'Choice'
20234         FROM systempreferences
20235         WHERE variable='finesCalendar';
20236     });
20237
20238     SetVersion( $DBversion );
20239     print "Upgrade to $DBversion done (Bug 13958: Add a SuspensionsCalendar syspref)\n";
20240 }
20241
20242 $DBversion = '19.06.00.050';
20243 if( CheckVersion( $DBversion ) ) {
20244     $dbh->do( q{
20245             INSERT IGNORE INTO systempreferences (variable,value,options,explanation,type)
20246             VALUES ('OPACFineNoRenewalsIncludeCredits','1',NULL,'If enabled the value specified in OPACFineNoRenewals should include any unapplied account credits in the calculation','YesNo')
20247     });
20248
20249     SetVersion( $DBversion );
20250     print "Upgrade to $DBversion done (Bug 23293: Add 'OPACFineNoRenewalsIncludeCredits' system preference)\n";
20251 }
20252
20253 $DBversion = '19.11.00.000';
20254 if( CheckVersion( $DBversion ) ) {
20255     NewVersion( $DBversion, undef, '19.11.00 release' );
20256 }
20257
20258 $DBversion = '19.12.00.000';
20259 if( CheckVersion( $DBversion ) ) {
20260     NewVersion( $DBversion, undef, 'Dobbie is a free elf...' );
20261 }
20262
20263 $DBversion = '19.12.00.001';
20264 if( CheckVersion( $DBversion ) ) {
20265     $dbh->do( "UPDATE marc_subfield_structure SET kohafield = NULL WHERE kohafield = 'bibliosubject.subject';" );
20266     NewVersion( $DBversion, 17831, 'Remove non-existing bibliosubject.subject from frameworks' );
20267 }
20268
20269 $DBversion = '19.12.00.002';
20270 if( CheckVersion( $DBversion ) ) {
20271     $dbh->do(q{
20272         UPDATE systempreferences SET
20273         variable = 'AllowItemsOnHoldCheckoutSIP',
20274         explanation = 'Do not generate RESERVE_WAITING and RESERVED warning when checking out items reserved to someone else via SIP. This allows self checkouts for those items.'
20275         WHERE variable = 'AllowItemsOnHoldCheckout'
20276     });
20277
20278     NewVersion( $DBversion, 23233, 'Rename AllowItemsOnHoldCheckout syspref' );
20279 }
20280
20281 $DBversion = '19.12.00.003';
20282 if( CheckVersion( $DBversion ) ) {
20283
20284     if( !column_exists( 'library_groups', 'ft_local_hold_group' ) ) {
20285         $dbh->do( "ALTER TABLE library_groups ADD COLUMN ft_local_hold_group tinyint(1) NOT NULL DEFAULT 0 AFTER ft_search_groups_staff" );
20286     }
20287
20288     NewVersion( $DBversion, 22284, 'Add ft_local_hold_group column to library_groups' );
20289 }
20290
20291 $DBversion = '19.12.00.004';
20292 if ( CheckVersion($DBversion) ) {
20293
20294     $dbh->do(
20295         qq{
20296             INSERT IGNORE INTO account_debit_types (
20297               code,
20298               description,
20299               can_be_added_manually,
20300               default_amount,
20301               is_system
20302             )
20303             VALUES
20304               ('PAYOUT', 'Payment from library to patron', 0, NULL, 1)
20305         }
20306     );
20307
20308     $dbh->do(qq{
20309         INSERT IGNORE INTO account_offset_types ( type ) VALUES ('PAYOUT');
20310     });
20311
20312     $dbh->do(qq{
20313         INSERT IGNORE permissions (module_bit, code, description)
20314         VALUES
20315         (10, 'payout', 'Perform account payout action')
20316     });
20317
20318     NewVersion( $DBversion, 24080, ['Add PAYOUT account_debit_type', 'Add PAYOUT account_offset_type', 'Add accounts payout permission'] );
20319 }
20320
20321 $DBversion = '19.12.00.005';
20322 if( CheckVersion( $DBversion ) ) {
20323     $dbh->do( "ALTER TABLE action_logs MODIFY COLUMN `timestamp` timestamp NOT NULL default CURRENT_TIMESTAMP" );
20324
20325     NewVersion( $DBversion, 24329, 'Do not update action_log.timestamp' );
20326 }
20327
20328 $DBversion = '19.12.00.006';
20329 if( CheckVersion( $DBversion ) ) {
20330     $dbh->do( q|
20331         UPDATE borrowers SET relationship = NULL
20332         WHERE relationship = ""
20333     |);
20334
20335     NewVersion( $DBversion, 24263, 'Replace relationship with NULL when empty string' );
20336 }
20337
20338 $DBversion = '19.12.00.007';
20339 if ( CheckVersion($DBversion) ) {
20340
20341     $dbh->do(
20342         qq{
20343             INSERT IGNORE INTO account_credit_types (code, description, can_be_added_manually, is_system)
20344             VALUES
20345               ('REFUND', 'A refund applied to a patrons fine', 0, 1)
20346         }
20347     );
20348
20349     $dbh->do(qq{
20350         INSERT IGNORE INTO account_offset_types ( type ) VALUES ('REFUND');
20351     });
20352
20353     $dbh->do(qq{
20354         INSERT IGNORE permissions (module_bit, code, description)
20355         VALUES
20356         (10, 'refund', 'Perform account refund action')
20357     });
20358
20359     NewVersion( $DBversion, 23442, ['Add REFUND to account_credit_types', 'Add REFUND to account_offset_types', 'Add accounts refund permission'] );
20360 }
20361
20362 $DBversion = '19.12.00.008';
20363 if( CheckVersion( $DBversion ) ) {
20364     $dbh->do( 'UPDATE systempreferences SET value = REPLACE(value, "http://worldcat.org", "https://worldcat.org") WHERE variable = "OPACSearchForTitleIn"' );
20365     $dbh->do( 'UPDATE systempreferences SET value = REPLACE(value, "http://www.bookfinder.com", "https://www.bookfinder.com") WHERE variable = "OPACSearchForTitleIn"' );
20366     $dbh->do( 'UPDATE systempreferences SET value = REPLACE(value, "https://openlibrary.org/search/?", "https://openlibrary.org/search?") WHERE variable = "OPACSearchForTitleIn"' );
20367
20368     NewVersion( $DBversion, 24206, 'Update OpacSearchForTitleIn system preference' );
20369 }
20370
20371 $DBversion = '19.12.00.009';
20372 if( CheckVersion( $DBversion ) ) {
20373
20374     $dbh->do(q{
20375         INSERT IGNORE INTO account_offset_types ( type ) VALUES ( 'Purchase' );
20376     });
20377
20378     $dbh->do(q{
20379         INSERT IGNORE INTO account_credit_types ( code, description, can_be_added_manually, is_system )
20380         VALUES ('PURCHASE', 'Purchase', 0, 1);
20381     });
20382
20383     my $sth = $dbh->prepare(q{
20384         SELECT COUNT(*) FROM authorised_values WHERE category = 'PAYMENT_TYPE' AND authorised_value = 'CASH'
20385     });
20386     $sth->execute;
20387     my $already_exists = $sth->fetchrow;
20388     if ( not $already_exists ) {
20389         $dbh->do(q{
20390            INSERT INTO authorised_values (category,authorised_value,lib) VALUES ('PAYMENT_TYPE','CASH','Cash')
20391         });
20392     }
20393
20394     # Updating field in account_debit_types
20395     unless ( column_exists('account_debit_types', 'can_be_invoiced') ) {
20396         $dbh->do(
20397             qq{
20398                 ALTER TABLE account_debit_types
20399                 CHANGE COLUMN
20400                   can_be_added_manually can_be_invoiced tinyint(1) NOT NULL DEFAULT 1
20401               }
20402         );
20403     }
20404     unless ( column_exists('account_debit_types', 'can_be_sold') ) {
20405         $dbh->do(
20406             qq{
20407                 ALTER TABLE account_debit_types
20408                 ADD
20409                   can_be_sold tinyint(1) DEFAULT 0
20410                 AFTER
20411                   can_be_invoiced
20412               }
20413         );
20414     }
20415
20416     $dbh->do(q{
20417 INSERT IGNORE INTO `letter` (`module`, `code`, `branchcode`, `name`, `is_html`, `title`, `content`, `message_transport_type`, `lang`) VALUES
20418 ('pos', 'RECEIPT', '', 'Point of sale receipt', 0, 'Receipt', '[% PROCESS "accounts.inc" %]
20419 <table>
20420 [% IF ( LibraryName ) %]
20421  <tr>
20422     <th colspan="2" class="centerednames">
20423         <h3>[% LibraryName | html %]</h3>
20424     </th>
20425  </tr>
20426 [% END %]
20427  <tr>
20428     <th colspan="2" class="centerednames">
20429         <h2>[% Branches.GetName( payment.branchcode ) | html %]</h2>
20430     </th>
20431  </tr>
20432 <tr>
20433     <th colspan="2" class="centerednames">
20434         <h3>[% payment.date | $KohaDates %]</h3>
20435 </tr>
20436 <tr>
20437   <td>Transaction ID: </td>
20438   <td>[% payment.accountlines_id %]</td>
20439 </tr>
20440 <tr>
20441   <td>Operator ID: </td>
20442   <td>[% payment.manager_id %]</td>
20443 </tr>
20444 <tr>
20445   <td>Payment type: </td>
20446   <td>[% payment.payment_type %]</td>
20447 </tr>
20448  <tr></tr>
20449  <tr>
20450     <th colspan="2" class="centerednames">
20451         <h2><u>Fee receipt</u></h2>
20452     </th>
20453  </tr>
20454  <tr></tr>
20455  <tr>
20456     <th>Description of charges</th>
20457     <th>Amount</th>
20458   </tr>
20459
20460   [% FOREACH offset IN offsets %]
20461     <tr>
20462         <td>[% PROCESS account_type_description account=offset.debit %]</td>
20463         <td>[% offset.amount * -1 | $Price %]</td>
20464     </tr>
20465   [% END %]
20466
20467 <tfoot>
20468   <tr class="highlight">
20469     <td>Total: </td>
20470     <td>[% payment.amount * -1| $Price %]</td>
20471   </tr>
20472   <tr>
20473     <td>Tendered: </td>
20474     <td>[% collected | $Price %]</td>
20475   </tr>
20476   <tr>
20477     <td>Change: </td>
20478     <td>[% change | $Price %]</td>
20479     </tr>
20480 </tfoot>
20481 </table>', 'print', 'default');
20482     });
20483
20484     $dbh->do(qq{
20485         INSERT IGNORE permissions (module_bit, code, description)
20486         VALUES
20487         (25, 'takepayment', 'Access the point of sale page and take payments')
20488     });
20489
20490     NewVersion( $DBversion, 23354, [q|Add 'Purchase' account offset type|, q|Add 'RECEIPT' notice for Point of Sale|, q|Add point of sale permissions|] );
20491 }
20492
20493 $DBversion = '19.12.00.010';
20494 if( CheckVersion( $DBversion ) ) {
20495     if( !column_exists( 'oai_sets_mappings', 'rule_order' ) ) {
20496         $dbh->do( "ALTER TABLE oai_sets_mappings ADD COLUMN rule_order INT AFTER set_id, ADD COLUMN rule_operator VARCHAR(3) AFTER rule_order" );
20497         $dbh->do( "UPDATE oai_sets_mappings SET rule_operator='or'" );
20498         my $sets = $dbh->selectall_arrayref("SELECT * from oai_sets_mappings ORDER BY set_id", { Slice => {} });
20499         my $i = 0;
20500         my $previous_set_id;
20501         for my $set ( @{$sets}) {
20502             my $set_id = $set->{set_id};
20503     
20504             if ($previous_set_id && $previous_set_id != $set_id) {
20505                 $i = 0;
20506             }
20507     
20508             if ($i == 0) {
20509                 $dbh->do("UPDATE oai_sets_mappings SET rule_operator=NULL WHERE set_id=? LIMIT 1", {}, $set_id);
20510             }
20511     
20512             $dbh->do("UPDATE oai_sets_mappings SET rule_order=? WHERE set_id=? AND rule_order IS NULL LIMIT 1", {}, $i, $set_id);
20513     
20514             $i++;
20515             $previous_set_id = $set_id;
20516         }
20517     }
20518
20519     NewVersion( $DBversion, 21520, 'Add rule_order and rule_operator fields to oai_sets_mappings table' );
20520 }
20521
20522 $DBversion = '19.12.00.011';
20523 if( CheckVersion( $DBversion ) ) {
20524     if( !foreign_key_exists( 'repeatable_holidays', 'repeatable_holidays_ibfk_1' ) ) {
20525         $dbh->do(q|
20526             DELETE h
20527             FROM repeatable_holidays h
20528             LEFT JOIN branches b ON h.branchcode=b.branchcode
20529             WHERE b.branchcode IS NULL;
20530         |);
20531         $dbh->do(q|
20532             ALTER TABLE repeatable_holidays
20533             ADD FOREIGN KEY repeatable_holidays_ibfk_1 (branchcode) REFERENCES branches (branchcode) ON DELETE CASCADE ON UPDATE CASCADE
20534         |);
20535     }
20536
20537     if( !foreign_key_exists( 'special_holidays', 'special_holidays_ibfk_1' ) ) {
20538         $dbh->do(q|
20539             DELETE h
20540             FROM special_holidays h
20541             LEFT JOIN branches b ON h.branchcode=b.branchcode
20542             WHERE b.branchcode IS NULL;
20543         |);
20544         $dbh->do(q|
20545             ALTER TABLE special_holidays
20546             ADD FOREIGN KEY special_holidays_ibfk_1 (branchcode) REFERENCES branches (branchcode) ON DELETE CASCADE ON UPDATE CASCADE
20547         |);
20548     }
20549
20550     NewVersion( $DBversion, 24289, 'Adding foreign keys on *_holidays.branchcode tables' );
20551 }
20552
20553 $DBversion = '19.12.00.012';
20554 if( CheckVersion( $DBversion ) ) {
20555
20556     $dbh->do(qq{
20557         UPDATE
20558           `permissions`
20559         SET
20560           `module_bit` = 3
20561         WHERE
20562           `code` = 'manage_cash_registers'
20563     });
20564
20565     NewVersion( $DBversion, 24481, 'Move permission to correct module_bit' );
20566 }
20567
20568 $DBversion = '19.12.00.013';
20569 if( CheckVersion( $DBversion ) ) {
20570     $dbh->do(qq{
20571         INSERT IGNORE INTO 
20572           systempreferences (variable,value,options,explanation,type)
20573         VALUES
20574           ('EnablePointOfSale','0',NULL,'Enable the point of sale feature to allow anonymous transactions with the accounting system. (Requires UseCashRegisters)','YesNo')
20575     });
20576
20577     NewVersion( $DBversion, 24478, 'Add `EnablePointOfSale` system preference to allow disabling the point of sale feature)' );
20578 }
20579
20580 $DBversion = '19.12.00.014';
20581 if( CheckVersion( $DBversion ) ) {
20582     unless ( column_exists('branchtransfers', 'reason') ) {
20583         $dbh->do(
20584             qq{
20585                 ALTER TABLE branchtransfers
20586                 ADD
20587                   `reason` enum('Manual')
20588                 AFTER
20589                   comments
20590               }
20591         );
20592     }
20593
20594     NewVersion( $DBversion, 24287, q|Add 'reason' field to transfers table| );
20595 }
20596
20597 $DBversion = '19.12.00.015';
20598 if( CheckVersion( $DBversion ) ) {
20599
20600     # Add stockrotation states to reason enum
20601     $dbh->do(
20602         qq{
20603             ALTER TABLE
20604                 `branchtransfers`
20605             MODIFY COLUMN
20606                 `reason` enum(
20607                     'Manual',
20608                     'StockrotationAdvance',
20609                     'StockrotationRepatriation'
20610                 )
20611             AFTER `comments`
20612           }
20613     );
20614
20615     # Move stockrotation states to reason field
20616     $dbh->do(
20617         qq{
20618             UPDATE
20619               `branchtransfers`
20620             SET
20621               `reason` = 'StockrotationAdvance',
20622               `comments` = NULL
20623             WHERE
20624               `comments` = 'StockrotationAdvance'
20625           }
20626     );
20627     $dbh->do(
20628         qq{
20629             UPDATE
20630               `branchtransfers`
20631             SET
20632               `reason` = 'StockrotationRepatriation',
20633               `comments` = NULL
20634             WHERE
20635               `comments` = 'StockrotationRepatriation'
20636           }
20637     );
20638
20639     NewVersion( $DBversion, 24296, q|Update stockrotation to use 'reason' field in transfers table| );
20640 }
20641
20642 $DBversion = '19.12.00.016';
20643 if( CheckVersion( $DBversion ) ) {
20644     $dbh->do(q{
20645         INSERT IGNORE INTO `userflags` (`bit`, `flag`, `flagdesc`, `defaulton`)
20646         VALUES (12, 'suggestions', 'Suggestion management', 0)
20647     });
20648
20649     $dbh->do(q{
20650         UPDATE permissions SET module_bit=12
20651         WHERE code="suggestions_manage"
20652     });
20653
20654     $dbh->do(q{
20655         UPDATE borrowers SET flags = flags | (1<<12) WHERE flags & (1 << 11)
20656     });
20657
20658     NewVersion( $DBversion, 22868, 'Move suggestions_manage subpermission out of acquisition permission' );
20659 }
20660
20661 $DBversion = '19.12.00.017';
20662 if( CheckVersion( $DBversion ) ) {
20663     if( !index_exists( 'library_groups', 'library_groups_uniq_2' ) ) {
20664         $dbh->do(q|
20665             DELETE FROM library_groups
20666             WHERE id NOT IN (
20667                 SELECT MIN(id)
20668                 FROM ( SELECT * FROM library_groups ) AS lg
20669                 GROUP BY parent_id, branchcode
20670             )
20671             AND NOT(parent_id IS NULL OR branchcode IS NULL);
20672         |);
20673         $dbh->do(q|
20674             ALTER TABLE library_groups
20675             ADD UNIQUE KEY library_groups_uniq_2 (parent_id, branchcode)
20676         |);
20677     }
20678
20679     NewVersion( $DBversion, 21674, 'Add unique key (parent_id, branchcode) to library_group' );
20680 }
20681
20682 $DBversion = '19.12.00.018';
20683 if( CheckVersion( $DBversion ) ) {
20684     my @columns = qw(
20685         restrictedtype
20686         rentaldiscount
20687         fine
20688         finedays
20689         maxsuspensiondays
20690         suspension_chargeperiod
20691         firstremind
20692         chargeperiod
20693         chargeperiod_charge_at
20694         accountsent
20695         issuelength
20696         lengthunit
20697         hardduedate
20698         hardduedatecompare
20699         renewalsallowed
20700         renewalperiod
20701         norenewalbefore
20702         auto_renew
20703         no_auto_renewal_after
20704         no_auto_renewal_after_hard_limit
20705         reservesallowed
20706         holds_per_record
20707         holds_per_day
20708         onshelfholds
20709         opacitemholds
20710         overduefinescap
20711         cap_fine_to_replacement_price
20712         article_requests
20713         note
20714     );
20715
20716     $dbh->do(q|
20717         DELETE i FROM issuingrules i
20718         LEFT JOIN itemtypes it ON i.itemtype=it.itemtype
20719         WHERE it.itemtype IS NULL AND i.itemtype!='*'
20720     |);
20721     $dbh->do(q|
20722         DELETE i FROM issuingrules i
20723         LEFT JOIN branches b ON i.branchcode=b.branchcode
20724         WHERE b.branchcode IS NULL AND i.branchcode!='*'
20725     |);
20726     $dbh->do(q|
20727         DELETE i FROM issuingrules i
20728         LEFT JOIN categories c ON i.categorycode=c.categorycode
20729         WHERE c.categorycode IS NULL AND i.categorycode!='*'
20730     |);
20731     if ( column_exists( 'issuingrules', 'categorycode' ) ) {
20732         foreach my $column ( @columns ) {
20733             $dbh->do("
20734                 INSERT INTO circulation_rules ( categorycode, branchcode, itemtype, rule_name, rule_value )
20735                 SELECT IF(categorycode='*', NULL, categorycode), IF(branchcode='*', NULL, branchcode), IF(itemtype='*', NULL, itemtype), \'$column\', COALESCE( $column, '' )
20736                 FROM issuingrules
20737             ");
20738         }
20739         $dbh->do("
20740             DELETE FROM circulation_rules WHERE rule_name='holdallowed' AND rule_value='';
20741         ");
20742         $dbh->do("DROP TABLE issuingrules");
20743     }
20744
20745     NewVersion( $DBversion, 18936, 'Convert issuingrules fields to circulation_rules' );
20746 }
20747
20748 $DBversion = '19.12.00.019';
20749 if( CheckVersion( $DBversion ) ) {
20750
20751     $dbh->do("ALTER TABLE message_queue MODIFY time_queued timestamp NULL");
20752
20753     if( !column_exists( 'message_queue', 'updated_on' ) ) {
20754         $dbh->do("ALTER TABLE message_queue ADD COLUMN updated_on timestamp NOT NULL default CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP AFTER time_queued");
20755         $dbh->do("UPDATE message_queue SET updated_on=time_queued");
20756     }
20757
20758     NewVersion( $DBversion, 23673, 'modify time_queued and add updated_on to message_queue' );
20759 }
20760
20761 $DBversion = '19.12.00.020';
20762 if ( CheckVersion($DBversion) ) {
20763     if ( !column_exists( 'marc_subfield_structure', 'important') ){
20764         $dbh->do("ALTER TABLE marc_subfield_structure ADD COLUMN important TINYINT(4) NOT NULL DEFAULT 0  AFTER mandatory");
20765     }
20766     if ( !column_exists( 'marc_tag_structure', 'important') ){
20767         $dbh->do("ALTER TABLE marc_tag_structure ADD COLUMN important TINYINT(4) NOT NULL DEFAULT 0  AFTER mandatory");
20768     }
20769
20770     NewVersion( $DBversion, 8643, 'Add important constraint to marc subfields' );
20771 }
20772
20773 $DBversion = '19.12.00.021';
20774 if( CheckVersion( $DBversion ) ) {
20775
20776     # Add LOST_FOUND debit type
20777     $dbh->do(qq{
20778         INSERT IGNORE INTO
20779           account_credit_types ( code, description, can_be_added_manually, is_system )
20780         VALUES
20781           ('LOST_FOUND', 'Lost item fee refund', 0, 1)
20782     });
20783
20784     # Migrate LOST_RETURN to LOST_FOUND
20785     $dbh->do(qq{
20786         UPDATE
20787           accountlines
20788         SET
20789           credit_type_code = 'LOST_FOUND'
20790         WHERE
20791           credit_type_code = 'LOST_RETURN'
20792         OR
20793           credit_type_code = 'LOST_RETURNED'
20794     });
20795
20796     # Migrate LOST + RETURNED to LOST + FOUND
20797     $dbh->do(qq{
20798         UPDATE
20799           accountlines
20800         SET
20801           status = 'FOUND'
20802         WHERE
20803           debit_type_code = 'LOST'
20804         AND
20805           status = 'RETURNED'
20806     });
20807
20808     # Drop LOST_RETURNED credit type
20809     $dbh->do(qq{
20810         DELETE FROM account_credit_types WHERE code = 'LOST_RETURNED'
20811     });
20812
20813     # Drop LOST_RETURN credit type
20814     $dbh->do(qq{
20815         DELETE FROM account_credit_types WHERE code = 'LOST_RETURN'
20816     });
20817
20818     # Add Lost Item Found offset type
20819     $dbh->do(qq{
20820         INSERT IGNORE INTO
20821           account_offset_types ( type )
20822         VALUES
20823           ( 'Lost Item Found' )
20824     });
20825
20826     NewVersion( $DBversion, 24592, 'Update LOST_RETURN to LOST_FOUND');
20827 }
20828
20829 $DBversion = '19.12.00.022';
20830 if( CheckVersion( $DBversion ) ) {
20831     $dbh->do( "ALTER TABLE items MODIFY COLUMN uri MEDIUMTEXT" );
20832     $dbh->do( "ALTER TABLE deleteditems MODIFY COLUMN uri MEDIUMTEXT" );
20833
20834     NewVersion( $DBversion, 20882, 'items.uri to MEDIUMTEXT');
20835 }
20836
20837 $DBversion = '19.12.00.023';
20838 if( CheckVersion( $DBversion ) ) {
20839     $dbh->do( "ALTER TABLE quotes MODIFY timestamp datetime NULL" );
20840
20841     NewVersion( $DBversion, 24640, 'Allow quotes.timestamp to be NULL');
20842 }
20843
20844 $DBversion = '19.12.00.024';
20845 if( CheckVersion( $DBversion ) ) {
20846     $dbh->do(q{
20847         UPDATE systempreferences SET value = 'off'
20848         WHERE variable = 'finesMode' AND (value <> 'production' OR value IS NULL)
20849     });
20850     $dbh->do(q{
20851         UPDATE systempreferences SET options = 'off|production',
20852         explanation = "Choose the fines mode, 'off' (do not accrue fines) or 'production' (accrue overdue fines).  Requires accruefines cronjob or CalculateFinesOnReturn system preference."
20853         WHERE variable = 'finesMode'
20854     });
20855
20856     NewVersion( $DBversion, 21633, 'Remove finesMode "test"');
20857 }
20858
20859 $DBversion = '19.12.00.025';
20860 if( CheckVersion( $DBversion ) ) {
20861     $dbh->do(q{
20862         INSERT IGNORE INTO `systempreferences` (variable,value,options,explanation,type)
20863         VALUES ('DumpSearchQueryTemplate',0,'','Add the search query being passed to the search engine into the template for debugging','YesNo')
20864     });
20865
20866     NewVersion( $DBversion, 24103, 'add DumpSearchQueryTemplate syspref');
20867 }
20868
20869 $DBversion = '19.12.00.026';
20870 if( CheckVersion( $DBversion ) ) {
20871     if( !column_exists( 'z3950servers', 'attributes' ) ) {
20872         $dbh->do( "ALTER TABLE z3950servers ADD COLUMN attributes VARCHAR(255) after add_xslt" );
20873     }
20874
20875     NewVersion( $DBversion, 11297, 'Add support for custom PQF attributes for Z39.50 server searches');
20876 }
20877
20878 $DBversion = '19.12.00.027';
20879 if( CheckVersion( $DBversion ) ) {
20880
20881     # Add any pathalogical incorrect debit_types as credit_types as appropriate
20882     $dbh->do(
20883         qq{
20884           INSERT IGNORE INTO account_credit_types (
20885             code,
20886             description,
20887             can_be_added_manually,
20888             is_system
20889           )
20890           SELECT
20891             DISTINCT(debit_type_code),
20892             "Unexpected type found during upgrade",
20893             1,
20894             0
20895           FROM
20896             accountlines
20897           WHERE
20898             amount < 0
20899           AND
20900             debit_type_code IS NOT NULL
20901         }
20902     );
20903
20904     # Correct any pathalogical cases
20905     $dbh->do( qq{
20906       UPDATE
20907         accountlines
20908       SET
20909         credit_type_code = debit_type_code,
20910         debit_type_code = NULL
20911       WHERE
20912         amount < 0
20913       AND
20914         debit_type_code IS NOT NULL
20915     });
20916
20917     NewVersion( $DBversion, 24532, 'Fix pathological cases of negative debits');
20918 }
20919
20920 $DBversion = '19.12.00.028';
20921 if( CheckVersion( $DBversion ) ) {
20922     $dbh->do(q{
20923         INSERT IGNORE INTO systempreferences (variable,value,options,explanation,type)
20924         VALUES
20925         ('OpacBrowseSearch', '0',NULL, "Elasticsearch only: add a page allowing users to 'browse' all items in the collection",'YesNo')
20926     });
20927
20928     NewVersion( $DBversion, 14567, 'Add OpacBrowseSearch syspref');
20929 }
20930
20931 $DBversion = '19.12.00.029';
20932 if( CheckVersion( $DBversion ) ) {
20933     if (!column_exists('account_credit_types', 'archived')) {
20934         $dbh->do('ALTER TABLE account_credit_types ADD COLUMN archived tinyint(1) NOT NULL DEFAULT 0 AFTER is_system');
20935     }
20936
20937     NewVersion( $DBversion, 17702, 'Add column account_credit_types.archived');
20938 }
20939
20940 $DBversion = '19.12.00.030';
20941 if( CheckVersion( $DBversion ) ) {
20942
20943     # get list of installed translations
20944     require C4::Languages;
20945     my @langs;
20946     my $tlangs = C4::Languages::getTranslatedLanguages('opac','bootstrap');
20947
20948     foreach my $language ( @$tlangs ) {
20949         foreach my $sublanguage ( @{$language->{'sublanguages_loop'}} ) {
20950             push @langs, $sublanguage->{'rfc4646_subtag'};
20951         }
20952     }
20953
20954     # Get any existing value from the opacheader system preference
20955     my ($opacheader) = $dbh->selectrow_array( q|
20956         SELECT value FROM systempreferences WHERE variable='opacheader';
20957     |);
20958
20959     my @detail;
20960     if( $opacheader ){
20961         foreach my $lang ( @langs ) {
20962             # If there is a value in the opacheader preference, insert it into opac_news
20963             $dbh->do("INSERT INTO opac_news (branchcode, lang, title, content ) VALUES (NULL, ?, '', ?)", undef, "opacheader_$lang", $opacheader);
20964             push @detail, "Inserted opacheader contents into $lang news item...";
20965         }
20966     }
20967     # Remove the opacheader system preference
20968     $dbh->do("DELETE FROM systempreferences WHERE variable='opacheader'");
20969
20970     unshift @detail, 'Move contents of opacheader preference to Koha news system';
20971     NewVersion( $DBversion, 22880, \@detail);
20972 }
20973
20974 $DBversion = '19.12.00.031';
20975 if( CheckVersion( $DBversion ) ) {
20976     $dbh->do( q|
20977 ALTER TABLE article_requests MODIFY COLUMN created_on timestamp NULL, MODIFY COLUMN updated_on timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp()
20978     |);
20979
20980     NewVersion( $DBversion, 22273, "Column article_requests.created_on should not be updated" );
20981 }
20982
20983 $DBversion = '19.12.00.032';
20984 if( CheckVersion( $DBversion ) ) {
20985     $dbh->do( q|
20986         DELETE FROM systempreferences WHERE variable="UseQueryParser"
20987     |);
20988
20989     NewVersion( $DBversion, 24735, "Remove UseQueryParser system preference" );
20990 }
20991
20992 $DBversion = '19.12.00.033';
20993 if ( CheckVersion($DBversion) ) {
20994
20995     # Add cash_register_actions table
20996     if ( !TableExists('cash_register_actions') ) {
20997         $dbh->do(qq{
20998             CREATE TABLE `cash_register_actions` (
20999               `id` int(11) NOT NULL auto_increment, -- unique identifier for each account register action
21000               `code` varchar(24) NOT NULL, -- action code denoting the type of action recorded (enum),
21001               `register_id` int(11) NOT NULL, -- id of cash_register this action belongs to,
21002               `manager_id` int(11) NOT NULL, -- staff member performing the action
21003               `amount` decimal(28,6) DEFAULT NULL, -- amount recorded in action (signed)
21004               `timestamp` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
21005               PRIMARY KEY (`id`),
21006               CONSTRAINT `cash_register_actions_manager` FOREIGN KEY (`manager_id`) REFERENCES `borrowers` (`borrowernumber`) ON DELETE CASCADE ON UPDATE CASCADE,
21007               CONSTRAINT `cash_register_actions_register` FOREIGN KEY (`register_id`) REFERENCES `cash_registers` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
21008             ) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
21009         });
21010     }
21011
21012     # Add cashup permission
21013     $dbh->do(qq{
21014         INSERT IGNORE permissions (module_bit, code, description)
21015         VALUES
21016         (25, 'cashup', 'Perform cash register cashup action')
21017     });
21018
21019     NewVersion( $DBversion, 23355, [ "Add cash_register_actions table", "Add cash register cashup permissions" ] );
21020 }
21021
21022 $DBversion = '19.12.00.034';
21023 if ( CheckVersion($DBversion) ) {
21024
21025     $dbh->do(
21026         qq{
21027             INSERT IGNORE INTO account_credit_types (code, description, can_be_added_manually, is_system)
21028             VALUES
21029               ('DISCOUNT', 'A discount applied to a patrons fine', 0, 1)
21030         }
21031     );
21032
21033     $dbh->do(
21034         qq{
21035         INSERT IGNORE INTO account_offset_types ( type ) VALUES ('DISCOUNT');
21036     }
21037     );
21038
21039     $dbh->do(
21040         qq{
21041         INSERT IGNORE permissions (module_bit, code, description)
21042         VALUES
21043         (10, 'discount', 'Perform account discount action')
21044     }
21045     );
21046
21047     NewVersion( $DBversion, 24081, "Add DISCOUNT to account_credit_types and account_offset_types, Add accounts discount permission");
21048 }
21049
21050 $DBversion = '19.12.00.035';
21051 if ( CheckVersion($DBversion) ) {
21052
21053     $dbh->do(qq{
21054         INSERT IGNORE permissions (module_bit, code, description)
21055         VALUES
21056         (25, 'anonymous_refund', 'Perform refund actions from cash registers')
21057     });
21058
21059     NewVersion( $DBversion, 23442, "Add a refund option to the point of sale system" );
21060 }
21061
21062 $DBversion = '19.12.00.036';
21063 if( CheckVersion( $DBversion ) ) {
21064     $dbh->do(q{
21065         INSERT IGNORE INTO `systempreferences`
21066             (`variable`, `value`, `options`, `explanation`, `type`)
21067         VALUES
21068             ('AccessControlAllowOrigin', '', NULL, 'Set the Access-Control-Allow-Origin header to the specified value', 'Free');
21069     });
21070
21071     NewVersion( $DBversion, 24369, "Add CORS support to Koha");
21072 }
21073
21074 $DBversion = '19.12.00.037';
21075 if( CheckVersion( $DBversion ) ) {
21076
21077     $dbh->do( q| INSERT IGNORE INTO systempreferences (variable, value, explanation, options, type) VALUES ('RenewAccruingItemInOpac', '0', 'If enabled, when the fines on an item accruing is paid off in the OPAC via a payment plugin, attempt to renew that item. If the syspref "RenewalPeriodBase" is set to "due date", renewed items may still be overdue', '', 'YesNo'); | );
21078     
21079     $dbh->do( q| INSERT IGNORE INTO systempreferences (variable, value, explanation, options, type) VALUES ('RenewAccruingItemWhenPaid', '0', 'If enabled, when the fines on an item accruing is paid off, attempt to renew that item. If the syspref "RenewalPeriodBase" is set to "due date", renewed items may still be overdue', '', 'YesNo'); | );
21080
21081     NewVersion( $DBversion, 23051, [ "Add RenewAccruingItemInOpac syspref", "Add RenewAccruingItemWhenPaid syspref" ]);
21082 }
21083
21084 $DBversion = '19.12.00.038';
21085 if( CheckVersion( $DBversion ) ) {
21086     $dbh->do( q| INSERT IGNORE INTO systempreferences (variable, value, explanation, options, type) VALUES ('CirculateILL', '0', 'If enabled, it is possible to circulate ILL requested items from within ILL', '', 'YesNo'); | );
21087
21088     NewVersion( $DBversion, 23112, "Add CirculateILL syspref");
21089 }
21090
21091 $DBversion = '19.12.00.039';
21092 if( CheckVersion( $DBversion ) ) {
21093     $dbh->do( "DROP TABLE IF EXISTS printers" );
21094
21095     if( column_exists( 'branches', 'branchprinter' ) ) {
21096         $dbh->do( "ALTER TABLE branches DROP COLUMN branchprinter" );
21097     }
21098
21099     $dbh->do(qq{ DELETE FROM systempreferences WHERE variable = "printcirculationslips"} );
21100
21101     NewVersion( $DBversion, 17845, "Drop unused table printers and branchprinter column");
21102 }
21103
21104 $DBversion = '19.12.00.040';
21105 if( CheckVersion( $DBversion ) ) {
21106     $dbh->do( "UPDATE systempreferences SET  explanation = 'Comma separated list defining the default fields to be used during a patron search using the \"standard\" option. If empty Koha will default to \"surname,firstname,othernames,cardnumber,userid\". Additional fields added to this preference will be added as search options in the dropdown menu on the patron search page.' WHERE variable='DefaultPatronSearchFields' " );
21107
21108     NewVersion( $DBversion, 17374, "Update description of DefaultPatronSearchFields");
21109 }
21110
21111 $DBversion = '19.12.00.041';
21112 if( CheckVersion( $DBversion ) ) {
21113
21114     # Update existing NULL priorities
21115     $dbh->do(q|
21116         UPDATE reserves SET priority = 1 WHERE priority IS NULL
21117     |);
21118
21119     $dbh->do(q|
21120         ALTER TABLE reserves MODIFY priority SMALLINT(6) NOT NULL DEFAULT 1
21121     |);
21122
21123     $dbh->do(q|
21124         UPDATE old_reserves SET priority = 1 WHERE priority IS NULL
21125     |);
21126
21127     $dbh->do(q|
21128         ALTER TABLE old_reserves MODIFY priority SMALLINT(6) NOT NULL DEFAULT 1
21129     |);
21130
21131     NewVersion( $DBversion, 24722, "Enforce NOT NULL constraint for reserves.priority");
21132 }
21133
21134 $DBversion = '19.12.00.042';
21135 if( CheckVersion( $DBversion ) ) {
21136     if (!column_exists('message_queue', 'reply_address')) {
21137         $dbh->do('ALTER TABLE message_queue ADD COLUMN reply_address LONGTEXT AFTER from_address');
21138     }
21139
21140     NewVersion( $DBversion, 22821, "Add reply_address to message_queue");
21141 }
21142
21143 $DBversion = '19.12.00.043';
21144 if( CheckVersion( $DBversion ) ) {
21145
21146     # Add return reasons to enum
21147     $dbh->do(
21148         qq{
21149             ALTER TABLE
21150                 `branchtransfers`
21151             MODIFY COLUMN
21152                 `reason` enum(
21153                     'Manual',
21154                     'StockrotationAdvance',
21155                     'StockrotationRepatriation',
21156                     'ReturnToHome',
21157                     'ReturnToHolding'
21158                 )
21159             AFTER `comments`
21160           }
21161     );
21162
21163     NewVersion( $DBversion, 24296, "Add 'return' reasons to branchtransfers enum");
21164 }
21165
21166 $DBversion = '19.12.00.044';
21167 if( CheckVersion( $DBversion ) ) {
21168     $dbh->do(qq{
21169         INSERT IGNORE permissions (module_bit, code, description)
21170         VALUES
21171         (13, 'batch_extend_due_dates', 'Perform batch extend due dates')
21172     });
21173
21174     NewVersion( $DBversion, 24846, "Add a new permission for new tool batch extend due dates");
21175 }
21176
21177 $DBversion = '19.12.00.045';
21178 if( CheckVersion( $DBversion ) ) {
21179     $dbh->do(q{
21180         INSERT IGNORE INTO systempreferences (variable,value,options,explanation,type) 
21181         VALUES
21182         ('CollapseFieldsPatronAddForm','',NULL,'Collapse these fields by default when adding a new patron. These fields can still be expanded.','Multiple') 
21183     });
21184
21185     NewVersion( $DBversion, 4461, "Add CollapseFieldsPatronAddForm system preference");
21186 }
21187
21188 $DBversion = '19.12.00.046';
21189 if( CheckVersion( $DBversion ) ) {
21190
21191     $dbh->do( "ALTER TABLE accountlines MODIFY COLUMN date TIMESTAMP NULL" );
21192
21193     NewVersion( $DBversion, 24818, "Update 'accountlines.date' from DATE to TIMESTAMP");
21194 }
21195
21196 $DBversion = '19.12.00.047';
21197 if( CheckVersion( $DBversion ) ) {
21198     $dbh->do(q{
21199         ALTER TABLE biblioimages
21200         ADD `timestamp` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
21201         AFTER `thumbnail`;
21202     });
21203
21204     NewVersion( $DBversion, 22987, "Add biblioimages.timestamp");
21205 }
21206
21207 $DBversion = '19.12.00.048';
21208 if( CheckVersion( $DBversion ) ) {
21209
21210     # Add rotating collection states to reason enum
21211     $dbh->do(
21212         qq{
21213             ALTER TABLE
21214                 `branchtransfers`
21215             MODIFY COLUMN
21216                 `reason` enum(
21217                     'Manual',
21218                     'StockrotationAdvance',
21219                     'StockrotationRepatriation',
21220                     'ReturnToHome',
21221                     'ReturnToHolding',
21222                     'RotatingCollection'
21223                 )
21224             AFTER `comments`
21225           }
21226     );
21227
21228     NewVersion( $DBversion, 24299, "Add 'collection' reasons to branchtransfers enum");
21229 }
21230
21231 $DBversion = '19.12.00.049';
21232 if( CheckVersion( $DBversion ) ) {
21233
21234     # Add reserve reasons enum
21235     $dbh->do(
21236         qq{
21237             ALTER TABLE
21238                 `branchtransfers`
21239             MODIFY COLUMN
21240                 `reason` enum(
21241                     'Manual',
21242                     'StockrotationAdvance',
21243                     'StockrotationRepatriation',
21244                     'ReturnToHome',
21245                     'ReturnToHolding',
21246                     'RotatingCollection',
21247                     'Reserve',
21248                     'LostReserve',
21249                     'CancelReserve'
21250                 )
21251             AFTER `comments`
21252           }
21253     );
21254
21255     NewVersion( $DBversion, 24299, "Add 'reserve' reasons to branchtransfers enum");
21256 }
21257
21258 $DBversion = '19.12.00.050';
21259 if( CheckVersion( $DBversion ) ) {
21260     $dbh->do( "DELETE FROM systempreferences WHERE variable in ('IDreamBooksReadometer','IDreamBooksResults','IDreamBooksReviews')" );
21261
21262     NewVersion( $DBversion, 24854, "Remove IDreamBooks* system preferences");
21263 }
21264
21265 $DBversion = '19.12.00.051';
21266 if( CheckVersion( $DBversion ) ) {
21267     $dbh->do(q{
21268         UPDATE systempreferences SET options = 'itemhomebranch|patronhomebranch|checkoutbranch|none' WHERE variable='OpacRenewalBranch'
21269     });
21270     $dbh->do(q{
21271         UPDATE systempreferences SET value = "none" WHERE variable='OpacRenewalBranch'
21272         AND value = 'NULL'
21273     });
21274     $dbh->do(q{
21275         UPDATE systempreferences SET value = 'opacrenew' WHERE variable='OpacRenewalBranch'
21276         AND value NOT IN ('checkoutbranch','itemhomebranch','opacrenew','patronhomebranch','none')
21277     });
21278
21279     NewVersion( $DBversion, 24759, "Cleanup OpacRenewalBranch");
21280 }
21281
21282 $DBversion = '19.12.00.052';
21283 if( CheckVersion( $DBversion ) ) {
21284     my $finesCalendar = C4::Context->preference('finesCalendar');
21285     my $value = $finesCalendar eq 'noFinesWhenClosed' ? 1 : 0;
21286
21287     if( !column_exists( 'itemtypes', 'rentalcharge_daily_calendar' ) ) {
21288         $dbh->do(q{
21289             ALTER TABLE itemtypes ADD COLUMN
21290             rentalcharge_daily_calendar tinyint(1) NOT NULL DEFAULT 1
21291             AFTER rentalcharge_daily;
21292         });
21293
21294         $dbh->do("UPDATE itemtypes SET rentalcharge_daily_calendar = $value");
21295     }
21296
21297     if( !column_exists( 'itemtypes', 'rentalcharge_hourly_calendar' ) ) {
21298         $dbh->do(q{
21299             ALTER TABLE itemtypes ADD COLUMN
21300             rentalcharge_hourly_calendar tinyint(1) NOT NULL DEFAULT 1
21301             AFTER rentalcharge_hourly;
21302         });
21303
21304         $dbh->do("UPDATE itemtypes SET rentalcharge_hourly_calendar = $value");
21305     }
21306
21307     NewVersion( $DBversion, 21443, "Add ability to exclude holidays when calculating rentals fees by time period");
21308 }
21309
21310 $DBversion = '19.12.00.053';
21311 if( CheckVersion( $DBversion ) ) {
21312     unless( column_exists('borrowers','autorenew_checkouts') ){
21313         $dbh->do( "ALTER TABLE borrowers ADD COLUMN autorenew_checkouts TINYINT(1) NOT NULL DEFAULT 1 AFTER anonymized" );
21314     }
21315     unless( column_exists('deletedborrowers','autorenew_checkouts') ){
21316         $dbh->do( "ALTER TABLE deletedborrowers ADD COLUMN autorenew_checkouts TINYINT(1) NOT NULL DEFAULT 1 AFTER anonymized" );
21317     }
21318     $dbh->do(q{
21319         INSERT IGNORE INTO systempreferences
21320         ( `variable`, `value`, `options`, `explanation`, `type` )
21321         VALUES
21322         ('AllowPatronToControlAutorenewal','0',NULL,'If enabled, patrons will have a field in their account to choose whether their checkouts are auto renewed or not','YesNo')
21323     });
21324
21325     NewVersion( $DBversion, 24476, "Allow patrons to opt-out of autorenewal");
21326 }
21327
21328 $DBversion = '19.12.00.054';
21329 if( CheckVersion( $DBversion ) ) {
21330
21331     if ( !TableExists('desks') ) {
21332         $dbh->do(qq{
21333              CREATE TABLE `desks` ( -- desks available in a library
21334                `desk_id` int(11) NOT NULL auto_increment, -- unique identifier added by Koha
21335                `desk_name` varchar(100) NOT NULL default '', -- name of the desk
21336                `branchcode` varchar(10) NOT NULL,       -- library the desk is located at
21337                PRIMARY KEY (`desk_id`),
21338                KEY `fk_desks_branchcode` (`branchcode`),
21339                CONSTRAINT `fk_desks_branchcode` FOREIGN KEY (`branchcode`) REFERENCES `branches` (`branchcode`) ON DELETE CASCADE ON UPDATE CASCADE
21340              ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
21341         });
21342     }
21343
21344     NewVersion( $DBversion, 13881, "Add desk management");
21345 }
21346
21347 $DBversion = '19.12.00.055';
21348 if( CheckVersion( $DBversion ) ) {
21349     if( !column_exists( 'suggestions', 'lastmodificationby' ) ) {
21350         $dbh->do(q|
21351             ALTER TABLE suggestions ADD COLUMN lastmodificationby INT(11) DEFAULT NULL AFTER rejecteddate
21352         |);
21353
21354         $dbh->do(q|
21355             ALTER TABLE suggestions ADD CONSTRAINT `suggestions_ibfk_lastmodificationby` FOREIGN KEY (`lastmodificationby`) REFERENCES `borrowers` (`borrowernumber`) ON DELETE SET NULL ON UPDATE CASCADE
21356         |);
21357     }
21358
21359     if( !column_exists( 'suggestions', 'lastmodificationdate' ) ) {
21360         $dbh->do(q|
21361             ALTER TABLE suggestions ADD COLUMN lastmodificationdate DATE DEFAULT NULL AFTER lastmodificationby
21362         |);
21363
21364         my $suggestions = $dbh->selectall_arrayref(q|
21365             SELECT suggestionid, managedby, manageddate, acceptedby, accepteddate, rejectedby, rejecteddate
21366             FROM suggestions
21367         |, { Slice => {} });
21368         for my $suggestion ( @$suggestions ) {
21369             my ( $max_date ) = sort ( $suggestion->{manageddate} || (), $suggestion->{accepteddate} || (), $suggestion->{rejecteddate} || () );
21370             next unless $max_date;
21371             my $last_modif_by = ( defined $suggestion->{manageddate} and $max_date eq $suggestion->{manageddate} )
21372               ? $suggestion->{managedby}
21373               : ( defined $suggestion->{accepteddate} and $max_date eq $suggestion->{accepteddate} )
21374               ? $suggestion->{acceptedby}
21375               : ( defined $suggestion->{rejecteddate} and $max_date eq $suggestion->{rejecteddate} )
21376               ? $suggestion->{rejectedby}
21377               : undef;
21378             next unless $last_modif_by;
21379             $dbh->do(q|
21380                 UPDATE suggestions
21381                 SET lastmodificationdate = ?, lastmodificationby = ?
21382                 WHERE suggestionid = ?
21383             |, undef, $max_date, $last_modif_by, $suggestion->{suggestionid});
21384         }
21385
21386     }
21387
21388     $dbh->do( q|
21389         INSERT IGNORE INTO letter(module, code, branchcode, name, is_html, title, content, message_transport_type, lang) VALUES ('suggestions', 'NOTIFY_MANAGER', '', 'Notify manager of a suggestion', 0, "A suggestion has been assigned to you", "Dear [% borrower.firstname %] [% borrower.surname %],\nA suggestion has been assigned to you: [% suggestion.title %].\nThank you,\n[% branch.branchname %]", 'email', 'default');
21390     | );
21391
21392     NewVersion( $DBversion, 23590, "Add lastmodificationby and lastmodificationdate to the suggestions table");
21393 }
21394
21395 $DBversion = '19.12.00.056';
21396 if( CheckVersion( $DBversion ) ) {
21397
21398     $dbh->do( "DELETE FROM systempreferences WHERE variable='UseKohaPlugins'" );
21399
21400     NewVersion( $DBversion, 20415, "Remove UseKohaPlugins preference");
21401 }
21402
21403 $DBversion = '19.12.00.057';
21404 if( CheckVersion( $DBversion ) ) {
21405
21406     $dbh->do( "DELETE FROM systempreferences WHERE variable='INTRAdidyoumean'" );
21407
21408     NewVersion( $DBversion, 20399, "Remove INTRAdidyoumean preference");
21409 }
21410
21411 $DBversion = '19.12.00.058';
21412 if( CheckVersion( $DBversion ) ) {
21413     $dbh->do(q{
21414         INSERT IGNORE INTO systempreferences (`variable`, `value`, `options`, `explanation`,`type`) VALUES
21415         ('OPACnumSearchResultsDropdown', 0, NULL, 'Enable option list of number of results per page to show in OPAC search results','YesNo'),
21416         ('numSearchResultsDropdown', 0, NULL, 'Enable option list of number of results per page to show in staff client search results','YesNo')
21417     });
21418
21419     NewVersion( $DBversion, 14715, "Add sysprefs numSearchResultsDropdown and OPACnumSearchResultsDropdown");
21420 }
21421
21422 $DBversion = '19.12.00.059';
21423 if( CheckVersion( $DBversion ) ) {
21424
21425     for my $column ( qw(othersupplier booksellerfax booksellerurl bookselleremail currency) ) {
21426         if( column_exists( 'aqbooksellers', $column ) ) {
21427             my ($count) = $dbh->selectrow_array(qq|
21428                 SELECT COUNT(*)
21429                 FROM aqbooksellers
21430                 WHERE $column IS NOT NULL AND $column <> ""
21431             |);
21432             if ( $count ) {
21433                 warn "Warning - Cannot remove column aqbooksellers.$column. At least one value exists";
21434             } else {
21435                 $dbh->do(qq|
21436                     ALTER TABLE aqbooksellers
21437                     DROP COLUMN $column
21438                 |);
21439             }
21440         }
21441     }
21442
21443     NewVersion( $DBversion, 18177, "Remove some unused columns from aqbooksellers");
21444 }
21445
21446 $DBversion = '19.12.00.060';
21447 if( CheckVersion( $DBversion ) ) {
21448     $dbh->do(q{
21449         ALTER TABLE search_marc_map CHANGE marc_type `marc_type` enum('marc21','normarc','unimarc') COLLATE utf8mb4_unicode_ci NOT NULL COMMENT 'what MARC type this map is for';
21450     });
21451     NewVersion( $DBversion, 23204, "Change enum order for marc_type in search_marc_map to fix sorting");
21452 }
21453
21454 $DBversion = '19.12.00.061';
21455 if ( CheckVersion($DBversion) ) {
21456     $dbh->do(q{
21457         UPDATE
21458           systempreferences
21459         SET
21460           options = "batchmod|moredetail|cronjob|additem|pendingreserves|onpayment"
21461         WHERE
21462           variable = "MarkLostItemsAsReturned"
21463     });
21464
21465     my $lost_item_returned = C4::Context->preference("MarkLostItemsAsReturned");
21466     my @set = split( ",", $lost_item_returned );
21467     push @set, 'onpayment';
21468     $lost_item_returned = join( ",", @set );
21469
21470     $dbh->do(qq{
21471         UPDATE
21472           systempreferences
21473         SET
21474           value = "$lost_item_returned"
21475         WHERE
21476           variable = "MarkLostItemsAsReturned"
21477     });
21478
21479     NewVersion( $DBversion, 24474, "Add `onpayment` option to MarkLostItemsAsReturned");
21480 }
21481
21482 $DBversion = '19.12.00.062';
21483 if( CheckVersion( $DBversion ) ) {
21484     $dbh->do( "UPDATE account_debit_types SET description = REPLACE(description,'Rewewal','Renewal') WHERE description like '%Rewewal%'" );
21485
21486     NewVersion( $DBversion, 25010, "Fix typo in account_debit_type description");
21487 }
21488
21489 $DBversion = '19.12.00.063';
21490 if( CheckVersion( $DBversion ) ) {
21491     $dbh->do(q{INSERT IGNORE INTO systempreferences (variable, value, options, explanation, type) VALUES ('PrefillGuaranteeField', 'phone,email,streetnumber,address,city,state,zipcode,country', NULL, 'Prefill these fields in guarantee member entry form from guarantor patron record', 'Multiple') });
21492
21493     NewVersion( $DBversion, 22534, "Add PreFillGuaranteeField syspref");
21494 }
21495
21496 $DBversion = '19.12.00.064';
21497 if( CheckVersion( $DBversion ) ) {
21498
21499     $dbh->do( q|
21500         INSERT IGNORE INTO systempreferences ( `variable`, `value`, `options`, `explanation`, `type` )
21501             SELECT 'OpacNoItemTypeImages', value, NULL, 'If ON, disables itemtype images in the OPAC','YesNo'
21502             FROM (SELECT value FROM systempreferences WHERE variable="NoItemTypeImages") tmp
21503     | );
21504     $dbh->do( "UPDATE systempreferences SET explanation = 'If ON, disables itemtype images in the staff interface'
21505         WHERE variable = 'noItemTypeImages' ");
21506
21507     NewVersion( $DBversion, 4944, "Add new system preference OpacNoItemTypeImages");
21508 }
21509
21510 $DBversion = '19.12.00.065';
21511 if( CheckVersion( $DBversion ) ) {
21512
21513     $dbh->do( q| 
21514         INSERT IGNORE INTO systempreferences (variable, value, explanation, options, type) 
21515         VALUES ('ILLCheckAvailability', '0', 'If enabled, during the ILL request process third party sources will be checked for current availability', '', 'YesNo')
21516     | );
21517
21518     NewVersion( $DBversion, 23173, "Add ILLCheckAvailability syspref");
21519 }
21520
21521 $DBversion = '19.12.00.066';
21522 if ( CheckVersion($DBversion) ) {
21523     $dbh->do(
21524 q{INSERT IGNORE INTO systempreferences (variable,value,options,explanation,type) VALUES ('OPACReportProblem', 0, NULL, 'Allow patrons to submit problem reports for OPAC pages to the library or Koha Administrator', 'YesNo') }
21525     );
21526     $dbh->do(
21527 q{INSERT IGNORE INTO letter (module, code, name, title, content, message_transport_type) VALUES ('members', 'PROBLEM_REPORT','OPAC Problem Report','OPAC Problem Report','Username: <<problem_reports.username>>\n\nProblem page: <<problem_reports.problempage>>\n\nTitle: <<problem_reports.title>>\n\nMessage: <<problem_reports.content>>','email') }
21528     );
21529     if ( !TableExists('problem_reports') ) {
21530         $dbh->do(
21531             q{ CREATE TABLE problem_reports (
21532             reportid int(11) NOT NULL auto_increment, -- unique identifier assigned by Koha
21533             title varchar(40) NOT NULL default '', -- report subject line
21534             content varchar(255) NOT NULL default '', -- report message content
21535             borrowernumber int(11) NOT NULL default 0, -- the user who created the problem report
21536             branchcode varchar(10) NOT NULL default '', -- borrower's branch
21537             username varchar(75) default NULL, -- OPAC username
21538             problempage TEXT default NULL, -- page the user triggered the problem report form from
21539             recipient enum('admin','library') NOT NULL default 'library', -- the 'to-address' of the problem report
21540             created_on timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, -- timestamp of report submission
21541             status varchar(6) NOT NULL default 'New', -- status of the report. New, Viewed, Closed
21542             PRIMARY KEY (reportid),
21543             CONSTRAINT problem_reports_ibfk1 FOREIGN KEY (borrowernumber) REFERENCES borrowers (borrowernumber) ON DELETE CASCADE ON UPDATE CASCADE,
21544             CONSTRAINT problem_reports_ibfk2 FOREIGN KEY (branchcode) REFERENCES branches (branchcode) ON DELETE CASCADE ON UPDATE CASCADE
21545         ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci }
21546         );
21547     }
21548     $dbh->do(
21549 q{INSERT IGNORE INTO userflags (bit, flag, flagdesc, defaulton) VALUES (26, 'problem_reports', 'Manage problem reports', 0) }
21550     );
21551     $dbh->do(
21552 q{INSERT IGNORE INTO permissions (module_bit, code, description) VALUES (26, 'manage_problem_reports', 'Manage OPAC problem reports') }
21553     );
21554
21555     NewVersion(
21556         $DBversion,
21557         4461,
21558         [
21559             "Add OPACReportProblem system preference",
21560             "Adding PROBLEM_REPORT notice",
21561             "Add problem reports table",
21562             "Add user permissions for managing OPAC problem reports"
21563         ]
21564     );
21565 }
21566
21567 $DBversion = '19.12.00.067';
21568 if( CheckVersion( $DBversion ) ) {
21569     # From: https://stackoverflow.com/questions/3311903/remove-duplicate-rows-in-mysql
21570     $dbh->do(q|
21571         DELETE a
21572         FROM virtualshelfshares as a, virtualshelfshares as b
21573         WHERE
21574           a.id < b.id 
21575         AND
21576           a.borrowernumber IS NOT NULL
21577         AND
21578           a.borrowernumber=b.borrowernumber
21579         AND
21580           a.shelfnumber=b.shelfnumber
21581     |);
21582
21583     NewVersion( $DBversion, 20754, "Remove double accepted list shares" );
21584 }
21585
21586 $DBversion = '19.12.00.068';
21587 if( CheckVersion( $DBversion ) ) {
21588     $dbh->do(q|
21589         INSERT IGNORE INTO systempreferences
21590           (variable,value,explanation,options,type)
21591         VALUES
21592           ('AuthFailureLog','','If enabled, log authentication failures',NULL,'YesNo'),
21593           ('AuthSuccessLog','','If enabled, log successful authentications',NULL,'YesNo')
21594     |);
21595
21596     NewVersion( $DBversion, 21190, "Add prefs AuthFailureLog and AuthSuccessLog");
21597 }
21598
21599 $DBversion = '19.12.00.069';
21600 if( CheckVersion( $DBversion ) ) {
21601     if( !column_exists( 'suggestions', 'archived' ) ) {
21602         $dbh->do(q|
21603             ALTER TABLE suggestions ADD COLUMN archived TINYINT(1) NOT NULL DEFAULT 0 AFTER `STATUS`;
21604         |);
21605     }
21606
21607     NewVersion( $DBversion, 22784, "Add a new suggestions.archived column");
21608 }
21609
21610 $DBversion = '19.12.00.070';
21611 if( CheckVersion( $DBversion ) ) {
21612
21613     $dbh->do( q{
21614             INSERT IGNORE INTO systempreferences (variable,value,explanation,type) VALUES
21615                 ('MaxTotalSuggestions','','Number of total suggestions used for time limit with NumberOfSuggestionDays','Free'),
21616                 ('NumberOfSuggestionDays','','Number of days that will be used to determine the MaxTotalSuggestions limit','Free')
21617             });
21618
21619     NewVersion( $DBversion, 22774, "Limit purchase suggestion in a specified time period");
21620 }
21621
21622 $DBversion = '19.12.00.071';
21623 if( CheckVersion( $DBversion ) ) {
21624     my @description = ("Add unique constraint to authorised_values");
21625     unless ( index_exists('authorised_values', 'av_uniq') ) {
21626         $dbh->do(q|
21627             DELETE FROM authorised_values
21628             WHERE category="COUNTRY" AND authorised_value="CC" AND lib="Keeling"
21629         |);
21630         my $duplicates = $dbh->selectall_arrayref(q|
21631             SELECT category, authorised_value, COUNT(concat(category, ':', authorised_value)) AS c
21632             FROM authorised_values
21633             GROUP BY category, authorised_value
21634             HAVING COUNT(concat(category, ':', authorised_value)) > 1
21635         |, { Slice => {} });
21636         if ( @$duplicates ) {
21637             push @description, "WARNING - Cannot create unique constraint on authorised_value(category, authorised_value)";
21638             push @description, "The following entries are duplicated: " . join(
21639                 ', ',
21640                 map {
21641                     sprintf "%s:%s (%s)", $_->{category},
21642                       $_->{authorised_value}, $_->{c}
21643                 } @$duplicates
21644             );
21645             for my $warning (@description) {
21646                 warn $warning;
21647             }
21648         } else {
21649             $dbh->do( q{ALTER TABLE `authorised_values` ADD CONSTRAINT `av_uniq` UNIQUE (category, authorised_value)} );
21650         }
21651     }
21652
21653     NewVersion( $DBversion, 22887, \@description );
21654 }
21655
21656 $DBversion = '19.12.00.072';
21657 if( CheckVersion( $DBversion ) ) {
21658     $dbh->do(q{
21659         INSERT IGNORE INTO systempreferences ( `variable`, `value`, `options`, `explanation`, `type` )
21660             SELECT 'CalculateFinesOnBackdate',value,'','Switch to control if overdue fines are calculated on return when backdating','YesNo'
21661             FROM ( SELECT value FROM systempreferences WHERE variable = 'CalculateFinesOnReturn' ) tmp
21662     });
21663
21664     NewVersion( $DBversion, 24380, "Add syspref CalculateFinesOnBackdate");
21665 }
21666
21667 $DBversion = '19.12.00.073';
21668 if( CheckVersion( $DBversion ) ) {
21669     $dbh->do( "ALTER TABLE subscription MODIFY COLUMN closed tinyint(1) not null default 0" );
21670
21671     NewVersion( $DBversion, 25152, "Update subscription.closed to tinyint(1) as per guidelines");
21672 }
21673
21674 $DBversion = '19.12.00.074';
21675 if( CheckVersion( $DBversion ) ) {
21676     $dbh->do( "UPDATE systempreferences SET variable = 'SCOAllowCheckin' WHERE variable = 'AllowSelfCheckReturns'" );
21677
21678     # Always end with this (adjust the bug info)
21679     NewVersion( $DBversion, 25147, "Rename AllowSelfCheckReturns to SCOAllowCheckin for consistency");
21680 }
21681
21682 $DBversion = '19.12.00.075';
21683 if( CheckVersion( $DBversion ) ) {
21684
21685     $dbh->do( "ALTER TABLE borrower_modifications MODIFY changed_fields MEDIUMTEXT DEFAULT NULL" );
21686
21687     NewVersion( $DBversion, 25086, "Set changed_fields column of borrower_modifications as nullable");
21688 }
21689
21690 $DBversion = '19.12.00.076';
21691 if( CheckVersion( $DBversion ) ) {
21692     my @warnings;
21693
21694     sanitize_zero_date('serial', 'planneddate');
21695     sanitize_zero_date('serial', 'publisheddate');
21696     sanitize_zero_date('serial', 'claimdate');
21697
21698     $dbh->do(q|
21699         ALTER TABLE serial
21700         MODIFY COLUMN biblionumber INT(11) NOT NULL
21701     |);
21702
21703     unless ( foreign_key_exists( 'serial', 'serial_ibfk_1' ) ) {
21704         my $serials = $dbh->selectall_arrayref(q|
21705             SELECT serialid FROM serial JOIN subscription USING (subscriptionid) WHERE serial.biblionumber != subscription.biblionumber
21706         |, { Slice => {} });
21707         if ( @$serials ) {
21708             push @warnings, q|WARNING - The following serials will be updated, they were attached to a different biblionumber than their related subscription: | . join ", ", map { $_->{serialid} } @$serials;
21709             $dbh->do(q|
21710                 UPDATE serial JOIN subscription USING (subscriptionid) SET serial.biblionumber = subscription.biblionumber WHERE serial.biblionumber != subscription.biblionumber
21711             |);
21712         }
21713         $serials = $dbh->selectall_arrayref(q|
21714             SELECT serialid FROM serial WHERE biblionumber NOT IN (SELECT biblionumber FROM biblio)
21715         |, { Slice => {} });
21716         if ( @$serials ) {
21717             push @warnings, q|WARNING - The following serials are deleted, they were not attached to an existing bibliographic record (serialid): | . join ", ", map { $_->{serialid} } @$serials;
21718             $dbh->do(q|
21719                 DELETE FROM serial WHERE biblionumber NOT IN (SELECT biblionumber FROM biblio)
21720             |);
21721         }
21722         $dbh->do(q|
21723             ALTER TABLE serial
21724             ADD CONSTRAINT serial_ibfk_1 FOREIGN KEY (biblionumber) REFERENCES biblio (biblionumber) ON DELETE CASCADE ON UPDATE CASCADE
21725         |);
21726     }
21727
21728     $dbh->do(q|
21729         ALTER TABLE serial
21730         MODIFY COLUMN subscriptionid INT(11) NOT NULL
21731     |);
21732
21733     unless ( foreign_key_exists( 'serial', 'serial_ibfk_2' ) ) {
21734         my $serials = $dbh->selectall_arrayref(q|
21735             SELECT serialid FROM serial WHERE subscriptionid NOT IN (SELECT subscriptionid FROM subscription)
21736         |, { Slice => {} });
21737         if ( @$serials ) {
21738             push @warnings, q|WARNING - The following serials are deleted, they were not attached to an existing subscription (serialid): | . join ", ", map { $_->{serialid} } @$serials;
21739             $dbh->do(q|
21740                 DELETE FROM serial WHERE subscriptionid NOT IN (SELECT subscriptionid FROM subscription)
21741             |);
21742         }
21743         $dbh->do(q|
21744             ALTER TABLE serial
21745             ADD CONSTRAINT serial_ibfk_2 FOREIGN KEY (subscriptionid) REFERENCES subscription (subscriptionid) ON DELETE CASCADE ON UPDATE CASCADE
21746         |);
21747     }
21748
21749     $dbh->do(q|
21750         ALTER TABLE subscriptionhistory
21751         MODIFY COLUMN biblionumber int(11) NOT NULL,
21752         MODIFY COLUMN subscriptionid int(11) NOT NULL
21753     |);
21754
21755     unless ( foreign_key_exists( 'subscriptionhistory', 'subscription_history_ibfk_1' ) ) {
21756         $dbh->do(q|
21757             UPDATE subscriptionhistory JOIN subscription USING (subscriptionid) SET subscriptionhistory.biblionumber = subscription.biblionumber WHERE subscriptionhistory.biblionumber != subscription.biblionumber
21758         |);
21759         $dbh->do(q|
21760             DELETE FROM subscriptionhistory WHERE biblionumber NOT IN (SELECT biblionumber FROM biblio)
21761         |);
21762         $dbh->do(q|
21763             ALTER TABLE subscriptionhistory
21764             ADD CONSTRAINT subscription_history_ibfk_1 FOREIGN KEY (biblionumber) REFERENCES biblio (biblionumber) ON DELETE CASCADE ON UPDATE CASCADE
21765         |);
21766     }
21767
21768     unless ( foreign_key_exists( 'subscriptionhistory', 'subscription_history_ibfk_2' ) ) {
21769         $dbh->do(q|
21770             DELETE FROM subscriptionhistory WHERE subscriptionid NOT IN (SELECT subscriptionid FROM subscription)
21771         |);
21772         $dbh->do(q|
21773             ALTER TABLE subscriptionhistory
21774             ADD CONSTRAINT subscription_history_ibfk_2 FOREIGN KEY (subscriptionid) REFERENCES subscription (subscriptionid) ON DELETE CASCADE ON UPDATE CASCADE
21775         |);
21776     }
21777
21778     $dbh->do(q|
21779         ALTER TABLE subscription
21780         MODIFY COLUMN biblionumber int(11) NOT NULL
21781     |);
21782
21783     unless ( foreign_key_exists( 'subscription', 'subscription_ibfk_3' ) ) {
21784         my $subscriptions = $dbh->selectall_arrayref(q|
21785             SELECT subscriptionid FROM subscription WHERE biblionumber NOT IN (SELECT biblionumber FROM biblio)
21786         |, { Slice => {} });
21787         if ( @$subscriptions ) {
21788             push @warnings, q|WARNING - The following subscriptions are deleted, they were not attached to an existing bibliographic record (subscriptionid): | . join ", ", map { $_->{subscriptionid} } @$subscriptions;
21789
21790             $dbh->do(q|
21791                 DELETE FROM subscription WHERE biblionumber NOT IN (SELECT biblionumber FROM biblio)
21792             |);
21793         }
21794         $dbh->do(q|
21795             ALTER TABLE subscription
21796             ADD CONSTRAINT subscription_ibfk_3 FOREIGN KEY (biblionumber) REFERENCES biblio (biblionumber) ON DELETE CASCADE ON UPDATE CASCADE
21797         |);
21798     }
21799
21800     for my $warning (@warnings) {
21801         warn $warning;
21802     }
21803
21804     my $description = [ "Add foreign key constraints on serial", @warnings ];
21805     NewVersion( $DBversion, 21901, $description);
21806 }
21807
21808 $DBversion = '19.12.00.077';
21809 if( CheckVersion( $DBversion ) ) {
21810     if ( !column_exists( 'course_items', 'itype_enabled' ) ) {
21811         $dbh->do(q{
21812             ALTER TABLE course_items
21813             ADD COLUMN itype_enabled tinyint(1) NOT NULL DEFAULT 0 AFTER itype,
21814             ADD COLUMN ccode_enabled tinyint(1) NOT NULL DEFAULT 0 AFTER ccode,
21815             ADD COLUMN holdingbranch_enabled tinyint(1) NOT NULL DEFAULT 0 AFTER holdingbranch,
21816             ADD COLUMN location_enabled tinyint(1) NOT NULL DEFAULT 0 AFTER location,
21817             ADD COLUMN itype_storage varchar(10) DEFAULT NULL AFTER itype_enabled,
21818             ADD COLUMN ccode_storage varchar(80) DEFAULT NULL AFTER ccode_enabled,
21819             ADD COLUMN holdingbranch_storage varchar(10) DEFAULT NULL AFTER ccode_enabled,
21820             ADD COLUMN location_storage varchar(80) DEFAULT NULL AFTER location_enabled
21821         });
21822
21823         my $item_level_items = C4::Context->preference('item-level_itypes');
21824         my $itype_field = $item_level_items ? 'i.itype' : 'bi.itemtype';
21825         $dbh->do(qq{
21826             UPDATE course_items ci
21827             LEFT JOIN items i USING ( itemnumber )
21828             LEFT JOIN biblioitems bi USING ( biblioitemnumber )
21829             SET
21830
21831             -- Assume the column is enabled if the course item is active and i.itype/bi.itemtype is set,
21832             -- or if the course item is not enabled and ci.itype is set
21833             ci.itype_enabled = IF( ci.enabled = 'yes', IF( $itype_field IS NULL, 0, 1 ), IF(  ci.itype IS NULL, 0, 1  ) ),
21834             ci.ccode_enabled = IF( ci.enabled = 'yes', IF( i.ccode IS NULL, 0, 1 ), IF(  ci.ccode IS NULL, 0, 1  ) ),
21835             ci.holdingbranch_enabled = IF( ci.enabled = 'yes', IF( i.holdingbranch IS NULL, 0, 1 ), IF(  ci.holdingbranch IS NULL, 0, 1  ) ),
21836             ci.location_enabled = IF( ci.enabled = 'yes', IF( i.location IS NULL, 0, 1 ), IF(  ci.location IS NULL, 0, 1  ) ),
21837
21838             -- If the course item is enabled, copy the value from the item.
21839             -- If the course item is not enabled, keep the existing value
21840             ci.itype = IF( ci.enabled = 'yes', $itype_field, ci.itype ),
21841             ci.ccode = IF( ci.enabled = 'yes', i.ccode, ci.ccode ),
21842             ci.holdingbranch = IF( ci.enabled = 'yes', i.holdingbranch, ci.holdingbranch ),
21843             ci.location = IF( ci.enabled = 'yes', i.location, ci.location ),
21844
21845             -- If the course is enabled, copy the value from the item to storage.
21846             -- If it is not enabled, copy the value from the course item to storage
21847             ci.itype_storage = IF( ci.enabled = 'no', $itype_field, ci.itype ),
21848             ci.ccode_storage = IF( ci.enabled = 'no', i.ccode, ci.ccode ),
21849             ci.holdingbranch_storage = IF( ci.enabled = 'no', i.holdingbranch, ci.holdingbranch ),
21850             ci.location_storage = IF( ci.enabled = 'no', i.location, ci.location );
21851         });
21852
21853         # Clean up the storage columns
21854         $dbh->do(q{
21855             UPDATE course_items SET
21856                 itype_storage = NULL,
21857                 ccode_storage = NULL,
21858                 holdingbranch_storage = NULL,
21859                 location_storage = NULL
21860             WHERE enabled = 'no';
21861         });
21862
21863         # Clean up the course enabled value columns
21864         $dbh->do(q{
21865             UPDATE course_items SET
21866                 itype = IF( itype_enabled = 'no', NULL, itype ),
21867                 ccode = IF( ccode_enabled = 'no', NULL, ccode ),
21868                 holdingbranch = IF( holdingbranch_enabled = 'no', NULL, holdingbranch ),
21869                 location = IF( location_enabled = 'no', NULL, location )
21870             WHERE enabled = 'no';
21871         });
21872     }
21873
21874     NewVersion( $DBversion, 23727, "Editing course reserve items is broken");
21875 }
21876
21877 $DBversion = '19.12.00.078';
21878 if( CheckVersion( $DBversion ) ) {
21879     $dbh->do(q{INSERT IGNORE INTO systempreferences (variable,value,options,explanation,type) VALUES ('PatronSelfRegistrationConfirmEmail', '0', NULL, 'Require users to confirm their email address by entering it twice.', 'YesNo') });
21880
21881     NewVersion( $DBversion, 24913, "Add PatronSelfRegistrationConfirmEmail syspref");
21882 }
21883
21884 $DBversion = '19.12.00.079';
21885 if( CheckVersion( $DBversion ) ) {
21886
21887     # Default to the homologous OpacPublic syspref
21888     my $opac_public = C4::Context->preference('OpacPublic') ? 1 : 0;
21889
21890     $dbh->do(qq{
21891         INSERT IGNORE INTO `systempreferences`
21892             (`variable`,`value`,`explanation`,`options`,`type`)
21893         VALUES
21894             ('RESTPublicAnonymousRequests', $opac_public, NULL,'If enabled, the API will allow anonymous access to public routes that do not require authenticated access.','YesNo');
21895     });
21896
21897     NewVersion( $DBversion, 25045, "Add a way to restrict anonymous access to public routes (OpacPublic behaviour)");
21898 }
21899
21900 $DBversion = '19.12.00.080';
21901 if( CheckVersion( $DBversion ) ) {
21902      $dbh->do( "UPDATE items set issues=0 where issues is null" );
21903      $dbh->do( "UPDATE deleteditems set issues=0 where issues is null" );
21904      $dbh->do( "ALTER TABLE items ALTER issues set default 0" );
21905      $dbh->do( "ALTER TABLE deleteditems ALTER issues set default 0" );
21906
21907     NewVersion( $DBversion, 23081, "Set default to 0 for items.issues");
21908 }
21909
21910 $DBversion = '19.12.00.081';
21911 if (CheckVersion($DBversion)) {
21912     if (!column_exists('course_items', 'homebranch')) {
21913         $dbh->do(q{
21914             ALTER TABLE course_items
21915             ADD COLUMN homebranch VARCHAR(10) NULL DEFAULT NULL AFTER ccode_storage
21916         });
21917     }
21918
21919     if (!foreign_key_exists('course_items', 'fk_course_items_homebranch')) {
21920         $dbh->do(q{
21921             ALTER TABLE course_items
21922             ADD CONSTRAINT fk_course_items_homebranch
21923               FOREIGN KEY (homebranch) REFERENCES branches (branchcode)
21924               ON DELETE CASCADE ON UPDATE CASCADE
21925         });
21926     }
21927
21928     if (!column_exists('course_items', 'homebranch_enabled')) {
21929         $dbh->do(q{
21930             ALTER TABLE course_items
21931             ADD COLUMN homebranch_enabled tinyint(1) NOT NULL DEFAULT 0 AFTER homebranch
21932         });
21933     }
21934
21935     if (!column_exists('course_items', 'homebranch_storage')) {
21936         $dbh->do(q{
21937             ALTER TABLE course_items
21938             ADD COLUMN homebranch_storage VARCHAR(10) NULL DEFAULT NULL AFTER homebranch_enabled
21939         });
21940     }
21941
21942     if (!foreign_key_exists('course_items', 'fk_course_items_homebranch_storage')) {
21943         $dbh->do(q{
21944             ALTER TABLE course_items
21945             ADD CONSTRAINT fk_course_items_homebranch_storage
21946               FOREIGN KEY (homebranch_storage) REFERENCES branches (branchcode)
21947               ON DELETE CASCADE ON UPDATE CASCADE
21948         });
21949     }
21950
21951     NewVersion( $DBversion, 22630, "Add course_items.homebranch");
21952 }
21953
21954 $DBversion = '19.12.00.082';
21955 if( CheckVersion( $DBversion ) ) {
21956
21957     # get list of installed translations
21958     require C4::Languages;
21959     my @langs;
21960     my $tlangs = C4::Languages::getTranslatedLanguages('opac','bootstrap');
21961
21962     foreach my $language ( @$tlangs ) {
21963         foreach my $sublanguage ( @{$language->{'sublanguages_loop'}} ) {
21964             push @langs, $sublanguage->{'rfc4646_subtag'};
21965         }
21966     }
21967
21968     # Get any existing value from the OpacMainUserBlock system preference
21969     my ($opacmainuserblock) = $dbh->selectrow_array( q|
21970         SELECT value FROM systempreferences WHERE variable='OpacMainUserBlock';
21971     |);
21972
21973     my @detail;
21974     if( $opacmainuserblock ){
21975         foreach my $lang ( @langs ) {
21976             # If there is a value in the OpacMainUserBlock preference, insert it into opac_news
21977             $dbh->do("INSERT INTO opac_news (branchcode, lang, title, content ) VALUES (NULL, ?, '', ?)", undef, "OpacMainUserBlock_$lang", $opacmainuserblock);
21978             push @detail, "Inserting OpacMainUserBlock contents into $lang news item...";
21979         }
21980     }
21981     # Remove the OpacMainUserBlock system preference
21982     $dbh->do("DELETE FROM systempreferences WHERE variable='OpacMainUserBlock'");
21983
21984     unshift @detail, "Move contents of OpacMainUserBlock preference to Koha news system";
21985     NewVersion( $DBversion, 23794, \@detail);
21986 }
21987
21988 $DBversion = '19.12.00.083';
21989 if( CheckVersion( $DBversion ) ) {
21990
21991     unless ( column_exists( 'authorised_value_categories', 'is_system' ) ) {
21992         $dbh->do(q|
21993             ALTER TABLE authorised_value_categories
21994             ADD COLUMN is_system TINYINT(1) DEFAULT 0 AFTER category_name
21995         |);
21996     }
21997
21998     $dbh->do(q|
21999         UPDATE authorised_value_categories
22000         SET is_system = 1
22001         WHERE category_name IN ('LOC', 'LOST', 'WITHDRAWN', 'Bsort1', 'Bsort2', 'Asort1', 'Asort2', 'SUGGEST', 'DAMAGED', 'LOST', 'BOR_NOTES', 'CCODE', 'NOT_LOAN')
22002     |);
22003
22004     $dbh->do(q|
22005         UPDATE authorised_value_categories
22006         SET is_system = 1
22007         WHERE category_name IN ('branches', 'itemtypes', 'cn_source')
22008     |);
22009
22010     NewVersion( $DBversion, 17355, "Add is_system to authorised_value_categories table");
22011 }
22012
22013 $DBversion = '19.12.00.084';
22014 if( CheckVersion( $DBversion ) ) {
22015     unless ( TableExists('advanced_editor_macros') ) {
22016         $dbh->do(q|
22017             CREATE TABLE advanced_editor_macros (
22018             id INT(11) NOT NULL AUTO_INCREMENT,
22019             name varchar(80) NOT NULL,
22020             macro longtext NULL,
22021             borrowernumber INT(11) default NULL,
22022             shared TINYINT(1) default 0,
22023             PRIMARY KEY (id),
22024             CONSTRAINT borrower_macro_fk FOREIGN KEY ( borrowernumber ) REFERENCES borrowers ( borrowernumber ) ON UPDATE CASCADE ON DELETE CASCADE
22025             ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;|
22026         );
22027     }
22028     $dbh->do(q|
22029         INSERT IGNORE INTO permissions (module_bit, code, description)
22030         VALUES (9, 'create_shared_macros', 'Create public macros')
22031     |);
22032     $dbh->do(q|
22033         INSERT IGNORE INTO permissions (module_bit, code, description)
22034         VALUES (9, 'delete_shared_macros', 'Delete public macros')
22035     |);
22036
22037     NewVersion( $DBversion, 17682, "Add macros db table and permissions");
22038 }
22039
22040 $DBversion = '19.12.00.085';
22041 if( CheckVersion( $DBversion ) ) {
22042     unless ( TableExists( 'aqorders_claims' ) ) {
22043         $dbh->do(q|
22044             CREATE TABLE aqorders_claims (
22045                 id int(11) AUTO_INCREMENT,
22046                 ordernumber INT(11) NOT NULL,
22047                 claimed_on TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
22048                 PRIMARY KEY (id),
22049                 CONSTRAINT aqorders_claims_ibfk_1 FOREIGN KEY (ordernumber) REFERENCES aqorders (ordernumber) ON DELETE CASCADE ON UPDATE CASCADE
22050             ) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_unicode_ci
22051         |);
22052
22053         my $orders = $dbh->selectall_arrayref(q|
22054             SELECT ordernumber, claims_count, claimed_date
22055             FROM aqorders
22056             WHERE claims_count > 0
22057         |, { Slice => {} });
22058         my $insert_claim_sth = $dbh->prepare(q|
22059             INSERT INTO aqorders_claims (ordernumber, claimed_on)
22060             VALUES (?,?)
22061         |);
22062
22063         for my $order ( @$orders ) {
22064             for my $claim (1..$order->{claims_count}) {
22065                 $insert_claim_sth->execute($order->{ordernumber}, $order->{claimed_on});
22066             }
22067         }
22068
22069         $dbh->do(q|ALTER TABLE aqorders DROP COLUMN claims_count, DROP COLUMN claimed_date|);
22070     }
22071
22072     NewVersion( $DBversion, 24161, "Add new join table aqorders_claims to keep track of claims");
22073 }
22074
22075 $DBversion = '19.12.00.086';
22076 if( CheckVersion( $DBversion ) ) {
22077     $dbh->do(q{
22078         INSERT IGNORE INTO export_format( profile, description, content, csv_separator, type, used_for ) VALUES
22079         ("Late orders (CSV profile)", "Default CSV export for late orders", 'Title[% separator %]Author[% separator %]Publication year[% separator %]ISBN[% separator %]Quantity[% separator %]Number of claims
22080         [% FOR order IN orders ~%]
22081         [%~ SET biblio = order.biblio ~%]
22082         "[% biblio.title %]"[% separator ~%]
22083         "[% biblio.author %]"[% separator ~%]
22084         "[% bibio.biblioitem.publicationyear %]"[% separator ~%]
22085         "[% biblio.biblioitem.isbn %]"[% separator ~%]
22086         "[% order.quantity%]"[% separator ~%]
22087         "[% order.claims.count%][% IF order.claims.count %]([% FOR c IN order.claims %][% c.claimed_on | $KohaDates %][% UNLESS loop.last %], [% END %][% END %])[% END %]"
22088         [% END %]', ",", "sql", "late_orders")
22089     });
22090
22091     NewVersion( $DBversion, 24163, "Define a default CSV profile for late orders");
22092 }
22093
22094 $DBversion = '19.12.00.087';
22095 if( CheckVersion( $DBversion ) ) {
22096     $dbh->do(q{
22097         INSERT IGNORE INTO systempreferences ( `variable`, `value`, `options`, `explanation`, `type` ) VALUES
22098         ('TrapHoldsOnOrder','1',NULL,'If enabled, Koha will trap holds for on order items ( notforloan < 0 )','YesNo')
22099     });
22100
22101     NewVersion( $DBversion, 25184, "Items with a negative notforloan status should not be captured for holds");
22102 }
22103
22104 $DBversion = '19.12.00.088';
22105 if( CheckVersion( $DBversion ) ) {
22106
22107     $dbh->do(q{
22108         UPDATE letter SET
22109         name = REPLACE(name, "notification on auto renewing", "Notification of automatic renewal"),
22110         title = REPLACE(title, "Auto renewals", "Automatic renewal notice"),
22111         content = REPLACE(content, "You have reach the maximum of checkouts possible.", "You have reached the maximum number of checkouts possible.")
22112         WHERE code = 'AUTO_RENEWALS';
22113     });
22114     $dbh->do(q{
22115         UPDATE letter SET
22116         content = REPLACE(content, "You have overdues.", "You have overdue items.")
22117         WHERE code = 'AUTO_RENEWALS';
22118     });
22119     $dbh->do(q{
22120         UPDATE letter SET
22121         content = REPLACE(content, "It's too late to renew this checkout.", "It's too late to renew this item.")
22122         WHERE code = 'AUTO_RENEWALS';
22123     });
22124     $dbh->do(q{
22125         UPDATE letter SET
22126         content = REPLACE(content, "You have too much unpaid fines.", "Your total unpaid fines are too high.")
22127         WHERE code = 'AUTO_RENEWALS';
22128     });
22129     $dbh->do(q{
22130         UPDATE letter SET
22131         content = REPLACE(content, "The following item [% biblio.title %] has correctly been renewed and is now due [% checkout.date_due %]", "The following item, [% biblio.title %], has correctly been renewed and is now due on [% checkout.date_due | $KohaDates as_due_date => 1 %]
22132 ")
22133         WHERE code = 'AUTO_RENEWALS';
22134     });
22135
22136     NewVersion( $DBversion, 24378, "Fix some grammatical errors in default auto renewal notice");
22137 }
22138
22139 $DBversion = '19.12.00.089';
22140 if( CheckVersion( $DBversion ) ) {
22141
22142     # Migrate LOST_RETURNED to LOST_FOUND
22143     $dbh->do(qq{
22144         UPDATE
22145           accountlines
22146         SET
22147           credit_type_code = 'LOST_FOUND'
22148         WHERE
22149           credit_type_code = 'LOST_RETURNED'
22150     });
22151
22152     # Drop LOST_RETURNED credit type
22153     $dbh->do(qq{
22154         DELETE FROM account_credit_types WHERE code = 'LOST_RETURNED'
22155     });
22156
22157     NewVersion( $DBversion, 25389, "Catch errant cases of LOST_RETURNED");
22158 }
22159
22160 $DBversion = '19.12.00.090';
22161 if ( CheckVersion($DBversion) ) {
22162
22163     $dbh->do(
22164         qq{
22165           INSERT IGNORE INTO systempreferences (variable,value,options,explanation,type) VALUES
22166           ('UseIssueDesks','0','','Use issue desks with circulation.','YesNo')
22167       }
22168     );
22169
22170     NewVersion( $DBversion, 13881, "Add issue desks system preference");
22171 }
22172
22173 $DBversion = '19.12.00.091';
22174 if ( CheckVersion($DBversion) ) {
22175
22176     $dbh->do(qq{
22177         UPDATE systempreferences SET variable = 'UseCirculationDesks' WHERE variable = 'UseIssueDesks'
22178     });
22179
22180     NewVersion( $DBversion, 13881, "Correction to preference terminology");
22181 }
22182
22183 $DBversion = '20.05.00.000';
22184 if( CheckVersion( $DBversion ) ) {
22185     NewVersion( $DBversion, undef, '20.05.00 alpha release' );
22186 }
22187
22188 $DBversion = '20.06.00.000';
22189 if( CheckVersion( $DBversion ) ) {
22190     NewVersion( $DBversion, undef, 'All our codebase are belong to everybody' );
22191 }
22192
22193 $DBversion = '20.06.00.001';
22194 if( CheckVersion( $DBversion ) ) {
22195     for my $f (qw( streetnumber streettype zipcode mobile B_streetnumber B_streettype B_zipcode ) ) {
22196         $dbh->do(qq|
22197             ALTER TABLE borrowers MODIFY $f TINYTEXT DEFAULT NULL
22198         |);
22199         $dbh->do(qq|
22200             ALTER TABLE deletedborrowers MODIFY $f TINYTEXT DEFAULT NULL
22201         |);
22202     }
22203     for my $f ( qw( B_address altcontactfirstname altcontactsurname altcontactaddress1 altcontactaddress2 altcontactaddress3 altcontactzipcode altcontactphone ) ) {
22204         $dbh->do(qq|
22205             ALTER TABLE borrowers MODIFY $f MEDIUMTEXT DEFAULT NULL
22206         |);
22207         $dbh->do(qq|
22208             ALTER TABLE deletedborrowers MODIFY $f MEDIUMTEXT DEFAULT NULL
22209         |);
22210     }
22211
22212     NewVersion( $DBversion, 24986, "Switch borrowers address related fields to TINYTEXT or MEDIUMTEXT");
22213 }
22214
22215 $DBversion = '20.06.00.002';
22216 if( CheckVersion( $DBversion ) ) {
22217     $dbh->do(q{
22218         INSERT IGNORE INTO systempreferences ( `variable`, `value`, `options`, `explanation`, `type` ) VALUES
22219         ('SkipHoldTrapOnNotForLoanValue','',NULL,'If set, Koha will never trap items for hold with this notforloan value','Integer')
22220     });
22221
22222     NewVersion( $DBversion, 25184, "Items with a negative notforloan status should not be captured for holds");
22223 }
22224
22225 $DBversion = '20.06.00.003';
22226 if( CheckVersion( $DBversion ) ) {
22227     unless ( TableExists( 'tables_settings' ) ) {
22228         $dbh->do(q|
22229             CREATE TABLE tables_settings (
22230                 module varchar(255) NOT NULL,
22231                 page varchar(255) NOT NULL,
22232                 tablename varchar(255) NOT NULL,
22233                 default_display_length smallint(6) NOT NULL DEFAULT 20,
22234                 default_sort_order varchar(255),
22235                 PRIMARY KEY(module (191), page (191), tablename (191) )
22236             ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
22237         |);
22238     }
22239
22240     NewVersion( $DBversion, 24156, "Add new table tables_settings" );
22241 }
22242
22243 $DBversion = '20.06.00.004';
22244 if( CheckVersion( $DBversion ) ) {
22245     $dbh->do("
22246         DELETE FROM circulation_rules WHERE rule_name='holdallowed' AND rule_value='';
22247     ");
22248     NewVersion( $DBversion, 25851, "Remove holdallowed rule if value is an empty string");
22249 }
22250
22251 $DBversion = '20.06.00.005';
22252 if( CheckVersion( $DBversion ) ) {
22253     $dbh->do( "UPDATE borrowers SET login_attempts=0 WHERE login_attempts IS NULL" );
22254     $dbh->do( "ALTER TABLE borrowers MODIFY COLUMN login_attempts int(4) NOT NULL DEFAULT 0" );
22255     $dbh->do( "UPDATE deletedborrowers SET login_attempts=0 WHERE login_attempts IS NULL" );
22256     $dbh->do( "ALTER TABLE deletedborrowers MODIFY COLUMN login_attempts int(4) NOT NULL DEFAULT 0" );
22257     NewVersion( $DBversion, 24379, "Set login_attempts NOT NULL" );
22258 }
22259
22260 $DBversion = '20.06.00.006';
22261 if( CheckVersion( $DBversion ) ) {
22262     unless( TableExists( 'pseudonymized_transactions' ) ) {
22263         $dbh->do(q|
22264             CREATE TABLE `pseudonymized_transactions` (
22265               `id` INT(11) NOT NULL AUTO_INCREMENT,
22266               `hashed_borrowernumber` VARCHAR(60) NOT NULL,
22267               `has_cardnumber` TINYINT(1) NOT NULL DEFAULT 0,
22268               `title` LONGTEXT,
22269               `city` LONGTEXT,
22270               `state` MEDIUMTEXT default NULL,
22271               `zipcode` varchar(25) default NULL,
22272               `country` MEDIUMTEXT,
22273               `branchcode` varchar(10) NOT NULL default '',
22274               `categorycode` varchar(10) NOT NULL default '',
22275               `dateenrolled` date default NULL,
22276               `sex` varchar(1) default NULL,
22277               `sort1` varchar(80) default NULL,
22278               `sort2` varchar(80) default NULL,
22279               `datetime` datetime default NULL,
22280               `transaction_branchcode` varchar(10) default NULL,
22281               `transaction_type` varchar(16) default NULL,
22282               `itemnumber` int(11) default NULL,
22283               `itemtype` varchar(10) default NULL,
22284               `holdingbranch` varchar(10) default null,
22285               `homebranch` varchar(10) default null,
22286               `location` varchar(80) default NULL,
22287               `itemcallnumber` varchar(255) default NULL,
22288               `ccode` varchar(80) default NULL,
22289               PRIMARY KEY (`id`),
22290               CONSTRAINT `pseudonymized_transactions_ibfk_1` FOREIGN KEY (`categorycode`) REFERENCES `categories` (`categorycode`),
22291               CONSTRAINT `pseudonymized_transactions_borrowers_ibfk_2` FOREIGN KEY (`branchcode`) REFERENCES `branches` (`branchcode`),
22292               CONSTRAINT `pseudonymized_transactions_borrowers_ibfk_3` FOREIGN KEY (`transaction_branchcode`) REFERENCES `branches` (`branchcode`)
22293             ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
22294         |);
22295     }
22296
22297     $dbh->do(q|
22298         INSERT IGNORE INTO systempreferences (variable,value,options,explanation,type)
22299         VALUES ('Pseudonymization','0',NULL,'If enabled patrons and transactions will be copied in a separate table for statistics purpose','YesNo')
22300     |);
22301     $dbh->do(q|
22302         INSERT IGNORE INTO systempreferences (variable,value,options,explanation,type)
22303         VALUES ('PseudonymizationPatronFields','','title,city,state,zipcode,country,branchcode,categorycode,dateenrolled,sex,sort1,sort2','Patron fields to copy to the pseudonymized_transactions table','multiple')
22304     |);
22305     $dbh->do(q|
22306         INSERT IGNORE INTO systempreferences (variable,value,options,explanation,type)
22307         VALUES ('PseudonymizationTransactionFields','','datetime,transaction_branchcode,transaction_type,itemnumber,itemtype,holdingbranch,homebranch,location,itemcallnumber,ccode','Transaction fields to copy to the pseudonymized_transactions table','multiple')
22308     |);
22309
22310     unless( TableExists( 'pseudonymized_borrower_attributes' ) ) {
22311         $dbh->do(q|
22312             CREATE TABLE pseudonymized_borrower_attributes (
22313               `id` int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY, -- Row id field
22314               `transaction_id` int(11) NOT NULL,
22315               `code` varchar(10) NOT NULL,
22316               `attribute` varchar(255) default NULL,
22317               CONSTRAINT `pseudonymized_borrower_attributes_ibfk_1` FOREIGN KEY (`transaction_id`) REFERENCES `pseudonymized_transactions` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
22318               CONSTRAINT `anonymized_borrower_attributes_ibfk_2` FOREIGN KEY (`code`) REFERENCES `borrower_attribute_types` (`code`) ON DELETE CASCADE ON UPDATE CASCADE
22319             ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
22320         |);
22321     }
22322
22323     unless( column_exists('borrower_attribute_types', 'keep_for_pseudonymization') ) {
22324         $dbh->do(q|
22325             ALTER TABLE borrower_attribute_types ADD COLUMN `keep_for_pseudonymization` TINYINT(1) NOT NULL DEFAULT 0 AFTER `class`
22326         |);
22327     }
22328
22329     NewVersion( $DBversion, 24151, "Add pseudonymized_transactions tables and sysprefs for Pseudonymization" );
22330 }
22331
22332 $DBversion = '20.06.00.007';
22333 if( CheckVersion( $DBversion ) ) {
22334     if( !column_exists( 'borrower_attribute_types', 'mandatory' ) ) {
22335         $dbh->do(q|
22336             ALTER TABLE borrower_attribute_types
22337             ADD COLUMN mandatory TINYINT(1) NOT NULL DEFAULT 0
22338             AFTER keep_for_pseudonymization
22339         |);
22340     }
22341
22342     NewVersion( $DBversion, 22844, "Add borrower_attribute_types.mandatory" );
22343 }
22344
22345 $DBversion = '20.06.00.008';
22346 if( CheckVersion( $DBversion ) ) {
22347     $dbh->do( "UPDATE itemtypes SET imageurl = REPLACE (imageurl, '.gif', '.png') WHERE imageurl LIKE 'bridge/%'" );
22348
22349     NewVersion( $DBversion, 23148, "Replace Bridge icons with transparent PNG files" );
22350 }
22351
22352 $DBversion = '20.06.00.009';
22353 if( CheckVersion( $DBversion ) ) {
22354     $dbh->do( q{
22355             INSERT IGNORE INTO systempreferences (variable,value,options,explanation,type)
22356             VALUES ('ILLHiddenRequestStatuses',NULL,NULL,'ILL statuses that are considered finished and should not be displayed in the ILL module','multiple')
22357     });
22358
22359     NewVersion( $DBversion, 23391, "Hide finished ILL requests" );
22360 }
22361
22362 $DBversion = '20.06.00.010';
22363 if( CheckVersion( $DBversion ) ) {
22364     $dbh->do(q{
22365         INSERT IGNORE INTO systempreferences ( `variable`, `value`, `options`, `explanation`, `type` ) VALUES
22366         ('NoRefundOnLostReturnedItemsAge','','','Do not refund lost item fees if item is lost for more than this number of days','Integer')
22367     });
22368
22369     NewVersion( $DBversion, 20815, "Add NoRefundOnLostReturnedItemsAge system preference" );
22370 }
22371
22372 $DBversion = '20.06.00.011';
22373 if( CheckVersion( $DBversion ) ) {
22374     unless( column_exists( 'export_format', 'staff_only' ) ) {
22375         $dbh->do(q|
22376             ALTER TABLE export_format
22377                 ADD staff_only TINYINT(1) NOT NULL DEFAULT 0 AFTER used_for,
22378                 ADD KEY `staff_only_idx` (`staff_only`);
22379         |);
22380     }
22381
22382     unless ( index_exists( 'export_format', 'used_for_idx' ) ) {
22383         $dbh->do(q|
22384             ALTER TABLE export_format
22385                 ADD KEY `used_for_idx` (`used_for` (191));
22386         |);
22387     }
22388
22389     NewVersion( $DBversion, 5087, "Add export_format.staff_only" );
22390 }
22391
22392 $DBversion = '20.06.00.012';
22393 if( CheckVersion( $DBversion ) ) {
22394
22395     # get list of installed translations
22396     require C4::Languages;
22397     my @langs;
22398     my $tlangs = C4::Languages::getTranslatedLanguages('opac','bootstrap');
22399
22400     foreach my $language ( @$tlangs ) {
22401         foreach my $sublanguage ( @{$language->{'sublanguages_loop'}} ) {
22402             push @langs, $sublanguage->{'rfc4646_subtag'};
22403         }
22404     }
22405
22406     # Get any existing value from the opaccredits system preference
22407     my ($opaccredits) = $dbh->selectrow_array( q|
22408         SELECT value FROM systempreferences WHERE variable='opaccredits';
22409     |);
22410     if( $opaccredits ){
22411         foreach my $lang ( @langs ) {
22412             # If there is a value in the opaccredits preference, insert it into opac_news
22413             $dbh->do("INSERT IGNORE INTO opac_news (branchcode, lang, title, content ) VALUES (NULL, ?, '', ?)", undef, "opaccredits_$lang", $opaccredits);
22414         }
22415     }
22416     # Remove the opaccredits system preference
22417     $dbh->do("DELETE FROM systempreferences WHERE variable='opaccredits'");
22418
22419     NewVersion( $DBversion, 23795, "Convert OpacCredits system preference to news block" );
22420 }
22421
22422 $DBversion = '20.06.00.013';
22423 if( CheckVersion( $DBversion ) ) {
22424
22425     # get list of installed translations
22426     require C4::Languages;
22427     my @langs;
22428     my $tlangs = C4::Languages::getTranslatedLanguages('opac','bootstrap');
22429
22430     foreach my $language ( @$tlangs ) {
22431         foreach my $sublanguage ( @{$language->{'sublanguages_loop'}} ) {
22432             push @langs, $sublanguage->{'rfc4646_subtag'};
22433         }
22434     }
22435
22436     # Get any existing value from the OpacCustomSearch system preference
22437     my ($OpacCustomSearch) = $dbh->selectrow_array( q|
22438         SELECT value FROM systempreferences WHERE variable='OpacCustomSearch';
22439     |);
22440     if( $OpacCustomSearch ){
22441         foreach my $lang ( @langs ) {
22442             # If there is a value in the OpacCustomSearch preference, insert it into opac_news
22443             $dbh->do("INSERT INTO opac_news (branchcode, lang, title, content ) VALUES (NULL, ?, '', ?)", undef, "OpacCustomSearch_$lang", $OpacCustomSearch);
22444         }
22445     }
22446     # Remove the OpacCustomSearch system preference
22447     $dbh->do("DELETE FROM systempreferences WHERE variable='OpacCustomSearch'");
22448
22449     NewVersion( $DBversion, 23795, "Convert OpacCustomSearch system preference to news block" );
22450 }
22451
22452 $DBversion = '20.06.00.014';
22453 if( CheckVersion( $DBversion ) ) {
22454
22455     $dbh->do( "ALTER TABLE opac_news CHANGE lang lang VARCHAR(50) NOT NULL DEFAULT ''" );
22456
22457     NewVersion( $DBversion, 23797, "Extend the opac_news lang column to accommodate longer values" );
22458 }
22459
22460 $DBversion = '20.06.00.015';
22461 if( CheckVersion( $DBversion ) ) {
22462
22463     # get list of installed translations
22464     require C4::Languages;
22465     my @langs;
22466     my $tlangs = C4::Languages::getTranslatedLanguages('opac','bootstrap');
22467
22468     foreach my $language ( @$tlangs ) {
22469         foreach my $sublanguage ( @{$language->{'sublanguages_loop'}} ) {
22470             push @langs, $sublanguage->{'rfc4646_subtag'};
22471         }
22472     }
22473
22474     # Get any existing value from the OpacLoginInstructions system preference
22475     my ($opaclogininstructions) = $dbh->selectrow_array( q|
22476         SELECT value FROM systempreferences WHERE variable='OpacLoginInstructions';
22477     |);
22478     if( $opaclogininstructions ){
22479         foreach my $lang ( @langs ) {
22480             # If there is a value in the OpacLoginInstructions preference, insert it into opac_news
22481             $dbh->do("INSERT INTO opac_news (branchcode, lang, title, content ) VALUES (NULL, ?, '', ?)", undef, "OpacLoginInstructions_$lang", $opaclogininstructions);
22482         }
22483     }
22484     # Remove the OpacLoginInstructions system preference
22485     $dbh->do("DELETE FROM systempreferences WHERE variable='OpacLoginInstructions'");
22486
22487     NewVersion( $DBversion, 23797, "Convert OpacLoginInstructions system preference to news block" );
22488 }
22489
22490 $DBversion = '20.06.00.016';
22491 if( CheckVersion( $DBversion ) ) {
22492
22493     unless ( column_exists('branchtransfers', 'daterequested') ) {
22494         $dbh->do(
22495             qq{
22496                 ALTER TABLE branchtransfers
22497                 ADD
22498                   `daterequested` timestamp NOT NULL default CURRENT_TIMESTAMP
22499                 AFTER
22500                   `itemnumber`
22501               }
22502         );
22503     }
22504
22505     NewVersion( $DBversion, 23092, "Add 'daterequested' field to transfers table" );
22506 }
22507
22508 $DBversion = '20.06.00.017';
22509 if( CheckVersion( $DBversion ) ) {
22510     $dbh->do( "UPDATE systempreferences SET variable='NotesToHide' WHERE variable = 'NotesBlacklist'" );
22511     NewVersion( $DBversion, 25709, "Rename systempreference to NotesToHide");
22512 }
22513
22514 $DBversion = '20.06.00.018';
22515 if( CheckVersion( $DBversion ) ) {
22516     $dbh->do(q|
22517         INSERT IGNORE INTO permissions (module_bit, code, description) VALUES
22518         (11, 'reopen_closed_invoices', 'Reopen closed invoices')
22519     |);
22520
22521     $dbh->do(q|
22522         INSERT IGNORE INTO permissions (module_bit, code, description) VALUES
22523         (11, 'edit_invoices', 'Edit invoices')
22524     |);
22525
22526     $dbh->do(q|
22527         INSERT IGNORE INTO permissions (module_bit, code, description) VALUES
22528         (11, 'delete_baskets', 'Delete baskets')
22529     |);
22530
22531     $dbh->do(q|
22532         INSERT IGNORE INTO permissions (module_bit, code, description) VALUES
22533         (11, 'delete_invoices', 'Delete invoices')
22534     |);
22535
22536     $dbh->do(q|
22537         INSERT IGNORE INTO permissions (module_bit, code, description) VALUES
22538         (11, 'merge_invoices', 'Merge invoices')
22539     |);
22540
22541     NewVersion( $DBversion, 24157, "Add new permissions reopen_closed_invoices, edit_invoices, delete_invoices, merge_invoices, delete_basket");
22542 }
22543
22544 $DBversion = '20.06.00.019';
22545 if( CheckVersion( $DBversion ) ) {
22546     $dbh->do( "INSERT IGNORE INTO systempreferences (variable,value,explanation,options,type) VALUES('NewsToolEditor','tinymce', 'Choose tool for editing News','tinymce|codemirror','Choice')" );
22547
22548     NewVersion( $DBversion, 22660, "Adds NewsToolEditor system preference");
22549 }
22550
22551 $DBversion = '20.06.00.020';
22552 if( CheckVersion( $DBversion ) ) {
22553     # Remove from the systempreferences table
22554     $dbh->do("DELETE FROM systempreferences WHERE variable = 'GoogleIndicTransliteration'");
22555
22556     NewVersion( $DBversion, 26070, "Remove references to deprecated Google Transliterate API");
22557 }
22558
22559 $DBversion = '20.06.00.021';
22560 if( CheckVersion( $DBversion ) ) {
22561     $dbh->do(q{
22562         UPDATE systempreferences SET options = "callnum|ccode|location|library"
22563         WHERE variable = "OpacItemLocation"
22564     });
22565     NewVersion( $DBversion, 25871, "Add library option to OpacItemLocation");
22566 }
22567
22568 $DBversion = '20.06.00.022';
22569 if( CheckVersion( $DBversion ) ) {
22570     unless ( column_exists('itemtypes', 'parent_type') ) {
22571         $dbh->do(q{
22572             ALTER TABLE itemtypes
22573                 ADD COLUMN parent_type VARCHAR(10) NULL DEFAULT NULL
22574                 AFTER itemtype;
22575
22576         });
22577     }
22578     unless ( foreign_key_exists( 'itemtypes', 'itemtypes_ibfk_1') ){
22579         $dbh->do(q{
22580             ALTER TABLE itemtypes
22581             ADD CONSTRAINT itemtypes_ibfk_1
22582             FOREIGN KEY (parent_type) REFERENCES itemtypes (itemtype)
22583         });
22584     }
22585
22586     NewVersion( $DBversion, 21946, "Add parent type to itemtypes" );
22587 }
22588
22589 $DBversion = '20.06.00.023';
22590 if( CheckVersion( $DBversion ) ) {
22591
22592     my ( $QuoteOfTheDay ) = $dbh->selectrow_array(q|
22593         SELECT value FROM systempreferences WHERE variable='QuoteOfTheDay'
22594     |);
22595     my $options = $QuoteOfTheDay ? 'opac' : '';
22596     $dbh->do( q|
22597         UPDATE systempreferences
22598         SET value = ?,
22599             options = 'intranet,opac',
22600             explanation = 'Enable or disable display of Quote of the Day on the OPAC and staff interface home page',
22601             type = 'multiple'
22602         WHERE variable = 'QuoteOfTheDay'
22603     |, undef, $options );
22604
22605     NewVersion( $DBversion, 16371, "Quote of the Day (QOTD) for the staff interface " );
22606 }
22607
22608 $DBversion = '20.06.00.024';
22609 if( CheckVersion( $DBversion ) ) {
22610
22611     $dbh->do( "UPDATE marc_subfield_structure SET liblibrarian = 'Home library' WHERE liblibrarian = 'Permanent location'
22612         AND tagfield = 952 and tagsubfield = 'a'" );
22613     $dbh->do( "UPDATE marc_subfield_structure SET libopac = 'Home library' WHERE libopac = 'Permanent location'
22614         AND tagfield = 952 and tagsubfield = 'a'" );
22615     $dbh->do( "UPDATE marc_subfield_structure SET liblibrarian = 'Current library' WHERE liblibrarian = 'Current location'
22616         AND tagfield = 952 and tagsubfield = 'b'" );
22617     $dbh->do( "UPDATE marc_subfield_structure SET libopac = 'Current library' WHERE libopac = 'Current location'
22618         AND tagfield = 952 and tagsubfield = 'b'" );
22619
22620     NewVersion( $DBversion, 25867, "Update subfield descriptions for 952\$a and 952\$b");
22621 }
22622
22623 $DBversion = '20.06.00.025';
22624 if( CheckVersion( $DBversion ) ) {
22625
22626     $dbh->do( q{
22627         INSERT IGNORE INTO systempreferences (variable,value,options,explanation,type) VALUES
22628         ('PatronDuplicateMatchingAddFields','surname|firstname|dateofbirth', NULL,'A list of fields separated by "|" to deduplicate patrons when created','Free')
22629     });
22630
22631     NewVersion( $DBversion, 6725, "Adds PatronDuplicateMatchingAddFields system preference");
22632 }
22633
22634 $DBversion = '20.06.00.026';
22635 if (CheckVersion($DBversion)) {
22636     unless (column_exists('accountlines', 'credit_number')) {
22637         $dbh->do('ALTER TABLE accountlines ADD COLUMN credit_number VARCHAR(20) NULL DEFAULT NULL COMMENT "autogenerated number for credits" AFTER debit_type_code');
22638     }
22639
22640     unless (column_exists('account_credit_types', 'credit_number_enabled')) {
22641         $dbh->do(q{
22642             ALTER TABLE account_credit_types
22643             ADD COLUMN credit_number_enabled TINYINT(1) NOT NULL DEFAULT 0
22644                 COMMENT "Is autogeneration of credit number enabled for this credit type"
22645                 AFTER can_be_added_manually
22646         });
22647     }
22648
22649     $dbh->do('INSERT IGNORE INTO systempreferences (variable, value, options, explanation, type) VALUES(?, ?, ?, ?, ?)', undef, 'AutoCreditNumber', '', '', 'Automatically generate a number for account credits', 'Choice');
22650
22651     NewVersion( $DBversion, 19036, "Add accountlines.credit_number, account_credit_types.credit_number_enabled and syspref AutoCreditNumber" );
22652 }
22653
22654 $DBversion = '20.06.00.027';
22655 if( CheckVersion( $DBversion ) ) {
22656     $dbh->do( "INSERT IGNORE INTO systempreferences (variable,value,explanation,options,type) VALUES('BiblioItemtypeInfo', '0','Control whether biblio level itemtype image displays','0','YesNo')" );
22657
22658     NewVersion( $DBversion, 8732, 'Add new BiblioItemtypeInfo to system preferences' );
22659 }
22660
22661 $DBversion = '20.06.00.028';
22662 if( CheckVersion( $DBversion ) ) {
22663     $dbh->do(q{
22664         INSERT IGNORE INTO systempreferences ( `variable`, `value`, `options`, `explanation`, `type` ) VALUES
22665         ('DefaultLongOverdueSkipLostStatuses', '', NULL, 'Skip these lost statuses by default in longoverdue.pl', 'Free')
22666     });
22667
22668     NewVersion( $DBversion, 25958, "Allow LongOverdue cron to exclude specified lost values");
22669 }
22670
22671 $DBversion = '20.06.00.029';
22672 if ( CheckVersion( $DBversion ) ) {
22673     $dbh->do(q{
22674         INSERT IGNORE INTO authorised_value_categories( category_name, is_system ) VALUES ('HOLD_CANCELLATION', 0);
22675     });
22676
22677     if ( !column_exists( 'reserves', 'cancellation_reason' ) ) {
22678         $dbh->do(q{
22679             ALTER TABLE reserves ADD COLUMN `cancellation_reason` varchar(80) default NULL AFTER cancellationdate;
22680         });
22681     }
22682
22683     if ( !column_exists( 'old_reserves', 'cancellation_reason' ) ) {
22684         $dbh->do(q{
22685             ALTER TABLE old_reserves ADD COLUMN `cancellation_reason` varchar(80) default NULL AFTER cancellationdate;
22686         });
22687     }
22688
22689     NewVersion( $DBversion, 25534, "Add ability to send an email specifying a reason when canceling a hold");
22690 }
22691
22692 $DBversion = '20.06.00.030';
22693 if ( CheckVersion( $DBversion ) ) {
22694
22695     $dbh->do(q{
22696         INSERT IGNORE INTO systempreferences ( `variable`, `value`, `options`, `explanation`, `type`) VALUES
22697         ('AutoApprovePatronProfileSettings', '0', '', 'Automatically approve patron profile changes from the OPAC.', 'YesNo');
22698     });
22699
22700     NewVersion( $DBversion, 20057, "Add new system preference 'AutoApprovePatronProfileSettings'");
22701 }
22702
22703 $DBversion = '20.06.00.031';
22704 if( CheckVersion( $DBversion ) ) {
22705
22706     if( !column_exists( 'reserves', 'non_priority' ) ) {
22707         $dbh->do("ALTER TABLE reserves ADD COLUMN `non_priority` tinyint(1) NOT NULL DEFAULT 0 AFTER `item_level_hold`");
22708     }
22709
22710     if( !column_exists( 'old_reserves', 'non_priority' ) ) {
22711         $dbh->do("ALTER TABLE old_reserves ADD COLUMN `non_priority` tinyint(1) NOT NULL DEFAULT 0 AFTER `item_level_hold`");
22712     }
22713
22714     NewVersion( $DBversion, 22789, "Add non_priority column on reserves and old_reserves tables");
22715 }
22716
22717 $DBversion = '20.06.00.032';
22718 if( CheckVersion( $DBversion ) ) {
22719     if( !column_exists( 'items', 'exclude_from_local_holds_priority' ) ) {
22720         $dbh->do(q{
22721             ALTER TABLE `items` ADD COLUMN `exclude_from_local_holds_priority` tinyint(1) default NULL AFTER `new_status`
22722         });
22723     }
22724
22725     if( !column_exists( 'deleteditems', 'exclude_from_local_holds_priority' ) ) {
22726         $dbh->do(q{
22727             ALTER TABLE `deleteditems` ADD COLUMN `exclude_from_local_holds_priority` tinyint(1) default NULL AFTER `new_status`
22728         });
22729     }
22730
22731     if( !column_exists( 'categories', 'exclude_from_local_holds_priority' ) ) {
22732         $dbh->do(q{
22733             ALTER TABLE `categories` ADD COLUMN `exclude_from_local_holds_priority` tinyint(1) default NULL AFTER `change_password`
22734         });
22735     }
22736     NewVersion( $DBversion, 19889, "Add exclude_from_local_holds_priority column to items, deleteditems and categories tables");
22737 }
22738
22739 $DBversion = '20.06.00.033';
22740 if( CheckVersion( $DBversion ) ) {
22741     if( column_exists( 'opac_news', 'timestamp' ) ) {
22742         $dbh->do(q|
22743             ALTER TABLE opac_news
22744             CHANGE COLUMN timestamp published_on date DEFAULT NULL
22745         |);
22746     }
22747     if( !column_exists( 'opac_news', 'updated_on' ) ) {
22748         $dbh->do(q|
22749             ALTER TABLE opac_news
22750             ADD COLUMN updated_on timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP AFTER published_on
22751         |);
22752     }
22753
22754     $dbh->do(q|
22755         UPDATE letter
22756         SET content = REPLACE(content,?,?)
22757         WHERE content LIKE ?
22758     |, undef, 'opac_news.timestamp', 'opac_news.published_on', '%opac_news.timestamp%' );
22759
22760     NewVersion( $DBversion, 21066, ["Rename column opac_news.timestamp with published_on", "Add new column opac_news.updated_on", "Replace timestamp references in letters table"] );
22761 }
22762
22763 $DBversion = '20.06.00.034';
22764 if( CheckVersion( $DBversion ) ) {
22765     $dbh->do(q|
22766         INSERT IGNORE INTO systempreferences (variable, value, options, explanation, type)
22767         VALUES ('AddressForFailedOverdueNotices', '', NULL, 'Destination email for failed overdue notices. If left empty then it will fallback to the first defined address in the following list: Library ReplyTo, Library Email, ReplytoDefault and KohaAdminEmailAddress', 'free')
22768     |);
22769
22770     NewVersion( $DBversion, 24197, "Add new system preference 'AddressForFailedOverdueNotices'" );
22771 }
22772
22773 $DBversion = '20.06.00.035';
22774 if ( CheckVersion( $DBversion ) ) {
22775     $dbh->do(q{
22776         INSERT IGNORE INTO systempreferences ( `variable`, `value`, `options`, `explanation`, `type` ) VALUES
22777         ('EdifactInvoiceImport', 'automatic', 'automatic|manual', "If on, don't auto-import EDI invoices, just keep them in the database with the status 'new'", 'Choice')
22778     });
22779
22780     NewVersion( $DBversion, 23682, "Add new system preference 'EdifactInvoiceImport'" );
22781 }
22782
22783 $DBversion = '20.06.00.036';
22784 if( CheckVersion( $DBversion ) ) {
22785     # Fix the markup in the OPACSearchForTitleIn system preference
22786     $dbh->do("UPDATE systempreferences SET VALUE = replace( value, '</li>', ''), value = REPLACE( value, '<li>', '') WHERE VARIABLE = 'OPACSearchForTitleIn';");
22787
22788     NewVersion( $DBversion, 20168, "Update OPACSearchForTitleIn to work with Bootstrap 4");
22789 }
22790
22791 $DBversion = '20.06.00.037';
22792 if( CheckVersion( $DBversion ) ) {
22793     if( !column_exists( 'categories', 'min_password_length' ) ) {
22794         $dbh->do("ALTER TABLE categories ADD COLUMN `min_password_length` smallint(6) NULL DEFAULT NULL AFTER `change_password` -- set minimum password length for patrons in this category");
22795     }
22796     if( !column_exists( 'categories', 'require_strong_password' ) ) {
22797         $dbh->do("ALTER TABLE categories ADD COLUMN `require_strong_password` TINYINT(1) NULL DEFAULT NULL AFTER `min_password_length` -- set required password strength for patrons in this category");
22798     }
22799
22800     NewVersion( $DBversion, 23816, "Add min_password_length and require_strong_password columns in categories table");
22801 }
22802
22803 $DBversion = '20.06.00.038';
22804 if( CheckVersion( $DBversion ) ) {
22805     $dbh->do( "ALTER TABLE `search_field` MODIFY COLUMN `type` enum('','string','date','number','boolean','sum','isbn','stdno','year') NOT NULL" );
22806     $dbh->do( "UPDATE `search_field` SET type = 'year' WHERE name = 'date-of-publication'" );
22807
22808     NewVersion( $DBversion, 24807, "Add 'year' type to improve sorting behaviour" );
22809 }
22810
22811 $DBversion = '20.06.00.039';
22812 if( CheckVersion( $DBversion ) ) {
22813
22814     if( !column_exists( 'hold_fill_targets', 'reserve_id' ) ) {
22815         $dbh->do( "ALTER TABLE hold_fill_targets ADD COLUMN reserve_id int(11) DEFAULT NULL AFTER item_level_request" );
22816     }
22817
22818     NewVersion( $DBversion, 18958, "Add reserve_id to hold_fill_targets");
22819 }
22820
22821 $DBversion = '20.06.00.040';
22822 if( CheckVersion( $DBversion ) ) {
22823     $dbh->do( "INSERT IGNORE INTO systempreferences (variable, value, options, explanation, type) VALUES ('OpacMetaDescription','','','This description will show in search engine results (160 characters).','Textarea');" );
22824
22825     NewVersion( $DBversion, 26454, "Add system preference to set meta description for the OPAC");
22826 }
22827
22828 $DBversion = '20.06.00.041';
22829 if ( CheckVersion($DBversion) ) {
22830
22831     if ( column_exists( 'items', 'paidfor' ) ) {
22832         my ($count) = $dbh->selectrow_array(
22833             q|
22834                 SELECT COUNT(*)
22835                 FROM items
22836                 WHERE paidfor IS NOT NULL AND paidfor <> ""
22837             |
22838         );
22839         if ($count) {
22840             warn "Warning - Cannot remove column items.paidfor. At least one value exists";
22841         }
22842         else {
22843             $dbh->do(q|ALTER TABLE items DROP COLUMN paidfor|);
22844             $dbh->do(q|UPDATE marc_subfield_structure SET kohafield = '' WHERE kohafield = 'items.paidfor'|);
22845         }
22846     }
22847
22848     if ( column_exists( 'deleteditems', 'paidfor' ) ) {
22849         my ($count) = $dbh->selectrow_array(
22850             q|
22851                 SELECT COUNT(*)
22852                 FROM deleteditems
22853                 WHERE paidfor IS NOT NULL AND paidfor <> ""
22854             |
22855         );
22856         if ($count) {
22857             warn "Warning - Cannot remove column deleteditems.paidfor. At least one value exists";
22858         }
22859         else {
22860             $dbh->do(q|ALTER TABLE deleteditems DROP COLUMN paidfor|);
22861         }
22862     }
22863
22864     NewVersion( $DBversion, 26268, "Remove items.paidfor field" );
22865 }
22866
22867 $DBversion = '20.06.00.042';
22868 if( CheckVersion( $DBversion ) ) {
22869     unless ( column_exists('letter', 'updated_on') ) {
22870         $dbh->do(q|
22871             ALTER TABLE letter ADD COLUMN updated_on timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP AFTER lang
22872         |);
22873     }
22874
22875     NewVersion( $DBversion, 25776, "Add letter.updated_on");
22876 }
22877
22878 $DBversion = '20.06.00.043';
22879 if( CheckVersion( $DBversion ) ) {
22880     $dbh->do(q{
22881         INSERT IGNORE INTO systempreferences (variable,value,options,explanation,type) VALUES ('CircConfirmItemParts', '0', NULL, 'Require staff to confirm that all parts of an item are present at checkin/checkout.', 'YesNo')
22882     });
22883
22884     NewVersion( $DBversion, 25261, "Add CircConfirmItemParts syspref");
22885 }
22886
22887 $DBversion = '20.06.00.044';
22888 if( CheckVersion( $DBversion ) ) {
22889
22890     unless (TableExists('smtp_servers')) {
22891
22892         # Create the table
22893         $dbh->do(q{
22894             CREATE TABLE `smtp_servers` (
22895                 `id` INT(11) NOT NULL AUTO_INCREMENT,
22896                 `name` VARCHAR(80) NOT NULL,
22897                 `host` VARCHAR(80) NOT NULL DEFAULT 'localhost',
22898                 `port` INT(11) NOT NULL DEFAULT 25,
22899                 `timeout` INT(11) NOT NULL DEFAULT 120,
22900                 `ssl_mode` ENUM('disabled', 'ssl', 'starttls') NOT NULL,
22901                 `user_name` VARCHAR(80) NULL DEFAULT NULL,
22902                 `password` VARCHAR(80) NULL DEFAULT NULL,
22903                 `debug` TINYINT(1) NOT NULL DEFAULT 0,
22904                 PRIMARY KEY (`id`),
22905                 KEY `host_idx` (`host`)
22906             ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
22907         });
22908     }
22909
22910     unless (TableExists('library_smtp_servers')) {
22911         $dbh->do(q{
22912             CREATE TABLE `library_smtp_servers` (
22913                 `id` INT(11) NOT NULL AUTO_INCREMENT,
22914                 `library_id` VARCHAR(10) NOT NULL,
22915                 `smtp_server_id` INT(11) NOT NULL,
22916                 PRIMARY KEY (`id`),
22917                 UNIQUE KEY `library_id_idx` (`library_id`),
22918                 KEY `smtp_server_id_idx` (`smtp_server_id`),
22919                 CONSTRAINT `library_smtp_servers_library_fk` FOREIGN KEY (`library_id`) REFERENCES `branches` (`branchcode`) ON DELETE CASCADE ON UPDATE CASCADE,
22920                 CONSTRAINT `library_smtp_servers_smtp_servers_fk` FOREIGN KEY (`smtp_server_id`) REFERENCES `smtp_servers` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
22921             ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
22922         });
22923     }
22924
22925     $dbh->do(q{
22926         INSERT IGNORE INTO permissions
22927             (module_bit, code, description)
22928         VALUES ( 3, 'manage_smtp_servers', 'Manage SMTP servers configuration');
22929     });
22930
22931     NewVersion( $DBversion, 22343, "Add SMTP configuration options");
22932 }
22933
22934 $DBversion = '20.06.00.045';
22935 if( CheckVersion( $DBversion ) ) {
22936
22937     unless ( TableExists('background_jobs') ) {
22938         $dbh->do(q|
22939             CREATE TABLE background_jobs (
22940                 id INT(11) NOT NULL AUTO_INCREMENT,
22941                 status VARCHAR(32),
22942                 progress INT(11),
22943                 size INT(11),
22944                 borrowernumber INT(11),
22945                 type VARCHAR(64),
22946                 data TEXT,
22947                 enqueued_on DATETIME DEFAULT NULL,
22948                 started_on DATETIME DEFAULT NULL,
22949                 ended_on DATETIME DEFAULT NULL,
22950                 PRIMARY KEY (id)
22951             ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
22952         |);
22953     }
22954
22955     $dbh->do(qq{
22956         INSERT IGNORE permissions (module_bit, code, description)
22957         VALUES
22958         (3, 'manage_background_jobs', 'Manage background jobs')
22959     });
22960
22961     NewVersion( $DBversion, 22417, "Add new table background_jobs");
22962 }
22963
22964 $DBversion = '20.06.00.046';
22965 if( CheckVersion( $DBversion ) ) {
22966     unless ( foreign_key_exists( 'alert', 'alert_ibfk_1' ) ) {
22967         $dbh->do(q|
22968             DELETE a FROM alert a
22969             LEFT JOIN borrowers b ON a.borrowernumber=b.borrowernumber
22970             WHERE b.borrowernumber IS NULL
22971         |);
22972         $dbh->do(q|
22973             ALTER TABLE alert
22974             ADD CONSTRAINT alert_ibfk_1 FOREIGN KEY (borrowernumber) REFERENCES borrowers (borrowernumber) ON UPDATE CASCADE ON DELETE CASCADE
22975         |);
22976     }
22977     NewVersion( $DBversion, 13535, "Add FK constraint on borrowernumber to alert table" );
22978 }
22979
22980 $DBversion = '20.06.00.047';
22981 if ( CheckVersion($DBversion) ) {
22982
22983     #Get value from AllowPurchaseSuggestionBranchChoice system preference
22984     my ($allowpurchasesuggestionbranchchoice) =
22985       C4::Context->preference('AllowPurchaseSuggestionBranchChoice');
22986     if ($allowpurchasesuggestionbranchchoice) {
22987         $dbh->do(q{
22988             INSERT IGNORE INTO systempreferences
22989             (`variable`, `value`, `options`, `explanation`, `type`)
22990             VALUES
22991             ('OPACSuggestionUnwantedFields','branch', NULL,'Define the hidden fields for a patron purchase suggestions made via OPAC.','multiple');
22992         });
22993     }
22994     else {
22995         $dbh->do(q{
22996             INSERT IGNORE INTO systempreferences
22997             (`variable`, `value`, `options`, `explanation`, `type`)
22998             VALUES
22999             ('OPACSuggestionUnwantedFields','', NULL,'Define the hidden fields for a patron purchase suggestions made via OPAC.','multiple');
23000         });
23001     }
23002
23003     #Remove the  AllowPurchaseSuggestionBranchChoice system preference
23004     $dbh->do(
23005         "DELETE FROM systempreferences WHERE variable='AllowPurchaseSuggestionBranchChoice'"
23006     );
23007     NewVersion( $DBversion, 23420, "Allow configuration of hidden fields on the suggestion form in OPAC" );
23008 }
23009
23010 $DBversion = '20.06.00.048';
23011 if( CheckVersion( $DBversion ) ) {
23012     $dbh->do(q{
23013         DELETE FROM circulation_rules WHERE
23014         rule_name IN ('holdallowed','hold_fulfillment_policy','returnbranch') AND
23015         rule_value = ''
23016     });
23017     NewVersion( $DBversion, 26529, "Remove blank default branch rules");
23018 }
23019
23020 $DBversion = '20.06.00.049';
23021 if( CheckVersion( $DBversion ) ) {
23022
23023     if( TableExists('biblioimages') && !column_exists( 'biblioimages', 'itemnumber' ) ) {
23024         $dbh->do(q|
23025             ALTER TABLE biblioimages
23026             ADD COLUMN itemnumber INT(11) DEFAULT NULL
23027             AFTER biblionumber;
23028         |);
23029         $dbh->do(q|
23030             ALTER TABLE biblioimages
23031             ADD FOREIGN KEY bibliocoverimage_fk2 (`itemnumber`) REFERENCES `items` (`itemnumber`) ON DELETE CASCADE ON UPDATE CASCADE
23032         |);
23033         $dbh->do(q|
23034             ALTER TABLE biblioimages MODIFY biblionumber INT(11) DEFAULT NULL
23035         |)
23036     }
23037
23038     if( !TableExists('cover_images') ) {
23039         $dbh->do(q|
23040             ALTER TABLE biblioimages RENAME cover_images
23041         |);
23042     }
23043
23044     NewVersion( $DBversion, '26145', ["Add the biblioimages.itemnumber column", "Rename table biblioimages with cover_images"] );
23045 }
23046
23047 $DBversion = '20.06.00.050';
23048 if ( CheckVersion($DBversion) ) {
23049     $dbh->do(q{
23050         INSERT IGNORE INTO systempreferences ( `variable`, `value`, `options`, `explanation`, `type` ) VALUES
23051         ('NoIssuesChargeGuarantorsWithGuarantees','','','Define maximum amount withstanding before checkouts are blocked including guarantors and their other guarantees','Integer');
23052     });
23053
23054     NewVersion( $DBversion, 19382, "Add ability to block guarantees based on fees owed by guarantor and other guarantee - new system preference 'NoIssuesChargeGuarantorsWithGuarantees'");
23055 }
23056
23057 $DBversion = '20.06.00.051';
23058 if( CheckVersion( $DBversion ) ) {
23059     $dbh->do(q{
23060         INSERT IGNORE INTO systempreferences ( `variable`, `value`, `options`, `explanation`, `type` ) VALUES
23061         ('HoldsNeedProcessingSIP', '0', NULL, 'Require staff to check-in before hold is set to waiting state', 'YesNo' )
23062     });
23063
23064     NewVersion( $DBversion, 12556, "Add new syspref HoldsNeedProcessingSIP");
23065 }
23066
23067 $DBversion = '20.06.00.052';
23068 if ( CheckVersion($DBversion) ) {
23069     $dbh->do(q{
23070         INSERT IGNORE INTO systempreferences (variable, value, options, explanation, type) VALUES ('OAI-PMH:AutoUpdateSetEmbedItemData', '0', '', 'Embed item information when automatically updating OAI sets. Requires OAI-PMH:AutoUpdateSets syspref to be enabled', 'YesNo')
23071     });
23072
23073     $dbh->do(q{
23074         UPDATE systempreferences SET explanation = 'Automatically update OAI sets when a bibliographic or item record is created or updated' WHERE variable = 'OAI-PMH:AutoUpdateSets'
23075     });
23076
23077     NewVersion( $DBversion, 25460, "Update OAI set when adding/editing/deleting item records" );
23078 }
23079
23080 $DBversion = '20.06.00.053';
23081 if( CheckVersion( $DBversion ) ) {
23082     $dbh->do( "UPDATE systempreferences SET explanation='Define which baskets a user is allowed to view: their own only, any within their branch, or all' WHERE variable='AcqViewBaskets'" );
23083     $dbh->do( "UPDATE systempreferences SET explanation='If enabled, the patron can set checkouts to be visible to their guarantor' WHERE variable='AllowPatronToSetCheckoutsVisibilityForGuarantor'" );
23084     $dbh->do( "UPDATE systempreferences SET explanation='If enabled, the patron can set fines to be visible to their guarantor' WHERE variable='AllowPatronToSetFinesVisibilityForGuarantor'" );
23085     $dbh->do( "UPDATE systempreferences SET explanation='If on, and a patron is logged into the OPAC, items from their home library will be emphasized and shown first in search results and item details.' WHERE variable='HighlightOwnItemsOnOPAC'" );
23086     $dbh->do( "UPDATE systempreferences SET explanation='If ON, the next user will automatically get the last searches in their history' WHERE variable='LoadSearchHistoryToTheFirstLoggedUser'" );
23087     $dbh->do( "UPDATE systempreferences SET explanation='If enabled, any patron attempting to register themselves via the OPAC will be required to verify themselves via email to activate their account.' WHERE variable='PatronSelfRegistrationVerifyByEmail'" );
23088
23089     NewVersion( $DBversion, 26569, "Use gender neutral pronouns in system preference explanations" );
23090 }
23091
23092 $DBversion = '20.06.00.054';
23093 if ( CheckVersion($DBversion) ) {
23094
23095     $dbh->do(
23096         qq{
23097             INSERT IGNORE INTO account_credit_types (code, description, can_be_added_manually, is_system)
23098             VALUES
23099               ('OVERPAYMENT', 'Overpayment refund', 0, 1)
23100         }
23101     );
23102
23103     $dbh->do(
23104         qq{
23105             INSERT IGNORE INTO account_offset_types ( type ) VALUES ('Overpayment');
23106         }
23107     );
23108
23109     $dbh->do(
23110         qq{
23111             UPDATE accountlines SET credit_type_code = 'OVERPAYMENT' WHERE credit_type_code = 'CREDIT' AND description = 'Overpayment refund'
23112         }
23113     );
23114
23115     NewVersion( $DBversion, 25596, "Add OVERPAYMENT credit type" );
23116 }
23117
23118 $DBversion = '20.06.00.055';
23119 if( CheckVersion( $DBversion ) ) {
23120     my $count_missing_budget = $dbh->selectrow_arrayref(q|
23121         SELECT COUNT(*) FROM aqbudgets ab WHERE NOT EXISTS
23122             (SELECT * FROM aqbudgetperiods abp WHERE abp.budget_period_id = ab.budget_period_id)
23123             AND budget_period_id IS NOT NULL;
23124
23125     |);
23126
23127     my $message = "";
23128     if($count_missing_budget->[0] > 0) {
23129         $dbh->do(q|
23130             CREATE TABLE _bug_18050_aqbudgets AS
23131             SELECT * FROM aqbudgets ab WHERE NOT EXISTS
23132                 (SELECT * FROM aqbudgetperiods abp WHERE abp.budget_period_id = ab.budget_period_id)
23133         |);
23134
23135         $dbh->do(q|
23136             UPDATE aqbudgets ab SET budget_period_id = NULL
23137             WHERE NOT EXISTS
23138                 (SELECT * FROM aqbudgetperiods abp WHERE abp.budget_period_id = ab.budget_period_id)
23139         |);
23140         $message = ". There are $count_missing_budget->[0] funds in your database that are not linked
23141         to a valid budget. Setting invalid budget id (budget_period_id) to null. The table _bug_18050_aqbudgets
23142         was created with original data. Please check that table and place valid ids in aqbudget table as soon as possible."
23143
23144     }
23145
23146     if ( !foreign_key_exists( 'aqbudgets', 'aqbudgetperiods_ibfk_1' ) ) {
23147         $dbh->do(q|
23148             ALTER TABLE aqbudgets ADD CONSTRAINT `aqbudgetperiods_ibfk_1` FOREIGN KEY (`budget_period_id`) REFERENCES `aqbudgetperiods` (`budget_period_id`) ON UPDATE CASCADE ON DELETE CASCADE
23149         |);
23150         NewVersion( $DBversion, 18050, "Add FK constraint on aqbudgets.budget_period_id$message");
23151     } else {
23152         NewVersion( $DBversion, 18050, "FK constraint on aqbudgets.budget already exists");
23153     }
23154
23155 }
23156
23157 $DBversion = '20.06.00.056';
23158 if( CheckVersion( $DBversion ) ) {
23159
23160     $dbh->do("DROP INDEX title ON import_biblios");
23161     $dbh->do("DROP INDEX isbn ON import_biblios");
23162     $dbh->do("ALTER TABLE import_biblios MODIFY title LONGTEXT");
23163     $dbh->do("ALTER TABLE import_biblios MODIFY author LONGTEXT");
23164     $dbh->do("ALTER TABLE import_biblios MODIFY isbn LONGTEXT");
23165     $dbh->do("ALTER TABLE import_biblios MODIFY issn LONGTEXT");
23166     $dbh->do("CREATE INDEX title ON import_biblios (title(191));");
23167     $dbh->do("CREATE INDEX isbn ON import_biblios (isbn(191));");
23168
23169     NewVersion( $DBversion, 26853, "Update import_biblios columns and indexes" );
23170 }
23171
23172 $DBversion = '20.06.00.057';
23173 if( CheckVersion( $DBversion ) ) {
23174     $dbh->do(q{
23175         INSERT IGNORE INTO `systempreferences` (`variable`, `value`, `options`, `explanation`, `type`) VALUES
23176             ('ArticleRequestsMandatoryFieldsItemOnly', '', NULL, 'Comma delimited list of required fields for bibs where article requests rule = ''item_only''', 'multiple')
23177     });
23178     $dbh->do(q{
23179         DELETE FROM systempreferences WHERE variable = "ArticleRequestsMandatoryFieldsItemsOnly"
23180     });
23181
23182     NewVersion( $DBversion, 26638, "Add missing system preference ArticleRequestsMandatoryFieldsItemOnly");
23183 }
23184
23185 $DBversion = '20.06.00.058';
23186 if( CheckVersion( $DBversion ) ) {
23187
23188     # Adding the ON DELETE CASCASE ON UPDATE CASCADE, in case it's missing (from 9016 - 3.15.00.039)
23189     $dbh->do( q{
23190         ALTER TABLE letter DROP FOREIGN KEY message_transport_type_fk
23191     } );
23192
23193     $dbh->do( q{
23194         ALTER TABLE letter ADD CONSTRAINT message_transport_type_fk FOREIGN KEY (message_transport_type) REFERENCES message_transport_types(message_transport_type) ON DELETE CASCADE ON UPDATE CASCADE
23195     } );
23196
23197     $dbh->do(q{
23198         UPDATE message_transport_types SET message_transport_type = "itiva" WHERE message_transport_type = "phone"
23199     });
23200
23201     NewVersion( $DBversion, 25333, q{Change message transport type for Talking Tech from "phone" to "itiva"});
23202 }
23203
23204 $DBversion = '20.06.00.059';
23205 if( CheckVersion( $DBversion ) ) {
23206
23207     if( !column_exists( 'search_field', 'mandatory' ) ) {
23208         $dbh->do( "ALTER TABLE search_field ADD COLUMN mandatory tinyint(1) NULL DEFAULT NULL AFTER opac" );
23209     }
23210
23211     NewVersion( $DBversion, 19482, "Add mandatory column to search_field for ES mapping" );
23212 }
23213
23214 $DBversion = '20.06.00.060';
23215 if( CheckVersion( $DBversion ) ) {
23216     $dbh->do(q{
23217         INSERT IGNORE INTO systempreferences ( `variable`, `value`, `options`, `explanation`, `type` ) VALUES
23218         ('PhoneNotification','0',NULL,'If ON, enables generation of phone notifications to be sent by plugins','YesNo')
23219     });
23220
23221     $dbh->do(q{
23222         INSERT IGNORE INTO message_transport_types (message_transport_type) VALUES ('phone')
23223     });
23224
23225     $dbh->do(q{
23226         INSERT IGNORE INTO `message_transports`
23227         (`message_attribute_id`, `message_transport_type`, `is_digest`, `letter_module`, `letter_code`)
23228         VALUES
23229         (1, 'phone',       0, 'circulation', 'DUE'),
23230         (1, 'phone',       1, 'circulation', 'DUEDGST'),
23231         (2, 'phone',       0, 'circulation', 'PREDUE'),
23232         (2, 'phone',       1, 'circulation', 'PREDUEDGST'),
23233         (4, 'phone',       0, 'reserves',    'HOLD'),
23234         (5, 'phone',       0, 'circulation', 'CHECKIN'),
23235         (6, 'phone',       0, 'circulation', 'CHECKOUT');
23236     });
23237
23238     NewVersion( $DBversion, 25334, "Add generic 'phone' message transport type");
23239 }
23240
23241 $DBversion = '20.06.00.061';
23242 if( CheckVersion( $DBversion ) ) {
23243     if ( !column_exists( 'reserves', 'desk_id' ) ) {
23244         $dbh->do(q{
23245              ALTER TABLE reserves ADD COLUMN desk_id INT(11) DEFAULT NULL AFTER branchcode,
23246              ADD KEY desk_id (`desk_id`),
23247              ADD CONSTRAINT `reserves_ibfk_6` FOREIGN KEY (`desk_id`) REFERENCES `desks` (`desk_id`) ON DELETE SET NULL ON UPDATE CASCADE ;
23248         });
23249         $dbh->do(q{
23250              ALTER TABLE old_reserves ADD COLUMN desk_id INT(11) DEFAULT NULL AFTER branchcode,
23251              ADD KEY `old_desk_id` (`desk_id`);
23252         });
23253     }
23254
23255     NewVersion( $DBversion, 24412, "Attach waiting reserve to desk" );
23256 }
23257
23258 $DBversion = '20.06.00.062';
23259 if( CheckVersion( $DBversion ) ) {
23260     $dbh->do( "UPDATE circulation_rules SET rule_name = 'lostreturn' WHERE rule_name = 'refund'" );
23261     $dbh->do( "UPDATE circulation_rules SET rule_value = 'refund' WHERE rule_name = 'lostreturn' AND rule_value = 1" );
23262
23263     NewVersion( $DBversion, 23091, "Update refund rules");
23264 }
23265
23266 $DBversion = '20.06.00.063';
23267 if( CheckVersion( $DBversion ) ) {
23268     $dbh->do(q{INSERT IGNORE INTO circulation_rules (branchcode, categorycode, itemtype, rule_name, rule_value) VALUES (NULL, NULL, NULL, 'decreaseloanholds', NULL) });
23269
23270     NewVersion( $DBversion, 14866, "Add decreaseloanholds circulation rule" );
23271 }
23272
23273 $DBversion = '20.06.00.064';
23274 if ( CheckVersion($DBversion) ) {
23275
23276     $dbh->do(q{
23277         INSERT IGNORE INTO account_credit_types (code, description, can_be_added_manually, is_system)
23278         VALUES ('CANCELLATION', 'Cancelled charge', 0, 1)
23279     });
23280
23281     $dbh->do(q{
23282         INSERT IGNORE INTO account_offset_types ( type ) VALUES ('CANCELLATION');
23283     });
23284
23285     NewVersion( $DBversion, 24603, "Add CANCELLATION credit_type_code" );
23286 }
23287
23288 $DBversion = '20.06.00.065';
23289 if( CheckVersion( $DBversion ) ) {
23290     if( !column_exists( 'issues', 'issuer_id' ) ) {
23291         $dbh->do( q| ALTER TABLE issues ADD issuer_id INT(11) DEFAULT NULL AFTER borrowernumber | );
23292     }
23293     if (!foreign_key_exists( 'issues', 'issues_ibfk_borrowers_borrowernumber' )) {
23294         $dbh->do( q| ALTER TABLE issues ADD CONSTRAINT `issues_ibfk_borrowers_borrowernumber` FOREIGN KEY (`issuer_id`) REFERENCES `borrowers` (`borrowernumber`) ON DELETE SET NULL ON UPDATE CASCADE | );
23295     }
23296     if( !column_exists( 'old_issues', 'issuer_id' ) ) {
23297         $dbh->do( q| ALTER TABLE old_issues ADD issuer_id INT(11) DEFAULT NULL AFTER borrowernumber | );
23298     }
23299     if (!foreign_key_exists( 'old_issues', 'old_issues_ibfk_borrowers_borrowernumber' )) {
23300         $dbh->do( q| ALTER TABLE old_issues ADD CONSTRAINT `old_issues_ibfk_borrowers_borrowernumber` FOREIGN KEY (`issuer_id`) REFERENCES `borrowers` (`borrowernumber`) ON DELETE SET NULL ON UPDATE CASCADE | );
23301     }
23302
23303     $dbh->do( q| INSERT IGNORE INTO systempreferences (variable, value, explanation, options, type) VALUES ('RecordStaffUserOnCheckout', '0', 'If enabled, when an item is checked out, the user who checked out the item is recorded', '', 'YesNo'); | );
23304
23305     NewVersion( $DBversion, 23916, [ "Add new [old_]issues.issuer DB fields", "Add new syspref RecordStaffUserOnCheckout" ] );
23306 }
23307
23308 $DBversion = '20.06.00.066';
23309 if( CheckVersion( $DBversion ) ) {
23310     if( !column_exists( 'branches', 'branchillemail' ) ) {
23311         $dbh->do( q| ALTER TABLE branches ADD branchillemail LONGTEXT AFTER branchemail | );
23312     }
23313     # Add new sysprefs
23314     $dbh->do( q| INSERT IGNORE INTO systempreferences (variable, value, explanation, options, type) VALUES ('ILLDefaultStaffEmail', '', 'Fallback email address for staff ILL notices to be sent to in the absence of a branch address', NULL, 'Free'); | );
23315     $dbh->do( q| INSERT IGNORE INTO systempreferences (variable, value, explanation, options, type) VALUES ('ILLSendStaffNotices', NULL, 'Send these ILL notices to staff', NULL, 'multiple'); | );
23316     # Add new notices
23317     $dbh->do( q| INSERT IGNORE INTO letter(module, code, branchcode, name, is_html, title, content, message_transport_type, lang) VALUES ('ill', 'ILL_PICKUP_READY', '', 'ILL request ready for pickup', 0, "Interlibrary loan request ready for pickup", "Dear [% borrower.firstname %] [% borrower.surname %],\n\nThe Interlibrary loans request number [% illrequest.illrequest_id %] you placed for:\n\n- [% ill_bib_title %] - [% ill_bib_author %]\n\nis ready for pick up from [% branch.branchname %].\n\nKind Regards\n\n[% branch.branchname %]\n[% branch.branchaddress1 %]\n[% branch.branchaddress2 %]\n[% branch.branchaddress3 %]\n[% branch.branchcity %]\n[% branch.branchstate %]\n[% branch.branchzip %]\n[% branch.branchphone %]\n[% branch.branchillemail %]\n[% branch.branchemail %]", 'email', 'default'); | );
23318     $dbh->do( q| INSERT IGNORE INTO letter(module, code, branchcode, name, is_html, title, content, message_transport_type, lang) VALUES ('ill', 'ILL_REQUEST_UNAVAIL', '', 'ILL request unavailable', 0, "Interlibrary loan request unavailable", "Dear [% borrower.firstname %] [% borrower.surname %],\n\nThe Interlibrary loans request number [% illrequest.illrequest_id %] you placed for\n\n- [% ill_bib_title %] - [% ill_bib_author %]\n\nis unfortunately unavailable.\n\nKind Regards\n\n[% branch.branchname %]\n[% branch.branchaddress1 %]\n[% branch.branchaddress2 %]\n[% branch.branchaddress3 %]\n[% branch.branchcity %]\n[% branch.branchstate %]\n[% branch.branchzip %]\n[% branch.branchphone %]\n[% branch.branchillemail %]\n[% branch.branchemail %]", 'email', 'default'); | );
23319     $dbh->do( q| INSERT IGNORE INTO letter(module, code, branchcode, name, is_html, title, content, message_transport_type, lang) VALUES ('ill', 'ILL_REQUEST_CANCEL', '', 'ILL request cancelled', 0, "Interlibrary loan request cancelled", "The patron for interlibrary loans request [% illrequest.illrequest_id %], with the following details, has requested cancellation of this ILL request:\n\n[% ill_full_metadata %]", 'email', 'default'); | );
23320     $dbh->do( q| INSERT IGNORE INTO letter(module, code, branchcode, name, is_html, title, content, message_transport_type, lang) VALUES ('ill', 'ILL_REQUEST_MODIFIED', '', 'ILL request modified', 0, "Interlibrary loan request modified", "The patron for interlibrary loans request [% illrequest.illrequest_id %], with the following details, has modified this ILL request:\n\n[% ill_full_metadata %]", 'email', 'default'); | );
23321     $dbh->do( q| INSERT IGNORE INTO letter(module, code, branchcode, name, is_html, title, content, message_transport_type, lang) VALUES ('ill', 'ILL_PARTNER_REQ', '', 'ILL request to partners', 0, "Interlibrary loan request to partners", "Dear Sir/Madam,\n\nWe would like to request an interlibrary loan for a title matching the following description:\n\n[% ill_full_metadata %]\n\nPlease let us know if you are able to supply this to us.\n\nKind Regards\n\n[% branch.branchname %]\n[% branch.branchaddress1 %]\n[% branch.branchaddress2 %]\n[% branch.branchaddress3 %]\n[% branch.branchcity %]\n[% branch.branchstate %]\n[% branch.branchzip %]\n[% branch.branchphone %]\n[% branch.branchillemail %]\n[% branch.branchemail %]", 'email', 'default'); | );
23322     $dbh->do( q| INSERT IGNORE INTO letter(module, code, branchcode, name, is_html, title, content, message_transport_type, lang) VALUES ('ill', 'ILL_PICKUP_READY', '', 'ILL request ready for pickup', 0, "Interlibrary loan request ready for pickup", "Dear [% borrower.firstname %] [% borrower.surname %],\n\nThe Interlibrary loans request number [% illrequest.illrequest_id %] you placed for:\n\n- [% ill_bib_title %] - [% ill_bib_author %]\n\nis ready for pick up from [% branch.branchname %].\n\nKind Regards\n\n[% branch.branchname %]\n[% branch.branchaddress1 %]\n[% branch.branchaddress2 %]\n[% branch.branchaddress3 %]\n[% branch.branchcity %]\n[% branch.branchstate %]\n[% branch.branchzip %]\n[% branch.branchphone %]\n[% branch.branchillemail %]\n[% branch.branchemail %]", 'sms', 'default'); | );
23323     $dbh->do( q| INSERT IGNORE INTO letter(module, code, branchcode, name, is_html, title, content, message_transport_type, lang) VALUES ('ill', 'ILL_REQUEST_UNAVAIL', '', 'ILL request unavailable', 0, "Interlibrary loan request unavailable", "Dear [% borrower.firstname %] [% borrower.surname %],\n\nThe Interlibrary loans request number [% illrequest.illrequest_id %] you placed for\n\n- [% ill_bib_title %] - [% ill_bib_author %]\n\nis unfortunately unavailable.\n\nKind Regards\n\n[% branch.branchname %]\n[% branch.branchaddress1 %]\n[% branch.branchaddress2 %]\n[% branch.branchaddress3 %]\n[% branch.branchcity %]\n[% branch.branchstate %]\n[% branch.branchzip %]\n[% branch.branchphone %]\n[% branch.branchillemail %]\n[% branch.branchemail %]", 'sms', 'default'); | );
23324     $dbh->do( q| INSERT IGNORE INTO letter(module, code, branchcode, name, is_html, title, content, message_transport_type, lang) VALUES ('ill', 'ILL_REQUEST_CANCEL', '', 'ILL request cancelled', 0, "Interlibrary loan request cancelled", "The patron for interlibrary loans request [% illrequest.illrequest_id %], with the following details, has requested cancellation of this ILL request:\n\n[% ill_full_metadata %]", 'sms', 'default'); | );
23325     $dbh->do( q| INSERT IGNORE INTO letter(module, code, branchcode, name, is_html, title, content, message_transport_type, lang) VALUES ('ill', 'ILL_REQUEST_MODIFIED', '', 'ILL request modified', 0, "Interlibrary loan request modified", "The patron for interlibrary loans request [% illrequest.illrequest_id %], with the following details, has modified this ILL request:\n\n[% ill_full_metadata %]", 'sms', 'default'); | );
23326     $dbh->do( q| INSERT IGNORE INTO letter(module, code, branchcode, name, is_html, title, content, message_transport_type, lang) VALUES ('ill', 'ILL_PARTNER_REQ', '', 'ILL request to partners', 0, "Interlibrary loan request to partners", "Dear Sir/Madam,\n\nWe would like to request an interlibrary loan for a title matching the following description:\n\n[% ill_full_metadata %]\n\nPlease let us know if you are able to supply this to us.\n\nKind Regards\n\n[% branch.branchname %]\n[% branch.branchaddress1 %]\n[% branch.branchaddress2 %]\n[% branch.branchaddress3 %]\n[% branch.branchcity %]\n[% branch.branchstate %]\n[% branch.branchzip %]\n[% branch.branchphone %]\n[% branch.branchillemail %]\n[% branch.branchemail %]", 'sms', 'default'); | );
23327     # Add patron messaging preferences
23328     $dbh->do( q| INSERT IGNORE INTO message_attributes (message_name, takes_days) VALUES ('Ill_ready', 0); | );
23329     my $ready_id = $dbh->last_insert_id(undef, undef, 'message_attributes', undef);
23330     if (defined $ready_id) {
23331         $dbh->do( qq(INSERT IGNORE INTO message_transports (message_attribute_id, message_transport_type, is_digest, letter_module, letter_code) VALUES ($ready_id, 'email', 0, 'ill', 'ILL_PICKUP_READY');) );
23332         $dbh->do( qq(INSERT IGNORE INTO message_transports (message_attribute_id, message_transport_type, is_digest, letter_module, letter_code) VALUES ($ready_id, 'sms', 0, 'ill', 'ILL_PICKUP_READY');) );
23333         $dbh->do( qq(INSERT IGNORE INTO message_transports (message_attribute_id, message_transport_type, is_digest, letter_module, letter_code) VALUES ($ready_id, 'phone', 0, 'ill', 'ILL_PICKUP_READY');) );
23334     }
23335     $dbh->do( q| INSERT IGNORE INTO message_attributes (message_name, takes_days) VALUES ('Ill_unavailable', 0); | );
23336     my $unavail_id = $dbh->last_insert_id(undef, undef, 'message_attributes', undef);
23337     if (defined $unavail_id) {
23338         $dbh->do( qq(INSERT IGNORE INTO message_transports (message_attribute_id, message_transport_type, is_digest, letter_module, letter_code) VALUES ($unavail_id, 'email', 0, 'ill', 'ILL_REQUEST_UNAVAIL');) );
23339         $dbh->do( qq(INSERT IGNORE INTO message_transports (message_attribute_id, message_transport_type, is_digest, letter_module, letter_code) VALUES ($unavail_id, 'sms', 0, 'ill', 'ILL_REQUEST_UNAVAIL');) );
23340         $dbh->do( qq(INSERT IGNORE INTO message_transports (message_attribute_id, message_transport_type, is_digest, letter_module, letter_code) VALUES ($unavail_id, 'phone', 0, 'ill', 'ILL_REQUEST_UNAVAIL');) );
23341     }
23342
23343     NewVersion( $DBversion, 22818, "Add ILL notices" );
23344 }
23345
23346 $DBversion = '20.06.00.067';
23347 if( CheckVersion( $DBversion ) ) {
23348     $dbh->do(q{
23349         INSERT IGNORE INTO systempreferences ( `variable`, `value`, `options`, `explanation`, `type` ) VALUES
23350         ('OPACHoldsHistory','0','','If ON, enables display of Patron Holds History in OPAC','YesNo')
23351     });
23352
23353     NewVersion( $DBversion, 20936, "Add new system preference OPACHoldsHistory");
23354 }
23355
23356 $DBversion = '20.06.00.068';
23357 if( CheckVersion( $DBversion ) ) {
23358   if( !TableExists( 'import_batch_profiles' ) ) {
23359     $dbh->do(q{
23360       CREATE TABLE `import_batch_profiles` ( -- profile for batches of marc records to be imported
23361         `id` int(11) NOT NULL auto_increment, -- unique identifier and primary key
23362         `name` varchar(100) NOT NULL, -- name of this profile
23363         `matcher_id` int(11) default NULL, -- the id of the match rule used (matchpoints.matcher_id)
23364         `template_id` int(11) default NULL, -- the id of the marc modification template
23365         `overlay_action` varchar(50) default NULL, -- how to handle duplicate records
23366         `nomatch_action` varchar(50) default NULL, -- how to handle records where no match is found
23367         `item_action` varchar(50) default NULL, -- what to do with item records
23368         `parse_items` tinyint(1) default NULL, -- should items be parsed
23369         `record_type` varchar(50) default NULL, -- type of record in the batch
23370         `encoding` varchar(50) default NULL, -- file encoding
23371         `format` varchar(50) default NULL, -- marc format
23372         `comments` LONGTEXT, -- any comments added when the file was uploaded
23373         PRIMARY KEY (`id`),
23374         UNIQUE KEY `u_import_batch_profiles__name` (`name`)
23375       ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
23376     });
23377   }
23378
23379   if(!column_exists('import_batches', 'profile_id')) {
23380     $dbh->do(q{
23381       ALTER TABLE import_batches ADD COLUMN `profile_id` int(11) default NULL AFTER comments
23382     });
23383
23384     $dbh->do(q{
23385       ALTER TABLE import_batches ADD CONSTRAINT `import_batches_ibfk_1` FOREIGN KEY (`profile_id`) REFERENCES `import_batch_profiles` (`id`) ON DELETE SET NULL ON UPDATE SET NULL
23386     });
23387   }
23388
23389   NewVersion( $DBversion, 23019, "Add import_batch_profiles table and profile_id column in import_batches" );
23390 }
23391
23392 $DBversion = '20.06.00.069';
23393 if( CheckVersion( $DBversion ) ) {
23394     my ($count) = $dbh->selectrow_array(
23395         q|
23396             SELECT COUNT(*)
23397             FROM circulation_rules
23398             WHERE rule_name = 'unseen_renewals_allowed'
23399         |
23400     );
23401     if ($count == 0) {
23402         $dbh->do( q|
23403             INSERT INTO circulation_rules (rule_name, rule_value)
23404             VALUES ('unseen_renewals_allowed', '')
23405         | );
23406     }
23407
23408     if( !column_exists( 'issues', 'unseen_renewals' ) ) {
23409         $dbh->do( q| ALTER TABLE issues ADD unseen_renewals TINYINT(4) DEFAULT 0 NOT NULL AFTER renewals | );
23410     }
23411     if( !column_exists( 'old_issues', 'unseen_renewals' ) ) {
23412         $dbh->do( q| ALTER TABLE old_issues ADD unseen_renewals TINYINT(4) DEFAULT 0 NOT NULL AFTER renewals | );
23413     }
23414
23415     $dbh->do( q| INSERT IGNORE INTO systempreferences (variable, value, explanation, options, type) VALUES ('UnseenRenewals', '0', 'If enabled, a renewal can be recorded as "unseen" by the library and count against the borrowers unseen renewals limit', '', 'YesNo'); | );
23416
23417     NewVersion( $DBversion, 24083, ["Add circulation_rules 'unseen_renewals_allowed'", "Add issues.unseen_renewals & old_issues.unseen_renewals)", "Add new system preference UnseenRenewals"] );
23418 }
23419
23420 $DBversion = '20.11.00.000';
23421 if( CheckVersion( $DBversion ) ) {
23422     NewVersion( $DBversion, "", "Koha 20.11.00 release" );
23423 }
23424
23425 $DBversion = '20.12.00.000';
23426 if( CheckVersion( $DBversion ) ) {
23427     NewVersion( $DBversion, "", "Sorry, this is my first life, I am still learning!" );
23428 }
23429
23430 $DBversion = '20.12.00.001';
23431 if( CheckVersion( $DBversion ) ) {
23432     $dbh->do(q{
23433         INSERT IGNORE INTO systempreferences ( `variable`, `value`, `options`, `explanation`, `type` ) VALUES
23434        ('ElasticsearchCrossFields', '1', '', 'Enable "cross_fields" option for searches using Elastic search.', 'YesNo')
23435     });
23436     NewVersion( $DBversion, 27252, "Add ElasticsearchCrossFields system preference");
23437 }
23438
23439 $DBversion = '20.12.00.002';
23440 if( CheckVersion( $DBversion ) ) {
23441     $dbh->do(q{UPDATE systempreferences SET `type` = 'Choice' WHERE `variable` = 'UsageStatsCountry'});
23442     NewVersion( $DBversion, 27351, "Set type for UsageStatsCountry to Choice");
23443 }
23444
23445 $DBversion = '20.12.00.003';
23446 if( CheckVersion( $DBversion ) ) {
23447     $dbh->do(q{UPDATE systempreferences SET `type` = 'Choice' WHERE `variable` = 'Mana'});
23448     NewVersion( $DBversion, 27349, "Update type for Mana system preference to Choice");
23449 }
23450
23451 $DBversion = '20.12.00.004';
23452 if( CheckVersion( $DBversion ) ) {
23453     $dbh->do(q{UPDATE systempreferences set variable="TaxRates" WHERE variable="gist"});
23454     NewVersion( $DBversion, 27485, "Rename system preference 'gist' to 'TaxRates'");
23455 }
23456
23457 $DBversion = '20.12.00.005';
23458 if( CheckVersion( $DBversion ) ) {
23459     $dbh->do(q{UPDATE systempreferences set variable="OPACLanguages" WHERE variable="opaclanguages"});
23460     NewVersion( $DBversion, 27491, "Rename system preference 'opaclanguages' to 'OPACLanguages'");
23461 }
23462
23463 $DBversion = '20.12.00.006';
23464 if( CheckVersion( $DBversion ) ) {
23465     $dbh->do(q{UPDATE systempreferences SET variable="OPACComments" WHERE variable="reviewson" });
23466     NewVersion( $DBversion, 27487, "Rename system preference 'reviewson' to 'OPACComments");
23467 }
23468
23469 $DBversion = '20.12.00.007';
23470 if( CheckVersion( $DBversion ) ) {
23471     $dbh->do(q{UPDATE systempreferences set variable="CSVDelimiter" WHERE variable="delimiter"});
23472     NewVersion( $DBversion, 27486, "Renaming system preference 'delimiter' to 'CSVDelimiter'");
23473 }
23474
23475 $DBversion = '20.12.00.008';
23476 if( CheckVersion( $DBversion ) ) {
23477     $dbh->do(q{
23478         UPDATE systempreferences
23479         SET options = "claim_returned|batchmod|moredetail|cronjob|additem|pendingreserves|onpayment"
23480         WHERE variable = "MarkLostItemsAsReturned";
23481     });
23482     NewVersion( $DBversion, 25552, "Add missing Claims Returned option to MarkLostItemsAsReturned");
23483 }
23484
23485 $DBversion = '20.12.00.009';
23486 if( CheckVersion( $DBversion ) ) {
23487     $dbh->do( "UPDATE systempreferences SET variable = 'UseICUStyleQUotes' WHERE variable = 'UseICU'" );
23488     NewVersion( $DBversion, 27581, "Rename system preference 'UseICU' to 'UseICUStyleQuotes'");
23489 }
23490
23491 $DBversion = '20.12.00.010';
23492 if( CheckVersion( $DBversion ) ) {
23493     $dbh->do( q{
23494         DELETE FROM systempreferences WHERE variable="OpacGroupResults"
23495     });
23496
23497     NewVersion( $DBversion, 20410, "Remove OpacGroupResults");
23498 }
23499
23500 $DBversion = '20.12.00.011';
23501 if ( CheckVersion($DBversion) ) {
23502     $dbh->do( q{
23503         INSERT IGNORE INTO systempreferences (variable,value,explanation,options,type)
23504         VALUES
23505         ('OPACShibOnly','0','If ON enables shibboleth only authentication for the opac','','YesNo'),
23506         ('staffShibOnly','0','If ON enables shibboleth only authentication for the staff client','','YesNo')
23507     } );
23508     NewVersion( $DBversion, 18506, "Add OPACShibOnly and staffShibOnly system preferences" );
23509 }
23510
23511 $DBversion = '20.12.00.012';
23512 if( CheckVersion( $DBversion ) ) {
23513     my $category_exists = $dbh->selectrow_array("SELECT count(category_name) FROM authorised_value_categories WHERE category_name='UPLOAD'");
23514     my $description;
23515     if( $category_exists ){
23516         $description = "The UPLOAD authorized value category exists. Update the 'is_system' value to 1.";
23517         $dbh->do( "UPDATE authorised_value_categories SET is_system = 1 WHERE category_name = 'UPLOAD'" );
23518     } else {
23519         $description = "The UPLOAD authorized value category does not exist. Create it.";
23520         $dbh->do( "INSERT IGNORE INTO authorised_value_categories (category_name, is_system) VALUES ('UPLOAD', 1)" );
23521     }
23522
23523     NewVersion( $DBversion, 27598, ["Add UPLOAD as a built-in system authorized value category", $description] );
23524 }
23525
23526 $DBversion = '20.12.00.013';
23527 if( CheckVersion( $DBversion ) ) {
23528     $dbh->do(q{
23529          INSERT IGNORE INTO systempreferences
23530          (variable, value, explanation, options, type) VALUES
23531          ('DefaultSaveRecordFileID', 'biblionumber', 'Defines whether the advanced cataloging editor will use the bibliographic record number or control number field to populate the name of the save file.', 'biblionumber|controlnumber', 'Choice')
23532     });
23533     NewVersion( $DBversion, 24108, "Add system preference DefaultSaveRecordFileID");
23534 }
23535
23536 $DBversion = '20.12.00.014';
23537 if( CheckVersion( $DBversion ) ) {
23538
23539     sanitize_zero_date('aqorders', 'datecancellationprinted');
23540     sanitize_zero_date('old_issues', 'returndate');
23541
23542     NewVersion( $DBversion, 7806, "Remove remaining possible 0000-00-00 values");
23543 }
23544
23545 $DBversion = '20.12.00.015';
23546 if( CheckVersion( $DBversion ) ) {
23547     $dbh->do( "UPDATE search_marc_to_field SET sort = 1 WHERE sort IS NULL" );
23548     $dbh->do( "ALTER TABLE search_marc_to_field MODIFY COLUMN sort tinyint(1) DEFAULT 1 NOT NULL COMMENT 'Sort defaults to 1 (Yes) and creates sort fields in the index, 0 (no) will prevent this'" );
23549     NewVersion( $DBversion, 27316, "In Elastisearch mappings convert NULL (Undef) for sort to 1 (Yes)");
23550 }
23551
23552 $DBversion = '20.12.00.016';
23553 if( CheckVersion( $DBversion ) ) {
23554
23555     unless ( column_exists( 'marc_subfield_structure', 'display_order' ) ) {
23556         $dbh->do(q{
23557             ALTER TABLE marc_subfield_structure
23558             ADD COLUMN display_order INT(2) NOT NULL DEFAULT 0 AFTER maxlength
23559         });
23560     }
23561
23562     unless ( column_exists( 'auth_subfield_structure', 'display_order' ) ) {
23563         $dbh->do(q{
23564             ALTER TABLE auth_subfield_structure
23565             ADD COLUMN display_order INT(2) NOT NULL DEFAULT 0 AFTER defaultvalue
23566         });
23567     }
23568
23569     NewVersion( $DBversion, 8976, "Allow setting a default sequence of subfields in cataloguing editor" );
23570 }
23571
23572 $DBversion = '20.12.00.017';
23573 if( CheckVersion( $DBversion ) ) {
23574     $dbh->do(q|
23575         INSERT IGNORE INTO systempreferences (variable,value,explanation,options,type)
23576         VALUES ('CheckPrevCheckoutDelay','0', 'Maximum number of days that will trigger a warning if the patron has borrowed that item in the past when CheckPrevCheckout is enabled. Disabled if 0 or empty.', NULL, 'free')
23577     |);
23578
23579     NewVersion( $DBversion, 26937, "Add CheckPrevCheckoutDelay system preference)" );
23580 }
23581
23582 $DBversion = '20.12.00.018';
23583 if( CheckVersion( $DBversion ) ) {
23584
23585     $dbh->do(q|
23586         UPDATE items
23587         LEFT JOIN issues ON issues.itemnumber=items.itemnumber
23588         SET items.onloan=CAST(issues.date_due AS DATE)
23589         WHERE items.onloan IS NULL AND issues.issue_id IS NOT NULL
23590     |);
23591
23592     NewVersion( $DBversion, 27808, "Adjust items.onloan if needed" );
23593 }
23594
23595 $DBversion = '20.12.00.019';
23596 if( CheckVersion( $DBversion ) ) {
23597
23598     if( !column_exists( 'branchtransfers', 'datecancelled' ) ) {
23599         $dbh->do(q|
23600             ALTER TABLE `branchtransfers`
23601             ADD COLUMN `datecancelled` datetime default NULL AFTER `datearrived`
23602         |);
23603     }
23604
23605     if( !column_exists( 'branchtransfers', 'cancellation_reason' ) ) {
23606         $dbh->do(q|
23607             ALTER TABLE `branchtransfers`
23608             ADD COLUMN `cancellation_reason` ENUM('Manual', 'StockrotationAdvance', 'StockrotationRepatriation', 'ReturnToHome', 'ReturnToHolding', 'RotatingCollection', 'Reserve', 'LostReserve', 'CancelReserve') DEFAULT NULL AFTER `reason`
23609         |);
23610     }
23611
23612     NewVersion( $DBversion, 26057, "Add datecancelled field to branchtransfers");
23613 }
23614
23615 $DBversion = '20.12.00.020';
23616 if ( CheckVersion($DBversion) ) {
23617
23618     # Update daterequested from datesent for stockrotation
23619     $dbh->do(q|
23620             UPDATE `branchtransfers`
23621             SET
23622               `daterequested` = `datesent`,
23623               `datesent` = NULL
23624             WHERE `reason` LIKE 'Stockrotation%'
23625             AND   `datearrived` IS NULL
23626     |);
23627
23628     NewVersion( $DBversion, 24446, "Update stockrotation 'daterequested' field in transfers table" );
23629 }
23630
23631 $DBversion = '20.12.00.021';
23632 if( CheckVersion( $DBversion ) ) {
23633     $dbh->do(q{
23634         UPDATE systempreferences SET type="Free" WHERE variable="OverDriveClientSecret" OR variable="RecordedBooksClientSecret"
23635     });
23636     $dbh->do(q{
23637         UPDATE systempreferences SET type="integer" WHERE variable="UsageStats"
23638     });
23639     $dbh->do(q{
23640         UPDATE systempreferences
23641         SET value="0"
23642         WHERE ( ( type = "YesNo" AND ( value NOT IN ( "1", "0" ) OR value IS NULL ) ) )
23643     });
23644
23645     NewVersion( $DBversion, 22824, "Update syspref values for YesNo");
23646 }
23647
23648 $DBversion = '20.12.00.022';
23649 if( CheckVersion( $DBversion ) ) {
23650     $dbh->do(q{ INSERT IGNORE INTO letter (module, code, branchcode, name, is_html, title, content, message_transport_type) VALUES
23651         ('circulation','CHECKINSLIP','','Checkin slip',1,'Checkin slip',
23652 "<h3>[% branch.branchname %]</h3>
23653 Checked in items for [% borrower.title %] [% borrower.firstname %] [% borrower.initials %] [% borrower.surname %] <br />
23654 ([% borrower.cardnumber %]) <br />
23655
23656 [% today | $KohaDates %]<br />
23657
23658 <h4>Checked in today</h4>
23659 [% FOREACH checkin IN old_checkouts %]
23660 [% SET item = checkin.item %]
23661 <p>
23662 [% item.biblio.title %] <br />
23663 Barcode: [% item.barcode %] <br />
23664 </p>
23665 [% END %]",
23666         'print')
23667     });
23668
23669     NewVersion( $DBversion, 12224, "Add CHECKINSLIP notice" );
23670 }
23671
23672 $DBversion = '20.12.00.023';
23673 if( CheckVersion( $DBversion ) ) {
23674
23675     $dbh->do(q{
23676         UPDATE systempreferences
23677         SET value=REPLACE(value, '|', ',')
23678         WHERE variable="OPACHoldsIfAvailableAtPickupExceptions"
23679            OR variable="BatchCheckoutsValidCategories"
23680     });
23681     NewVersion( $DBversion, 27652, "Separate values for OPACHoldsIfAvailableAtPickupExceptions and BatchCheckoutsValidCategories with comma");
23682 }
23683
23684 $DBversion = '20.12.00.024';
23685 if( CheckVersion( $DBversion ) ) {
23686
23687     $dbh->do( q{
23688         INSERT IGNORE INTO letter (module, code, name, title, content, message_transport_type) VALUES ('circulation', 'AUTO_RENEWALS_DGST', 'Notification on auto renewals', 'Auto renewals (Digest)',
23689         "Dear [% borrower.firstname %] [% borrower.surname %],
23690         [% IF error %]
23691             There were [% error %] items that were not renewed.
23692         [% END %]
23693         [% IF success %]
23694             There were [% success %] items that were renewed.
23695         [% END %]
23696         [% FOREACH checkout IN checkouts %]
23697             [% checkout.item.biblio.title %] : [% checkout.item.barcode %]
23698             [% IF !checkout.auto_renew_error %]
23699                 was renewed until [% checkout.date_due | $KohaDates as_due_date => 1%]
23700             [% ELSIF checkout.auto_renew_error == 'too_many' %]
23701                 You have reached the maximum number of checkouts possible.
23702             [% ELSIF checkout.auto_renew_error == 'on_reserve' %]
23703                 This item is on hold for another patron.
23704             [% ELSIF checkout.auto_renew_error == 'restriction' %]
23705                 You are currently restricted.
23706             [% ELSIF checkout.auto_renew_error == 'overdue' %]
23707                 You have overdue items.
23708             [% ELSIF checkout.auto_renew_error == 'auto_too_late' %]
23709                 It's too late to renew this item.
23710             [% ELSIF checkout.auto_renew_error == 'auto_too_much_oweing' %]
23711                 Your total unpaid fines are too high.
23712             [% ELSIF checkout.auto_renew_error == 'too_unseen' %]
23713                 This item must be renewed at the library.
23714             [% END %]
23715         [% END %]
23716         ", 'email');
23717     });
23718
23719     $dbh->do( q{
23720         INSERT IGNORE INTO `message_attributes`
23721             (`message_attribute_id`, message_name, `takes_days`)
23722         VALUES (9, 'Auto_Renewals', 0)
23723     });
23724
23725     $dbh->do( q{
23726         INSERT IGNORE INTO `message_transports`
23727             (`message_attribute_id`, `message_transport_type`, `is_digest`, `letter_module`, `letter_code`)
23728         VALUES  (9, 'email', 0, 'circulation', 'AUTO_RENEWALS'),
23729                 (9, 'sms', 0, 'circulation', 'AUTO_RENEWALS'),
23730                 (9, 'email', 1, 'circulation', 'AUTO_RENEWALS_DGST'),
23731                 (9, 'sms', 1, 'circulation', 'AUTO_RENEWALS_DGST')
23732     });
23733
23734      $dbh->do(q{
23735          INSERT IGNORE INTO systempreferences (variable,value,explanation,options,type)
23736          VALUES ('AutoRenewalNotices','cron','cron|preferences|never','How should Koha determine whether to end autorenewal notices','Choice')
23737      });
23738
23739     NewVersion( $DBversion, 18532, 'Messaging preferences for auto renewals' );
23740 }
23741
23742 $DBversion = '20.12.00.025';
23743 if( CheckVersion( $DBversion ) ) {
23744
23745     $dbh->do(q|
23746         INSERT IGNORE INTO systempreferences (variable,value,options,explanation,type)
23747         VALUES ('ChargeFinesOnClosedDays', '0', NULL, 'Charge fines on days the library is closed.', 'YesNo')
23748     |);
23749
23750     NewVersion( $DBversion, 27835, "Add new system preference ChargeFinesOnClosedDays");
23751 }
23752
23753 $DBversion = '20.12.00.026';
23754 if( CheckVersion( $DBversion ) ) {
23755
23756     $dbh->do(q{INSERT IGNORE INTO systempreferences (variable,value,options,explanation,type) VALUES ('DefaultHoldExpirationdate','0','','Automatically set default expiration date for holds','YesNo') });
23757     $dbh->do(q{INSERT IGNORE INTO systempreferences (variable,value,options,explanation,type) VALUES ('DefaultHoldExpirationdatePeriod','0','','How long into the future default expiration date is set to be.','integer') });
23758     $dbh->do(q{INSERT IGNORE INTO systempreferences (variable,value,options,explanation,type) VALUES ('DefaultHoldExpirationdateUnitOfTime','days','days|months|years','Which unit of time is used when setting the default expiration date. ','choice') });
23759
23760     NewVersion( $DBversion, 26498, "Bug 26498 - Add option to set a default expire date for holds at reservation time");
23761 }
23762
23763 $DBversion = '20.12.00.027';
23764 if( CheckVersion( $DBversion ) ) {
23765
23766     $dbh->do(q{
23767         UPDATE circulation_rules
23768         SET
23769             rule_value = CASE
23770                 WHEN rule_value='0' THEN 'not_allowed'
23771                 WHEN rule_value='1' THEN 'from_home_library'
23772                 WHEN rule_value='2' THEN 'from_any_library'
23773                 WHEN rule_value='3' THEN 'from_local_hold_group'
23774             END
23775         WHERE rule_name='holdallowed' AND rule_value >= 0 AND rule_value <= 3;
23776     });
23777
23778     NewVersion( $DBversion, 27069, "Change holdallowed values from numbers to strings");
23779 }
23780
23781 $DBversion = '20.12.00.028';
23782 if ( CheckVersion($DBversion) ) {
23783
23784     if ( !column_exists( 'letter', 'id' ) ) {
23785         $dbh->do(q{
23786             ALTER TABLE letter DROP PRIMARY KEY
23787         });
23788         $dbh->do(q{
23789             ALTER TABLE letter ADD COLUMN `id` int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY FIRST
23790         });
23791         $dbh->do(q{
23792             ALTER TABLE letter ADD UNIQUE KEY letter_uniq_1 (`module`,`code`,`branchcode`,`message_transport_type`,`lang`)
23793         });
23794     }
23795
23796     $dbh->do(q{
23797         INSERT IGNORE INTO systempreferences (variable, value, explanation, options, type)
23798         VALUES ('NoticesLog','0',NULL,'If enabled, log changes to notice templates','YesNo')
23799     });
23800
23801     NewVersion( $DBversion, 14233, "Add id field to letter table" );
23802 }
23803
23804 $DBversion = '20.12.00.029';
23805 if( CheckVersion( $DBversion ) ) {
23806     $dbh->do("ALTER TABLE problem_reports MODIFY content TEXT NOT NULL");
23807
23808     NewVersion( $DBversion, 27726, "Increase field size for problem_reports.content");
23809 }
23810
23811 $DBversion = '20.12.00.030';
23812 if( CheckVersion( $DBversion ) ) {
23813     $dbh->do(q|
23814         INSERT IGNORE INTO systempreferences ( `variable`, `value`, `options`, `explanation`, `type` )
23815         VALUES ('LockExpiredDelay','','','Delay for locking expired patrons (empty means no locking)','Integer')
23816     |);
23817
23818     NewVersion( $DBversion, 21549, "Add new system preference LockExpiredDelay");
23819 }
23820
23821 $DBversion = '20.12.00.031';
23822 if( CheckVersion( $DBversion ) ) {
23823     $dbh->do(q{
23824         INSERT IGNORE INTO systempreferences (variable, value, explanation, options, type)
23825         VALUES ('Reference_NFL_Statuses','1|2',NULL,'Contains not for loan statuses considered as available for reference','Free')
23826     });
23827
23828     NewVersion( $DBversion, 21260, "Add new system preference Reference_NFL_Statuses");
23829 }
23830
23831 $DBversion = '20.12.00.032';
23832 if( CheckVersion( $DBversion ) ) {
23833     $dbh->do(q{
23834         INSERT IGNORE INTO letter
23835         (module,code,branchcode,name,is_html,title,content,message_transport_type,lang)
23836         VALUES ('reserves','HOLD_REMINDER','','Waiting hold reminder',0,'You have waiting holds.','Dear [% borrower.firstname %] [% borrower.surname %],\r\n\r\nThe following holds are waiting at [% branch.branchname %]:\r\n\\r\n[% FOREACH hold IN holds %]\r\n    [% hold.biblio.title %] : waiting since [% hold.waitingdate | $KohaDates %]\r\n[% END %]','email','default')
23837     });
23838
23839     NewVersion( $DBversion, 15986, "Add sample HOLD_REMINDER notice");
23840 }
23841
23842 $DBversion = '20.12.00.033';
23843 if( CheckVersion( $DBversion ) ) {
23844     my $debar = $dbh->selectall_arrayref(q|
23845         SELECT d.borrowernumber, GROUP_CONCAT(comment SEPARATOR '\n') AS comment
23846         FROM borrower_debarments d
23847         LEFT JOIN borrowers b ON b.borrowernumber=d.borrowernumber
23848         WHERE ( b.debarredcomment IS NULL OR b.debarredcomment = "" ) AND ( expiration > CURRENT_DATE() OR expiration IS NULL )
23849         GROUP BY d.borrowernumber
23850     |, { Slice => {} });
23851
23852
23853     my $update_sth = $dbh->prepare(q|
23854         UPDATE borrowers
23855         SET debarredcomment=?
23856         WHERE borrowernumber=?
23857     |);
23858     for my $d ( @$debar ) {
23859         $update_sth->execute($d->{comment}, $d->{borrowernumber});
23860     }
23861
23862     NewVersion( $DBversion, 26940, "Put in sync borrowers.debarredcomment with comments from borrower_debarments");
23863 }
23864
23865 $DBversion = '20.12.00.034';
23866 if( CheckVersion( $DBversion ) ) {
23867
23868     $dbh->do(q{
23869         INSERT IGNORE INTO systempreferences (variable, value, options, explanation, type)
23870         VALUES ('casServerVersion', '2', '2|3', 'Version of the CAS server Koha will connect to.', 'Choice');
23871     });
23872
23873     NewVersion( $DBversion, 20854, "Add new system preference casServerVersion");
23874 }
23875
23876 $DBversion = '20.12.00.035';
23877 if( CheckVersion( $DBversion ) ) {
23878     if( !column_exists( 'itemtypes', 'automatic_checkin' ) ) {
23879         $dbh->do(q{
23880             ALTER TABLE itemtypes
23881                 ADD COLUMN `automatic_checkin` tinyint(1) NOT NULL DEFAULT 0 COMMENT 'If automatic checkin is enabled for items of this type' AFTER `searchcategory`
23882         });
23883     }
23884
23885     NewVersion( $DBversion, 23207, "Add automatic_checkin to itemtypes table");
23886 }
23887
23888 $DBversion = '20.12.00.036';
23889 if( CheckVersion( $DBversion ) ) {
23890     $dbh->do(q{
23891         ALTER TABLE club_holds_to_patron_holds
23892         MODIFY COLUMN error_code
23893         ENUM ( 'damaged', 'ageRestricted', 'itemAlreadyOnHold',
23894             'tooManyHoldsForThisRecord', 'tooManyReservesToday',
23895             'tooManyReserves', 'notReservable', 'cannotReserveFromOtherBranches',
23896             'libraryNotFound', 'libraryNotPickupLocation', 'cannotBeTransferred',
23897             'noReservesAllowed'
23898         )
23899     });
23900
23901     NewVersion( $DBversion, 16787, "Add noReservesAllowed to club holds error codes");
23902 }
23903
23904 $DBversion = '20.12.00.037';
23905 if( CheckVersion( $DBversion ) ) {
23906     $dbh->do( q{
23907         INSERT IGNORE INTO systempreferences (variable, value, explanation, options, type)
23908         VALUES ('AcquisitionLog', '0', 'If enabled, log acquisition activity', '', 'YesNo');
23909     });
23910
23911     NewVersion( $DBversion, 23971, "Add new system preference AcquisitionLog");
23912 }
23913
23914 $DBversion = '20.12.00.038';
23915 if( CheckVersion( $DBversion ) ) {
23916
23917     # Add 'ItemLost' to reserves cancellation_reason enum
23918     $dbh->do(
23919         q{
23920             ALTER TABLE
23921                 `branchtransfers`
23922             MODIFY COLUMN
23923                 `cancellation_reason` enum(
23924                     'Manual',
23925                     'StockrotationAdvance',
23926                     'StockrotationRepatriation',
23927                     'ReturnToHome',
23928                     'ReturnToHolding',
23929                     'RotatingCollection',
23930                     'Reserve',
23931                     'LostReserve',
23932                     'CancelReserve',
23933                     'ItemLost'
23934                 )
23935             AFTER `comments`
23936           }
23937     );
23938
23939     NewVersion( $DBversion, 27281, "Add 'ItemLost' to branchtransfers.cancellation_reason enum");
23940 }
23941
23942 $DBversion = '20.12.00.039';
23943 if( CheckVersion( $DBversion ) ) {
23944
23945     $dbh->do(
23946         q{
23947             ALTER TABLE
23948                 `branchtransfers`
23949             MODIFY COLUMN
23950                 `reason` enum(
23951                     'Manual',
23952                     'StockrotationAdvance',
23953                     'StockrotationRepatriation',
23954                     'ReturnToHome',
23955                     'ReturnToHolding',
23956                     'RotatingCollection',
23957                     'Reserve',
23958                     'LostReserve',
23959                     'CancelReserve',
23960                     'TransferCancellation'
23961                 )
23962             AFTER `comments`
23963           }
23964     );
23965
23966     NewVersion( $DBversion, 12362, "Add 'TransferCancellation' to branchtransfers.reason enum");
23967 }
23968
23969 $DBversion = '20.12.00.040';
23970 if( CheckVersion( $DBversion ) ) {
23971     $dbh->do(
23972         q{
23973             INSERT IGNORE INTO account_debit_types (
23974               code,
23975               description,
23976               can_be_invoiced,
23977               can_be_sold,
23978               default_amount,
23979               is_system
23980             )
23981             VALUES
23982               ('VOID', 'Credit has been voided', 0, 0, NULL, 1)
23983         }
23984     );
23985
23986     $dbh->do(q{
23987         INSERT IGNORE INTO account_offset_types ( type ) VALUES ('VOID');
23988     });
23989
23990     NewVersion( $DBversion, 27971, "Add VOID debit type code");
23991 }
23992
23993 $DBversion = '20.12.00.041';
23994 if ( CheckVersion($DBversion) ) {
23995
23996     # ACCOUNT_CREDIT UPDATES
23997     # backup existing notice to action_logs
23998     my $credit_arr = $dbh->selectall_arrayref(q{SELECT lang FROM letter WHERE code = 'ACCOUNT_CREDIT'}, { Slice => {} });
23999     my $c_sth = $dbh->prepare(q{
24000       INSERT INTO action_logs ( timestamp, module, action, object, info, interface )
24001       SELECT NOW(), 'NOTICES', 'UPGRADE', id, content, 'cli'
24002       FROM letter
24003       WHERE lang = ? AND code = 'ACCOUNT_CREDIT'
24004     });
24005
24006     for my $c ( @{$credit_arr} ) {
24007         $c_sth->execute( $c->{lang} );
24008     }
24009
24010     # replace notice with default
24011     my $c_notice = q{
24012 [% USE Price %]
24013 [% PROCESS 'accounts.inc' %]
24014 <table>
24015 [% IF ( LibraryName ) %]
24016  <tr>
24017     <th colspan="4" class="centerednames">
24018         <h3>[% LibraryName | html %]</h3>
24019     </th>
24020  </tr>
24021 [% END %]
24022  <tr>
24023     <th colspan="4" class="centerednames">
24024         <h2><u>Fee receipt</u></h2>
24025     </th>
24026  </tr>
24027  <tr>
24028     <th colspan="4" class="centerednames">
24029         <h2>[% Branches.GetName( credit.patron.branchcode ) | html %]</h2>
24030     </th>
24031  </tr>
24032  <tr>
24033     <th colspan="4">
24034         Received with thanks from  [% credit.patron.firstname | html %] [% credit.patron.surname | html %] <br />
24035         Card number: [% credit.patron.cardnumber | html %]<br />
24036     </th>
24037  </tr>
24038   <tr>
24039     <th>Date</th>
24040     <th>Description of charges</th>
24041     <th>Note</th>
24042     <th>Amount</th>
24043  </tr>
24044
24045  <tr class="highlight">
24046     <td>[% credit.date | $KohaDates %]</td>
24047     <td>
24048       [% PROCESS account_type_description account=credit %]
24049       [%- IF credit.description %], [% credit.description | html %][% END %]
24050     </td>
24051     <td>[% credit.note | html %]</td>
24052     <td class="credit">[% credit.amount | $Price %]</td>
24053  </tr>
24054
24055 <tfoot>
24056   <tr>
24057     <td colspan="3">Total outstanding dues as on date: </td>
24058     [% IF ( credit.patron.account.balance >= 0 ) %]<td class="credit">[% ELSE %]<td class="debit">[% END %][% credit.patron.account.balance | $Price %]</td>
24059   </tr>
24060 </tfoot>
24061 </table>
24062     };
24063
24064     $dbh->do(q{UPDATE letter SET content = ?, is_html = 1 WHERE code = 'ACCOUNT_CREDIT'}, undef, $c_notice);
24065
24066     # ACCOUNT_DEBIT UPDATES
24067     # backup existing notice to action_logs
24068     my $debit_arr = $dbh->selectall_arrayref(
24069         "SELECT lang FROM letter WHERE code = 'ACCOUNT_DEBIT'", { Slice => {} });
24070     my $d_sth = $dbh->prepare(q{
24071       INSERT INTO action_logs ( timestamp, module, action, object, info, interface )
24072       SELECT NOW(), 'NOTICES', 'UPGRADE', id, content, 'cli'
24073       FROM letter
24074       WHERE lang = ? AND code = 'ACCOUNT_DEBIT'
24075     });
24076
24077     for my $d ( @{$debit_arr} ) {
24078         $d_sth->execute( $d->{lang} );
24079     }
24080
24081     # replace notice with default
24082     my $d_notice = q{
24083 [% USE Price %]
24084 [% PROCESS 'accounts.inc' %]
24085 <table>
24086   [% IF ( LibraryName ) %]
24087     <tr>
24088       <th colspan="5" class="centerednames">
24089         <h3>[% LibraryName | html %]</h3>
24090       </th>
24091     </tr>
24092   [% END %]
24093
24094   <tr>
24095     <th colspan="5" class="centerednames">
24096       <h2><u>INVOICE</u></h2>
24097     </th>
24098   </tr>
24099   <tr>
24100     <th colspan="5" class="centerednames">
24101       <h2>[% Branches.GetName( debit.patron.branchcode ) | html %]</h2>
24102     </th>
24103   </tr>
24104   <tr>
24105     <th colspan="5" >
24106       Bill to: [% debit.patron.firstname | html %] [% debit.patron.surname | html %] <br />
24107       Card number: [% debit.patron.cardnumber | html %]<br />
24108     </th>
24109   </tr>
24110   <tr>
24111     <th>Date</th>
24112     <th>Description of charges</th>
24113     <th>Note</th>
24114     <th style="text-align:right;">Amount</th>
24115     <th style="text-align:right;">Amount outstanding</th>
24116   </tr>
24117
24118   <tr class="highlight">
24119     <td>[% debit.date | $KohaDates%]</td>
24120     <td>
24121       [% PROCESS account_type_description account=debit %]
24122       [%- IF debit.description %], [% debit.description | html %][% END %]
24123     </td>
24124     <td>[% debit.note | html %]</td>
24125     <td class="debit">[% debit.amount | $Price %]</td>
24126     <td class="debit">[% debit.amountoutstanding | $Price %]</td>
24127   </tr>
24128
24129   [% IF ( tendered ) %]
24130     <tr>
24131       <td colspan="3">Amount tendered: </td>
24132       <td>[% tendered | $Price %]</td>
24133     </tr>
24134     <tr>
24135       <td colspan="3">Change given: </td>
24136       <td>[% change | $Price %]</td>
24137     </tr>
24138   [% END %]
24139
24140   <tfoot>
24141     <tr>
24142       <td colspan="4">Total outstanding dues as on date: </td>
24143       [% IF ( debit.patron.account.balance <= 0 ) %]<td class="credit">[% ELSE %]<td class="debit">[% END %][% debit.patron.account.balance | $Price %]</td>
24144     </tr>
24145   </tfoot>
24146 </table>
24147     };
24148     $dbh->do(q{UPDATE letter SET content = ?, is_html = 1 WHERE code = 'ACCOUNT_DEBIT'}, undef, $d_notice);
24149
24150     NewVersion( $DBversion, 26734, ["Update notices to use defaults", "WARNING - ACCOUNT_DEBIT and ACCOUNT_CREDIT slip templates have been replaced. Backups have been made to the action logs for your reference."] );
24151 }
24152
24153 $DBversion = '20.12.00.042';
24154 if( CheckVersion( $DBversion ) ) {
24155     unless( foreign_key_exists( 'collections_tracking', 'collectionst_ibfk_1' ) ) {
24156         $dbh->do(q{
24157             DELETE FROM collections_tracking WHERE colId NOT IN ( SELECT colId FROM collections )
24158         });
24159         $dbh->do(q{
24160             ALTER TABLE collections_tracking
24161             ADD CONSTRAINT `collectionst_ibfk_1` FOREIGN KEY (`colId`) REFERENCES `collections` (`colId`) ON DELETE CASCADE ON UPDATE CASCADE
24162         });
24163     }
24164
24165     NewVersion( $DBversion, 17202, "Add FK constraint for collection to collections_tracking");
24166 }
24167
24168 $DBversion = '20.12.00.043';
24169 if( CheckVersion( $DBversion ) ) {
24170     $dbh->do(q{
24171         UPDATE letter SET
24172         content = REPLACE(content, "The following item, [% biblio.title %], has correctly been renewed and is now due on [% checkout.date_due as_due_date => 1 %]" , "The following item, [% biblio.title %], has correctly been renewed and is now due on [% checkout.date_due | $KohaDates as_due_date => 1 %]")
24173         WHERE code = 'AUTO_RENEWALS';
24174     });
24175
24176     NewVersion( $DBversion, 28258, "Update AUTO_RENEWAL content");
24177 }
24178
24179 $DBversion = '20.12.00.044';
24180 if( CheckVersion( $DBversion ) ) {
24181     $dbh->do(q{
24182         UPDATE language_subtag_registry SET description = 'Ukrainian' WHERE subtag='uk' and type='language' and description='Ukranian'
24183     });
24184     $dbh->do(q{
24185         UPDATE language_descriptions SET description = 'Ukrainian' WHERE subtag='uk' and type='language' and lang='en' and description='Ukranian'
24186     });
24187
24188     NewVersion( $DBversion, 28244, "Fix Ukrainian typo in English");
24189 }
24190
24191 $DBversion = '20.12.00.045';
24192 if( CheckVersion( $DBversion ) ) {
24193     $dbh->do(q{
24194         INSERT IGNORE INTO systempreferences (variable, value, options, explanation, type) VALUES ('SearchLimitLibrary', 'both', 'homebranch|holdingbranch|both', "When limiting search results with a library or library group, use the item's home library, or holding library, or both.", 'Choice')
24195     });
24196
24197     NewVersion( $DBversion, 21249, "Adding new system preference SearchLimitLibrary" );
24198 }
24199
24200 $DBversion = '20.12.00.046';
24201 if( CheckVersion( $DBversion ) ) {
24202     unless ( column_exists('message_queue', 'delivery_note') ) {
24203         $dbh->do(q{
24204             ALTER TABLE message_queue ADD delivery_note mediumtext AFTER content_type
24205         });
24206     }
24207
24208     NewVersion( $DBversion, 14723, "Additional delivery notes to messages" );
24209 }
24210
24211 $DBversion = '20.12.00.047';
24212 if( CheckVersion( $DBversion ) ) {
24213
24214     $dbh->do(q{
24215         DELETE FROM systempreferences
24216         WHERE variable IN
24217             ('EnablePayPalOpacPayments',
24218              'PayPalChargeDescription',
24219              'PayPalPwd',
24220              'PayPalReturnURL',
24221              'PayPalSandboxMode',
24222              'PayPalSignature',
24223              'PayPalUser');
24224     });
24225
24226     NewVersion( $DBversion, 23215, "Remove core PayPal support in favor of the use of plugins" );
24227 }
24228
24229 $DBversion = '20.12.00.048';
24230 if( CheckVersion( $DBversion ) ) {
24231
24232     # This DB upgrade has been commented out because it removes
24233     # actively used data, the relationship columns will be added back
24234
24235     # if ( column_exists( 'borrowers', 'relationship' ) ) {
24236     #     $dbh->do(q{
24237     #         ALTER TABLE borrowers DROP COLUMN relationship
24238     #     });
24239     # }
24240
24241     # if ( column_exists( 'deletedborrowers', 'relationship' ) ) {
24242     #     $dbh->do(q{
24243     #         ALTER TABLE deletedborrowers DROP COLUMN relationship
24244     #     });
24245     # }
24246
24247     # if ( column_exists( 'borrower_modifications', 'relationship' ) ) {
24248     #     $dbh->do(q{
24249     #         ALTER TABLE borrower_modifications DROP COLUMN relationship
24250     #     });
24251     # }
24252
24253     NewVersion( $DBversion, 26995, "[SKIP] Drop column relationship from borrower tables [not executed]");
24254 }
24255
24256 $DBversion = '20.12.00.049';
24257 if ( CheckVersion($DBversion) ) {
24258     $dbh->do(q{
24259         UPDATE action_logs SET module = 'CLAIMS'
24260         WHERE module = 'ACQUISITIONS' AND ( action = 'SERIAL CLAIM' OR action = 'ACQUISITION CLAIM')
24261     });
24262
24263     $dbh->do(q{
24264         UPDATE systempreferences SET variable = 'ClaimsLog' WHERE variable = 'LetterLog';
24265     });
24266
24267     NewVersion( $DBversion, 28108, "Move action logs 'SERIAL CLAIM' and 'ACQUISITION CLAIM' to a new 'CLAIMS' module" );
24268 }
24269
24270 $DBversion = '20.12.00.050';
24271 if ( CheckVersion($DBversion) ) {
24272     $dbh->do(q{
24273         INSERT IGNORE INTO systempreferences (variable, value, options, explanation, type) VALUES
24274         ('OpacHiddenItemsHidesRecord','1','','Hide bibliographic record when all its items are hidden because of OpacHiddenItems','YesNo')
24275     });
24276
24277     NewVersion( $DBversion, 28108, "Add new systempreference OpacHiddenItemsHidesRecord" );
24278 }
24279
24280 $DBversion = '21.05.00.000';
24281 if( CheckVersion( $DBversion ) ) {
24282     NewVersion( $DBversion, "", "Koha 21.05.00 release" );
24283 }
24284
24285 unless ( $ENV{HTTP_HOST} ) { # Is that correct?
24286     my $files = get_db_entries;
24287     my $report = update( $files, { force => $force } );
24288
24289     for my $s ( @{ $report->{success} } ) {
24290         say Encode::encode_utf8(join "\n", @{$s->{output}});
24291     }
24292     for my $e ( @{ $report->{error} } ) {
24293         say Encode::encode_utf8(join "\n", @{$e->{output}});
24294         say Encode::encode_utf8("ERROR - " . $e->{error});
24295     }
24296
24297     my $atomic_update_files = get_atomic_updates;
24298     $report = run_atomic_updates($atomic_update_files);
24299     for my $s ( @{ $report->{success} } ) {
24300         say Encode::encode_utf8(join "\n", @{$s->{output}});
24301     }
24302     for my $e ( @{ $report->{error} } ) {
24303         say Encode::encode_utf8(join "\n", @{$e->{output}});
24304         say Encode::encode_utf8("ERROR - " . $e->{error});
24305     }
24306
24307
24308 }
24309
24310 exit;