%PDF- %PDF-
Direktori : /var/www/projetos/suporte.iigd.com.br.old/install/migrations/ |
Current File : /var/www/projetos/suporte.iigd.com.br.old/install/migrations/update_9.1.x_to_9.2.0.php |
<?php /** * --------------------------------------------------------------------- * * GLPI - Gestionnaire Libre de Parc Informatique * * http://glpi-project.org * * @copyright 2015-2022 Teclib' and contributors. * @copyright 2003-2014 by the INDEPNET Development Team. * @licence https://www.gnu.org/licenses/gpl-3.0.html * * --------------------------------------------------------------------- * * LICENSE * * This file is part of GLPI. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <https://www.gnu.org/licenses/>. * * --------------------------------------------------------------------- */ /** * Update from 9.1 to 9.2 * * @return bool for success (will die for most error) **/ function update91xto920() { global $DB, $migration; $current_config = Config::getConfigurationValues('core'); $updateresult = true; $ADDTODISPLAYPREF = []; //TRANS: %s is the number of new version $migration->displayTitle(sprintf(__('Update to %s'), '9.2')); $migration->setVersion('9.2'); // add business criticity $migration->addField("glpi_infocoms", "businesscriticities_id", "integer"); $migration->migrationOneTable('glpi_infocoms'); $migration->addKey("glpi_infocoms", "businesscriticities_id"); if (!$DB->tableExists("glpi_businesscriticities")) { $query = "CREATE TABLE `glpi_businesscriticities` ( `id` int NOT NULL AUTO_INCREMENT, `name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, `entities_id` int NOT NULL DEFAULT '0', `is_recursive` tinyint NOT NULL DEFAULT '0', `comment` text COLLATE utf8_unicode_ci, `date_mod` datetime DEFAULT NULL, `date_creation` datetime DEFAULT NULL, `businesscriticities_id` int NOT NULL DEFAULT '0', `completename` text COLLATE utf8_unicode_ci, `level` int NOT NULL DEFAULT '0', `ancestors_cache` longtext COLLATE utf8_unicode_ci, `sons_cache` longtext COLLATE utf8_unicode_ci, PRIMARY KEY (`id`), KEY `name` (`name`), KEY `unicity` (`businesscriticities_id`,`name`), KEY `date_mod` (`date_mod`), KEY `date_creation` (`date_creation`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci"; $DB->queryOrDie($query, "Add business criticity table"); } // Issue #1250 - Add decimal to monitor size $migration->changeField('glpi_monitors', 'size', 'size', 'DECIMAL(5,2) NOT NULL DEFAULT "0"'); //Make software license type a tree dropdown $migration->addField("glpi_softwarelicensetypes", "softwarelicensetypes_id", "integer"); $migration->addField("glpi_softwarelicensetypes", "level", "integer"); $migration->addField("glpi_softwarelicensetypes", "ancestors_cache", "longtext"); $migration->addField("glpi_softwarelicensetypes", "sons_cache", "longtext"); $migration->addField("glpi_softwarelicensetypes", "entities_id", "integer"); $migration->addField("glpi_softwarelicensetypes", "is_recursive", "bool"); $tree = $migration->addField("glpi_softwarelicensetypes", "completename", "text"); $migration->migrationOneTable('glpi_softwarelicensetypes'); $migration->addKey("glpi_softwarelicensetypes", "softwarelicensetypes_id"); //First time the dropdown is changed from CommonDropdown to CommonTreeDropdown if ($tree) { $DB->updateOrDie( "glpi_softwarelicensetypes", [ 'completename' => new \QueryExpression(DBmysql::quoteName("name")), 'is_recursive' => "1" ], [true], "9.2 make glpi_softwarelicensetypes a tree dropdown" ); } // give READ right on components to profiles having UPDATE right $DB->updateOrDie( "glpi_profilerights", [ 'rights' => new \QueryExpression($DB->quoteName("rights") . " | " . READ) ], [ new \QueryExpression(DBmysql::quoteName("rights") . " & " . DBmysql::quoteValue(UPDATE)), 'name' => "device" ], "grant READ right on components to profiles having UPDATE right" ); $migration->displayMessage(sprintf(__('Add of - %s to database'), 'Knowbase item link to tickets')); if (!$DB->tableExists('glpi_knowbaseitems_items')) { $query = "CREATE TABLE `glpi_knowbaseitems_items` ( `id` int NOT NULL AUTO_INCREMENT, `knowbaseitems_id` int NOT NULL, `itemtype` varchar(100) COLLATE utf8_unicode_ci NOT NULL, `items_id` int NOT NULL DEFAULT '0', `date_creation` datetime DEFAULT NULL, `date_mod` datetime DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `unicity` (`itemtype`,`items_id`,`knowbaseitems_id`), KEY `itemtype` (`itemtype`), KEY `item_id` (`items_id`), KEY `item` (`itemtype`,`items_id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci"; $DB->queryOrDie($query, "9.2 add table glpi_knowbaseitems_items"); } $migration->displayMessage(sprintf(__('Add of - %s to database'), 'Knowbase item revisions')); if (!$DB->tableExists('glpi_knowbaseitems_revisions')) { $query = "CREATE TABLE `glpi_knowbaseitems_revisions` ( `id` int NOT NULL AUTO_INCREMENT, `knowbaseitems_id` int NOT NULL, `revision` int NOT NULL, `name` text COLLATE utf8_unicode_ci, `answer` longtext COLLATE utf8_unicode_ci, `language` varchar(5) COLLATE utf8_unicode_ci DEFAULT NULL, `users_id` int NOT NULL DEFAULT '0', `date_creation` datetime DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `unicity` (`knowbaseitems_id`, `revision`, `language`), KEY `revision` (`revision`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci"; $DB->queryOrDie($query, "9.2 add table glpi_knowbaseitems_revisions"); } $migration->addField("glpi_knowbaseitemtranslations", "users_id", "integer"); $migration->migrationOneTable("glpi_knowbaseitemtranslations"); $migration->addKey("glpi_knowbaseitemtranslations", "users_id"); //set kb translations users... $knowitems_iterator = $DB->request([ 'SELECT' => ['glpi_knowbaseitems.id', 'glpi_knowbaseitems.users_id'], 'FROM' => 'glpi_knowbaseitems', 'INNER JOIN' => [ "glpi_knowbaseitemtranslations" => [ 'FKEY' => [ 'glpi_knowbaseitemtranslations' => 'knowbaseitems_id', 'glpi_knowbaseitems' => 'id' ] ] ] ]); foreach ($knowitems_iterator as $knowitems) { $DB->updateOrDie( "glpi_knowbaseitemtranslations", ['users_id' => $knowitems['users_id']], ['knowbaseitems_id' => $knowitems['id']], "Set knowledge base translations users" ); } $migration->addField("glpi_knowbaseitemtranslations", "date_mod", "DATETIME"); $migration->addField("glpi_knowbaseitemtranslations", "date_creation", "DATETIME"); $migration->displayMessage(sprintf(__('Add of - %s to database'), 'Knowbase item comments')); if (!$DB->tableExists('glpi_knowbaseitems_comments')) { $query = "CREATE TABLE `glpi_knowbaseitems_comments` ( `id` int NOT NULL AUTO_INCREMENT, `knowbaseitems_id` int NOT NULL, `users_id` int NOT NULL DEFAULT '0', `language` varchar(5) COLLATE utf8_unicode_ci DEFAULT NULL, `comment` text COLLATE utf8_unicode_ci NOT NULL, `parent_comment_id` int DEFAULT NULL, `date_creation` datetime DEFAULT NULL, `date_mod` datetime DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci"; $DB->queryOrDie($query, "9.2 add table glpi_knowbaseitems_comments"); } $DB->updateOrDie( "glpi_profilerights", [ 'rights' => new \QueryExpression( DBmysql::quoteName("rights") . " | " . DBmysql::quoteValue(KnowbaseItem::COMMENTS) ) ], ['name' => "knowbase"], "9.2 update knowledge base with comment right" ); // add kb category to task categories $migration->addField("glpi_taskcategories", "knowbaseitemcategories_id", "integer"); $migration->migrationOneTable("glpi_taskcategories"); $migration->addKey("glpi_taskcategories", "knowbaseitemcategories_id"); // #1476 - Add users_id on glpi_documents_items $migration->addField("glpi_documents_items", "users_id", "integer", ['null' => true]); $migration->migrationOneTable("glpi_documents_items"); $migration->addKey("glpi_documents_items", "users_id"); // TODO : can be improved when DBmysql->buildUpdate() support joins $migration->addPostQuery( "UPDATE `glpi_documents_items`, `glpi_documents` SET `glpi_documents_items`.`users_id` = `glpi_documents`.`users_id` WHERE `glpi_documents_items`.`documents_id` = `glpi_documents`.`id`", "9.2 update set users_id on glpi_documents_items" ); //add product number $product_types = ['Computer', 'Printer', 'NetworkEquipment', 'Phone', 'Peripheral', 'Monitor' ]; foreach ($product_types as $type) { if (class_exists($type . 'Model')) { $table = getTableForItemType($type . 'Model'); $migration->addField($table, 'product_number', 'string', ['after' => 'comment']); $migration->migrationOneTable($table); $migration->addKey($table, 'product_number'); } } // add fields on every item_device tables $tables = ['glpi_items_devicecases', 'glpi_items_devicecontrols', 'glpi_items_devicedrives', 'glpi_items_devicegraphiccards', 'glpi_items_deviceharddrives', 'glpi_items_devicememories', 'glpi_items_devicemotherboards', 'glpi_items_devicenetworkcards', 'glpi_items_devicepcis', 'glpi_items_devicepowersupplies', 'glpi_items_deviceprocessors', 'glpi_items_devicesoundcards' ]; //add serial, location and state on each devices items foreach ($tables as $table) { $migration->addField($table, "otherserial", "varchar(255) NULL DEFAULT NULL"); $migration->addField($table, "locations_id", "int NOT NULL DEFAULT '0'"); $migration->addField($table, "states_id", "int NOT NULL DEFAULT '0'"); $migration->migrationOneTable($table); $migration->addKey($table, 'otherserial'); $migration->addKey($table, 'locations_id'); $migration->addKey($table, 'states_id'); } // Create tables : $tables = ['glpi_devicecasemodels', 'glpi_devicecontrolmodels', 'glpi_devicedrivemodels', 'glpi_devicegraphiccardmodels', 'glpi_deviceharddrivemodels', 'glpi_devicememorymodels', 'glpi_devicemotherboardmodels', 'glpi_devicenetworkcardmodels', 'glpi_devicepcimodels', 'glpi_devicepowersupplymodels', 'glpi_deviceprocessormodels', 'glpi_devicesoundcardmodels', 'glpi_devicegenericmodels', 'glpi_devicebatterymodels', 'glpi_devicefirmwaremodels', 'glpi_devicesensormodels' ]; foreach ($tables as $table) { if (!$DB->tableExists($table)) { $query = "CREATE TABLE `$table` ( `id` INT NOT NULL AUTO_INCREMENT, `name` VARCHAR(255) NULL DEFAULT NULL COLLATE 'utf8_unicode_ci', `comment` TEXT NULL COLLATE 'utf8_unicode_ci', `product_number` VARCHAR(255) NULL DEFAULT NULL COLLATE 'utf8_unicode_ci', PRIMARY KEY (`id`), INDEX `name` (`name`), INDEX `product_number` (`product_number`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci"; $DB->queryOrDie($query, "9.2 add model tables for devices"); } } // Add a field in glpi_device* tables : $tables = ['glpi_devicecases' => 'devicecasemodels_id', 'glpi_devicecontrols' => 'devicecontrolmodels_id', 'glpi_devicedrives' => 'devicedrivemodels_id', 'glpi_devicegraphiccards' => 'devicegraphiccardmodels_id', 'glpi_deviceharddrives' => 'deviceharddrivemodels_id', 'glpi_devicememories' => 'devicememorymodels_id', 'glpi_devicemotherboards' => 'devicemotherboardmodels_id', 'glpi_devicenetworkcards' => 'devicenetworkcardmodels_id', 'glpi_devicepcis' => 'devicepcimodels_id', 'glpi_devicepowersupplies' => 'devicepowersupplymodels_id', 'glpi_deviceprocessors' => 'deviceprocessormodels_id', 'glpi_devicesoundcards' => 'devicesoundcardmodels_id' ]; foreach ($tables as $table => $field) { $migration->addField($table, $field, 'int DEFAULT NULL', ['after' => 'is_recursive']); $migration->migrationOneTable($table); $migration->addKey($table, $field); } if (!$DB->tableExists('glpi_devicegenerics')) { $query = "CREATE TABLE `glpi_devicegenerics` ( `id` int NOT NULL AUTO_INCREMENT, `designation` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, `devicegenerictypes_id` int NOT NULL DEFAULT '0', `comment` text COLLATE utf8_unicode_ci, `manufacturers_id` int NOT NULL DEFAULT '0', `entities_id` int NOT NULL DEFAULT '0', `is_recursive` tinyint NOT NULL DEFAULT '0', `locations_id` int NOT NULL DEFAULT '0', `states_id` int NOT NULL DEFAULT '0', `devicegenericmodels_id` int DEFAULT NULL, `date_mod` datetime DEFAULT NULL, `date_creation` datetime DEFAULT NULL, PRIMARY KEY (`id`), KEY `designation` (`designation`), KEY `manufacturers_id` (`manufacturers_id`), KEY `devicegenerictypes_id` (`devicegenerictypes_id`), KEY `entities_id` (`entities_id`), KEY `is_recursive` (`is_recursive`), KEY `locations_id` (`locations_id`), KEY `states_id` (`states_id`), KEY `date_mod` (`date_mod`), KEY `date_creation` (`date_creation`), KEY `devicegenericmodels_id` (`devicegenericmodels_id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci"; $DB->queryOrDie($query, "9.2 add table glpi_devicegenerics"); } if (!$DB->tableExists('glpi_items_devicegenerics')) { $query = "CREATE TABLE `glpi_items_devicegenerics` ( `id` INT NOT NULL AUTO_INCREMENT, `items_id` INT NOT NULL DEFAULT '0', `itemtype` VARCHAR(255) NULL DEFAULT NULL COLLATE 'utf8_unicode_ci', `devicegenerics_id` INT NOT NULL DEFAULT '0', `is_deleted` TINYINT NOT NULL DEFAULT '0', `is_dynamic` TINYINT NOT NULL DEFAULT '0', `entities_id` INT NOT NULL DEFAULT '0', `is_recursive` TINYINT NOT NULL DEFAULT '0', `serial` VARCHAR(255) NULL DEFAULT NULL COLLATE 'utf8_unicode_ci', `otherserial` VARCHAR(255) NULL DEFAULT NULL COLLATE 'utf8_unicode_ci', `locations_id` INT NOT NULL DEFAULT '0', `states_id` INT NOT NULL DEFAULT '0', PRIMARY KEY (`id`), INDEX `computers_id` (`items_id`), INDEX `devicegenerics_id` (`devicegenerics_id`), INDEX `is_deleted` (`is_deleted`), INDEX `is_dynamic` (`is_dynamic`), INDEX `entities_id` (`entities_id`), INDEX `is_recursive` (`is_recursive`), INDEX `serial` (`serial`), INDEX `item` (`itemtype`, `items_id`), INDEX `otherserial` (`otherserial`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci"; $DB->queryOrDie($query, "9.2 add table glpi_items_devicegenerics"); } if (!$DB->tableExists('glpi_devicegenerictypes')) { $query = "CREATE TABLE `glpi_devicegenerictypes` ( `id` INT NOT NULL AUTO_INCREMENT, `name` VARCHAR(255) NULL DEFAULT NULL COLLATE 'utf8_unicode_ci', `comment` TEXT NULL COLLATE 'utf8_unicode_ci', PRIMARY KEY (`id`), INDEX `name` (`name`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci"; $DB->queryOrDie($query, "9.2 add table glpi_devicegenerictypes"); } if (!$DB->tableExists('glpi_devicebatteries')) { $query = "CREATE TABLE `glpi_devicebatteries` ( `id` int NOT NULL AUTO_INCREMENT, `designation` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, `comment` text COLLATE utf8_unicode_ci, `manufacturers_id` int NOT NULL DEFAULT '0', `voltage` int DEFAULT NULL, `capacity` int DEFAULT NULL, `devicebatterytypes_id` int NOT NULL DEFAULT '0', `entities_id` int NOT NULL DEFAULT '0', `is_recursive` tinyint NOT NULL DEFAULT '0', `devicebatterymodels_id` int DEFAULT NULL, `date_mod` datetime DEFAULT NULL, `date_creation` datetime DEFAULT NULL, PRIMARY KEY (`id`), KEY `designation` (`designation`), KEY `manufacturers_id` (`manufacturers_id`), KEY `entities_id` (`entities_id`), KEY `is_recursive` (`is_recursive`), KEY `date_mod` (`date_mod`), KEY `date_creation` (`date_creation`), KEY `devicebatterymodels_id` (`devicebatterymodels_id`), KEY `devicebatterytypes_id` (`devicebatterytypes_id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci"; $DB->queryOrDie($query, "9.2 add table glpi_devicebatteries"); } if (!$DB->tableExists('glpi_items_devicebatteries')) { $query = "CREATE TABLE `glpi_items_devicebatteries` ( `id` int NOT NULL AUTO_INCREMENT, `items_id` int NOT NULL DEFAULT '0', `itemtype` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, `devicebatteries_id` int NOT NULL DEFAULT '0', `manufacturing_date` date DEFAULT NULL, `is_deleted` tinyint NOT NULL DEFAULT '0', `is_dynamic` tinyint NOT NULL DEFAULT '0', `entities_id` int NOT NULL DEFAULT '0', `is_recursive` tinyint NOT NULL DEFAULT '0', `serial` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, `otherserial` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, `locations_id` int NOT NULL DEFAULT '0', `states_id` int NOT NULL DEFAULT '0', PRIMARY KEY (`id`), KEY `computers_id` (`items_id`), KEY `devicebatteries_id` (`devicebatteries_id`), KEY `is_deleted` (`is_deleted`), KEY `is_dynamic` (`is_dynamic`), KEY `entities_id` (`entities_id`), KEY `is_recursive` (`is_recursive`), KEY `serial` (`serial`), KEY `item` (`itemtype`,`items_id`), KEY `otherserial` (`otherserial`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci"; $DB->queryOrDie($query, "9.2 add table glpi_items_devicebatteries"); } if (!$DB->tableExists('glpi_devicebatterytypes')) { $query = "CREATE TABLE `glpi_devicebatterytypes` ( `id` int NOT NULL AUTO_INCREMENT, `name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, `comment` text COLLATE utf8_unicode_ci, `date_mod` datetime DEFAULT NULL, `date_creation` datetime DEFAULT NULL, PRIMARY KEY (`id`), KEY `name` (`name`), KEY `date_mod` (`date_mod`), KEY `date_creation` (`date_creation`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci"; $DB->queryOrDie($query, "9.2 add table glpi_devicebatterytypes"); } if (!$DB->tableExists('glpi_devicefirmwares')) { $query = "CREATE TABLE `glpi_devicefirmwares` ( `id` int NOT NULL AUTO_INCREMENT, `designation` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, `comment` text COLLATE utf8_unicode_ci, `manufacturers_id` int NOT NULL DEFAULT '0', `date` date DEFAULT NULL, `version` varchar(255) DEFAULT NULL, `devicefirmwaretypes_id` int NOT NULL DEFAULT '0', `entities_id` int NOT NULL DEFAULT '0', `is_recursive` tinyint NOT NULL DEFAULT '0', `devicefirmwaremodels_id` int DEFAULT NULL, `date_mod` datetime DEFAULT NULL, `date_creation` datetime DEFAULT NULL, PRIMARY KEY (`id`), KEY `designation` (`designation`), KEY `manufacturers_id` (`manufacturers_id`), KEY `entities_id` (`entities_id`), KEY `is_recursive` (`is_recursive`), KEY `date_mod` (`date_mod`), KEY `date_creation` (`date_creation`), KEY `devicefirmwaremodels_id` (`devicefirmwaremodels_id`), KEY `devicefirmwaretypes_id` (`devicefirmwaretypes_id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci"; $DB->queryOrDie($query, "9.2 add table glpi_devicefirmwares"); } if (!$DB->tableExists('glpi_items_devicefirmwares')) { $query = "CREATE TABLE `glpi_items_devicefirmwares` ( `id` int NOT NULL AUTO_INCREMENT, `items_id` int NOT NULL DEFAULT '0', `itemtype` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, `devicefirmwares_id` int NOT NULL DEFAULT '0', `is_deleted` tinyint NOT NULL DEFAULT '0', `is_dynamic` tinyint NOT NULL DEFAULT '0', `entities_id` int NOT NULL DEFAULT '0', `is_recursive` tinyint NOT NULL DEFAULT '0', `serial` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, `otherserial` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, `locations_id` int NOT NULL DEFAULT '0', `states_id` int NOT NULL DEFAULT '0', PRIMARY KEY (`id`), KEY `computers_id` (`items_id`), KEY `devicefirmwares_id` (`devicefirmwares_id`), KEY `is_deleted` (`is_deleted`), KEY `is_dynamic` (`is_dynamic`), KEY `entities_id` (`entities_id`), KEY `is_recursive` (`is_recursive`), KEY `serial` (`serial`), KEY `item` (`itemtype`,`items_id`), KEY `otherserial` (`otherserial`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci"; $DB->queryOrDie($query, "9.2 add table glpi_items_devicefirmwares"); } if (!$DB->tableExists('glpi_devicefirmwaretypes')) { $query = "CREATE TABLE `glpi_devicefirmwaretypes` ( `id` int NOT NULL AUTO_INCREMENT, `name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, `comment` text COLLATE utf8_unicode_ci, `date_mod` datetime DEFAULT NULL, `date_creation` datetime DEFAULT NULL, PRIMARY KEY (`id`), KEY `name` (`name`), KEY `date_mod` (`date_mod`), KEY `date_creation` (`date_creation`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci"; $DB->queryOrDie($query, "9.2 add table glpi_devicefirmwaretypes"); $DB->insertOrDie("glpi_devicefirmwaretypes", [ 'id' => "1", 'name' => "BIOS", 'comment' => null, 'date_mod' => null, 'date_creation' => null ]); $DB->insertOrDie("glpi_devicefirmwaretypes", [ 'id' => "2", 'name' => "UEFI", 'comment' => null, 'date_mod' => null, 'date_creation' => null ]); $DB->insertOrDie("glpi_devicefirmwaretypes", [ 'id' => "3", 'name' => "Firmware", 'comment' => null, 'date_mod' => null, 'date_creation' => null ]); } //Device sensors if (!$DB->tableExists('glpi_devicesensors')) { $query = "CREATE TABLE `glpi_devicesensors` ( `id` int NOT NULL AUTO_INCREMENT, `designation` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, `devicesensortypes_id` int NOT NULL DEFAULT '0', `devicesensormodels_id` int NOT NULL DEFAULT '0', `comment` text COLLATE utf8_unicode_ci, `manufacturers_id` int NOT NULL DEFAULT '0', `entities_id` int NOT NULL DEFAULT '0', `is_recursive` tinyint NOT NULL DEFAULT '0', `locations_id` int NOT NULL DEFAULT '0', `states_id` int NOT NULL DEFAULT '0', `date_mod` datetime DEFAULT NULL, `date_creation` datetime DEFAULT NULL, PRIMARY KEY (`id`), KEY `designation` (`designation`), KEY `manufacturers_id` (`manufacturers_id`), KEY `devicesensortypes_id` (`devicesensortypes_id`), KEY `entities_id` (`entities_id`), KEY `is_recursive` (`is_recursive`), KEY `locations_id` (`locations_id`), KEY `states_id` (`states_id`), KEY `date_mod` (`date_mod`), KEY `date_creation` (`date_creation`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci"; $DB->queryOrDie($query, "9.2 add table glpi_devicesensors"); } if (!$DB->tableExists('glpi_items_devicesensors')) { $query = "CREATE TABLE `glpi_items_devicesensors` ( `id` INT NOT NULL AUTO_INCREMENT, `items_id` INT NOT NULL DEFAULT '0', `itemtype` VARCHAR(255) NULL DEFAULT NULL COLLATE 'utf8_unicode_ci', `devicesensors_id` INT NOT NULL DEFAULT '0', `is_deleted` TINYINT NOT NULL DEFAULT '0', `is_dynamic` TINYINT NOT NULL DEFAULT '0', `entities_id` INT NOT NULL DEFAULT '0', `is_recursive` TINYINT NOT NULL DEFAULT '0', `serial` VARCHAR(255) NULL DEFAULT NULL COLLATE 'utf8_unicode_ci', `otherserial` VARCHAR(255) NULL DEFAULT NULL COLLATE 'utf8_unicode_ci', `locations_id` INT NOT NULL DEFAULT '0', `states_id` INT NOT NULL DEFAULT '0', PRIMARY KEY (`id`), INDEX `computers_id` (`items_id`), INDEX `devicesensors_id` (`devicesensors_id`), INDEX `is_deleted` (`is_deleted`), INDEX `is_dynamic` (`is_dynamic`), INDEX `entities_id` (`entities_id`), INDEX `is_recursive` (`is_recursive`), INDEX `serial` (`serial`), INDEX `item` (`itemtype`, `items_id`), INDEX `otherserial` (`otherserial`) ) COLLATE='utf8_unicode_ci' ENGINE=MyISAM;"; $DB->queryOrDie($query, "9.2 add table glpi_items_devicesensors"); } if (!$DB->tableExists('glpi_devicesensortypes')) { $query = "CREATE TABLE `glpi_devicesensortypes` ( `id` INT NOT NULL AUTO_INCREMENT, `name` VARCHAR(255) NULL DEFAULT NULL COLLATE 'utf8_unicode_ci', `comment` TEXT NULL COLLATE 'utf8_unicode_ci', PRIMARY KEY (`id`), INDEX `name` (`name`) ) COLLATE='utf8_unicode_ci' ENGINE=MyISAM;"; $DB->queryOrDie($query, "9.2 add table glpi_devicesensortypes"); } //Father/son for Software licenses $migration->addField("glpi_softwarelicenses", "softwarelicenses_id", "integer", ['after' => 'softwares_id']); $new = $migration->addField("glpi_softwarelicenses", "completename", "text", ['after' => 'softwarelicenses_id']); $migration->addField("glpi_softwarelicenses", "level", "integer", ['after' => 'completename']); $migration->migrationOneTable("glpi_softwarelicenses"); if ($new) { $DB->updateOrDie( "glpi_softwarelicenses", [ 'completename' => new \QueryExpression(DBmysql::quoteName("name")) ], [true], "9.2 copy name to completename for software licenses" ); } // add template key to itiltasks $migration->addField("glpi_tickettasks", "tasktemplates_id", "integer"); $migration->migrationOneTable('glpi_tickettasks'); $migration->addKey("glpi_tickettasks", "tasktemplates_id"); $migration->addField("glpi_problemtasks", "tasktemplates_id", "integer"); $migration->migrationOneTable('glpi_problemtasks'); $migration->addKey("glpi_problemtasks", "tasktemplates_id"); $migration->addField("glpi_changetasks", "tasktemplates_id", "integer"); $migration->migrationOneTable('glpi_changetasks'); $migration->addKey("glpi_changetasks", "tasktemplates_id"); // add missing fields to tasktemplate $migration->addField("glpi_tasktemplates", "state", "integer"); $migration->addField("glpi_tasktemplates", "is_private", "bool"); $migration->addField("glpi_tasktemplates", "users_id_tech", "integer"); $migration->addField("glpi_tasktemplates", "groups_id_tech", "integer"); $migration->migrationOneTable('glpi_tasktemplates'); $migration->addKey("glpi_tickettasks", "is_private"); $migration->addKey("glpi_tickettasks", "users_id_tech"); $migration->addKey("glpi_tickettasks", "groups_id_tech"); // #1735 - Add new notifications $notification = new Notification(); $notificationtarget = new NotificationTarget(); $new_notifications = [ 'requester_user' => ['label' => 'New user in requesters', 'targets_id' => Notification::AUTHOR ], 'requester_group' => ['label' => 'New group in requesters', 'targets_id' => Notification::REQUESTER_GROUP ], 'observer_user' => ['label' => 'New user in observers', 'targets_id' => Notification::OBSERVER ], 'observer_group' => ['label' => 'New group in observers', 'targets_id' => Notification::OBSERVER_GROUP ], 'assign_user' => ['label' => 'New user in assignees', 'targets_id' => Notification::ASSIGN_TECH ], 'assign_group' => ['label' => 'New group in assignees', 'targets_id' => Notification::ITEM_TECH_GROUP_IN_CHARGE ], 'assign_supplier' => ['label' => 'New supplier in assignees', 'targets_id' => Notification::SUPPLIER ], ]; if ($DB->fieldExists("glpi_notifications", "mode", false)) { $notificationtemplates_id = 0; $notificationtemplate = new NotificationTemplate(); if ($notificationtemplate->getFromDBByCrit(['name' => 'Tickets', 'itemtype' => 'Ticket'])) { $notificationtemplates_id = $notificationtemplate->fields['id']; } foreach ($new_notifications as $event => $notif_options) { $notifications_id = $notification->add([ 'name' => $notif_options['label'], 'itemtype' => 'Ticket', 'event' => $event, 'mode' => Notification_NotificationTemplate::MODE_MAIL, 'notificationtemplates_id' => $notificationtemplates_id, 'is_recursive' => 1, 'is_active' => 0, ]); $notificationtarget->add([ 'items_id' => $notif_options['targets_id'], 'type' => 1, 'notifications_id' => $notifications_id, ]); } } $migration->addField('glpi_states', 'is_visible_certificate', 'bool', ['value' => 1]); $migration->addKey('glpi_states', 'is_visible_certificate'); /** ************ New SLM structure ************ */ if (!$DB->tableExists('glpi_olas')) { $query = "CREATE TABLE `glpi_olas` ( `id` int NOT NULL AUTO_INCREMENT, `name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, `entities_id` int NOT NULL DEFAULT '0', `is_recursive` tinyint NOT NULL DEFAULT '0', `type` int NOT NULL DEFAULT '0', `comment` text COLLATE utf8_unicode_ci, `number_time` int NOT NULL, `calendars_id` int NOT NULL DEFAULT '0', `date_mod` datetime DEFAULT NULL, `definition_time` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, `end_of_working_day` tinyint NOT NULL DEFAULT '0', `date_creation` datetime DEFAULT NULL, `slms_id` int NOT NULL DEFAULT '0', PRIMARY KEY (`id`), KEY `name` (`name`), KEY `calendars_id` (`calendars_id`), KEY `date_mod` (`date_mod`), KEY `date_creation` (`date_creation`), KEY `slms_id` (`slms_id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;"; $DB->queryOrDie($query, "9.2 add table glpi_olas"); } if (!$DB->tableExists('glpi_olalevelactions')) { $query = "CREATE TABLE `glpi_olalevelactions` ( `id` int NOT NULL AUTO_INCREMENT, `olalevels_id` int NOT NULL DEFAULT '0', `action_type` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, `field` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, `value` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, PRIMARY KEY (`id`), KEY `olalevels_id` (`olalevels_id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;"; $DB->queryOrDie($query, "9.2 add table glpi_olalevelactions"); } if (!$DB->tableExists('glpi_olalevelcriterias')) { $query = "CREATE TABLE `glpi_olalevelcriterias` ( `id` int NOT NULL AUTO_INCREMENT, `olalevels_id` int NOT NULL DEFAULT '0', `criteria` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, `condition` int NOT NULL DEFAULT '0' COMMENT 'see define.php PATTERN_* and REGEX_* constant', `pattern` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, PRIMARY KEY (`id`), KEY `olalevels_id` (`olalevels_id`), KEY `condition` (`condition`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;"; $DB->queryOrDie($query, "9.2 add table glpi_olalevelcriterias"); } if (!$DB->tableExists('glpi_olalevels')) { $query = "CREATE TABLE `glpi_olalevels` ( `id` int NOT NULL AUTO_INCREMENT, `name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, `olas_id` int NOT NULL DEFAULT '0', `execution_time` int NOT NULL, `is_active` tinyint NOT NULL DEFAULT '1', `entities_id` int NOT NULL DEFAULT '0', `is_recursive` tinyint NOT NULL DEFAULT '0', `match` char(10) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT 'see define.php *_MATCHING constant', `uuid` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, PRIMARY KEY (`id`), KEY `name` (`name`), KEY `is_active` (`is_active`), KEY `olas_id` (`olas_id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;"; $DB->queryOrDie($query, "9.2 add table glpi_olalevels"); } if (!$DB->tableExists('glpi_olalevels_tickets')) { $query = "CREATE TABLE `glpi_olalevels_tickets` ( `id` int NOT NULL AUTO_INCREMENT, `tickets_id` int NOT NULL DEFAULT '0', `olalevels_id` int NOT NULL DEFAULT '0', `date` datetime DEFAULT NULL, PRIMARY KEY (`id`), KEY `tickets_id` (`tickets_id`), KEY `olalevels_id` (`olalevels_id`), KEY `unicity` (`tickets_id`,`olalevels_id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;"; $DB->queryOrDie($query, "9.2 add table glpi_olalevels_tickets"); $DB->updateOrInsert("glpi_crontasks", [ 'frequency' => "604800", 'param' => null, 'state' => "1", 'mode' => "1", 'allowmode' => "3", 'hourmin' => "0", 'hourmax' => "24", 'logs_lifetime' => "30", 'lastrun' => null, 'lastcode' => null, 'comment' => null ], [ 'itemtype' => "OlaLevel_Ticket", 'name' => "olaticket" ]); } if (!$DB->tableExists('glpi_slms')) { // Changing the structure of the table 'glpi_slas' $migration->renameTable('glpi_slas', 'glpi_slms'); $migration->migrationOneTable('glpi_slas'); } // Changing the structure of the table 'glpi_slts' if ($DB->tableExists('glpi_slts')) { $migration->renameTable('glpi_slts', 'glpi_slas'); $migration->migrationOneTable('glpi_slts'); $migration->changeField('glpi_slas', 'slas_id', 'slms_id', 'integer'); $migration->dropKey('glpi_slas', 'slas_id'); $migration->addKey('glpi_slas', 'slms_id'); } // Slalevels changes if ($DB->fieldExists("glpi_slalevels", "slts_id")) { $migration->changeField('glpi_slalevels', 'slts_id', 'slas_id', 'integer'); $migration->migrationOneTable('glpi_slalevels'); $migration->dropKey('glpi_slalevels', 'slts_id'); $migration->addKey('glpi_slalevels', 'slas_id'); } // Ticket changes if (!$DB->fieldExists("glpi_tickets", "ola_waiting_duration", false)) { $migration->addField( "glpi_tickets", "ola_waiting_duration", "integer", ['after' => 'sla_waiting_duration'] ); $migration->migrationOneTable('glpi_tickets'); } if (!$DB->fieldExists("glpi_tickets", "olas_tto_id", false)) { $migration->addField("glpi_tickets", "olas_tto_id", "integer", ['after' => 'ola_waiting_duration']); $migration->migrationOneTable('glpi_tickets'); $migration->addKey('glpi_tickets', 'olas_tto_id'); } if (!$DB->fieldExists("glpi_tickets", "olas_ttr_id", false)) { $migration->addField("glpi_tickets", "olas_ttr_id", "integer", ['after' => 'olas_tto_id']); $migration->migrationOneTable('glpi_tickets'); $migration->addKey('glpi_tickets', 'olas_ttr_id'); } if (!$DB->fieldExists("glpi_tickets", "ttr_olalevels_id", false)) { $migration->addField("glpi_tickets", "ttr_olalevels_id", "integer", ['after' => 'olas_ttr_id']); $migration->migrationOneTable('glpi_tickets'); } if (!$DB->fieldExists("glpi_tickets", "internal_time_to_resolve", false)) { $migration->addField( "glpi_tickets", "internal_time_to_resolve", "datetime", ['after' => 'ttr_olalevels_id'] ); $migration->migrationOneTable('glpi_tickets'); $migration->addKey('glpi_tickets', 'internal_time_to_resolve'); } if (!$DB->fieldExists("glpi_tickets", "internal_time_to_own", false)) { $migration->addField( "glpi_tickets", "internal_time_to_own", "datetime", ['after' => 'internal_time_to_resolve'] ); $migration->migrationOneTable('glpi_tickets'); $migration->addKey('glpi_tickets', 'internal_time_to_own'); } if ($DB->fieldExists("glpi_tickets", "slts_tto_id")) { $migration->changeField("glpi_tickets", "slts_tto_id", "slas_tto_id", "integer"); $migration->migrationOneTable('glpi_tickets'); $migration->addKey('glpi_tickets', 'slas_tto_id'); $migration->dropKey('glpi_tickets', 'slts_tto_id'); } if ($DB->fieldExists("glpi_tickets", "slts_ttr_id")) { $migration->changeField("glpi_tickets", "slts_ttr_id", "slas_ttr_id", "integer"); $migration->migrationOneTable('glpi_tickets'); $migration->addKey('glpi_tickets', 'slas_ttr_id'); $migration->dropKey('glpi_tickets', 'slts_ttr_id'); } if ($DB->fieldExists("glpi_tickets", "due_date")) { $migration->changeField('glpi_tickets', 'due_date', 'time_to_resolve', 'datetime'); $migration->migrationOneTable('glpi_tickets'); $migration->dropKey('glpi_tickets', 'due_date'); $migration->addKey('glpi_tickets', 'time_to_resolve'); } //Change changes if ($DB->fieldExists("glpi_changes", "due_date")) { $migration->changeField('glpi_changes', 'due_date', 'time_to_resolve', 'datetime'); $migration->migrationOneTable('glpi_changes'); $migration->dropKey('glpi_changes', 'due_date'); $migration->addKey('glpi_changes', 'time_to_resolve'); } //Problem changes if ($DB->fieldExists("glpi_problems", "due_date")) { $migration->changeField('glpi_problems', 'due_date', 'time_to_resolve', 'datetime'); $migration->migrationOneTable('glpi_problems'); $migration->dropKey('glpi_problems', 'due_date'); $migration->addKey('glpi_problems', 'time_to_resolve'); } // ProfileRights changes $DB->updateOrDie( "glpi_profilerights", ['name' => "slm"], ['name' => "sla"], "SLM profilerights migration" ); //Sla rules criterias migration $DB->updateOrDie( "glpi_rulecriterias", ['criteria' => "slas_ttr_id"], ['criteria' => "slts_ttr_id"], "SLA rulecriterias migration" ); $DB->updateOrDie( "glpi_rulecriterias", ['criteria' => "slas_tto_id"], ['criteria' => "slts_tto_id"], "SLA rulecriterias migration" ); // Sla rules actions migration $DB->updateOrDie( "glpi_ruleactions", ['field' => "slas_ttr_id"], ['field' => "slts_ttr_id"], "SLA ruleactions migration" ); $DB->updateOrDie( "glpi_ruleactions", ['field' => "slas_tto_id"], ['field' => "slts_tto_id"], "SLA ruleactions migration" ); /************** Auto login **************/ $migration->addConfig([ 'login_remember_time' => 604800, 'login_remember_default' => 1 ]); if ($DB->tableExists('glpi_bookmarks')) { $migration->renameTable("glpi_bookmarks", "glpi_savedsearches"); $migration->addField("glpi_savedsearches", "last_execution_time", "int NULL DEFAULT NULL"); $migration->addField( "glpi_savedsearches", "do_count", "tinyint NOT NULL DEFAULT '2' COMMENT 'Do or do not count results on list display; see SavedSearch::COUNT_* constants'" ); $migration->addField( "glpi_savedsearches", "last_execution_date", "DATETIME NULL DEFAULT NULL" ); $migration->addField("glpi_savedsearches", "counter", "int NOT NULL DEFAULT '0'"); $migration->migrationOneTable("glpi_savedsearches"); $migration->addKey("glpi_savedsearches", 'last_execution_time'); $migration->addKey("glpi_savedsearches", 'do_count'); $migration->addKey("glpi_savedsearches", 'last_execution_date'); } //ensure do_count is set to AUTO $migration->addPostQuery( $DB->buildUpdate( "glpi_savedsearches", ['do_count' => SavedSearch::COUNT_AUTO], [true] ) ); $migration->addPostQuery( $DB->buildUpdate( "glpi_savedsearches", ['entities_id' => "0"], ['entities_id' => "-1"] ) ); if ( !countElementsInTable( 'glpi_rules', ['sub_type' => 'RuleSoftwareCategory', 'uuid' => '500717c8-2bd6e957-53a12b5fd38869.86003425' ] ) ) { $rule = new Rule(); $rules_id = $rule->add(['name' => 'Import category from inventory tool', 'is_active' => 0, 'uuid' => '500717c8-2bd6e957-53a12b5fd38869.86003425', 'entities_id' => 0, 'is_recursive' => 1, 'sub_type' => 'RuleSoftwareCategory', 'match' => Rule::AND_MATCHING, 'condition' => 1, 'description' => '' ]); if ($rules_id) { $criteria = new RuleCriteria(); $criteria->add(['rules_id' => $rules_id, 'criteria' => 'name', 'condition' => '0', 'pattern' => '*' ]); $action = new RuleAction(); $action->add(['rules_id' => $rules_id, 'action_type' => 'assign', 'field' => '_import_category', 'value' => '1' ]); } } if ($DB->tableExists('glpi_queuedmails')) { $migration->renameTable("glpi_queuedmails", "glpi_queuednotifications"); } $migration->addPostQuery( $DB->buildUpdate( "glpi_crontasks", ['itemtype' => "QueuedNotification"], ['itemtype' => "QueuedMail"] ) ); $migration->addPostQuery( $DB->buildUpdate( "glpi_crontasks", ['name' => "queuednotification"], ['name' => "queuedmail"] ) ); $migration->addPostQuery( $DB->buildUpdate( "glpi_crontasks", ['name' => "queuednotificationclean"], ['name' => "queuedmailclean"] ) ); $migration->addPostQuery( $DB->buildUpdate( "glpi_profilerights", ['name' => "queuednotification"], ['name' => "queuedmail"] ) ); if (isset($current_config['use_mailing']) && !isset($current_config['use_notifications'])) { /** Notifications modes */ $migration->addConfig([ 'use_notifications' => $current_config['use_mailing'], 'notifications_mailing' => $current_config['use_mailing'], 'notifications_ajax' => 0, 'notifications_ajax_check_interval' => '5', 'notifications_ajax_sound' => null, 'notifications_ajax_icon_url' => '/pics/glpi.png' ]); } if (!$DB->tableExists('glpi_notifications_notificationtemplates')) { $query = "CREATE TABLE `glpi_notifications_notificationtemplates` ( `id` int NOT NULL AUTO_INCREMENT, `notifications_id` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, `mode` varchar(20) COLLATE utf8_unicode_ci NOT NULL COMMENT 'See Notification_NotificationTemplate::MODE_* constants', `notificationtemplates_id` int NOT NULL DEFAULT '0', PRIMARY KEY (`id`), UNIQUE KEY `unicity` (`notifications_id`, `mode`, `notificationtemplates_id`), KEY `notifications_id` (`notifications_id`), KEY `notificationtemplates_id` (`notificationtemplates_id`), KEY `mode` (`mode`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci"; $DB->queryOrDie($query, "9.2 add table glpi_notifications_notificationtemplates"); } if ($DB->fieldExists("glpi_notifications", "mode", false)) { // TODO can be done when DB::updateOrInsert() supports SELECT $query = "REPLACE INTO `glpi_notifications_notificationtemplates` (`notifications_id`, `mode`, `notificationtemplates_id`) SELECT `id`, `mode`, `notificationtemplates_id` FROM `glpi_notifications`"; $DB->queryOrDie($query, "9.2 migrate notifications templates"); //migrate any existing mode before removing the field $migration->dropField('glpi_notifications', 'mode'); $migration->dropField('glpi_notifications', 'notificationtemplates_id'); $migration->migrationOneTable("glpi_notifications"); } $migration->addField( 'glpi_queuednotifications', 'mode', 'varchar(20) COLLATE utf8_unicode_ci NOT NULL COMMENT \'See Notification_NotificationTemplate::MODE_* constants\'' ); $migration->migrationOneTable("glpi_queuednotifications"); $migration->addKey('glpi_queuednotifications', 'mode'); $migration->addPostQuery( $DB->buildUpdate( "glpi_queuednotifications", ['mode' => Notification_NotificationTemplate::MODE_MAIL], [true] ), "9.2 set default mode in queue" ); $migration->addPostQuery( $DB->buildUpdate( "glpi_notifications_notificationtemplates", ['mode' => Notification_NotificationTemplate::MODE_MAIL], ['mode' => "mail"] ), "9.2 set default mode in notifications templates" ); // Migration Bookmark -> SavedSearch_Alert //TRANS: %s is the table or item to migrate if ($DB->tableExists('glpi_bookmarks_users')) { $migration->renameTable("glpi_bookmarks_users", "glpi_savedsearches_users"); $migration->changeField( 'glpi_savedsearches_users', 'bookmarks_id', 'savedsearches_id', 'int NOT NULL DEFAULT "0"' ); } if (!$DB->tableExists('glpi_savedsearches_alerts')) { $query = "CREATE TABLE `glpi_savedsearches_alerts` ( `id` int NOT NULL AUTO_INCREMENT, `savedsearches_id` int NOT NULL DEFAULT '0', `name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, `is_active` tinyint NOT NULL DEFAULT '0', `operator` tinyint NOT NULL, `value` int NOT NULL, `date_mod` datetime DEFAULT NULL, `date_creation` datetime DEFAULT NULL, PRIMARY KEY (`id`), KEY `name` (`name`), KEY `is_active` (`is_active`), KEY `date_mod` (`date_mod`), KEY `date_creation` (`date_creation`), UNIQUE KEY `unicity` (`savedsearches_id`,`operator`, `value`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci"; $DB->queryOrDie($query, "9.2 add table glpi_savedsearches_alerts"); } $migration->displayMessage(sprintf(__('Data migration - %s'), 'glpi_displaypreferences')); $ADDTODISPLAYPREF['SavedSearch'] = [8, 9, 3, 10, 11]; foreach ($ADDTODISPLAYPREF as $type => $tab) { $rank = 1; foreach ($tab as $newval) { $DB->updateOrInsert("glpi_displaypreferences", [ 'rank' => $rank++ ], [ 'users_id' => "0", 'itemtype' => $type, 'num' => $newval, ]); } } if (countElementsInTable('glpi_logs') < 2000000) { //add index only if this sounds... possible. $migration->addKey("glpi_logs", "id_search_option"); } else { //Just display a Warning to the user. $migration->displayWarning("An index must be added in the 'id_search_option' field " . "of the 'glpi_logs table'; but your glpi_logs table is " . "too huge. You'll have to add it on your database " . "with the following query:\n" . "'ALTER TABLE glpi_logs ADD INDEX id_search_option(id_search_option);'"); } // count cron task if ( !countElementsInTable( 'glpi_crontasks', ['itemtype' => 'SavedSearch', 'name' => 'countAll'] ) ) { $DB->insertOrDie( "glpi_crontasks", [ 'itemtype' => "SavedSearch", 'name' => "countAll", 'frequency' => "604800", 'param' => null, 'state' => "0", 'mode' => "1", 'allowmode' => "3", 'hourmin' => "0", 'hourmax' => "24", 'logs_lifetime' => "30", 'lastrun' => null, 'lastcode' => null, 'comment' => null ], "9.2 Add countAll SavedSearch cron task" ); }; // alerts cron task if ( !countElementsInTable( 'glpi_crontasks', ['itemtype' => 'SavedSearch_Alert', 'name' => 'savedsearchesalerts'] ) ) { $DB->insertOrDie( "glpi_crontasks", [ 'itemtype' => "SavedSearch_Alert", 'name' => "savedsearchesalerts", 'frequency' => "86400", 'param' => null, 'state' => "0", 'mode' => "1", 'allowmode' => "3", 'hourmin' => "0", 'hourmax' => "24", 'logs_lifetime' => "30", 'lastrun' => null, 'lastcode' => null, 'comment' => null ], "9.2 Add saved searches alerts cron task" ); } if ( !countElementsInTable( 'glpi_notifications', ['itemtype' => 'SavedSearch_Alert'] ) ) { $DB->insertOrDie( "glpi_notifications", [ 'id' => null, 'name' => "Saved searches", 'entities_id' => "0", 'itemtype' => "SavedSearch_Alert", 'event' => "alert", 'comment' => "", 'is_recursive' => "1", 'is_active' => "1", 'date_creation' => new \QueryExpression("NOW()"), 'date_mod' => new \QueryExpression("NOW()") ], "9.2 Add saved search alerts notification" ); $notid = $DB->insertId(); $DB->insertOrDie( "glpi_notificationtemplates", [ 'name' => "Saved searches alerts", 'itemtype' => "SavedSearch_Alert", 'date_mod' => new \QueryExpression("NOW()") ], "9.2 Add saved search alerts notification template" ); $nottid = $DB->insertId(); $where = [ 'notifications_id' => $notid, 'mode' => Notification_NotificationTemplate::MODE_MAIL, 'notificationtemplates_id' => $nottid ]; if (countElementsInTable('glpi_notifications_notificationtemplates', $where)) { $DB->updateOrInsert("glpi_notifications_notificationtemplates", [ 'id' => null ], [ 'notifications_id' => $notid, 'mode' => Notification_NotificationTemplate::MODE_MAIL, 'notificationtemplates_id' => $nottid ]); } $DB->insertOrDie( "glpi_notificationtargets", [ 'id' => null, 'items_id' => "19", 'type' => "1", 'notifications_id' => $notid ], "9.2 Add saved search alerts notification targets" ); $query = "INSERT INTO `glpi_notificationtemplatetranslations` (`notificationtemplates_id`, `language`,`subject`, `content_text`, `content_html`) VALUES ($notid, '', '##savedsearch.action## ##savedsearch.name##', '##savedsearch.type## ###savedsearch.id## - ##savedsearch.name## ##savedsearch.message## ##lang.savedsearch.url## ##savedsearch.url## Regards,', '<table> <tbody> <tr><th colspan=\"2\"><a href=\"##savedsearch.url##\">##savedsearch.type## ###savedsearch.id## - ##savedsearch.name##</a></th></tr> <tr><td colspan=\"2\"><a href=\"##savedsearch.url##\">##savedsearch.message##</a></td></tr> <tr> <td>##lang.savedsearch.url##</td> <td>##savedsearch.url##</td> </tr> </tbody> </table> <p><span style=\"font-size: small;\">Hello <br />Regards,</span></p>')"; $DB->queryOrDie($query, "9.2 add saved searches alerts notification translation"); } // Create a dedicated token for api if (!$DB->fieldExists('glpi_users', 'api_token')) { $migration->addField('glpi_users', 'api_token', 'string', ['after' => 'personal_token_date']); $migration->addField('glpi_users', 'api_token_date', 'datetime', ['after' => 'api_token']); $migration->displayWarning( "Api users tokens has been reset, if you use REST/XMLRPC api with personal token for authentication, please reset your user's token.", true ); } if (!$DB->tableExists('glpi_items_operatingsystems')) { $query = "CREATE TABLE `glpi_items_operatingsystems` ( `id` int NOT NULL AUTO_INCREMENT, `items_id` int NOT NULL DEFAULT '0', `itemtype` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, `operatingsystems_id` int NOT NULL DEFAULT '0', `operatingsystemversions_id` int NOT NULL DEFAULT '0', `operatingsystemservicepacks_id` int NOT NULL DEFAULT '0', `operatingsystemarchitectures_id` int NOT NULL DEFAULT '0', `operatingsystemkernelversions_id` int NOT NULL DEFAULT '0', `license_number` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, `license_id` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, `operatingsystemeditions_id` int NOT NULL DEFAULT '0', `date_mod` datetime DEFAULT NULL, `date_creation` datetime DEFAULT NULL, PRIMARY KEY (`id`), KEY `items_id` (`items_id`), KEY `item` (`itemtype`,`items_id`), KEY `operatingsystems_id` (`operatingsystems_id`), KEY `operatingsystemservicepacks_id` (`operatingsystemservicepacks_id`), KEY `operatingsystemversions_id` (`operatingsystemversions_id`), KEY `operatingsystemarchitectures_id` (`operatingsystemarchitectures_id`), KEY `operatingsystemkernelversions_id` (`operatingsystemkernelversions_id`), KEY `operatingsystemeditions_id` (`operatingsystemeditions_id`), UNIQUE KEY `unicity`(`items_id`,`itemtype`, `operatingsystems_id`, `operatingsystemarchitectures_id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci"; $DB->queryOrDie($query, "9.2 add table glpi_items_operatingsystems"); } if (!$DB->tableExists('glpi_operatingsystemkernels')) { $query = "CREATE TABLE `glpi_operatingsystemkernels` ( `id` int NOT NULL AUTO_INCREMENT, `name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, `comment` text COLLATE utf8_unicode_ci, `date_mod` datetime DEFAULT NULL, `date_creation` datetime DEFAULT NULL, PRIMARY KEY (`id`), KEY `name` (`name`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci"; $DB->queryOrDie($query, "9.2 add table glpi_operatingsystemkernels"); } if (!$DB->tableExists('glpi_operatingsystemkernelversions')) { $query = "CREATE TABLE `glpi_operatingsystemkernelversions` ( `id` int NOT NULL AUTO_INCREMENT, `operatingsystemkernels_id` int NOT NULL DEFAULT '0', `name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, `comment` text COLLATE utf8_unicode_ci, `date_mod` datetime DEFAULT NULL, `date_creation` datetime DEFAULT NULL, PRIMARY KEY (`id`), KEY `name` (`name`), KEY `operatingsystemkernels_id` (`operatingsystemkernels_id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci"; $DB->queryOrDie($query, "9.2 add table glpi_operatingsystemversions"); } if (!$DB->tableExists('glpi_operatingsystemeditions')) { $query = "CREATE TABLE `glpi_operatingsystemeditions` ( `id` int NOT NULL AUTO_INCREMENT, `name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, `comment` text COLLATE utf8_unicode_ci, `date_mod` datetime DEFAULT NULL, `date_creation` datetime DEFAULT NULL, PRIMARY KEY (`id`), KEY `name` (`name`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci"; $DB->queryOrDie($query, "9.2 add table glpi_operatingsystemeditions"); } if ($DB->fieldExists('glpi_computers', 'operatingsystems_id')) { //migrate data from computers table, and drop old fields // TODO can be done when DB::updateOrInsert() supports SELECT $query = "REPLACE INTO `glpi_items_operatingsystems` (`itemtype`, `items_id`, `operatingsystems_id`, `operatingsystemversions_id`, `operatingsystemservicepacks_id`, `operatingsystemarchitectures_id`, `license_number`, `license_id`) SELECT 'Computer', `id`, `operatingsystems_id`, `operatingsystemversions_id`, `operatingsystemservicepacks_id`, `operatingsystemarchitectures_id`, `os_license_number`, `os_licenseid` FROM `glpi_computers` WHERE `operatingsystems_id` != 0 OR `operatingsystemservicepacks_id` != 0 OR `operatingsystemarchitectures_id` != 0 OR `os_license_number` IS NOT NULL OR `os_kernel_version` IS NOT NULL OR `os_licenseid` IS NOT NULL"; $DB->queryOrDie($query, "9.2 migrate main operating system information"); //migrate kernel versions. $kver = new OperatingSystemKernelVersion(); $mapping = []; foreach ( $DB->request(['SELECT' => ['id', 'os_kernel_version'], 'FROM' => 'glpi_computers', 'NOT' => ['os_kernel_version' => null] ]) as $data ) { $key = md5($data['os_kernel_version']); if (!isset($mapping[$key])) { $mapping[$key] = []; } $kver->add(['version' => $DB->escape($data['os_kernel_version'])]); $mapping[$key][$data['id']] = $kver->getID(); } foreach ($mapping as $map) { foreach ($map as $computers_id => $kver_id) { $DB->updateOrDie( "glpi_items_operatingsystems", ['operatingsystemkernelversions_id' => $kver_id], [ 'itemtype' => "Computer", 'items_id' => $computers_id ] ); } } $migration->dropKey('glpi_computers', 'operatingsystems_id'); $migration->dropField('glpi_computers', 'operatingsystems_id'); $migration->dropKey('glpi_computers', 'operatingsystemservicepacks_id'); $migration->dropField('glpi_computers', 'operatingsystemservicepacks_id'); $migration->dropKey('glpi_computers', 'operatingsystemversions_id'); $migration->dropField('glpi_computers', 'operatingsystemversions_id'); $migration->dropKey('glpi_computers', 'operatingsystemarchitectures_id'); $migration->dropField('glpi_computers', 'operatingsystemarchitectures_id'); $migration->dropField('glpi_computers', 'os_license_number'); $migration->dropField('glpi_computers', 'os_licenseid'); $migration->dropField('glpi_computers', 'os_kernel_version'); } if (!$DB->fieldExists('glpi_items_operatingsystems', 'is_deleted')) { $migration->addField( 'glpi_items_operatingsystems', 'is_deleted', "tinyint NOT NULL DEFAULT '0'" ); $migration->addKey('glpi_items_operatingsystems', 'is_deleted'); } if (!$DB->fieldExists('glpi_items_operatingsystems', 'is_dynamic')) { $migration->addField( 'glpi_items_operatingsystems', 'is_dynamic', "tinyint NOT NULL DEFAULT '0'" ); $migration->addKey('glpi_items_operatingsystems', 'is_dynamic'); } if (!$DB->fieldExists('glpi_items_operatingsystems', 'entities_id')) { $migration->addField( 'glpi_items_operatingsystems', 'entities_id', "int NOT NULL DEFAULT '0'" ); $migration->addKey('glpi_items_operatingsystems', 'entities_id'); } //add db version $migration->addConfig(['dbversion' => '9.1.3']); // Add certificates management if (!$DB->tableExists('glpi_certificates')) { $query = "CREATE TABLE `glpi_certificates` ( `id` INT NOT NULL AUTO_INCREMENT, `name` VARCHAR(255) COLLATE utf8_unicode_ci DEFAULT NULL, `serial` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, `otherserial` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, `entities_id` INT NOT NULL DEFAULT '0', `is_recursive` TINYINT NOT NULL DEFAULT '0', `comment` text COLLATE utf8_unicode_ci, `is_deleted` tinyint NOT NULL DEFAULT '0', `is_template` tinyint NOT NULL DEFAULT '0', `template_name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, `certificatetypes_id` INT NOT NULL DEFAULT '0' COMMENT 'RELATION to glpi_certificatetypes (id)', `dns_name` VARCHAR(255) COLLATE utf8_unicode_ci DEFAULT NULL, `dns_suffix` VARCHAR(255) COLLATE utf8_unicode_ci DEFAULT NULL, `users_id_tech` INT NOT NULL DEFAULT '0' COMMENT 'RELATION to glpi_users (id)', `groups_id_tech` INT NOT NULL DEFAULT '0' COMMENT 'RELATION to glpi_groups (id)', `locations_id` INT NOT NULL DEFAULT '0' COMMENT 'RELATION to glpi_locations (id)', `manufacturers_id` INT NOT NULL DEFAULT '0' COMMENT 'RELATION to glpi_manufacturers (id)', `users_id` int NOT NULL DEFAULT '0', `groups_id` int NOT NULL DEFAULT '0', `is_autosign` TINYINT NOT NULL DEFAULT '0', `date_expiration` DATE DEFAULT NULL, `states_id` INT NOT NULL DEFAULT '0' COMMENT 'RELATION to states (id)', `command` TEXT COLLATE utf8_unicode_ci, `certificate_request` TEXT COLLATE utf8_unicode_ci, `certificate_item` TEXT COLLATE utf8_unicode_ci, `date_creation` DATETIME DEFAULT NULL, `date_mod` DATETIME DEFAULT NULL, PRIMARY KEY (`id`), KEY `name` (`name`), KEY `entities_id` (`entities_id`), KEY `is_template` (`is_template`), KEY `is_deleted` (`is_deleted`), KEY `certificatetypes_id` (`certificatetypes_id`), KEY `users_id_tech` (`users_id_tech`), KEY `groups_id_tech` (`groups_id_tech`), KEY `groups_id` (`groups_id`), KEY `users_id` (`users_id`), KEY `locations_id` (`locations_id`), KEY `manufacturers_id` (`manufacturers_id`), KEY `states_id` (`states_id`), KEY `date_creation` (`date_creation`), KEY `date_mod` (`date_mod`) ) ENGINE = MyISAM DEFAULT CHARSET = utf8 COLLATE = utf8_unicode_ci"; $DB->queryOrDie($query, "9.2 copy add certificate table"); } if (!$DB->tableExists('glpi_certificates_items')) { $query = "CREATE TABLE `glpi_certificates_items` ( `id` INT NOT NULL AUTO_INCREMENT, `certificates_id` INT NOT NULL DEFAULT '0', `items_id` INT NOT NULL DEFAULT '0' COMMENT 'RELATION to various tables, according to itemtype (id)', `itemtype` VARCHAR(100) COLLATE utf8_unicode_ci NOT NULL COMMENT 'see .class.php file', `date_creation` DATETIME DEFAULT NULL, `date_mod` DATETIME DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `unicity` (`certificates_id`, `itemtype`, `items_id`), KEY `device` (`items_id`, `itemtype`), KEY `item` (`itemtype`, `items_id`), KEY `date_creation` (`date_creation`), KEY `date_mod` (`date_mod`) ) ENGINE = MyISAM DEFAULT CHARSET = utf8 COLLATE = utf8_unicode_ci"; $DB->queryOrDie($query, "9.2 copy add certificate items table"); } if (!$DB->tableExists('glpi_certificatetypes')) { $query = "CREATE TABLE `glpi_certificatetypes` ( `id` INT NOT NULL AUTO_INCREMENT, `entities_id` INT NOT NULL DEFAULT '0', `is_recursive` TINYINT NOT NULL DEFAULT '0', `name` VARCHAR(255) COLLATE utf8_unicode_ci DEFAULT NULL, `comment` TEXT COLLATE utf8_unicode_ci, `date_creation` DATETIME DEFAULT NULL, `date_mod` DATETIME DEFAULT NULL, PRIMARY KEY (`id`), KEY `entities_id` (`entities_id`), KEY `is_recursive` (`is_recursive`), KEY `name` (`name`), KEY `date_creation` (`date_creation`), KEY `date_mod` (`date_mod`) ) ENGINE = MyISAM DEFAULT CHARSET = utf8 COLLATE = utf8_unicode_ci"; $DB->queryOrDie($query, "9.2 copy add certificate type table"); } if (countElementsInTable("glpi_profilerights", ['name' => 'certificate']) == 0) { //new right for certificate //give full rights to profiles having config right foreach ($DB->request("glpi_profilerights", "`name` = 'config'") as $profrights) { if ($profrights['rights'] && (READ + UPDATE)) { $rightValue = CREATE | READ | UPDATE | DELETE | PURGE | READNOTE | UPDATENOTE | UNLOCK; } else { $rightValue = 0; } $DB->insertOrDie( "glpi_profilerights", [ 'id' => null, 'profiles_id' => $profrights['profiles_id'], 'name' => "certificate", 'rights' => $rightValue, ], "9.2 add right for certificates" ); } } // add alert for certificates $migration->addField( "glpi_entities", 'use_certificates_alert', "integer", ['value' => -2, 'after' => 'send_licenses_alert_before_delay' ] ); $migration->addField( "glpi_entities", 'send_certificates_alert_before_delay', "integer", ['value' => -2, 'after' => 'use_certificates_alert', 'update' => '0', // No delay for root entity 'condition' => 'WHERE `id` = 0' ] ); CronTask::register( 'Certificate', 'certificate', DAY_TIMESTAMP, [ 'comment' => '', 'mode' => CronTask::MODE_INTERNAL ] ); if (!countElementsInTable('glpi_notifications', ['itemtype' => 'Certificate'])) { $DB->insertOrDie( "glpi_notifications", [ 'id' => null, 'name' => "Certificates", 'entities_id' => "0", 'itemtype' => "Certificate", 'event' => "alert", 'comment' => "", 'is_recursive' => "1", 'is_active' => "1", 'date_creation' => new \QueryExpression("NOW()"), 'date_mod' => new \QueryExpression("NOW()") ], "9.2 Add certificate alerts notification" ); $notid = $DB->insertId(); $DB->insertOrDie( "glpi_notificationtemplates", [ 'name' => "Certificates", 'itemtype' => "Certificate", 'date_mod' => new \QueryExpression("NOW()") ], "9.2 Add certifcate alerts notification template" ); $nottid = $DB->insertId(); $where = [ 'notifications_id' => $notid, 'mode' => Notification_NotificationTemplate::MODE_MAIL, 'notificationtemplates_id' => $nottid ]; if (!countElementsInTable('glpi_notifications_notificationtemplates', $where)) { $DB->updateOrInsert("glpi_notifications_notificationtemplates", [ 'id' => null ], [ 'notifications_id' => $notid, 'mode' => Notification_NotificationTemplate::MODE_MAIL, 'notificationtemplates_id' => $nottid, ]); } $query = "INSERT INTO `glpi_notificationtemplatetranslations` (`notificationtemplates_id`, `language`, `subject`, `content_text`, `content_html`) VALUES ($notid, '', '##certificate.action## ##certificate.entity##', '##lang.certificate.entity## : ##certificate.entity## ##FOREACHcertificates## ##lang.certificate.serial## : ##certificate.serial## ##lang.certificate.expirationdate## : ##certificate.expirationdate## ##certificate.url## ##ENDFOREACHcertificates##','<p> ##lang.certificate.entity## : ##certificate.entity##<br /> ##FOREACHcertificates## <br />##lang.certificate.name## : ##certificate.name##<br /> ##lang.certificate.serial## : ##certificate.serial##<br /> ##lang.certificate.expirationdate## : ##certificate.expirationdate## <br /> <a href=\"##certificate.url##\"> ##certificate.url## </a><br /> ##ENDFOREACHcertificates##</p>')"; $DB->queryOrDie($query, "9.2 add certificates alerts notification translation"); $DB->insertOrDie( "glpi_notificationtargets", [ 'id' => null, 'notifications_id' => $notid, 'type' => Notification::USER_TYPE, 'items_id' => Notification::ITEM_TECH_IN_CHARGE ], "9.2 add certificates alerts notification target" ); $DB->insertOrDie( "glpi_notificationtargets", [ 'id' => null, 'notifications_id' => $notid, 'type' => Notification::USER_TYPE, 'items_id' => Notification::ITEM_TECH_GROUP_IN_CHARGE ], "9.2 add certificates alerts notification target" ); } /************** Simcard component **************/ $migration->addField("glpi_states", "is_visible_line", "bool", ["after" => "is_visible_softwarelicense"]); if (!$DB->tableExists('glpi_lineoperators')) { $query = "CREATE TABLE IF NOT EXISTS `glpi_lineoperators` ( `id` int NOT NULL AUTO_INCREMENT, `name` varchar(255) NOT NULL DEFAULT '', `comment` text COLLATE utf8_unicode_ci, `mcc` int DEFAULT NULL, `mnc` int DEFAULT NULL, `entities_id` INT NOT NULL DEFAULT 0, `is_recursive` TINYINT NOT NULL DEFAULT 0, `date_mod` datetime DEFAULT NULL, `date_creation` datetime DEFAULT NULL, PRIMARY KEY (`id`), KEY `name` (`name`), KEY `entities_id` (`entities_id`), KEY `is_recursive` (`is_recursive`), KEY `date_mod` (`date_mod`), KEY `date_creation` (`date_creation`), UNIQUE KEY `unicity` (`mcc`,`mnc`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;"; $DB->queryOrDie($query, "9.2 add table glpi_lineoperators"); } if (!$DB->tableExists('glpi_linetypes')) { $query = "CREATE TABLE IF NOT EXISTS `glpi_linetypes` ( `id` int NOT NULL AUTO_INCREMENT, `name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, `comment` text COLLATE utf8_unicode_ci, `date_mod` datetime DEFAULT NULL, `date_creation` datetime DEFAULT NULL, PRIMARY KEY (`id`), KEY `name` (`name`), KEY `date_mod` (`date_mod`), KEY `date_creation` (`date_creation`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;"; $DB->queryOrDie($query, "9.2 add table glpi_linetypes"); } if (!$DB->tableExists('glpi_lines')) { $query = "CREATE TABLE `glpi_lines` ( `id` INT NOT NULL auto_increment, `name` VARCHAR(255) NOT NULL DEFAULT '', `entities_id` INT NOT NULL DEFAULT 0, `is_recursive` TINYINT NOT NULL DEFAULT 0, `is_deleted` TINYINT NOT NULL DEFAULT 0, `caller_num` VARCHAR(255) NOT NULL DEFAULT '', `caller_name` VARCHAR(255) NOT NULL DEFAULT '', `users_id` INT NOT NULL DEFAULT 0, `groups_id` INT NOT NULL DEFAULT 0, `lineoperators_id` INT NOT NULL DEFAULT 0, `locations_id` INT NOT NULL DEFAULT '0', `states_id` INT NOT NULL DEFAULT '0', `linetypes_id` INT NOT NULL DEFAULT '0', `date_creation` DATETIME DEFAULT NULL, `date_mod` DATETIME DEFAULT NULL, `comment` TEXT DEFAULT NULL, PRIMARY KEY (`id`), KEY `entities_id` (`entities_id`), KEY `is_recursive` (`is_recursive`), KEY `users_id` (`users_id`), KEY `lineoperators_id` (`lineoperators_id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci"; $DB->queryOrDie($query, "9.2 add table glpi_lines"); } if (!$DB->tableExists('glpi_devicesimcardtypes')) { $query = "CREATE TABLE IF NOT EXISTS `glpi_devicesimcardtypes` ( `id` int NOT NULL AUTO_INCREMENT, `name` varchar(255) NOT NULL DEFAULT '', `comment` text COLLATE utf8_unicode_ci, `date_mod` datetime DEFAULT NULL, `date_creation` datetime DEFAULT NULL, PRIMARY KEY (`id`), KEY `name` (`name`), KEY `date_mod` (`date_mod`), KEY `date_creation` (`date_creation`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;"; $DB->queryOrDie($query, "9.2 add table glpi_devicesimcardtypes"); } if (!countElementsInTable('glpi_devicesimcardtypes', ['name' => 'Full SIM'])) { $DB->insertOrDie("glpi_devicesimcardtypes", [ 'id' => null, 'name' => "Full SIM", 'comment' => null, 'date_mod' => null, 'date_creation' => null ]); } if (!countElementsInTable('glpi_devicesimcardtypes', ['name' => 'Mini SIM'])) { $DB->insertOrDie("glpi_devicesimcardtypes", [ 'id' => null, 'name' => "Mini SIM", 'comment' => null, 'date_mod' => null, 'date_creation' => null ]); } if (!countElementsInTable('glpi_devicesimcardtypes', ['name' => 'Micro SIM'])) { $DB->insertOrDie("glpi_devicesimcardtypes", [ 'id' => null, 'name' => "Micro SIM", 'comment' => null, 'date_mod' => null, 'date_creation' => null ]); } if (!countElementsInTable('glpi_devicesimcardtypes', ['name' => 'Nano SIM'])) { $DB->insertOrDie("glpi_devicesimcardtypes", [ 'id' => null, 'name' => "Nano SIM", 'comment' => null, 'date_mod' => null, 'date_creation' => null ]); } if (!$DB->tableExists('glpi_devicesimcards')) { $query = "CREATE TABLE IF NOT EXISTS `glpi_devicesimcards` ( `id` int NOT NULL AUTO_INCREMENT, `designation` varchar(255) DEFAULT NULL, `comment` text CHARACTER SET utf8 COLLATE utf8_unicode_ci NULL, `entities_id` int NOT NULL DEFAULT '0', `is_recursive` tinyint NOT NULL DEFAULT '0', `manufacturers_id` int NOT NULL DEFAULT '0', `voltage` int DEFAULT NULL, `devicesimcardtypes_id` int NOT NULL DEFAULT '0', `date_mod` datetime DEFAULT NULL, `date_creation` datetime DEFAULT NULL, `allow_voip` tinyint NOT NULL DEFAULT '0', PRIMARY KEY (`id`), KEY `designation` (`designation`), KEY `entities_id` (`entities_id`), KEY `is_recursive` (`is_recursive`), KEY `devicesimcardtypes_id` (`devicesimcardtypes_id`), KEY `date_mod` (`date_mod`), KEY `date_creation` (`date_creation`), KEY `manufacturers_id` (`manufacturers_id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci"; $DB->queryOrDie($query, "9.2 add table glpi_devicesimcards"); } if (!$DB->tableExists('glpi_items_devicesimcards')) { $query = "CREATE TABLE IF NOT EXISTS `glpi_items_devicesimcards` ( `id` int NOT NULL AUTO_INCREMENT, `items_id` int NOT NULL DEFAULT '0' COMMENT 'RELATION to various table, according to itemtype (id)', `itemtype` varchar(100) COLLATE utf8_unicode_ci NOT NULL, `devicesimcards_id` int NOT NULL DEFAULT '0', `is_deleted` tinyint NOT NULL DEFAULT '0', `is_dynamic` tinyint NOT NULL DEFAULT '0', `entities_id` int NOT NULL DEFAULT '0', `serial` varchar(255) NULL DEFAULT NULL, `otherserial` varchar(255) NULL DEFAULT NULL, `states_id` int NOT NULL DEFAULT '0', `locations_id` int NOT NULL DEFAULT '0', `lines_id` int NOT NULL DEFAULT '0', `pin` varchar(255) NOT NULL DEFAULT '', `pin2` varchar(255) NOT NULL DEFAULT '', `puk` varchar(255) NOT NULL DEFAULT '', `puk2` varchar(255) NOT NULL DEFAULT '', PRIMARY KEY (`id`), KEY `item` (`itemtype`,`items_id`), KEY `devicesimcards_id` (`devicesimcards_id`), KEY `is_deleted` (`is_deleted`), KEY `is_dynamic` (`is_dynamic`), KEY `entities_id` (`entities_id`), KEY `serial` (`serial`), KEY `otherserial` (`otherserial`), KEY `states_id` (`states_id`), KEY `locations_id` (`locations_id`), KEY `lines_id` (`lines_id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci"; $DB->queryOrDie($query, "9.2 add table glpi_items_devicesimcards"); } if (countElementsInTable("glpi_profilerights", ['name' => 'line']) == 0) { //new right for line //give full rights to profiles having config right foreach ($DB->request("glpi_profilerights", "`name` = 'config'") as $profrights) { if ($profrights['rights'] && (READ + UPDATE)) { $rightValue = CREATE | READ | UPDATE | DELETE | PURGE | READNOTE | UPDATENOTE; } else { $rightValue = 0; } $DB->insertOrDie( "glpi_profilerights", [ 'id' => null, 'profiles_id' => $profrights['profiles_id'], 'name' => "line", 'rights' => $rightValue ], "9.2 add right for line" ); } } if (countElementsInTable("glpi_profilerights", ['name' => 'lineoperator']) == 0) { //new right for lineoperator //give full rights to profiles having config right foreach ($DB->request("glpi_profilerights", "`name` = 'config'") as $profrights) { if ($profrights['rights'] && (READ + UPDATE)) { $rightValue = CREATE | READ | UPDATE | DELETE | PURGE; } else { $rightValue = 0; } $DB->insertOrDie( "glpi_profilerights", [ 'id' => null, 'profiles_id' => $profrights['profiles_id'], 'name' => "lineoperator", 'rights' => $rightValue ], "9.2 add right for lineoperator" ); } } if (countElementsInTable("glpi_profilerights", ['name' => 'devicesimcard_pinpuk']) == 0) { //new right for simcard pin and puk //give full rights to profiles having config right foreach ($DB->request("glpi_profilerights", "`name` = 'config'") as $profrights) { if ($profrights['rights'] && (READ + UPDATE)) { $rightValue = READ | UPDATE; } else { $rightValue = 0; } $DB->insertOrDie( "glpi_profilerights", [ 'id' => null, 'profiles_id' => $profrights['profiles_id'], 'name' => "devicesimcard_pinpuk", 'rights' => $rightValue ], "9.2 add right for simcards pin and puk codes" ); } } //Firmware for phones if ($DB->fieldExists('glpi_phones', 'firmware')) { $iterator = $DB->request([ 'SELECT' => ['id', 'firmware'], 'FROM' => 'glpi_phones', 'NOT' => ['firmware' => null] ]); $firmwares = []; foreach ($iterator as $row) { if (!isset($firmwares[$row['firmware']])) { $fw = new DeviceFirmware(); if ($fw->getFromDBByCrit(['designation' => $DB->escape($row['firmware'])])) { $firmwares[$row['firmware']] = $fw->getID(); } else { $id = $fw->add([ 'designation' => $DB->escape($row['firmware']), 'devicefirmwaretypes_id' => '3' //type "firmware" ]); $firmwares[$row['firmware']] = $id; } } //add link $item_fw = new Item_DeviceFirmware(); $item_fw->add([ 'itemtype' => 'Phone', 'items_id' => $row['id'], 'devicefirmwares_id' => $firmwares[$row['firmware']] ]); } $migration->dropField('glpi_phones', 'firmware'); } //Firmware for network equipements if ($DB->tableExists('glpi_networkequipmentfirmwares')) { $mapping = []; $iterator = $DB->request('glpi_networkequipmentfirmwares'); foreach ($iterator as $row) { $fw = new DeviceFirmware(); $id = $fw->add([ 'designation' => $DB->escape($row['name']), 'comment' => $DB->escape($row['comment']), 'devicefirmwaretypes_id' => 3, //type "Firmware" 'date_creation' => $row['date_creation'], 'date_mod' => $row['date_mod'] ]); $mapping[$row['id']] = $id; } $iterator = $DB->request('glpi_networkequipments'); foreach ($iterator as $row) { if (isset($mapping[$row['networkequipmentfirmwares_id']])) { $itemdevice = new Item_DeviceFirmware(); $itemdevice->add([ 'itemtype' => 'NetworkEquipment', 'items_id' => $row['id'], 'devicefirmwares_id' => $mapping[$row['networkequipmentfirmwares_id']] ]); } } $migration->dropKey('glpi_networkequipments', 'networkequipmentfirmwares_id'); $migration->dropField('glpi_networkequipments', 'networkequipmentfirmwares_id'); $migration->dropTable('glpi_networkequipmentfirmwares'); } // add projecttemplate if (!$DB->fieldExists('glpi_projects', 'projecttemplates_id')) { $migration->addField("glpi_projects", "projecttemplates_id", "integer"); $migration->addField("glpi_projects", "is_template", "bool"); $migration->addField("glpi_projects", "template_name", "string"); $migration->addKey("glpi_projects", "projecttemplates_id"); } if (!$DB->fieldExists('glpi_projecttasks', 'projecttasktemplates_id')) { $migration->addField("glpi_projecttasks", "projecttasktemplates_id", "integer"); $migration->addField("glpi_projecttasks", "is_template", "bool"); $migration->addField("glpi_projecttasks", "template_name", "string"); $migration->addKey("glpi_projecttasks", "projecttasktemplates_id"); } if (!$DB->tableExists('glpi_projecttasktemplates')) { $query = "CREATE TABLE `glpi_projecttasktemplates` ( `id` int NOT NULL AUTO_INCREMENT, `entities_id` int NOT NULL DEFAULT '0', `is_recursive` tinyint NOT NULL DEFAULT '0', `name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, `description` longtext COLLATE utf8_unicode_ci, `comment` longtext COLLATE utf8_unicode_ci, `projects_id` int NOT NULL DEFAULT '0', `projecttasks_id` int NOT NULL DEFAULT '0', `plan_start_date` datetime DEFAULT NULL, `plan_end_date` datetime DEFAULT NULL, `real_start_date` datetime DEFAULT NULL, `real_end_date` datetime DEFAULT NULL, `planned_duration` int NOT NULL DEFAULT '0', `effective_duration` int NOT NULL DEFAULT '0', `projectstates_id` int NOT NULL DEFAULT '0', `projecttasktypes_id` int NOT NULL DEFAULT '0', `users_id` int NOT NULL DEFAULT '0', `percent_done` int NOT NULL DEFAULT '0', `is_milestone` tinyint NOT NULL DEFAULT '0', `comments` text COLLATE utf8_unicode_ci, `date_mod` datetime DEFAULT NULL, `date_creation` datetime DEFAULT NULL, PRIMARY KEY (`id`), KEY `name` (`name`), KEY `entities_id` (`entities_id`), KEY `is_recursive` (`is_recursive`), KEY `projects_id` (`projects_id`), KEY `projecttasks_id` (`projecttasks_id`), KEY `date_creation` (`date_creation`), KEY `date_mod` (`date_mod`), KEY `users_id` (`users_id`), KEY `plan_start_date` (`plan_start_date`), KEY `plan_end_date` (`plan_end_date`), KEY `real_start_date` (`real_start_date`), KEY `real_end_date` (`real_end_date`), KEY `percent_done` (`percent_done`), KEY `projectstates_id` (`projectstates_id`), KEY `projecttasktypes_id` (`projecttasktypes_id`), KEY `is_milestone` (`is_milestone`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;"; $DB->queryOrDie($query, "9.2 add table glpi_projecttasktemplates"); } //add editor in followupps if (!$DB->fieldExists('glpi_ticketfollowups', 'users_id_editor')) { $migration->addField("glpi_ticketfollowups", "users_id_editor", "int NOT NULL DEFAULT '0'", ['after' => 'users_id']); $migration->addKey("glpi_ticketfollowups", "users_id_editor"); } //add editor in *tasks if (!$DB->fieldExists('glpi_tickettasks', 'users_id_editor')) { $migration->addField("glpi_tickettasks", "users_id_editor", "int NOT NULL DEFAULT '0'", ['after' => 'users_id']); $migration->addKey("glpi_tickettasks", "users_id_editor"); } if (!$DB->fieldExists('glpi_changetasks', 'users_id_editor')) { $migration->addField("glpi_changetasks", "users_id_editor", "int NOT NULL DEFAULT '0'", ['after' => 'users_id']); $migration->addKey("glpi_changetasks", "users_id_editor"); } if (!$DB->fieldExists('glpi_problemtasks', 'users_id_editor')) { $migration->addField("glpi_problemtasks", "users_id_editor", "int NOT NULL DEFAULT '0'", ['after' => 'users_id']); $migration->addKey("glpi_problemtasks", "users_id_editor"); } //Add a new sync_field in LDAP configuration if (!$DB->fieldExists('glpi_authldaps', 'sync_field')) { $migration->addField("glpi_authldaps", "sync_field", "string", ['after' => 'login_field', 'null' => true]); $migration->addKey('glpi_authldaps', 'sync_field'); } //Add a new sync_field for users if (!$DB->fieldExists('glpi_users', 'sync_field')) { $migration->addField("glpi_users", "sync_field", "string", ['null' => true]); $migration->addKey('glpi_users', 'sync_field'); } $migration->addConfig([ 'smtp_max_retries' => 5, 'smtp_sender' => 'NULL', 'from_email' => 'NULL', 'from_email_name' => 'NULL' ]); //register telemetry crontask CronTask::register( 'Telemetry', 'telemetry', MONTH_TIMESTAMP, [ 'comment' => '', 'mode' => CronTask::MODE_INTERNAL, 'state' => CronTask::STATE_DISABLE ] ); $migration->addConfig([ 'instance_uuid' => Telemetry::generateInstanceUuid(), 'registration_uuid' => Telemetry::generateRegistrationUuid() ]); if (isIndex('glpi_authldaps', 'use_tls')) { $query = "ALTER TABLE `glpi_authldaps` DROP INDEX `use_tls`"; $DB->queryOrDie($query, "9.2 drop index use_tls for glpi_authldaps"); } //Fix some field order from old migrations $migration->migrationOneTable('glpi_states'); $DB->queryOrDie("ALTER TABLE `glpi_budgets` CHANGE `date_creation` `date_creation` DATETIME NULL DEFAULT NULL AFTER `date_mod`"); $DB->queryOrDie("ALTER TABLE `glpi_changetasks` CHANGE `groups_id_tech` `groups_id_tech` INT NOT NULL DEFAULT '0' AFTER `users_id_tech`"); $DB->queryOrDie("ALTER TABLE `glpi_problemtasks` CHANGE `groups_id_tech` `groups_id_tech` INT NOT NULL DEFAULT '0' AFTER `users_id_tech`"); $DB->queryOrDie("ALTER TABLE `glpi_tickettasks` CHANGE `groups_id_tech` `groups_id_tech` INT NOT NULL DEFAULT '0' AFTER `users_id_tech`"); $DB->queryOrDie("ALTER TABLE `glpi_knowbaseitemcategories` CHANGE `sons_cache` `sons_cache` LONGTEXT CHARACTER SET utf8 COLLATE utf8_unicode_ci NULL DEFAULT NULL AFTER `level`"); $DB->queryOrDie("ALTER TABLE `glpi_requesttypes` CHANGE `is_followup_default` `is_followup_default` TINYINT NOT NULL DEFAULT '0' AFTER `is_helpdesk_default`"); $DB->queryOrDie("ALTER TABLE `glpi_requesttypes` CHANGE `is_mailfollowup_default` `is_mailfollowup_default` TINYINT NOT NULL DEFAULT '0' AFTER `is_mail_default`"); $DB->queryOrDie("ALTER TABLE `glpi_requesttypes` CHANGE `comment` `comment` TEXT CHARACTER SET utf8 COLLATE utf8_unicode_ci NULL DEFAULT NULL AFTER `is_ticketfollowup`"); $DB->queryOrDie("ALTER TABLE `glpi_requesttypes` CHANGE `date_mod` `date_mod` DATETIME NULL DEFAULT NULL AFTER `comment`"); $DB->queryOrDie("ALTER TABLE `glpi_requesttypes` CHANGE `date_creation` `date_creation` DATETIME NULL DEFAULT NULL AFTER `date_mod`"); $DB->queryOrDie("ALTER TABLE `glpi_groups` CHANGE `is_task` `is_task` TINYINT NOT NULL DEFAULT '1' AFTER `is_assign`"); $DB->queryOrDie("ALTER TABLE `glpi_states` CHANGE `date_mod` `date_mod` DATETIME NULL DEFAULT NULL AFTER `is_visible_certificate`"); $DB->queryOrDie("ALTER TABLE `glpi_states` CHANGE `date_creation` `date_creation` DATETIME NULL DEFAULT NULL AFTER `date_mod`"); $DB->queryOrDie("ALTER TABLE `glpi_taskcategories` CHANGE `is_active` `is_active` TINYINT NOT NULL DEFAULT '1' AFTER `sons_cache`"); $DB->queryOrDie("ALTER TABLE `glpi_users` CHANGE `palette` `palette` CHAR(20) CHARACTER SET utf8 COLLATE utf8_unicode_ci NULL DEFAULT NULL AFTER `layout`"); $DB->queryOrDie("ALTER TABLE `glpi_users` CHANGE `set_default_requester` `set_default_requester` TINYINT NULL DEFAULT NULL AFTER `ticket_timeline_keep_replaced_tabs`"); $DB->queryOrDie("ALTER TABLE `glpi_users` CHANGE `plannings` `plannings` TEXT CHARACTER SET utf8 COLLATE utf8_unicode_ci NULL DEFAULT NULL AFTER `highcontrast_css`"); //Fix bad default values $DB->queryOrDie("ALTER TABLE `glpi_states` CHANGE `is_visible_softwarelicense` `is_visible_softwarelicense` TINYINT NOT NULL DEFAULT '1'"); $DB->queryOrDie("ALTER TABLE `glpi_states` CHANGE `is_visible_line` `is_visible_line` TINYINT NOT NULL DEFAULT '1'"); //Fields added in 0905_91 script but not in empty sql... if (!$DB->fieldExists('glpi_changetasks', 'date_creation', false)) { $migration->addField('glpi_changetasks', 'date_creation', 'datetime', ['after' => 'date_mod']); $migration->addKey('glpi_changetasks', 'date_creation'); } if (!$DB->fieldExists('glpi_networkportfiberchannels', 'date_mod', false)) { $migration->addField('glpi_networkportfiberchannels', 'date_mod', 'datetime', ['after' => 'speed']); $migration->addKey('glpi_networkportfiberchannels', 'date_mod'); } if (!$DB->fieldExists('glpi_networkportfiberchannels', 'date_creation', false)) { $migration->addField('glpi_networkportfiberchannels', 'date_creation', 'datetime', ['after' => 'date_mod']); $migration->addKey('glpi_networkportfiberchannels', 'date_creation'); } if (!$DB->fieldExists('glpi_problemtasks', 'date_creation', false)) { $migration->addField('glpi_problemtasks', 'date_creation', 'datetime', ['after' => 'date_mod']); $migration->addKey('glpi_problemtasks', 'date_creation'); } if (!$DB->fieldExists('glpi_slms', 'date_creation', false)) { $migration->addField('glpi_slms', 'date_creation', 'datetime', ['after' => 'date_mod']); $migration->addKey('glpi_slms', 'date_creation'); } if (!$DB->fieldExists('glpi_ticketfollowups', 'date_creation', false)) { $migration->addField('glpi_ticketfollowups', 'date_creation', 'datetime', ['after' => 'date_mod']); $migration->addKey('glpi_ticketfollowups', 'date_creation'); } if (!$DB->fieldExists('glpi_tickettasks', 'date_creation', false)) { $migration->addField('glpi_tickettasks', 'date_creation', 'datetime', ['after' => 'date_mod']); $migration->addKey('glpi_tickettasks', 'date_creation'); } if (!$DB->fieldExists('glpi_softwarelicenses', 'contact_num', false)) { $migration->addField( "glpi_softwarelicenses", "contact_num", "varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL", ['after' => 'contact'] ); } //Fix comments... $DB->queryOrDie("ALTER TABLE `glpi_savedsearches` CHANGE `type` `type` INT NOT NULL DEFAULT '0' COMMENT 'see SavedSearch:: constants'"); //Fix unicity... $tables = [ 'glpi_slalevels_tickets' => ['tickets_id', 'slalevels_id'], 'glpi_businesscriticities' => ['businesscriticities_id', 'name'], 'glpi_documentcategories' => ['documentcategories_id', 'name'], 'glpi_olalevels_tickets' => ['tickets_id', 'olalevels_id'], 'glpi_states' => ['states_id', 'name'], 'glpi_tickets_tickets' => ['tickets_id_1', 'tickets_id_2'], 'glpi_tickettemplatehiddenfields' => ['tickettemplates_id', 'num'], 'glpi_tickettemplatemandatoryfields' => ['tickettemplates_id', 'num'] ]; foreach ($tables as $table => $fields) { $add = true; $result = $DB->query("SHOW INDEX FROM `$table` WHERE Key_name='unicity'"); if ($result && $DB->numrows($result)) { $row = $DB->fetchAssoc($result); if ($row['Non_unique'] == 1) { $migration->dropKey($table, 'unicity'); $migration->migrationOneTable($table); } else { $add = false; } } if ($add) { //missing or bad unique key ==> add it. $migration->addKey( $table, $fields, 'unicity', 'UNIQUE' ); } } // unique index added in a previous 9.2-dev $migration->dropKey('glpi_tickettemplatepredefinedfields', 'unicity'); $migration->addKey( 'glpi_tickettemplatepredefinedfields', ['tickettemplates_id', 'num'], 'tickettemplates_id_id_num' ); //removed field if ($DB->fieldExists('glpi_slms', 'resolution_time')) { $migration->dropField('glpi_slms', 'resolution_time'); } //wrong type $DB->queryOrDie("ALTER TABLE `glpi_users` CHANGE `keep_devices_when_purging_item` `keep_devices_when_purging_item` TINYINT NULL DEFAULT NULL"); //missing index $migration->addKey('glpi_networknames', 'is_deleted'); $migration->addKey('glpi_networknames', 'is_dynamic'); $migration->addKey('glpi_projects', 'is_template'); $migration->addKey('glpi_projecttasks', 'is_template'); $migration->dropKey('glpi_savedsearches_users', 'bookmarks_id'); $migration->addKey('glpi_savedsearches_users', 'savedsearches_id'); //this one was not on the correct field $migration->dropKey('glpi_softwarelicenses', 'is_deleted'); $migration->migrationOneTable('glpi_softwarelicenses'); $migration->addKey('glpi_softwarelicenses', 'is_deleted'); $migration->addKey('glpi_states', 'is_visible_line'); $migration->addKey('glpi_tasktemplates', 'is_private'); $migration->addKey('glpi_tasktemplates', 'users_id_tech'); $migration->addKey('glpi_tasktemplates', 'groups_id_tech'); //add timeline_position in ticketfollowups //add timeline_position in tickettasks //add timeline_position in documents_items //add timeline_position in ticketvalidations $timeline_tables = ['glpi_ticketfollowups', 'glpi_tickettasks', 'glpi_documents_items', 'glpi_ticketvalidations']; foreach ($timeline_tables as $tl_table) { //add timeline_position in $tl_table if (!$DB->fieldExists($tl_table, 'timeline_position')) { $migration->addField($tl_table, "timeline_position", "tinyint NOT NULL DEFAULT '0'"); $where = [ "$tl_table.tickets_id" => new \QueryExpression( DBmysql::quoteName("glpi_tickets_users.tickets_id") ), "$tl_table.users_id" => new \QueryExpression( DBmysql::quoteName("glpi_tickets_users.users_id") ), ]; if (!$DB->fieldExists($tl_table, 'tickets_id')) { $where = [ "$tl_table.itemtype" => "Ticket", "$tl_table.items_id" => new \QueryExpression( DBmysql::quoteName("glpi_tickets_users.tickets_id") ), "$tl_table.users_id" => new \QueryExpression( DBmysql::quoteName("glpi_tickets_users.users_id") ), ]; } $update = new \QueryExpression( DBmysql::quoteName($tl_table) . ", " . DBmysql::quoteName("glpi_tickets_users") ); $migration->addPostQuery( $DB->buildUpdate( $update, [ "$tl_table.timeline_position" => new \QueryExpression("IF(" . DBmysql::quoteName("glpi_tickets_users.type") . " NOT IN (1,3) AND " . DBmysql::quoteName("glpi_tickets_users.type") . " IN (2), 4, 1)") ], $where ) ); $where = [ "$tl_table.tickets_id" => new \QueryExpression( DBmysql::quoteName("glpi_groups_tickets.tickets_id") ), "glpi_groups_users.groups_id" => new \QueryExpression( DBmysql::quoteName("glpi_groups_tickets.groups_id") ), "$tl_table.users_id" => new \QueryExpression( DBmysql::quoteName("glpi_groups_users.users_id") ), ]; if (!$DB->fieldExists($tl_table, 'tickets_id')) { $where = [ "$tl_table.itemtype" => "Ticket", "$tl_table.items_id" => new \QueryExpression( DBmysql::quoteName("glpi_groups_tickets.tickets_id") ), "glpi_groups_users.groups_id" => new \QueryExpression( DBmysql::quoteName("glpi_groups_tickets.groups_id") ), "$tl_table.users_id" => new \QueryExpression( DBmysql::quoteName("glpi_groups_users.users_id") ), ]; } $update = new \QueryExpression( DBmysql::quoteName($tl_table) . ", " . DBmysql::quoteName("glpi_groups_tickets") . ", " . DBmysql::quoteName("glpi_groups_users") ); $migration->addPostQuery( $DB->buildUpdate( $update, [ "$tl_table.timeline_position" => new \QueryExpression("IF(" . DBmysql::quoteName("glpi_groups_tickets.type") . " NOT IN (1,3) AND " . DBmysql::quoteName("glpi_groups_tickets.type") . " IN (2), 4, 1)") ], $where ) ); $migration->addPostQuery( $DB->buildUpdate( $tl_table, ["$tl_table.timeline_position" => "1"], ["$tl_table.timeline_position" => "0"] ) ); } } // ************ Keep it at the end ************** $migration->executeMigration(); return $updateresult; }