Linux server.jmdstrack.com 3.10.0-1160.119.1.el7.tuxcare.els10.x86_64 #1 SMP Fri Oct 11 21:40:41 UTC 2024 x86_64
/ home/ jmdstrac/ public_html/ devices/ src/ |
|
<?php /** * --------------------------------------------------------------------- * * GLPI - Gestionnaire Libre de Parc Informatique * * http://glpi-project.org * * @copyright 2015-2023 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/>. * * --------------------------------------------------------------------- */ /** * NotificationTargetTicket Class * * @since 0.85 **/ class NotificationTargetProject extends NotificationTarget { /** * Get events related to tickets **/ public function getEvents() { $events = ['new' => __('New project'), 'update' => __('Update of a project'), 'delete' => __('Deletion of a project') ]; asort($events); return $events; } public function addAdditionalTargets($event = '') { $this->addTarget(Notification::MANAGER_USER, _n('Manager', 'Managers', 1)); $this->addTarget(Notification::MANAGER_GROUP, __('Manager group')); $this->addTarget(Notification::MANAGER_GROUP_SUPERVISOR, __('Manager of manager group')); $this->addTarget( Notification::MANAGER_GROUP_WITHOUT_SUPERVISOR, __("Manager group except manager users") ); $this->addTarget(Notification::TEAM_USER, __('User of project team')); $this->addTarget(Notification::TEAM_GROUP, __('Group of project team')); $this->addTarget(Notification::TEAM_GROUP_SUPERVISOR, __('Manager of group of project team')); $this->addTarget( Notification::TEAM_GROUP_WITHOUT_SUPERVISOR, __("Group of project team except manager users") ); $this->addTarget(Notification::TEAM_CONTACT, __('Contact of project team')); $this->addTarget(Notification::TEAM_SUPPLIER, __('Supplier of project team')); } /** * @see NotificationTarget::addSpecificTargets() **/ public 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::MANAGER_USER: $this->addItemAuthor(); break; //Send to the manager group of the project case Notification::MANAGER_GROUP: $this->addItemGroup(); break; //Send to the manager group supervisor of the project case Notification::MANAGER_GROUP_SUPERVISOR: $this->addItemGroupSupervisor(); break; //Send to the manager group without supervisor of the project case Notification::MANAGER_GROUP_WITHOUT_SUPERVISOR: $this->addItemGroupWithoutSupervisor(); break; //Send to the users in project team case Notification::TEAM_USER: $this->addTeamUsers(); break; //Send to the groups in project team case Notification::TEAM_GROUP: $this->addTeamGroups(0); break; //Send to the group supervisors in project team case Notification::TEAM_GROUP_SUPERVISOR: $this->addTeamGroups(1); break; //Send to the group without supervisors in project team case Notification::TEAM_GROUP_WITHOUT_SUPERVISOR: $this->addTeamGroups(2); break; //Send to the contacts in project team case Notification::TEAM_CONTACT: $this->addTeamContacts(); break; //Send to the suppliers in project team case Notification::TEAM_SUPPLIER: $this->addTeamSuppliers(); break; } } } /** * Add team users to the notified user list * * @return void **/ public function addTeamUsers() { global $DB; $iterator = $DB->request([ 'SELECT' => 'items_id', 'FROM' => 'glpi_projectteams', 'WHERE' => [ 'itemtype' => 'User', 'projects_id' => $this->obj->fields['id'] ] ]); $user = new User(); foreach ($iterator as $data) { if ($user->getFromDB($data['items_id'])) { $this->addToRecipientsList(['language' => $user->getField('language'), 'users_id' => $user->getField('id') ]); } } } /** * Add team groups to the notified user list * * @param integer $manager 0 all users, 1 only supervisors, 2 all users without supervisors * * @return void **/ public function addTeamGroups($manager) { global $DB; $iterator = $DB->request([ 'SELECT' => 'items_id', 'FROM' => 'glpi_projectteams', 'WHERE' => [ 'itemtype' => 'Group', 'projects_id' => $this->obj->fields['id'] ] ]); foreach ($iterator as $data) { $this->addForGroup($manager, $data['items_id']); } } /** * Add team contacts to the notified user list * * @return void **/ public function addTeamContacts() { global $DB, $CFG_GLPI; $iterator = $DB->request([ 'SELECT' => 'items_id', 'FROM' => 'glpi_projectteams', 'WHERE' => [ 'itemtype' => 'Contact', 'projects_id' => $this->obj->fields['id'] ] ]); $contact = new Contact(); foreach ($iterator as $data) { if ($contact->getFromDB($data['items_id'])) { $this->addToRecipientsList(["email" => $contact->fields["email"], "name" => $contact->getName(), "language" => $CFG_GLPI["language"], 'usertype' => NotificationTarget::ANONYMOUS_USER ]); } } } /** * Add team suppliers to the notified user list * * @return void **/ public function addTeamSuppliers() { global $DB, $CFG_GLPI; $iterator = $DB->request([ 'SELECT' => 'items_id', 'FROM' => 'glpi_projectteams', 'WHERE' => [ 'itemtype' => 'Supplier', 'projects_id' => $this->obj->fields['id'] ] ]); $supplier = new Supplier(); foreach ($iterator as $data) { if ($supplier->getFromDB($data['items_id'])) { $this->addToRecipientsList(["email" => $supplier->fields["email"], "name" => $supplier->getName(), "language" => $CFG_GLPI["language"], 'usertype' => NotificationTarget::ANONYMOUS_USER ]); } } } public function addDataForTemplate($event, $options = []) { global $CFG_GLPI, $DB; //----------- Reservation infos -------------- // $events = $this->getAllEvents(); $item = $this->obj; $this->data['##project.action##'] = $events[$event]; $this->data['##project.url##'] = $this->formatURL( $options['additionnaloption']['usertype'], "Project_" . $item->getField("id") ); $this->data["##project.name##"] = $item->getField('name'); $this->data["##project.code##"] = $item->getField('code'); $this->data["##project.description##"] = $item->getField('content'); $this->data["##project.comments##"] = $item->getField('comment'); $this->data["##project.creationdate##"] = Html::convDateTime($item->getField('date')); $this->data["##project.lastupdatedate##"] = Html::convDateTime($item->getField('date_mod')); $this->data["##project.priority##"] = CommonITILObject::getPriorityName($item->getField('priority')); $this->data["##project.percent##"] = Dropdown::getValueWithUnit($item->getField('percent_done'), "%"); $this->data["##project.planstartdate##"] = Html::convDateTime($item->getField('plan_start_date')); $this->data["##project.planenddate##"] = Html::convDateTime($item->getField('plan_end_date')); $this->data["##project.realstartdate##"] = Html::convDateTime($item->getField('real_start_date')); $this->data["##project.realenddate##"] = Html::convDateTime($item->getField('real_end_date')); $this->data["##project.plannedduration##"] = Html::timestampToString( ProjectTask::getTotalPlannedDurationForProject($item->getID()), false ); $this->data["##project.effectiveduration##"] = Html::timestampToString( ProjectTask::getTotalEffectiveDurationForProject($item->getID()), false ); $entity = new Entity(); $this->data["##project.entity##"] = ''; $this->data["##project.shortentity##"] = ''; if ($entity->getFromDB($this->getEntity())) { $this->data["##project.entity##"] = $entity->getField('completename'); $this->data["##project.shortentity##"] = $entity->getField('name'); } $this->data["##project.father##"] = ''; if ($item->getField('projects_id')) { $this->data["##project.father##"] = Dropdown::getDropdownName( 'glpi_projects', $item->getField('projects_id') ); } $this->data["##project.state##"] = ''; if ($item->getField('projectstates_id')) { $this->data["##project.state##"] = Dropdown::getDropdownName( 'glpi_projectstates', $item->getField('projectstates_id') ); } $this->data["##project.type##"] = ''; if ($item->getField('projecttypes_id')) { $this->data["##project.type##"] = Dropdown::getDropdownName( 'glpi_projecttypes', $item->getField('projecttypes_id') ); } $this->data["##project.manager##"] = ''; if ($item->getField('users_id')) { $user_tmp = new User(); $user_tmp->getFromDB($item->getField('users_id')); $this->data["##project.manager##"] = $user_tmp->getName(); } $this->data["##project.managergroup##"] = ''; if ($item->getField('groups_id')) { $this->data["##project.managergroup##"] = Dropdown::getDropdownName( 'glpi_groups', $item->getField('groups_id') ); } // Team infos $restrict = ['projects_id' => $item->getField('id')]; $items = getAllDataFromTable('glpi_projectteams', $restrict); $this->data['teammembers'] = []; if (count($items)) { foreach ($items as $data) { if ($item2 = getItemForItemtype($data['itemtype'])) { if ($item2->getFromDB($data['items_id'])) { $tmp = []; $tmp['##teammember.itemtype##'] = $item2->getTypeName(); $tmp['##teammember.name##'] = $item2->getName(); $this->data['teammembers'][] = $tmp; } } } } $this->data['##project.numberofteammembers##'] = count($this->data['teammembers']); // Task infos $tasks = getAllDataFromTable( 'glpi_projecttasks', [ 'WHERE' => $restrict, 'ORDER' => ['date_creation DESC', 'id ASC'] ] ); $this->data['tasks'] = []; foreach ($tasks as $task) { $tmp = []; $tmp['##task.creationdate##'] = Html::convDateTime($task['date_creation']); $tmp['##task.lastupdatedate##'] = Html::convDateTime($task['date_mod']); $tmp['##task.name##'] = $task['name']; $tmp['##task.description##'] = $task['content']; $tmp['##task.comments##'] = $task['comment']; $tmp['##task.state##'] = ''; if ($task['projectstates_id']) { $tmp['##task.state##'] = Dropdown::getDropdownName('glpi_projectstates', $task['projectstates_id']); } $tmp['##task.type##'] = ''; if ($task['projecttasktypes_id']) { $tmp['##task.type##'] = Dropdown::getDropdownName('glpi_projecttasktypes', $task['projecttasktypes_id']); } $tmp['##task.percent##'] = Dropdown::getValueWithUnit($task['percent_done'], "%"); $this->data["##task.planstartdate##"] = ''; $this->data["##task.planenddate##"] = ''; $this->data["##task.realstartdate##"] = ''; $this->data["##task.realenddate##"] = ''; if (!is_null($task['plan_start_date'])) { $tmp['##task.planstartdate##'] = Html::convDateTime($task['plan_start_date']); } if (!is_null($task['plan_end_date'])) { $tmp['##task.planenddate##'] = Html::convDateTime($task['plan_end_date']); } if (!is_null($task['real_start_date'])) { $tmp['##task.realstartdate##'] = Html::convDateTime($task['real_start_date']); } if (!is_null($task['real_end_date'])) { $tmp['##task.realenddate##'] = Html::convDateTime($task['real_end_date']); } $this->data['tasks'][] = $tmp; } $this->data["##project.numberoftasks##"] = count($this->data['tasks']); //costs infos $costs = getAllDataFromTable( 'glpi_projectcosts', [ 'WHERE' => $restrict, 'ORDER' => ['begin_date DESC', 'id ASC'] ] ); $this->data['costs'] = []; $this->data["##project.totalcost##"] = 0; 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.cost##'] = Html::formatNumber($cost['cost']); $tmp['##cost.budget##'] = ''; if ($cost['budgets_id']) { $tmp['##cost.budget##'] = Dropdown::getDropdownName('glpi_budgets', $cost['budgets_id']); } $this->data["##project.totalcost##"] += $cost['cost']; $this->data['costs'][] = $tmp; /// TODO add ticket costs ? } $this->data["##project.numberofcosts##"] = count($this->data['costs']); // History infos $this->data['log'] = []; // Use list_limit_max or load the full history ? foreach (Log::getHistoryData($item, 0, $CFG_GLPI['list_limit_max']) as $data) { $tmp = []; $tmp["##project.log.date##"] = $data['date_mod']; $tmp["##project.log.user##"] = $data['user_name']; $tmp["##project.log.field##"] = $data['field']; $tmp["##project.log.content##"] = $data['change']; $this->data['log'][] = $tmp; } $this->data["##project.numberoflogs##"] = count($this->data['log']); // ITIL items information foreach ([Change::class, Problem::class, Ticket::class] as $itemtype) { $values = []; $lc_itemtype = strtolower($itemtype); $restrict = [ 'projects_id' => $item->getField('id'), 'itemtype' => $itemtype, ]; $link_items = getAllDataFromTable(Itil_Project::getTable(), $restrict); if (count($link_items)) { $nitem = new $itemtype(); foreach ($link_items as $data) { if ($nitem->getFromDB($data['items_id'])) { $values[] = [ '##' . $lc_itemtype . '.id##' => $data['items_id'], '##' . $lc_itemtype . '.date##' => $nitem->getField('date'), '##' . $lc_itemtype . '.title##' => $nitem->getField('name'), '##' . $lc_itemtype . '.url##' => $this->formatURL( $options['additionnaloption']['usertype'], $lc_itemtype . '_' . $data['items_id'] ), '##' . $lc_itemtype . '.content##' => $nitem->getField('content') ]; } } } $this->data[$lc_itemtype . 's'] = $values; $this->data['##project.numberof' . $lc_itemtype . 's##'] = count($values); } // 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' => [ 'glpi_documents_items.itemtype' => 'Project', 'glpi_documents_items.items_id' => $item->fields['id'] ] ]); $this->data["documents"] = []; foreach ($iterator as $data) { $tmp = []; $tmp['##document.id##'] = $data['id']; $tmp['##document.name##'] = $data['name']; $tmp['##document.weblink##'] = $data['link']; $tmp['##document.url##'] = $this->formatURL( $options['additionnaloption']['usertype'], "document_" . $data['id'] ); $downloadurl = "/front/document.send.php?docid=" . $data['id']; $tmp['##document.downloadurl##'] = $this->formatURL( $options['additionnaloption']['usertype'], $downloadurl ); $tmp['##document.heading##'] = ''; if ($data['documentcategories_id']) { $tmp['##document.heading##'] = Dropdown::getDropdownName('glpi_documentcategories', $data['documentcategories_id']); } $tmp['##document.filename##'] = $data['filename']; $this->data['documents'][] = $tmp; } $this->data["##project.urldocument##"] = $this->formatURL( $options['additionnaloption']['usertype'], "Project_" . $item->getField("id") . '_Document_Item$1' ); $this->data["##project.numberofdocuments##"] = count($this->data['documents']); // Items infos $items = getAllDataFromTable('glpi_items_projects', $restrict); $this->data['items'] = []; if (count($items)) { foreach ($items as $data) { if ($item2 = getItemForItemtype($data['itemtype'])) { if ($item2->getFromDB($data['items_id'])) { $tmp = []; $tmp['##item.itemtype##'] = $item2->getTypeName(); $tmp['##item.name##'] = $item2->getField('name'); $tmp['##item.serial##'] = $item2->getField('serial'); $tmp['##item.otherserial##'] = $item2->getField('otherserial'); $tmp['##item.contact##'] = $item2->getField('contact'); $tmp['##item.contactnum##'] = $item2->getField('contactnum'); $tmp['##item.location##'] = ''; $tmp['##item.user##'] = ''; $tmp['##item.group##'] = ''; $tmp['##item.model##'] = ''; //Object location if ($item2->isField('locations_id') && $item_loc_id = $item2->getField('locations_id')) { $tmp['##item.location##'] = Dropdown::getDropdownName('glpi_locations', $item_loc_id); } //Object user if ($item2->getField('users_id')) { $user_tmp = new User(); if ($user_tmp->getFromDB($item2->getField('users_id'))) { $tmp['##item.user##'] = $user_tmp->getName(); } } //Object group if ($item2->getField('groups_id')) { $tmp['##item.group##'] = Dropdown::getDropdownName( 'glpi_groups', $item2->getField('groups_id') ); } $modeltable = getSingular($item2->getTable()) . "models"; $modelfield = getForeignKeyFieldForTable($modeltable); if ($item2->isField($modelfield)) { $tmp['##item.model##'] = $item2->getField($modelfield); } $this->data['items'][] = $tmp; } } } } $this->data['##project.numberofitems##'] = count($this->data['items']); $this->getTags(); foreach ($this->tag_descriptions[NotificationTarget::TAG_LANGUAGE] as $tag => $values) { if (!isset($this->data[$tag])) { $this->data[$tag] = $values['label']; } } } public function getTags() { $tags_all = ['project.url' => __('URL'), 'project.action' => _n('Event', 'Events', 1), 'project.name' => __('Name'), 'project.code' => __('Code'), 'project.description' => __('Description'), 'project.comments' => __('Comments'), 'project.creationdate' => __('Creation date'), 'project.lastupdatedate' => __('Last update'), 'project.planstartdate' => __('Planned start date'), 'project.planenddate' => __('Planned end date'), 'project.realstartdate' => __('Real start date'), 'project.realenddate' => __('Real end date'), 'project.priority' => __('Priority'), 'project.father' => __('Father'), 'project.manager' => _n('Manager', 'Managers', 1), 'project.managergroup' => __('Manager group'), 'project.type' => _n('Type', 'Types', 1), 'project.state' => _x('item', 'State'), 'project.percent' => __('Percent done'), 'project.plannedduration' => __('Planned duration'), 'project.effectiveduration' => __('Effective duration'), 'project.numberoftasks' => _x('quantity', 'Number of tasks'), 'project.numberofteammembers' => _x('quantity', 'Number of team members'), 'task.date' => __('Opening date'), 'task.name' => __('Name'), 'task.description' => __('Description'), 'task.comments' => __('Comments'), 'task.creationdate' => __('Creation date'), 'task.lastupdatedate' => __('Last update'), 'task.type' => _n('Type', 'Types', 1), 'task.state' => _x('item', 'State'), 'task.percent' => __('Percent done'), 'task.planstartdate' => __('Planned start date'), 'task.planenddate' => __('Planned end date'), 'task.realstartdate' => __('Real start date'), 'task.realenddate' => __('Real end date'), 'project.totalcost' => __('Total cost'), 'project.numberofcosts' => __('Number of costs'), 'project.numberoflogs' => sprintf( __('%1$s: %2$s'), __('Historical'), _x('quantity', 'Number of items') ), 'project.log.date' => sprintf( __('%1$s: %2$s'), __('Historical'), _n('Date', 'Dates', 1) ), 'project.log.user' => sprintf( __('%1$s: %2$s'), __('Historical'), User::getTypeName(1) ), 'project.log.field' => sprintf( __('%1$s: %2$s'), __('Historical'), _n('Field', 'Fields', 1) ), 'project.log.content' => sprintf( __('%1$s: %2$s'), __('Historical'), _x('name', 'Update') ), 'project.numberofchanges' => _x('quantity', 'Number of changes'), 'project.numberofproblems' => _x('quantity', 'Number of problems'), 'project.numberoftickets' => _x('quantity', 'Number of tickets'), 'project.numberofdocuments' => _x('quantity', 'Number of documents'), 'item.name' => _n('Associated item', 'Associated items', 1), 'item.serial' => __('Serial number'), 'item.otherserial' => __('Inventory number'), 'item.location' => Location::getTypeName(1), 'item.model' => _n('Model', 'Models', 1), 'item.contact' => __('Alternate username'), 'item.contactnumber' => __('Alternate username number'), 'item.user' => User::getTypeName(1), 'item.group' => Group::getTypeName(1) ]; foreach ($tags_all as $tag => $label) { $this->addTagToList(['tag' => $tag, 'label' => $label, 'value' => true ]); } //Tags without lang $tags = [ 'change.id' => sprintf(__('%1$s: %2$s'), Change::getTypeName(1), __('ID')), 'change.date' => sprintf(__('%1$s: %2$s'), Change::getTypeName(1), _n('Date', 'Dates', 1)), 'change.url' => sprintf(__('%1$s: %2$s'), Change::getTypeName(1), ('URL')), 'change.title' => sprintf(__('%1$s: %2$s'), Change::getTypeName(1), __('Title')), 'change.content' => sprintf(__('%1$s: %2$s'), Change::getTypeName(1), __('Description')), 'problem.id' => sprintf(__('%1$s: %2$s'), Problem::getTypeName(1), __('ID')), 'problem.date' => sprintf(__('%1$s: %2$s'), Problem::getTypeName(1), _n('Date', 'Dates', 1)), 'problem.url' => sprintf(__('%1$s: %2$s'), Problem::getTypeName(1), ('URL')), 'problem.title' => sprintf(__('%1$s: %2$s'), Problem::getTypeName(1), __('Title')), 'problem.content' => sprintf(__('%1$s: %2$s'), Problem::getTypeName(1), __('Description')), 'ticket.id' => sprintf(__('%1$s: %2$s'), Ticket::getTypeName(1), __('ID')), 'ticket.date' => sprintf(__('%1$s: %2$s'), Ticket::getTypeName(1), _n('Date', 'Dates', 1)), 'ticket.url' => sprintf(__('%1$s: %2$s'), Ticket::getTypeName(1), ('URL')), 'ticket.title' => sprintf(__('%1$s: %2$s'), Ticket::getTypeName(1), __('Title')), 'ticket.content' => sprintf(__('%1$s: %2$s'), Ticket::getTypeName(1), __('Description')), '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.cost' => _n('Cost', 'Costs', 1), 'cost.budget' => sprintf(__('%1$s: %2$s'), _n('Cost', 'Costs', 1), Budget::getTypeName(1)), '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')), 'project.urldocument' => sprintf( __('%1$s: %2$s'), Document::getTypeName(Session::getPluralNumber()), __('URL') ), 'project.entity' => sprintf(__('%1$s (%2$s)'), Entity::getTypeName(1), __('Complete name')), 'project.shortentity' => sprintf(__('%1$s (%2$s)'), Entity::getTypeName(1), __('Name')), 'teammember.name' => sprintf( __('%1$s: %2$s'), _n('Team member', 'Team members', 1), __('Name') ), 'teammember.itemtype' => sprintf( __('%1$s: %2$s'), _n('Team member', 'Team members', 1), _n('Type', 'Types', 1) ), ]; foreach ($tags as $tag => $label) { $this->addTagToList(['tag' => $tag, 'label' => $label, 'value' => true, 'lang' => false ]); } //Tags with just lang $tags = ['project.entity' => Entity::getTypeName(1), 'project.log' => __('Historical'), 'project.tasks' => _n('Task', 'Tasks', Session::getPluralNumber()), 'project.team' => ProjectTeam::getTypeName(1), 'project.costs' => _n('Cost', 'Costs', Session::getPluralNumber()), 'project.changes' => _n('Change', 'Changes', Session::getPluralNumber()), 'project.problems' => Problem::getTypeName(Session::getPluralNumber()), 'project.tickets' => _n('Ticket', 'Tickets', Session::getPluralNumber()), 'project.items' => _n('Item', 'Items', Session::getPluralNumber()) ]; foreach ($tags as $tag => $label) { $this->addTagToList(['tag' => $tag, 'label' => $label, 'value' => false, 'lang' => true ]); } //Foreach global tags $tags = ['log' => __('Historical'), 'tasks' => _n('Task', 'Tasks', Session::getPluralNumber()), 'costs' => _n('Cost', 'Costs', Session::getPluralNumber()), 'changes' => _n('Change', 'Changes', Session::getPluralNumber()), 'problems' => Problem::getTypeName(Session::getPluralNumber()), 'tickets' => _n('Ticket', 'Tickets', Session::getPluralNumber()), 'teammembers' => _n('Team member', 'Team members', Session::getPluralNumber()), 'items' => _n('Item', 'Items', Session::getPluralNumber()) ]; foreach ($tags as $tag => $label) { $this->addTagToList(['tag' => $tag, 'label' => $label, 'value' => false, 'foreach' => true ]); } asort($this->tag_descriptions); } }