Current File : /home/escuelai/public_html/it/src/Profile.php |
<?php
/**
* ---------------------------------------------------------------------
*
* GLPI - Gestionnaire Libre de Parc Informatique
*
* http://glpi-project.org
*
* @copyright 2015-2022 Teclib' and contributors.
* @copyright 2003-2014 by the INDEPNET Development Team.
* @licence https://www.gnu.org/licenses/gpl-3.0.html
*
* ---------------------------------------------------------------------
*
* LICENSE
*
* This file is part of GLPI.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*
* ---------------------------------------------------------------------
*/
/**
* Profile class
**/
class Profile extends CommonDBTM
{
// Specific ones
/// Helpdesk fields of helpdesk profiles
public static $helpdesk_rights = [
'create_ticket_on_login',
'changetemplates_id',
'followup',
'helpdesk_hardware',
'helpdesk_item_type',
'knowbase',
'password_update',
'personalization',
'problemtemplates_id',
'reminder_public',
'reservation',
'rssfeed_public',
'show_group_hardware',
'task',
'ticket',
'ticket_cost',
'ticket_status',
'tickettemplates_id',
'ticketvalidation',
];
/// Common fields used for all profiles type
public static $common_fields = ['id', 'interface', 'is_default', 'name'];
public $dohistory = true;
public static $rightname = 'profile';
/**
* Profile rights to update after profile update.
* @var array
*/
private $profileRight;
public function __get(string $property)
{
$value = null;
switch ($property) {
case 'profileRight':
Toolbox::deprecated(sprintf('Reading private property %s::%s is deprecated', __CLASS__, $property));
$value = $this->$property;
break;
default:
$trace = debug_backtrace();
trigger_error(
sprintf('Undefined property: %s::%s in %s on line %d', __CLASS__, $property, $trace[0]['file'], $trace[0]['line']),
E_USER_WARNING
);
break;
}
return $value;
}
public function __set(string $property, $value)
{
switch ($property) {
case 'profileRight':
Toolbox::deprecated(sprintf('Writing private property %s::%s is deprecated', __CLASS__, $property));
$this->$property = $value;
break;
default:
$trace = debug_backtrace();
trigger_error(
sprintf('Undefined property: %s::%s in %s on line %d', __CLASS__, $property, $trace[0]['file'], $trace[0]['line']),
E_USER_WARNING
);
break;
}
}
public function getForbiddenStandardMassiveAction()
{
$forbidden = parent::getForbiddenStandardMassiveAction();
$forbidden[] = 'update';
$forbidden[] = 'clone';
return $forbidden;
}
public static function getTypeName($nb = 0)
{
return _n('Profile', 'Profiles', $nb);
}
public function defineTabs($options = [])
{
$ong = [];
$this->addDefaultFormTab($ong);
$this->addImpactTab($ong, $options);
$this->addStandardTab(__CLASS__, $ong, $options);
$this->addStandardTab('Profile_User', $ong, $options);
$this->addStandardTab('Log', $ong, $options);
return $ong;
}
public function getTabNameForItem(CommonGLPI $item, $withtemplate = 0)
{
if (!$withtemplate) {
switch ($item->getType()) {
case __CLASS__:
if ($item->fields['interface'] == 'helpdesk') {
$ong[3] = __('Assistance'); // Helpdesk
$ong[4] = __('Life cycles');
$ong[6] = __('Tools');
$ong[8] = __('Setup');
} else {
$ong[2] = _n('Asset', 'Assets', Session::getPluralNumber());
$ong[3] = __('Assistance');
$ong[4] = __('Life cycles');
$ong[5] = __('Management');
$ong[6] = __('Tools');
$ong[7] = __('Administration');
$ong[8] = __('Setup');
}
return $ong;
}
}
return '';
}
public static function displayTabContentForItem(CommonGLPI $item, $tabnum = 1, $withtemplate = 0)
{
if ($item->getType() == __CLASS__) {
$item->cleanProfile();
switch ($tabnum) {
case 2:
$item->showFormAsset();
break;
case 3:
if ($item->fields['interface'] == 'helpdesk') {
$item->showFormTrackingHelpdesk();
} else {
$item->showFormTracking();
}
break;
case 4:
if ($item->fields['interface'] == 'helpdesk') {
$item->showFormLifeCycleHelpdesk();
} else {
$item->showFormLifeCycle();
}
break;
case 5:
$item->showFormManagement();
break;
case 6:
if ($item->fields['interface'] == 'helpdesk') {
$item->showFormToolsHelpdesk();
} else {
$item->showFormTools();
}
break;
case 7:
$item->showFormAdmin();
break;
case 8:
if ($item->fields['interface'] == 'helpdesk') {
$item->showFormSetupHelpdesk();
} else {
$item->showFormSetup();
}
break;
}
}
return true;
}
public function post_updateItem($history = 1)
{
global $DB;
if (count($this->profileRight) > 0) {
ProfileRight::updateProfileRights($this->getID(), $this->profileRight);
$this->profileRight = null;
}
if (in_array('is_default', $this->updates) && ($this->input["is_default"] == 1)) {
$DB->update(
$this->getTable(),
[
'is_default' => 0
],
[
'id' => ['<>', $this->input['id']]
]
);
}
// To avoid log out and login when rights change (very useful in debug mode)
if (
isset($_SESSION['glpiactiveprofile']['id'])
&& $_SESSION['glpiactiveprofile']['id'] == $this->input['id']
) {
if (in_array('helpdesk_item_type', $this->updates)) {
$_SESSION['glpiactiveprofile']['helpdesk_item_type'] = importArrayFromDB($this->input['helpdesk_item_type']);
}
if (in_array('managed_domainrecordtypes', $this->updates)) {
$_SESSION['glpiactiveprofile']['managed_domainrecordtypes'] = importArrayFromDB($this->input['managed_domainrecordtypes']);
}
///TODO other needed fields
}
}
public function post_addItem()
{
global $DB;
$rights = ProfileRight::getAllPossibleRights();
ProfileRight::updateProfileRights($this->fields['id'], $rights);
$this->profileRight = null;
if (isset($this->fields['is_default']) && ($this->fields["is_default"] == 1)) {
$DB->update(
$this->getTable(),
[
'is_default' => 0
],
[
'id' => ['<>', $this->fields['id']]
]
);
}
}
public function cleanDBonPurge()
{
$this->deleteChildrenAndRelationsFromDb(
[
KnowbaseItem_Profile::class,
Profile_Reminder::class,
Profile_RSSFeed::class,
Profile_User::class,
ProfileRight::class,
]
);
Rule::cleanForItemAction($this);
// PROFILES and UNIQUE_PROFILE in RuleMailcollector
Rule::cleanForItemCriteria($this, 'PROFILES');
Rule::cleanForItemCriteria($this, 'UNIQUE_PROFILE');
}
public function prepareInputForUpdate($input)
{
if (isset($input["_helpdesk_item_types"])) {
if ((!isset($input["helpdesk_item_type"])) || (!is_array($input["helpdesk_item_type"]))) {
$input["helpdesk_item_type"] = [];
}
// Linear_HIT: $input["helpdesk_item_type"] = array_keys($input["helpdesk_item_type"]
$input["helpdesk_item_type"] = exportArrayToDB($input["helpdesk_item_type"]);
}
if (isset($input["_managed_domainrecordtypes"])) {
if ((!isset($input["managed_domainrecordtypes"])) || (!is_array($input["managed_domainrecordtypes"]))) {
$input["managed_domainrecordtypes"] = [];
}
if (in_array(-1, $input['managed_domainrecordtypes'])) {
//when all selected, keep only all
$input['managed_domainrecordtypes'] = [-1];
}
$input["managed_domainrecordtypes"] = exportArrayToDB($input["managed_domainrecordtypes"]);
}
if (isset($input['helpdesk_hardware']) && is_array($input['helpdesk_hardware'])) {
$helpdesk_hardware = 0;
foreach ($input['helpdesk_hardware'] as $right => $value) {
if ($value) {
$helpdesk_hardware += $right;
}
}
$input['helpdesk_hardware'] = $helpdesk_hardware;
}
if (isset($input["_cycle_ticket"])) {
$tab = array_keys(Ticket::getAllStatusArray());
$cycle = [];
foreach ($tab as $from) {
foreach ($tab as $dest) {
if (
($from != $dest)
&& (!isset($input["_cycle_ticket"][$from][$dest])
|| ($input["_cycle_ticket"][$from][$dest] == 0))
) {
$cycle[$from][$dest] = 0;
}
}
}
$input["ticket_status"] = exportArrayToDB($cycle);
}
if (isset($input["_cycle_problem"])) {
$tab = Problem::getAllStatusArray();
$cycle = [];
foreach ($tab as $from => $label) {
foreach ($tab as $dest => $label2) {
if (
($from !== $dest)
&& ($input["_cycle_problem"][$from][$dest] == 0)
) {
$cycle[$from][$dest] = 0;
}
}
}
$input["problem_status"] = exportArrayToDB($cycle);
}
if (isset($input["_cycle_change"])) {
$tab = Change::getAllStatusArray();
$cycle = [];
foreach ($tab as $from => $label) {
foreach ($tab as $dest => $label2) {
if (
($from !== $dest)
&& ($input["_cycle_change"][$from][$dest] == 0)
) {
$cycle[$from][$dest] = 0;
}
}
}
$input["change_status"] = exportArrayToDB($cycle);
}
// keep only unnecessary rights when switching from standard to self-service interface
if (!isset($input["_ticket"]) && isset($input['interface']) && $input['interface'] == "helpdesk") {
$ticket = new Ticket();
$ss_rights = $ticket->getRights("helpdesk");
$ss_rights = array_keys($ss_rights);
$input["_ticket"] = [];
foreach ($ss_rights as $right) {
$input["_ticket"][$right] = ($this->fields['ticket'] & $right) ? 1 : 0;
}
}
$this->profileRight = [];
foreach (array_keys(ProfileRight::getAllPossibleRights()) as $right) {
if (isset($input['_' . $right])) {
if (!is_array($input['_' . $right])) {
$input['_' . $right] = ['1' => $input['_' . $right]];
}
$newvalue = 0;
foreach ($input['_' . $right] as $value => $valid) {
if ($valid) {
if (($underscore_pos = strpos($value, '_')) !== false) {
$value = substr($value, 0, $underscore_pos);
}
$newvalue += $value;
}
}
// Update rights only if changed
if (!isset($this->fields[$right]) || ($this->fields[$right] != $newvalue)) {
$this->profileRight[$right] = $newvalue;
}
unset($input['_' . $right]);
}
}
// check if right if the last write profile on Profile object
if (
($this->fields['profile'] & UPDATE)
&& isset($input['profile']) && !($input['profile'] & UPDATE)
&& (countElementsInTable(
"glpi_profilerights",
['name' => 'profile', 'rights' => ['&', UPDATE]]
))
) {
Session::addMessageAfterRedirect(
__("This profile is the last with write rights on profiles"),
false,
ERROR
);
Session::addMessageAfterRedirect(__("Deletion refused"), false, ERROR);
unset($input["profile"]);
}
return $input;
}
/**
* check right before delete
*
* @since 0.85
*
* @return boolean
**/
public function pre_deleteItem()
{
if (
($this->fields['profile'] & DELETE)
&& (countElementsInTable(
"glpi_profilerights",
['name' => 'profile', 'rights' => ['&', DELETE]]
))
) {
Session::addMessageAfterRedirect(
__("This profile is the last with write rights on profiles"),
false,
ERROR
);
Session::addMessageAfterRedirect(__("Deletion refused"), false, ERROR);
return false;
}
return true;
}
public function prepareInputForAdd($input)
{
if (isset($input["helpdesk_item_type"])) {
$input["helpdesk_item_type"] = exportArrayToDB($input["helpdesk_item_type"]);
}
if (isset($input["managed_domainrecordtypes"])) {
$input["managed_domainrecordtypes"] = exportArrayToDB($input["managed_domainrecordtypes"]);
}
$this->profileRight = [];
foreach (array_keys(ProfileRight::getAllPossibleRights()) as $right) {
if (isset($input[$right])) {
$this->profileRight[$right] = $input[$right];
unset($input[$right]);
}
}
// Set default values, only needed for helpdesk
$interface = isset($input['interface']) ? $input['interface'] : "";
if ($interface == "helpdesk" && !isset($input["_cycle_ticket"])) {
$tab = array_keys(Ticket::getAllStatusArray());
$cycle = [];
foreach ($tab as $from) {
foreach ($tab as $dest) {
if ($from != $dest) {
$cycle[$from][$dest] = 0;
}
}
}
$input["ticket_status"] = exportArrayToDB($cycle);
}
return $input;
}
/**
* Unset unused rights for helpdesk
**/
public function cleanProfile()
{
if (isset($this->fields['interface']) && $this->fields["interface"] == "helpdesk") {
foreach ($this->fields as $key => $val) {
if (
!in_array($key, self::$common_fields)
&& !in_array($key, self::$helpdesk_rights)
) {
unset($this->fields[$key]);
}
}
}
// decode array
if (
isset($this->fields["helpdesk_item_type"])
&& !is_array($this->fields["helpdesk_item_type"])
) {
$this->fields["helpdesk_item_type"] = importArrayFromDB($this->fields["helpdesk_item_type"]);
}
// Empty/NULL case
if (
!isset($this->fields["helpdesk_item_type"])
|| !is_array($this->fields["helpdesk_item_type"])
) {
$this->fields["helpdesk_item_type"] = [];
}
// decode array
if (
isset($this->fields["managed_domainrecordtypes"])
&& !is_array($this->fields["managed_domainrecordtypes"])
) {
$this->fields["managed_domainrecordtypes"] = importArrayFromDB($this->fields["managed_domainrecordtypes"]);
}
// Empty/NULL case
if (
!isset($this->fields["managed_domainrecordtypes"])
|| !is_array($this->fields["managed_domainrecordtypes"])
) {
$this->fields["managed_domainrecordtypes"] = [];
}
// Decode status array
$fields_to_decode = ['ticket_status', 'problem_status', 'change_status'];
foreach ($fields_to_decode as $val) {
if (isset($this->fields[$val]) && !is_array($this->fields[$val])) {
$this->fields[$val] = importArrayFromDB($this->fields[$val]);
// Need to be an array not a null value
if (is_null($this->fields[$val])) {
$this->fields[$val] = [];
}
}
}
}
/**
* Get SQL restrict criteria to determine profiles with less rights than the active one
*
* @since 9.3.1
*
* @return array
**/
public static function getUnderActiveProfileRestrictCriteria()
{
// Not logged -> no profile to see
if (!isset($_SESSION['glpiactiveprofile'])) {
return [0];
}
// Profile right : may modify profile so can attach all profile
if (Profile::canCreate()) {
return [1];
}
$criteria = ['glpi_profiles.interface' => Session::getCurrentInterface()];
// First, get all possible rights
$right_subqueries = [];
foreach (ProfileRight::getAllPossibleRights() as $key => $default) {
$val = isset($_SESSION['glpiactiveprofile'][$key]) ? $_SESSION['glpiactiveprofile'][$key] : 0;
if (
!is_array($val) // Do not include entities field added by login
&& (Session::getCurrentInterface() == 'central'
|| in_array($key, self::$helpdesk_rights))
) {
$right_subqueries[] = [
'glpi_profilerights.name' => $key,
'RAW' => [
'(' . DBmysql::quoteName('glpi_profilerights.rights') . ' | ' . DBmysql::quoteValue($val) . ')' => $val
]
];
}
}
$sub_query = new QuerySubQuery([
'FROM' => 'glpi_profilerights',
'COUNT' => 'cpt',
'WHERE' => [
'glpi_profilerights.profiles_id' => new \QueryExpression(\DBmysql::quoteName('glpi_profiles.id')),
'OR' => $right_subqueries
]
]);
$criteria[] = new \QueryExpression(count($right_subqueries) . " = " . $sub_query->getQuery());
if (Session::getCurrentInterface() == 'central') {
return [
'OR' => [
'glpi_profiles.interface' => 'helpdesk',
$criteria
]
];
}
return $criteria;
}
/**
* Is the current user have more right than all profiles in parameters
*
* @param $IDs array of profile ID to test
*
* @return boolean true if have more right
**/
public static function currentUserHaveMoreRightThan($IDs = [])
{
global $DB;
if (Session::isCron()) {
return true;
}
if (count($IDs) == 0) {
// Check all profiles (means more right than all possible profiles)
return (countElementsInTable('glpi_profiles')
== countElementsInTable(
'glpi_profiles',
self::getUnderActiveProfileRestrictCriteria()
));
}
$under_profiles = [];
$iterator = $DB->request([
'FROM' => self::getTable(),
'WHERE' => self::getUnderActiveProfileRestrictCriteria()
]);
foreach ($iterator as $data) {
$under_profiles[$data['id']] = $data['id'];
}
foreach ($IDs as $ID) {
if (!isset($under_profiles[$ID])) {
return false;
}
}
return true;
}
public function showLegend()
{
echo "<div class='spaced'>";
echo "<table class='tab_cadre_fixe'>";
echo "<tr class='tab_bg_2'><td width='70' style='text-decoration:underline' class='b'>";
echo __('Caption') . "</td>";
echo "<td class='tab_bg_4' width='15' style='border:1px solid black'></td>";
echo "<td class='b'>" . __('Global right') . "</td></tr>\n";
echo "<tr class='tab_bg_2'><td></td>";
echo "<td class='tab_bg_2' width='15' style='border:1px solid black'></td>";
echo "<td class='b'>" . __('Entity right') . "</td></tr>";
echo "</table></div>\n";
}
public function post_getEmpty()
{
$this->fields["interface"] = "helpdesk";
$this->fields["name"] = __('Without name');
ProfileRight::cleanAllPossibleRights();
$this->fields = array_merge($this->fields, ProfileRight::getAllPossibleRights());
}
public function post_getFromDB()
{
$this->fields = array_merge($this->fields, ProfileRight::getProfileRights($this->getID()));
}
/**
* Print the profile form headers
*
* @param $ID integer : Id of the item to print
* @param $options array of possible options
* - target filename : where to go when done.
* - withtemplate boolean : template or basic item
*
* @return boolean item found
**/
public function showForm($ID, array $options = [])
{
$onfocus = "";
$new = false;
$rowspan = 4;
if ($ID > 0) {
$rowspan++;
$this->check($ID, READ);
} else {
// Create item
$this->check(-1, CREATE);
$onfocus = "onfocus=\"if (this.value=='" . $this->fields["name"] . "') this.value='';\"";
$new = true;
}
$rand = mt_rand();
$this->showFormHeader($options);
echo "<tr class='tab_bg_1'><td>" . __('Name') . "</td>";
echo "<td><input type='text' name='name' class='form-control' value=\"" . $this->fields["name"] . "\" $onfocus></td>";
echo "<td rowspan='$rowspan' class='middle right'>" . __('Comments') . "</td>";
echo "<td class='center middle' rowspan='$rowspan'>";
echo "<textarea class='form-control' rows='4' name='comment' class='form-control'>" . $this->fields["comment"] . "</textarea>";
echo "</td></tr>";
echo "<tr class='tab_bg_1'><td>" . __('Default profile') . "</td><td>";
Html::showCheckbox(['name' => 'is_default',
'checked' => $this->fields['is_default']
]);
echo "</td></tr>\n";
echo "<tr class='tab_bg_1'><td>" . __("Profile's interface") . "</td>";
echo "<td>";
Dropdown::showFromArray(
'interface',
self::getInterfaces(),
['value' => $this->fields["interface"]]
);
echo "</td></tr>\n";
echo "<tr class='tab_bg_1'><td>" . __('Update password') . "</td><td>";
Html::showCheckbox(['name' => '_password_update',
'checked' => $this->fields['password_update']
]);
echo "</td></tr>\n";
echo "<tr class='tab_bg_1'><td>" . __('Ticket creation form on login') . "</td><td>";
Html::showCheckbox(['name' => 'create_ticket_on_login',
'checked' => $this->fields['create_ticket_on_login']
]);
echo "</td></tr>\n";
$this->showFormButtons($options);
return true;
}
/**
* Print the helpdesk right form for the current profile
*
* @since 0.85
**/
public function showFormTrackingHelpdesk()
{
if (!self::canView()) {
return false;
}
echo "<div class='spaced'>";
if ($canedit = Session::haveRightsOr(self::$rightname, [CREATE, UPDATE, PURGE])) {
echo "<form method='post' action='" . $this->getFormURL() . "' data-track-changes='true'>";
}
$matrix_options = ['canedit' => $canedit,
'default_class' => 'tab_bg_2'
];
$rights = [['rights' => Profile::getRightsFor('Ticket', 'helpdesk'),
'label' => _n('Ticket', 'Tickets', Session::getPluralNumber()),
'field' => 'ticket'
],
['rights' => Profile::getRightsFor('ITILFollowup', 'helpdesk'),
'label' => _n('Followup', 'Followups', Session::getPluralNumber()),
'field' => 'followup'
],
['rights' => Profile::getRightsFor('TicketTask', 'helpdesk'),
'label' => _n('Task', 'Tasks', Session::getPluralNumber()),
'field' => 'task'
],
['rights' => Profile::getRightsFor('TicketValidation', 'helpdesk'),
'label' => _n('Validation', 'Validations', Session::getPluralNumber()),
'field' => 'ticketvalidation'
]
];
$matrix_options['title'] = __('Assistance');
$this->displayRightsChoiceMatrix($rights, $matrix_options);
echo "<div class='mt-4 mx-n2'>";
echo "<table class='table table-hover card-table'>";
echo "<thead>";
echo "<tr class='border-top'><th colspan='2'><h4>" . __('Association') . "</h4></th></tr>";
echo "</thead>";
echo "<tr'>";
echo "<td>" . __('See hardware of my groups') . "</td>";
echo "<td>";
Html::showCheckbox([
'name' => '_show_group_hardware',
'checked' => $this->fields['show_group_hardware']
]);
echo "</td>";
echo "</tr>";
echo "<tr>";
echo "<td>" . __('Link with items for the creation of tickets') . "</td>";
echo "<td>";
self::getLinearRightChoice(
self::getHelpdeskHardwareTypes(true),
['field' => 'helpdesk_hardware',
'value' => $this->fields['helpdesk_hardware']
]
);
echo "</td>";
echo "</tr>";
echo "<tr>";
echo "<td>" . __('Associable items to a ticket') . "</td>";
echo "<td><input type='hidden' name='_helpdesk_item_types' value='1'>";
self::dropdownHelpdeskItemtypes(['values' => $this->fields["helpdesk_item_type"]]);
echo "</td>";
echo "</tr>";
echo "<tr>";
echo "<td>" . __('Default ticket template') . "</td>";
echo "<td>";
// Only root entity ones and recursive
$options = ['value' => $this->fields["tickettemplates_id"],
'entity' => 0
];
if (Session::isMultiEntitiesMode()) {
$options['condition'] = ['is_recursive' => 1];
}
// Only add profile if on root entity
if (!isset($_SESSION['glpiactiveentities'][0])) {
$options['addicon'] = false;
}
TicketTemplate::dropdown($options);
echo "</td>";
echo "</tr>";
echo "<tr>";
echo "<td>" . __('Default change template') . "</td>";
echo "<td>";
// Only root entity ones and recursive
$options = ['value' => $this->fields["changetemplates_id"],
'entity' => 0
];
if (Session::isMultiEntitiesMode()) {
$options['condition'] = ['is_recursive' => 1];
}
// Only add profile if on root entity
if (!isset($_SESSION['glpiactiveentities'][0])) {
$options['addicon'] = false;
}
ChangeTemplate::dropdown($options);
echo "</td>";
echo "</tr>";
echo "<tr>";
echo "<td>" . __('Default problem template') . "</td>";
echo "<td>";
// Only root entity ones and recursive
$options = ['value' => $this->fields["problemtemplates_id"],
'entity' => 0
];
if (Session::isMultiEntitiesMode()) {
$options['condition'] = ['is_recursive' => 1];
}
// Only add profile if on root entity
if (!isset($_SESSION['glpiactiveentities'][0])) {
$options['addicon'] = false;
}
ProblemTemplate::dropdown($options);
echo "</td>";
echo "</tr>";
if ($canedit) {
echo "<tr'>";
echo "<td colspan='4' class='center'>";
echo "<input type='hidden' name='id' value='" . $this->fields['id'] . "'>";
echo Html::submit("<i class='fas fa-save'></i><span>" . _sx('button', 'Save') . "</span>", [
'class' => 'btn btn-primary mt-2',
'name' => 'update'
]);
echo "</td></tr>";
echo "</table>";
Html::closeForm();
} else {
echo "</table>";
}
echo "</div>";
echo "</div>";
}
/**
* Print the helpdesk right form for the current profile
*
* @since 0.85
**/
public function showFormToolsHelpdesk()
{
if (!self::canView()) {
return false;
}
echo "<div class='spaced'>";
if ($canedit = Session::haveRightsOr(self::$rightname, [CREATE, UPDATE, PURGE])) {
echo "<form method='post' action='" . $this->getFormURL() . "' data-track-changes='true'>";
}
$matrix_options = ['canedit' => $canedit,
'default_class' => 'tab_bg_2'
];
$rights = [['rights' => Profile::getRightsFor('KnowbaseItem', 'helpdesk'),
'label' => __('FAQ'),
'field' => 'knowbase'
],
['rights' => Profile::getRightsFor('ReservationItem', 'helpdesk'),
'label' => _n('Reservation', 'Reservations', Session::getPluralNumber()),
'field' => 'reservation'
],
['rights' => Profile::getRightsFor('Reminder', 'helpdesk'),
'label' => _n('Public reminder', 'Public reminders', Session::getPluralNumber()),
'field' => 'reminder_public'
],
['rights' => Profile::getRightsFor('RSSFeed', 'helpdesk'),
'label' => _n('Public RSS feed', 'Public RSS feeds', Session::getPluralNumber()),
'field' => 'rssfeed_public'
]
];
$matrix_options['title'] = __('Tools');
$this->displayRightsChoiceMatrix($rights, $matrix_options);
if ($canedit) {
echo "<div class='center'>";
echo "<input type='hidden' name='id' value='" . $this->fields['id'] . "'>";
echo Html::submit("<i class='fas fa-save'></i><span>" . _sx('button', 'Save') . "</span>", [
'class' => 'btn btn-primary mt-2',
'name' => 'update'
]);
echo "</div>";
Html::closeForm();
}
echo "</div>";
}
/**
* Print the Asset rights form for the current profile
*
* @since 0.85
*
* @param $openform boolean open the form (true by default)
* @param $closeform boolean close the form (true by default)
*
**/
public function showFormAsset($openform = true, $closeform = true)
{
if (!self::canView()) {
return false;
}
echo "<div class='spaced'>";
if (
($canedit = Session::haveRightsOr(self::$rightname, [UPDATE, CREATE, PURGE]))
&& $openform
) {
echo "<form method='post' action='" . $this->getFormURL() . "' data-track-changes='true'>";
}
$rights = [['itemtype' => 'Computer',
'label' => _n('Computer', 'Computers', Session::getPluralNumber()),
'field' => 'computer'
],
['itemtype' => 'Monitor',
'label' => _n('Monitor', 'Monitors', Session::getPluralNumber()),
'field' => 'monitor'
],
['itemtype' => 'Software',
'label' => _n('Software', 'Software', Session::getPluralNumber()),
'field' => 'software'
],
['itemtype' => 'NetworkEquipment',
'label' => _n('Network', 'Networks', Session::getPluralNumber()),
'field' => 'networking'
],
['itemtype' => 'Printer',
'label' => _n('Printer', 'Printers', Session::getPluralNumber()),
'field' => 'printer'
],
['itemtype' => 'Cartridge',
'label' => _n('Cartridge', 'Cartridges', Session::getPluralNumber()),
'field' => 'cartridge'
],
['itemtype' => 'Consumable',
'label' => _n('Consumable', 'Consumables', Session::getPluralNumber()),
'field' => 'consumable'
],
['itemtype' => 'Phone',
'label' => Phone::getTypeName(Session::getPluralNumber()),
'field' => 'phone'
],
['itemtype' => 'Peripheral',
'label' => Peripheral::getTypeName(Session::getPluralNumber()),
'field' => 'peripheral'
],
['itemtype' => 'NetworkName',
'label' => __('Internet'),
'field' => 'internet'
],
['itemtype' => 'DeviceSimcard',
'label' => __('Simcard PIN/PUK'),
'field' => 'devicesimcard_pinpuk',
'rights' => [READ => __('Read'),
UPDATE => __('Update')
]
]
];
$this->displayRightsChoiceMatrix($rights, ['canedit' => $canedit,
'default_class' => 'tab_bg_2',
'title' => _n('Asset', 'Assets', Session::getPluralNumber())
]);
if (
$canedit
&& $closeform
) {
echo "<div class='center'>";
echo "<input type='hidden' name='id' value='" . $this->fields['id'] . "'>";
echo Html::submit("<i class='fas fa-save'></i><span>" . _sx('button', 'Save') . "</span>", [
'class' => 'btn btn-primary mt-2',
'name' => 'update'
]);
echo "</div>\n";
Html::closeForm();
}
echo "</div>";
}
/**
* Print the Management rights form for the current profile
*
* @since 0.85 (before showFormInventory)
*
* @param $openform boolean open the form (true by default)
* @param $closeform boolean close the form (true by default)
**/
public function showFormManagement($openform = true, $closeform = true)
{
if (!self::canView()) {
return false;
}
echo "<div class='spaced'>";
if (
($canedit = Session::haveRightsOr(self::$rightname, [UPDATE, CREATE, PURGE]))
&& $openform
) {
echo "<form method='post' action='" . $this->getFormURL() . "' data-track-changes='true'>";
}
$matrix_options = ['canedit' => $canedit,
'default_class' => 'tab_bg_2'
];
$rights = [['itemtype' => 'SoftwareLicense',
'label' => SoftwareLicense::getTypeName(Session::getPluralNumber()),
'field' => 'license'
],
['itemtype' => 'Contact',
'label' => _n('Contact', 'Contacts', Session::getPluralNumber()) . " / " .
_n('Supplier', 'Suppliers', Session::getPluralNumber()),
'field' => 'contact_enterprise'
],
['itemtype' => 'Document',
'label' => Document::getTypeName(Session::getPluralNumber()),
'field' => 'document'
],
['itemtype' => 'Contract',
'label' => _n('Contract', 'Contracts', Session::getPluralNumber()),
'field' => 'contract'
],
['itemtype' => 'Infocom',
'label' => __('Financial and administratives information'),
'field' => 'infocom'
],
['itemtype' => 'Budget',
'label' => Budget::getTypeName(1),
'field' => 'budget'
],
['itemtype' => 'Line',
'label' => Line::getTypeName(1),
'field' => 'line'
],
['itemtype' => 'Certificate',
'label' => _n(
'Certificate',
'Certificates',
Session::getPluralNumber()
),
'field' => 'certificate'
],
['itemtype' => 'Datacenter',
'label' => Datacenter::getTypeName(Session::getPluralNumber()),
'field' => 'datacenter'
],
['itemtype' => 'Cluster',
'label' => Cluster::getTypeName(Session::getPluralNumber()),
'field' => 'cluster'
],
['itemtype' => 'Domain',
'label' => _n('Domain', 'Domains', Session::getPluralNumber()),
'field' => 'domain'
],
['itemtype' => 'Appliance',
'label' => Appliance::getTypeName(Session::getPluralNumber()),
'field' => 'appliance'
],
['itemtype' => 'DatabaseInstance',
'label' => Database::getTypeName(Session::getPluralNumber()),
'field' => 'database'
],
['itemtype' => 'Cable',
'label' => __('Cable management'),
'field' => 'cable_management'
],
];
$matrix_options['title'] = __('Management');
$this->displayRightsChoiceMatrix($rights, $matrix_options);
echo "<div class='tab_cadre_fixehov mx-n2'>";
echo "<input type='hidden' name='_managed_domainrecordtypes' value='1'>";
$rand = rand();
echo "<label for='dropdown_managed_domainrecordtypes$rand'>" . __('Manageable domain records') . "</label>";
$values = ['-1' => __('All')];
$values += $this->getDomainRecordTypes();
Dropdown::showFromArray(
'managed_domainrecordtypes',
$values,
[
'display' => true,
'multiple' => true,
'size' => 3,
'rand' => $rand,
'values' => $this->fields['managed_domainrecordtypes']
]
);
echo "</div>";
if (
$canedit
&& $closeform
) {
echo "<div class='center'>";
echo "<input type='hidden' name='id' value='" . $this->fields['id'] . "'>";
echo Html::submit("<i class='fas fa-save'></i><span>" . _sx('button', 'Save') . "</span>", [
'class' => 'btn btn-primary mt-2',
'name' => 'update'
]);
echo "</div>";
Html::closeForm();
}
echo "</div>";
}
/**
* Print the Tools rights form for the current profile
*
* @since 0.85
*
* @param $openform boolean open the form (true by default)
* @param $closeform boolean close the form (true by default)
**/
public function showFormTools($openform = true, $closeform = true)
{
if (!self::canView()) {
return false;
}
echo "<div class='spaced'>";
if (
($canedit = Session::haveRightsOr(self::$rightname, [UPDATE, CREATE, PURGE]))
&& $openform
) {
echo "<form method='post' action='" . $this->getFormURL() . "' data-track-changes='true'>";
}
$matrix_options = ['canedit' => $canedit,
'default_class' => 'tab_bg_2'
];
$rights = [['itemtype' => 'Reminder',
'label' => _n('Public reminder', 'Public reminders', Session::getPluralNumber()),
'field' => 'reminder_public'
],
['itemtype' => 'RSSFeed',
'label' => _n('Public RSS feed', 'Public RSS feeds', Session::getPluralNumber()),
'field' => 'rssfeed_public'
],
['itemtype' => 'SavedSearch',
'label' => _n('Public saved search', 'Public saved searches', Session::getPluralNumber()),
'field' => 'bookmark_public'
],
['itemtype' => 'Report',
'label' => _n('Report', 'Reports', Session::getPluralNumber()),
'field' => 'reports'
],
['itemtype' => 'KnowbaseItem',
'label' => __('Knowledge base'),
'field' => 'knowbase'
],
['itemtype' => 'ReservationItem',
'label' => __('Administration of reservations'),
'field' => 'reservation'
]
];
$matrix_options['title'] = __('Tools');
$this->displayRightsChoiceMatrix($rights, $matrix_options);
$rights = [['itemtype' => 'Project',
'label' => _n('Project', 'Projects', Session::getPluralNumber()),
'field' => 'project'
],
['itemtype' => 'ProjectTask',
'label' => _n('Task', 'Task', Session::getPluralNumber()),
'field' => 'projecttask'
]
];
$matrix_options['title'] = _n('Project', 'Projects', Session::getPluralNumber());
$this->displayRightsChoiceMatrix($rights, $matrix_options);
if (
$canedit
&& $closeform
) {
echo "<div class='center'>";
echo "<input type='hidden' name='id' value='" . $this->fields['id'] . "'>";
echo Html::submit("<i class='fas fa-save'></i><span>" . _sx('button', 'Save') . "</span>", [
'class' => 'btn btn-primary mt-2',
'name' => 'update'
]);
echo "</div>";
Html::closeForm();
}
echo "</div>";
}
/**
* Print the Tracking right form for the current profile
*
* @param $openform boolean open the form (true by default)
* @param $closeform boolean close the form (true by default)
**/
public function showFormTracking($openform = true, $closeform = true)
{
if (!self::canView()) {
return false;
}
echo "<div class='spaced'>";
if (
($canedit = Session::haveRightsOr(self::$rightname, [CREATE, UPDATE, PURGE]))
&& $openform
) {
echo "<form method='post' action='" . $this->getFormURL() . "' data-track-changes='true'>";
}
echo "<div class='mt-n2 mx-n2 mb-4'>";
echo "<table class='table table-hover card-table'>";
// Assistance / Tracking-helpdesk
echo "<thead>";
echo "<tr><th colspan='2'><h4>" . __('ITIL Templates') . "<h4></th></tr>";
echo "</thead>";
echo "<tbody>";
foreach (['Ticket', 'Change', 'Problem'] as $itiltype) {
$object = new $itiltype();
echo "<tr>";
echo "<td>" . sprintf(__('Default %1$s template'), $object->getTypeName()) . "</td><td>";
// Only root entity ones and recursive
$options = [
'value' => $this->fields[strtolower($itiltype) . "templates_id"],
'entity' => 0
];
if (Session::isMultiEntitiesMode()) {
$options['condition'] = ['is_recursive' => 1];
}
// Only add profile if on root entity
if (!isset($_SESSION['glpiactiveentities'][0])) {
$options['addicon'] = false;
}
$tpl_class = $itiltype . 'Template';
$tpl_class::dropdown($options);
echo "</td></tr>";
}
echo "</tbody>";
echo "</table>";
echo "</div>";
$matrix_options = ['canedit' => $canedit,
'default_class' => 'tab_bg_2'
];
$rights = [
[
'itemtype' => 'TicketTemplate',
'label' => _n('Template', 'Templates', Session::getPluralNumber()),
'field' => 'itiltemplate'
],
[
'itemtype' => 'PendingReason',
'label' => PendingReason::getTypeName(0),
'field' => 'pendingreason'
],
];
$matrix_options['title'] = _n('ITIL object', 'ITIL objects', Session::getPluralNumber());
$this->displayRightsChoiceMatrix($rights, $matrix_options);
$rights = [['itemtype' => 'Ticket',
'label' => _n('Ticket', 'Tickets', Session::getPluralNumber()),
'field' => 'ticket'
],
['itemtype' => 'TicketCost',
'label' => _n('Ticket cost', 'Ticket costs', Session::getPluralNumber()),
'field' => 'ticketcost'
],
['itemtype' => 'TicketRecurrent',
'label' => __('Recurrent tickets'),
'field' => 'ticketrecurrent'
]
];
$matrix_options['title'] = _n('Ticket', 'Tickets', Session::getPluralNumber());
$this->displayRightsChoiceMatrix($rights, $matrix_options);
$rights = [['itemtype' => 'ITILFollowup',
'label' => _n('Followup', 'Followups', Session::getPluralNumber()),
'field' => 'followup'
],
['itemtype' => 'TicketTask',
'label' => _n('Task', 'Tasks', Session::getPluralNumber()),
'field' => 'task'
]
];
$matrix_options['title'] = _n('Followup', 'Followups', Session::getPluralNumber()) . " / " . _n('Task', 'Tasks', Session::getPluralNumber());
$this->displayRightsChoiceMatrix($rights, $matrix_options);
$rights = [['itemtype' => 'TicketValidation',
'label' => _n('Validation', 'Validations', Session::getPluralNumber()),
'field' => 'ticketvalidation'
]
];
$matrix_options['title'] = _n('Validation', 'Validations', Session::getPluralNumber());
$this->displayRightsChoiceMatrix($rights, $matrix_options);
echo "<div class='mx-n2 my-4'>";
echo "<table class='table table-hover card-table'>";
echo "<thead>";
echo "<tr class='border-top'><th colspan='2'><h4>" . __('Association') . "<h4></th></tr>";
echo "</thead>";
echo "<tr>";
echo "<td>" . __('See hardware of my groups') . "</td>";
echo "<td>";
Html::showCheckbox(['name' => '_show_group_hardware',
'checked' => $this->fields['show_group_hardware']
]);
echo "</td></tr>";
echo "<tr>";
echo "<td>" . __('Link with items for the creation of tickets') . "</td>";
echo "<td>";
self::getLinearRightChoice(
self::getHelpdeskHardwareTypes(true),
['field' => 'helpdesk_hardware',
'value' => $this->fields['helpdesk_hardware']
]
);
echo "</td></tr>";
echo "<tr>";
echo "<td>" . __('Associable items to a ticket') . "</td>";
echo "<td><input type='hidden' name='_helpdesk_item_types' value='1'>";
self::dropdownHelpdeskItemtypes(['values' => $this->fields["helpdesk_item_type"]]);
echo "</td>";
echo "</tr>";
echo "</table>";
echo "</div>";
$rights = [
[
'itemtype' => 'Stat',
'label' => __('Statistics'),
'field' => 'statistic'
],[
'itemtype' => 'Planning',
'label' => __('Planning'),
'field' => 'planning'
]
];
$matrix_options['title'] = __('Visibility');
$this->displayRightsChoiceMatrix($rights, $matrix_options);
$rights = [
[
'itemtype' => 'PlanningExternalEvent',
'label' => PlanningExternalEvent::getTypeName(Session::getPluralNumber()),
'field' => 'externalevent'
]
];
$matrix_options['title'] = __('Planning');
$this->displayRightsChoiceMatrix($rights, $matrix_options);
$rights = [['itemtype' => 'Problem',
'label' => Problem::getTypeName(Session::getPluralNumber()),
'field' => 'problem'
]
];
$matrix_options['title'] = Problem::getTypeName(Session::getPluralNumber());
$this->displayRightsChoiceMatrix($rights, $matrix_options);
$rights = [
[
'itemtype' => 'Change',
'label' => _n('Change', 'Changes', Session::getPluralNumber()),
'field' => 'change'
],
[
'itemtype' => 'ChangeValidation',
'label' => _n('Validation', 'Validations', Session::getPluralNumber()),
'field' => 'changevalidation'
],
[
'itemtype' => RecurrentChange::class,
'label' => RecurrentChange::getTypeName(2),
'field' => RecurrentChange::$rightname
]
];
$matrix_options['title'] = _n('Change', 'Changes', Session::getPluralNumber());
$this->displayRightsChoiceMatrix($rights, $matrix_options);
if (
$canedit
&& $closeform
) {
echo "<div class='center'>";
echo "<input type='hidden' name='id' value='" . $this->fields['id'] . "'>";
echo Html::submit("<i class='fas fa-save'></i><span>" . _sx('button', 'Save') . "</span>", [
'class' => 'btn btn-primary mt-2',
'name' => 'update'
]);
echo "</div>\n";
Html::closeForm();
}
echo "</div>";
}
/**
* Display the matrix of the elements lifecycle of the elements
*
* @since 0.85
*
* @param $title the kind of lifecycle
* @param $html_field field that is sent to _POST
* @param $db_field field inside the DB (to get current state)
* @param $statuses all available statuses for the given cycle (obj::getAllStatusArray())
* @param $canedit can we edit the elements ?
*
* @return void
**/
public function displayLifeCycleMatrix($title, $html_field, $db_field, $statuses, $canedit)
{
$columns = [];
$rows = [];
foreach ($statuses as $index_1 => $status_1) {
$columns[$index_1] = $status_1;
$row = ['label' => $status_1,
'columns' => []
];
foreach ($statuses as $index_2 => $status_2) {
$content = ['checked' => true];
if (isset($this->fields[$db_field][$index_1][$index_2])) {
$content['checked'] = $this->fields[$db_field][$index_1][$index_2];
}
if (($index_1 == $index_2) || (!$canedit)) {
$content['readonly'] = true;
}
$row['columns'][$index_2] = $content;
}
$rows[$html_field . "[$index_1]"] = $row;
}
Html::showCheckboxMatrix(
$columns,
$rows,
['title' => $title,
'row_check_all' => true,
'col_check_all' => true,
'first_cell' => '<b>' . __("From \ To") . '</b>'
]
);
}
/**
* Print the Life Cycles form for the current profile
*
* @param $openform boolean open the form (true by default)
* @param $closeform boolean close the form (true by default)
**/
public function showFormLifeCycle($openform = true, $closeform = true)
{
if (!self::canView()) {
return false;
}
echo "<div class='spaced'>";
if (
($canedit = Session::haveRightsOr(self::$rightname, [CREATE, UPDATE, PURGE]))
&& $openform
) {
echo "<form method='post' action='" . $this->getFormURL() . "' data-track-changes='true'>";
}
$this->displayLifeCycleMatrix(
__('Life cycle of tickets'),
'_cycle_ticket',
'ticket_status',
Ticket::getAllStatusArray(),
$canedit
);
$this->displayLifeCycleMatrix(
__('Life cycle of problems'),
'_cycle_problem',
'problem_status',
Problem::getAllStatusArray(),
$canedit
);
$this->displayLifeCycleMatrix(
__('Life cycle of changes'),
'_cycle_change',
'change_status',
Change::getAllStatusArray(),
$canedit
);
if (
$canedit
&& $closeform
) {
echo "<div class='center'>";
echo "<input type='hidden' name='id' value='" . $this->fields['id'] . "'>";
echo Html::submit("<i class='fas fa-save'></i><span>" . _sx('button', 'Save') . "</span>", [
'class' => 'btn btn-primary mt-2',
'name' => 'update'
]);
echo "</div>";
Html::closeForm();
}
echo "</div>";
}
/**
* Display the matrix of the elements lifecycle of the elements
*
* @since 0.85
*
* @param $title the kind of lifecycle
* @param $html_field field that is sent to _POST
* @param $db_field field inside the DB (to get current state)
* @param $canedit can we edit the elements ?
*
* @return void
**/
public function displayLifeCycleMatrixTicketHelpdesk($title, $html_field, $db_field, $canedit)
{
$columns = [];
$rows = [];
$statuses = [];
$allstatuses = Ticket::getAllStatusArray();
foreach ([Ticket::INCOMING, Ticket::SOLVED, Ticket::CLOSED] as $val) {
$statuses[$val] = $allstatuses[$val];
}
$alwaysok = [Ticket::INCOMING => [],
Ticket::SOLVED => [Ticket::INCOMING],
Ticket::CLOSED => []
];
$allowactions = [Ticket::INCOMING => [],
Ticket::SOLVED => [Ticket::CLOSED],
Ticket::CLOSED => [Ticket::INCOMING]
];
foreach ($statuses as $index_1 => $status_1) {
$columns[$index_1] = $status_1;
$row = ['label' => $status_1,
'columns' => []
];
foreach ($statuses as $index_2 => $status_2) {
$content = ['checked' => true];
if (isset($this->fields[$db_field][$index_1][$index_2])) {
$content['checked'] = $this->fields[$db_field][$index_1][$index_2];
}
if (in_array($index_2, $alwaysok[$index_1])) {
$content['checked'] = true;
}
if (
($index_1 == $index_2)
|| (!$canedit)
|| !in_array($index_2, $allowactions[$index_1])
) {
$content['readonly'] = true;
}
$row['columns'][$index_2] = $content;
}
$rows[$html_field . "[$index_1]"] = $row;
}
Html::showCheckboxMatrix(
$columns,
$rows,
['title' => $title,
'first_cell' => '<b>' . __("From \ To") . '</b>'
]
);
}
/**
* Print the Life Cycles form for the current profile
*
* @since 0.85
*
* @param $openform boolean open the form (true by default)
* @param $closeform boolean close the form (true by default)
**/
public function showFormLifeCycleHelpdesk($openform = true, $closeform = true)
{
if (!self::canView()) {
return false;
}
echo "<div class='spaced'>";
if (
($canedit = Session::haveRightsOr(self::$rightname, [CREATE, UPDATE, PURGE]))
&& $openform
) {
echo "<form method='post' action='" . $this->getFormURL() . "' data-track-changes='true'>";
}
$this->displayLifeCycleMatrixTicketHelpdesk(
__('Life cycle of tickets'),
'_cycle_ticket',
'ticket_status',
$canedit
);
if (
$canedit
&& $closeform
) {
echo "<div class='center'>";
echo "<input type='hidden' name='id' value='" . $this->fields['id'] . "'>";
echo Html::submit("<i class='fas fa-save'></i><span>" . _sx('button', 'Save') . "</span>", [
'class' => 'btn btn-primary mt-2',
'name' => 'update'
]);
echo "</div>";
Html::closeForm();
}
echo "</div>";
}
/**
* Print the central form for a profile
*
* @param $openform boolean open the form (true by default)
* @param $closeform boolean close the form (true by default)
**/
public function showFormAdmin($openform = true, $closeform = true)
{
if (!self::canView()) {
return false;
}
echo "<div class='spaced'>";
if (
($canedit = Session::haveRightsOr(self::$rightname, [CREATE, UPDATE, PURGE]))
&& $openform
) {
echo "<form method='post' action='" . $this->getFormURL() . "' data-track-changes='true'>";
}
$matrix_options = ['canedit' => $canedit,
'default_class' => 'tab_bg_4'
];
$rights = [
[
'itemtype' => 'User',
'label' => User::getTypeName(Session::getPluralNumber()),
'field' => 'user',
'row_class' => 'tab_bg_2'
], [
'itemtype' => 'Entity',
'label' => Entity::getTypeName(Session::getPluralNumber()),
'field' => 'entity'
], [
'itemtype' => 'Group',
'label' => Group::getTypeName(Session::getPluralNumber()),
'field' => 'group'
], [
'itemtype' => 'Profile',
'label' => Profile::getTypeName(Session::getPluralNumber()),
'field' => 'profile'
], [
'itemtype' => 'QueuedNotification',
'label' => __('Notification queue'),
'field' => 'queuednotification'
], [
'itemtype' => 'Glpi\Inventory\Conf',
'label' => __('Inventory'),
'field' => 'inventory'
], [
'itemtype' => 'Log',
'label' => Log::getTypeName(Session::getPluralNumber()),
'field' => 'logs'
]
];
$matrix_options['title'] = __('Administration');
$this->displayRightsChoiceMatrix($rights, $matrix_options);
$rights = [['itemtype' => 'Rule',
'label' => __('Authorizations assignment rules'),
'field' => 'rule_ldap'
],
['itemtype' => 'RuleImportAsset',
'label' => __('Rules for assigning a computer to an entity'),
'field' => 'rule_import'
],
['itemtype' => 'RuleLocation',
'label' => __('Rules for assigning a computer to a location'),
'field' => 'rule_location'
],
['itemtype' => 'RuleMailCollector',
'label' => __('Rules for assigning a ticket created through a mails receiver'),
'field' => 'rule_mailcollector'
],
['itemtype' => 'RuleSoftwareCategory',
'label' => __('Rules for assigning a category to a software'),
'field' => 'rule_softwarecategories'
],
['itemtype' => 'RuleTicket',
'label' => __('Business rules for tickets (entity)'),
'field' => 'rule_ticket',
'row_class' => 'tab_bg_2'
],
['itemtype' => 'RuleAsset',
'label' => __('Business rules for assets'),
'field' => 'rule_asset',
'row_class' => 'tab_bg_2'
],
['itemtype' => 'Transfer',
'label' => __('Transfer'),
'field' => 'transfer'
]
];
$matrix_options['title'] = _n('Rule', 'Rules', Session::getPluralNumber());
$this->displayRightsChoiceMatrix($rights, $matrix_options);
$rights = [['itemtype' => 'RuleDictionnaryDropdown',
'label' => __('Dropdowns dictionary'),
'field' => 'rule_dictionnary_dropdown'
],
['itemtype' => 'RuleDictionnarySoftware',
'label' => __('Software dictionary'),
'field' => 'rule_dictionnary_software'
],
['itemtype' => 'RuleDictionnaryPrinter',
'label' => __('Printers dictionnary'),
'field' => 'rule_dictionnary_printer'
]
];
$matrix_options['title'] = __('Dropdowns dictionary');
$this->displayRightsChoiceMatrix($rights, $matrix_options);
if (
$canedit
&& $closeform
) {
echo "<div class='center'>";
echo "<input type='hidden' name='id' value='" . $this->fields['id'] . "'>";
echo Html::submit("<i class='fas fa-save'></i><span>" . _sx('button', 'Save') . "</span>", [
'class' => 'btn btn-primary mt-2',
'name' => 'update'
]);
echo "</div>";
Html::closeForm();
}
echo "</div>";
$this->showLegend();
}
/**
* Print the central form for a profile
*
* @param $openform boolean open the form (true by default)
* @param $closeform boolean close the form (true by default)
**/
public function showFormSetup($openform = true, $closeform = true)
{
if (!self::canView()) {
return false;
}
echo "<div class='spaced'>";
if (
($canedit = Session::haveRightsOr(self::$rightname, [CREATE, UPDATE, PURGE]))
&& $openform
) {
echo "<form method='post' action='" . $this->getFormURL() . "' data-track-changes='true'>";
}
$dropdown_rights = $this->getRights();
unset($dropdown_rights[DELETE]);
unset($dropdown_rights[UNLOCK]);
$rights = [
[
'itemtype' => 'Config',
'label' => __('General setup'),
'field' => 'config'
],
[
'rights' => [
READ => __('Read'),
UPDATE => __('Update')
],
'label' => __('Personalization'),
'field' => 'personalization'
],
[
'itemtype' => 'Glpi\Dashboard\Grid',
'label' => __('All dashboards'),
'field' => 'dashboard'
],
[
'itemtype' => 'DisplayPreference',
'label' => __('Search result display'),
'field' => 'search_config'
],
[
'itemtype' => 'Item_Devices',
'label' => _n('Component', 'Components', Session::getPluralNumber()),
'field' => 'device'
],
[
'rights' => $dropdown_rights,
'label' => _n('Global dropdown', 'Global dropdowns', Session::getPluralNumber()),
'field' => 'dropdown'
],
__('Entity dropdowns'),
[
'itemtype' => 'Location',
'label' => Location::getTypeName(Session::getPluralNumber()),
'field' => 'location'
],
[
'itemtype' => 'ITILCategory',
'label' => _n('Ticket category', 'Ticket categories', Session::getPluralNumber()),
'field' => 'itilcategory'
],
[
'itemtype' => 'KnowbaseItemCategory',
'label' => _n('Knowledge base category', 'Knowledge base categories', Session::getPluralNumber()),
'field' => 'knowbasecategory'
],
[
'itemtype' => 'TaskCategory',
'label' => _n('Task category', 'Task categories', Session::getPluralNumber()),
'field' => 'taskcategory'
],
[
'itemtype' => 'State',
'label' => _n('Status of items', 'Statuses of items', Session::getPluralNumber()),
'field' => 'state'
],
[
'itemtype' => 'ITILFollowupTemplate',
'label' => _n('Followup template', 'Followup templates', Session::getPluralNumber()),
'field' => 'itilfollowuptemplate'
],
[
'itemtype' => 'SolutionTemplate',
'label' => _n('Solution template', 'Solution templates', Session::getPluralNumber()),
'field' => 'solutiontemplate'
],
[
'itemtype' => 'Calendar',
'label' => _n('Calendar', 'Calendars', Session::getPluralNumber()),
'field' => 'calendar'
],
[
'itemtype' => 'DocumentType',
'label' => DocumentType::getTypeName(1),
'field' => 'typedoc'
],
[
'itemtype' => 'Link',
'label' => _n('External link', 'External links', Session::getPluralNumber()),
'field' => 'link'
],
[
'itemtype' => 'Notification',
'label' => _n('Notification', 'Notifications', Session::getPluralNumber()),
'field' => 'notification'
],
[
'itemtype' => 'SLM',
'label' => __('SLM'),
'field' => 'slm'
],
[
'itemtype' => 'LineOperator',
'label' => _n('Line operator', 'Line operators', Session::getPluralNumber()),
'field' => 'lineoperator'
]
];
$this->displayRightsChoiceMatrix($rights, ['canedit' => $canedit,
'default_class' => 'tab_bg_2',
'title' => __('Setup')
]);
if (
$canedit
&& $closeform
) {
echo "<div class='center'>";
echo "<input type='hidden' name='id' value='" . $this->fields['id'] . "'>";
echo Html::submit("<i class='fas fa-save'></i><span>" . _sx('button', 'Save') . "</span>", [
'class' => 'btn btn-primary mt-2',
'name' => 'update'
]);
echo "</div>";
Html::closeForm();
}
echo "</div>";
$this->showLegend();
}
/**
* Print the Setup rights form for a helpdesk profile
*
* @since 9.4.0
*
* @param boolean $openform open the form (true by default)
* @param boolean $closeform close the form (true by default)
*
* @return void
*
**/
public function showFormSetupHelpdesk($openform = true, $closeform = true)
{
if (!self::canView()) {
return false;
}
echo "<div class='spaced'>";
if (
($canedit = Session::haveRightsOr(self::$rightname, [CREATE, UPDATE, PURGE]))
&& $openform
) {
echo "<form method='post' action='" . $this->getFormURL() . "' data-track-changes='true'>";
}
$rights = [['rights' => [
READ => __('Read'),
UPDATE => __('Update')
],
'label' => __('Personalization'),
'field' => 'personalization'
]
];
$this->displayRightsChoiceMatrix($rights, ['canedit' => $canedit,
'default_class' => 'tab_bg_2',
'title' => __('Setup')
]);
if (
$canedit
&& $closeform
) {
echo "<div class='center'>";
echo "<input type='hidden' name='id' value='" . $this->fields['id'] . "'>";
echo Html::submit("<i class='fas fa-save'></i><span>" . _sx('button', 'Save') . "</span>", [
'class' => 'btn btn-primary mt-2',
'name' => 'update'
]);
echo "</div>";
Html::closeForm();
}
echo "</div>";
$this->showLegend();
}
public function rawSearchOptions()
{
$tab = [];
$tab[] = [
'id' => 'common',
'name' => __('Characteristics')
];
$tab[] = [
'id' => '1',
'table' => $this->getTable(),
'field' => 'name',
'name' => __('Name'),
'datatype' => 'itemlink',
'massiveaction' => false
];
$tab[] = [
'id' => '2',
'table' => $this->getTable(),
'field' => 'id',
'name' => __('ID'),
'massiveaction' => false,
'datatype' => 'number'
];
$tab[] = [
'id' => '19',
'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
];
$tab[] = [
'id' => '5',
'table' => $this->getTable(),
'field' => 'interface',
'name' => __("Profile's interface"),
'massiveaction' => false,
'datatype' => 'specific',
'searchtype' => ['equals', 'notequals']
];
$tab[] = [
'id' => '3',
'table' => $this->getTable(),
'field' => 'is_default',
'name' => __('Default profile'),
'datatype' => 'bool',
'massiveaction' => false
];
$tab[] = [
'id' => '118',
'table' => $this->getTable(),
'field' => 'create_ticket_on_login',
'name' => __('Ticket creation form on login'),
'datatype' => 'bool'
];
$tab[] = [
'id' => '16',
'table' => $this->getTable(),
'field' => 'comment',
'name' => __('Comments'),
'datatype' => 'text'
];
// add objectlock search options
$tab = array_merge($tab, ObjectLock::rawSearchOptionsToAdd(get_class($this)));
$tab[] = [
'id' => 'inventory',
'name' => _n('Asset', 'Assets', Session::getPluralNumber())
];
$tab[] = [
'id' => '20',
'table' => 'glpi_profilerights',
'field' => 'rights',
'name' => _n('Computer', 'Computers', Session::getPluralNumber()),
'datatype' => 'right',
'rightclass' => 'Computer',
'rightname' => 'computer',
'joinparams' => [
'jointype' => 'child',
'condition' => ['NEWTABLE.name' => 'computer']
]
];
$tab[] = [
'id' => '21',
'table' => 'glpi_profilerights',
'field' => 'rights',
'name' => _n('Monitor', 'Monitors', Session::getPluralNumber()),
'datatype' => 'right',
'rightclass' => 'Monitor',
'rightname' => 'monitor',
'joinparams' => [
'jointype' => 'child',
'condition' => ['NEWTABLE.name' => 'monitor']
]
];
$tab[] = [
'id' => '22',
'table' => 'glpi_profilerights',
'field' => 'rights',
'name' => _n('Software', 'Software', Session::getPluralNumber()),
'datatype' => 'right',
'rightclass' => 'Software',
'rightname' => 'software',
'joinparams' => [
'jointype' => 'child',
'condition' => ['NEWTABLE.name' => 'software']
]
];
$tab[] = [
'id' => '23',
'table' => 'glpi_profilerights',
'field' => 'rights',
'name' => _n('Network', 'Networks', Session::getPluralNumber()),
'datatype' => 'right',
'rightclass' => 'Network',
'rightname' => 'networking',
'joinparams' => [
'jointype' => 'child',
'condition' => ['NEWTABLE.name' => 'networking']
]
];
$tab[] = [
'id' => '24',
'table' => 'glpi_profilerights',
'field' => 'rights',
'name' => _n('Printer', 'Printers', Session::getPluralNumber()),
'datatype' => 'right',
'rightclass' => 'Printer',
'rightname' => 'printer',
'joinparams' => [
'jointype' => 'child',
'condition' => ['NEWTABLE.name' => 'printer']
]
];
$tab[] = [
'id' => '25',
'table' => 'glpi_profilerights',
'field' => 'rights',
'name' => Peripheral::getTypeName(Session::getPluralNumber()),
'datatype' => 'right',
'rightclass' => 'Peripheral',
'rightname' => 'peripheral',
'joinparams' => [
'jointype' => 'child',
'condition' => ['NEWTABLE.name' => 'peripheral']
]
];
$tab[] = [
'id' => '26',
'table' => 'glpi_profilerights',
'field' => 'rights',
'name' => _n('Cartridge', 'Cartridges', Session::getPluralNumber()),
'datatype' => 'right',
'rightclass' => 'Cartridge',
'rightname' => 'cartridge',
'joinparams' => [
'jointype' => 'child',
'condition' => ['NEWTABLE.name' => 'cartridge']
]
];
$tab[] = [
'id' => '27',
'table' => 'glpi_profilerights',
'field' => 'rights',
'name' => _n('Consumable', 'Consumables', Session::getPluralNumber()),
'datatype' => 'right',
'rightclass' => 'Consumable',
'rightname' => 'consumable',
'joinparams' => [
'jointype' => 'child',
'condition' => ['NEWTABLE.name' => 'consumable']
]
];
$tab[] = [
'id' => '28',
'table' => 'glpi_profilerights',
'field' => 'rights',
'name' => Phone::getTypeName(Session::getPluralNumber()),
'datatype' => 'right',
'rightclass' => 'Phone',
'rightname' => 'phone',
'joinparams' => [
'jointype' => 'child',
'condition' => ['NEWTABLE.name' => 'phone']
]
];
$tab[] = [
'id' => '129',
'table' => 'glpi_profilerights',
'field' => 'rights',
'name' => __('Internet'),
'datatype' => 'right',
'rightclass' => 'NetworkName',
'rightname' => 'internet',
'joinparams' => [
'jointype' => 'child',
'condition' => ['NEWTABLE.name' => 'internet']
]
];
$tab[] = [
'id' => 'management',
'name' => __('Management')
];
$tab[] = [
'id' => '30',
'table' => 'glpi_profilerights',
'field' => 'rights',
'name' => Contact::getTypeName(1) . " / " . Supplier::getTypeName(1),
'datatype' => 'right',
'rightclass' => 'Contact',
'rightname' => 'contact_entreprise',
'joinparams' => [
'jointype' => 'child',
'condition' => ['NEWTABLE.name' => 'contact_enterprise']
]
];
$tab[] = [
'id' => '31',
'table' => 'glpi_profilerights',
'field' => 'rights',
'name' => Document::getTypeName(Session::getPluralNumber()),
'datatype' => 'right',
'rightclass' => 'Document',
'rightname' => 'document',
'joinparams' => [
'jointype' => 'child',
'condition' => ['NEWTABLE.name' => 'document']
]
];
$tab[] = [
'id' => '32',
'table' => 'glpi_profilerights',
'field' => 'rights',
'name' => _n('Contract', 'Contracts', Session::getPluralNumber()),
'datatype' => 'right',
'rightclass' => 'Contract',
'rightname' => 'contract',
'joinparams' => [
'jointype' => 'child',
'condition' => ['NEWTABLE.name' => 'contract']
]
];
$tab[] = [
'id' => '33',
'table' => 'glpi_profilerights',
'field' => 'rights',
'name' => __('Financial and administratives information'),
'datatype' => 'right',
'rightclass' => 'Infocom',
'rightname' => 'infocom',
'joinparams' => [
'jointype' => 'child',
'condition' => ['NEWTABLE.name' => 'infocom']
]
];
$tab[] = [
'id' => '101',
'table' => 'glpi_profilerights',
'field' => 'rights',
'name' => Budget::getTypeName(1),
'datatype' => 'right',
'rightclass' => 'Budget',
'rightname' => 'budget',
'joinparams' => [
'jointype' => 'child',
'condition' => ['NEWTABLE.name' => 'budget']
]
];
$tab[] = [
'id' => 'tools',
'name' => __('Tools')
];
$tab[] = [
'id' => '34',
'table' => 'glpi_profilerights',
'field' => 'rights',
'name' => __('Knowledge base'),
'datatype' => 'right',
'rightclass' => 'KnowbaseItem',
'rightname' => 'knowbase',
'joinparams' => [
'jointype' => 'child',
'condition' => ['NEWTABLE.name' => 'knowbase']
]
];
$tab[] = [
'id' => '36',
'table' => 'glpi_profilerights',
'field' => 'rights',
'name' => _n('Reservation', 'Reservations', Session::getPluralNumber()),
'datatype' => 'right',
'rightclass' => 'ReservationItem',
'rightname' => 'reservation',
'joinparams' => [
'jointype' => 'child',
'condition' => ['NEWTABLE.name' => 'reservation']
]
];
$tab[] = [
'id' => '38',
'table' => 'glpi_profilerights',
'field' => 'rights',
'name' => _n('Report', 'Reports', Session::getPluralNumber()),
'datatype' => 'right',
'rightclass' => 'Report',
'rightname' => 'reports',
'nowrite' => true,
'joinparams' => [
'jointype' => 'child',
'condition' => ['NEWTABLE.name' => 'reports']
]
];
$tab[] = [
'id' => 'config',
'name' => __('Setup')
];
$tab[] = [
'id' => '42',
'table' => 'glpi_profilerights',
'field' => 'rights',
'name' => _n('Dropdown', 'Dropdowns', Session::getPluralNumber()),
'datatype' => 'right',
'rightclass' => 'DropdownTranslation',
'rightname' => 'dropdown',
'joinparams' => [
'jointype' => 'child',
'condition' => ['NEWTABLE.name' => 'dropdown']
]
];
$tab[] = [
'id' => '44',
'table' => 'glpi_profilerights',
'field' => 'rights',
'name' => _n('Component', 'Components', Session::getPluralNumber()),
'datatype' => 'right',
'rightclass' => 'Item_Devices',
'rightname' => 'device',
'noread' => true,
'joinparams' => [
'jointype' => 'child',
'condition' => ['NEWTABLE.name' => 'device']
]
];
$tab[] = [
'id' => '106',
'table' => 'glpi_profilerights',
'field' => 'rights',
'name' => _n('Notification', 'Notifications', Session::getPluralNumber()),
'datatype' => 'right',
'rightclass' => 'Notification',
'rightname' => 'notification',
'joinparams' => [
'jointype' => 'child',
'condition' => ['NEWTABLE.name' => 'notification']
]
];
$tab[] = [
'id' => '45',
'table' => 'glpi_profilerights',
'field' => 'rights',
'name' => DocumentType::getTypeName(1),
'datatype' => 'right',
'rightclass' => 'DocumentType',
'rightname' => 'typedoc',
'joinparams' => [
'jointype' => 'child',
'condition' => ['NEWTABLE.name' => 'typedoc']
]
];
$tab[] = [
'id' => '46',
'table' => 'glpi_profilerights',
'field' => 'rights',
'name' => _n('External link', 'External links', Session::getPluralNumber()),
'datatype' => 'right',
'rightclass' => 'Link',
'rightname' => 'link',
'joinparams' => [
'jointype' => 'child',
'condition' => ['NEWTABLE.name' => 'link']
]
];
$tab[] = [
'id' => '47',
'table' => 'glpi_profilerights',
'field' => 'rights',
'name' => __('General setup'),
'datatype' => 'right',
'rightclass' => 'Config',
'rightname' => 'config',
'noread' => true,
'joinparams' => [
'jointype' => 'child',
'condition' => ['NEWTABLE.name' => 'config']
]
];
$tab[] = [
'id' => '109',
'table' => 'glpi_profilerights',
'field' => 'rights',
'name' => __('Personalization'),
'datatype' => 'right',
'rightclass' => 'Config',
'rightname' => 'personalization',
'noread' => true,
'joinparams' => [
'jointype' => 'child',
'condition' => ['NEWTABLE.name' => 'personalization']
]
];
$tab[] = [
'id' => '52',
'table' => 'glpi_profilerights',
'field' => 'rights',
'name' => __('Search result user display'),
'datatype' => 'right',
'rightclass' => 'DisplayPreference',
'rightname' => 'search_config',
'noread' => true,
'joinparams' => [
'jointype' => 'child',
'condition' => ['NEWTABLE.name' => 'search_config']
]
];
$tab[] = [
'id' => '107',
'table' => 'glpi_profilerights',
'field' => 'rights',
'name' => _n('Calendar', 'Calendars', Session::getPluralNumber()),
'datatype' => 'right',
'rightclass' => 'Calendar',
'rightname' => 'calendar',
'joinparams' => [
'jointype' => 'child',
'condition' => ['NEWTABLE.name' => 'calendar']
]
];
$tab[] = [
'id' => 'admin',
'name' => __('Administration')
];
$tab[] = [
'id' => '48',
'table' => 'glpi_profilerights',
'field' => 'rights',
'name' => __('Business rules for tickets'),
'datatype' => 'right',
'rightclass' => 'RuleTicket',
'rightname' => 'rule_ticket',
'nowrite' => true,
'joinparams' => [
'jointype' => 'child',
'condition' => ['NEWTABLE.name' => 'rule_ticket']
]
];
$tab[] = [
'id' => '105',
'table' => 'glpi_profilerights',
'field' => 'rights',
'name' => __('Rules for assigning a ticket created through a mails receiver'),
'datatype' => 'right',
'rightclass' => 'RuleMailCollector',
'rightname' => 'rule_mailcollector',
'joinparams' => [
'jointype' => 'child',
'condition' => ['NEWTABLE.name' => 'rule_mailcollector']
]
];
$tab[] = [
'id' => '49',
'table' => 'glpi_profilerights',
'field' => 'rights',
'name' => __('Rules for assigning a computer to an entity'),
'datatype' => 'right',
'rightclass' => 'RuleImportAsset',
'rightname' => 'rule_import',
'joinparams' => [
'jointype' => 'child',
'condition' => ['NEWTABLE.name' => 'rule_import']
]
];
$tab[] = [
'id' => '50',
'table' => 'glpi_profilerights',
'field' => 'rights',
'name' => __('Authorizations assignment rules'),
'datatype' => 'right',
'rightclass' => 'Rule',
'rightname' => 'rule_ldap',
'joinparams' => [
'jointype' => 'child',
'condition' => ['NEWTABLE.name' => 'rule_ldap']
]
];
$tab[] = [
'id' => '51',
'table' => 'glpi_profilerights',
'field' => 'rights',
'name' => __('Rules for assigning a category to a software'),
'datatype' => 'right',
'rightclass' => 'RuleSoftwareCategory',
'rightname' => 'rule_softwarecategories',
'joinparams' => [
'jointype' => 'child',
'condition' => ['NEWTABLE.name' => 'rule_softwarecategories']
]
];
$tab[] = [
'id' => '90',
'table' => 'glpi_profilerights',
'field' => 'rights',
'name' => __('Software dictionary'),
'datatype' => 'right',
'rightclass' => 'RuleDictionnarySoftware',
'rightname' => 'rule_dictionnary_software',
'joinparams' => [
'jointype' => 'child',
'condition' => ['NEWTABLE.name' => 'rule_dictionnary_software']
]
];
$tab[] = [
'id' => '91',
'table' => 'glpi_profilerights',
'field' => 'rights',
'name' => __('Dropdowns dictionary'),
'datatype' => 'right',
'rightclass' => 'RuleDictionnaryDropdown',
'rightname' => 'rule_dictionnary_dropdown',
'joinparams' => [
'jointype' => 'child',
'condition' => ['NEWTABLE.name' => 'rule_dictionnary_dropdown']
]
];
$tab[] = [
'id' => '55',
'table' => 'glpi_profilerights',
'field' => 'rights',
'name' => self::getTypeName(Session::getPluralNumber()),
'datatype' => 'right',
'rightclass' => 'Profile',
'rightname' => 'profile',
'joinparams' => [
'jointype' => 'child',
'condition' => ['NEWTABLE.name' => 'profile']
]
];
$tab[] = [
'id' => '56',
'table' => 'glpi_profilerights',
'field' => 'rights',
'name' => User::getTypeName(Session::getPluralNumber()),
'datatype' => 'right',
'rightclass' => 'User',
'rightname' => 'user',
'joinparams' => [
'jointype' => 'child',
'condition' => ['NEWTABLE.name' => 'user']
]
];
$tab[] = [
'id' => '58',
'table' => 'glpi_profilerights',
'field' => 'rights',
'name' => Group::getTypeName(Session::getPluralNumber()),
'datatype' => 'right',
'rightclass' => 'Group',
'rightname' => 'group',
'joinparams' => [
'jointype' => 'child',
'condition' => ['NEWTABLE.name' => 'group']
]
];
$tab[] = [
'id' => '59',
'table' => 'glpi_profilerights',
'field' => 'rights',
'name' => Entity::getTypeName(Session::getPluralNumber()),
'datatype' => 'right',
'rightclass' => 'Entity',
'rightname' => 'entity',
'joinparams' => [
'jointype' => 'child',
'condition' => ['NEWTABLE.name' => 'entity']
]
];
$tab[] = [
'id' => '60',
'table' => 'glpi_profilerights',
'field' => 'rights',
'name' => __('Transfer'),
'datatype' => 'right',
'rightclass' => 'Transfer',
'rightname' => 'transfer',
'joinparams' => [
'jointype' => 'child',
'condition' => ['NEWTABLE.name' => 'transfer']
]
];
$tab[] = [
'id' => '61',
'table' => 'glpi_profilerights',
'field' => 'rights',
'name' => _n('Log', 'Logs', Session::getPluralNumber()),
'datatype' => 'right',
'rightclass' => 'Log',
'rightname' => 'logs',
'nowrite' => true,
'joinparams' => [
'jointype' => 'child',
'condition' => ['NEWTABLE.name' => 'logs']
]
];
$tab[] = [
'id' => 'ticket',
'name' => __('Assistance')
];
$tab[] = [
'id' => '102',
'table' => 'glpi_profilerights',
'field' => 'rights',
'name' => __('Create a ticket'),
'datatype' => 'right',
'rightclass' => 'Ticket',
'rightname' => 'ticket',
'joinparams' => [
'jointype' => 'child',
'condition' => ['NEWTABLE.name' => 'ticket']
]
];
$newtab = [
'id' => '108',
'table' => 'glpi_tickettemplates',
'field' => 'name',
'name' => __('Default ticket template'),
'datatype' => 'dropdown',
];
if (Session::isMultiEntitiesMode()) {
$newtab['condition'] = ['entities_id' => 0, 'is_recursive' => 1];
} else {
$newtab['condition'] = ['entities_id' => 0];
}
$tab[] = $newtab;
$tab[] = [
'id' => '103',
'table' => 'glpi_profilerights',
'field' => 'rights',
'name' => _n('Ticket template', 'Ticket templates', Session::getPluralNumber()),
'datatype' => 'right',
'rightclass' => 'TicketTemplate',
'rightname' => 'tickettemplate',
'joinparams' => [
'jointype' => 'child',
'condition' => ['NEWTABLE.name' => 'tickettemplate']
]
];
$tab[] = [
'id' => '79',
'table' => 'glpi_profilerights',
'field' => 'rights',
'name' => __('Planning'),
'datatype' => 'right',
'rightclass' => 'Planning',
'rightname' => 'planning',
'joinparams' => [
'jointype' => 'child',
'condition' => ['NEWTABLE.name' => 'planning']
]
];
$tab[] = [
'id' => '85',
'table' => 'glpi_profilerights',
'field' => 'rights',
'name' => __('Statistics'),
'datatype' => 'right',
'rightclass' => 'Stat',
'rightname' => 'statistic',
'joinparams' => [
'jointype' => 'child',
'condition' => ['NEWTABLE.name' => 'statistic']
]
];
$tab[] = [
'id' => '119',
'table' => 'glpi_profilerights',
'field' => 'rights',
'name' => _n('Ticket cost', 'Ticket costs', Session::getPluralNumber()),
'datatype' => 'right',
'rightclass' => 'TicketCost',
'rightname' => 'ticketcost',
'joinparams' => [
'jointype' => 'child',
'condition' => ['NEWTABLE.name' => 'ticketcost']
]
];
$tab[] = [
'id' => '86',
'table' => $this->getTable(),
'field' => 'helpdesk_hardware',
'name' => __('Link with items for the creation of tickets'),
'massiveaction' => false,
'datatype' => 'specific'
];
$tab[] = [
'id' => '87',
'table' => $this->getTable(),
'field' => 'helpdesk_item_type',
'name' => __('Associable items to a ticket'),
'massiveaction' => false,
'datatype' => 'specific'
];
$tab[] = [
'id' => '88',
'table' => $this->getTable(),
'field' => 'managed_domainrecordtypes',
'name' => __('Managed domain records types'),
'massiveaction' => false,
'datatype' => 'specific'
];
$tab[] = [
'id' => '89',
'table' => 'glpi_profilerights',
'field' => 'rights',
'name' => __('See hardware of my groups'),
'datatype' => 'bool',
'joinparams' => [
'jointype' => 'child',
'condition' => ['NEWTABLE.name' => 'show_group_hardware']
]
];
$tab[] = [
'id' => '100',
'table' => $this->getTable(),
'field' => 'ticket_status',
'name' => __('Life cycle of tickets'),
'nosearch' => true,
'datatype' => 'text',
'massiveaction' => false
];
$tab[] = [
'id' => '110',
'table' => $this->getTable(),
'field' => 'problem_status',
'name' => __('Life cycle of problems'),
'nosearch' => true,
'datatype' => 'text',
'massiveaction' => false
];
$tab[] = [
'id' => '112',
'table' => 'glpi_profilerights',
'field' => 'rights',
'name' => Problem::getTypeName(Session::getPluralNumber()),
'datatype' => 'right',
'rightclass' => 'Problem',
'rightname' => 'problem',
'joinparams' => [
'jointype' => 'child',
'condition' => ['NEWTABLE.name' => 'problem']
]
];
$tab[] = [
'id' => '111',
'table' => $this->getTable(),
'field' => 'change_status',
'name' => __('Life cycle of changes'),
'nosearch' => true,
'datatype' => 'text',
'massiveaction' => false
];
$tab[] = [
'id' => '115',
'table' => 'glpi_profilerights',
'field' => 'rights',
'name' => _n('Change', 'Changes', Session::getPluralNumber()),
'datatype' => 'right',
'rightclass' => 'Change',
'rightname' => 'change',
'joinparams' => [
'jointype' => 'child',
'condition' => ['NEWTABLE.name' => 'change']
]
];
$tab[] = [
'id' => 'other',
'name' => __('Other')
];
$tab[] = [
'id' => '4',
'table' => 'glpi_profilerights',
'field' => 'rights',
'name' => __('Update password'),
'datatype' => 'bool',
'joinparams' => [
'jointype' => 'child',
'condition' => ['NEWTABLE.name' => 'password_update']
]
];
$tab[] = [
'id' => '63',
'table' => 'glpi_profilerights',
'field' => 'rights',
'name' => _n('Public reminder', 'Public reminders', Session::getPluralNumber()),
'datatype' => 'right',
'rightclass' => 'Reminder',
'rightname' => 'reminder_public',
'joinparams' => [
'jointype' => 'child',
'condition' => ['NEWTABLE.name' => 'reminder_public']
]
];
$tab[] = [
'id' => '64',
'table' => 'glpi_profilerights',
'field' => 'rights',
'name' => _n('Public saved search', 'Public saved searches', Session::getPluralNumber()),
'datatype' => 'right',
'rightclass' => 'SavedSearch',
'rightname' => 'bookmark_public',
'joinparams' => [
'jointype' => 'child',
'condition' => ['NEWTABLE.name' => 'bookmark_public']
]
];
$tab[] = [
'id' => '120',
'table' => 'glpi_profilerights',
'field' => 'rights',
'name' => _n('Public RSS feed', 'Public RSS feeds', Session::getPluralNumber()),
'datatype' => 'right',
'rightclass' => 'RSSFeed',
'rightname' => 'rssfeed_public',
'joinparams' => [
'jointype' => 'child',
'condition' => ['NEWTABLE.name' => 'rssfeed_public']
]
];
return $tab;
}
/**
* @since 0.84
*
* @param $field
* @param $values
* @param $options array
**/
public static function getSpecificValueToDisplay($field, $values, array $options = [])
{
if (!is_array($values)) {
$values = [$field => $values];
}
switch ($field) {
case 'interface':
return self::getInterfaceName($values[$field]);
case 'helpdesk_hardware':
return self::getHelpdeskHardwareTypeName($values[$field]);
case "helpdesk_item_type":
$types = explode(',', $values[$field]);
$message = [];
foreach ($types as $type) {
if ($item = getItemForItemtype($type)) {
$message[] = $item->getTypeName();
}
}
return implode(', ', $message);
}
return parent::getSpecificValueToDisplay($field, $values, $options);
}
/**
* @since 0.84
*
* @param $field
* @param $name (default '')
* @param $values (default '')
* @param $options array
**/
public static function getSpecificValueToSelect($field, $name = '', $values = '', array $options = [])
{
if (!is_array($values)) {
$values = [$field => $values];
}
$options['display'] = false;
switch ($field) {
case 'interface':
$options['value'] = $values[$field];
return Dropdown::showFromArray($name, self::getInterfaces(), $options);
case 'helpdesk_hardware':
$options['value'] = $values[$field];
return Dropdown::showFromArray($name, self::getHelpdeskHardwareTypes(), $options);
case "helpdesk_item_type":
$options['values'] = explode(',', $values[$field]);
$options['name'] = $name;
return self::dropdownHelpdeskItemtypes($options);
}
return parent::getSpecificValueToSelect($field, $name, $values, $options);
}
/**
* Make a select box for rights
*
* @since 0.85
*
* @param $values array of values to display
* @param $name integer name of the dropdown
* @param $current integer value in database (sum of rights)
* @param $options array
**/
public static function dropdownRights(array $values, $name, $current, $options = [])
{
foreach ($values as $key => $value) {
if (is_array($value)) {
$values[$key] = $value['long'];
}
}
$param['multiple'] = true;
$param['display'] = true;
$param['size'] = count($values);
$tabselect = [];
foreach ($values as $k => $v) {
if ($current & $k) {
$tabselect[] = $k;
}
}
$param['values'] = $tabselect;
if (is_array($options) && count($options)) {
foreach ($options as $key => $val) {
$param[$key] = $val;
}
}
// To allow dropdown with no value to be in prepareInputForUpdate
// without this, you can't have an empty dropdown
// done to avoid define NORIGHT value
if ($param['multiple']) {
echo "<input type='hidden' name='" . $name . "[]' value='0'>";
}
return Dropdown::showFromArray($name, $values, $param);
}
/**
* Make a select box for a None Read Write choice
*
* @since 0.84
*
* @param $name select name
* @param $options array of possible options:
* - value : preselected value.
* - nonone : hide none choice ? (default false)
* - noread : hide read choice ? (default false)
* - nowrite : hide write choice ? (default false)
* - display : display or get string (default true)
* - rand : specific rand (default is generated one)
*
* @return integer|string
* integer if option display=true (random part of elements id)
* string if option display=false (HTML code)
**/
public static function dropdownRight($name, $options = [])
{
$param['value'] = '';
$param['display'] = true;
$param['nonone'] = false;
$param['noread'] = false;
$param['nowrite'] = false;
$param['rand'] = mt_rand();
if (is_array($options) && count($options)) {
foreach ($options as $key => $val) {
$param[$key] = $val;
}
}
$values = [];
if (!$param['nonone']) {
$values[0] = __('No access');
}
if (!$param['noread']) {
$values[READ] = __('Read');
}
if (!$param['nowrite']) {
$values[CREATE] = __('Write');
}
return Dropdown::showFromArray(
$name,
$values,
['value' => $param['value'],
'rand' => $param['rand'],
'display' => $param['display']
]
);
}
/**
* Dropdown profiles which have rights under the active one
*
* @param $options array of possible options:
* - name : string / name of the select (default is profiles_id)
* - value : integer / preselected value (default 0)
*
**/
public static function dropdownUnder($options = [])
{
global $DB;
$p['name'] = 'profiles_id';
$p['value'] = '';
$p['rand'] = mt_rand();
if (is_array($options) && count($options)) {
foreach ($options as $key => $val) {
$p[$key] = $val;
}
}
$iterator = $DB->request([
'FROM' => self::getTable(),
'WHERE' => self::getUnderActiveProfileRestrictCriteria(),
'ORDER' => 'name'
]);
//New rule -> get the next free ranking
foreach ($iterator as $data) {
$profiles[$data['id']] = $data['name'];
}
Dropdown::showFromArray(
$p['name'],
$profiles,
['value' => $p['value'],
'rand' => $p['rand'],
'display_emptychoice' => true
]
);
}
/**
* Get the default Profile for new user
*
* @return integer profiles_id
**/
public static function getDefault()
{
global $DB;
foreach ($DB->request('glpi_profiles', ['is_default' => 1]) as $data) {
return $data['id'];
}
return 0;
}
/**
* @since 0.84
**/
public static function getInterfaces()
{
return ['central' => __('Standard interface'),
'helpdesk' => __('Simplified interface')
];
}
/**
* @param $value
**/
public static function getInterfaceName($value)
{
$tab = self::getInterfaces();
if (isset($tab[$value])) {
return $tab[$value];
}
return NOT_AVAILABLE;
}
/**
* @since 0.84
*
* @param $rights boolean (false by default)
**/
public static function getHelpdeskHardwareTypes($rights = false)
{
if ($rights) {
return [pow(2, Ticket::HELPDESK_MY_HARDWARE) => __('My devices'),
pow(2, Ticket::HELPDESK_ALL_HARDWARE) => __('All items')
];
}
return [0 => Dropdown::EMPTY_VALUE,
pow(2, Ticket::HELPDESK_MY_HARDWARE) => __('My devices'),
pow(2, Ticket::HELPDESK_ALL_HARDWARE) => __('All items'),
pow(2, Ticket::HELPDESK_MY_HARDWARE)
+ pow(2, Ticket::HELPDESK_ALL_HARDWARE) => __('My devices and all items')
];
}
/**
* @since 0.84
*
* @param $value
**/
public static function getHelpdeskHardwareTypeName($value)
{
$tab = self::getHelpdeskHardwareTypes();
if (isset($tab[$value])) {
return $tab[$value];
}
return NOT_AVAILABLE;
}
/**
* @since 0.85
**/
public static function getHelpdeskItemtypes()
{
global $CFG_GLPI;
$values = [];
foreach ($CFG_GLPI["ticket_types"] as $key => $itemtype) {
if ($item = getItemForItemtype($itemtype)) {
$values[$itemtype] = $item->getTypeName();
} else {
unset($CFG_GLPI["ticket_types"][$key]);
}
}
return $values;
}
/**
* Get domains records types
*
* @return array
*/
public function getDomainRecordTypes()
{
global $DB;
$iterator = $DB->request([
'FROM' => DomainRecordType::getTable(),
]);
$types = [];
foreach ($iterator as $row) {
$types[$row['id']] = $row['name'];
}
return $types;
}
/**
* Dropdown profiles which have rights under the active one
*
* @since 0.84
*
* @param $options array of possible options:
* - name : string / name of the select (default is profiles_id)
* - values : array of values
**/
public static function dropdownHelpdeskItemtypes($options)
{
$p['name'] = 'helpdesk_item_type';
$p['values'] = [];
$p['display'] = true;
if (is_array($options) && count($options)) {
foreach ($options as $key => $val) {
$p[$key] = $val;
}
}
$values = self::getHelpdeskItemtypes();
$p['multiple'] = true;
$p['size'] = 3;
return Dropdown::showFromArray($p['name'], $values, $p);
}
/**
* Check if user has given right.
*
* @since 0.84
*
* @param $user_id integer id of the user
* @param $rightname string name of right to check
* @param $rightvalue integer value of right to check
* @param $entity_id integer id of the entity
*
* @return boolean
*/
public static function haveUserRight($user_id, $rightname, $rightvalue, $entity_id)
{
global $DB;
$result = $DB->request(
[
'COUNT' => 'cpt',
'FROM' => 'glpi_profilerights',
'INNER JOIN' => [
'glpi_profiles' => [
'FKEY' => [
'glpi_profilerights' => 'profiles_id',
'glpi_profiles' => 'id',
]
],
'glpi_profiles_users' => [
'FKEY' => [
'glpi_profiles_users' => 'profiles_id',
'glpi_profiles' => 'id',
[
'AND' => ['glpi_profiles_users.users_id' => $user_id],
],
]
],
],
'WHERE' => [
'glpi_profilerights.name' => $rightname,
'glpi_profilerights.rights' => ['&', $rightvalue],
] + getEntitiesRestrictCriteria('glpi_profiles_users', '', $entity_id, true),
]
);
if (!$data = $result->current()) {
return false;
}
return $data['cpt'] > 0;
}
/**
* Get rights for an itemtype
*
* @since 0.85
*
* @param $itemtype string itemtype
* @param $interface string (default 'central')
*
* @return rights
**/
public static function getRightsFor($itemtype, $interface = 'central')
{
if (class_exists($itemtype)) {
$item = new $itemtype();
return $item->getRights($interface);
}
}
/**
* Display rights choice matrix
*
* @since 0.85
*
* @param $rights array possible:
* 'itemtype' => the type of the item to check (as passed to self::getRightsFor())
* 'rights' => when use of self::getRightsFor() is impossible
* 'label' => the label for the right
* 'field' => the name of the field inside the DB and HTML form (prefixed by '_')
* 'html_field' => when $html_field != '_'.$field
* @param $options array possible:
* 'title' the title of the matrix
* 'canedit'
* 'default_class' the default CSS class used for the row
*
* @return random value used to generate the ids
**/
public function displayRightsChoiceMatrix(array $rights, array $options = [])
{
$param = [];
$param['title'] = '';
$param['canedit'] = true;
$param['default_class'] = '';
if (is_array($options) && count($options)) {
foreach ($options as $key => $val) {
$param[$key] = $val;
}
}
// To be completed before display to avoid non available rights in DB
$availablerights = ProfileRight::getAllPossibleRights();
$column_labels = [];
$columns = [];
$rows = [];
foreach ($rights as $info) {
if (is_string($info)) {
$rows[] = $info;
continue;
}
if (
is_array($info)
&& ((!empty($info['itemtype'])) || (!empty($info['rights'])))
&& (!empty($info['label']))
&& (!empty($info['field']))
) {
// Add right if it does not exists : security for update
if (!isset($availablerights[$info['field']])) {
ProfileRight::addProfileRights([$info['field']]);
}
$row = ['label' => $info['label'],
'columns' => []
];
if (!empty($info['row_class'])) {
$row['class'] = $info['row_class'];
} else {
$row['class'] = $param['default_class'];
}
if (isset($this->fields[$info['field']])) {
$profile_right = $this->fields[$info['field']];
} else {
$profile_right = 0;
}
if (isset($info['rights'])) {
$itemRights = $info['rights'];
} else {
$itemRights = self::getRightsFor($info['itemtype']);
}
foreach ($itemRights as $right => $label) {
if (!isset($column_labels[$right])) {
$column_labels[$right] = [];
}
if (is_array($label)) {
$long_label = $label['long'];
} else {
$long_label = $label;
}
if (!isset($column_labels[$right][$long_label])) {
$column_labels[$right][$long_label] = count($column_labels[$right]);
}
$right_value = $right . '_' . $column_labels[$right][$long_label];
$columns[$right_value] = $label;
$checked = ((($profile_right & $right) == $right) ? 1 : 0);
$row['columns'][$right_value] = ['checked' => $checked];
if (!$param['canedit']) {
$row['columns'][$right_value]['readonly'] = true;
}
}
if (!empty($info['html_field'])) {
$rows[$info['html_field']] = $row;
} else {
$rows['_' . $info['field']] = $row;
}
}
}
uksort($columns, function ($a, $b) {
$a = explode('_', $a);
$b = explode('_', $b);
// For standard rights sort by right
if (($a[0] < 1024) || ($b[0] < 1024)) {
if ($a[0] > $b[0]) {
return 1;
}
if ($a[0] < $b[0]) {
return -1;
}
}
// For extra right sort by type
if ($a[1] > $b[1]) {
return 1;
}
if ($a[1] < $b[1]) {
return -1;
}
return 0;
});
return Html::showCheckboxMatrix(
$columns,
$rows,
['title' => $param['title'],
'row_check_all' => count($columns) > 1,
'col_check_all' => count($rows) > 1
]
);
}
/**
* Get right linear right choice.
*
* @since 0.85
*
* @param $elements array all pair identifier => label
* @param $options array possible:
* 'canedit'
* 'field' name of the HTML field
* 'value' the value inside the database
* 'max_per_line' maximum number of elements per line
* 'check_all' add a checkbox to check or uncheck every checkbox
* 'rand' random value used to generate the ids
* 'zero_on_empty' do we send 0 when checkbox is not checked ?
* 'display'
* 'check_method' method used to check the right
*
* @return content if !display
**/
public static function getLinearRightChoice(array $elements, array $options = [])
{
$param = [];
$param['canedit'] = true;
$param['field'] = '';
$param['value'] = '';
$param['max_per_line'] = 10;
$param['check_all'] = false;
$param['rand'] = mt_rand();
$param['zero_on_empty'] = true;
$param['display'] = true;
$param['check_method'] = function ($element, $field) {
return (($field & $element) == $element);
};
if (is_array($options) && count($options)) {
foreach ($options as $key => $val) {
$param[$key] = $val;
}
}
if (empty($param['field'])) {
return;
}
$nb_cbs = count($elements);
$cb_options = ['readonly' => !$param['canedit']];
if ($param['check_all']) {
$nb_cbs++;
$massive_tag = 'checkall_' . $param['field'] . '_' . $param['rand'];
$cb_options['massive_tags'] = $massive_tag;
}
$nb_lines = ceil($nb_cbs / $param['max_per_line']);
$nb_item_per_line = ceil($nb_cbs / $nb_lines);
$out = '';
$count = 0;
$nb_checked = 0;
foreach ($elements as $element => $label) {
if ($count != 0) {
if (($count % $nb_item_per_line) == 0) {
$out .= "<br>\n";
} else {
$out .= " -\n\t\t ";
}
} else {
$out .= "\n\t\t";
}
$out .= $label . ' ';
$cb_options['name'] = $param['field'] . '[' . $element . ']';
$cb_options['id'] = Html::cleanId('checkbox_linear_' . $cb_options['name'] .
'_' . $param['rand']);
$cb_options['zero_on_empty'] = $param['zero_on_empty'];
$cb_options['checked'] = $param['check_method'](
$element,
$param['value']
);
$out .= Html::getCheckbox($cb_options);
$count++;
if ($cb_options['checked']) {
$nb_checked++;
}
}
if ($param['check_all']) {
$cb_options = ['criterion' => ['tag_for_massive' => $massive_tag],
'id' => Html::cleanId('checkbox_linear_' . $param['rand'])
];
if ($nb_checked > (count($elements) / 2)) {
$cb_options['checked'] = true;
}
$out .= " - <i><b>" . __('Select/unselect all') . "</b></i> " .
Html::getCheckbox($cb_options);
}
if (!$param['display']) {
return $out;
}
echo $out;
}
public static function getIcon()
{
return "ti ti-user-check";
}
}