%PDF- %PDF-
| Direktori : /var/www/projetos/suporte.iigd.com.br/src/Inventory/Asset/ |
| Current File : /var/www/projetos/suporte.iigd.com.br/src/Inventory/Asset/Device.php |
<?php
/**
* ---------------------------------------------------------------------
*
* GLPI - Gestionnaire Libre de Parc Informatique
*
* http://glpi-project.org
*
* @copyright 2015-2024 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/>.
*
* ---------------------------------------------------------------------
*/
namespace Glpi\Inventory\Asset;
use Glpi\Toolbox\Sanitizer;
use Item_Devices;
abstract class Device extends InventoryAsset
{
/**
* Get existing entries from database
*
* @return array
*/
protected function getExisting($itemdevicetable, $fk): array
{
/** @var \DBmysql $DB */
global $DB;
$db_existing = [];
$iterator = $DB->request([
'FROM' => $itemdevicetable,
'WHERE' => [
"$itemdevicetable.items_id" => $this->item->fields['id'],
"$itemdevicetable.itemtype" => $this->item->getType()
]
]);
foreach ($iterator as $row) {
$db_existing[$row[$fk]][] = $row;
}
return $db_existing;
}
public function handle()
{
/** @var \DBmysql $DB */
global $DB;
$devicetypes = Item_Devices::getItemAffinities($this->item->getType());
$itemdevicetype = $this->getItemtype();
if (in_array($itemdevicetype, $devicetypes)) {
$value = $this->data;
$itemdevice = new $itemdevicetype();
$itemdevicetable = getTableForItemType($itemdevicetype);
$devicetype = $itemdevicetype::getDeviceType();
$device = new $devicetype();
$devicetable = getTableForItemType($devicetype);
$fk = getForeignKeyFieldForTable($devicetable);
$existing = $this->getExisting($itemdevicetable, $fk);
foreach ($value as $val) {
if (!isset($val->designation) || $val->designation == '') {
//cannot be empty
$val->designation = $itemdevice->getTypeName(1);
}
//force conversion if needed for date format as 2015-04-16T00:00:00Z
// TODO : need to straighten up date format globally (especially for JSON inventory) which does not use the converter
if (property_exists($val, 'date')) {
$val->date = date('Y-m-d', strtotime($val->date));
}
//create device or get existing device ID
$raw_input = $this->handleInput($val, $device);
$device_input = Sanitizer::dbEscapeRecursive($raw_input); // `handleInput` may copy unescaped values
$device_id = $device->import($device_input + ['with_history' => false]);
$i_criteria = $itemdevice->getImportCriteria();
$fk_input = [
$fk => $device_id,
'itemtype' => $this->item->getType(),
'items_id' => $this->item->fields['id'],
'is_dynamic' => 1
];
$i_input = $fk_input;
//populate compare criteria
foreach (array_keys($i_criteria) as $column) {
if (isset($raw_input[$column])) {
$i_input[$column] = $raw_input[$column];
}
}
//check if deviceitem should be updated or added.
$equals = false;
foreach ($existing[$device_id] ?? [] as $key => $existing_item) {
$equals = true;
foreach ($i_criteria as $field => $compare) {
if (!$equals) {
//no need to continue if one of conditions is false already
break;
}
$compare = explode(':', $compare);
if (!isset($i_input[$field]) && !isset($existing_item[$field])) {
//field not present, skip
continue;
}
switch ($compare[0]) {
case 'equal':
if (!isset($i_input[$field]) || $i_input[$field] != $existing_item[$field]) {
$equals = false;
}
break;
case 'delta':
if (
$i_input[$field] - (int)$compare[1] > $existing_item[$field]
&& $i_input[$field] + (int)$compare[1] < $existing_item[$field]
) {
$equals = false;
}
break;
}
}
if ($equals) {
$itemdevice->getFromDB($existing_item['id']);
$itemdevice_data = [
'id' => $existing_item['id'],
$fk => $device_id,
'itemtype' => $this->item->getType(),
'items_id' => $this->item->fields['id'],
'is_dynamic' => 1
] + $this->handleInput($val, $itemdevice);
$itemdevice->update(Sanitizer::sanitize($itemdevice_data), true);
unset($existing[$device_id][$key]);
break;
}
}
if (!$equals) {
$itemdevice->getEmpty();
$itemdevice_data = [
$fk => $device_id,
'itemtype' => $this->item->getType(),
'items_id' => $this->item->fields['id'],
'is_dynamic' => 1
] + $this->handleInput($val, $itemdevice);
$itemdevice->add(Sanitizer::sanitize($itemdevice_data), [], !$this->item->isNewItem()); //log only if mainitem is not new
$this->itemdeviceAdded($itemdevice, $val);
}
if (count($existing[$device_id] ?? []) == 0) {
unset($existing[$device_id]);
}
}
//remove remaining devices instances
foreach ($existing as $data) {
foreach ($data as $itemdevice_data) {
if ($itemdevice_data['is_dynamic'] == 1) {
$itemdevice->delete(['id' => $itemdevice_data['id']], true, !$this->item->isNewItem()); //log only if mainitem is not new
}
}
}
}
}
protected function itemdeviceAdded(Item_Devices $itemdevice, $val)
{
//to be overrided
}
}