Linux server.jmdstrack.com 3.10.0-1160.119.1.el7.tuxcare.els10.x86_64 #1 SMP Fri Oct 11 21:40:41 UTC 2024 x86_64
/ home/ jmdstrac/ public_html/ devices/ src/ |
|
<?php /** * --------------------------------------------------------------------- * * GLPI - Gestionnaire Libre de Parc Informatique * * http://glpi-project.org * * @copyright 2015-2023 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/>. * * --------------------------------------------------------------------- */ class RuleDictionnaryDropdownCollection extends RuleCollection { public static $rightname = 'rule_dictionnary_dropdown'; public $menu_type = 'dictionnary'; // Specific ones /// dropdown table public $item_table = ""; public $stop_on_first_match = true; public $can_replay_rules = true; public function replayRulesOnExistingDB($offset = 0, $maxtime = 0, $items = [], $params = []) { global $DB; // Model check : need to check using manufacturer extra data so specific function if (strpos($this->item_table, 'models')) { return $this->replayRulesOnExistingDBForModel($offset, $maxtime); } if (isCommandLine()) { printf(__('Replay rules on existing database started on %s') . "\n", date("r")); } // Get All items $criteria = ['FROM' => $this->item_table]; if ($offset) { $criteria['START'] = $offset; $criteria['LIMIT'] = 999999999; } $iterator = $DB->request($criteria); $nb = count($iterator) + $offset; $i = $offset; if ($nb > $offset) { // Step to refresh progressbar $step = (($nb > 20) ? floor($nb / 20) : 1); $send = []; $send["tablename"] = $this->item_table; foreach ($iterator as $data) { if (!($i % $step)) { if (isCommandLine()) { //TRANS: %1$s is a row, %2$s is total rows printf(__('Replay rules on existing database: %1$s/%2$s') . "\r", $i, $nb); } else { Html::changeProgressBarPosition($i, $nb, "$i / $nb"); } } //Replay Type dictionnary $ID = Dropdown::importExternal( getItemTypeForTable($this->item_table), addslashes($data["name"]), -1, [], addslashes($data["comment"]) ); if ($data['id'] != $ID) { $tomove[$data['id']] = $ID; $type = getItemTypeForTable($this->item_table); if ($dropdown = getItemForItemtype($type)) { $dropdown->delete(['id' => $data['id'], '_replace_by' => $ID ]); } } $i++; if ($maxtime) { $crt = explode(" ", microtime()); if (($crt[0] + $crt[1]) > $maxtime) { break; } } } } if (isCommandLine()) { printf(__('Replay rules on existing database started on %s') . "\n", date("r")); } else { Html::changeProgressBarPosition($i, $nb, "$i / $nb"); } return (($i == $nb) ? -1 : $i); } /** * Replay collection rules on an existing DB for model dropdowns * * @param $offset offset used to begin (default 0) * @param $maxtime maximum time of process (reload at the end) (default 0) * * @return -1 on completion else current offset **/ public function replayRulesOnExistingDBForModel($offset = 0, $maxtime = 0) { global $DB; if (isCommandLine()) { printf(__('Replay rules on existing database started on %s') . "\n", date("r")); } // Model check : need to check using manufacturer extra data if (strpos($this->item_table, 'models') === false) { echo __('Error replaying rules'); return false; } $model_table = getPlural(str_replace('models', '', $this->item_table)); $model_field = getForeignKeyFieldForTable($this->item_table); // Need to give manufacturer from item table $criteria = [ 'SELECT' => [ 'glpi_manufacturers.id AS idmanu', 'glpi_manufacturers.name AS manufacturer', $this->item_table . '.id', $this->item_table . '.name AS name', $this->item_table . '.comment' ], 'DISTINCT' => true, 'FROM' => $this->item_table, 'INNER JOIN' => [ $model_table => [ 'ON' => [ $this->item_table => 'id', $model_table => $model_field ] ] ], 'LEFT JOIN' => [ 'glpi_manufacturers' => [ 'ON' => [ 'glpi_manufacturers' => 'id', $model_table => 'manufacturers_id' ] ] ] ]; if ($offset) { $criteria['START'] = (int)$offset; } $iterator = $DB->request($criteria); $nb = count($iterator) + $offset; $i = $offset; if ($nb > $offset) { // Step to refresh progressbar $step = (($nb > 20) ? floor($nb / 20) : 1); $tocheck = []; foreach ($iterator as $data) { if (!($i % $step)) { if (isCommandLine()) { printf(__('Replay rules on existing database: %1$s/%2$s') . "\r", $i, $nb); } else { Html::changeProgressBarPosition($i, $nb, "$i / $nb"); } } // Model case if (isset($data["manufacturer"])) { $data["manufacturer"] = Manufacturer::processName(addslashes($data["manufacturer"])); } //Replay Type dictionnary $ID = Dropdown::importExternal( getItemTypeForTable($this->item_table), addslashes($data["name"]), -1, $data, addslashes($data["comment"]) ); if ($data['id'] != $ID) { $tocheck[$data["id"]][] = $ID; $where = [ $model_field => $data['id'] ]; if (empty($data['idmanu'])) { $where['OR'] = [ ['manufacturers_id' => null], ['manufacturers_id' => 0] ]; } else { $where['manufacturers_id'] = $data['idmanu']; } $DB->update( $model_table, [$model_field => $ID], $where ); } $i++; if ($maxtime) { $crt = explode(" ", microtime()); if (($crt[0] + $crt[1]) > $maxtime) { break; } } } foreach ($tocheck as $ID => $tab) { $result = $DB->request([ 'COUNT' => 'cpt', 'FROM' => $model_table, 'WHERE' => [$model_field => $ID] ])->current(); $deletecartmodel = false; // No item left : delete old item if ( $result && ($result['cpt'] == 0) ) { $DB->delete( $this->item_table, [ 'id' => $ID ] ); $deletecartmodel = true; } // Manage cartridge assoc Update items if ($this->getRuleClassName() == 'RuleDictionnaryPrinterModel') { $iterator2 = $DB->request([ 'FROM' => 'glpi_cartridgeitems_printermodels', 'WHERE' => ['printermodels_id' => $ID] ]); if (count($iterator2)) { // Get compatible cartridge type $carttype = []; foreach ($iterator2 as $data) { $carttype[] = $data['cartridgeitems_id']; } // Delete cartrodges_assoc if ($deletecartmodel) { $DB->delete( 'glpi_cartridgeitems_printermodels', [ 'printermodels_id' => $ID ] ); } // Add new assoc $ct = new CartridgeItem(); foreach ($carttype as $cartID) { foreach ($tab as $model) { $ct->addCompatibleType($cartID, $model); } } } } } } if (isCommandLine()) { printf(__('Replay rules on existing database ended on %s') . "\n", date("r")); } else { Html::changeProgressBarPosition($i, $nb, "$i / $nb"); } return ($i == $nb ? -1 : $i); } }