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

1654 lines
68 KiB
PHP

<?php
/**
* ---------------------------------------------------------------------
* GLPI - Gestionnaire Libre de Parc Informatique
* Copyright (C) 2015-2020 Teclib' and contributors.
*
* http://glpi-project.org
*
* based on GLPI - Gestionnaire Libre de Parc Informatique
* Copyright (C) 2003-2014 by the INDEPNET Development Team.
*
* ---------------------------------------------------------------------
*
* LICENSE
*
* This file is part of GLPI.
*
* GLPI is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* GLPI is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with GLPI. If not, see <http://www.gnu.org/licenses/>.
* ---------------------------------------------------------------------
*/
if (!defined('GLPI_ROOT')) {
die("Sorry. You can't access this file directly");
}
abstract class NotificationTargetCommonITILObject extends NotificationTarget {
public $private_profiles = [];
public $html_tags = [
'##change.solution.description##',
'##followup.description##',
'##linkedticket.content##',
'##problem.solution.description##',
'##ticket.content##',
'##ticket.description##',
'##ticket.solution.description##'
];
/**
* @param $entity (default '')
* @param $event (default '')
* @param $object (default null)
* @param $options array
**/
function __construct($entity = '', $event = '', $object = null, $options = []) {
parent::__construct($entity, $event, $object, $options);
if (isset($options['followup_id'])) {
$this->options['sendprivate'] = $options['is_private'];
}
if (isset($options['task_id'])) {
$this->options['sendprivate'] = $options['is_private'];
}
}
function validateSendTo($event, array $infos, $notify_me = false, $emitter = null) {
// Check global ones for notification to myself
if (!parent::validateSendTo($event, $infos, $notify_me, $emitter)) {
return false;
}
// Private object and no right to see private items : do not send
if ($this->isPrivate()
&& (!isset($infos['additionnaloption']['show_private'])
|| !$infos['additionnaloption']['show_private'])) {
return false;
}
return true;
}
/**
* Get notification subject prefix
*
* @param $event Event name (default '')
*
* @return string
**/
function getSubjectPrefix($event = '') {
$perso_tag = trim(Entity::getUsedConfig('notification_subject_tag', $this->getEntity(),
'', ''));
if (empty($perso_tag)) {
$perso_tag = 'GLPI';
}
return sprintf("[$perso_tag #%07d] ", $this->obj->getField('id'));
}
/**
* Get events related to Itil Object
*
* @since 9.2
*
* @return array of events (event key => event label)
**/
function getEvents() {
$events = [
'requester_user' => __('New user in requesters'),
'requester_group' => __('New group in requesters'),
'observer_user' => __('New user in observers'),
'observer_group' => __('New group in observers'),
'assign_user' => __('New user in assignees'),
'assign_group' => __('New group in assignees'),
'assign_supplier' => __('New supplier in assignees'),
'add_task' => __('New task'),
'update_task' => __('Update of a task'),
'delete_task' => __('Deletion of a task'),
'add_followup' => __("New followup"),
'update_followup' => __('Update of a followup'),
'delete_followup' => __('Deletion of a followup'),
];
asort($events);
return $events;
}
/**
* Add linked users to the notified users list
*
* @param integer $type type of linked users
*
* @return void
*/
function addLinkedUserByType($type) {
global $DB, $CFG_GLPI;
$userlinktable = getTableForItemType($this->obj->userlinkclass);
$fkfield = $this->obj->getForeignKeyField();
//Look for the user by his id
$criteria = ['LEFT JOIN' => [
User::getTable() => [
'ON' => [
$userlinktable => 'users_id',
User::getTable() => 'id'
]
]
]] + $this->getDistinctUserCriteria() + $this->getProfileJoinCriteria();
$criteria['FROM'] = $userlinktable;
$criteria['FIELDS'] = array_merge(
$criteria['FIELDS'], [
"$userlinktable.use_notification AS notif",
"$userlinktable.alternative_email AS altemail"
]
);
$criteria['WHERE']["$userlinktable.$fkfield"] = $this->obj->fields['id'];
$criteria['WHERE']["$userlinktable.type"] = $type;
$iterator = $DB->request($criteria);
while ($data = $iterator->next()) {
//Add the user email and language in the notified users list
if ($data['notif']) {
$author_email = UserEmail::getDefaultForUser($data['users_id']);
$author_lang = $data["language"];
$author_id = $data['users_id'];
if (!empty($data['altemail'])
&& ($data['altemail'] != $author_email)
&& NotificationMailing::isUserAddressValid($data['altemail'])) {
$author_email = $data['altemail'];
}
if (empty($author_lang)) {
$author_lang = $CFG_GLPI["language"];
}
if (empty($author_id)) {
$author_id = -1;
}
$user = [
'language' => $author_lang,
'users_id' => $author_id
];
if ($this->isMailMode()) {
$user['email'] = $author_email;
}
$this->addToRecipientsList($user);
}
}
// Anonymous user
$iterator = $DB->request([
'SELECT' => 'alternative_email',
'FROM' => $userlinktable,
'WHERE' => [
$fkfield => $this->obj->fields['id'],
'users_id' => 0,
'use_notification' => 1,
'type' => $type
]
]);
while ($data = $iterator->next()) {
if ($this->isMailMode()) {
if (NotificationMailing::isUserAddressValid($data['alternative_email'])) {
$this->addToRecipientsList([
'email' => $data['alternative_email'],
'language' => $CFG_GLPI["language"],
'users_id' => -1
]);
}
}
}
}
/**
* Add linked group to the notified user list
*
* @param integer $type type of linked groups
*
* @return void
*/
function addLinkedGroupByType($type) {
global $DB;
$grouplinktable = getTableForItemType($this->obj->grouplinkclass);
$fkfield = $this->obj->getForeignKeyField();
//Look for the user by his id
$iterator = $DB->request([
'SELECT' => 'groups_id',
'FROM' => $grouplinktable,
'WHERE' => [
$fkfield => $this->obj->fields['id'],
'type' => $type
]
]);
while ($data = $iterator->next()) {
//Add the group in the notified users list
$this->addForGroup(0, $data['groups_id']);
}
}
/**
* Add linked group without supervisor to the notified user list
*
* @since 0.84.1
*
* @param integer $type type of linked groups
*
* @return void
*/
function addLinkedGroupWithoutSupervisorByType($type) {
global $DB;
$grouplinktable = getTableForItemType($this->obj->grouplinkclass);
$fkfield = $this->obj->getForeignKeyField();
$iterator = $DB->request([
'SELECT' => 'groups_id',
'FROM' => $grouplinktable,
'WHERE' => [
$fkfield => $this->obj->fields['id'],
'type' => $type
]
]);
while ($data = $iterator->next()) {
//Add the group in the notified users list
$this->addForGroup(2, $data['groups_id']);
}
}
/**
* Add linked group supervisor to the notified user list
*
* @param integer $type type of linked groups
*
* @return void
*/
function addLinkedGroupSupervisorByType($type) {
global $DB;
$grouplinktable = getTableForItemType($this->obj->grouplinkclass);
$fkfield = $this->obj->getForeignKeyField();
$iterator = $DB->request([
'SELECT' => 'groups_id',
'FROM' => $grouplinktable,
'WHERE' => [
$fkfield => $this->obj->fields['id'],
'type' => $type
]
]);
while ($data = $iterator->next()) {
//Add the group in the notified users list
$this->addForGroup(1, $data['groups_id']);
}
}
/**
* Get the email of the item's user : Overloaded manual address used
**/
function addItemAuthor() {
$this->addLinkedUserByType(CommonITILActor::REQUESTER);
}
/**
* Add previous technician in charge (before reassign)
*
* @return void
*/
function addOldAssignTechnician() {
global $CFG_GLPI;
if (isset($this->options['_old_user'])
&& ($this->options['_old_user']['type'] == CommonITILActor::ASSIGN)
&& $this->options['_old_user']['use_notification']) {
$user = new User();
$user->getFromDB($this->options['_old_user']['users_id']);
$author_email = UserEmail::getDefaultForUser($user->fields['id']);
$author_lang = $user->fields["language"];
$author_id = $user->fields['id'];
if (!empty($this->options['_old_user']['alternative_email'])
&& ($this->options['_old_user']['alternative_email'] != $author_email)
&& NotificationMailing::isUserAddressValid($this->options['_old_user']['alternative_email'])) {
$author_email = $this->options['_old_user']['alternative_email'];
}
if (empty($author_lang)) {
$author_lang = $CFG_GLPI["language"];
}
if (empty($author_id)) {
$author_id = -1;
}
$user = [
'language' => $author_lang,
'users_id' => $author_id
];
if ($this->isMailMode()) {
$user['email'] = $author_email;
}
$this->addToRecipientsList($user);
}
}
/**
* Add recipient
*
* @return void
*/
function addRecipientAddress() {
return $this->addUserByField("users_id_recipient");
}
/**
* Get supplier related to the ITIL object
*
* @param boolean $sendprivate (false by default)
*
* @return void
*/
function addSupplier($sendprivate = false) {
global $DB;
if (!$sendprivate
&& $this->obj->countSuppliers(CommonITILActor::ASSIGN)
&& $this->isMailMode()) {
$supplierlinktable = getTableForItemType($this->obj->supplierlinkclass);
$fkfield = $this->obj->getForeignKeyField();
$iterator = $DB->request([
'SELECT' => [
'glpi_suppliers.email AS email',
'glpi_suppliers.name AS name'
],
'DISTINCT' => true,
'FROM' => $supplierlinktable,
'LEFT JOIN' => [
'glpi_suppliers' => [
'ON' => [
$supplierlinktable => 'suppliers_id',
'glpi_suppliers' => 'id'
]
]
],
'WHERE' => [
"$supplierlinktable.$fkfield" => $this->obj->getID()
]
]);
while ($data = $iterator->next()) {
$this->addToRecipientsList($data);
}
}
}
/**
* Add approver related to the ITIL object validation
*
* @param $options array
*
* @return void
*/
function addValidationApprover($options = []) {
global $DB;
if (isset($options['validation_id'])) {
$validationtable = getTableForItemType($this->obj->getType().'Validation');
$criteria = ['LEFT JOIN' => [
User::getTable() => [
'ON' => [
$validationtable => 'users_id_validate',
User::getTable() => 'id'
]
]
]] + $this->getDistinctUserCriteria() + $this->getProfileJoinCriteria();
$criteria['FROM'] = $validationtable;
$criteria['WHERE']["$validationtable.id"] = $options['validation_id'];
$iterator = $DB->request($criteria);
while ($data = $iterator->next()) {
$this->addToRecipientsList($data);
}
}
}
/**
* Add requester related to the ITIL object validation
*
* @param array $options Options
*
* @return void
**/
function addValidationRequester($options = []) {
global $DB;
if (isset($options['validation_id'])) {
$validationtable = getTableForItemType($this->obj->getType().'Validation');
$criteria = ['LEFT JOIN' => [
User::getTable() => [
'ON' => [
$validationtable => 'users_id',
User::getTable() => 'id'
]
]
]] + $this->getDistinctUserCriteria() + $this->getProfileJoinCriteria();
$criteria['FROM'] = $validationtable;
$criteria['WHERE']["$validationtable.id"] = $options['validation_id'];
$iterator = $DB->request($criteria);
while ($data = $iterator->next()) {
$this->addToRecipientsList($data);
}
}
}
/**
* Add author related to the followup
*
* @param array $options Options
*
* @return void
*/
function addFollowupAuthor($options = []) {
global $DB;
if (isset($options['followup_id'])) {
$followuptable = getTableForItemType($this->obj->getType().'Followup');
$criteria = array_merge_recursive(
['INNER JOIN' => [
User::getTable() => [
'ON' => [
$followuptable => 'users_id',
User::getTable() => 'id'
]
]
]],
$this->getDistinctUserCriteria() + $this->getProfileJoinCriteria()
);
$criteria['FROM'] = $followuptable;
$criteria['WHERE']["$followuptable.id"] = $options['followup_id'];
$iterator = $DB->request($criteria);
while ($data = $iterator->next()) {
$this->addToRecipientsList($data);
}
}
}
/**
* Add task author
*
* @param array $options Options
*
* @return void
*/
function addTaskAuthor($options = []) {
global $DB;
// In case of delete task pass user id
if (isset($options['task_users_id'])) {
$criteria = $this->getDistinctUserCriteria() + $this->getProfileJoinCriteria();
$criteria['FROM'] = User::getTable();
$criteria['WHERE'][User::getTable() . '.id'] = $options['task_users_id'];
$iterator = $DB->request($criteria);
while ($data = $iterator->next()) {
$this->addToRecipientsList($data);
}
} else if (isset($options['task_id'])) {
$tasktable = getTableForItemType($this->obj->getType().'Task');
$criteria = array_merge_recursive(
['INNER JOIN' => [
User::getTable() => [
'ON' => [
$tasktable => 'users_id',
User::getTable() => 'id'
]
]
]],
$this->getDistinctUserCriteria() + $this->getProfileJoinCriteria()
);
$criteria['FROM'] = $tasktable;
$criteria['WHERE']["$tasktable.id"] = $options['task_id'];
$iterator = $DB->request($criteria);
while ($data = $iterator->next()) {
$this->addToRecipientsList($data);
}
}
}
/**
* Add user assigned to task
*
* @param array $options Options
*
* @return void
*/
function addTaskAssignUser($options = []) {
global $DB;
// In case of delete task pass user id
if (isset($options['task_users_id_tech'])) {
$criteria = $this->getDistinctUserCriteria() + $this->getProfileJoinCriteria();
$criteria['FROM'] = User::getTable();
$criteria['WHERE'][User::getTable() . '.id'] = $options['task_users_id_tech'];
$iterator = $DB->request($criteria);
while ($data = $iterator->next()) {
$this->addToRecipientsList($data);
}
} else if (isset($options['task_id'])) {
$tasktable = getTableForItemType($this->obj->getType().'Task');
$criteria = array_merge_recursive(
['INNER JOIN' => [
User::getTable() => [
'ON' => [
$tasktable => 'users_id_tech',
User::getTable() => 'id'
]
]
]],
$this->getDistinctUserCriteria() + $this->getProfileJoinCriteria()
);
$criteria['FROM'] = $tasktable;
$criteria['WHERE']["$tasktable.id"] = $options['task_id'];
$iterator = $DB->request($criteria);
while ($data = $iterator->next()) {
$this->addToRecipientsList($data);
}
}
}
/**
* Add group assigned to the task
*
* @since 9.1
*
* @param array $options Options
*
* @return void
*/
function addTaskAssignGroup($options = []) {
global $DB;
// In case of delete task pass user id
if (isset($options['task_groups_id_tech'])) {
$this->addForGroup(0, $options['task_groups_id_tech']);
} else if (isset($options['task_id'])) {
$tasktable = getTableForItemType($this->obj->getType().'Task');
$iterator = $DB->request([
'FROM' => $tasktable,
'INNER JOIN' => [
'glpi_groups' => [
'ON' => [
'glpi_groups' => 'id',
$tasktable => 'groups_id_tech'
]
]
],
'WHERE' => ["$tasktable.id" => $options['task_id']]
]);
while ($data = $iterator->next()) {
$this->addForGroup(0, $data['groups_id_tech']);
}
}
}
function addAdditionnalInfosForTarget() {
global $DB;
$iterator = $DB->request([
'SELECT' => ['profiles_id'],
'FROM' => 'glpi_profilerights',
'WHERE' => [
'name' => 'followup',
'rights' => ['&', ITILFollowup::SEEPRIVATE]
]
]);
while ($data = $iterator->next()) {
$this->private_profiles[$data['profiles_id']] = $data['profiles_id'];
}
}
function addAdditionnalUserInfo(array $data) {
global $DB;
if (!isset($data['users_id'])) {
return ['show_private' => 0];
}
$result = $DB->request([
'COUNT' => 'cpt',
'FROM' => 'glpi_profiles_users',
'WHERE' => [
'users_id' => $data['users_id'],
'profiles_id' => $this->private_profiles
] + getEntitiesRestrictCriteria('glpi_profiles_users', 'entities_id', $this->getEntity(), true)
])->next();
if ($result['cpt']) {
return ['show_private' => 1];
}
return ['show_private' => 0];
}
public function getProfileJoinCriteria() {
$criteria = parent::getProfileJoinCriteria();
if ($this->isPrivate()) {
$criteria['INNER JOIN'][Profile::getTable()] = [
'ON' => [
Profile::getTable() => 'id',
Profile_User::getTable() => 'profiles_id'
]
];
$criteria['INNER JOIN'][ProfileRight::getTable()] = [
'ON' => [
ProfileRight::getTable() => 'profiles_id',
Profile::getTable() => 'id'
]
];
$criteria['WHERE'][ProfileRight::getTable() . '.name'] = 'followup';
$criteria['WHERE'][ProfileRight::getTable() . '.rights'] = ['&', ITILFollowup::SEEPRIVATE];
$criteria['WHERE'][Profile::getTable() . '.interface'] = 'central';
}
return $criteria;
}
function isPrivate() {
if (isset($this->options['sendprivate']) && ($this->options['sendprivate'] == 1)) {
return true;
}
return false;
}
/**
* Add additionnals targets for ITIL objects
*
* @param string $event specif event to get additional targets (default '')
*
* @return void
**/
function addAdditionalTargets($event = '') {
if ($event=='update') {
$this->addTarget(Notification::OLD_TECH_IN_CHARGE,
__('Former technician in charge of the ticket'));
}
if ($event=='satisfaction') {
$this->addTarget(Notification::AUTHOR, _n('Requester', 'Requesters', 1));
$this->addTarget(Notification::RECIPIENT, __('Writer'));
} else if ($event!='alertnotclosed') {
$this->addTarget(Notification::RECIPIENT, __('Writer'));
$this->addTarget(Notification::SUPPLIER, Supplier::getTypeName(1));
$this->addTarget(Notification::SUPERVISOR_ASSIGN_GROUP,
__('Manager of the group in charge of the ticket'));
$this->addTarget(Notification::ASSIGN_GROUP_WITHOUT_SUPERVISOR,
__("Group in charge of the ticket except manager users"));
$this->addTarget(Notification::SUPERVISOR_REQUESTER_GROUP, __('Requester group manager'));
$this->addTarget(Notification::REQUESTER_GROUP_WITHOUT_SUPERVISOR,
__("Requester group except manager users"));
$this->addTarget(Notification::ITEM_TECH_IN_CHARGE,
__('Technician in charge of the hardware'));
$this->addTarget(Notification::ITEM_TECH_GROUP_IN_CHARGE,
__('Group in charge of the hardware'));
$this->addTarget(Notification::ASSIGN_TECH, __('Technician in charge of the ticket'));
$this->addTarget(Notification::REQUESTER_GROUP, _n('Requester group', 'Requester groups', 1));
$this->addTarget(Notification::AUTHOR, _n('Requester', 'Requesters', 1));
$this->addTarget(Notification::ITEM_USER, __('Hardware user'));
$this->addTarget(Notification::ASSIGN_GROUP, __('Group in charge of the ticket'));
$this->addTarget(Notification::OBSERVER_GROUP, _n('Watcher group', 'Watcher groups', 1));
$this->addTarget(Notification::OBSERVER, _n('Watcher', 'Watchers', 1));
$this->addTarget(Notification::SUPERVISOR_OBSERVER_GROUP, __('Watcher group manager'));
$this->addTarget(Notification::OBSERVER_GROUP_WITHOUT_SUPERVISOR,
__("Watcher group except manager users"));
}
if (($event == 'validation') || ($event == 'validation_answer')) {
$this->addTarget(Notification::VALIDATION_REQUESTER, __('Approval requester'));
$this->addTarget(Notification::VALIDATION_APPROVER, __('Approver'));
}
if (($event == 'update_task') || ($event == 'add_task') || ($event == 'delete_task')) {
$this->addTarget(Notification::TASK_ASSIGN_TECH, __('Technician in charge of the task'));
$this->addTarget(Notification::TASK_ASSIGN_GROUP, __('Group in charge of the task'));
$this->addTarget(Notification::TASK_AUTHOR, __('Task author'));
}
if (($event == 'update_followup')
|| ($event == 'add_followup')
|| ($event == 'delete_followup')) {
$this->addTarget(Notification::FOLLOWUP_AUTHOR, __('Followup author'));
}
}
/**
* Get specifics targets for ITIL objects
*
* @param array $data Data
* @param array $options Options
*
* @return void
**/
function addSpecificTargets($data, $options) {
//Look for all targets whose type is Notification::ITEM_USER
switch ($data['type']) {
case Notification::USER_TYPE :
switch ($data['items_id']) {
case Notification::ASSIGN_TECH :
$this->addLinkedUserByType(CommonITILActor::ASSIGN);
break;
//Send to the supervisor of group in charge of the ITIL object
case Notification::SUPERVISOR_ASSIGN_GROUP :
$this->addLinkedGroupSupervisorByType(CommonITILActor::ASSIGN);
break;
//Notification to the group in charge of the ITIL object without supervisor
case Notification::ASSIGN_GROUP_WITHOUT_SUPERVISOR :
$this->addLinkedGroupWithoutSupervisorByType(CommonITILActor::ASSIGN);
break;
//Send to the user who's got the issue
case Notification::RECIPIENT :
$this->addRecipientAddress();
break;
//Send to the supervisor of the requester's group
case Notification::SUPERVISOR_REQUESTER_GROUP :
$this->addLinkedGroupSupervisorByType(CommonITILActor::REQUESTER);
break;
//Send to the technician previously in charge of the ITIL object (before reassignation)
case Notification::OLD_TECH_IN_CHARGE :
$this->addOldAssignTechnician();
break;
//Assign to a supplier
case Notification::SUPPLIER :
$this->addSupplier($this->isPrivate());
break;
case Notification::REQUESTER_GROUP :
$this->addLinkedGroupByType(CommonITILActor::REQUESTER);
break;
//Notification to the requester group without supervisor
case Notification::REQUESTER_GROUP_WITHOUT_SUPERVISOR :
$this->addLinkedGroupWithoutSupervisorByType(CommonITILActor::REQUESTER);
break;
case Notification::ASSIGN_GROUP :
$this->addLinkedGroupByType(CommonITILActor::ASSIGN);
break;
//Send to the ITIL object validation approver
case Notification::VALIDATION_APPROVER :
$this->addValidationApprover($options);
break;
//Send to the ITIL object validation requester
case Notification::VALIDATION_REQUESTER :
$this->addValidationRequester($options);
break;
//Send to the ITIL object followup author
case Notification::FOLLOWUP_AUTHOR :
$this->addFollowupAuthor($options);
break;
//Send to the ITIL object followup author
case Notification::TASK_AUTHOR :
$this->addTaskAuthor($options);
break;
//Send to the ITIL object followup author
case Notification::TASK_ASSIGN_TECH :
$this->addTaskAssignUser($options);
break;
//Send to the ITIL object task group assigned
case Notification::TASK_ASSIGN_GROUP :
$this->addTaskAssignGroup($options);
break;
//Notification to the ITIL object's observer group
case Notification::OBSERVER_GROUP :
$this->addLinkedGroupByType(CommonITILActor::OBSERVER);
break;
//Notification to the ITIL object's observer user
case Notification::OBSERVER :
$this->addLinkedUserByType(CommonITILActor::OBSERVER);
break;
//Notification to the supervisor of the ITIL object's observer group
case Notification::SUPERVISOR_OBSERVER_GROUP :
$this->addLinkedGroupSupervisorByType(CommonITILActor::OBSERVER);
break;
//Notification to the observer group without supervisor
case Notification::OBSERVER_GROUP_WITHOUT_SUPERVISOR :
$this->addLinkedGroupWithoutSupervisorByType(CommonITILActor::OBSERVER);
break;
}
}
}
function addDataForTemplate($event, $options = []) {
$events = $this->getAllEvents();
$objettype = strtolower($this->obj->getType());
// Get data from ITIL objects
if ($event != 'alertnotclosed') {
$this->data = $this->getDataForObject($this->obj, $options);
} else {
if (isset($options['entities_id'])
&& isset($options['items'])) {
$entity = new Entity();
if ($entity->getFromDB($options['entities_id'])) {
$this->data["##$objettype.entity##"] = $entity->getField('completename');
$this->data["##$objettype.shortentity##"] = $entity->getField('name');
}
if ($item = getItemForItemtype($objettype)) {
$objettypes = Toolbox::strtolower(getPlural($objettype));
$items = [];
foreach ($options['items'] as $object) {
$item->getFromDB($object['id']);
$tmp = $this->getDataForObject($item, $options, true);
$this->data[$objettypes][] = $tmp;
}
}
}
}
if (($event == 'validation')
&& isset($options['validation_status'])) {
$this->data["##$objettype.action##"]
//TRANS: %s id of the approval's state
= sprintf(__('%1$s - %2$s'), CommonITILValidation::getTypeName(1),
TicketValidation::getStatus($options['validation_status']));
} else {
$this->data["##$objettype.action##"] = $events[$event];
}
$this->getTags();
foreach ($this->tag_descriptions[parent::TAG_LANGUAGE] as $tag => $values) {
if (!isset($this->data[$tag])) {
$this->data[$tag] = $values['label'];
}
}
}
/**
* Get data from an item
*
* @param CommonDBTM $item Object instance
* @param array $options Options
* @param boolean $simple (false by default)
*
* @return array
**/
function getDataForObject(CommonDBTM $item, array $options, $simple = false) {
global $CFG_GLPI, $DB;
$objettype = strtolower($item->getType());
$data["##$objettype.title##"] = $item->getField('name');
$data["##$objettype.content##"] = $item->getField('content');
$data["##$objettype.description##"] = $item->getField('content');
$data["##$objettype.id##"] = sprintf("%07d", $item->getField("id"));
$data["##$objettype.url##"]
= $this->formatURL($options['additionnaloption']['usertype'],
$objettype."_".$item->getField("id"));
$tab = '$1';
$data["##$objettype.urlapprove##"]
= $this->formatURL($options['additionnaloption']['usertype'],
$objettype."_".$item->getField("id")."_".
$item->getType().$tab);
$entity = new Entity();
if ($entity->getFromDB($this->getEntity())) {
$data["##$objettype.entity##"] = $entity->getField('completename');
$data["##$objettype.shortentity##"] = $entity->getField('name');
$data["##$objettype.entity.phone##"] = $entity->getField('phonenumber');
$data["##$objettype.entity.fax##"] = $entity->getField('fax');
$data["##$objettype.entity.website##"] = $entity->getField('website');
$data["##$objettype.entity.email##"] = $entity->getField('email');
$data["##$objettype.entity.address##"] = $entity->getField('address');
$data["##$objettype.entity.postcode##"] = $entity->getField('postcode');
$data["##$objettype.entity.town##"] = $entity->getField('town');
$data["##$objettype.entity.state##"] = $entity->getField('state');
$data["##$objettype.entity.country##"] = $entity->getField('country');
}
$data["##$objettype.storestatus##"] = $item->getField('status');
$data["##$objettype.status##"] = $item->getStatus($item->getField('status'));
$data["##$objettype.urgency##"] = $item->getUrgencyName($item->getField('urgency'));
$data["##$objettype.impact##"] = $item->getImpactName($item->getField('impact'));
$data["##$objettype.priority##"] = $item->getPriorityName($item->getField('priority'));
$data["##$objettype.time##"] = $item->getActionTime($item->getField('actiontime'));
$data["##$objettype.creationdate##"] = Html::convDateTime($item->getField('date'));
$data["##$objettype.closedate##"] = Html::convDateTime($item->getField('closedate'));
$data["##$objettype.solvedate##"] = Html::convDateTime($item->getField('solvedate'));
$data["##$objettype.duedate##"] = Html::convDateTime($item->getField('time_to_resolve'));
$data["##$objettype.category##"] = '';
if ($item->getField('itilcategories_id')) {
$data["##$objettype.category##"]
= Dropdown::getDropdownName('glpi_itilcategories',
$item->getField('itilcategories_id'));
}
$data["##$objettype.authors##"] = '';
$data['authors'] = [];
if ($item->countUsers(CommonITILActor::REQUESTER)) {
$users = [];
foreach ($item->getUsers(CommonITILActor::REQUESTER) as $tmpusr) {
$uid = $tmpusr['users_id'];
$user_tmp = new User();
if ($uid
&& $user_tmp->getFromDB($uid)) {
$users[] = $user_tmp->getName();
$tmp = [];
$tmp['##author.id##'] = $uid;
$tmp['##author.name##'] = $user_tmp->getName();
if ($user_tmp->getField('locations_id')) {
$tmp['##author.location##']
= Dropdown::getDropdownName('glpi_locations',
$user_tmp->getField('locations_id'));
} else {
$tmp['##author.location##'] = '';
}
if ($user_tmp->getField('usertitles_id')) {
$tmp['##author.title##']
= Dropdown::getDropdownName('glpi_usertitles',
$user_tmp->getField('usertitles_id'));
} else {
$tmp['##author.title##'] = '';
}
if ($user_tmp->getField('usercategories_id')) {
$tmp['##author.category##']
= Dropdown::getDropdownName('glpi_usercategories',
$user_tmp->getField('usercategories_id'));
} else {
$tmp['##author.category##'] = '';
}
$tmp['##author.email##'] = $user_tmp->getDefaultEmail();
$tmp['##author.mobile##'] = $user_tmp->getField('mobile');
$tmp['##author.phone##'] = $user_tmp->getField('phone');
$tmp['##author.phone2##'] = $user_tmp->getField('phone2');
$data['authors'][] = $tmp;
} else {
// Anonymous users only in xxx.authors, not in authors
$users[] = $tmpusr['alternative_email'];
}
}
$data["##$objettype.authors##"] = implode(', ', $users);
}
$data["##$objettype.suppliers##"] = '';
$data['suppliers'] = [];
if ($item->countSuppliers(CommonITILActor::ASSIGN)) {
$suppliers = [];
foreach ($item->getSuppliers(CommonITILActor::ASSIGN) as $tmpspplier) {
$sid = $tmpspplier['suppliers_id'];
$supplier = new Supplier();
if ($sid
&& $supplier->getFromDB($sid)) {
$suppliers[] = $supplier->getName();
$tmp = [];
$tmp['##supplier.id##'] = $sid;
$tmp['##supplier.name##'] = $supplier->getName();
$tmp['##supplier.email##'] = $supplier->getField('email');
$tmp['##supplier.phone##'] = $supplier->getField('phonenumber');
$tmp['##supplier.fax##'] = $supplier->getField('fax');
$tmp['##supplier.website##'] = $supplier->getField('website');
$tmp['##supplier.email##'] = $supplier->getField('email');
$tmp['##supplier.address##'] = $supplier->getField('address');
$tmp['##supplier.postcode##'] = $supplier->getField('postcode');
$tmp['##supplier.town##'] = $supplier->getField('town');
$tmp['##supplier.state##'] = $supplier->getField('state');
$tmp['##supplier.country##'] = $supplier->getField('country');
$tmp['##supplier.comments##'] = $supplier->getField('comment');
$tmp['##supplier.type##'] = '';
if ($supplier->getField('suppliertypes_id')) {
$tmp['##supplier.type##']
= Dropdown::getDropdownName('glpi_suppliertypes',
$supplier->getField('suppliertypes_id'));
}
$data['suppliers'][] = $tmp;
}
}
$data["##$objettype.suppliers##"] = implode(', ', $suppliers);
}
$data["##$objettype.openbyuser##"] = '';
if ($item->getField('users_id_recipient')) {
$user_tmp = new User();
$user_tmp->getFromDB($item->getField('users_id_recipient'));
$data["##$objettype.openbyuser##"] = $user_tmp->getName();
}
$data["##$objettype.lastupdater##"] = '';
if ($item->getField('users_id_lastupdater')) {
$user_tmp = new User();
$user_tmp->getFromDB($item->getField('users_id_lastupdater'));
$data["##$objettype.lastupdater##"] = $user_tmp->getName();
}
$data["##$objettype.assigntousers##"] = '';
if ($item->countUsers(CommonITILActor::ASSIGN)) {
$users = [];
foreach ($item->getUsers(CommonITILActor::ASSIGN) as $tmp) {
$uid = $tmp['users_id'];
$user_tmp = new User();
if ($user_tmp->getFromDB($uid)) {
$users[$uid] = $user_tmp->getName();
}
}
$data["##$objettype.assigntousers##"] = implode(', ', $users);
}
$data["##$objettype.assigntosupplier##"] = '';
if ($item->countSuppliers(CommonITILActor::ASSIGN)) {
$suppliers = [];
foreach ($item->getSuppliers(CommonITILActor::ASSIGN) as $tmp) {
$uid = $tmp['suppliers_id'];
$supplier_tmp = new Supplier();
if ($supplier_tmp->getFromDB($uid)) {
$suppliers[$uid] = $supplier_tmp->getName();
}
}
$data["##$objettype.assigntosupplier##"] = implode(', ', $suppliers);
}
$data["##$objettype.groups##"] = '';
if ($item->countGroups(CommonITILActor::REQUESTER)) {
$groups = [];
foreach ($item->getGroups(CommonITILActor::REQUESTER) as $tmp) {
$gid = $tmp['groups_id'];
$groups[$gid] = Dropdown::getDropdownName('glpi_groups', $gid);
}
$data["##$objettype.groups##"] = implode(', ', $groups);
}
$data["##$objettype.observergroups##"] = '';
if ($item->countGroups(CommonITILActor::OBSERVER)) {
$groups = [];
foreach ($item->getGroups(CommonITILActor::OBSERVER) as $tmp) {
$gid = $tmp['groups_id'];
$groups[$gid] = Dropdown::getDropdownName('glpi_groups', $gid);
}
$data["##$objettype.observergroups##"] = implode(', ', $groups);
}
$data["##$objettype.observerusers##"] = '';
if ($item->countUsers(CommonITILActor::OBSERVER)) {
$users = [];
foreach ($item->getUsers(CommonITILActor::OBSERVER) as $tmp) {
$uid = $tmp['users_id'];
$user_tmp = new User();
if ($uid
&& $user_tmp->getFromDB($uid)) {
$users[] = $user_tmp->getName();
} else {
$users[] = $tmp['alternative_email'];
}
}
$data["##$objettype.observerusers##"] = implode(', ', $users);
}
$data["##$objettype.assigntogroups##"] = '';
if ($item->countGroups(CommonITILActor::ASSIGN)) {
$groups = [];
foreach ($item->getGroups(CommonITILActor::ASSIGN) as $tmp) {
$gid = $tmp['groups_id'];
$groups[$gid] = Dropdown::getDropdownName('glpi_groups', $gid);
}
$data["##$objettype.assigntogroups##"] = implode(', ', $groups);
}
$data["##$objettype.solution.type##"] = '';
$data["##$objettype.solution.description##"] = '';
$itilsolution = new ITILSolution();
$solution = $itilsolution->getFromDBByRequest([
'WHERE' => [
'itemtype' => $objettype,
'items_id' => $item->fields['id']
],
'ORDER' => 'date_creation DESC',
'LIMIT' => 1
]);
if ($solution) {
if ($itilsolution->getField('solutiontypes_id')) {
$data["##$objettype.solution.type##"] = Dropdown::getDropdownName(
'glpi_solutiontypes',
$itilsolution->getField('solutiontypes_id')
);
}
$data["##$objettype.solution.description##"] = $itilsolution->getField('content');
}
// Complex mode
if (!$simple) {
$followup_restrict = [];
$followup_restrict['items_id'] = $item->getField('id');
if (!isset($options['additionnaloption']['show_private'])
|| !$options['additionnaloption']['show_private']) {
$followup_restrict['is_private'] = 0;
}
$followup_restrict['itemtype'] = $objettype;
//Followup infos
$followups = getAllDataFromTable(
'glpi_itilfollowups', [
'WHERE' => $followup_restrict,
'ORDER' => ['date_mod DESC', 'id ASC']
]
);
$data['followups'] = [];
foreach ($followups as $followup) {
$tmp = [];
$tmp['##followup.isprivate##'] = Dropdown::getYesNo($followup['is_private']);
// Check if the author need to be anonymized
if (Entity::getUsedConfig('anonymize_support_agents', $item->getField('entities_id'))
&& ITILFollowup::getById($followup['id'])->isFromSupportAgent()
) {
$tmp['##followup.author##'] = __("Helpdesk");
} else {
$tmp['##followup.author##'] = Html::clean(getUserName($followup['users_id']));
}
$tmp['##followup.requesttype##'] = Dropdown::getDropdownName('glpi_requesttypes',
$followup['requesttypes_id']);
$tmp['##followup.date##'] = Html::convDateTime($followup['date']);
$tmp['##followup.description##'] = $followup['content'];
$data['followups'][] = $tmp;
}
$data["##$objettype.numberoffollowups##"] = count($data['followups']);
$data['log'] = [];
// Use list_limit_max or load the full history ?
foreach (Log::getHistoryData($item, 0, $CFG_GLPI['list_limit_max']) as $log) {
$tmp = [];
$tmp["##$objettype.log.date##"] = $log['date_mod'];
$tmp["##$objettype.log.user##"] = $log['user_name'];
$tmp["##$objettype.log.field##"] = $log['field'];
$tmp["##$objettype.log.content##"] = $log['change'];
$data['log'][] = $tmp;
}
$data["##$objettype.numberoflogs##"] = count($data['log']);
// Get unresolved items
$restrict = [
'NOT' => [
$item->getTable() . '.status' => array_merge(
$item->getSolvedStatusArray(),
$item->getClosedStatusArray()
)
]
];
if ($item->maybeDeleted()) {
$restrict[$item->getTable() . '.is_deleted'] = 0;
}
$data["##$objettype.numberofunresolved##"]
= countElementsInTableForEntity($item->getTable(), $this->getEntity(), $restrict, false);
// Document
$iterator = $DB->request([
'SELECT' => 'glpi_documents.*',
'FROM' => 'glpi_documents',
'LEFT JOIN' => [
'glpi_documents_items' => [
'ON' => [
'glpi_documents_items' => 'documents_id',
'glpi_documents' => 'id'
]
]
],
'WHERE' => [
$item->getAssociatedDocumentsCriteria(),
'timeline_position' => ['>', CommonITILObject::NO_TIMELINE], // skip inlined images
]
]);
$data["documents"] = [];
$addtodownloadurl = '';
if ($item->getType() == 'Ticket') {
$addtodownloadurl = "%2526tickets_id=".$item->fields['id'];
}
while ($row = $iterator->next()) {
$tmp = [];
$tmp['##document.id##'] = $row['id'];
$tmp['##document.name##'] = $row['name'];
$tmp['##document.weblink##']
= $row['link'];
$tmp['##document.url##'] = $this->formatURL($options['additionnaloption']['usertype'],
"document_".$row['id']);
$downloadurl = "/front/document.send.php?docid=".$row['id'];
$tmp['##document.downloadurl##']
= $this->formatURL($options['additionnaloption']['usertype'],
$downloadurl.$addtodownloadurl);
$tmp['##document.heading##']
= Dropdown::getDropdownName('glpi_documentcategories',
$row['documentcategories_id']);
$tmp['##document.filename##']
= $row['filename'];
$data['documents'][] = $tmp;
}
$data["##$objettype.urldocument##"]
= $this->formatURL($options['additionnaloption']['usertype'],
$objettype."_".$item->getField("id").'_Document_Item$1');
$data["##$objettype.numberofdocuments##"]
= count($data['documents']);
//costs infos
$costtype = $item->getType().'Cost';
$costs = $costtype::getCostsSummary($costtype, $item->getField("id"));
$data["##$objettype.costfixed##"] = $costs['costfixed'];
$data["##$objettype.costmaterial##"] = $costs['costmaterial'];
$data["##$objettype.costtime##"] = $costs['costtime'];
$data["##$objettype.totalcost##"] = $costs['totalcost'];
$costs = getAllDataFromTable(
getTableForItemType($costtype), [
'WHERE' => [$item->getForeignKeyField() => $item->getField('id')],
'ORDER' => ['begin_date DESC', 'id ASC']
]
);
$data['costs'] = [];
foreach ($costs as $cost) {
$tmp = [];
$tmp['##cost.name##'] = $cost['name'];
$tmp['##cost.comment##'] = $cost['comment'];
$tmp['##cost.datebegin##'] = Html::convDate($cost['begin_date']);
$tmp['##cost.dateend##'] = Html::convDate($cost['end_date']);
$tmp['##cost.time##'] = $item->getActionTime($cost['actiontime']);
$tmp['##cost.costtime##'] = Html::formatNumber($cost['cost_time']);
$tmp['##cost.costfixed##'] = Html::formatNumber($cost['cost_fixed']);
$tmp['##cost.costmaterial##'] = Html::formatNumber($cost['cost_material']);
$tmp['##cost.totalcost##'] = CommonITILCost::computeTotalCost($cost['actiontime'],
$cost['cost_time'],
$cost['cost_fixed'],
$cost['cost_material']);
$tmp['##cost.budget##'] = Dropdown::getDropdownName('glpi_budgets',
$cost['budgets_id']);
$data['costs'][] = $tmp;
}
$data["##$objettype.numberofcosts##"] = count($data['costs']);
//Task infos
$tasktype = $item->getType().'Task';
$taskobj = new $tasktype();
$restrict = [$item->getForeignKeyField() => $item->getField('id')];
if ($taskobj->maybePrivate()
&& (!isset($options['additionnaloption']['show_private'])
|| !$options['additionnaloption']['show_private'])) {
$restrict['is_private'] = 0;
}
$tasks = getAllDataFromTable(
$taskobj->getTable(), [
'WHERE' => $restrict,
'ORDER' => ['date_mod DESC', 'id ASC']
]
);
$data['tasks'] = [];
foreach ($tasks as $task) {
$tmp = [];
$tmp['##task.id##'] = $task['id'];
if ($taskobj->maybePrivate()) {
$tmp['##task.isprivate##'] = Dropdown::getYesNo($task['is_private']);
}
$tmp['##task.author##'] = Html::clean(getUserName($task['users_id']));
$tmp_taskcatinfo = Dropdown::getDropdownName('glpi_taskcategories',
$task['taskcategories_id'], true, true, false);
$tmp['##task.categoryid##'] = $task['taskcategories_id'];
$tmp['##task.category##'] = $tmp_taskcatinfo['name'];
$tmp['##task.categorycomment##'] = $tmp_taskcatinfo['comment'];
$tmp['##task.date##'] = Html::convDateTime($task['date']);
$tmp['##task.description##'] = $task['content'];
$tmp['##task.time##'] = Ticket::getActionTime($task['actiontime']);
$tmp['##task.status##'] = Planning::getState($task['state']);
$tmp['##task.user##'] = Html::clean(getUserName($task['users_id_tech']));
$tmp['##task.group##']
= Html::clean(Toolbox::clean_cross_side_scripting_deep(Dropdown::getDropdownName("glpi_groups",
$task['groups_id_tech'])), true, 2, false);
$tmp['##task.begin##'] = "";
$tmp['##task.end##'] = "";
if (!is_null($task['begin'])) {
$tmp['##task.begin##'] = Html::convDateTime($task['begin']);
$tmp['##task.end##'] = Html::convDateTime($task['end']);
}
$data['tasks'][] = $tmp;
}
$data["##$objettype.numberoftasks##"] = count($data['tasks']);
}
return $data;
}
function getTags() {
$itemtype = $this->obj->getType();
$objettype = strtolower($itemtype);
//Locales
$tags = [$objettype.'.id' => __('ID'),
$objettype.'.title' => __('Title'),
$objettype.'.url' => __('URL'),
$objettype.'.category' => __('Category'),
$objettype.'.content' => __('Description'),
$objettype.'.description' => sprintf(__('%1$s: %2$s'), $this->obj->getTypeName(1),
__('Description')),
$objettype.'.status' => __('Status'),
$objettype.'.urgency' => __('Urgency'),
$objettype.'.impact' => __('Impact'),
$objettype.'.priority' => __('Priority'),
$objettype.'.time' => __('Total duration'),
$objettype.'.creationdate' => __('Opening date'),
$objettype.'.closedate' => __('Closing date'),
$objettype.'.solvedate' => __('Date of solving'),
$objettype.'.duedate' => __('Time to resolve'),
$objettype.'.authors' => _n('Requester', 'Requesters', Session::getPluralNumber()),
'author.id' => __('Requester ID'),
'author.name' => _n('Requester', 'Requesters', 1),
'author.location' => __('Requester location'),
'author.mobile' => __('Mobile phone'),
'author.phone' => Phone::getTypeName(1),
'author.phone2' => __('Phone 2'),
'author.email' => _n('Email', 'Emails', 1),
'author.title' => _x('person', 'Title'),
'author.category' => __('Category'),
$objettype.'.suppliers' => _n('Supplier', 'Suppliers', Session::getPluralNumber()),
'supplier.id' => __('Supplier ID'),
'supplier.name' => Supplier::getTypeName(1),
'supplier.phone' => Phone::getTypeName(1),
'supplier.fax' => __('Fax'),
'supplier.website' => __('Website'),
'supplier.email' => _n('Email', 'Emails', 1),
'supplier.address' => __('Address'),
'supplier.postcode' => __('Postal code'),
'supplier.town' => __('City'),
'supplier.state' => _x('location', 'State'),
'supplier.country' => __('Country'),
'supplier.comments' => _n('Comment', 'Comments', Session::getPluralNumber()),
'supplier.type' => SupplierType::getTypeName(1),
$objettype.'.openbyuser' => __('Writer'),
$objettype.'.lastupdater' => __('Last updater'),
$objettype.'.assigntousers' => __('Assigned to technicians'),
$objettype.'.assigntosupplier' => __('Assigned to a supplier'),
$objettype.'.groups' => _n('Requester group',
'Requester groups', Session::getPluralNumber()),
$objettype.'.observergroups' => _n('Watcher group', 'Watcher groups', Session::getPluralNumber()),
$objettype.'.assigntogroups' => __('Assigned to groups'),
$objettype.'.solution.type' => SolutionType::getTypeName(1),
$objettype.'.solution.description' => ITILSolution::getTypeName(1),
$objettype.'.observerusers' => _n('Watcher', 'Watchers', Session::getPluralNumber()),
$objettype.'.action' => _n('Event', 'Events', 1),
'followup.date' => __('Opening date'),
'followup.isprivate' => __('Private'),
'followup.author' => __('Writer'),
'followup.description' => __('Description'),
'followup.requesttype' => RequestType::getTypeName(1),
$objettype.'.numberoffollowups' => _x('quantity', 'Number of followups'),
$objettype.'.numberofunresolved' => __('Number of unresolved items'),
$objettype.'.numberofdocuments' => _x('quantity', 'Number of documents'),
$objettype.'.costtime' => __('Time cost'),
$objettype.'.costfixed' => __('Fixed cost'),
$objettype.'.costmaterial' => __('Material cost'),
$objettype.'.totalcost' => __('Total cost'),
$objettype.'.numberofcosts' => __('Number of costs'),
'cost.name' => sprintf(__('%1$s: %2$s'), _n('Cost', 'Costs', 1),
__('Name')),
'cost.comment' => sprintf(__('%1$s: %2$s'), _n('Cost', 'Costs', 1),
__('Comments')),
'cost.datebegin' => sprintf(__('%1$s: %2$s'), _n('Cost', 'Costs', 1),
__('Begin date')),
'cost.dateend' => sprintf(__('%1$s: %2$s'), _n('Cost', 'Costs', 1),
__('End date')),
'cost.time' => sprintf(__('%1$s: %2$s'), _n('Cost', 'Costs', 1),
__('Duration')),
'cost.costtime' => sprintf(__('%1$s: %2$s'), _n('Cost', 'Costs', 1),
__('Time cost')),
'cost.costfixed' => sprintf(__('%1$s: %2$s'), _n('Cost', 'Costs', 1),
__('Fixed cost')),
'cost.costmaterial' => sprintf(__('%1$s: %2$s'), _n('Cost', 'Costs', 1),
__('Material cost')),
'cost.totalcost' => sprintf(__('%1$s: %2$s'), _n('Cost', 'Costs', 1),
__('Total cost')),
'cost.budget' => sprintf(__('%1$s: %2$s'), _n('Cost', 'Costs', 1),
Budget::getTypeName(1)),
'task.author' => __('Writer'),
'task.isprivate' => __('Private'),
'task.date' => __('Opening date'),
'task.description' => __('Description'),
'task.categoryid' => __('Category id'),
'task.category' => __('Category'),
'task.categorycomment' => __('Category comment'),
'task.time' => __('Total duration'),
'task.user' => __('User assigned to task'),
'task.group' => __('Group assigned to task'),
'task.begin' => __('Start date'),
'task.end' => __('End date'),
'task.status' => __('Status'),
$objettype.'.numberoftasks' => _x('quantity', 'Number of tasks'),
$objettype.'.entity.phone' => sprintf(__('%1$s (%2$s)'),
Entity::getTypeName(1), Phone::getTypeName(1)),
$objettype.'.entity.fax' => sprintf(__('%1$s (%2$s)'),
Entity::getTypeName(1), __('Fax')),
$objettype.'.entity.website' => sprintf(__('%1$s (%2$s)'),
Entity::getTypeName(1), __('Website')),
$objettype.'.entity.email' => sprintf(__('%1$s (%2$s)'),
Entity::getTypeName(1), _n('Email', 'Emails', 1)),
$objettype.'.entity.address' => sprintf(__('%1$s (%2$s)'),
Entity::getTypeName(1), __('Address')),
$objettype.'.entity.postcode' => sprintf(__('%1$s (%2$s)'),
Entity::getTypeName(1), __('Postal code')),
$objettype.'.entity.town' => sprintf(__('%1$s (%2$s)'),
Entity::getTypeName(1), __('City')),
$objettype.'.entity.state' => sprintf(__('%1$s (%2$s)'),
Entity::getTypeName(1), _x('location', 'State')),
$objettype.'.entity.country' => sprintf(__('%1$s (%2$s)'),
Entity::getTypeName(1), __('Country')),
];
foreach ($tags as $tag => $label) {
$this->addTagToList(['tag' => $tag,
'label' => $label,
'value' => true,
'events' => parent::TAG_FOR_ALL_EVENTS]);
}
//Foreach global tags
$tags = ['log' => __('Historical'),
'followups' => _n('Followup', 'Followups', Session::getPluralNumber()),
'tasks' => _n('Task', 'Tasks', Session::getPluralNumber()),
'costs' => _n('Cost', 'Costs', Session::getPluralNumber()),
'authors' => _n('Requester', 'Requesters', Session::getPluralNumber()),
'suppliers' => _n('Supplier', 'Suppliers', Session::getPluralNumber())];
foreach ($tags as $tag => $label) {
$this->addTagToList(['tag' => $tag,
'label' => $label,
'value' => false,
'foreach' => true]);
}
//Tags with just lang
$tags = [$objettype.'.days' => _n('Day', 'Days', Session::getPluralNumber()),
$objettype.'.attribution' => __('Assigned to'),
$objettype.'.entity' => Entity::getTypeName(1),
$objettype.'.nocategoryassigned' => __('No defined category'),
$objettype.'.log' => __('Historical'),
$objettype.'.tasks' => _n('Task', 'Tasks', Session::getPluralNumber()),
$objettype.'.costs' => _n('Cost', 'Costs', Session::getPluralNumber())];
foreach ($tags as $tag => $label) {
$this->addTagToList(['tag' => $tag,
'label' => $label,
'value' => false,
'lang' => true]);
}
//Tags without lang
$tags = [$objettype.'.urlapprove' => __('Web link to approval the solution'),
$objettype.'.entity' => sprintf(__('%1$s (%2$s)'),
Entity::getTypeName(1), __('Complete name')),
$objettype.'.shortentity' => sprintf(__('%1$s (%2$s)'),
Entity::getTypeName(1), __('Name')),
$objettype.'.numberoflogs' => sprintf(__('%1$s: %2$s'), __('Historical'),
_x('quantity', 'Number of items')),
$objettype.'.log.date' => sprintf(__('%1$s: %2$s'), __('Historical'),
_n('Date', 'Dates', 1)),
$objettype.'.log.user' => sprintf(__('%1$s: %2$s'), __('Historical'),
User::getTypeName(1)),
$objettype.'.log.field' => sprintf(__('%1$s: %2$s'), __('Historical'),
_n('Field', 'Fields', 1)),
$objettype.'.log.content' => sprintf(__('%1$s: %2$s'), __('Historical'),
_x('name', 'Update')),
'document.url' => sprintf(__('%1$s: %2$s'), Document::getTypeName(1),
__('URL')),
'document.downloadurl' => sprintf(__('%1$s: %2$s'), Document::getTypeName(1),
__('Download URL')),
'document.heading' => sprintf(__('%1$s: %2$s'), Document::getTypeName(1),
__('Heading')),
'document.id' => sprintf(__('%1$s: %2$s'), Document::getTypeName(1),
__('ID')),
'document.filename' => sprintf(__('%1$s: %2$s'), Document::getTypeName(1),
__('File')),
'document.weblink' => sprintf(__('%1$s: %2$s'), Document::getTypeName(1),
__('Web link')),
'document.name' => sprintf(__('%1$s: %2$s'), Document::getTypeName(1),
__('Name')),
$objettype.'.urldocument' => sprintf(__('%1$s: %2$s'),
Document::getTypeName(Session::getPluralNumber()),
__('URL'))];
foreach ($tags as $tag => $label) {
$this->addTagToList(['tag' => $tag,
'label' => $label,
'value' => true,
'lang' => false]);
}
//Tickets with a fixed set of values
$status = $this->obj->getAllStatusArray(false);
$allowed_ticket = [];
foreach ($status as $key => $value) {
$allowed_ticket[] = $key;
}
$tags = [$objettype.'.storestatus' => ['text' => __('Status value in database'),
'allowed_values'
=> $allowed_ticket]];
foreach ($tags as $tag => $label) {
$this->addTagToList(['tag' => $tag,
'label' => $label['text'],
'value' => true,
'lang' => false,
'allowed_values' => $label['allowed_values']]);
}
}
}