Sindbad~EG File Manager
<?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 0.84 to 0.85
*
* @return bool for success (will die for most error)
**/
function update084xto0850()
{
global $DB, $migration;
$updateresult = true;
$ADDTODISPLAYPREF = [];
$DELFROMDISPLAYPREF = [];
//TRANS: %s is the number of new version
$migration->displayTitle(sprintf(__('Update to %s'), '0.85'));
$migration->setVersion('0.85');
$backup_tables = false;
$newtables = ['glpi_blacklistedmailcontents',
'glpi_changecosts', 'glpi_changes', 'glpi_changes_groups',
'glpi_changes_items', 'glpi_changes_problems', 'glpi_changes_projects',
'glpi_changes_suppliers', 'glpi_changes_tickets', 'glpi_changes_users',
'glpi_changetasks', 'glpi_changevalidations',
'glpi_dropdowntranslations',
'glpi_knowbaseitemtranslations',
'glpi_notepads',
'glpi_problemcosts', 'glpi_projectcosts',
'glpi_projects', 'glpi_projects_changes', 'glpi_projects_items',
'glpi_projectstates', 'glpi_projecttasks', 'glpi_projecttasks_tickets',
'glpi_projecttaskteams', 'glpi_projecttasktypes',
'glpi_projectteams', 'glpi_projecttypes',
'glpi_queuedmails'
// Only do profilerights once : so not delete it
/*, 'glpi_profilerights'*/
];
foreach ($newtables as $new_table) {
// rename new tables if exists ?
if ($DB->tableExists($new_table)) {
$migration->dropTable("backup_$new_table");
$migration->displayWarning("$new_table table already exists. " .
"A backup have been done to backup_$new_table.");
$backup_tables = true;
$query = $migration->renameTable("$new_table", "backup_$new_table");
}
}
if ($backup_tables) {
$migration->displayWarning(
"You can delete backup tables if you have no need of them.",
true
);
}
$migration->displayMessage(sprintf(__('Data migration - %s'), 'config table'));
if ($DB->fieldExists('glpi_configs', 'version')) {
if (!$DB->tableExists('origin_glpi_configs')) {
$migration->copyTable('glpi_configs', 'origin_glpi_configs');
}
$query = "SELECT *
FROM `glpi_configs`
WHERE `id` = '1'";
$result_of_configs = $DB->query($query);
// Update glpi_configs
$migration->addField(
'glpi_configs',
'context',
'VARCHAR(150) COLLATE utf8_unicode_ci',
['update' => "'core'"]
);
$migration->addField(
'glpi_configs',
'name',
'VARCHAR(150) COLLATE utf8_unicode_ci',
['update' => "'version'"]
);
$migration->addField('glpi_configs', 'value', 'text', ['update' => "'0.85'"]);
$migration->addKey('glpi_configs', ['context', 'name'], 'unicity', 'UNIQUE');
$migration->migrationOneTable('glpi_configs');
$fields = [];
if ($DB->numrows($result_of_configs) == 1) {
$configs = $DB->fetchAssoc($result_of_configs);
unset($configs['id']);
unset($configs['version']);
// First drop fields not to have constraint on insert
foreach ($configs as $name => $value) {
$migration->dropField('glpi_configs', $name);
}
$migration->migrationOneTable('glpi_configs');
// Then insert new values
foreach ($configs as $name => $value) {
$query = "INSERT INTO `glpi_configs`
(`context`, `name`, `value`)
VALUES ('core', '$name', '" . addslashes($value ?? '') . "');";
$DB->query($query);
}
}
$migration->dropField('glpi_configs', 'version');
$migration->migrationOneTable('glpi_configs');
$migration->dropTable('origin_glpi_configs');
}
$migration->displayMessage(sprintf(__('Data migration - %s'), 'profile table'));
if (!$DB->tableExists('glpi_profilerights')) {
if (!$DB->tableExists('origin_glpi_profiles')) {
$migration->copyTable('glpi_profiles', 'origin_glpi_profiles');
}
$query = "CREATE TABLE `glpi_profilerights` (
`id` int NOT NULL AUTO_INCREMENT,
`profiles_id` int NOT NULL DEFAULT '0',
`name` varchar(255) DEFAULT NULL,
`rights` int NOT NULL DEFAULT '0',
PRIMARY KEY (`id`),
UNIQUE KEY `unicity` (`profiles_id`, `name`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci";
$DB->queryOrDie($query, "0.85 add table glpi_profilerights");
$query = "DESCRIBE `origin_glpi_profiles`";
$rights = [];
foreach ($DB->request($query) as $field) {
if ($field['Type'] == 'char(1)') {
$rights[$field['Field']] = $field['Field'];
$migration->dropField('glpi_profiles', $field['Field']);
}
}
$query = "SELECT *
FROM `origin_glpi_profiles`";
foreach ($DB->request($query) as $profile) {
$profiles_id = $profile['id'];
foreach ($rights as $right) {
$new_right = 0;
if (
($profile[$right] == 'r')
|| ($profile[$right] == '1')
) {
$new_right = READ;
} else if ($profile[$right] == 'w') {
$new_right = ALLSTANDARDRIGHT;
}
$query = "INSERT INTO `glpi_profilerights`
(`profiles_id`, `name`, `rights`)
VALUES ('$profiles_id', '$right', '" . $new_right . "')";
$DB->query($query);
}
}
$migration->migrationOneTable('glpi_profiles');
$migration->dropTable('origin_glpi_profiles');
}
// New system of profiles
// delete import_externalauth_users
foreach (
$DB->request(
"glpi_profilerights",
"`name` = 'import_externalauth_users' AND `rights` = '" . ALLSTANDARDRIGHT . "'"
) as $profrights
) {
$query = "UPDATE `glpi_profilerights`
SET `rights` = `rights` | " . User::IMPORTEXTAUTHUSERS . "
WHERE `profiles_id` = '" . $profrights['profiles_id'] . "'
AND `name` = 'user'";
$DB->queryOrDie($query, "0.85 update user with import_externalauth_users right");
}
$query = "DELETE
FROM `glpi_profilerights`
WHERE `name` = 'import_externalauth_users'";
$DB->queryOrDie($query, "0.85 delete import_externalauth_users right");
// save value of rule_ticket to root_rule_ticket
$query = "UPDATE `glpi_profilerights`
SET `name` = 'root_rule_ticket'
WHERE `name` = 'rule_ticket'";
$DB->queryOrDie($query, "0.85 rename rule_ticket to root_rule_ticket");
// rename entity_rule_ticket to rule_ticket
$query = "UPDATE `glpi_profilerights`
SET `name` = 'rule_ticket'
WHERE `name` = 'entity_rule_ticket'";
$DB->queryOrDie($query, "0.85 rename entity_rule_ticket to rule_ticket");
// delete root_rule_ticket
foreach (
$DB->request(
"glpi_profilerights",
"`name` = 'root_rule_ticket' AND `rights` = '1'"
) as $profrights
) {
$query = "UPDATE `glpi_profilerights`
SET `rights` = `rights` | " . RuleTicket::PARENT . "
WHERE `profiles_id` = '" . $profrights['profiles_id'] . "'
AND `name` = 'rule_ticket'";
$DB->queryOrDie($query, "0.85 update new rule_ticket with old rule_ticket right");
}
$query = "DELETE
FROM `glpi_profilerights`
WHERE `name` = 'root_rule_ticket'";
$DB->queryOrDie($query, "0.85 delete old rule_ticket right");
// delete knowbase_admin
foreach (
$DB->request(
"glpi_profilerights",
"`name` = 'knowbase_admin' AND `rights` = '1'"
) as $profrights
) {
$query = "UPDATE `glpi_profilerights`
SET `rights` = `rights` | " . KnowbaseItem::KNOWBASEADMIN . "
WHERE `profiles_id` = '" . $profrights['profiles_id'] . "'
AND `name` = 'knowbase'";
$DB->queryOrDie($query, "0.85 update knowbase with knowbase_admin right");
}
$query = "DELETE
FROM `glpi_profilerights`
WHERE `name` = 'knowbase_admin'";
$DB->queryOrDie($query, "0.85 delete knowbase_admin right");
// delete faq
foreach (
$DB->request(
"glpi_profilerights",
"`name` = 'faq' AND `rights` = '1'"
) as $profrights
) {
$query = "UPDATE `glpi_profilerights`
SET `rights` = `rights` | " . KnowbaseItem::READFAQ . "
WHERE `profiles_id` = '" . $profrights['profiles_id'] . "'
AND `name` = 'knowbase'";
$DB->queryOrDie($query, "0.85 update knowbase with read faq right");
}
foreach (
$DB->request(
"glpi_profilerights",
"`name` = 'faq' AND `rights` = '" . ALLSTANDARDRIGHT . "'"
) as $profrights
) {
$query = "UPDATE `glpi_profilerights`
SET `rights` = `rights` | " . KnowbaseItem::READFAQ . " | " . KnowbaseItem::PUBLISHFAQ . "
WHERE `profiles_id` = '" . $profrights['profiles_id'] . "'
AND `name` = 'knowbase'";
$DB->queryOrDie($query, "0.85 update knowbase with write faq right");
}
$query = "DELETE
FROM `glpi_profilerights`
WHERE `name` = 'faq'";
$DB->queryOrDie($query, "0.85 delete faq right");
// delete user_authtype
foreach (
$DB->request(
"glpi_profilerights",
"`name` = 'user_authtype' AND `rights` = '1'"
) as $profrights
) {
$query = "UPDATE `glpi_profilerights`
SET `rights` = `rights` | " . User::READAUTHENT . "
WHERE `profiles_id` = '" . $profrights['profiles_id'] . "'
AND `name` = 'user'";
$DB->queryOrDie($query, "0.85 update user with read user_authtype right");
}
foreach (
$DB->request(
"glpi_profilerights",
"`name` = 'user_authtype' AND `rights` = '" . ALLSTANDARDRIGHT . "'"
) as $profrights
) {
$query = "UPDATE `glpi_profilerights`
SET `rights` = `rights` | " . User::READAUTHENT . " | " . User::UPDATEAUTHENT . "
WHERE `profiles_id` = '" . $profrights['profiles_id'] . "'
AND `name` = 'user'";
$DB->queryOrDie($query, "0.85 update user with write user_authtype right");
}
$query = "DELETE
FROM `glpi_profilerights`
WHERE `name` = 'user_authtype'";
$DB->queryOrDie($query, "0.85 delete user_authtype right");
// delete entity_helpdesk
foreach (
$DB->request(
"glpi_profilerights",
"`name` = 'entity_helpdesk' AND `rights` = '1'"
) as $profrights
) {
$query = "UPDATE `glpi_profilerights`
SET `rights` = `rights` | " . Entity::READHELPDESK . "
WHERE `profiles_id` = '" . $profrights['profiles_id'] . "'
AND `name` = 'entity'";
$DB->queryOrDie($query, "0.85 update entity with read entity_helpdesk right");
}
foreach (
$DB->request(
"glpi_profilerights",
"`name` = 'entity_helpdesk' AND `rights` = '" . ALLSTANDARDRIGHT . "'"
) as $profrights
) {
$query = "UPDATE `glpi_profilerights`
SET `rights` = `rights` | " . Entity::READHELPDESK . " | " . Entity::UPDATEHELPDESK . "
WHERE `profiles_id` = '" . $profrights['profiles_id'] . "'
AND `name` = 'entity'";
$DB->queryOrDie($query, "0.85 update user with write entity_helpdesk right");
}
$query = "DELETE
FROM `glpi_profilerights`
WHERE `name` = 'entity_helpdesk'";
$DB->queryOrDie($query, "0.85 delete entity_helpdesk right");
// delete reservation_helpdesk
foreach (
$DB->request(
"glpi_profilerights",
"`name` = 'reservation_helpdesk' AND `rights` = '1'"
) as $profrights
) {
$query = "UPDATE `glpi_profilerights`
SET `rights` = `rights` | " . ReservationItem::RESERVEANITEM . "
WHERE `profiles_id` = '" . $profrights['profiles_id'] . "'
AND `name` = 'reservation_central'";
$DB->queryOrDie($query, "0.85 update reservation_central with reservation_helpdesk right");
}
$query = "DELETE
FROM `glpi_profilerights`
WHERE `name` = 'reservation_helpdesk'";
$DB->queryOrDie($query, "0.85 delete reservation_helpdesk right");
// rename reservation_central
$query = "UPDATE `glpi_profilerights`
SET `name` = 'reservation'
WHERE `name` = 'reservation_central'";
$DB->queryOrDie($query, "0.85 delete reservation_central");
// pour que la proc??dure soit r??-entrante et ne pas perdre les s??lections dans le profile
if (countElementsInTable("glpi_profilerights", ['name' => 'ticket']) == 0) {
// rename create_ticket
$query = "UPDATE `glpi_profilerights`
SET `name` = 'ticket'
WHERE `name` = 'create_ticket'";
$DB->queryOrDie($query, "0.85 rename create_ticket to ticket");
$query = "UPDATE `glpi_profilerights`
SET `rights` = " . (CREATE | Ticket::READMY) . "
WHERE `name` = 'ticket'
AND `rights` = '1'";
$DB->queryOrDie($query, "0.85 update ticket with create_ticket right");
}
// delete update_ticket
foreach (
$DB->request(
"glpi_profilerights",
"`name` = 'update_ticket' AND `rights` = '1'"
) as $profrights
) {
$query = "UPDATE `glpi_profilerights`
SET `rights` = `rights` | " . UPDATE . "
WHERE `profiles_id` = '" . $profrights['profiles_id'] . "'
AND `name` = 'ticket'";
$DB->queryOrDie($query, "0.85 update ticket with update_ticket right");
}
$query = "DELETE
FROM `glpi_profilerights`
WHERE `name` = 'update_ticket'";
$DB->queryOrDie($query, "0.85 delete update_ticket right");
// delete delete_ticket
foreach (
$DB->request(
"glpi_profilerights",
"`name` = 'delete_ticket' AND `rights` = '1'"
) as $profrights
) {
$query = "UPDATE `glpi_profilerights`
SET `rights` = `rights` | " . DELETE . " | " . PURGE . "
WHERE `profiles_id` = '" . $profrights['profiles_id'] . "'
AND `name` = 'ticket'";
$DB->queryOrDie($query, "0.85 update ticket with delete_ticket right");
}
$query = "DELETE
FROM `glpi_profilerights`
WHERE `name` = 'delete_ticket'";
$DB->queryOrDie($query, "0.85 delete delete_ticket right");
// delete show_all_ticket
foreach (
$DB->request(
"glpi_profilerights",
"`name` = 'show_all_ticket' AND `rights` = '1'"
) as $profrights
) {
$query = "UPDATE `glpi_profilerights`
SET `rights` = `rights` | " . Ticket::READALL . "
WHERE `profiles_id` = '" . $profrights['profiles_id'] . "'
AND `name` = 'ticket'";
$DB->queryOrDie($query, "0.85 update ticket with show_all_ticket right");
}
$query = "DELETE
FROM `glpi_profilerights`
WHERE `name` = 'show_all_ticket'";
$DB->queryOrDie($query, "0.85 delete show_all_ticket right");
// delete show_group_ticket
foreach (
$DB->request(
"glpi_profilerights",
"`name` = 'show_group_ticket' AND `rights` = '1'"
) as $profrights
) {
$query = "UPDATE `glpi_profilerights`
SET `rights` = `rights` | " . Ticket::READGROUP . "
WHERE `profiles_id` = '" . $profrights['profiles_id'] . "'
AND `name` = 'ticket'";
$DB->queryOrDie($query, "0.85 update ticket with show_group_ticket right");
}
$query = "DELETE
FROM `glpi_profilerights`
WHERE `name` = 'show_group_ticket'";
$DB->queryOrDie($query, "0.85 delete show_group_ticket right");
// delete show_assign_ticket
foreach (
$DB->request(
"glpi_profilerights",
"`name` = 'show_assign_ticket' AND `rights` = '1'"
) as $profrights
) {
$query = "UPDATE `glpi_profilerights`
SET `rights` = `rights` | " . Ticket::READASSIGN . "
WHERE `profiles_id` = '" . $profrights['profiles_id'] . "'
AND `name` = 'ticket'";
$DB->queryOrDie($query, "0.85 update ticket with show_assign_ticket right");
}
$query = "DELETE
FROM `glpi_profilerights`
WHERE `name` = 'show_assign_ticket'";
$DB->queryOrDie($query, "0.85 delete show_assign_ticket right");
// delete assign_ticket
foreach (
$DB->request(
"glpi_profilerights",
"`name` = 'assign_ticket' AND `rights` = '1'"
) as $profrights
) {
$query = "UPDATE `glpi_profilerights`
SET `rights` = `rights` | " . Ticket::ASSIGN . "
WHERE `profiles_id` = '" . $profrights['profiles_id'] . "'
AND `name` = 'ticket'";
$DB->queryOrDie($query, "0.85 update ticket with assign_ticket right");
}
$query = "DELETE
FROM `glpi_profilerights`
WHERE `name` = 'assign_ticket'";
$DB->queryOrDie($query, "0.85 delete assign_ticket right");
// delete steal_ticket
foreach (
$DB->request(
"glpi_profilerights",
"`name` = 'steal_ticket' AND `rights` = '1'"
) as $profrights
) {
$query = "UPDATE `glpi_profilerights`
SET `rights` = `rights` | " . Ticket::STEAL . "
WHERE `profiles_id` = '" . $profrights['profiles_id'] . "'
AND `name` = 'ticket'";
$DB->queryOrDie($query, "0.85 update ticket with steal_ticket right");
}
$query = "DELETE
FROM `glpi_profilerights`
WHERE `name` = 'steal_ticket'";
$DB->queryOrDie($query, "0.85 delete steal_ticket right");
// delete own_ticket
foreach (
$DB->request(
"glpi_profilerights",
"`name` = 'own_ticket' AND `rights` = '1'"
) as $profrights
) {
$query = "UPDATE `glpi_profilerights`
SET `rights` = `rights` | " . Ticket::OWN . "
WHERE `profiles_id` = '" . $profrights['profiles_id'] . "'
AND `name` = 'ticket'";
$DB->queryOrDie($query, "0.85 update ticket with own_ticket right");
}
$query = "DELETE
FROM `glpi_profilerights`
WHERE `name` = 'own_ticket'";
$DB->queryOrDie($query, "0.85 delete own_ticket right");
// delete update_priority
foreach (
$DB->request(
"glpi_profilerights",
"`name` = 'update_priority' AND `rights` = '1'"
) as $profrights
) {
$query = "UPDATE `glpi_profilerights`
SET `rights` = `rights` | " . Ticket::CHANGEPRIORITY . "
WHERE `profiles_id` = '" . $profrights['profiles_id'] . "'
AND `name` = 'ticket'";
$DB->queryOrDie($query, "0.85 update ticket with update_priority right");
}
$query = "DELETE
FROM `glpi_profilerights`
WHERE `name` = 'update_priority'";
$DB->queryOrDie($query, "0.85 delete update_priority right");
// pour que la proc??dure soit r??-entrante et ne pas perdre les s??lections dans le profile
if (countElementsInTable("glpi_profilerights", ['name' => 'followup']) == 0) {
// rename create_ticket
$query = "UPDATE `glpi_profilerights`
SET `name` = 'followup'
WHERE `name` = 'global_add_followups'";
$DB->queryOrDie($query, "0.85 rename global_add_followups to followup");
$query = "UPDATE `glpi_profilerights`
SET `rights` = " . ITILFollowup::ADDALLTICKET . "
WHERE `name` = 'followup'
AND `rights` = '1'";
$DB->queryOrDie($query, "0.85 update followup with global_add_followups right");
}
// delete add_followups
foreach (
$DB->request(
"glpi_profilerights",
"`name` = 'add_followups' AND `rights` = '1'"
) as $profrights
) {
$query = "UPDATE `glpi_profilerights`
SET `rights` = `rights` | " . ITILFollowup::ADDMYTICKET . "
WHERE `profiles_id` = '" . $profrights['profiles_id'] . "'
AND `name` = 'followup'";
$DB->queryOrDie($query, "0.85 update followup with add_followups right");
}
$query = "DELETE
FROM `glpi_profilerights`
WHERE `name` = 'add_followups'";
$DB->queryOrDie($query, "0.85 delete add_followups right");
// delete group_add_followups
foreach (
$DB->request(
"glpi_profilerights",
"`name` = 'group_add_followups' AND `rights` = '1'"
) as $profrights
) {
$query = "UPDATE `glpi_profilerights`
SET `rights` = `rights` | " . ITILFollowup::ADDGROUPTICKET . "
WHERE `profiles_id` = '" . $profrights['profiles_id'] . "'
AND `name` = 'followup'";
$DB->queryOrDie($query, "0.85 update followup with group_add_followups right");
}
$query = "DELETE
FROM `glpi_profilerights`
WHERE `name` = 'group_add_followups'";
$DB->queryOrDie($query, "0.85 delete group_add_followups right");
// delete observe_ticket for followup
foreach (
$DB->request(
"glpi_profilerights",
"`name` = 'observe_ticket' AND `rights` = '1'"
) as $profrights
) {
$query = "UPDATE `glpi_profilerights`
SET `rights` = `rights` | " . ITILFollowup::SEEPUBLIC . "
WHERE `profiles_id` = '" . $profrights['profiles_id'] . "'
AND `name` = 'followup'";
$DB->queryOrDie($query, "0.85 update followup with observe_ticket right");
}
// don't delete observe_ticket because already use for task
// delete show_full_ticket for followup
foreach (
$DB->request(
"glpi_profilerights",
"`name` = 'show_full_ticket' AND `rights` = '1'"
) as $profrights
) {
$query = "UPDATE `glpi_profilerights`
SET `rights` = `rights` | " . ITILFollowup::SEEPUBLIC . " | " .
ITILFollowup::SEEPRIVATE . "
WHERE `profiles_id` = '" . $profrights['profiles_id'] . "'
AND `name` = 'followup'";
$DB->queryOrDie($query, "0.85 update followup with show_full_ticket right");
}
// don't delete show_full_ticket because already use for task
// delete update_followups
foreach (
$DB->request(
"glpi_profilerights",
"`name` = 'update_followups' AND `rights` = '1'"
) as $profrights
) {
$query = "UPDATE `glpi_profilerights`
SET `rights` = `rights` | " . READ . " | " . ITILFollowup::UPDATEALL . "
WHERE `profiles_id` = '" . $profrights['profiles_id'] . "'
AND `name` = 'followup'";
$DB->queryOrDie($query, "0.85 update followup with update_followups right");
}
$query = "DELETE
FROM `glpi_profilerights`
WHERE `name` = 'update_followups'";
$DB->queryOrDie($query, "0.85 delete update_followups right");
// delete update_own_followups
foreach (
$DB->request(
"glpi_profilerights",
"`name` = 'update_own_followups' AND `rights` = '1'"
) as $profrights
) {
$query = "UPDATE `glpi_profilerights`
SET `rights` = `rights` | " . READ . " | " . ITILFollowup::UPDATEMY . "
WHERE `profiles_id` = '" . $profrights['profiles_id'] . "'
AND `name` = 'followup'";
$DB->queryOrDie($query, "0.85 update followup with update_own_followups right");
}
$query = "DELETE
FROM `glpi_profilerights`
WHERE `name` = 'update_own_followups'";
$DB->queryOrDie($query, "0.85 delete update_own_followups right");
// delete delete_followups
foreach (
$DB->request(
"glpi_profilerights",
"`name` = 'delete_followups' AND `rights` = '1'"
) as $profrights
) {
$query = "UPDATE `glpi_profilerights`
SET `rights` = `rights` | " . PURGE . "
WHERE `profiles_id` = '" . $profrights['profiles_id'] . "'
AND `name` = 'followup'";
$DB->queryOrDie($query, "0.85 update followup with delete_followups right");
}
$query = "DELETE
FROM `glpi_profilerights`
WHERE `name` = 'delete_followups'";
$DB->queryOrDie($query, "0.85 delete delete_followups right");
// pour que la proc??dure soit r??-entrante et ne pas perdre les s??lections dans le profile
if (countElementsInTable("glpi_profilerights", ['name' => 'task']) == 0) {
// rename create_ticket
$query = "UPDATE `glpi_profilerights`
SET `name` = 'task'
WHERE `name` = 'global_add_tasks'";
$DB->queryOrDie($query, "0.85 rename global_add_tasks to task");
$query = "UPDATE `glpi_profilerights`
SET `rights` = " . CommonITILTask::ADDALLITEM . "
WHERE `name` = 'task'
AND `rights` = '1'";
$DB->queryOrDie($query, "0.85 update followup with global_add_tasks right");
}
// delete update_tasks
foreach (
$DB->request(
"glpi_profilerights",
"`name` = 'update_tasks' AND `rights` = '1'"
) as $profrights
) {
$query = "UPDATE `glpi_profilerights`
SET `rights` = `rights` | " . READ . " | " . TicketTask::UPDATEALL . " | " . PURGE . "
WHERE `profiles_id` = '" . $profrights['profiles_id'] . "'
AND `name` = 'task'";
$DB->queryOrDie($query, "0.85 update task with update_tasks right");
}
$query = "DELETE
FROM `glpi_profilerights`
WHERE `name` = 'update_tasks'";
$DB->queryOrDie($query, "0.85 delete update_tasks right");
// delete observe_ticket for task
foreach (
$DB->request(
"glpi_profilerights",
"`name` = 'observe_ticket' AND `rights` = '1'"
) as $profrights
) {
$query = "UPDATE `glpi_profilerights`
SET `rights` = `rights` | " . TicketTask::SEEPUBLIC . "
WHERE `profiles_id` = '" . $profrights['profiles_id'] . "'
AND `name` = 'task'";
$DB->queryOrDie($query, "0.85 update task with observe_ticket right");
}
$query = "DELETE
FROM `glpi_profilerights`
WHERE `name` = 'observe_ticket'";
$DB->queryOrDie($query, "0.85 delete observe_ticket right");
// delete show_full_ticket for task
foreach (
$DB->request(
"glpi_profilerights",
"`name` = 'show_full_ticket' AND `rights` = '1'"
) as $profrights
) {
$query = "UPDATE `glpi_profilerights`
SET `rights` = `rights` | " . TicketTask::SEEPUBLIC . " | " . TicketTask::SEEPRIVATE . "
WHERE `profiles_id` = '" . $profrights['profiles_id'] . "'
AND `name` = 'task'";
$DB->queryOrDie($query, "0.85 update task with show_full_ticket right");
}
$query = "DELETE
FROM `glpi_profilerights`
WHERE `name` = 'show_full_ticket'";
$DB->queryOrDie($query, "0.85 delete show_full_ticket right");
// pour que la proc??dure soit r??-entrante et ne pas perdre les s??lections dans le profile
if (countElementsInTable("glpi_profilerights", ['name' => 'ticketvalidation']) == 0) {
// rename delete_validations
$query = "UPDATE `glpi_profilerights`
SET `name` = 'ticketvalidation'
WHERE `name` = 'delete_validations'";
$DB->queryOrDie($query, "0.85 rename delete_validations to ticketvalidation");
$query = "UPDATE `glpi_profilerights`
SET `rights` = " . DELETE . "
WHERE `name` = 'ticketvalidation'
AND `rights` = '1'";
$DB->queryOrDie($query, "0.85 update ticketvalidation with delete_validations right");
}
// delete create_request_validation
foreach (
$DB->request(
"glpi_profilerights",
"`name` = 'create_request_validation' AND `rights` = '1'"
) as $profrights
) {
$query = "UPDATE `glpi_profilerights`
SET `rights` = `rights` | " . TicketValidation::CREATEREQUEST . " | " . PURGE . "
WHERE `profiles_id` = '" . $profrights['profiles_id'] . "'
AND `name` = 'ticketvalidation'";
$DB->queryOrDie($query, "0.85 update ticketvalidation with create_request_validation right");
}
$query = "DELETE
FROM `glpi_profilerights`
WHERE `name` = 'create_request_validation'";
$DB->queryOrDie($query, "0.85 delete create_request_validation right");
// delete create_incident_validation
foreach (
$DB->request(
"glpi_profilerights",
"`name` = 'create_incident_validation' AND `rights` = '1'"
) as $profrights
) {
$query = "UPDATE `glpi_profilerights`
SET `rights` = `rights` | " . TicketValidation::CREATEINCIDENT . " | " . PURGE . "
WHERE `profiles_id` = '" . $profrights['profiles_id'] . "'
AND `name` = 'ticketvalidation'";
$DB->queryOrDie($query, "0.85 update ticketvalidation with create_incident_validation right");
}
$query = "DELETE
FROM `glpi_profilerights`
WHERE `name` = 'create_incident_validation'";
$DB->queryOrDie($query, "0.85 delete create_incident_validation right");
// delete validate_request
foreach (
$DB->request(
"glpi_profilerights",
"`name` = 'validate_request' AND `rights` = '1'"
) as $profrights
) {
$query = "UPDATE `glpi_profilerights`
SET `rights` = `rights` | " . TicketValidation::VALIDATEREQUEST . "
WHERE `profiles_id` = '" . $profrights['profiles_id'] . "'
AND `name` = 'ticketvalidation'";
$DB->queryOrDie($query, "0.85 update ticketvalidation with validate_request right");
}
$query = "DELETE
FROM `glpi_profilerights`
WHERE `name` = 'validate_request'";
$DB->queryOrDie($query, "0.85 delete validate_request right");
// delete validate_incident
foreach (
$DB->request(
"glpi_profilerights",
"`name` = 'validate_incident' AND `rights` = '1'"
) as $profrights
) {
$query = "UPDATE `glpi_profilerights`
SET `rights` = `rights` | " . TicketValidation::VALIDATEINCIDENT . "
WHERE `profiles_id` = '" . $profrights['profiles_id'] . "'
AND `name` = 'ticketvalidation'";
$DB->queryOrDie($query, "0.85 update ticketvalidation with validate_incident right");
}
$query = "DELETE
FROM `glpi_profilerights`
WHERE `name` = 'validate_incident'";
$DB->queryOrDie($query, "0.85 delete validate_incident right");
// must be done after ticket right
// pour que la proc??dure soit r??-entrante
if (countElementsInTable("glpi_profilerights", ['name' => 'change']) == 0) {
ProfileRight::addProfileRights(['change']);
ProfileRight::updateProfileRightAsOtherRight(
'change',
Change::READMY,
"`name` = 'ticket'
AND `rights` & " . Ticket::OWN
);
ProfileRight::updateProfileRightAsOtherRight(
'change',
Change::READALL,
"`name` = 'ticket'
AND `rights` & " . Ticket::READALL
);
ProfileRight::updateProfileRightAsOtherRight(
'change',
CREATE . " | " . UPDATE . " | " . DELETE . " | " . PURGE,
"`name` = 'ticket' AND `rights` & " . UPDATE
);
}
if (countElementsInTable("glpi_profilerights", ['name' => 'changevalidation']) == 0) {
ProfileRight::addProfileRights(['changevalidation']);
ProfileRight::updateProfileRightAsOtherRight(
'changevalidation',
CREATE,
"`name` = 'ticketvalidation'
AND `rights` & " . TicketValidation::CREATEINCIDENT . "
AND `rights` & " . TicketValidation::CREATEREQUEST
);
ProfileRight::updateProfileRightAsOtherRight(
'changevalidation',
ChangeValidation::VALIDATE,
"`name` = 'ticketvalidation'
AND `rights` & " . TicketValidation::VALIDATEINCIDENT . "
AND `rights` & " . TicketValidation::VALIDATEREQUEST
);
ProfileRight::updateProfileRightAsOtherRight(
'changevalidation',
PURGE,
"`name` = 'ticketvalidation'
AND `rights` & " . PURGE
);
}
// pour que la proc??dure soit r??-entrante et ne pas perdre les s??lections dans le profile
if (countElementsInTable("glpi_profilerights", ['name' => 'planning']) == 0) {
// rename show_planning
$query = "UPDATE `glpi_profilerights`
SET `name` = 'planning'
WHERE `name` = 'show_planning'";
$DB->queryOrDie($query, "0.85 rename show_planning to planning");
// READMY = 1 => do update needed
}
// delete show_group_planning
foreach (
$DB->request(
"glpi_profilerights",
"`name` = 'show_group_planning' AND `rights` = '1'"
) as $profrights
) {
$query = "UPDATE `glpi_profilerights`
SET `rights` = `rights` | " . Planning::READGROUP . "
WHERE `profiles_id` = '" . $profrights['profiles_id'] . "'
AND `name` = 'planning'";
$DB->queryOrDie($query, "0.85 update planning with show_group_planning right");
}
$query = "DELETE
FROM `glpi_profilerights`
WHERE `name` = 'show_group_planning'";
$DB->queryOrDie($query, "0.85 delete show_group_planning right");
// delete show_all_planning
foreach (
$DB->request(
"glpi_profilerights",
"`name` = 'show_all_planning' AND `rights` = '1'"
) as $profrights
) {
$query = "UPDATE `glpi_profilerights`
SET `rights` = `rights` | " . Planning::READALL . "
WHERE `profiles_id` = '" . $profrights['profiles_id'] . "'
AND `name` = 'planning'";
$DB->queryOrDie($query, "0.85 update planning with show_all_planning right");
}
$query = "DELETE
FROM `glpi_profilerights`
WHERE `name` = 'show_all_planning'";
$DB->queryOrDie($query, "0.85 delete show_all_planning right");
// pour que la proc??dure soit r??-entrante et ne pas perdre les s??lections dans le profile
if (countElementsInTable("glpi_profilerights", ['name' => 'problem']) == 0) {
// rename show_my_problem
$query = "UPDATE `glpi_profilerights`
SET `name` = 'problem'
WHERE `name` = 'show_my_problem'";
$DB->queryOrDie($query, "0.85 rename show_my_problem to problem");
// READMY = 1 => do update needed
}
// delete show_all_problem
foreach (
$DB->request(
"glpi_profilerights",
"`name` = 'show_all_problem' AND `rights` = '1'"
) as $profrights
) {
$query = "UPDATE `glpi_profilerights`
SET `rights` = `rights` | " . Problem::READALL . "
WHERE `profiles_id` = '" . $profrights['profiles_id'] . "'
AND `name` = 'problem'";
$DB->queryOrDie($query, "0.85 update problem with show_all_problem right");
}
$query = "DELETE
FROM `glpi_profilerights`
WHERE `name` = 'show_all_problem'";
$DB->queryOrDie($query, "0.85 delete show_all_problem right");
// delete edit_all_problem
foreach (
$DB->request(
"glpi_profilerights",
"`name` = 'edit_all_problem' AND `rights` = '1'"
) as $profrights
) {
$query = "UPDATE `glpi_profilerights`
SET `rights` = `rights` | " . CREATE . " | " . UPDATE . " | " . PURGE . "
WHERE `profiles_id` = '" . $profrights['profiles_id'] . "'
AND `name` = 'problem'";
$DB->queryOrDie($query, "0.85 update problem with edit_all_problem right");
}
$query = "DELETE
FROM `glpi_profilerights`
WHERE `name` = 'edit_all_problem'";
$DB->queryOrDie($query, "0.85 delete edit_all_problem right");
// delete delete_problem
foreach (
$DB->request(
"glpi_profilerights",
"`name` = 'delete_problem' AND `rights` = '1'"
) as $profrights
) {
$query = "UPDATE `glpi_profilerights`
SET `rights` = `rights` | " . DELETE . "
WHERE `profiles_id` = '" . $profrights['profiles_id'] . "'
AND `name` = 'problem'";
$DB->queryOrDie($query, "0.85 update problem with delete_problem");
}
$query = "DELETE
FROM `glpi_profilerights`
WHERE `name` = 'delete_problem'";
$DB->queryOrDie($query, "0.85 delete problem right");
// update search_config
foreach (
$DB->request(
"glpi_profilerights",
"`name` = 'search_config' AND `rights` = '" . ALLSTANDARDRIGHT . "'"
) as $profrights
) {
$query = "UPDATE `glpi_profilerights`
SET `rights` = `rights` | " . DisplayPreference::PERSONAL . "
WHERE `profiles_id` = '" . $profrights['profiles_id'] . "'
AND `name` = 'search_config'";
$DB->queryOrDie($query, "0.85 update search_config with search_config");
}
// delete search_config_global
foreach (
$DB->request(
"glpi_profilerights",
"`name` = 'search_config_global' AND `rights` = '" . ALLSTANDARDRIGHT . "'"
) as $profrights
) {
$query = "UPDATE `glpi_profilerights`
SET `rights` = `rights` | " . DisplayPreference::GENERAL . "
WHERE `profiles_id` = '" . $profrights['profiles_id'] . "'
AND `name` = 'search_config'";
$DB->queryOrDie($query, "0.85 update search_config with search_config_global");
}
$query = "DELETE
FROM `glpi_profilerights`
WHERE `name` = 'search_config_global'";
$DB->queryOrDie($query, "0.85 delete search_config_global right");
// delete check_update
foreach (
$DB->request(
"glpi_profilerights",
"`name` = 'check_update' AND `rights` = '1'"
) as $profrights
) {
$query = "UPDATE `glpi_profilerights`
SET `rights` = `rights` | " . 1024 /*Backup::CHECKUPDATE*/ . "
WHERE `profiles_id` = '" . $profrights['profiles_id'] . "'
AND `name` = 'backup'";
$DB->queryOrDie($query, "0.85 update backup with check_update");
}
$query = "DELETE
FROM `glpi_profilerights`
WHERE `name` = 'check_update'";
$DB->queryOrDie($query, "0.85 delete check_update right");
// entity_dropdown => right by object
// pour que la proc??dure soit r??-entrante et ne pas perdre les s??lections dans le profile
if (countElementsInTable("glpi_profilerights", ['name' => 'domain']) == 0) {
ProfileRight::addProfileRights(['domain']);
ProfileRight::updateProfileRightsAsOtherRights('domain', 'entity_dropdown');
}
if (countElementsInTable("glpi_profilerights", ['name' => 'location']) == 0) {
ProfileRight::addProfileRights(['location']);
ProfileRight::updateProfileRightsAsOtherRights('location', 'entity_dropdown');
}
if (countElementsInTable("glpi_profilerights", ['name' => 'itilcategory']) == 0) {
ProfileRight::addProfileRights(['itilcategory']);
ProfileRight::updateProfileRightsAsOtherRights('itilcategory', 'entity_dropdown');
}
if (countElementsInTable("glpi_profilerights", ['name' => 'knowbasecategory']) == 0) {
ProfileRight::addProfileRights(['knowbasecategory']);
ProfileRight::updateProfileRightsAsOtherRights('knowbasecategory', 'entity_dropdown');
}
if (countElementsInTable("glpi_profilerights", ['name' => 'netpoint']) == 0) {
ProfileRight::addProfileRights(['netpoint']);
ProfileRight::updateProfileRightsAsOtherRights('netpoint', 'entity_dropdown');
}
if (countElementsInTable("glpi_profilerights", ['name' => 'taskcategory']) == 0) {
ProfileRight::addProfileRights(['taskcategory']);
ProfileRight::updateProfileRightsAsOtherRights('taskcategory', 'entity_dropdown');
}
if (countElementsInTable("glpi_profilerights", ['name' => 'state']) == 0) {
ProfileRight::addProfileRights(['state']);
ProfileRight::updateProfileRightsAsOtherRights('state', 'entity_dropdown');
}
if (countElementsInTable("glpi_profilerights", ['name' => 'solutiontemplate']) == 0) {
ProfileRight::addProfileRights(['solutiontemplate']);
ProfileRight::updateProfileRightsAsOtherRights('solutiontemplate', 'entity_dropdown');
}
$query = "DELETE
FROM `glpi_profilerights`
WHERE `name` = 'entity_dropdown'";
$DB->queryOrDie($query, "0.85 delete entity_dropdown right");
// delete notes
$tables = ['budget', 'cartridge', 'change','computer', 'consumable', 'contact_enterprise',
'contract', 'document', 'entity', 'monitor', 'networking', 'peripheral',
'phone', 'printer', 'problem', 'software'
];
foreach (
$DB->request(
"glpi_profilerights",
"`name` = 'notes' AND `rights` = '1'"
) as $profrights
) {
foreach ($tables as $table) {
$query = "UPDATE `glpi_profilerights`
SET `rights` = `rights` | " . READNOTE . "
WHERE `profiles_id` = '" . $profrights['profiles_id'] . "'
AND `name` = '$table'";
$DB->queryOrDie($query, "0.85 update $table with read notes right");
}
}
foreach (
$DB->request(
"glpi_profilerights",
"`name` = 'notes' AND `rights` = '" . ALLSTANDARDRIGHT . "'"
) as $profrights
) {
foreach ($tables as $table) {
$query = "UPDATE `glpi_profilerights`
SET `rights` = `rights` | " . READNOTE . " | " . UPDATENOTE . "
WHERE `profiles_id` = '" . $profrights['profiles_id'] . "'
AND `name` = '$table'";
$DB->queryOrDie($query, "0.85 update $table with update notes right");
}
}
$query = "DELETE
FROM `glpi_profilerights`
WHERE `name` = 'notes'";
$DB->queryOrDie($query, "0.85 delete notes right");
$DELFROMDISPLAYPREF['Profile'] = [29, 35, 37, 43, 53, 54, 57, 65, 66, 67, 68, 69, 70, 71,
72, 73, 74, 75, 76, 77, 78, 80, 81, 88, 93, 94, 95, 96,
97, 98, 99, 104, 113, 114, 116, 117, 121, 122, 123
];
$migration->displayMessage('Update for mailqueue');
if (!$DB->tableExists('glpi_queuedmails')) {
$query = "CREATE TABLE `glpi_queuedmails` (
`id` int NOT NULL AUTO_INCREMENT,
`itemtype` varchar(100) default NULL,
`items_id` int NOT NULL DEFAULT '0',
`notificationtemplates_id` int NOT NULL DEFAULT '0',
`entities_id` int NOT NULL DEFAULT '0',
`is_deleted` tinyint NOT NULL DEFAULT '0',
`sent_try` int NOT NULL DEFAULT '0',
`create_time` datetime DEFAULT NULL,
`send_time` datetime DEFAULT NULL,
`sent_time` datetime DEFAULT NULL,
`name` TEXT DEFAULT NULL,
`sender` TEXT DEFAULT NULL,
`sendername` TEXT DEFAULT NULL,
`recipient` TEXT DEFAULT NULL,
`recipientname` TEXT DEFAULT NULL,
`replyto` TEXT DEFAULT NULL,
`replytoname` TEXT DEFAULT NULL,
`headers` TEXT DEFAULT NULL,
`body_html` LONGTEXT DEFAULT NULL,
`body_text` LONGTEXT DEFAULT NULL,
`messageid` TEXT DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `item` (`itemtype`,`items_id`, `notificationtemplates_id`),
KEY `is_deleted` (`is_deleted`),
KEY `entities_id` (`entities_id`),
KEY `sent_try` (`sent_try`),
KEY `create_time` (`create_time`),
KEY `send_time` (`send_time`),
KEY `sent_time` (`sent_time`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci";
$DB->queryOrDie($query, "0.85 add glpi_queuedmails");
$ADDTODISPLAYPREF['QueueMail'] = [16, 7, 20, 21, 22, 15];
}
if (
!countElementsInTable(
'glpi_crontasks',
['itemtype' => 'QueuedMail', 'name' => 'queuedmail']
)
) {
$query = "INSERT INTO `glpi_crontasks`
(`itemtype`, `name`, `frequency`, `param`, `state`, `mode`, `allowmode`,
`hourmin`, `hourmax`, `logs_lifetime`, `lastrun`, `lastcode`, `comment`)
VALUES ('QueuedMail', 'queuedmail', 60, 50, 1, 1, 3,
0, 24, 30, NULL, NULL, NULL)";
$DB->queryOrDie($query, "0.85 populate glpi_crontasks for queuemail");
}
if (
!countElementsInTable(
'glpi_crontasks',
['itemtype' => 'QueuedMail', 'name' => 'queuedmailclean']
)
) {
$query = "INSERT INTO `glpi_crontasks`
(`itemtype`, `name`, `frequency`, `param`, `state`, `mode`, `allowmode`,
`hourmin`, `hourmax`, `logs_lifetime`, `lastrun`, `lastcode`, `comment`)
VALUES ('QueuedMail', 'queuedmailclean', 86400, 30, 1, 1, 3,
0, 24, 30, NULL, NULL, NULL)";
$DB->queryOrDie($query, "0.85 populate glpi_crontasks for queuemail");
}
if (
!countElementsInTable(
'glpi_crontasks',
['itemtype' => 'Crontask', 'name' => 'temp']
)
) {
$query = "INSERT INTO `glpi_crontasks`
(`itemtype`, `name`, `frequency`, `param`, `state`, `mode`, `allowmode`,
`hourmin`, `hourmax`, `logs_lifetime`, `lastrun`, `lastcode`, `comment`)
VALUES ('Crontask', 'temp', 3600, NULL, 1, 1, 3,
0, 24, 30, NULL, NULL, NULL)";
$DB->queryOrDie($query, "0.85 populate glpi_crontasks for clean temporary files");
}
if (
$migration->addField(
"glpi_entities",
"delay_send_emails",
"integer",
['value' => -2]
)
) {
$migration->migrationOneTable('glpi_entities');
// Set directly to root entity
$query = 'UPDATE `glpi_entities`
SET `delay_send_emails` = 0
WHERE `id` = 0';
$DB->queryOrDie($query, "0.85 default value for delay_send_emails for root entity");
}
// pour que la proc??dure soit r??-entrante
if (countElementsInTable("glpi_profilerights", ['name' => 'queuedmail']) == 0) {
ProfileRight::addProfileRights(['queuedmail']);
ProfileRight::updateProfileRightsAsOtherRights('queuedmail', 'notification');
}
$migration->displayMessage(sprintf(__('Change of the database layout - %s'), 'Change'));
// changes management
if (!$DB->tableExists('glpi_changes')) {
$query = "CREATE TABLE `glpi_changes` (
`id` int NOT NULL AUTO_INCREMENT,
`name` varchar(255) DEFAULT NULL,
`entities_id` int NOT NULL DEFAULT '0',
`is_recursive` tinyint NOT NULL DEFAULT '0',
`is_deleted` tinyint NOT NULL DEFAULT '0',
`status` int NOT NULL DEFAULT '1',
`content` longtext DEFAULT NULL,
`date_mod` DATETIME DEFAULT NULL,
`date` DATETIME DEFAULT NULL,
`solvedate` DATETIME DEFAULT NULL,
`closedate` DATETIME DEFAULT NULL,
`due_date` DATETIME DEFAULT NULL,
`users_id_recipient` int NOT NULL DEFAULT '0',
`users_id_lastupdater` int NOT NULL DEFAULT '0',
`urgency` int NOT NULL DEFAULT '1',
`impact` int NOT NULL DEFAULT '1',
`priority` int NOT NULL DEFAULT '1',
`itilcategories_id` int NOT NULL DEFAULT '0',
`impactcontent` longtext DEFAULT NULL,
`controlistcontent` longtext DEFAULT NULL,
`rolloutplancontent` longtext DEFAULT NULL,
`backoutplancontent` longtext DEFAULT NULL,
`checklistcontent` longtext DEFAULT NULL,
`global_validation` varchar(255) COLLATE utf8_unicode_ci DEFAULT 'none',
`validation_percent` int NOT NULL DEFAULT '0',
`solutiontypes_id` int NOT NULL DEFAULT '0',
`solution` text COLLATE utf8_unicode_ci,
`actiontime` int NOT NULL DEFAULT '0',
`begin_waiting_date` datetime DEFAULT NULL,
`waiting_duration` int NOT NULL DEFAULT '0',
`close_delay_stat` int NOT NULL DEFAULT '0',
`solve_delay_stat` int NOT NULL DEFAULT '0',
`notepad` LONGTEXT NULL,
PRIMARY KEY (`id`),
KEY `name` (`name`),
KEY `entities_id` (`entities_id`),
KEY `is_recursive` (`is_recursive`),
KEY `is_deleted` (`is_deleted`),
KEY `date` (`date`),
KEY `closedate` (`closedate`),
KEY `status` (`status`),
KEY `priority` (`priority`),
KEY `date_mod` (`date_mod`),
KEY `itilcategories_id` (`itilcategories_id`),
KEY `users_id_recipient` (`users_id_recipient`),
KEY `solvedate` (`solvedate`),
KEY `solutiontypes_id` (`solutiontypes_id`),
KEY `urgency` (`urgency`),
KEY `impact` (`impact`),
KEY `due_date` (`due_date`),
KEY `global_validation` (`global_validation`),
KEY `users_id_lastupdater` (`users_id_lastupdater`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci";
$DB->queryOrDie($query, "0.85 create glpi_changes");
}
$migration->addField('glpi_itilcategories', 'is_change', 'bool', ['value' => 1]);
$migration->addKey('glpi_itilcategories', 'is_change');
if (!$DB->tableExists('glpi_changes_users')) {
$query = "CREATE TABLE `glpi_changes_users` (
`id` int NOT NULL AUTO_INCREMENT,
`changes_id` int NOT NULL DEFAULT '0',
`users_id` int NOT NULL DEFAULT '0',
`type` int NOT NULL DEFAULT '1',
`use_notification` tinyint NOT NULL DEFAULT '0',
`alternative_email` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `unicity` (`changes_id`,`type`,`users_id`,`alternative_email`),
KEY `user` (`users_id`,`type`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci";
$DB->queryOrDie($query, "0.85 add table glpi_changes_users");
}
if (!$DB->tableExists('glpi_changes_groups')) {
$query = "CREATE TABLE `glpi_changes_groups` (
`id` int NOT NULL AUTO_INCREMENT,
`changes_id` int NOT NULL DEFAULT '0',
`groups_id` int NOT NULL DEFAULT '0',
`type` int NOT NULL DEFAULT '1',
PRIMARY KEY (`id`),
UNIQUE KEY `unicity` (`changes_id`,`type`,`groups_id`),
KEY `group` (`groups_id`,`type`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci";
$DB->queryOrDie($query, "0.85 add table glpi_changes_groups");
}
if (!$DB->tableExists('glpi_changes_suppliers')) {
$query = "CREATE TABLE `glpi_changes_suppliers` (
`id` int NOT NULL AUTO_INCREMENT,
`changes_id` int NOT NULL DEFAULT '0',
`suppliers_id` int NOT NULL DEFAULT '0',
`type` int NOT NULL DEFAULT '1',
PRIMARY KEY (`id`),
UNIQUE KEY `unicity` (`changes_id`,`type`,`suppliers_id`),
KEY `group` (`suppliers_id`,`type`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci";
$DB->queryOrDie($query, "0.85 add table glpi_changes_suppliers");
}
if (!$DB->tableExists('glpi_changes_items')) {
$query = "CREATE TABLE `glpi_changes_items` (
`id` int NOT NULL AUTO_INCREMENT,
`changes_id` int NOT NULL DEFAULT '0',
`itemtype` varchar(100) default NULL,
`items_id` int NOT NULL DEFAULT '0',
PRIMARY KEY (`id`),
UNIQUE KEY `unicity` (`changes_id`,`itemtype`,`items_id`),
KEY `item` (`itemtype`,`items_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci";
$DB->queryOrDie($query, "0.85 add table glpi_changes_items");
}
if (!$DB->tableExists('glpi_changes_tickets')) {
$query = "CREATE TABLE `glpi_changes_tickets` (
`id` int NOT NULL AUTO_INCREMENT,
`changes_id` int NOT NULL DEFAULT '0',
`tickets_id` int NOT NULL DEFAULT '0',
PRIMARY KEY (`id`),
UNIQUE KEY `unicity` (`changes_id`,`tickets_id`),
KEY `tickets_id` (`tickets_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci";
$DB->queryOrDie($query, "0.85 add table glpi_changes_tickets");
}
if (!$DB->tableExists('glpi_changes_problems')) {
$query = "CREATE TABLE `glpi_changes_problems` (
`id` int NOT NULL AUTO_INCREMENT,
`changes_id` int NOT NULL DEFAULT '0',
`problems_id` int NOT NULL DEFAULT '0',
PRIMARY KEY (`id`),
UNIQUE KEY `unicity` (`changes_id`,`problems_id`),
KEY `problems_id` (`problems_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci";
$DB->queryOrDie($query, "0.85 add table glpi_changes_problems");
}
if (!$DB->tableExists('glpi_changetasks')) {
$query = "CREATE TABLE `glpi_changetasks` (
`id` int NOT NULL AUTO_INCREMENT,
`changes_id` int NOT NULL DEFAULT '0',
`taskcategories_id` int NOT NULL DEFAULT '0',
`state` int NOT NULL DEFAULT '0',
`date` datetime DEFAULT NULL,
`begin` datetime DEFAULT NULL,
`end` datetime DEFAULT NULL,
`users_id` int NOT NULL DEFAULT '0',
`users_id_tech` int NOT NULL DEFAULT '0',
`content` longtext COLLATE utf8_unicode_ci,
`actiontime` int NOT NULL DEFAULT '0',
PRIMARY KEY (`id`),
KEY `changes_id` (`changes_id`),
KEY `state` (`state`),
KEY `users_id` (`users_id`),
KEY `users_id_tech` (`users_id_tech`),
KEY `date` (`date`),
KEY `begin` (`begin`),
KEY `end` (`end`),
KEY `taskcategories_id` (taskcategories_id)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci";
$DB->queryOrDie($query, "0.85 add table glpi_changetasks");
}
if (!$DB->tableExists('glpi_changecosts')) {
$query = "CREATE TABLE `glpi_changecosts` (
`id` int NOT NULL AUTO_INCREMENT,
`changes_id` int NOT NULL DEFAULT '0',
`name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
`comment` text COLLATE utf8_unicode_ci,
`begin_date` date DEFAULT NULL,
`end_date` date DEFAULT NULL,
`actiontime` int NOT NULL DEFAULT '0',
`cost_time` decimal(20,4) NOT NULL DEFAULT '0.0000',
`cost_fixed` decimal(20,4) NOT NULL DEFAULT '0.0000',
`cost_material` decimal(20,4) NOT NULL DEFAULT '0.0000',
`budgets_id` int NOT NULL DEFAULT '0',
`entities_id` int NOT NULL DEFAULT '0',
`is_recursive` tinyint NOT NULL DEFAULT '0',
PRIMARY KEY (`id`),
KEY `name` (`name`),
KEY `changes_id` (`changes_id`),
KEY `begin_date` (`begin_date`),
KEY `end_date` (`end_date`),
KEY `entities_id` (`entities_id`),
KEY `is_recursive` (`is_recursive`),
KEY `budgets_id` (`budgets_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;";
$DB->queryOrDie($query, "0.85 add table glpi_changecosts");
}
if (!$DB->tableExists('glpi_changevalidations')) {
$query = "CREATE TABLE `glpi_changevalidations` (
`id` int NOT NULL AUTO_INCREMENT,
`entities_id` int NOT NULL DEFAULT '0',
`is_recursive` tinyint NOT NULL DEFAULT '0',
`users_id` int NOT NULL DEFAULT '0',
`changes_id` int NOT NULL DEFAULT '0',
`users_id_validate` int NOT NULL DEFAULT '0',
`comment_submission` text COLLATE utf8_unicode_ci,
`comment_validation` text COLLATE utf8_unicode_ci,
`status` int NOT NULL DEFAULT '2',
`submission_date` datetime DEFAULT NULL,
`validation_date` datetime DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `entities_id` (`entities_id`),
KEY `is_recursive` (`is_recursive`),
KEY `users_id` (`users_id`),
KEY `users_id_validate` (`users_id_validate`),
KEY `changes_id` (`changes_id`),
KEY `submission_date` (`submission_date`),
KEY `validation_date` (`validation_date`),
KEY `status` (`status`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;";
$DB->queryOrDie($query, "0.85 add table glpi_changevalidations");
}
// Change notifications
$query = "SELECT *
FROM `glpi_notificationtemplates`
WHERE `itemtype` = 'Change'";
if ($result = $DB->query($query)) {
if ($DB->numrows($result) == 0) {
$query = "INSERT INTO `glpi_notificationtemplates`
(`name`, `itemtype`, `date_mod`)
VALUES ('Changes', 'Change', NOW())";
$DB->queryOrDie($query, "0.85 add change notification");
$notid = $DB->insertId();
$query = "INSERT INTO `glpi_notificationtemplatetranslations`
(`notificationtemplates_id`, `language`, `subject`,
`content_text`,
`content_html`)
VALUES ($notid, '', '##change.action## ##change.title##',
'##IFchange.storestatus=5##
##lang.change.url## : ##change.urlapprove##
##lang.change.solvedate## : ##change.solvedate##
##lang.change.solution.type## : ##change.solution.type##
##lang.change.solution.description## : ##change.solution.description## ##ENDIFchange.storestatus##
##ELSEchange.storestatus## ##lang.change.url## : ##change.url## ##ENDELSEchange.storestatus##
##lang.change.description##
##lang.change.title## :##change.title##
##lang.change.authors## :##IFchange.authors## ##change.authors## ##ENDIFchange.authors## ##ELSEchange.authors##--##ENDELSEchange.authors##
##lang.change.creationdate## :##change.creationdate##
##IFchange.assigntousers## ##lang.change.assigntousers## : ##change.assigntousers## ##ENDIFchange.assigntousers##
##lang.change.status## : ##change.status##
##IFchange.assigntogroups## ##lang.change.assigntogroups## : ##change.assigntogroups## ##ENDIFchange.assigntogroups##
##lang.change.urgency## : ##change.urgency##
##lang.change.impact## : ##change.impact##
##lang.change.priority## : ##change.priority##
##IFchange.category## ##lang.change.category## :##change.category## ##ENDIFchange.category## ##ELSEchange.category## ##lang.change.nocategoryassigned## ##ENDELSEchange.category##
##lang.change.content## : ##change.content##
##IFchange.storestatus=6##
##lang.change.solvedate## : ##change.solvedate##
##lang.change.solution.type## : ##change.solution.type##
##lang.change.solution.description## : ##change.solution.description##
##ENDIFchange.storestatus##
##lang.change.numberofproblems## : ##change.numberofproblems##
##FOREACHproblems##
[##problem.date##] ##lang.change.title## : ##problem.title##
##lang.change.content## ##problem.content##
##ENDFOREACHproblems##
##lang.change.numberoftasks## : ##change.numberoftasks##
##FOREACHtasks##
[##task.date##]
##lang.task.author## ##task.author##
##lang.task.description## ##task.description##
##lang.task.time## ##task.time##
##lang.task.category## ##task.category##
##ENDFOREACHtasks##
',
'<p>##IFchange.storestatus=5##</p>
<div>##lang.change.url## : <a href=\"##change.urlapprove##\">##change.urlapprove##</a></div>
<div><span style=\"color: #888888;\"><strong><span style=\"text-decoration: underline;\">##lang.change.solvedate##</span></strong></span> : ##change.solvedate##<br /><span style=\"text-decoration: underline; color: #888888;\"><strong>##lang.change.solution.type##</strong></span> : ##change.solution.type##<br /><span style=\"text-decoration: underline; color: #888888;\"><strong>##lang.change.solution.description##</strong></span> : ##change.solution.description## ##ENDIFchange.storestatus##</div>
<div>##ELSEchange.storestatus## ##lang.change.url## : <a href=\"##change.url##\">##change.url##</a> ##ENDELSEchange.storestatus##</div>
<p class=\"description b\"><strong>##lang.change.description##</strong></p>
<p><span style=\"color: #8b8c8f; font-weight: bold; text-decoration: underline;\"> ##lang.change.title##</span> :##change.title## <br /> <span style=\"color: #8b8c8f; font-weight: bold; text-decoration: underline;\"> ##lang.change.authors##</span> :##IFchange.authors## ##change.authors## ##ENDIFchange.authors## ##ELSEchange.authors##--##ENDELSEchange.authors## <br /> <span style=\"color: #8b8c8f; font-weight: bold; text-decoration: underline;\"> ##lang.change.creationdate##</span> :##change.creationdate## <br /> ##IFchange.assigntousers## <span style=\"color: #8b8c8f; font-weight: bold; text-decoration: underline;\"> ##lang.change.assigntousers##</span> : ##change.assigntousers## ##ENDIFchange.assigntousers##<br /> <span style=\"color: #8b8c8f; font-weight: bold; text-decoration: underline;\">##lang.change.status## </span> : ##change.status##<br /> ##IFchange.assigntogroups## <span style=\"color: #8b8c8f; font-weight: bold; text-decoration: underline;\"> ##lang.change.assigntogroups##</span> : ##change.assigntogroups## ##ENDIFchange.assigntogroups##<br /> <span style=\"color: #8b8c8f; font-weight: bold; text-decoration: underline;\"> ##lang.change.urgency##</span> : ##change.urgency##<br /> <span style=\"color: #8b8c8f; font-weight: bold; text-decoration: underline;\"> ##lang.change.impact##</span> : ##change.impact##<br /> <span style=\"color: #8b8c8f; font-weight: bold; text-decoration: underline;\"> ##lang.change.priority##</span> : ##change.priority## <br />##IFchange.category##<span style=\"color: #8b8c8f; font-weight: bold; text-decoration: underline;\">##lang.change.category## </span> :##change.category## ##ENDIFchange.category## ##ELSEchange.category## ##lang.change.nocategoryassigned## ##ENDELSEchange.category## <br /> <span style=\"color: #8b8c8f; font-weight: bold; text-decoration: underline;\"> ##lang.change.content##</span> : ##change.content##</p>
<p>##IFchange.storestatus=6##<br /><span style=\"text-decoration: underline;\"><strong><span style=\"color: #888888;\">##lang.change.solvedate##</span></strong></span> : ##change.solvedate##<br /><span style=\"color: #888888;\"><strong><span style=\"text-decoration: underline;\">##lang.change.solution.type##</span></strong></span> : ##change.solution.type##<br /><span style=\"text-decoration: underline; color: #888888;\"><strong>##lang.change.solution.description##</strong></span> : ##change.solution.description##<br />##ENDIFchange.storestatus##</p>
<div class=\"description b\">##lang.change.numberofproblems## : ##change.numberofproblems##</div>
<p>##FOREACHproblems##</p>
<div><strong> [##problem.date##] <em>##lang.change.title## : <a href=\"##problem.url##\">##problem.title## </a></em></strong><br /> <span style=\"color: #8b8c8f; font-weight: bold; text-decoration: underline;\"> </span><span style=\"color: #8b8c8f; font-weight: bold; text-decoration: underline;\">##lang.change.content## </span> ##problem.content##
<p>##ENDFOREACHproblems##</p>
<div class=\"description b\">##lang.change.numberoftasks## : ##change.numberoftasks##</div>
<p>##FOREACHtasks##</p>
<div class=\"description b\"><strong>[##task.date##] </strong><br /> <span style=\"color: #8b8c8f; font-weight: bold; text-decoration: underline;\"> ##lang.task.author##</span> ##task.author##<br /> <span style=\"color: #8b8c8f; font-weight: bold; text-decoration: underline;\"> ##lang.task.description##</span> ##task.description##<br /> <span style=\"color: #8b8c8f; font-weight: bold; text-decoration: underline;\"> ##lang.task.time##</span> ##task.time##<br /> <span style=\"color: #8b8c8f; font-weight: bold; text-decoration: underline;\"> ##lang.task.category##</span> ##task.category##</div>
<p>##ENDFOREACHtasks##</p>
</div>')";
$DB->queryOrDie($query, "0.85 add change notification translation");
$notifications = ['new' => [],
'update' => [Notification::ASSIGN_TECH,
Notification::OLD_TECH_IN_CHARGE
],
'solved' => [],
'add_task' => [],
'update_task' => [],
'delete_task' => [],
'closed' => [],
'delete' => []
];
$notif_names = ['new' => 'New Change',
'update' => 'Update Change',
'solved' => 'Resolve Change',
'add_task' => 'Add Task',
'update_task' => 'Update Task',
'delete_task' => 'Delete Task',
'closed' => 'Close Change',
'delete' => 'Delete Change'
];
foreach ($notifications as $key => $val) {
$notifications[$key][] = Notification::AUTHOR;
$notifications[$key][] = Notification::GLOBAL_ADMINISTRATOR;
$notifications[$key][] = Notification::OBSERVER;
}
foreach ($notifications as $type => $targets) {
$query = "INSERT INTO `glpi_notifications`
(`name`, `entities_id`, `itemtype`, `event`, `mode`,
`notificationtemplates_id`, `comment`, `is_recursive`, `is_active`,
`date_mod`)
VALUES ('" . $notif_names[$type] . "', 0, 'Change', '$type', 'mail',
$notid, '', 1, 1, NOW())";
$DB->queryOrDie($query, "0.85 add change $type notification");
$notifid = $DB->insertId();
foreach ($targets as $target) {
$query = "INSERT INTO `glpi_notificationtargets`
(`id`, `notifications_id`, `type`, `items_id`)
VALUES (NULL, $notifid, " . Notification::USER_TYPE . ", $target);";
$DB->queryOrDie($query, "0.85 add change $type notification target");
}
}
}
}
$ADDTODISPLAYPREF['Change'] = [12,19,15,7,18];
$migration->addField(
'glpi_profiles',
'change_status',
"text",
['comment' => "json encoded array of from/dest allowed status change"]
);
// Add problem costs
if (!$DB->tableExists('glpi_problemcosts')) {
$query = "CREATE TABLE `glpi_problemcosts` (
`id` int NOT NULL AUTO_INCREMENT,
`problems_id` int NOT NULL DEFAULT '0',
`name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
`comment` text COLLATE utf8_unicode_ci,
`begin_date` date DEFAULT NULL,
`end_date` date DEFAULT NULL,
`actiontime` int NOT NULL DEFAULT '0',
`cost_time` decimal(20,4) NOT NULL DEFAULT '0.0000',
`cost_fixed` decimal(20,4) NOT NULL DEFAULT '0.0000',
`cost_material` decimal(20,4) NOT NULL DEFAULT '0.0000',
`budgets_id` int NOT NULL DEFAULT '0',
`entities_id` int NOT NULL DEFAULT '0',
PRIMARY KEY (`id`),
KEY `name` (`name`),
KEY `problems_id` (`problems_id`),
KEY `begin_date` (`begin_date`),
KEY `end_date` (`end_date`),
KEY `entities_id` (`entities_id`),
KEY `budgets_id` (`budgets_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;";
$DB->queryOrDie($query, "0.85 add table glpi_problemcosts");
}
$migration->displayMessage(sprintf(__('Data migration - %s'), 'drop rules cache'));
$migration->dropTable('glpi_rulecachecomputermodels');
$migration->dropTable('glpi_rulecachecomputertypes');
$migration->dropTable('glpi_rulecachemanufacturers');
$migration->dropTable('glpi_rulecachemonitormodels');
$migration->dropTable('glpi_rulecachemonitortypes');
$migration->dropTable('glpi_rulecachenetworkequipmentmodels');
$migration->dropTable('glpi_rulecachenetworkequipmenttypes');
$migration->dropTable('glpi_rulecacheoperatingsystems');
$migration->dropTable('glpi_rulecacheoperatingsystemservicepacks');
$migration->dropTable('glpi_rulecacheoperatingsystemversions');
$migration->dropTable('glpi_rulecacheperipheralmodels');
$migration->dropTable('glpi_rulecacheperipheraltypes');
$migration->dropTable('glpi_rulecachephonemodels');
$migration->dropTable('glpi_rulecachephonetypes');
$migration->dropTable('glpi_rulecacheprintermodels');
$migration->dropTable('glpi_rulecacheprinters');
$migration->dropTable('glpi_rulecacheprintertypes');
$migration->dropTable('glpi_rulecachesoftwares');
$migration->displayMessage(sprintf(__('Data migration - %s'), 'glpi_rules'));
$migration->addField("glpi_rules", 'uuid', "string");
$migration->addField("glpi_slalevels", 'uuid', "string");
$migration->migrationOneTable('glpi_rules');
$migration->migrationOneTable('glpi_slalevels');
// Dropdown translations
$migration->displayMessage(sprintf(__('Data migration - %s'), 'glpi_knowbaseitemtranslations'));
Config::setConfigurationValues('core', ['translate_kb' => 0]);
if (!$DB->tableExists("glpi_knowbaseitemtranslations")) {
$query = "CREATE TABLE IF NOT EXISTS `glpi_knowbaseitemtranslations` (
`id` int NOT NULL AUTO_INCREMENT,
`knowbaseitems_id` int NOT NULL DEFAULT '0',
`language` varchar(5) COLLATE utf8_unicode_ci DEFAULT NULL,
`name` text COLLATE utf8_unicode_ci,
`answer` longtext COLLATE utf8_unicode_ci,
PRIMARY KEY (`id`),
KEY `item` (`knowbaseitems_id`, `language`),
FULLTEXT KEY `fulltext` (`name`,`answer`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;";
$DB->queryOrDie($query, "0.85 add table glpi_knowbaseitemtranslations");
}
// kb translations
$migration->displayMessage(sprintf(__('Data migration - %s'), 'glpi_dropdowntranslations'));
Config::setConfigurationValues('core', ['translate_dropdowns' => 0]);
if (!$DB->tableExists("glpi_dropdowntranslations")) {
$query = "CREATE TABLE IF NOT EXISTS `glpi_dropdowntranslations` (
`id` int NOT NULL AUTO_INCREMENT,
`items_id` int NOT NULL DEFAULT '0',
`itemtype` varchar(100) COLLATE utf8_unicode_ci DEFAULT NULL,
`language` varchar(5) COLLATE utf8_unicode_ci DEFAULT NULL,
`field` varchar(100) COLLATE utf8_unicode_ci DEFAULT NULL,
`value` text COLLATE utf8_unicode_ci,
PRIMARY KEY (`id`),
UNIQUE KEY `unicity` (`itemtype`,`items_id`,`language`,`field`),
KEY `typeid` (`itemtype`,`items_id`),
KEY `language` (`language`),
KEY `field` (`field`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;";
$DB->queryOrDie($query, "0.85 add table glpi_dropdowntranslations");
}
//generate uuid for the basic rules of glpi
// we use a complete sql where for cover all migration case (0.78 -> 0.85)
$rules = [['sub_type' => 'RuleImportEntity',
'name' => 'Root',
'match' => 'AND',
'description' => ''
],
['sub_type' => 'RuleRight',
'name' => 'Root',
'match' => 'AND',
'description' => ''
],
['sub_type' => 'RuleMailCollector',
'name' => 'Root',
'match' => 'AND',
'description' => ''
],
['sub_type' => 'RuleMailCollector',
'name' => 'Auto-Reply X-Auto-Response-Suppress',
'match' => 'AND',
'description' => 'Exclude Auto-Reply emails using X-Auto-Response-Suppress header'
],
['sub_type' => 'RuleMailCollector',
'name' => 'Auto-Reply Auto-Submitted',
'match' => 'AND',
'description' => 'Exclude Auto-Reply emails using Auto-Submitted header'
],
['sub_type' => 'RuleTicket',
'name' => 'Ticket location from item',
'match' => 'AND',
'description' => ''
],
['sub_type' => 'RuleTicket',
'name' => 'Ticket location from user',
'match' => 'AND',
'description' => ''
]
];
$i = 0;
foreach ($rules as $rule) {
$query = "UPDATE `glpi_rules`
SET `uuid` = 'STATIC-UUID-$i'
WHERE `entities_id` = 0
AND `is_recursive` = 0
AND `sub_type` = '" . $rule['sub_type'] . "'
AND `name` = '" . $rule['name'] . "'
AND `description` = '" . $rule['description'] . "'
AND `match` = '" . $rule['match'] . "'
ORDER BY id ASC
LIMIT 1";
$DB->queryOrDie($query, "0.85 add uuid to basic rules (STATIC-UUID-$i)");
$i++;
}
//generate uuid for the rules of user
foreach ($DB->request('glpi_rules', ['uuid' => null]) as $data) {
$uuid = Rule::getUuid();
$query = "UPDATE `glpi_rules`
SET `uuid` = '$uuid'
WHERE `id` = '" . $data['id'] . "'";
$DB->queryOrDie($query, "0.85 add uuid to existing rules");
}
foreach ($DB->request('glpi_slalevels', ['uuid' => null]) as $data) {
$uuid = Rule::getUuid();
$query = "UPDATE `glpi_slalevels`
SET `uuid` = '$uuid'
WHERE `id` = '" . $data['id'] . "'";
$DB->queryOrDie($query, "0.85 add uuid to existing slalevels");
}
$migration->addField('glpi_users', 'is_deleted_ldap', 'bool');
$migration->addKey('glpi_users', 'is_deleted_ldap');
Config::deleteConfigurationValues('core', ['use_ajax']);
Config::deleteConfigurationValues('core', ['ajax_min_textsearch_load']);
Config::deleteConfigurationValues('core', ['ajax_buffertime_load']);
Config::deleteConfigurationValues('core', ['is_categorized_soft_expanded']);
Config::deleteConfigurationValues('core', ['is_not_categorized_soft_expanded']);
$migration->dropField("glpi_users", 'is_categorized_soft_expanded');
$migration->dropField("glpi_users", 'is_not_categorized_soft_expanded');
// Config::setConfigurationValues('core', array('use_unicodefont' => 0));
// $migration->addField("glpi_users", 'use_unicodefont', "int DEFAULT NULL");
Config::deleteConfigurationValues('core', ['use_unicodefont']);
$migration->dropField("glpi_users", 'use_unicodefont');
Config::setConfigurationValues('core', ['pdffont' => 'helvetica']);
$migration->addField("glpi_users", 'pdffont', "string");
$migration->addField("glpi_users", 'picture', "string");
$migration->addField("glpi_authldaps", 'picture_field', 'string');
$migration->addField('glpi_links', 'open_window', 'bool', ['value' => 1]);
$migration->displayMessage(sprintf(__('Data migration - %s'), 'glpi_states'));
foreach (
['is_visible_computer', 'is_visible_monitor', 'is_visible_networkequipment',
'is_visible_peripheral', 'is_visible_phone', 'is_visible_printer',
'is_visible_softwareversion'
] as $field
) {
$migration->addField(
'glpi_states',
$field,
'bool',
['value' => '1']
);
$migration->addKey('glpi_states', $field);
}
// glpi_domains by entity
$migration->addField('glpi_domains', 'entities_id', 'integer', ['after' => 'name']);
$migration->addField('glpi_domains', 'is_recursive', 'bool', ['update' => '1',
'after' => 'entities_id'
]);
// glpi_states by entity
$migration->addField('glpi_states', 'entities_id', 'integer', ['after' => 'name']);
$migration->addField('glpi_states', 'is_recursive', 'bool', ['update' => '1',
'after' => 'entities_id'
]);
// add validity date for a user
$migration->addField('glpi_users', 'begin_date', 'datetime');
$migration->addField('glpi_users', 'end_date', 'datetime');
// add validity date for a knowbaseitem
$migration->addField('glpi_knowbaseitems', 'begin_date', 'datetime');
$migration->addField('glpi_knowbaseitems', 'end_date', 'datetime');
// Add validation percent for tickets
$migration->addField('glpi_tickets', 'validation_percent', 'integer', ['value' => 0]);
// Add missing key
$migration->addKey('glpi_tickettasks', 'state');
$migration->addKey('glpi_tickettasks', 'users_id_tech');
$migration->addKey('glpi_tickettasks', 'begin');
$migration->addKey('glpi_tickettasks', 'end');
// Create notification for reply to satisfaction survey based on satisfaction notif
// Check if notifications already exists
if (
countElementsInTable(
'glpi_notifications',
['itemtype' => 'Ticket',
'event' => 'replysatisfaction'
]
) == 0
) {
// No notifications duplicate all
$query = "SELECT *
FROM `glpi_notifications`
WHERE `itemtype` = 'Ticket'
AND `event` = 'satisfaction'";
foreach ($DB->request($query) as $notif) {
$query = "INSERT INTO `glpi_notifications`
(`name`, `entities_id`, `itemtype`, `event`, `mode`,
`notificationtemplates_id`, `comment`, `is_recursive`, `is_active`,
`date_mod`)
VALUES ('" . addslashes($notif['name']) . " Answer',
'" . $notif['entities_id'] . "', 'Ticket',
'replysatisfaction', '" . $notif['mode'] . "',
'" . $notif['notificationtemplates_id'] . "',
'" . addslashes($notif['comment']) . "', '" . $notif['is_recursive'] . "',
'" . $notif['is_active'] . "', NOW());";
$DB->queryOrDie($query, "0.85 insert replysatisfaction notification");
$newID = $DB->insertId();
$query2 = "SELECT *
FROM `glpi_notificationtargets`
WHERE `notifications_id` = '" . $notif['id'] . "'";
// Add same recipent of satisfaction
foreach ($DB->request($query2) as $target) {
$query = "INSERT INTO `glpi_notificationtargets`
(`notifications_id`, `type`, `items_id`)
VALUES ($newID, '" . $target['type'] . "', '" . $target['items_id'] . "')";
$DB->queryOrDie($query, "0.85 insert targets for replysatisfaction notification");
}
// Add Tech in charge
$query = "INSERT INTO `glpi_notificationtargets`
(`notifications_id`, `type`, `items_id`)
VALUES ($newID, '" . Notification::USER_TYPE . "', '" . Notification::ASSIGN_TECH . "')";
$DB->queryOrDie($query, "0.85 insert tech in charge target for replysatisfaction notification");
}
}
$migration->displayMessage(sprintf(__('Data migration - %s'), 'glpi_slas'));
// * Convert SLA resolution time to new system (ticket #4346)
if (!$DB->fieldExists("glpi_slas", "definition_time")) {
$migration->addField("glpi_slas", 'definition_time', "string");
$migration->addField("glpi_slas", 'end_of_working_day', "bool");
$migration->migrationOneTable('glpi_slas');
// Minutes
$query = "SELECT *
FROM `glpi_slas`
WHERE `resolution_time` <= '3000'";
if ($result = $DB->query($query)) {
if ($DB->numrows($result) > 0) {
$a_ids = [];
while ($data = $DB->fetchAssoc($result)) {
$a_ids[] = $data['id'];
}
$DB->query("UPDATE `glpi_slas`
SET `definition_time` = 'minute',
`resolution_time` = `resolution_time`/60
WHERE `id` IN (" . implode(",", $a_ids) . ")");
}
}
// Hours
$query = "SELECT *
FROM `glpi_slas`
WHERE `resolution_time` > '3000'
AND `resolution_time` <= '82800'";
if ($result = $DB->query($query)) {
if ($DB->numrows($result) > 0) {
$a_ids = [];
while ($data = $DB->fetchAssoc($result)) {
$a_ids[] = $data['id'];
}
$DB->query("UPDATE `glpi_slas`
SET `definition_time` = 'hour',
`resolution_time` = `resolution_time`/3600
WHERE `id` IN (" . implode(",", $a_ids) . ")");
}
}
// Days
$query = "SELECT *
FROM `glpi_slas`
WHERE `resolution_time` > '82800'";
if ($result = $DB->query($query)) {
if ($DB->numrows($result) > 0) {
$a_ids = [];
while ($data = $DB->fetchAssoc($result)) {
$a_ids[] = $data['id'];
}
$DB->query("UPDATE `glpi_slas`
SET `definition_time` = 'day',
`resolution_time` = `resolution_time`/86400
WHERE `id` IN (" . implode(",", $a_ids) . ")");
}
}
}
Config::setConfigurationValues('core', ['keep_devices_when_purging_item' => 0]);
$migration->addField("glpi_users", "keep_devices_when_purging_item", "int DEFAULT NULL");
Config::setConfigurationValues('core', ['maintenance_mode' => 0]);
Config::setConfigurationValues('core', ['maintenance_text' => '']);
$query = "SELECT *
FROM `glpi_notificationtemplates`
WHERE `itemtype` = 'MailCollector'";
if ($result = $DB->query($query)) {
if ($DB->numrows($result) == 0) {
$query = "INSERT INTO `glpi_notificationtemplates`
(`name`, `itemtype`, `date_mod`)
VALUES ('Receiver errors', 'MailCollector', NOW())";
$DB->queryOrDie($query, "0.85 add mail collector notification");
$notid = $DB->insertId();
$query = "INSERT INTO `glpi_notificationtemplatetranslations`
(`notificationtemplates_id`, `language`, `subject`,
`content_text`,
`content_html`)
VALUES ($notid, '', '##mailcollector.action##',
'##FOREACHmailcollectors##
##lang.mailcollector.name## : ##mailcollector.name##
##lang.mailcollector.errors## : ##mailcollector.errors##
##mailcollector.url##
##ENDFOREACHmailcollectors##',
'<p>##FOREACHmailcollectors##<br />##lang.mailcollector.name## : ##mailcollector.name##<br /> ##lang.mailcollector.errors## : ##mailcollector.errors##<br /><a href=\"##mailcollector.url##\">##mailcollector.url##</a><br /> ##ENDFOREACHmailcollectors##</p>
<p></p>')";
$DB->queryOrDie($query, "0.85 add mail collector notification translation");
$query = "INSERT INTO `glpi_notifications`
(`name`, `entities_id`, `itemtype`, `event`, `mode`,
`notificationtemplates_id`, `comment`, `is_recursive`, `is_active`,
`date_mod`)
VALUES ('Receiver errors', 0, 'MailCollector', 'error', 'mail',
$notid, '', 1, 1, NOW())";
$DB->queryOrDie($query, "0.85 add mail collector notification");
$notifid = $DB->insertId();
$query = "INSERT INTO `glpi_notificationtargets`
(`id`, `notifications_id`, `type`, `items_id`)
VALUES (NULL, $notifid, " . Notification::USER_TYPE . ", " . Notification::GLOBAL_ADMINISTRATOR . ");";
$DB->queryOrDie($query, "0.85 add mail collector notification target");
}
}
if (
!countElementsInTable(
'glpi_crontasks',
['itemtype' => 'MailCollector', 'name' => 'mailgateerror']
)
) {
$query = "INSERT INTO `glpi_crontasks`
(`itemtype`, `name`, `frequency`, `param`, `state`, `mode`, `allowmode`,
`hourmin`, `hourmax`, `logs_lifetime`, `lastrun`, `lastcode`, `comment`)
VALUES ('MailCollector', 'mailgateerror', " . DAY_TIMESTAMP . ", NULL, 1, 1, 3,
0, 24, 30, NULL, NULL, NULL)";
$DB->queryOrDie($query, "0.85 populate glpi_crontasks for mailgateerror");
}
if (
!countElementsInTable(
'glpi_crontasks',
['itemtype' => 'Crontask', 'name' => 'circularlogs']
)
) {
$query = "INSERT INTO `glpi_crontasks`
(`itemtype`, `name`, `frequency`, `param`, `state`, `mode`, `allowmode`,
`hourmin`, `hourmax`, `logs_lifetime`, `lastrun`, `lastcode`, `comment`)
VALUES ('Crontask', 'circularlogs', " . DAY_TIMESTAMP . ", 4, " . CronTask::STATE_DISABLE . ", 1, 3,
0, 24, 30, NULL, NULL, NULL)";
$DB->queryOrDie($query, "0.85 populate glpi_crontasks for circularlogs");
}
$migration->displayMessage(sprintf(__('Data migration - %s'), 'glpi_documents'));
$migration->addField('glpi_documents', 'is_blacklisted', 'bool');
if (!$DB->tableExists("glpi_blacklistedmailcontents")) {
$query = "CREATE TABLE IF NOT EXISTS `glpi_blacklistedmailcontents` (
`id` int NOT NULL AUTO_INCREMENT,
`name` varchar(255) DEFAULT NULL,
`content` text COLLATE utf8_unicode_ci,
`comment` text COLLATE utf8_unicode_ci,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;";
$DB->queryOrDie($query, "0.85 add table glpi_blacklistedmailcontents");
}
$migration->addField('glpi_documents', 'tag', 'string');
$migration->addField('glpi_queuedmails', 'documents', 'text');
$migration->addKey('glpi_documents', 'tag');
Config::setConfigurationValues('core', ['use_rich_text' => 0]);
Config::setConfigurationValues('core', ['attach_ticket_documents_to_mail' => 0]);
$migration->migrationOneTable('glpi_documents');
$query = "UPDATE `glpi_documents`
SET `tag` = `id`";
$DB->queryOrDie($query, "0.85 set tag to all documents");
// increase password length
$migration->changeField('glpi_users', 'password', 'password', 'string');
$migration->displayMessage(sprintf(__('Data migration - %s'), 'glpi_softwarecategories'));
// Hierarchical software category
$migration->addField('glpi_softwarecategories', 'softwarecategories_id', 'integer');
$migration->addField("glpi_softwarecategories", 'completename', "text");
$migration->addField("glpi_softwarecategories", 'level', "integer");
$migration->addField("glpi_softwarecategories", 'ancestors_cache', "longtext");
$migration->addField("glpi_softwarecategories", 'sons_cache', "longtext");
$migration->migrationOneTable('glpi_softwarecategories');
$migration->addKey('glpi_softwarecategories', 'softwarecategories_id');
regenerateTreeCompleteName("glpi_softwarecategories");
$migration->displayMessage(sprintf(__('Change of the database layout - %s'), 'various'));
// glpi_cartridgeitems glpi_consumableitems by entity
$migration->addField(
'glpi_consumableitems',
'is_recursive',
'bool',
['update' => '1',
'after' => 'entities_id'
]
);
$migration->addField(
'glpi_cartridgeitems',
'is_recursive',
'bool',
['update' => '1',
'after' => 'entities_id'
]
);
// Fix events
$query = "UPDATE `glpi_events`
SET `type` = 'consumableitems'
WHERE `type` = 'consumables'";
$DB->queryOrDie($query, "0.85 fix events for consumables");
$query = "UPDATE `glpi_events`
SET `type` = 'cartridgeitems'
WHERE `type` = 'cartridges';";
$DB->queryOrDie($query, "0.85 fix events for cartridges");
// Bookmark order :
$migration->addField('glpi_users', 'privatebookmarkorder', 'longtext');
// Pref to comme back ticket created
if ($migration->addField('glpi_users', 'backcreated', 'TINYINT DEFAULT NULL')) {
$query = "INSERT INTO `glpi_configs`
(`context`, `name`, `value`)
VALUES ('core', 'backcreated', 0)";
$DB->queryOrDie($query, "update glpi_configs with backcreated");
}
$migration->displayMessage(sprintf(__('Data migration - %s'), 'glpi_projects'));
if (!$DB->tableExists("glpi_projects")) {
$query = "CREATE TABLE IF NOT EXISTS `glpi_projects` (
`id` int NOT NULL AUTO_INCREMENT,
`name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
`code` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
`priority` int NOT NULL DEFAULT '1',
`entities_id` int NOT NULL DEFAULT '0',
`is_recursive` tinyint NOT NULL DEFAULT '0',
`projects_id` int NOT NULL DEFAULT '0',
`projectstates_id` int NOT NULL DEFAULT '0',
`projecttypes_id` int NOT NULL DEFAULT '0',
`date` datetime DEFAULT NULL,
`date_mod` datetime DEFAULT NULL,
`users_id` int NOT NULL DEFAULT '0',
`groups_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,
`percent_done` int NOT NULL DEFAULT '0',
`show_on_global_gantt` tinyint NOT NULL DEFAULT '0',
`content` longtext DEFAULT NULL,
`comment` longtext DEFAULT NULL,
`notepad` longtext DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `name` (`name`),
KEY `code` (`code`),
KEY `entities_id` (`entities_id`),
KEY `is_recursive` (`is_recursive`),
KEY `projects_id` (`projects_id`),
KEY `projectstates_id` (`projectstates_id`),
KEY `projecttypes_id` (`projecttypes_id`),
KEY `priority` (`priority`),
KEY `date` (`date`),
KEY `date_mod` (`date_mod`),
KEY `users_id` (`users_id`),
KEY `groups_id` (`groups_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 `show_on_global_gantt` (`show_on_global_gantt`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;";
$DB->queryOrDie($query, "0.85 add table glpi_projects");
$ADDTODISPLAYPREF['Project'] = [3,4,12,5,15,21];
}
$migration->addField("glpi_projects", 'is_deleted', "bool");
if (countElementsInTable("glpi_profilerights", ['name' => 'project']) == 0) {
ProfileRight::addProfileRights(['project']);
ProfileRight::updateProfileRightAsOtherRight(
'project',
Project::READMY,
"`name` = 'change'
AND `rights` & " . Change::READMY
);
ProfileRight::updateProfileRightAsOtherRight(
'project',
Project::READALL,
"`name` = 'change'
AND `rights` & " . Change::READALL
);
ProfileRight::updateProfileRightAsOtherRight(
'project',
CREATE . " | " . UPDATE . " | " . DELETE . " | " . PURGE . " | " . READNOTE . " | " . UPDATENOTE,
"`name` = 'change'
AND `rights` & (" . CREATE . " | " . UPDATE . " | " . DELETE . " | " . PURGE . ')'
);
}
if (countElementsInTable("glpi_profilerights", ['name' => 'projecttask']) == 0) {
ProfileRight::addProfileRights(['projecttask']);
ProfileRight::updateProfileRightAsOtherRight(
'projecttask',
ProjectTask::READMY,
"`name` = 'change'
AND `rights` & " . Change::READMY
);
ProfileRight::updateProfileRightAsOtherRight(
'projecttask',
ProjectTask::UPDATEMY,
"`name` = 'change'
AND `rights` & " . Change::READMY
);
}
if (!$DB->tableExists('glpi_projectcosts')) {
$query = "CREATE TABLE `glpi_projectcosts` (
`id` int NOT NULL AUTO_INCREMENT,
`projects_id` int NOT NULL DEFAULT '0',
`name` varchar(255) DEFAULT NULL,
`comment` text COLLATE utf8_unicode_ci,
`begin_date` date DEFAULT NULL,
`end_date` date DEFAULT NULL,
`cost` decimal(20,4) NOT NULL DEFAULT '0.0000',
`budgets_id` int NOT NULL DEFAULT '0',
`entities_id` int NOT NULL DEFAULT '0',
`is_recursive` tinyint NOT NULL DEFAULT '0',
PRIMARY KEY (`id`),
KEY `name` (`name`),
KEY `projects_id` (`projects_id`),
KEY `begin_date` (`begin_date`),
KEY `end_date` (`end_date`),
KEY `entities_id` (`entities_id`),
KEY `is_recursive` (`is_recursive`),
KEY `budgets_id` (`budgets_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci";
$DB->queryOrDie($query, "0.85 add table glpi_projectcosts");
}
if (!$DB->tableExists('glpi_projectstates')) {
$query = "CREATE TABLE `glpi_projectstates` (
`id` int NOT NULL AUTO_INCREMENT,
`name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
`comment` text COLLATE utf8_unicode_ci,
`color` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
`is_finished` tinyint NOT NULL DEFAULT '0',
PRIMARY KEY (`id`),
KEY `name` (`name`),
KEY `is_finished` (`is_finished`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci";
$DB->queryOrDie($query, "0.85 create glpi_projectstates");
$ADDTODISPLAYPREF['ProjectState'] = [12,11];
$states = ['new' => ['name' => _x('ticket', 'New'),
'color' => '#06ff00',
'is_finished' => 0
],
'do' => ['name' => __('Processing'),
'color' => '#ffb800',
'is_finished' => 0
],
'end' => ['name' => __('Closed'),
'color' => '#ff0000',
'is_finished' => 1
]
];
foreach ($states as $key => $val) {
$query = "INSERT INTO `glpi_projectstates`
(`name`,`color`,`is_finished`)
VALUES ('" . addslashes($val['name']) . "','" . addslashes($val['color']) . "',
'" . addslashes($val['is_finished']) . "')";
$DB->queryOrDie($query, "0.85 insert default project state $key");
}
}
if (!$DB->tableExists('glpi_projecttypes')) {
$query = "CREATE TABLE `glpi_projecttypes` (
`id` int NOT NULL AUTO_INCREMENT,
`name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
`comment` text COLLATE utf8_unicode_ci,
PRIMARY KEY (`id`),
KEY `name` (`name`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci";
$DB->queryOrDie($query, "0.85 create glpi_projecttypes");
}
$migration->addField("glpi_groups", 'is_manager', "bool", ['update' => "`is_assign`",
'value' => 1
]);
$migration->addKey('glpi_groups', 'is_manager');
if (!$DB->tableExists('glpi_changes_projects')) {
$query = "CREATE TABLE `glpi_changes_projects` (
`id` int NOT NULL AUTO_INCREMENT,
`changes_id` int NOT NULL DEFAULT '0',
`projects_id` int NOT NULL DEFAULT '0',
PRIMARY KEY (`id`),
UNIQUE KEY `unicity` (`changes_id`,`projects_id`),
KEY `projects_id` (`projects_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci";
$DB->queryOrDie($query, "0.85 add table glpi_changes_projects");
}
if (!$DB->tableExists('glpi_projectteams')) {
$query = "CREATE TABLE `glpi_projectteams` (
`id` int NOT NULL AUTO_INCREMENT,
`projects_id` int NOT NULL DEFAULT '0',
`itemtype` varchar(100) default NULL,
`items_id` int NOT NULL DEFAULT '0',
PRIMARY KEY (`id`),
UNIQUE KEY `unicity` (`projects_id`,`itemtype`,`items_id`),
KEY `item` (`itemtype`,`items_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci";
$DB->queryOrDie($query, "0.85 add table glpi_projectteams");
}
if (!$DB->tableExists('glpi_items_projects')) {
$query = "CREATE TABLE `glpi_items_projects` (
`id` int NOT NULL AUTO_INCREMENT,
`projects_id` int NOT NULL DEFAULT '0',
`itemtype` varchar(100) default NULL,
`items_id` int NOT NULL DEFAULT '0',
PRIMARY KEY (`id`),
UNIQUE KEY `unicity` (`projects_id`,`itemtype`,`items_id`),
KEY `item` (`itemtype`,`items_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci";
$DB->queryOrDie($query, "0.85 add table glpi_items_projects");
}
if (!$DB->tableExists("glpi_projecttasks")) {
$query = "CREATE TABLE IF NOT EXISTS `glpi_projecttasks` (
`id` int NOT NULL AUTO_INCREMENT,
`name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
`content` longtext DEFAULT NULL,
`comment` longtext DEFAULT NULL,
`entities_id` int NOT NULL DEFAULT '0',
`is_recursive` tinyint NOT NULL DEFAULT '0',
`projects_id` int NOT NULL DEFAULT '0',
`projecttasks_id` int NOT NULL DEFAULT '0',
`date` datetime DEFAULT NULL,
`date_mod` datetime DEFAULT NULL,
`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',
`notepad` longtext 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` (`date`),
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`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;";
$DB->queryOrDie($query, "0.85 add table glpi_projecttasks");
$ADDTODISPLAYPREF['ProjectTask'] = [2,12,14,5,7,8, 13];
}
if (!$DB->tableExists('glpi_projecttasktypes')) {
$query = "CREATE TABLE `glpi_projecttasktypes` (
`id` int NOT NULL AUTO_INCREMENT,
`name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
`comment` text COLLATE utf8_unicode_ci,
PRIMARY KEY (`id`),
KEY `name` (`name`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci";
$DB->queryOrDie($query, "0.85 create glpi_projecttasktypes");
}
if (!$DB->tableExists('glpi_projecttaskteams')) {
$query = "CREATE TABLE `glpi_projecttaskteams` (
`id` int NOT NULL AUTO_INCREMENT,
`projecttasks_id` int NOT NULL DEFAULT '0',
`itemtype` varchar(100) default NULL,
`items_id` int NOT NULL DEFAULT '0',
PRIMARY KEY (`id`),
UNIQUE KEY `unicity` (`projecttasks_id`,`itemtype`,`items_id`),
KEY `item` (`itemtype`,`items_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci";
$DB->queryOrDie($query, "0.85 add table glpi_projecttaskteams");
}
if (!$DB->tableExists('glpi_projecttasks_tickets')) {
$query = "CREATE TABLE `glpi_projecttasks_tickets` (
`id` int NOT NULL AUTO_INCREMENT,
`tickets_id` int NOT NULL DEFAULT '0',
`projecttasks_id` int NOT NULL DEFAULT '0',
PRIMARY KEY (`id`),
UNIQUE KEY `unicity` (`tickets_id`,`projecttasks_id`),
KEY `projects_id` (`projecttasks_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci";
$DB->queryOrDie($query, "0.85 add table glpi_projecttasks_tickets");
}
// Project notifications
$query = "SELECT *
FROM `glpi_notificationtemplates`
WHERE `itemtype` = 'Project'";
if ($result = $DB->query($query)) {
if ($DB->numrows($result) == 0) {
$query = "INSERT INTO `glpi_notificationtemplates`
(`name`, `itemtype`, `date_mod`)
VALUES ('Projects', 'Project', NOW())";
$DB->queryOrDie($query, "0.85 add project notification");
$notid = $DB->insertId();
$query = "INSERT INTO `glpi_notificationtemplatetranslations`
(`notificationtemplates_id`, `language`, `subject`,
`content_text`,
`content_html`)
VALUES ($notid, '', '##project.action## ##project.name## ##project.code##',
'##lang.project.url## : ##project.url##
##lang.project.description##
##lang.project.name## : ##project.name##
##lang.project.code## : ##project.code##
##lang.project.manager## : ##project.manager##
##lang.project.managergroup## : ##project.managergroup##
##lang.project.creationdate## : ##project.creationdate##
##lang.project.priority## : ##project.priority##
##lang.project.state## : ##project.state##
##lang.project.type## : ##project.type##
##lang.project.description## : ##project.description##
##lang.project.numberoftasks## : ##project.numberoftasks##
##FOREACHtasks##
[##task.creationdate##]
##lang.task.name## : ##task.name##
##lang.task.state## : ##task.state##
##lang.task.type## : ##task.type##
##lang.task.percent## : ##task.percent##
##lang.task.description## : ##task.description##
##ENDFOREACHtasks##',
'<p>##lang.project.url## : <a href=\"##project.url##\">##project.url##</a></p>
<p><strong>##lang.project.description##</strong></p>
<p>##lang.project.name## : ##project.name##<br />##lang.project.code## : ##project.code##<br /> ##lang.project.manager## : ##project.manager##<br />##lang.project.managergroup## : ##project.managergroup##<br /> ##lang.project.creationdate## : ##project.creationdate##<br />##lang.project.priority## : ##project.priority## <br />##lang.project.state## : ##project.state##<br />##lang.project.type## : ##project.type##<br />##lang.project.description## : ##project.description##</p>
<p>##lang.project.numberoftasks## : ##project.numberoftasks##</p>
<div>
<p>##FOREACHtasks##</p>
<div><strong>[##task.creationdate##] </strong><br /> ##lang.task.name## : ##task.name##<br />##lang.task.state## : ##task.state##<br />##lang.task.type## : ##task.type##<br />##lang.task.percent## : ##task.percent##<br />##lang.task.description## : ##task.description##</div>
<p>##ENDFOREACHtasks##</p>
</div>')";
$DB->queryOrDie($query, "0.85 add project notification translation");
$notifications = ['new' => [],
'update' => [],
'delete' => []
];
$notif_names = ['new' => 'New Project',
'update' => 'Update Project',
'delete' => 'Delete Project'
];
foreach ($notifications as $key => $val) {
$notifications[$key][] = Notification::MANAGER_USER;
$notifications[$key][] = Notification::GLOBAL_ADMINISTRATOR;
$notifications[$key][] = Notification::MANAGER_GROUP;
}
foreach ($notifications as $type => $targets) {
$query = "INSERT INTO `glpi_notifications`
(`name`, `entities_id`, `itemtype`, `event`, `mode`,
`notificationtemplates_id`, `comment`, `is_recursive`, `is_active`,
`date_mod`)
VALUES ('" . $notif_names[$type] . "', 0, 'Project', '$type', 'mail',
$notid, '', 1, 1, NOW())";
$DB->queryOrDie($query, "0.85 add project $type notification");
$notifid = $DB->insertId();
foreach ($targets as $target) {
$query = "INSERT INTO `glpi_notificationtargets`
(`id`, `notifications_id`, `type`, `items_id`)
VALUES (NULL, $notifid, " . Notification::USER_TYPE . ", $target);";
$DB->queryOrDie($query, "0.85 add project $type notification target");
}
}
}
}
// Project Task notifications
$query = "SELECT *
FROM `glpi_notificationtemplates`
WHERE `itemtype` = 'ProjectTask'";
if ($result = $DB->query($query)) {
if ($DB->numrows($result) == 0) {
$query = "INSERT INTO `glpi_notificationtemplates`
(`name`, `itemtype`, `date_mod`)
VALUES ('Project Tasks', 'ProjectTask', NOW())";
$DB->queryOrDie($query, "0.85 add project task notification");
$notid = $DB->insertId();
$query = "INSERT INTO `glpi_notificationtemplatetranslations`
(`notificationtemplates_id`, `language`, `subject`,
`content_text`,
`content_html`)
VALUES ($notid, '', '##projecttask.action## ##projecttask.name##',
'##lang.projecttask.url## : ##projecttask.url##
##lang.projecttask.description##
##lang.projecttask.name## : ##projecttask.name##
##lang.projecttask.project## : ##projecttask.project##
##lang.projecttask.creationdate## : ##projecttask.creationdate##
##lang.projecttask.state## : ##projecttask.state##
##lang.projecttask.type## : ##projecttask.type##
##lang.projecttask.description## : ##projecttask.description##
##lang.projecttask.numberoftasks## : ##projecttask.numberoftasks##
##FOREACHtasks##
[##task.creationdate##]
##lang.task.name## : ##task.name##
##lang.task.state## : ##task.state##
##lang.task.type## : ##task.type##
##lang.task.percent## : ##task.percent##
##lang.task.description## : ##task.description##
##ENDFOREACHtasks##',
'<p>##lang.projecttask.url## : <a href=\"##projecttask.url##\">##projecttask.url##</a></p>
<p><strong>##lang.projecttask.description##</strong></p>
<p>##lang.projecttask.name## : ##projecttask.name##<br />##lang.projecttask.project## : <a href=\"##projecttask.projecturl##\">##projecttask.project##</a><br />##lang.projecttask.creationdate## : ##projecttask.creationdate##<br />##lang.projecttask.state## : ##projecttask.state##<br />##lang.projecttask.type## : ##projecttask.type##<br />##lang.projecttask.description## : ##projecttask.description##</p>
<p>##lang.projecttask.numberoftasks## : ##projecttask.numberoftasks##</p>
<div>
<p>##FOREACHtasks##</p>
<div><strong>[##task.creationdate##] </strong><br />##lang.task.name## : ##task.name##<br />##lang.task.state## : ##task.state##<br />##lang.task.type## : ##task.type##<br />##lang.task.percent## : ##task.percent##<br />##lang.task.description## : ##task.description##</div>
<p>##ENDFOREACHtasks##</p>
</div>')";
$DB->queryOrDie($query, "0.85 add project task notification translation");
$notifications = ['new' => [],
'update' => [],
'delete' => []
];
$notif_names = ['new' => 'New Project Task',
'update' => 'Update Project Task',
'delete' => 'Delete Project Task'
];
foreach ($notifications as $key => $val) {
$notifications[$key][] = Notification::TEAM_USER;
$notifications[$key][] = Notification::GLOBAL_ADMINISTRATOR;
$notifications[$key][] = Notification::TEAM_GROUP;
}
foreach ($notifications as $type => $targets) {
$query = "INSERT INTO `glpi_notifications`
(`name`, `entities_id`, `itemtype`, `event`, `mode`,
`notificationtemplates_id`, `comment`, `is_recursive`, `is_active`,
`date_mod`)
VALUES ('" . $notif_names[$type] . "', 0, 'ProjectTask', '$type', 'mail',
$notid, '', 1, 1, NOW())";
$DB->queryOrDie($query, "0.85 add project task $type notification");
$notifid = $DB->insertId();
foreach ($targets as $target) {
$query = "INSERT INTO `glpi_notificationtargets`
(`id`, `notifications_id`, `type`, `items_id`)
VALUES (NULL, $notifid, " . Notification::USER_TYPE . ", $target);";
$DB->queryOrDie($query, "0.85 add project task $type notification target");
}
}
}
}
$migration->displayMessage(sprintf(__('Data migration - %s'), 'notepad'));
// Create new notepad table
if (!$DB->tableExists('glpi_notepads')) {
$query = "CREATE TABLE `glpi_notepads` (
`id` int NOT NULL AUTO_INCREMENT,
`itemtype` varchar(100) default NULL,
`items_id` int NOT NULL DEFAULT '0',
`date` datetime DEFAULT NULL,
`date_mod` datetime DEFAULT NULL,
`users_id` int NOT NULL DEFAULT '0',
`users_id_lastupdater` int NOT NULL DEFAULT '0',
`content` LONGTEXT DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `item` (`itemtype`,`items_id`),
KEY `date_mod` (`date_mod`),
KEY `date` (`date`),
KEY `users_id_lastupdater` (`users_id_lastupdater`),
KEY `users_id` (`users_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci";
$DB->queryOrDie($query, "0.85 add table glpi_notepads");
$notepad_tables = ['glpi_budgets', 'glpi_cartridgeitems', 'glpi_changes',
'glpi_computers', 'glpi_consumableitems', 'glpi_contacts',
'glpi_contracts', 'glpi_documents', 'glpi_entities',
'glpi_monitors', 'glpi_networkequipments', 'glpi_peripherals',
'glpi_phones', 'glpi_printers', 'glpi_problems', 'glpi_projects',
'glpi_projecttasks', 'glpi_softwares', 'glpi_suppliers'
];
foreach ($notepad_tables as $t) {
// Migrate data
if ($DB->fieldExists($t, 'notepad', false)) {
$query = "SELECT id, notepad
FROM `$t`
WHERE notepad IS NOT NULL
AND notepad <>'';";
foreach ($DB->request($query) as $data) {
$iq = "INSERT INTO `glpi_notepads`
(`itemtype`, `items_id`, `content`, `date`, `date_mod`)
VALUES ('" . getItemTypeForTable($t) . "', '" . $data['id'] . "',
'" . addslashes($data['notepad']) . "', NOW(), NOW())";
$DB->queryOrDie($iq, "0.85 migrate notepad data");
}
$migration->dropField($t, 'notepad');
}
}
}
$migration->addField('glpi_deviceprocessors', 'nbcores_default', 'int DEFAULT NULL');
$migration->addField('glpi_deviceprocessors', 'nbthreads_default', 'int DEFAULT NULL');
$migration->addField('glpi_items_deviceprocessors', 'nbcores', 'int DEFAULT NULL');
$migration->addField('glpi_items_deviceprocessors', 'nbthreads', 'int DEFAULT NULL');
$migration->addKey('glpi_items_deviceprocessors', 'nbcores');
$migration->addKey('glpi_items_deviceprocessors', 'nbthreads');
$migration->displayMessage(sprintf(__('Data migration - %s'), 'ticketvalidations status'));
$status = ['none' => CommonITILValidation::NONE,
'waiting' => CommonITILValidation::WAITING,
'accepted' => CommonITILValidation::ACCEPTED,
'rejected' => CommonITILValidation::REFUSED
];
// Migrate datas
foreach ($status as $old => $new) {
$query = "UPDATE `glpi_ticketvalidations`
SET `status` = '$new'
WHERE `status` = '$old'";
$DB->queryOrDie($query, "0.85 status in glpi_ticketvalidations $old to $new");
}
$migration->changeField(
'glpi_ticketvalidations',
'status',
'status',
'integer',
['value' => CommonITILValidation::WAITING]
);
$migration->displayMessage(sprintf(
__('Data migration - %s'),
'tickets and changes global_validation'
));
$tables = ['glpi_tickets', 'glpi_changes'];
foreach ($tables as $table) {
foreach ($status as $old => $new) {
$query = "UPDATE `" . $table . "`
SET `global_validation` = '$new'
WHERE `global_validation` = '$old'";
$DB->queryOrDie($query, "0.85 global_validation in $table $old to $new");
}
$migration->changeField(
$table,
'global_validation',
'global_validation',
'integer',
['value' => CommonITILValidation::NONE]
);
}
$migration->displayMessage(sprintf(
__('Data migration - %s'),
'tickettemplatepredefinedfields value'
));
foreach ($status as $old => $new) {
$query = "UPDATE `glpi_tickettemplatepredefinedfields`
SET `value` = '$new'
WHERE `num` = '52'
AND `value` = '$old'";
$DB->queryOrDie($query, "0.85 value in glpi_tickettemplatepredefinedfields $old to $new");
}
// Migrate templates
$query = "SELECT `glpi_notificationtemplatetranslations`.*
FROM `glpi_notificationtemplatetranslations`
INNER JOIN `glpi_notificationtemplates`
ON (`glpi_notificationtemplates`.`id`
= `glpi_notificationtemplatetranslations`.`notificationtemplates_id`)
WHERE `glpi_notificationtemplatetranslations`.`content_text` LIKE '%validation.storestatus=%'
OR `glpi_notificationtemplatetranslations`.`content_html` LIKE '%validation.storestatus=%'
OR `glpi_notificationtemplatetranslations`.`subject` LIKE '%validation.storestatus=%'";
if ($result = $DB->query($query)) {
if ($DB->numrows($result)) {
while ($data = $DB->fetchAssoc($result)) {
$subject = $data['subject'];
$text = $data['content_text'];
$html = $data['content_html'];
foreach ($status as $old => $new) {
$subject = str_replace(
"validation.storestatus=$old",
"validation.storestatus=$new",
$subject
);
$text = str_replace(
"validation.storestatus=$old",
"validation.storestatus=$new",
$text
);
$html = str_replace(
"validation.storestatus=$old",
"validation.storestatus=$new",
$html
);
}
$query = "UPDATE `glpi_notificationtemplatetranslations`
SET `subject` = '" . addslashes($subject) . "',
`content_text` = '" . addslashes($text) . "',
`content_html` = '" . addslashes($html) . "'
WHERE `id` = " . $data['id'] . "";
$DB->queryOrDie($query, "0.85 fix tags usage for storestatus");
}
}
}
// Upgrade ticket bookmarks
$query = "SELECT *
FROM `glpi_bookmarks`";
if ($result = $DB->query($query)) {
if ($DB->numrows($result) > 0) {
while ($data = $DB->fetchAssoc($result)) {
$num = 0;
$num2 = 0;
$options = [];
parse_str($data["query"], $options);
if (isset($options['field'])) {
// update ticket statuses
if (
($data['itemtype'] = 'Ticket')
&& ( $data['type'] == Bookmark::SEARCH)
) {
foreach ($options['field'] as $key => $val) {
if (
(($val == 55) || ($val == 52))
&& isset($options['contains'][$key])
) {
if (isset($status[$options['contains'][$key]])) {
$options['contains'][$key] = $status[$options['contains'][$key]];
}
}
}
}
}
$query2 = "UPDATE `glpi_bookmarks`
SET `query` = '" . addslashes(Toolbox::append_params($options)) . "'
WHERE `id` = '" . $data['id'] . "'";
$DB->queryOrDie($query2, "0.85 update bookmarks");
}
}
}
//////////////////////////////////////////////////
// Device update
$migration->displayMessage(sprintf(__('Data migration - %s'), 'Devices'));
$devices = [
'DeviceMotherboard',
'DeviceProcessor',
'DeviceMemory',
'DeviceHardDrive',
'DeviceNetworkCard',
'DeviceDrive',
'DeviceControl',
'DeviceGraphicCard',
'DeviceSoundCard',
'DevicePci',
'DeviceCase',
'DevicePowerSupply',
'Item_DeviceMotherboard',
'Item_DeviceProcessor',
'Item_DeviceMemory',
'Item_DeviceHardDrive',
'Item_DeviceNetworkCard',
'Item_DeviceDrive',
'Item_DeviceControl',
'Item_DeviceGraphicCard',
'Item_DeviceSoundCard',
'Item_DevicePci',
'Item_DeviceCase',
'Item_DevicePowerSupply'
];
foreach ($devices as $itemtype) {
$table = $itemtype::getTable();
if (!$DB->fieldExists($table, 'entities_id')) {
$migration->addField($table, 'entities_id', 'integer');
$migration->addKey($table, ['entities_id'], 'entities_id');
}
if (!$DB->fieldExists($table, 'is_recursive')) {
$migration->addField($table, 'is_recursive', 'bool', ['update' => '1',
'after' => 'entities_id'
]);
$migration->addKey($table, ['is_recursive'], 'is_recursive');
}
}
// Adding the Registered ID class that contains PCI IDs and USB IDs for vendors
// as well devices
if (!$DB->tableExists('glpi_registeredids')) {
$query = "CREATE TABLE `glpi_registeredids` (
`id` int NOT NULL AUTO_INCREMENT,
`name` varchar(255) DEFAULT NULL,
`items_id` int NOT NULL DEFAULT '0',
`itemtype` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
`device_type` varchar(100) COLLATE utf8_unicode_ci NOT NULL COMMENT 'USB, PCI ...',
PRIMARY KEY (`id`),
KEY `name` (`name`),
KEY `item` (`items_id`, `itemtype`),
KEY `device_type` (`device_type`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci";
$DB->queryOrDie($query, "0.85 add table glpi_registeredids");
}
// Complete the item_devices
foreach (
['glpi_items_devicecases', 'glpi_items_devicecontrols', 'glpi_items_devicedrives',
'glpi_items_devicegraphiccards', 'glpi_items_devicemotherboards',
'glpi_items_devicenetworkcards', 'glpi_items_devicepcis',
'glpi_items_devicepowersupplies', 'glpi_items_devicesoundcards'
] as $table
) {
if (!$DB->fieldExists($table, 'serial')) {
$migration->addField($table, 'serial', 'string');
$migration->addKey($table, 'serial');
}
}
foreach (
['glpi_items_devicecontrols', 'glpi_items_devicedrives',
'glpi_items_devicegraphiccards', 'glpi_items_deviceharddrives',
'glpi_items_devicememories', 'glpi_items_devicenetworkcards',
'glpi_items_devicepcis', 'glpi_items_deviceprocessors',
'glpi_items_devicesoundcards'
] as $table
) {
if (!$DB->fieldExists($table, 'busID')) {
$migration->addField($table, 'busID', 'string');
$migration->addKey($table, 'busID');
}
}
// Add key
foreach (
['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'
] as $table
) {
$migration->dropKey($table, 'item');
$migration->migrationOneTable($table);
$migration->addKey($table, ['itemtype', 'items_id'], 'item');
}
if (!$DB->fieldExists('glpi_devicegraphiccards', 'chipset')) {
$migration->addField('glpi_devicegraphiccards', 'chipset', 'string');
$migration->addKey('glpi_devicegraphiccards', 'chipset');
}
$migration->addField("glpi_suppliers_tickets", "use_notification", "bool");
$migration->addField("glpi_suppliers_tickets", "alternative_email", "string");
$migration->addField("glpi_problems_suppliers", "use_notification", "bool");
$migration->addField("glpi_problems_suppliers", "alternative_email", "string");
$migration->addField("glpi_changes_suppliers", "use_notification", "bool");
$migration->addField("glpi_changes_suppliers", "alternative_email", "string");
// Add field for locations
$migration->addField("glpi_locations", "latitude", "string");
$migration->addField("glpi_locations", "longitude", "string");
$migration->addField("glpi_locations", "altitude", "string");
// Add fixed columns as variables :
$ADDTODISPLAYPREF['CartridgeItem'] = [9];
$ADDTODISPLAYPREF['ConsumableItem'] = [9];
$ADDTODISPLAYPREF['ReservationItem'] = [9];
$migration->displayMessage(sprintf(__('Data migration - %s'), 'License validity'));
// for licence validity
if ($migration->addField("glpi_softwarelicenses", "is_valid", "bool", ["value" => 1])) {
$migration->migrationOneTable("glpi_softwarelicenses");
// Force all entities
if (!isset($_SESSION['glpishowallentities'])) {
$_SESSION['glpishowallentities'] = 0;
}
$savesession = $_SESSION['glpishowallentities'];
$_SESSION['glpishowallentities'] = 1;
$queryl = "SELECT `id`, `number`
FROM `glpi_softwarelicenses`";
foreach ($DB->request($queryl) as $datal) {
if (
($datal['number'] >= 0)
&& ($datal['number'] < Item_SoftwareLicense::countForLicense($datal['id'], -1, 'Computer'))
) {
$queryl2 = "UPDATE `glpi_softwarelicenses`
SET `is_valid` = 0
WHERE `id` = '" . $datal['id'] . "'";
$DB->queryOrDie($queryl2, "0.85 update softwarelicense");
}
}
$_SESSION['glpishowallentities'] = $savesession;
}
if ($migration->addField("glpi_softwares", "is_valid", "bool", ["value" => 1])) {
$migration->migrationOneTable("glpi_softwares");
$querys = "SELECT `glpi_softwares`.`id`
FROM `glpi_softwares`
LEFT JOIN `glpi_softwarelicenses`
ON (`glpi_softwarelicenses`.`softwares_id` = `glpi_softwares`.`id`)
WHERE `glpi_softwarelicenses`.`is_valid` = 0";
foreach ($DB->request($querys) as $datas) {
$querys2 = "UPDATE `glpi_softwares`
SET `is_valid` = 0
WHERE `id` = '" . $datas['id'] . "'";
$DB->queryOrDie($querys2, "0.85 update software");
}
}
// Add condition to rules
$migration->addField('glpi_rules', 'condition', 'integer');
$migration->addKey('glpi_rules', 'condition');
$migration->migrationOneTable('glpi_rules');
// Update condition for RuleTicket : only on add
$query = "UPDATE `glpi_rules`
SET `condition` = 1
WHERE `sub_type` = 'RuleTicket'";
$DB->queryOrDie($query, "0.85 update condition for RuleTicket");
// Update ticket_status for helpdeks profiles
$newcycle = [ 1 => [ 2 => 0, 3 => 0, 4 => 0, 5 => 0, 6 => 0, ],
2 => [ 1 => 0, 3 => 0, 4 => 0, 5 => 0, 6 => 0, ],
3 => [ 1 => 0, 2 => 0, 4 => 0, 5 => 0, 6 => 0, ],
4 => [ 1 => 0, 2 => 0, 3 => 0, 5 => 0, 6 => 0, ],
5 => [ 1 => 0, 2 => 0, 3 => 0, 4 => 0, ],
6 => [ 1 => 0, 2 => 0, 3 => 0, 4 => 0, 5 => 0, ],
];
$query = "UPDATE `glpi_profiles`
SET `ticket_status` = '" . exportArrayToDB($newcycle) . "'
WHERE `interface` = 'helpdesk'";
$DB->queryOrDie($query, "0.85 update default life cycle for helpdesk");
//Add comment field to a virtualmachine
$migration->addField('glpi_computervirtualmachines', 'comment', 'text');
$migration->displayMessage(sprintf(__('Data migration - %s'), 'IP improvment'));
// Ip search improve
$migration->addField('glpi_ipaddresses', 'mainitems_id', 'integer');
$migration->addField('glpi_ipaddresses', 'mainitemtype', 'string', ['after' => 'mainitems_id']);
$migration->migrationOneTable('glpi_ipaddresses');
$migration->addKey('glpi_ipaddresses', ['mainitemtype', 'mainitems_id', 'is_deleted'], 'mainitem');
$query_doc_i = "UPDATE `glpi_ipaddresses` as `ip`
INNER JOIN `glpi_networknames` as `netname`
ON (`ip`.`items_id` = `netname`.`id`
AND `ip`.`itemtype` = 'NetworkName')
INNER JOIN `glpi_networkports` as `netport`
ON (`netname`.`items_id` = `netport`.`id`
AND `netname`.`itemtype` = 'NetworkPort')
SET `ip`.`mainitemtype` = `netport`.`itemtype`,
`ip`.`mainitems_id` = `netport`.`items_id`";
$DB->queryOrDie($query_doc_i, "0.85 update mainitems fields of ipaddresses");
// Upgrade ticket bookmarks
$query = "SELECT *
FROM `glpi_bookmarks`
WHERE `type` = '" . Bookmark::SEARCH . "'";
if ($result = $DB->query($query)) {
if ($DB->numrows($result) > 0) {
while ($data = $DB->fetchAssoc($result)) {
$num = 0;
$num2 = 0;
$options = [];
parse_str($data["query"], $options);
// Copy itemtype if not set
if (!isset($options['itemtype'])) {
$options['itemtype'] = $data['itemtype'];
}
// Move criteria
if (isset($options['field']) && is_array($options['field'])) {
$newkey = 0;
foreach ($options['field'] as $key => $val) {
$options['criteria'][$newkey]['field'] = $val;
// other field
if (isset($options['link'][$key])) {
$options['criteria'][$newkey]['link'] = $options['link'][$key];
}
if (isset($options['searchtype'][$key])) {
$options['criteria'][$newkey]['searchtype'] = $options['searchtype'][$key];
} else {
$options['criteria'][$newkey]['searchtype'] = 'contains';
}
if (isset($options['contains'][$key])) {
$options['criteria'][$newkey]['value'] = $options['contains'][$key];
} else {
$options['criteria'][$newkey]['value'] = '';
}
$newkey++;
}
unset($options['field']);
unset($options['contains']);
unset($options['searchtype']);
unset($options['link']);
}
if (isset($options['glpisearchcount'])) {
unset($options['glpisearchcount']);
}
if (isset($options['field2']) && is_array($options['field2'])) {
$newkey = 0;
foreach ($options['field2'] as $key => $val) {
$options['metacriteria'][$newkey]['field'] = $val;
// other field
if (isset($options['itemtype2'][$key])) {
$options['metacriteria'][$newkey]['itemtype'] = $options['itemtype2'][$key];
}
if (isset($options['link2'][$newkey])) {
$options['metacriteria'][$newkey]['link'] = $options['link2'][$key];
}
if (isset($options['searchtype2'][$key])) {
$options['metacriteria'][$newkey]['searchtype'] = $options['searchtype2'][$key];
} else {
$options['metacriteria'][$newkey]['searchtype'] = 'contains';
}
if (isset($options['contains2'][$key])) {
$options['metacriteria'][$newkey]['value'] = $options['contains2'][$key];
} else {
$options['metacriteria'][$newkey]['value'] = '';
}
$newkey++;
}
unset($options['field2']);
unset($options['contains2']);
unset($options['searchtype2']);
unset($options['link2']);
unset($options['itemtype2']);
}
if (isset($options['glpisearchcount2'])) {
unset($options['glpisearchcount2']);
}
$query2 = "UPDATE `glpi_bookmarks`
SET `query` = '" . addslashes(Toolbox::append_params($options)) . "'
WHERE `id` = '" . $data['id'] . "'";
$DB->queryOrDie($query2, "0.85 update bookmarks for reorg search");
}
}
}
// ************ Keep it at the end **************
//TRANS: %s is the table or item to migrate
$migration->displayMessage(sprintf(__('Data migration - %s'), 'glpi_displaypreferences'));
// Clean display prefs
// Notepad
$query = "UPDATE `glpi_displaypreferences`
SET `num` = 90
WHERE `itemtype` = 'Entity'
AND `num` = 28";
$DB->query($query);
$query = "UPDATE `glpi_displaypreferences`
SET `num` = 200
WHERE `num` = 90";
$DB->query($query);
$migration->updateDisplayPrefs($ADDTODISPLAYPREF, $DELFROMDISPLAYPREF);
// must always be at the end
$migration->executeMigration();
return $updateresult;
}
require_once __DIR__ . '/old_objects.php';
Sindbad File Manager Version 1.0, Coded By Sindbad EG ~ The Terrorists