500 lines
16 KiB
PHP
500 lines
16 KiB
PHP
<?php
|
|
/**
|
|
* ---------------------------------------------------------------------
|
|
* GLPI - Gestionnaire Libre de Parc Informatique
|
|
* Copyright (C) 2015-2020 Teclib' and contributors.
|
|
*
|
|
* http://glpi-project.org
|
|
*
|
|
* based on GLPI - Gestionnaire Libre de Parc Informatique
|
|
* Copyright (C) 2003-2014 by the INDEPNET Development Team.
|
|
*
|
|
* ---------------------------------------------------------------------
|
|
*
|
|
* LICENSE
|
|
*
|
|
* This file is part of GLPI.
|
|
*
|
|
* GLPI 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 2 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* GLPI 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 GLPI. If not, see <http://www.gnu.org/licenses/>.
|
|
* ---------------------------------------------------------------------
|
|
*/
|
|
|
|
if (!defined('GLPI_ROOT')) {
|
|
die("Sorry. You can't access this file directly");
|
|
}
|
|
|
|
/**
|
|
* State Class
|
|
**/
|
|
class State extends CommonTreeDropdown {
|
|
|
|
public $can_be_translated = true;
|
|
|
|
static $rightname = 'state';
|
|
|
|
|
|
|
|
static function getTypeName($nb = 0) {
|
|
return _n('Status of items', 'Statuses of items', $nb);
|
|
}
|
|
|
|
|
|
static function getFieldLabel() {
|
|
return __('Status');
|
|
}
|
|
|
|
|
|
/**
|
|
* @since 0.85
|
|
*
|
|
* @see CommonTreeDropdown::getAdditionalFields()
|
|
**/
|
|
function getAdditionalFields() {
|
|
|
|
$fields = parent::getAdditionalFields();
|
|
$fields[] = ['label' => __('Visibility'),
|
|
'name' => 'header',
|
|
'list' => false];
|
|
|
|
foreach ($this->getvisibilityFields() as $type => $field) {
|
|
$fields[] = ['name' => $field,
|
|
'label' => $type::getTypeName(Session::getPluralNumber()),
|
|
'type' => 'bool',
|
|
'list' => true];
|
|
}
|
|
return $fields;
|
|
}
|
|
|
|
|
|
/**
|
|
* Dropdown of states for behaviour config
|
|
*
|
|
* @param $name select name
|
|
* @param $lib string to add for -1 value (default '')
|
|
* @param $value default value (default 0)
|
|
**/
|
|
static function dropdownBehaviour($name, $lib = "", $value = 0) {
|
|
global $DB;
|
|
|
|
$elements = ["0" => __('Keep status')];
|
|
|
|
if ($lib) {
|
|
$elements["-1"] = $lib;
|
|
}
|
|
|
|
$iterator = $DB->request([
|
|
'SELECT' => ['id', 'name'],
|
|
'FROM' => 'glpi_states',
|
|
'ORDER' => 'name'
|
|
]);
|
|
|
|
while ($data = $iterator->next()) {
|
|
$elements[$data["id"]] = sprintf(__('Set status: %s'), $data["name"]);
|
|
}
|
|
Dropdown::showFromArray($name, $elements, ['value' => $value]);
|
|
}
|
|
|
|
|
|
static function showSummary() {
|
|
global $DB, $CFG_GLPI;
|
|
|
|
$state_type = $CFG_GLPI["state_types"];
|
|
$states = [];
|
|
|
|
foreach ($state_type as $key=>$itemtype) {
|
|
if ($item = getItemForItemtype($itemtype)) {
|
|
if (!$item->canView()) {
|
|
unset($state_type[$key]);
|
|
|
|
} else {
|
|
$table = getTableForItemType($itemtype);
|
|
$iterator = $DB->request([
|
|
'SELECT' => [
|
|
'states_id',
|
|
'COUNT' => '* AS cpt'
|
|
],
|
|
'FROM' => $table,
|
|
'WHERE' => [
|
|
'is_deleted' => 0,
|
|
'is_template' => 0
|
|
] + getEntitiesRestrictCriteria($table),
|
|
'GROUP' => 'states_id'
|
|
]);
|
|
|
|
while ($data = $iterator->next()) {
|
|
$states[$data["states_id"]][$itemtype] = $data["cpt"];
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if (count($states)) {
|
|
// Produce headline
|
|
echo "<div class='center'><table class='tab_cadrehov'><tr>";
|
|
|
|
// Type
|
|
echo "<th>".__('Status')."</th>";
|
|
|
|
foreach ($state_type as $key => $itemtype) {
|
|
if ($item = getItemForItemtype($itemtype)) {
|
|
echo "<th>".$item->getTypeName(Session::getPluralNumber())."</th>";
|
|
$total[$itemtype] = 0;
|
|
} else {
|
|
unset($state_type[$key]);
|
|
}
|
|
}
|
|
|
|
echo "<th>".__('Total')."</th>";
|
|
echo "</tr>";
|
|
|
|
$iterator = $DB->request([
|
|
'FROM' => 'glpi_states',
|
|
'WHERE' => getEntitiesRestrictCriteria('glpi_states', '', '', true),
|
|
'ORDER' => 'completename'
|
|
]);
|
|
|
|
// No state
|
|
$tot = 0;
|
|
echo "<tr class='tab_bg_2'><td>---</td>";
|
|
foreach ($state_type as $itemtype) {
|
|
echo "<td class='numeric'>";
|
|
|
|
if (isset($states[0][$itemtype])) {
|
|
echo $states[0][$itemtype];
|
|
$total[$itemtype] += $states[0][$itemtype];
|
|
$tot += $states[0][$itemtype];
|
|
} else {
|
|
echo " ";
|
|
}
|
|
|
|
echo "</td>";
|
|
}
|
|
echo "<td class='numeric b'>$tot</td></tr>";
|
|
|
|
while ($data = $iterator>next()) {
|
|
$tot = 0;
|
|
echo "<tr class='tab_bg_2'><td class='b'>";
|
|
|
|
$opt = ['reset' => 'reset',
|
|
'sort' => 1,
|
|
'start' => 0,
|
|
'criteria' => ['0' => ['value' => '$$$$'.$data['id'],
|
|
'searchtype' => 'contains',
|
|
'field' => 31]]];
|
|
echo "<a href='".$CFG_GLPI['root_doc']."/front/allassets.php?".Toolbox::append_params($opt, '&')."'>".$data["completename"]."</a></td>";
|
|
|
|
foreach ($state_type as $itemtype) {
|
|
echo "<td class='numeric'>";
|
|
|
|
if (isset($states[$data["id"]][$itemtype])) {
|
|
echo $states[$data["id"]][$itemtype];
|
|
$total[$itemtype] += $states[$data["id"]][$itemtype];
|
|
$tot += $states[$data["id"]][$itemtype];
|
|
} else {
|
|
echo " ";
|
|
}
|
|
|
|
echo "</td>";
|
|
}
|
|
echo "<td class='numeric b'>$tot</td>";
|
|
echo "</tr>";
|
|
}
|
|
echo "<tr class='tab_bg_2'><td class='center b'>".__('Total')."</td>";
|
|
$tot = 0;
|
|
|
|
foreach ($state_type as $itemtype) {
|
|
echo "<td class='numeric b'>".$total[$itemtype]."</td>";
|
|
$tot += $total[$itemtype];
|
|
}
|
|
|
|
echo "<td class='numeric b'>$tot</td></tr>";
|
|
echo "</table></div>";
|
|
|
|
} else {
|
|
echo "<div class='center b'>".__('No item found')."</div>";
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
* @since 0.85
|
|
*
|
|
* @see CommonDBTM::getEmpty()
|
|
**/
|
|
function getEmpty() {
|
|
|
|
parent::getEmpty();
|
|
//initialize is_visible_* fields at true to keep the same behavior as in older versions
|
|
foreach ($this->getvisibilityFields() as $type => $field) {
|
|
$this->fields[$field] = 1;
|
|
}
|
|
}
|
|
|
|
|
|
function cleanDBonPurge() {
|
|
Rule::cleanForItemCriteria($this);
|
|
}
|
|
|
|
|
|
/**
|
|
* @since 0.85
|
|
*
|
|
* @see CommonTreeDropdown::prepareInputForAdd()
|
|
**/
|
|
function prepareInputForAdd($input) {
|
|
if (!isset($input['states_id'])) {
|
|
$input['states_id'] = 0;
|
|
}
|
|
if (!$this->isUnique($input)) {
|
|
Session::addMessageAfterRedirect(
|
|
sprintf(__('%1$s must be unique!'), $this->getType(1)),
|
|
false,
|
|
ERROR
|
|
);
|
|
return false;
|
|
}
|
|
|
|
$input = parent::prepareInputForAdd($input);
|
|
|
|
$state = new self();
|
|
// Get visibility information from parent if not set
|
|
if (isset($input['states_id']) && $state->getFromDB($input['states_id'])) {
|
|
foreach ($this->getvisibilityFields() as $type => $field) {
|
|
if (!isset($input[$field]) && isset($state->fields[$field])) {
|
|
$input[$field] = $state->fields[$field];
|
|
}
|
|
}
|
|
}
|
|
return $input;
|
|
}
|
|
|
|
|
|
function rawSearchOptions() {
|
|
$tab = parent::rawSearchOptions();
|
|
|
|
$tab[] = [
|
|
'id' => '21',
|
|
'table' => $this->getTable(),
|
|
'field' => 'is_visible_computer',
|
|
'name' => sprintf(__('%1$s - %2$s'), __('Visibility'), Computer::getTypeName(Session::getPluralNumber())),
|
|
'datatype' => 'bool'
|
|
];
|
|
|
|
$tab[] = [
|
|
'id' => '22',
|
|
'table' => $this->getTable(),
|
|
'field' => 'is_visible_softwareversion',
|
|
'name' => sprintf(__('%1$s - %2$s'), __('Visibility'),
|
|
SoftwareVersion::getTypeName(Session::getPluralNumber())),
|
|
'datatype' => 'bool'
|
|
];
|
|
|
|
$tab[] = [
|
|
'id' => '23',
|
|
'table' => $this->getTable(),
|
|
'field' => 'is_visible_monitor',
|
|
'name' => sprintf(__('%1$s - %2$s'), __('Visibility'), Monitor::getTypeName(Session::getPluralNumber())),
|
|
'datatype' => 'bool'
|
|
];
|
|
|
|
$tab[] = [
|
|
'id' => '24',
|
|
'table' => $this->getTable(),
|
|
'field' => 'is_visible_printer',
|
|
'name' => sprintf(__('%1$s - %2$s'), __('Visibility'), Printer::getTypeName(Session::getPluralNumber())),
|
|
'datatype' => 'bool'
|
|
];
|
|
|
|
$tab[] = [
|
|
'id' => '25',
|
|
'table' => $this->getTable(),
|
|
'field' => 'is_visible_peripheral',
|
|
'name' => sprintf(__('%1$s - %2$s'), __('Visibility'), Peripheral::getTypeName(Session::getPluralNumber())),
|
|
'datatype' => 'bool'
|
|
];
|
|
|
|
$tab[] = [
|
|
'id' => '26',
|
|
'table' => $this->getTable(),
|
|
'field' => 'is_visible_phone',
|
|
'name' => sprintf(__('%1$s - %2$s'), __('Visibility'), Phone::getTypeName(Session::getPluralNumber())),
|
|
'datatype' => 'bool'
|
|
];
|
|
|
|
$tab[] = [
|
|
'id' => '27',
|
|
'table' => $this->getTable(),
|
|
'field' => 'is_visible_networkequipment',
|
|
'name' => sprintf(__('%1$s - %2$s'), __('Visibility'),
|
|
NetworkEquipment::getTypeName(Session::getPluralNumber())),
|
|
'datatype' => 'bool'
|
|
];
|
|
|
|
$tab[] = [
|
|
'id' => '28',
|
|
'table' => $this->getTable(),
|
|
'field' => 'is_visible_softwarelicense',
|
|
'name' => sprintf(__('%1$s - %2$s'), __('Visibility'),
|
|
SoftwareLicense::getTypeName(Session::getPluralNumber())),
|
|
'datatype' => 'bool'
|
|
];
|
|
|
|
$tab[] = [
|
|
'id' => '29',
|
|
'table' => $this->getTable(),
|
|
'field' => 'is_visible_certificate',
|
|
'name' => sprintf(__('%1$s - %2$s'), __('Visibility'),
|
|
Certificate::getTypeName(Session::getPluralNumber())),
|
|
'datatype' => 'bool'
|
|
];
|
|
|
|
$tab[] = [
|
|
'id' => '30',
|
|
'table' => $this->getTable(),
|
|
'field' => 'is_visible_rack',
|
|
'name' => sprintf(__('%1$s - %2$s'), __('Visibility'),
|
|
Rack::getTypeName(Session::getPluralNumber())),
|
|
'datatype' => 'bool'
|
|
];
|
|
|
|
$tab[] = [
|
|
'id' => '31',
|
|
'table' => $this->getTable(),
|
|
'field' => 'is_visible_line',
|
|
'name' => sprintf(__('%1$s - %2$s'), __('Visibility'),
|
|
Line::getTypeName(Session::getPluralNumber())),
|
|
'datatype' => 'bool'
|
|
];
|
|
|
|
$tab[] = [
|
|
'id' => '32',
|
|
'table' => $this->getTable(),
|
|
'field' => 'is_visible_enclosure',
|
|
'name' => sprintf(__('%1$s - %2$s'), __('Visibility'),
|
|
Enclosure::getTypeName(Session::getPluralNumber())),
|
|
'datatype' => 'bool'
|
|
];
|
|
|
|
$tab[] = [
|
|
'id' => '33',
|
|
'table' => $this->getTable(),
|
|
'field' => 'is_visible_pdu',
|
|
'name' => sprintf(__('%1$s - %2$s'), __('Visibility'),
|
|
PDU::getTypeName(Session::getPluralNumber())),
|
|
'datatype' => 'bool'
|
|
];
|
|
|
|
$tab[] = [
|
|
'id' => '34',
|
|
'table' => $this->getTable(),
|
|
'field' => 'is_visible_cluster',
|
|
'name' => sprintf(__('%1$s - %2$s'), __('Visibility'),
|
|
Cluster::getTypeName(Session::getPluralNumber())),
|
|
'datatype' => 'bool'
|
|
];
|
|
|
|
$tab[] = [
|
|
'id' => '35',
|
|
'table' => $this->getTable(),
|
|
'field' => 'is_visible_passivedcequipment',
|
|
'name' => sprintf(__('%1$s - %2$s'), __('Visibility'),
|
|
PassiveDCEquipment::getTypeName(Session::getPluralNumber())),
|
|
'datatype' => 'bool'
|
|
];
|
|
|
|
$tab[] = [
|
|
'id' => '36',
|
|
'table' => $this->getTable(),
|
|
'field' => 'is_visible_contract',
|
|
'name' => sprintf(__('%1$s - %2$s'), __('Visibility'),
|
|
Contract::getTypeName(Session::getPluralNumber())),
|
|
'datatype' => 'bool'
|
|
];
|
|
|
|
$tab[] = [
|
|
'id' => '37',
|
|
'table' => $this->getTable(),
|
|
'field' => 'is_visible_appliance',
|
|
'name' => sprintf(__('%1$s - %2$s'), __('Visibility'),
|
|
Appliance::getTypeName(Session::getPluralNumber())),
|
|
'datatype' => 'bool'
|
|
];
|
|
|
|
return $tab;
|
|
}
|
|
|
|
function prepareInputForUpdate($input) {
|
|
if (!$this->isUnique($input)) {
|
|
Session::addMessageAfterRedirect(
|
|
sprintf(__('%1$s must be unique per level!'), $this->getType(1)),
|
|
false,
|
|
ERROR
|
|
);
|
|
return false;
|
|
}
|
|
return parent::prepareInputForUpdate($input);
|
|
}
|
|
|
|
/**
|
|
* Checks that this state is unique given the new field values.
|
|
* Unique fields checked:
|
|
* - states_id
|
|
* - name
|
|
* @param array $input Array of field names and values
|
|
* @return boolean True if the new/updated record will be unique
|
|
*/
|
|
public function isUnique($input) {
|
|
global $DB;
|
|
|
|
$unicity_fields = ['states_id', 'name'];
|
|
|
|
$has_changed = false;
|
|
$where = [];
|
|
foreach ($unicity_fields as $unicity_field) {
|
|
if (isset($input[$unicity_field]) &&
|
|
(!isset($this->fields[$unicity_field]) || $input[$unicity_field] != $this->fields[$unicity_field])) {
|
|
$has_changed = true;
|
|
}
|
|
if (isset($input[$unicity_field])) {
|
|
$where[$unicity_field] = $input[$unicity_field];
|
|
}
|
|
}
|
|
if (!$has_changed) {
|
|
//state has not changed; this is OK.
|
|
return true;
|
|
}
|
|
|
|
$query = [
|
|
'FROM' => $this->getTable(),
|
|
'COUNT' => 'cpt',
|
|
'WHERE' => $where
|
|
];
|
|
$row = $DB->request($query)->next();
|
|
return (int)$row['cpt'] == 0;
|
|
}
|
|
|
|
/**
|
|
* Get visibility fields from conf
|
|
*/
|
|
protected function getvisibilityFields() :array {
|
|
global $CFG_GLPI;
|
|
$fields = [];
|
|
foreach ($CFG_GLPI['state_types'] as $type) {
|
|
$fields[$type] = 'is_visible_' . strtolower($type);
|
|
}
|
|
return $fields;
|
|
}
|
|
|
|
}
|