Files
MYSOPHAL/inc/entity.class.php
2025-08-07 13:15:31 +01:00

3363 lines
117 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/>.
* ---------------------------------------------------------------------
*/
use Glpi\Event;
if (!defined('GLPI_ROOT')) {
die("Sorry. You can't access this file directly");
}
/**
* Entity class
*/
class Entity extends CommonTreeDropdown {
use MapGeolocation;
public $must_be_replace = true;
public $dohistory = true;
public $first_level_menu = "admin";
public $second_level_menu = "entity";
static $rightname = 'entity';
protected $usenotepad = true;
const READHELPDESK = 1024;
const UPDATEHELPDESK = 2048;
const CONFIG_PARENT = -2;
const CONFIG_NEVER = -10;
const AUTO_ASSIGN_HARDWARE_CATEGORY = 1;
const AUTO_ASSIGN_CATEGORY_HARDWARE = 2;
// Array of "right required to update" => array of fields allowed
// Missing field here couldn't be update (no right)
private static $field_right = [
'entity' => [
// Address
'address', 'country', 'email', 'fax', 'notepad',
'longitude','latitude','altitude',
'phonenumber', 'postcode', 'state', 'town',
'website',
// Advanced (could be user_authtype ?)
'authldaps_id', 'entity_ldapfilter', 'ldap_dn',
'mail_domain', 'tag',
// Inventory
'entities_id_software', 'level', 'name',
'completename', 'entities_id',
'ancestors_cache', 'sons_cache', 'comment'
],
// Inventory
'infocom' => [
'autofill_buy_date', 'autofill_delivery_date',
'autofill_order_date', 'autofill_use_date',
'autofill_warranty_date',
'autofill_decommission_date'
],
// Notification
'notification' => [
'admin_email', 'admin_reply', 'admin_email_name',
'admin_reply_name', 'delay_send_emails',
'is_notif_enable_default',
'default_cartridges_alarm_threshold',
'default_consumables_alarm_threshold',
'default_contract_alert', 'default_infocom_alert',
'mailing_signature', 'cartridges_alert_repeat',
'consumables_alert_repeat', 'notclosed_delay',
'use_licenses_alert', 'use_certificates_alert',
'send_licenses_alert_before_delay',
'send_certificates_alert_before_delay',
'use_contracts_alert',
'send_contracts_alert_before_delay',
'use_reservations_alert', 'use_infocoms_alert',
'send_infocoms_alert_before_delay',
'notification_subject_tag', 'use_domains_alert',
'send_domains_alert_close_expiries_delay', 'send_domains_alert_expired_delay'
],
// Helpdesk
'entity_helpdesk' => [
'calendars_id', 'tickettype', 'auto_assign_mode',
'autoclose_delay', 'inquest_config',
'inquest_rate', 'inquest_delay',
'inquest_duration','inquest_URL',
'max_closedate', 'tickettemplates_id',
'changetemplates_id', 'problemtemplates_id',
'suppliers_as_private', 'autopurge_delay', 'anonymize_support_agents'
],
// Configuration
'config' => ['enable_custom_css', 'custom_css_code']
];
function getForbiddenStandardMassiveAction() {
$forbidden = parent::getForbiddenStandardMassiveAction();
$forbidden[] = 'delete';
$forbidden[] = 'purge';
$forbidden[] = 'restore';
$forbidden[] = 'CommonDropdown'.MassiveAction::CLASS_ACTION_SEPARATOR.'merge';
return $forbidden;
}
/**
* @since 0.84
**/
function pre_deleteItem() {
global $GLPI_CACHE;
// Security do not delete root entity
if ($this->input['id'] == 0) {
return false;
}
//Cleaning sons calls getAncestorsOf and thus... Re-create cache. Call it before clean.
$this->cleanParentsSons();
if (Toolbox::useCache()) {
$ckey = 'ancestors_cache_' . $this->getTable() . '_' . $this->getID();
$GLPI_CACHE->delete($ckey);
}
return true;
}
static function getTypeName($nb = 0) {
return _n('Entity', 'Entities', $nb);
}
function canCreateItem() {
// Check the parent
return Session::haveRecursiveAccessToEntity($this->getField('entities_id'));
}
/**
* @since 0.84
**/
static function canUpdate() {
return (Session::haveRightsOr(self::$rightname, [UPDATE, self::UPDATEHELPDESK])
|| Session::haveRight('notification', UPDATE));
}
function canUpdateItem() {
// Check the current entity
return Session::haveAccessToEntity($this->getField('id'));
}
function canViewItem() {
// Check the current entity
return Session::haveAccessToEntity($this->getField('id'));
}
static function isNewID($ID) {
return (($ID < 0) || !strlen($ID));
}
/**
* Can object have a location
*
* @since 9.3
*
* @return boolean
*/
function maybeLocated() {
return true;
}
/**
* Check right on each field before add / update
*
* @since 0.84 (before in entitydata.class)
*
* @param $input array (form)
*
* @return array (filtered input)
**/
private function checkRightDatas($input) {
$tmp = [];
if (isset($input['id'])) {
$tmp['id'] = $input['id'];
}
foreach (self::$field_right as $right => $fields) {
if ($right == 'entity_helpdesk') {
if (Session::haveRight(self::$rightname, self::UPDATEHELPDESK )) {
foreach ($fields as $field) {
if (isset($input[$field])) {
$tmp[$field] = $input[$field];
}
}
}
} else {
if (Session::haveRight($right, UPDATE)) {
foreach ($fields as $field) {
if (isset($input[$field])) {
$tmp[$field] = $input[$field];
}
}
}
}
}
// Add framework / internal ones
foreach ($input as $key => $val) {
if ($key[0] == '_') {
$tmp[$key] = $input[$key];
}
}
return $tmp;
}
/**
* @since 0.84 (before in entitydata.class)
**/
function prepareInputForAdd($input) {
global $DB;
$input['name'] = isset($input['name']) ? trim($input['name']) : '';
if (empty($input["name"])) {
Session::addMessageAfterRedirect(__("You can't add an entity without name"),
false, ERROR);
return false;
}
$input = parent::prepareInputForAdd($input);
$result = $DB->request([
'SELECT' => new \QueryExpression(
'MAX('.$DB->quoteName('id').')+1 AS newID'
),
'FROM' => $this->getTable()
])->next();
$input['id'] = $result['newID'];
$input['max_closedate'] = $_SESSION["glpi_currenttime"];
if (!Session::isCron()) { // Filter input for connected
$input = $this->checkRightDatas($input);
}
return $input;
}
/**
* @since 0.84 (before in entitydata.class)
**/
function prepareInputForUpdate($input) {
$input = parent::prepareInputForUpdate($input);
// Si on change le taux de déclenchement de l'enquête (enquête activée) ou le type de l'enquete,
// cela s'applique aux prochains tickets - Pas à l'historique
if ((isset($input['inquest_rate'])
&& (($this->fields['inquest_rate'] == 0)
|| is_null($this->fields['max_closedate']))
&& ($input['inquest_rate'] != $this->fields['inquest_rate']))
|| (isset($input['inquest_config'])
&& (($this->fields['inquest_config'] == self::CONFIG_PARENT)
|| is_null($this->fields['max_closedate']))
&& ($input['inquest_config'] != $this->fields['inquest_config']))) {
$input['max_closedate'] = $_SESSION["glpi_currenttime"];
}
// Force entities_id = -1 for root entity
if ($input['id'] == 0) {
$input['entities_id'] = -1;
$input['level'] = 1;
}
if (!Session::isCron()) { // Filter input for connected
$input = $this->checkRightDatas($input);
}
return $input;
}
function defineTabs($options = []) {
$ong = [];
$this->addDefaultFormTab($ong);
$this->addImpactTab($ong, $options);
$this->addStandardTab(__CLASS__, $ong, $options);
$this->addStandardTab('Profile_User', $ong, $options);
$this->addStandardTab('Rule', $ong, $options);
$this->addStandardTab('Document_Item', $ong, $options);
$this->addStandardTab('Notepad', $ong, $options);
$this->addStandardTab('KnowbaseItem_Item', $ong, $options);
$this->addStandardTab('Log', $ong, $options);
return $ong;
}
/**
* @since 0.84 (before in entitydata.class)
**/
function getTabNameForItem(CommonGLPI $item, $withtemplate = 0) {
if (!$withtemplate) {
switch ($item->getType()) {
case __CLASS__ :
$ong = [];
$ong[1] = $this->getTypeName(Session::getPluralNumber());
$ong[2] = __('Address');
$ong[3] = __('Advanced information');
if (Notification::canView()) {
$ong[4] = _n('Notification', 'Notifications', Session::getPluralNumber());
}
if (Session::haveRightsOr(self::$rightname,
[self::READHELPDESK, self::UPDATEHELPDESK])) {
$ong[5] = __('Assistance');
}
$ong[6] = __('Assets');
if (Session::haveRight(Config::$rightname, [UPDATE])) {
$ong[7] = __('UI customization');
}
return $ong;
}
}
return '';
}
/**
* @since 0.84 (before in entitydata.class)
**/
static function displayTabContentForItem(CommonGLPI $item, $tabnum = 1, $withtemplate = 0) {
if ($item->getType()==__CLASS__) {
switch ($tabnum) {
case 1 :
$item->showChildren();
break;
case 2 :
self::showStandardOptions($item);
break;
case 3 :
self::showAdvancedOptions($item);
break;
case 4 :
self::showNotificationOptions($item);
break;
case 5 :
self::showHelpdeskOptions($item);
break;
case 6 :
self::showInventoryOptions($item);
break;
case 7 :
self::showUiCustomizationOptions($item);
break;
}
}
return true;
}
/**
* Print a good title for entity pages
*
*@return void
**/
function title() {
// Empty title for entities
}
function displayHeader() {
Html::header($this->getTypeName(1), '', "admin", "entity");
}
/**
* Get the ID of entity assigned to the object
*
* simply return ID
*
* @return integer ID of the entity
**/
function getEntityID() {
if (isset($this->fields["id"])) {
return $this->fields["id"];
}
return -1;
}
function isEntityAssign() {
return true;
}
function maybeRecursive() {
return true;
}
/**
* Is the object recursive
*
* Entity are always recursive
*
* @return integer (0/1)
**/
function isRecursive () {
return true;
}
function post_addItem() {
parent::post_addItem();
// Add right to current user - Hack to avoid login/logout
$_SESSION['glpiactiveentities'][$this->fields['id']] = $this->fields['id'];
$_SESSION['glpiactiveentities_string'] .= ",'".$this->fields['id']."'";
}
function cleanDBonPurge() {
// most use entities_id, RuleDictionnarySoftwareCollection use new_entities_id
Rule::cleanForItemAction($this, '%entities_id');
Rule::cleanForItemCriteria($this);
$this->deleteChildrenAndRelationsFromDb(
[
Entity_KnowbaseItem::class,
Entity_Reminder::class,
Entity_RSSFeed::class,
]
);
}
function rawSearchOptions() {
$tab = [];
$tab[] = [
'id' => 'common',
'name' => __('Characteristics')
];
$tab[] = [
'id' => '1',
'table' => $this->getTable(),
'field' => 'completename',
'name' => __('Complete name'),
'datatype' => 'itemlink',
'massiveaction' => false
];
$tab[] = [
'id' => '2',
'table' => $this->getTable(),
'field' => 'id',
'name' => __('ID'),
'massiveaction' => false,
'datatype' => 'number'
];
$tab[] = [
'id' => '14',
'table' => $this->getTable(),
'field' => 'name',
'name' => __('Name'),
'datatype' => 'itemlink',
'massiveaction' => false
];
$tab[] = [
'id' => '3',
'table' => $this->getTable(),
'field' => 'address',
'name' => __('Address'),
'massiveaction' => false,
'datatype' => 'text'
];
$tab[] = [
'id' => '4',
'table' => $this->getTable(),
'field' => 'website',
'name' => __('Website'),
'massiveaction' => false,
'datatype' => 'string',
'autocomplete' => true,
];
$tab[] = [
'id' => '5',
'table' => $this->getTable(),
'field' => 'phonenumber',
'name' => Phone::getTypeName(1),
'massiveaction' => false,
'datatype' => 'string',
'autocomplete' => true,
];
$tab[] = [
'id' => '6',
'table' => $this->getTable(),
'field' => 'email',
'name' => _n('Email', 'Emails', 1),
'datatype' => 'email',
'massiveaction' => false,
'autocomplete' => true,
];
$tab[] = [
'id' => '10',
'table' => $this->getTable(),
'field' => 'fax',
'name' => __('Fax'),
'massiveaction' => false,
'datatype' => 'string',
'autocomplete' => true,
];
$tab[] = [
'id' => '25',
'table' => $this->getTable(),
'field' => 'postcode',
'name' => __('Postal code'),
'datatype' => 'string',
'autocomplete' => true,
];
$tab[] = [
'id' => '11',
'table' => $this->getTable(),
'field' => 'town',
'name' => __('City'),
'massiveaction' => false,
'datatype' => 'string',
'autocomplete' => true,
];
$tab[] = [
'id' => '12',
'table' => $this->getTable(),
'field' => 'state',
'name' => _x('location', 'State'),
'massiveaction' => false,
'datatype' => 'string',
'autocomplete' => true,
];
$tab[] = [
'id' => '13',
'table' => $this->getTable(),
'field' => 'country',
'name' => __('Country'),
'massiveaction' => false,
'datatype' => 'string',
'autocomplete' => true,
];
$tab[] = [
'id' => '67',
'table' => $this->getTable(),
'field' => 'latitude',
'name' => __('Latitude'),
'massiveaction' => false,
'datatype' => 'string',
'autocomplete' => true,
];
$tab[] = [
'id' => '68',
'table' => $this->getTable(),
'field' => 'longitude',
'name' => __('Longitude'),
'massiveaction' => false,
'datatype' => 'string',
'autocomplete' => true,
];
$tab[] = [
'id' => '69',
'table' => $this->getTable(),
'field' => 'altitude',
'name' => __('Altitude'),
'massiveaction' => false,
'datatype' => 'string',
'autocomplete' => true,
];
$tab[] = [
'id' => '16',
'table' => $this->getTable(),
'field' => 'comment',
'name' => __('Comments'),
'datatype' => 'text'
];
$tab[] = [
'id' => '122',
'table' => $this->getTable(),
'field' => 'date_mod',
'name' => __('Last update'),
'datatype' => 'datetime',
'massiveaction' => false
];
$tab[] = [
'id' => '121',
'table' => $this->getTable(),
'field' => 'date_creation',
'name' => __('Creation date'),
'datatype' => 'datetime',
'massiveaction' => false
];
// add objectlock search options
$tab = array_merge($tab, ObjectLock::rawSearchOptionsToAdd(get_class($this)));
$tab = array_merge($tab, Notepad::rawSearchOptionsToAdd());
$tab[] = [
'id' => 'advanced',
'name' => __('Advanced information')
];
$tab[] = [
'id' => '7',
'table' => $this->getTable(),
'field' => 'ldap_dn',
'name' => __('LDAP directory information attribute representing the entity'),
'massiveaction' => false,
'datatype' => 'string',
'autocomplete' => true,
];
$tab[] = [
'id' => '8',
'table' => $this->getTable(),
'field' => 'tag',
'name' => __('Information in inventory tool (TAG) representing the entity'),
'massiveaction' => false,
'datatype' => 'string',
'autocomplete' => true,
];
$tab[] = [
'id' => '9',
'table' => 'glpi_authldaps',
'field' => 'name',
'name' => __('LDAP directory of an entity'),
'massiveaction' => false,
'datatype' => 'dropdown'
];
$tab[] = [
'id' => '17',
'table' => $this->getTable(),
'field' => 'entity_ldapfilter',
'name' => __('Search filter (if needed)'),
'massiveaction' => false,
'datatype' => 'string',
'autocomplete' => true,
];
$tab[] = [
'id' => '20',
'table' => $this->getTable(),
'field' => 'mail_domain',
'name' => __('Mail domain'),
'massiveaction' => false,
'datatype' => 'string',
'autocomplete' => true,
];
$tab[] = [
'id' => 'notif',
'name' => __('Notification options')
];
$tab[] = [
'id' => '60',
'table' => $this->getTable(),
'field' => 'delay_send_emails',
'name' => __('Delay to send email notifications'),
'massiveaction' => false,
'nosearch' => true,
'datatype' => 'number',
'min' => 0,
'max' => 60,
'step' => 1,
'unit' => 'minute',
'toadd' => [self::CONFIG_PARENT => __('Inheritance of the parent entity')]
];
$tab[] = [
'id' => '61',
'table' => $this->getTable(),
'field' => 'is_notif_enable_default',
'name' => __('Enable notifications by default'),
'massiveaction' => false,
'nosearch' => true,
'datatype' => 'string'
];
$tab[] = [
'id' => '18',
'table' => $this->getTable(),
'field' => 'admin_email',
'name' => __('Administrator email'),
'massiveaction' => false,
'datatype' => 'string',
'autocomplete' => true,
];
$tab[] = [
'id' => '19',
'table' => $this->getTable(),
'field' => 'admin_reply',
'name' => __('Administrator reply-to email (if needed)'),
'massiveaction' => false,
'datatype' => 'string',
'autocomplete' => true,
];
$tab[] = [
'id' => '21',
'table' => $this->getTable(),
'field' => 'notification_subject_tag',
'name' => __('Prefix for notifications'),
'datatype' => 'string',
'autocomplete' => true,
];
$tab[] = [
'id' => '22',
'table' => $this->getTable(),
'field' => 'admin_email_name',
'name' => __('Administrator name'),
'datatype' => 'string',
'autocomplete' => true,
];
$tab[] = [
'id' => '23',
'table' => $this->getTable(),
'field' => 'admin_reply_name',
'name' => __('Response address (if needed)'),
'datatype' => 'string',
'autocomplete' => true,
];
$tab[] = [
'id' => '24',
'table' => $this->getTable(),
'field' => 'mailing_signature',
'name' => __('Email signature'),
'datatype' => 'text'
];
$tab[] = [
'id' => '26',
'table' => $this->getTable(),
'field' => 'cartridges_alert_repeat',
'name' => __('Alarms on cartridges'),
'massiveaction' => false,
'nosearch' => true,
'datatype' => 'specific'
];
$tab[] = [
'id' => '27',
'table' => $this->getTable(),
'field' => 'consumables_alert_repeat',
'name' => __('Alarms on consumables'),
'massiveaction' => false,
'nosearch' => true,
'datatype' => 'specific'
];
$tab[] = [
'id' => '29',
'table' => $this->getTable(),
'field' => 'use_licenses_alert',
'name' => __('Alarms on expired licenses'),
'massiveaction' => false,
'nosearch' => true,
'datatype' => 'specific'
];
$tab[] = [
'id' => '53',
'table' => $this->getTable(),
'field' => 'send_licenses_alert_before_delay',
'name' => __('Send license alarms before'),
'massiveaction' => false,
'nosearch' => true,
'datatype' => 'specific'
];
$tab[] = [
'id' => '30',
'table' => $this->getTable(),
'field' => 'use_contracts_alert',
'name' => __('Alarms on contracts'),
'massiveaction' => false,
'nosearch' => true,
'datatype' => 'specific'
];
$tab[] = [
'id' => '54',
'table' => $this->getTable(),
'field' => 'send_contracts_alert_before_delay',
'name' => __('Send contract alarms before'),
'massiveaction' => false,
'nosearch' => true,
'datatype' => 'specific'
];
$tab[] = [
'id' => '31',
'table' => $this->getTable(),
'field' => 'use_infocoms_alert',
'name' => __('Alarms on financial and administrative information'),
'massiveaction' => false,
'nosearch' => true,
'datatype' => 'specific'
];
$tab[] = [
'id' => '55',
'table' => $this->getTable(),
'field' => 'send_infocoms_alert_before_delay',
'name' => __('Send financial and administrative information alarms before'),
'massiveaction' => false,
'nosearch' => true,
'datatype' => 'specific'
];
$tab[] = [
'id' => '32',
'table' => $this->getTable(),
'field' => 'use_reservations_alert',
'name' => __('Alerts on reservations'),
'massiveaction' => false,
'nosearch' => true,
'datatype' => 'specific'
];
$tab[] = [
'id' => '48',
'table' => $this->getTable(),
'field' => 'default_contract_alert',
'name' => __('Default value for alarms on contracts'),
'massiveaction' => false,
'nosearch' => true,
'datatype' => 'specific'
];
$tab[] = [
'id' => '49',
'table' => $this->getTable(),
'field' => 'default_infocom_alert',
'name' => __('Default value for alarms on financial and administrative information'),
'massiveaction' => false,
'nosearch' => true,
'datatype' => 'specific'
];
$tab[] = [
'id' => '50',
'table' => $this->getTable(),
'field' => 'default_cartridges_alarm_threshold',
'name' => __('Default threshold for cartridges count'),
'massiveaction' => false,
'nosearch' => true,
'datatype' => 'number'
];
$tab[] = [
'id' => '52',
'table' => $this->getTable(),
'field' => 'default_consumables_alarm_threshold',
'name' => __('Default threshold for consumables count'),
'massiveaction' => false,
'nosearch' => true,
'datatype' => 'number'
];
$tab[] = [
'id' => '57',
'table' => $this->getTable(),
'field' => 'use_certificates_alert',
'name' => __('Alarms on expired certificates'),
'massiveaction' => false,
'nosearch' => true,
'datatype' => 'specific'
];
$tab[] = [
'id' => '58',
'table' => $this->getTable(),
'field' => 'send_certificates_alert_before_delay',
'name' => __('Send Certificate alarms before'),
'massiveaction' => false,
'nosearch' => true,
'datatype' => 'specific'
];
$tab[] = [
'id' => 'helpdesk',
'name' => __('Assistance')
];
$tab[] = [
'id' => '47',
'table' => $this->getTable(),
'field' => 'tickettemplates_id', // not a dropdown because of special value
'name' => _n('Ticket template', 'Ticket templates', 1),
'massiveaction' => false,
'nosearch' => true,
'datatype' => 'specific'
];
$tab[] = [
'id' => '33',
'table' => $this->getTable(),
'field' => 'autoclose_delay',
'name' => __('Automatic closing of solved tickets after'),
'massiveaction' => false,
'nosearch' => true,
'datatype' => 'number',
'min' => 1,
'max' => 99,
'step' => 1,
'unit' => 'day',
'toadd' => [
self::CONFIG_PARENT => __('Inheritance of the parent entity'),
self::CONFIG_NEVER => __('Never'),
0 => __('Immediatly')
]
];
$tab[] = [
'id' => '59',
'table' => $this->getTable(),
'field' => 'autopurge_delay',
'name' => __('Automatic purge of closed tickets after'),
'massiveaction' => false,
'nosearch' => true,
'datatype' => 'number',
'min' => 1,
'max' => 3650,
'step' => 1,
'unit' => 'day',
'toadd' => [
self::CONFIG_PARENT => __('Inheritance of the parent entity'),
self::CONFIG_NEVER => __('Never'),
0 => __('Immediatly')
]
];
$tab[] = [
'id' => '34',
'table' => $this->getTable(),
'field' => 'notclosed_delay',
'name' => __('Alerts on tickets which are not solved'),
'massiveaction' => false,
'nosearch' => true,
'datatype' => 'specific'
];
$tab[] = [
'id' => '35',
'table' => $this->getTable(),
'field' => 'auto_assign_mode',
'name' => __('Automatic assignment of tickets'),
'massiveaction' => false,
'nosearch' => true,
'datatype' => 'specific'
];
$tab[] = [
'id' => '36',
'table' => $this->getTable(),
'field' => 'calendars_id',// not a dropdown because of special valu
'name' => _n('Calendar', 'Calendars', 1),
'massiveaction' => false,
'nosearch' => true,
'datatype' => 'specific'
];
$tab[] = [
'id' => '37',
'table' => $this->getTable(),
'field' => 'tickettype',
'name' => __('Tickets default type'),
'massiveaction' => false,
'nosearch' => true,
'datatype' => 'specific'
];
$tab[] = [
'id' => 'assets',
'name' => __('Assets')
];
$tab[] = [
'id' => '38',
'table' => $this->getTable(),
'field' => 'autofill_buy_date',
'name' => __('Date of purchase'),
'massiveaction' => false,
'nosearch' => true,
'datatype' => 'specific'
];
$tab[] = [
'id' => '39',
'table' => $this->getTable(),
'field' => 'autofill_order_date',
'name' => __('Order date'),
'massiveaction' => false,
'nosearch' => true,
'datatype' => 'specific'
];
$tab[] = [
'id' => '40',
'table' => $this->getTable(),
'field' => 'autofill_delivery_date',
'name' => __('Delivery date'),
'massiveaction' => false,
'nosearch' => true,
'datatype' => 'specific'
];
$tab[] = [
'id' => '41',
'table' => $this->getTable(),
'field' => 'autofill_use_date',
'name' => __('Startup date'),
'massiveaction' => false,
'nosearch' => true,
'datatype' => 'specific'
];
$tab[] = [
'id' => '42',
'table' => $this->getTable(),
'field' => 'autofill_warranty_date',
'name' => __('Start date of warranty'),
'massiveaction' => false,
'nosearch' => true,
'datatype' => 'specific'
];
$tab[] = [
'id' => '43',
'table' => $this->getTable(),
'field' => 'inquest_config',
'name' => __('Satisfaction survey configuration'),
'massiveaction' => false,
'nosearch' => true,
'datatype' => 'specific'
];
$tab[] = [
'id' => '44',
'table' => $this->getTable(),
'field' => 'inquest_rate',
'name' => __('Satisfaction survey trigger rate'),
'massiveaction' => false,
'datatype' => 'number'
];
$tab[] = [
'id' => '45',
'table' => $this->getTable(),
'field' => 'inquest_delay',
'name' => __('Create survey after'),
'massiveaction' => false,
'datatype' => 'number'
];
$tab[] = [
'id' => '46',
'table' => $this->getTable(),
'field' => 'inquest_URL',
'name' => __('URL'),
'massiveaction' => false,
'datatype' => 'string',
'autocomplete' => true,
];
$tab[] = [
'id' => '51',
'table' => $this->getTable(),
'field' => 'name',
'linkfield' => 'entities_id_software', // not a dropdown because of special value
//TRANS: software in plural
'name' => __('Entity for software creation'),
'massiveaction' => false,
'nosearch' => true,
'datatype' => 'specific'
];
$tab[] = [
'id' => '56',
'table' => $this->getTable(),
'field' => 'autofill_decommission_date',
'name' => __('Decommission date'),
'massiveaction' => false,
'nosearch' => true,
'datatype' => 'specific'
];
return $tab;
}
/**
* Display entities of the loaded profile
*
* @param string $target target for entity change action
* @param string $myname select name
**/
static function showSelector($target, $myname) {
global $CFG_GLPI;
$rand = mt_rand();
if (Session::getCurrentInterface() == 'helpdesk') {
$actionurl = $CFG_GLPI["root_doc"]."/front/helpdesk.public.php?active_entity=";
} else {
$actionurl = $CFG_GLPI["root_doc"]."/front/central.php?active_entity=";
}
echo "<div class='center'>";
echo "<span class='b'>".__('Select the desired entity')."<br>( <img src='".$CFG_GLPI["root_doc"].
"/pics/entity_all.png' alt=''> ".__s('to see the entity and its sub-entities').")</span>".
"<br>";
echo "<a style='font-size:14px;' href='".$target."?active_entity=all' title=\"".
__s('Show all')."\">".str_replace(" ", "&nbsp;", __('Show all'))."</a></div>";
echo "<div class='left' style='width:100%'>";
echo "<form id='entsearchform'>";
echo Html::input('entsearchtext', ['id' => 'entsearchtext']);
echo Html::submit(__('Search'), ['id' => 'entsearch']);
echo "</form>";
echo "<script type='text/javascript'>";
echo " $(function() {
$.getScript('{$CFG_GLPI["root_doc"]}/public/lib/jstree.js').done(function(data, textStatus, jqxhr) {
$('#tree_projectcategory$rand')
// call `.jstree` with the options object
.jstree({
// the `plugins` array allows you to configure the active plugins on this instance
'plugins' : ['search', 'qload', 'conditionalselect'],
'search': {
'case_insensitive': true,
'show_only_matches': true,
'ajax': {
'type': 'POST',
'url': '".$CFG_GLPI["root_doc"]."/ajax/entitytreesearch.php'
}
},
'qload': {
'prevLimit': 50,
'nextLimit': 30,
'moreText': '".__s('Load more entities...')."'
},
'conditionalselect': function (node, event) {
if (node === false) {
return false;
}
var url = '$actionurl'+node.id;
if (event.target.tagName == 'I'
&& event.target.className == '') {
url += '&is_recursive=1';
}
document.location.href = url;
return false;
},
'core': {
'themes': {
'name': 'glpi'
},
'animation': 0,
'data': {
'url': function(node) {
return node.id === '#' ?
'".$CFG_GLPI["root_doc"]."/ajax/entitytreesons.php?node=-1' :
'".$CFG_GLPI["root_doc"]."/ajax/entitytreesons.php?node='+node.id;
}
}
}
});
var searchTree = function() {
".Html::jsGetElementbyID("tree_projectcategory$rand").".jstree('close_all');;
".Html::jsGetElementbyID("tree_projectcategory$rand").
".jstree('search',".Html::jsGetDropdownValue('entsearchtext').");
}
$('#entsearchform').submit(function( event ) {
// cancel submit of entity search form
event.preventDefault();
// search
searchTree();
});
// autosearch on keypress (delayed and with min length)
$('#entsearchtext').keyup(function () {
var inputsearch = $(this);
typewatch(function () {
if (inputsearch.val().length >= 3) {
searchTree();
}
}, 500);
})
.focus();
});
});";
echo "</script>";
echo "<div id='tree_projectcategory$rand' class='entity_tree' ></div>";
echo "</div>";
}
/**
* @since 0.83 (before addRule)
*
* @param $input array of values
**/
function executeAddRule($input) {
$this->check($_POST["affectentity"], UPDATE);
$collection = RuleCollection::getClassByType($_POST['sub_type']);
$rule = $collection->getRuleClass($_POST['sub_type']);
$ruleid = $rule->add($_POST);
if ($ruleid) {
//Add an action associated to the rule
$ruleAction = new RuleAction();
//Action is : affect computer to this entity
$ruleAction->addActionByAttributes("assign", $ruleid, "entities_id",
$_POST["affectentity"]);
switch ($_POST['sub_type']) {
case 'RuleRight' :
if ($_POST["profiles_id"]) {
$ruleAction->addActionByAttributes("assign", $ruleid, "profiles_id",
$_POST["profiles_id"]);
}
$ruleAction->addActionByAttributes("assign", $ruleid, "is_recursive",
$_POST["is_recursive"]);
}
}
Event::log($ruleid, "rules", 4, "setup",
//TRANS: %s is the user login
sprintf(__('%s adds the item'), $_SESSION["glpiname"]));
Html::back();
}
/**
* get all entities with a notification option set
* manage CONFIG_PARENT (or NULL) value
*
* @param $field String name of the field to search (>0)
*
* @return Array of id => value
**/
static function getEntitiesToNotify($field) {
global $DB;
$entities = [];
// root entity first
$ent = new self();
if ($ent->getFromDB(0)) { // always exists
$val = $ent->getField($field);
if ($val > 0) {
$entities[0] = $val;
}
}
// Others entities in level order (parent first)
$iterator = $DB->request([
'SELECT' => [
'id AS entity',
'entities_id AS parent',
$field
],
'FROM' => self::getTable(),
'ORDER' => 'level ASC'
]);
while ($entitydata = $iterator->next()) {
if ((is_null($entitydata[$field])
|| ($entitydata[$field] == self::CONFIG_PARENT))
&& isset($entities[$entitydata['parent']])) {
// config inherit from parent
$entities[$entitydata['entity']] = $entities[$entitydata['parent']];
} else if ($entitydata[$field] > 0) {
// config found in entity
$entities[$entitydata['entity']] = $entitydata[$field];
}
}
return $entities;
}
/**
* @since 0.84
*
* @param $entity Entity object
**/
static function showStandardOptions(Entity $entity) {
$con_spotted = false;
$ID = $entity->getField('id');
if (!$entity->can($ID, READ)) {
return false;
}
// Entity right applied
$canedit = $entity->can($ID, UPDATE);
echo "<div class='spaced'>";
if ($canedit) {
echo "<form method='post' name=form action='".Toolbox::getItemTypeFormURL(__CLASS__)."' data-track-changes='true'>";
}
echo "<table class='tab_cadre_fixe'>";
Plugin::doHook("pre_item_form", ['item' => $entity, 'options' => []]);
echo "<tr><th colspan='4'>".__('Address')."</th></tr>";
echo "<tr class='tab_bg_1'>";
echo "<td>". Phone::getTypeName(1)."</td>";
echo "<td>";
Html::autocompletionTextField($entity, "phonenumber");
echo "</td>";
echo "<td rowspan='7'>".__('Address')."</td>";
echo "<td rowspan='7'>";
echo "<textarea cols='45' rows='8' name='address'>". $entity->fields["address"]."</textarea>";
echo "</td></tr>";
echo "<tr class='tab_bg_1'>";
echo "<td>".__('Fax')."</td>";
echo "<td>";
Html::autocompletionTextField($entity, "fax");
echo "</td></tr>";
echo "<tr class='tab_bg_1'>";
echo "<td>".__('Website')."</td>";
echo "<td>";
Html::autocompletionTextField($entity, "website");
echo "</td></tr>";
echo "<tr class='tab_bg_1'>";
echo "<td>"._n('Email', 'Emails', 1)."</td>";
echo "<td>";
Html::autocompletionTextField($entity, "email");
echo "</td></tr>";
echo "<tr class='tab_bg_1'>";
echo "<td>".__('Postal code')."</td>";
echo "<td>";
Html::autocompletionTextField($entity, "postcode", ['size' => 7]);
echo "&nbsp;&nbsp;". __('City'). "&nbsp;";
Html::autocompletionTextField($entity, "town", ['size' => 27]);
echo "</td></tr>";
echo "<tr class='tab_bg_1'>";
echo "<td>"._x('location', 'State')."</td>";
echo "<td>";
Html::autocompletionTextField($entity, "state");
echo "</td></tr>";
echo "<tr class='tab_bg_1'>";
echo "<td>".__('Country')."</td>";
echo "<td>";
Html::autocompletionTextField($entity, "country");
echo "</td></tr>";
echo "<tr class='tab_bg_1'>";
echo "<td>".__('Location on map')."</td>";
echo "<td>";
$entity->displaySpecificTypeField($ID, [
'name' => 'setlocation',
'type' => 'setlocation',
'label' => __('Location on map'),
'list' => false
]);
echo "</td></tr>";
echo "<tr class='tab_bg_1'>";
echo "<td>"._x('location', 'Longitude')."</td>";
echo "<td>";
Html::autocompletionTextField($entity, "longitude");
echo "</td></tr>";
echo "<tr class='tab_bg_1'>";
echo "<td>"._x('location', 'Latitude')."</td>";
echo "<td>";
Html::autocompletionTextField($entity, "latitude");
echo "</td></tr>";
echo "<tr class='tab_bg_1'>";
echo "<td>"._x('location', 'Altitude')."</td>";
echo "<td>";
Html::autocompletionTextField($entity, "altitude");
echo "</td></tr>";
Plugin::doHook("post_item_form", ['item' => $entity, 'options' => []]);
echo "</table>";
if ($canedit) {
echo "<div class='center'>";
echo "<input type='hidden' name='id' value='".$entity->fields["id"]."'>";
echo "<input type='submit' name='update' value=\""._sx('button', 'Save')."\" class='submit'>";
echo "</div>";
Html::closeForm();
}
echo "</div>";
}
/**
* @since 0.84 (before in entitydata.class)
*
* @param $entity Entity object
**/
static function showAdvancedOptions(Entity $entity) {
$con_spotted = false;
$ID = $entity->getField('id');
if (!$entity->can($ID, READ)) {
return false;
}
// Entity right applied (could be User::UPDATEAUTHENT)
$canedit = $entity->can($ID, UPDATE);
if ($canedit) {
echo "<form method='post' name=form action='".Toolbox::getItemTypeFormURL(__CLASS__)."' data-track-changes='true'>";
}
echo "<table class='tab_cadre_fixe'>";
Plugin::doHook("pre_item_form", ['item' => $entity, 'options' => []]);
echo "<tr><th colspan='2'>".__('Values for the generic rules for assignment to entities').
"</th></tr>";
echo "<tr class='tab_bg_1'><td colspan='2' class='center'>".
__('These parameters are used as actions in generic rules for assignment to entities').
"</td></tr>";
echo "<tr class='tab_bg_1'>";
echo "<td>".__('Information in inventory tool (TAG) representing the entity')."</td>";
echo "<td>";
Html::autocompletionTextField($entity, "tag", ['size' => 100]);
echo "</td></tr>";
if (Toolbox::canUseLdap()) {
echo "<tr class='tab_bg_1'>";
echo "<td>".__('LDAP directory information attribute representing the entity')."</td>";
echo "<td>";
Html::autocompletionTextField($entity, "ldap_dn", ['size' => 100]);
echo "</td></tr>";
}
echo "<tr class='tab_bg_1'>";
echo "<td>".__('Mail domain surrogates entity')."</td>";
echo "<td>";
Html::autocompletionTextField($entity, "mail_domain", ['size' => 100]);
echo "</td></tr>";
if (Toolbox::canUseLdap()) {
echo "<tr><th colspan='2'>".
__('Values used in the interface to search users from a LDAP directory').
"</th></tr>";
echo "<tr class='tab_bg_1'>";
echo "<td>".__('LDAP directory of an entity')."</td>";
echo "<td>";
AuthLDAP::dropdown([
'value' => $entity->fields['authldaps_id'],
'emptylabel' => __('Default server'),
'condition' => ['is_active' => 1]
]);
echo "</td></tr>";
echo "<tr class='tab_bg_1'>";
echo "<td>".__('LDAP filter associated to the entity (if necessary)')."</td>";
echo "<td>";
Html::autocompletionTextField($entity, 'entity_ldapfilter', ['size' => 100]);
echo "</td></tr>";
}
Plugin::doHook("post_item_form", ['item' => $entity, 'options' => &$options]);
echo "</table>";
if ($canedit) {
echo "<div class='center'>";
echo "<input type='hidden' name='id' value='".$entity->fields["id"]."'>";
echo "<input type='submit' name='update' value=\""._sx('button', 'Save')."\" class='submit'>";
echo "</div>";
Html::closeForm();
}
}
/**
* @since 0.84 (before in entitydata.class)
*
* @param $entity Entity object
**/
static function showInventoryOptions(Entity $entity) {
$ID = $entity->getField('id');
if (!$entity->can($ID, READ)) {
return false;
}
// Notification right applied
$canedit = (Infocom::canUpdate() && Session::haveAccessToEntity($ID));
echo "<div class='spaced'>";
if ($canedit) {
echo "<form method='post' name=form action='".Toolbox::getItemTypeFormURL(__CLASS__)."' data-track-changes='true'>";
}
echo "<table class='tab_cadre_fixe'>";
Plugin::doHook("pre_item_form", ['item' => $entity, 'options' => []]);
echo "<tr><th colspan='4'>".__('Autofill dates for financial and administrative information').
"</th></tr>";
$options[0] = __('No autofill');
if ($ID > 0) {
$options[self::CONFIG_PARENT] = __('Inheritance of the parent entity');
}
$states = getAllDataFromTable('glpi_states');
foreach ($states as $state) {
$options[Infocom::ON_STATUS_CHANGE.'_'.$state['id']]
//TRANS: %s is the name of the state
= sprintf(__('Fill when shifting to state %s'), $state['name']);
}
$options[Infocom::COPY_WARRANTY_DATE] = __('Copy the start date of warranty');
//Buy date
echo "<tr class='tab_bg_2'>";
echo "<td> " . __('Date of purchase') . "</td>";
echo "<td>";
Dropdown::showFromArray('autofill_buy_date', $options,
['value' => $entity->getField('autofill_buy_date')]);
echo "</td>";
//Order date
echo "<td> " . __('Order date') . "</td>";
echo "<td>";
$options[Infocom::COPY_BUY_DATE] = __('Copy the date of purchase');
Dropdown::showFromArray('autofill_order_date', $options,
['value' => $entity->getField('autofill_order_date')]);
echo "</td></tr>";
//Delivery date
echo "<tr class='tab_bg_2'>";
echo "<td> " . __('Delivery date') . "</td>";
echo "<td>";
$options[Infocom::COPY_ORDER_DATE] = __('Copy the order date');
Dropdown::showFromArray('autofill_delivery_date', $options,
['value' => $entity->getField('autofill_delivery_date')]);
echo "</td>";
//Use date
echo "<td> " . __('Startup date') . " </td>";
echo "<td>";
$options[Infocom::COPY_DELIVERY_DATE] = __('Copy the delivery date');
Dropdown::showFromArray('autofill_use_date', $options,
['value' => $entity->getField('autofill_use_date')]);
echo "</td></tr>";
//Warranty date
echo "<tr class='tab_bg_2'>";
echo "<td> " . __('Start date of warranty') . "</td>";
echo "<td>";
$options = [0 => __('No autofill'),
Infocom::COPY_BUY_DATE => __('Copy the date of purchase'),
Infocom::COPY_ORDER_DATE => __('Copy the order date'),
Infocom::COPY_DELIVERY_DATE => __('Copy the delivery date')];
if ($ID > 0) {
$options[self::CONFIG_PARENT] = __('Inheritance of the parent entity');
}
Dropdown::showFromArray('autofill_warranty_date', $options,
['value' => $entity->getField('autofill_warranty_date')]);
echo "</td>";
//Decommission date
echo "<td> " . __('Decommission date') . "</td>";
echo "<td>";
$options = [0 => __('No autofill'),
Infocom::COPY_BUY_DATE => __('Copy the date of purchase'),
Infocom::COPY_ORDER_DATE => __('Copy the order date'),
Infocom::COPY_DELIVERY_DATE => __('Copy the delivery date')];
if ($ID > 0) {
$options[self::CONFIG_PARENT] = __('Inheritance of the parent entity');
}
foreach ($states as $state) {
$options[Infocom::ON_STATUS_CHANGE.'_'.$state['id']]
//TRANS: %s is the name of the state
= sprintf(__('Fill when shifting to state %s'), $state['name']);
}
Dropdown::showFromArray('autofill_decommission_date', $options,
['value' => $entity->getField('autofill_decommission_date')]);
echo "</td></tr>";
echo "<tr><th colspan='4'>"._n('Software', 'Software', Session::getPluralNumber())."</th></tr>";
echo "<tr class='tab_bg_2'>";
echo "<td> " . __('Entity for software creation') . "</td>";
echo "<td>";
$toadd = [self::CONFIG_NEVER => __('No change of entity')]; // Keep software in PC entity
if ($ID > 0) {
$toadd[self::CONFIG_PARENT] = __('Inheritance of the parent entity');
}
$entities = [$entity->fields['entities_id']];
foreach (getAncestorsOf('glpi_entities', $entity->fields['entities_id']) as $ent) {
if (Session::haveAccessToEntity($ent)) {
$entities[] = $ent;
}
}
self::dropdown(['name' => 'entities_id_software',
'value' => $entity->getField('entities_id_software'),
'toadd' => $toadd,
'entity' => $entities,
'comments' => false]);
if ($entity->fields['entities_id_software'] == self::CONFIG_PARENT) {
$tid = self::getUsedConfig('entities_id_software', $entity->getField('entities_id'));
echo "<font class='green'>&nbsp;&nbsp;";
echo self::getSpecificValueToDisplay('entities_id_software', $tid);
echo "</font>";
}
echo "</td><td colspan='2'></td></tr>";
Plugin::doHook("post_item_form", ['item' => $entity, 'options' => &$options]);
echo "</table>";
if ($canedit) {
echo "<div class='center'>";
echo "<input type='hidden' name='id' value='".$entity->fields["id"]."'>";
echo "<input type='submit' name='update' value=\""._sx('button', 'Save')."\" class='submit'>";
echo "</div>";
Html::closeForm();
}
echo "</div>";
}
/**
* @since 0.84 (before in entitydata.class)
*
* @param $entity Entity object
**/
static function showNotificationOptions(Entity $entity) {
$ID = $entity->getField('id');
if (!$entity->can($ID, READ)
|| !Notification::canView()) {
return false;
}
// Notification right applied
$canedit = (Notification::canUpdate()
&& Session::haveAccessToEntity($ID));
echo "<div class='spaced'>";
if ($canedit) {
echo "<form method='post' name=form action='".Toolbox::getItemTypeFormURL(__CLASS__)."' data-track-changes='true'>";
}
echo "<table class='tab_cadre_fixe'>";
Plugin::doHook("pre_item_form", ['item' => $entity, 'options' => []]);
echo "<tr><th colspan='4'>".__('Notification options')."</th></tr>";
echo "<tr class='tab_bg_1'>";
echo "<td>".__('Administrator email')."</td>";
echo "<td>";
Html::autocompletionTextField($entity, "admin_email");
echo "</td>";
echo "<td>" . __('Administrator name') . "</td><td>";
Html::autocompletionTextField($entity, "admin_email_name");
echo "</td></tr>";
echo "<tr class='tab_bg_1'>";
echo "<td>".__('Administrator reply-to email (if needed)')."</td>";
echo "<td>";
Html::autocompletionTextField($entity, "admin_reply");
echo "</td>";
echo "<td>" . __('Response address (if needed)') . "</td><td>";
Html::autocompletionTextField($entity, "admin_reply_name");
echo "</td></tr>";
echo "<tr class='tab_bg_1'>";
echo "<td>".__('Prefix for notifications')."</td>";
echo "<td>";
Html::autocompletionTextField($entity, "notification_subject_tag");
echo "</td>";
echo "<td>".__('Delay to send email notifications')."</td>";
echo "<td>";
$toadd=[];
if ($ID > 0) {
$toadd = [self::CONFIG_PARENT => __('Inheritance of the parent entity')];
}
Dropdown::showNumber('delay_send_emails', ['value' => $entity->fields["delay_send_emails"],
'min' => 0,
'max' => 100,
'unit' => 'minute',
'toadd' => $toadd]);
if ($entity->fields['delay_send_emails'] == self::CONFIG_PARENT) {
$tid = self::getUsedConfig('delay_send_emails', $entity->getField('entities_id'));
echo "<font class='green'><br>";
echo $entity->getValueToDisplay('delay_send_emails', $tid, ['html' => true]);
echo "</font>";
}
echo "</td></tr>";
echo "<tr class='tab_bg_1'>";
echo "<td>".__('Enable notifications by default')."</td>";
echo "<td>";
Alert::dropdownYesNo(['name' => "is_notif_enable_default",
'value' => $entity->getField('is_notif_enable_default'),
'inherit_parent' => (($ID > 0) ? 1 : 0)]);
if ($entity->fields['is_notif_enable_default'] == self::CONFIG_PARENT) {
$tid = self::getUsedConfig('is_notif_enable_default', $entity->getField('entities_id'));
echo "<font class='green'><br>";
echo self::getSpecificValueToDisplay('is_notif_enable_default', $tid);
echo "</font>";
}
echo "</td>";
echo "<td colspan='2'>&nbsp;</td>";
echo "</tr>";
echo "<tr class='tab_bg_1'>";
echo "<td class='middle right'>" . __('Email signature') . "</td>";
echo "<td colspan='3'>";
echo "<textarea cols='60' rows='5' name='mailing_signature'>".
$entity->fields["mailing_signature"]."</textarea>";
echo "</td></tr>";
echo "</table>";
echo "<table class='tab_cadre_fixe tab_spaced'>";
echo "<tr><th colspan='4'>".__('Alarms options')."</th></tr>";
echo "<tr class='tab_bg_1'>";
echo "<th colspan='2' rowspan='2'>";
echo _n('Cartridge', 'Cartridges', Session::getPluralNumber());
echo "</th>";
echo "<td>" . __('Reminders frequency for alarms on cartridges') . "</td><td>";
$default_value = $entity->fields['cartridges_alert_repeat'];
Alert::dropdown(['name' => 'cartridges_alert_repeat',
'value' => $default_value,
'inherit_parent' => (($ID > 0) ? 1 : 0)]);
if ($entity->fields['cartridges_alert_repeat'] == self::CONFIG_PARENT) {
$tid = self::getUsedConfig('cartridges_alert_repeat', $entity->getField('entities_id'));
echo "<font class='green'><br>";
echo self::getSpecificValueToDisplay('cartridges_alert_repeat', $tid);
echo "</font>";
}
echo "</td></tr>";
echo "<tr class='tab_bg_1'><td>" . __('Default threshold for cartridges count') ."</td><td>";
if ($ID > 0) {
$toadd = [self::CONFIG_PARENT => __('Inheritance of the parent entity'),
self::CONFIG_NEVER => __('Never')];
} else {
$toadd = [self::CONFIG_NEVER => __('Never')];
}
Dropdown::showNumber('default_cartridges_alarm_threshold',
['value' => $entity->fields["default_cartridges_alarm_threshold"],
'min' => 0,
'max' => 100,
'step' => 1,
'toadd' => $toadd]);
if ($entity->fields['default_cartridges_alarm_threshold'] == self::CONFIG_PARENT) {
$tid = self::getUsedConfig('default_cartridges_alarm_threshold',
$entity->getField('entities_id'));
echo "<font class='green'><br>";
echo self::getSpecificValueToDisplay('default_cartridges_alarm_threshold', $tid);
echo "</font>";
}
echo "</td></tr>";
echo "<tr class='tab_bg_1'>";
echo "<th colspan='2' rowspan='2'>";
echo _n('Consumable', 'Consumables', Session::getPluralNumber());
echo "</th>";
echo "<td>" . __('Reminders frequency for alarms on consumables') . "</td><td>";
$default_value = $entity->fields['consumables_alert_repeat'];
Alert::dropdown(['name' => 'consumables_alert_repeat',
'value' => $default_value,
'inherit_parent' => (($ID > 0) ? 1 : 0)]);
if ($entity->fields['consumables_alert_repeat'] == self::CONFIG_PARENT) {
$tid = self::getUsedConfig('consumables_alert_repeat', $entity->getField('entities_id'));
echo "<font class='green'><br>";
echo self::getSpecificValueToDisplay('consumables_alert_repeat', $tid);
echo "</font>";
}
echo "</td></tr>";
echo "<tr class='tab_bg_1'><td>" . __('Default threshold for consumables count') ."</td><td>";
if ($ID > 0) {
$toadd = [self::CONFIG_PARENT => __('Inheritance of the parent entity'),
self::CONFIG_NEVER => __('Never')];
} else {
$toadd = [self::CONFIG_NEVER => __('Never')];
}
Dropdown::showNumber('default_consumables_alarm_threshold',
['value' => $entity->fields["default_consumables_alarm_threshold"],
'min' => 0,
'max' => 100,
'step' => 1,
'toadd' => $toadd]);
if ($entity->fields['default_consumables_alarm_threshold'] == self::CONFIG_PARENT) {
$tid = self::getUsedConfig('default_consumables_alarm_threshold',
$entity->getField('entities_id'));
echo "<font class='green'><br>";
echo self::getSpecificValueToDisplay('default_consumables_alarm_threshold', $tid);
echo "</font>";
}
echo "</td></tr>";
echo "<tr class='tab_bg_1'>";
echo "<th colspan='2' rowspan='3'>";
echo _n('Contract', 'Contracts', Session::getPluralNumber());
echo "</th>";
echo "<td>" . __('Alarms on contracts') . "</td><td>";
$default_value = $entity->fields['use_contracts_alert'];
Alert::dropdownYesNo(['name' => "use_contracts_alert",
'value' => $default_value,
'inherit_parent' => (($ID > 0) ? 1 : 0)]);
if ($entity->fields['use_contracts_alert'] == self::CONFIG_PARENT) {
$tid = self::getUsedConfig('use_contracts_alert', $entity->getField('entities_id'));
echo "<font class='green'><br>";
echo self::getSpecificValueToDisplay('use_contracts_alert', $tid);
echo "</font>";
}
echo "</td></tr>";
echo "<tr class='tab_bg_1'><td>".__('Default value') . "</td><td>";
Contract::dropdownAlert(['name' => "default_contract_alert",
'value' => $entity->fields["default_contract_alert"],
'inherit_parent' => (($ID > 0) ? 1 : 0)]);
if ($entity->fields['default_contract_alert'] == self::CONFIG_PARENT) {
$tid = self::getUsedConfig('default_contract_alert', $entity->getField('entities_id'));
echo "<font class='green'><br>";
echo self::getSpecificValueToDisplay('default_contract_alert', $tid);
echo "</font>";
}
echo "</td></tr>";
echo "<tr class='tab_bg_1'><td>" . __('Send contract alarms before')."</td><td>";
Alert::dropdownIntegerNever('send_contracts_alert_before_delay',
$entity->fields['send_contracts_alert_before_delay'],
['max' => 99,
'inherit_parent' => (($ID > 0) ? 1 : 0),
'unit' => 'day',
'never_string' => __('No')]);
if ($entity->fields['send_contracts_alert_before_delay'] == self::CONFIG_PARENT) {
$tid = self::getUsedConfig('send_contracts_alert_before_delay',
$entity->getField('entities_id'));
echo "<font class='green'><br>";
echo self::getSpecificValueToDisplay('send_contracts_alert_before_delay', $tid);
echo "</font>";
}
echo "</td></tr>";
echo "<tr class='tab_bg_1'>";
echo "<th colspan='2' rowspan='3'>";
echo __('Financial and administrative information');
echo "</th>";
echo "<td>" . __('Alarms on financial and administrative information') . "</td><td>";
$default_value = $entity->fields['use_infocoms_alert'];
Alert::dropdownYesNo(['name' => "use_infocoms_alert",
'value' => $default_value,
'inherit_parent' => (($ID > 0) ? 1 : 0)]);
if ($entity->fields['use_infocoms_alert'] == self::CONFIG_PARENT) {
$tid = self::getUsedConfig('use_infocoms_alert', $entity->getField('entities_id'));
echo "<font class='green'><br>";
echo self::getSpecificValueToDisplay('use_infocoms_alert', $tid);
echo "</font>";
}
echo "</td></tr>";
echo "<tr class='tab_bg_1'><td>" . __('Default value')."</td><td>";
Infocom::dropdownAlert(['name' => 'default_infocom_alert',
'value' => $entity->fields["default_infocom_alert"],
'inherit_parent' => (($ID > 0) ? 1 : 0)]);
if ($entity->fields['default_infocom_alert'] == self::CONFIG_PARENT) {
$tid = self::getUsedConfig('default_infocom_alert', $entity->getField('entities_id'));
echo "<font class='green'><br>";
echo self::getSpecificValueToDisplay('default_infocom_alert', $tid);
echo "</font>";
}
echo "</td></tr>";
echo "<tr class='tab_bg_1'>";
echo "<td>" . __('Send financial and administrative information alarms before')."</td><td>";
Alert::dropdownIntegerNever('send_infocoms_alert_before_delay',
$entity->fields['send_infocoms_alert_before_delay'],
['max' => 99,
'inherit_parent' => (($ID > 0) ? 1 : 0),
'unit' => 'day',
'never_string' => __('No')]);
if ($entity->fields['send_infocoms_alert_before_delay'] == self::CONFIG_PARENT) {
$tid = self::getUsedConfig('send_infocoms_alert_before_delay',
$entity->getField('entities_id'));
echo "<font class='green'><br>";
echo self::getSpecificValueToDisplay('send_infocoms_alert_before_delay', $tid);
echo "</font>";
}
echo "</td></tr>";
echo "<tr class='tab_bg_1'>";
echo "<th colspan='2' rowspan='2'>";
echo SoftwareLicense::getTypeName(Session::getPluralNumber());
echo "</th>";
echo "<td>" . __('Alarms on expired licenses') . "</td><td>";
$default_value = $entity->fields['use_licenses_alert'];
Alert::dropdownYesNo(['name' => "use_licenses_alert",
'value' => $default_value,
'inherit_parent' => (($ID > 0) ? 1 : 0)]);
if ($entity->fields['use_licenses_alert'] == self::CONFIG_PARENT) {
$tid = self::getUsedConfig('use_licenses_alert', $entity->getField('entities_id'));
echo "<font class='green'><br>";
echo self::getSpecificValueToDisplay('use_licenses_alert', $tid);
echo "</font>";
}
echo "</td></tr>";
echo "<tr class='tab_bg_1'><td>" . __('Send license alarms before')."</td><td>";
Alert::dropdownIntegerNever('send_licenses_alert_before_delay',
$entity->fields['send_licenses_alert_before_delay'],
['max' => 99,
'inherit_parent' => (($ID > 0) ? 1 : 0),
'unit' => 'day',
'never_string' => __('No')]);
if ($entity->fields['send_licenses_alert_before_delay'] == self::CONFIG_PARENT) {
$tid = self::getUsedConfig('send_licenses_alert_before_delay',
$entity->getField('entities_id'));
echo "<font class='green'><br>";
echo self::getSpecificValueToDisplay('send_licenses_alert_before_delay', $tid);
echo "</font>";
}
echo "</td></tr>";
echo "<tr class='tab_bg_1'>";
echo "<th colspan='2' rowspan='2'>";
echo _n('Certificate', 'Certificates', Session::getPluralNumber());
echo "</th>";
echo "<td>" . __('Alarms on expired certificates') . "</td><td>";
$default_value = $entity->fields['use_certificates_alert'];
Alert::dropdownYesNo(['name' => "use_certificates_alert",
'value' => $default_value,
'inherit_parent' => (($ID > 0) ? 1 : 0)]);
if ($entity->fields['use_certificates_alert'] == self::CONFIG_PARENT) {
$tid = self::getUsedConfig('use_certificates_alert', $entity->getField('entities_id'));
echo "<font class='green'><br>";
echo self::getSpecificValueToDisplay('use_certificates_alert', $tid);
echo "</font>";
}
echo "</td></tr>";
echo "<tr class='tab_bg_1'><td>" . __('Send certificates alarms before')."</td><td>";
Alert::dropdownIntegerNever('send_certificates_alert_before_delay',
$entity->fields['send_certificates_alert_before_delay'],
['max' => 99,
'inherit_parent' => (($ID > 0) ? 1 : 0),
'unit' => 'day',
'never_string' => __('No')]);
if ($entity->fields['send_certificates_alert_before_delay'] == self::CONFIG_PARENT) {
$tid = self::getUsedConfig('send_certificates_alert_before_delay',
$entity->getField('entities_id'));
echo "<font class='green'><br>";
echo self::getSpecificValueToDisplay('send_certificates_alert_before_delay', $tid);
echo "</font>";
}
echo "</td></tr>";
echo "<tr class='tab_bg_1'>";
echo "<th colspan='2' rowspan='1'>";
echo _n('Reservation', 'Reservations', Session::getPluralNumber());
echo "</th>";
echo "<td>" . __('Alerts on reservations') . "</td><td>";
Alert::dropdownIntegerNever('use_reservations_alert',
$entity->fields['use_reservations_alert'],
['max' => 99,
'inherit_parent' => (($ID > 0) ? 1 : 0),
'unit' => 'hour']);
if ($entity->fields['use_reservations_alert'] == self::CONFIG_PARENT) {
$tid = self::getUsedConfig('use_reservations_alert', $entity->getField('entities_id'));
echo "<font class='green'><br>";
echo self::getSpecificValueToDisplay('use_reservations_alert', $tid);
echo "</font>";
}
echo "</td></tr>";
echo "<tr class='tab_bg_1'>";
echo "<th colspan='2' rowspan='1'>";
echo _n('Ticket', 'Tickets', Session::getPluralNumber());
echo "</th>";
echo "<td >". __('Alerts on tickets which are not solved since'). "</td><td>";
Alert::dropdownIntegerNever('notclosed_delay', $entity->fields["notclosed_delay"],
['max' => 99,
'inherit_parent' => (($ID > 0) ? 1 : 0),
'unit' => 'day']);
if ($entity->fields['notclosed_delay'] == self::CONFIG_PARENT) {
$tid = self::getUsedConfig('notclosed_delay', $entity->getField('entities_id'));
echo "<font class='green'><br>";
echo self::getSpecificValueToDisplay('notclosed_delay', $tid);
echo "</font>";
}
echo "</td></tr>";
echo "<tr class='tab_bg_1'>";
echo "<th colspan='2' rowspan='3'>";
echo Domain::getTypeName(Session::getPluralNumber());
echo "</th>";
echo "<td>" . __('Alarms on domains expiries') . "</td><td>";
$default_value = $entity->fields['use_domains_alert'];
Alert::dropdownYesNo(['name' => "use_domains_alert",
'value' => $default_value,
'inherit_parent' => (($ID > 0) ? 1 : 0)]);
if ($entity->fields['use_domains_alert'] == self::CONFIG_PARENT) {
$tid = self::getUsedConfig('use_domains_alert', $entity->getField('entities_id'));
echo "<font class='green'><br>";
echo self::getSpecificValueToDisplay('use_domains_alert', $tid);
echo "</font>";
}
echo "</td></tr>";
echo "<tr class='tab_bg_1'>";
echo "<td>" . __('Domains closes expiries') . "</td><td>";
Alert::dropdownIntegerNever(
'send_domains_alert_close_expiries_delay',
$entity->fields["send_domains_alert_close_expiries_delay"],
[
'max' => 99,
'inherit_parent' => (($ID > 0) ? 1 : 0),
'unit' => 'day'
]
);
echo "</td></tr>";
echo "<tr class='tab_bg_1'>";
echo "<td>" . __('Domains expired') . "</td><td>";
Alert::dropdownIntegerNever(
'send_domains_alert_expired_delay',
$entity->fields["send_domains_alert_expired_delay"],
[
'max' => 99,
'inherit_parent' => (($ID > 0) ? 1 : 0),
'unit' => 'day'
]
);
echo "</td></tr>";
Plugin::doHook("post_item_form", ['item' => $entity, 'options' => &$options]);
echo "</table>";
if ($canedit) {
echo "<div class='center'>";
echo "<input type='hidden' name='id' value='".$entity->fields["id"]."'>";
echo "<input type='submit' name='update' value=\""._sx('button', 'Save')."\" class='submit'>";
echo "</div>";
Html::closeForm();
}
echo "</div>";
}
/**
* UI customization configuration form.
*
* @param $entity Entity object
*
* @return void
*
* @since 9.5.0
*/
static function showUiCustomizationOptions(Entity $entity) {
global $CFG_GLPI;
$ID = $entity->getField('id');
if (!$entity->can($ID, READ) || !Session::haveRight(Config::$rightname, [UPDATE])) {
return false;
}
// Codemirror lib
echo Html::css('public/lib/codemirror.css');
echo Html::script("public/lib/codemirror.js");
// Notification right applied
$canedit = Session::haveRight(Config::$rightname, [UPDATE])
&& Session::haveAccessToEntity($ID);
echo "<div class='spaced'>";
if ($canedit) {
echo "<form method='post' name=form action='".Toolbox::getItemTypeFormURL(__CLASS__)."' data-track-changes='true'>";
}
echo "<table class='tab_cadre_fixe custom_css_configuration'>";
Plugin::doHook("pre_item_form", ['item' => $entity, 'options' => []]);
$rand = mt_rand();
echo "<tr><th colspan='2'>".__('UI options')."</th></tr>";
echo "<tr class='tab_bg_1'>";
echo "<td>".__('Enable CSS customization')."</td>";
echo "<td>";
$values = [];
if (($ID > 0) ? 1 : 0) {
$values[Entity::CONFIG_PARENT] = __('Inherits configuration from the parent entity');
}
$values[0] = __('No');
$values[1] = __('Yes');
echo Dropdown::showFromArray(
'enable_custom_css',
$values,
[
'display' => false,
'rand' => $rand,
'value' => $entity->fields['enable_custom_css']
]
);
echo "</td></tr>";
echo "<tr class='tab_bg_1'>";
echo "<td colspan='2'>";
echo "<div id='custom_css_container' class='custom_css_container'>";
$value = $entity->fields['enable_custom_css'];
// wrap call in function to prevent modifying variables from current scope
call_user_func(function() use($value, $ID) {
$_POST = [
'enable_custom_css' => $value,
'entities_id' => $ID
];
include GLPI_ROOT . '/ajax/entityCustomCssCode.php';
});
echo "</div>\n";
echo "</td></tr>";
Ajax::updateItemOnSelectEvent(
'dropdown_enable_custom_css' . $rand,
'custom_css_container',
$CFG_GLPI['root_doc'] . '/ajax/entityCustomCssCode.php',
[
'enable_custom_css' => '__VALUE__',
'entities_id' => $ID
]
);
Plugin::doHook("post_item_form", ['item' => $entity, 'options' => &$options]);
echo "</table>";
if ($canedit) {
echo "<div class='center'>";
echo "<input type='hidden' name='id' value='".$entity->fields["id"]."'>";
echo "<input type='submit' name='update' value=\""._sx('button', 'Save')."\" class='submit'>";
echo "</div>";
Html::closeForm();
}
echo "</div>";
}
/**
* Returns tag containing custom CSS code applied to entity.
*
* @return string
*/
public function getCustomCssTag() {
$enable_custom_css = self::getUsedConfig(
'enable_custom_css',
$this->fields['id']
);
if (!$enable_custom_css) {
return '';
}
$custom_css_code = self::getUsedConfig(
'enable_custom_css',
$this->fields['id'],
'custom_css_code',
''
);
if (empty($custom_css_code)) {
return '';
}
return '<style>' . Html::entities_deep($custom_css_code) . '</style>';
}
/**
* @since 0.84 (before in entitydata.class)
*
* @param string $field
* @param string $value must be addslashes
**/
private static function getEntityIDByField($field, $value) {
global $DB;
$iterator = $DB->request([
'SELECT' => 'id',
'FROM' => self::getTable(),
'WHERE' => [$field => $value]
]);
if (count($iterator) == 1) {
$result = $iterator->next();
return $result['id'];
}
return -1;
}
/**
* @since 0.84 (before in entitydata.class)
*
* @param $value
**/
static function getEntityIDByDN($value) {
return self::getEntityIDByField("ldap_dn", $value);
}
/**
* @since 0.84
*
* @param $value
**/
static function getEntityIDByCompletename($value) {
return self::getEntityIDByField("completename", $value);
}
/**
* @since 0.84 (before in entitydata.class)
*
* @param $value
**/
static function getEntityIDByTag($value) {
return self::getEntityIDByField("tag", $value);
}
/**
* @since 0.84 (before in entitydata.class)
*
* @param $value
**/
static function getEntityIDByDomain($value) {
return self::getEntityIDByField("mail_domain", $value);
}
/**
* @since 0.84 (before in entitydata.class)
*
* @param $entities_id
**/
static function isEntityDirectoryConfigured($entities_id) {
$entity = new self();
if ($entity->getFromDB($entities_id)
&& ($entity->getField('authldaps_id') > 0)) {
return true;
}
//If there's a directory marked as default
if (AuthLDAP::getDefault()) {
return true;
}
return false;
}
/**
* @since 0.84 (before in entitydata.class)
*
* @param $entity Entity object
**/
static function showHelpdeskOptions(Entity $entity) {
global $CFG_GLPI;
$ID = $entity->getField('id');
if (!$entity->can($ID, READ)
|| !Session::haveRightsOr(self::$rightname,
[self::READHELPDESK, self::UPDATEHELPDESK])) {
return false;
}
$canedit = (Session::haveRight(self::$rightname, self::UPDATEHELPDESK)
&& Session::haveAccessToEntity($ID));
echo "<div class='spaced'>";
if ($canedit) {
echo "<form method='post' name=form action='".Toolbox::getItemTypeFormURL(__CLASS__)."' data-track-changes='true'>";
}
echo "<table class='tab_cadre_fixe'>";
Plugin::doHook("pre_item_form", ['item' => $entity, 'options' => []]);
echo "<tr><th colspan='4'>".__('Templates configuration')."</th></tr>";
echo "<tr class='tab_bg_1'><td colspan='2'>"._n('Ticket template', 'Ticket templates', 1).
"</td>";
echo "<td colspan='2'>";
$toadd = [];
if ($ID != 0) {
$toadd = [self::CONFIG_PARENT => __('Inheritance of the parent entity')];
}
$options = ['value' => $entity->fields["tickettemplates_id"],
'entity' => $ID,
'toadd' => $toadd];
TicketTemplate::dropdown($options);
if (($entity->fields["tickettemplates_id"] == self::CONFIG_PARENT)
&& ($ID != 0)) {
echo "<font class='green'>&nbsp;&nbsp;";
$tt = new TicketTemplate();
$tid = self::getUsedConfig('tickettemplates_id', $ID, '', 0);
if (!$tid) {
echo Dropdown::EMPTY_VALUE;
} else if ($tt->getFromDB($tid)) {
echo $tt->getLink();
}
echo "</font>";
}
echo "</td></tr>";
echo "<tr class='tab_bg_1'><td colspan='2'>"._n('Change template', 'Change templates', 1).
"</td>";
echo "<td colspan='2'>";
$toadd = [];
if ($ID != 0) {
$toadd = [self::CONFIG_PARENT => __('Inheritance of the parent entity')];
}
$options = ['value' => $entity->fields["changetemplates_id"],
'entity' => $ID,
'toadd' => $toadd];
ChangeTemplate::dropdown($options);
if (($entity->fields["changetemplates_id"] == self::CONFIG_PARENT)
&& ($ID != 0)) {
echo "<font class='green'>&nbsp;&nbsp;";
$tt = new ChangeTemplate();
$tid = self::getUsedConfig('changetemplates_id', $ID, '', 0);
if (!$tid) {
echo Dropdown::EMPTY_VALUE;
} else if ($tt->getFromDB($tid)) {
echo $tt->getLink();
}
echo "</font>";
}
echo "</td></tr>";
echo "<tr class='tab_bg_1'><td colspan='2'>"._n('Problem template', 'Problem templates', 1).
"</td>";
echo "<td colspan='2'>";
$toadd = [];
if ($ID != 0) {
$toadd = [self::CONFIG_PARENT => __('Inheritance of the parent entity')];
}
$options = ['value' => $entity->fields["problemtemplates_id"],
'entity' => $ID,
'toadd' => $toadd];
ProblemTemplate::dropdown($options);
if (($entity->fields["problemtemplates_id"] == self::CONFIG_PARENT)
&& ($ID != 0)) {
echo "<font class='green'>&nbsp;&nbsp;";
$tt = new ProblemTemplate();
$tid = self::getUsedConfig('problemtemplates_id', $ID, '', 0);
if (!$tid) {
echo Dropdown::EMPTY_VALUE;
} else if ($tt->getFromDB($tid)) {
echo $tt->getLink();
}
echo "</font>";
}
echo "</td></tr>";
echo "<tr><th colspan='4'>".__('Tickets configuration')."</th></tr>";
echo "<tr class='tab_bg_1'><td colspan='2'>"._n('Calendar', 'Calendars', 1)."</td>";
echo "<td colspan='2'>";
$options = ['value' => $entity->fields["calendars_id"],
'emptylabel' => __('24/7')];
if ($ID != 0) {
$options['toadd'] = [self::CONFIG_PARENT => __('Inheritance of the parent entity')];
}
Calendar::dropdown($options);
if (($entity->fields["calendars_id"] == self::CONFIG_PARENT)
&& ($ID != 0)) {
echo "<font class='green'>&nbsp;&nbsp;";
$calendar = new Calendar();
$cid = self::getUsedConfig('calendars_id', $ID, '', 0);
if (!$cid) {
echo __('24/7');
} else if ($calendar->getFromDB($cid)) {
echo $calendar->getLink();
}
echo "</font>";
}
echo "</td></tr>";
echo "<tr class='tab_bg_1'><td colspan='2'>".__('Tickets default type')."</td>";
echo "<td colspan='2'>";
$toadd = [];
if ($ID != 0) {
$toadd = [self::CONFIG_PARENT => __('Inheritance of the parent entity')];
}
Ticket::dropdownType('tickettype', ['value' => $entity->fields["tickettype"],
'toadd' => $toadd]);
if (($entity->fields['tickettype'] == self::CONFIG_PARENT)
&& ($ID != 0)) {
echo "<font class='green'>&nbsp;&nbsp;";
echo Ticket::getTicketTypeName(self::getUsedConfig('tickettype', $ID, '',
Ticket::INCIDENT_TYPE));
echo "</font>";
}
echo "</td></tr>";
echo "<tr class='tab_bg_1'><td colspan='2'>".__('Automatic assignment of tickets')."</td>";
echo "<td colspan='2'>";
$autoassign = self::getAutoAssignMode();
if ($ID == 0) {
unset($autoassign[self::CONFIG_PARENT]);
}
Dropdown::showFromArray('auto_assign_mode', $autoassign,
['value' => $entity->fields["auto_assign_mode"]]);
if (($entity->fields['auto_assign_mode'] == self::CONFIG_PARENT)
&& ($ID != 0)) {
$auto_assign_mode = self::getUsedConfig('auto_assign_mode', $entity->fields['entities_id']);
echo "<font class='green'>&nbsp;&nbsp;";
echo $autoassign[$auto_assign_mode];
echo "</font>";
}
echo "</td></tr>";
echo "<tr class='tab_bg_1'><td colspan='2'>".__('Mark followup added by a supplier though an email collector as private')."</td>";
echo "<td colspan='2'>";
$supplierValues = self::getSuppliersAsPrivateValues();
$currentSupplierValue = $entity->fields['suppliers_as_private'];
if ($ID == 0) { // Remove parent option for root entity
unset($supplierValues[self::CONFIG_PARENT]);
}
Dropdown::showFromArray(
'suppliers_as_private',
$supplierValues,
['value' => $currentSupplierValue]
);
// If the entity is using it's parent value, print it
if ($currentSupplierValue == self::CONFIG_PARENT && $ID != 0) {
$parentSupplierValue = self::getUsedConfig(
'suppliers_as_private',
$entity->fields['entities_id']
);
echo "<font class='green'>&nbsp;&nbsp;";
echo $supplierValues[$parentSupplierValue];
echo "</font>";
}
echo "</td></tr>";
echo "<tr class='tab_bg_1'><td colspan='2'>".__('Anonymize support agents')."</td>";
echo "<td colspan='2'>";
$anonymizeValues = self::getAnonymizeSupportAgentsValues();
$currentAnonymizeValue = $entity->fields['anonymize_support_agents'];
if ($ID == 0) { // Remove parent option for root entity
unset($anonymizeValues[self::CONFIG_PARENT]);
}
Dropdown::showFromArray(
'anonymize_support_agents',
$anonymizeValues,
['value' => $currentAnonymizeValue]
);
// If the entity is using it's parent value, print it
if ($currentAnonymizeValue == self::CONFIG_PARENT && $ID != 0) {
$parentHelpdeskValue = self::getUsedConfig(
'anonymize_support_agents',
$entity->fields['entities_id']
);
echo "<font class='green'>&nbsp;&nbsp;";
echo $anonymizeValues[$parentHelpdeskValue];
echo "</font>";
}
echo "</td></tr>";
echo "<tr><th colspan='4'>".__('Automatic closing configuration')."</th></tr>";
echo "<tr class='tab_bg_1'>".
"<td>".__('Automatic closing of solved tickets after');
//Check if crontask is disabled
$crontask = new CronTask();
$criteria = [
'itemtype' => 'Ticket',
'name' => 'closeticket',
'state' => CronTask::STATE_DISABLE
];
if ($crontask->getFromDBByCrit($criteria)) {
echo "<br/><strong>".__('Close ticket action is disabled.')."</strong>";
}
echo "</td>";
echo "<td>";
$autoclose = [self::CONFIG_PARENT => __('Inheritance of the parent entity'),
self::CONFIG_NEVER => __('Never'),
0 => __('Immediatly')];
if ($ID == 0) {
unset($autoclose[self::CONFIG_PARENT]);
}
Dropdown::showNumber('autoclose_delay',
['value' => $entity->fields['autoclose_delay'],
'min' => 1,
'max' => 99,
'step' => 1,
'toadd' => $autoclose,
'unit' => 'day']);
if (($entity->fields['autoclose_delay'] == self::CONFIG_PARENT)
&& ($ID != 0)) {
$autoclose_mode = self::getUsedConfig('autoclose_delay', $entity->fields['entities_id'],
'', self::CONFIG_NEVER);
echo "<br><font class='green'>&nbsp;&nbsp;";
if ($autoclose_mode >= 0) {
printf(_n('%d day', '%d days', $autoclose_mode), $autoclose_mode);
} else {
echo $autoclose[$autoclose_mode];
}
echo "</font>";
}
echo "<td>".__('Automatic purge of closed tickets after');
//Check if crontask is disabled
$crontask = new CronTask();
$criteria = [
'itemtype' => 'Ticket',
'name' => 'purgeticket',
'state' => CronTask::STATE_DISABLE
];
if ($crontask->getFromDBByCrit($criteria)) {
echo "<br/><strong>".__('Purge ticket action is disabled.')."</strong>";
}
echo "</td>";
echo "<td>";
$autopurge = [
self::CONFIG_PARENT => __('Inheritance of the parent entity'),
self::CONFIG_NEVER => __('Never')
];
if ($ID == 0) {
unset($autopurge[self::CONFIG_PARENT]);
}
Dropdown::showNumber(
'autopurge_delay',
[
'value' => $entity->fields['autopurge_delay'],
'min' => 1,
'max' => 3650,
'step' => 1,
'toadd' => $autopurge,
'unit' => 'day']);
if (($entity->fields['autopurge_delay'] == self::CONFIG_PARENT)
&& ($ID != 0)) {
$autopurge_mode = self::getUsedConfig(
'autopurge_delay',
$entity->fields['entities_id'],
'',
self::CONFIG_NEVER
);
echo "<br><font class='green'>&nbsp;&nbsp;";
if ($autopurge_mode >= 0) {
printf(_n('%d day', '%d days', $autopurge_mode), $autopurge_mode);
} else {
echo $autopurge[$autopurge_mode];
}
echo "</font>";
}
echo "</td></tr>";
echo "<tr><th colspan='4'>".__('Configuring the satisfaction survey')."</th></tr>";
echo "<tr class='tab_bg_1'>".
"<td colspan='2'>".__('Configuring the satisfaction survey')."</td>";
echo "<td colspan='2'>";
/// no inquest case = rate 0
$typeinquest = [self::CONFIG_PARENT => __('Inheritance of the parent entity'),
1 => __('Internal survey'),
2 => __('External survey')];
// No inherit from parent for root entity
if ($ID == 0) {
unset($typeinquest[self::CONFIG_PARENT]);
if ($entity->fields['inquest_config'] == self::CONFIG_PARENT) {
$entity->fields['inquest_config'] = 1;
}
}
$rand = Dropdown::showFromArray('inquest_config', $typeinquest,
$options = ['value' => $entity->fields['inquest_config']]);
echo "</td></tr>\n";
// Do not display for root entity in inherit case
if (($entity->fields['inquest_config'] == self::CONFIG_PARENT)
&& ($ID !=0)) {
$inquestconfig = self::getUsedConfig('inquest_config', $entity->fields['entities_id']);
$inquestrate = self::getUsedConfig('inquest_config', $entity->fields['entities_id'],
'inquest_rate');
echo "<tr class='tab_bg_1'><td colspan='4' class='green center'>";
if ($inquestrate == 0) {
echo __('Disabled');
} else {
echo $typeinquest[$inquestconfig].'<br>';
$inqconf = self::getUsedConfig('inquest_config', $entity->fields['entities_id'],
'inquest_delay');
printf(_n('%d day', '%d days', $inqconf), $inqconf);
echo "<br>";
//TRANS: %d is the percentage. %% to display %
printf(__('%d%%'), $inquestrate);
if ($inquestconfig == 2) {
echo "<br>";
echo self::getUsedConfig('inquest_config', $entity->fields['entities_id'],
'inquest_URL');
}
}
echo "</td></tr>\n";
}
echo "<tr class='tab_bg_1'><td colspan='4'>";
$_POST = ['inquest_config' => $entity->fields['inquest_config'],
'entities_id' => $ID];
$params = ['inquest_config' => '__VALUE__',
'entities_id' => $ID];
echo "<div id='inquestconfig'>";
include GLPI_ROOT.'/ajax/ticketsatisfaction.php';
echo "</div>\n";
echo "</td></tr>";
Plugin::doHook("post_item_form", ['item' => $entity, 'options' => &$options]);
echo "</table>";
if ($canedit) {
echo "<div class='center'>";
echo "<input type='hidden' name='id' value='".$entity->fields["id"]."'>";
echo "<input type='submit' name='update' value=\""._sx('button', 'Save')."\"
class='submit'>";
echo "</div>";
Html::closeForm();
}
echo "</div>";
Ajax::updateItemOnSelectEvent("dropdown_inquest_config$rand", "inquestconfig",
$CFG_GLPI["root_doc"]."/ajax/ticketsatisfaction.php", $params);
}
/**
* Retrieve data of current entity or parent entity
*
* @since 0.84 (before in entitydata.class)
*
* @param string $fieldref name of the referent field to know if we look at parent entity
* @param integer $entities_id
* @param string $fieldval name of the field that we want value (default '')
* @param mixed $default_value value to return (default -2)
**/
static function getUsedConfig($fieldref, $entities_id = null, $fieldval = '', $default_value = -2) {
// Get for current entity
if ($entities_id === null) {
$entities_id = Session::getActiveEntity();
}
// for calendar
if (empty($fieldval)) {
$fieldval = $fieldref;
}
$entity = new self();
// Search in entity data of the current entity
if ($entity->getFromDB($entities_id)) {
// Value is defined : use it
if (isset($entity->fields[$fieldref])) {
// Numerical value
if (is_numeric($default_value)
&& ($entity->fields[$fieldref] != self::CONFIG_PARENT)) {
return $entity->fields[$fieldval];
}
// String value
if (!is_numeric($default_value)
&& $entity->fields[$fieldref]) {
return $entity->fields[$fieldval];
}
}
}
// Entity data not found or not defined : search in parent one
if ($entities_id > 0) {
if ($entity->getFromDB($entities_id)) {
$ret = self::getUsedConfig($fieldref, $entity->fields['entities_id'], $fieldval,
$default_value);
return $ret;
}
}
return $default_value;
}
/**
* Generate link for ticket satisfaction
*
* @since 0.84 (before in entitydata.class)
*
* @param $ticket ticket object
*
* @return string url contents
**/
static function generateLinkSatisfaction($ticket) {
$url = self::getUsedConfig('inquest_config', $ticket->fields['entities_id'], 'inquest_URL');
if (strstr($url, "[TICKET_ID]")) {
$url = str_replace("[TICKET_ID]", $ticket->fields['id'], $url);
}
if (strstr($url, "[TICKET_NAME]")) {
$url = str_replace("[TICKET_NAME]", urlencode($ticket->fields['name']), $url);
}
if (strstr($url, "[TICKET_CREATEDATE]")) {
$url = str_replace("[TICKET_CREATEDATE]", $ticket->fields['date'], $url);
}
if (strstr($url, "[TICKET_SOLVEDATE]")) {
$url = str_replace("[TICKET_SOLVEDATE]", $ticket->fields['solvedate'], $url);
}
if (strstr($url, "[REQUESTTYPE_ID]")) {
$url = str_replace("[REQUESTTYPE_ID]", $ticket->fields['requesttypes_id'], $url);
}
if (strstr($url, "[REQUESTTYPE_NAME]")) {
$url = str_replace("[REQUESTTYPE_NAME]",
urlencode(Dropdown::getDropdownName('glpi_requesttypes',
$ticket->fields['requesttypes_id'])),
$url);
}
if (strstr($url, "[TICKET_PRIORITY]")) {
$url = str_replace("[TICKET_PRIORITY]", $ticket->fields['priority'], $url);
}
if (strstr($url, "[TICKET_PRIORITYNAME]")) {
$url = str_replace("[TICKET_PRIORITYNAME]",
urlencode(CommonITILObject::getPriorityName($ticket->fields['priority'])),
$url);
}
if (strstr($url, "[TICKETCATEGORY_ID]")) {
$url = str_replace("[TICKETCATEGORY_ID]", $ticket->fields['itilcategories_id'], $url);
}
if (strstr($url, "[TICKETCATEGORY_NAME]")) {
$url = str_replace("[TICKETCATEGORY_NAME]",
urlencode(Dropdown::getDropdownName('glpi_itilcategories',
$ticket->fields['itilcategories_id'])),
$url);
}
if (strstr($url, "[TICKETTYPE_ID]")) {
$url = str_replace("[TICKETTYPE_ID]", $ticket->fields['type'], $url);
}
if (strstr($url, "[TICKET_TYPENAME]")) {
$url = str_replace("[TICKET_TYPENAME]",
Ticket::getTicketTypeName($ticket->fields['type']), $url);
}
if (strstr($url, "[SOLUTIONTYPE_ID]")) {
$url = str_replace("[SOLUTIONTYPE_ID]", $ticket->fields['solutiontypes_id'], $url);
}
if (strstr($url, "[SOLUTIONTYPE_NAME]")) {
$url = str_replace("[SOLUTIONTYPE_NAME]",
urlencode(Dropdown::getDropdownName('glpi_solutiontypes',
$ticket->fields['solutiontypes_id'])),
$url);
}
if (strstr($url, "[SLA_TTO_ID]")) {
$url = str_replace("[SLA_TTO_ID]", $ticket->fields['slas_id_tto'], $url);
}
if (strstr($url, "[SLA_TTO_NAME]")) {
$url = str_replace("[SLA_TTO_NAME]",
urlencode(Dropdown::getDropdownName('glpi_slas',
$ticket->fields['slas_id_tto'])),
$url);
}
if (strstr($url, "[SLA_TTR_ID]")) {
$url = str_replace("[SLA_TTR_ID]", $ticket->fields['slas_id_ttr'], $url);
}
if (strstr($url, "[SLA_TTR_NAME]")) {
$url = str_replace("[SLA_TTR_NAME]",
urlencode(Dropdown::getDropdownName('glpi_slas',
$ticket->fields['slas_id_ttr'])),
$url);
}
if (strstr($url, "[SLALEVEL_ID]")) {
$url = str_replace("[SLALEVEL_ID]", $ticket->fields['slalevels_id_ttr'], $url);
}
if (strstr($url, "[SLALEVEL_NAME]")) {
$url = str_replace("[SLALEVEL_NAME]",
urlencode(Dropdown::getDropdownName('glpi_slalevels',
$ticket->fields['slalevels_id_ttr'])),
$url);
}
return $url;
}
/**
* get value for auto_assign_mode
*
* @since 0.84 (created in version 0.83 in entitydata.class)
*
* @param integer|null $val if not set, ask for all values, else for 1 value (default NULL)
*
* @return string|array
**/
static function getAutoAssignMode($val = null) {
$tab = [self::CONFIG_PARENT => __('Inheritance of the parent entity'),
self::CONFIG_NEVER => __('No'),
self::AUTO_ASSIGN_HARDWARE_CATEGORY => __('Based on the item then the category'),
self::AUTO_ASSIGN_CATEGORY_HARDWARE => __('Based on the category then the item')];
if (is_null($val)) {
return $tab;
}
if (isset($tab[$val])) {
return $tab[$val];
}
return NOT_AVAILABLE;
}
/**
* get value for suppliers_as_private
*
* @since 9.5
*
* @param integer|null $val if not set, ask for all values, else for 1 value (default NULL)
*
* @return string|array
**/
static function getSuppliersAsPrivateValues() {
return [
self::CONFIG_PARENT => __('Inheritance of the parent entity'),
0 => __('No'),
1 => __('Yes'),
];
}
/**
* Get values for anonymize_support_agents
*
* @since 9.5
*
* @return array
**/
static function getAnonymizeSupportAgentsValues() {
return [
self::CONFIG_PARENT => __('Inheritance of the parent entity'),
0 => __('No'),
1 => __('Yes'),
];
}
/**
* @since 0.84
*
* @param $options array
**/
static function dropdownAutoAssignMode(array $options) {
$p['name'] = 'auto_assign_mode';
$p['value'] = 0;
$p['display'] = true;
if (count($options)) {
foreach ($options as $key => $val) {
$p[$key] = $val;
}
}
$tab = self::getAutoAssignMode();
return Dropdown::showFromArray($p['name'], $tab, $p);
}
/**
* @since 0.84 (before in entitydata.class)
*
* @param $field
* @param $values
* @param $options array
**/
static function getSpecificValueToDisplay($field, $values, array $options = []) {
if (!is_array($values)) {
$values = [$field => $values];
}
switch ($field) {
case 'use_licenses_alert' :
case 'use_certificates_alert' :
case 'use_contracts_alert' :
case 'use_infocoms_alert' :
case 'is_notif_enable_default' :
if ($values[$field] == self::CONFIG_PARENT) {
return __('Inheritance of the parent entity');
}
return Dropdown::getYesNo($values[$field]);
case 'use_reservations_alert' :
switch ($values[$field]) {
case self::CONFIG_PARENT :
return __('Inheritance of the parent entity');
case 0 :
return __('Never');
}
return sprintf(_n('%d hour', '%d hours', $values[$field]), $values[$field]);
case 'default_cartridges_alarm_threshold' :
case 'default_consumables_alarm_threshold' :
switch ($values[$field]) {
case self::CONFIG_PARENT :
return __('Inheritance of the parent entity');
case 0 :
return __('Never');
}
return $values[$field];
case 'send_contracts_alert_before_delay' :
case 'send_infocoms_alert_before_delay' :
case 'send_licenses_alert_before_delay' :
case 'send_certificates_alert_before_delay' :
switch ($values[$field]) {
case self::CONFIG_PARENT :
return __('Inheritance of the parent entity');
case 0 :
return __('No');
}
return sprintf(_n('%d day', '%d days', $values[$field]), $values[$field]);
case 'cartridges_alert_repeat' :
case 'consumables_alert_repeat' :
switch ($values[$field]) {
case self::CONFIG_PARENT :
return __('Inheritance of the parent entity');
case self::CONFIG_NEVER :
case 0 : // For compatibility issue
return __('Never');
case DAY_TIMESTAMP :
return __('Each day');
case WEEK_TIMESTAMP :
return __('Each week');
case MONTH_TIMESTAMP :
return __('Each month');
default :
// Display value if not defined
return $values[$field];
}
break;
case 'notclosed_delay' : // 0 means never
switch ($values[$field]) {
case self::CONFIG_PARENT :
return __('Inheritance of the parent entity');
case 0 :
return __('Never');
}
return sprintf(_n('%d day', '%d days', $values[$field]), $values[$field]);
case 'auto_assign_mode' :
return self::getAutoAssignMode($values[$field]);
case 'tickettype' :
if ($values[$field] == self::CONFIG_PARENT) {
return __('Inheritance of the parent entity');
}
return Ticket::getTicketTypeName($values[$field]);
case 'autofill_buy_date' :
case 'autofill_order_date' :
case 'autofill_delivery_date' :
case 'autofill_use_date' :
case 'autofill_warranty_date' :
case 'autofill_decommission_date' :
switch ($values[$field]) {
case self::CONFIG_PARENT :
return __('Inheritance of the parent entity');
case Infocom::COPY_WARRANTY_DATE :
return __('Copy the start date of warranty');
case Infocom::COPY_BUY_DATE :
return __('Copy the date of purchase');
case Infocom::COPY_ORDER_DATE :
return __('Copy the order date');
case Infocom::COPY_DELIVERY_DATE :
return __('Copy the delivery date');
default :
if (strstr($values[$field], '_')) {
list($type,$sid) = explode('_', $values[$field], 2);
if ($type == Infocom::ON_STATUS_CHANGE) {
// TRANS %s is the name of the state
return sprintf(__('Fill when shifting to state %s'),
Dropdown::getDropdownName('glpi_states', $sid));
}
}
}
return __('No autofill');
case 'inquest_config' :
if ($values[$field] == self::CONFIG_PARENT) {
return __('Inheritance of the parent entity');
}
return TicketSatisfaction::getTypeInquestName($values[$field]);
case 'default_contract_alert' :
return Contract::getAlertName($values[$field]);
case 'default_infocom_alert' :
return Infocom::getAlertName($values[$field]);
case 'entities_id_software' :
if ($values[$field] == self::CONFIG_NEVER) {
return __('No change of entity');
}
if ($values[$field] == self::CONFIG_PARENT) {
return __('Inheritance of the parent entity');
}
return Dropdown::getDropdownName('glpi_entities', $values[$field]);
case 'tickettemplates_id' :
if ($values[$field] == self::CONFIG_PARENT) {
return __('Inheritance of the parent entity');
}
return Dropdown::getDropdownName(TicketTemplate::getTable(), $values[$field]);
case 'calendars_id' :
switch ($values[$field]) {
case self::CONFIG_PARENT :
return __('Inheritance of the parent entity');
case 0 :
return __('24/7');
}
return Dropdown::getDropdownName('glpi_calendars', $values[$field]);
}
return parent::getSpecificValueToDisplay($field, $values, $options);
}
/**
* @since 0.84
*
* @param $field
* @param $name (default '')
* @param $values (default '')
* @param $options array
**/
static function getSpecificValueToSelect($field, $name = '', $values = '', array $options = []) {
if (!is_array($values)) {
$values = [$field => $values];
}
$options['display'] = false;
switch ($field) {
case 'use_licenses_alert' :
case 'use_certificates_alert' :
case 'use_contracts_alert' :
case 'use_infocoms_alert' :
$options['name'] = $name;
$options['value'] = $values[$field];
return Alert::dropdownYesNo($options);
case 'cartridges_alert_repeat' :
case 'consumables_alert_repeat' :
$options['name'] = $name;
$options['value'] = $values[$field];
return Alert::dropdown($options);
case 'send_contracts_alert_before_delay' :
case 'send_infocoms_alert_before_delay' :
case 'send_licenses_alert_before_delay' :
case 'send_certificates_alert_before_delay' :
$options['unit'] = 'day';
$options['never_string'] = __('No');
return Alert::dropdownIntegerNever($name, $values[$field], $options);
case 'use_reservations_alert' :
$options['unit'] = 'hour';
return Alert::dropdownIntegerNever($name, $values[$field], $options);
case 'notclosed_delay' :
$options['unit'] = 'hour';
return Alert::dropdownIntegerNever($name, $values[$field], $options);
case 'auto_assign_mode' :
$options['name'] = $name;
$options['value'] = $values[$field];
return self::dropdownAutoAssignMode($options);
case 'tickettype' :
$options['value'] = $values[$field];
$options['toadd'] = [self::CONFIG_PARENT => __('Inheritance of the parent entity')];
return Ticket::dropdownType($name, $options);
case 'autofill_buy_date' :
case 'autofill_order_date' :
case 'autofill_delivery_date' :
case 'autofill_use_date' :
case 'autofill_decommission_date' :
$tab[0] = __('No autofill');
$tab[self::CONFIG_PARENT] = __('Inheritance of the parent entity');
$states = getAllDataFromTable('glpi_states');
foreach ($states as $state) {
$tab[Infocom::ON_STATUS_CHANGE.'_'.$state['id']]
//TRANS: %s is the name of the state
= sprintf(__('Fill when shifting to state %s'), $state['name']);
}
$tab[Infocom::COPY_WARRANTY_DATE] = __('Copy the start date of warranty');
if ($field != 'autofill_buy_date') {
$tab[Infocom::COPY_BUY_DATE] = __('Copy the date of purchase');
if ($field != 'autofill_order_date') {
$tab[Infocom::COPY_ORDER_DATE] = __('Copy the order date');
if ($field != 'autofill_delivery_date') {
$options[Infocom::COPY_DELIVERY_DATE] = __('Copy the delivery date');
}
}
}
$options['value'] = $values[$field];
return Dropdown::showFromArray($name, $tab, $options);
case 'autofill_warranty_date' :
$tab = [0 => __('No autofill'),
Infocom::COPY_BUY_DATE => __('Copy the date of purchase'),
Infocom::COPY_ORDER_DATE => __('Copy the order date'),
Infocom::COPY_DELIVERY_DATE => __('Copy the delivery date'),
self::CONFIG_PARENT => __('Inheritance of the parent entity')];
$options['value'] = $values[$field];
return Dropdown::showFromArray($name, $tab, $options);
case 'inquest_config' :
$typeinquest = [self::CONFIG_PARENT => __('Inheritance of the parent entity'),
1 => __('Internal survey'),
2 => __('External survey')];
$options['value'] = $values[$field];
return Dropdown::showFromArray($name, $typeinquest, $options);
case 'default_contract_alert' :
$options['name'] = $name;
$options['value'] = $values[$field];
return Contract::dropdownAlert($options);
case 'default_infocom_alert' :
$options['name'] = $name;
$options['value'] = $values[$field];
return Infocom::dropdownAlert($options);
case 'entities_id_software' :
$options['toadd'] = [self::CONFIG_NEVER => __('No change of entity')]; // Keep software in PC entity
$options['toadd'][self::CONFIG_PARENT] = __('Inheritance of the parent entity');
return self::dropdown($options);
}
return parent::getSpecificValueToSelect($field, $name, $values, $options);
}
function getRights($interface = 'central') {
$values = parent::getRights();
$values[self::READHELPDESK] = ['short' => __('Read parameters'),
'long' => __('Read helpdesk parameters')];
$values[self::UPDATEHELPDESK] = ['short' => __('Update parameters'),
'long' => __('Update helpdesk parameters')];
return $values;
}
function displaySpecificTypeField($ID, $field = []) {
switch ($field['type']) {
case 'setlocation':
$this->showMap();
break;
default:
throw new \RuntimeException("Unknown {$field['type']}");
}
}
static function getIcon() {
return "fas fa-layer-group";
}
}