grthtrhthjhtyjytjytkergtrhtrjytjerhrfh4:24 29/09/2026. -------------------------------------------------------------------------- */ /** @file * @brief */ if (!defined('GLPI_ROOT')) { die("Sorry. You can't access this file directly"); } class RuleTicket extends Rule { // From Rule static $rightname = 'rule_ticket'; public $can_sort = true; const PARENT = 1024; const ONADD = 1; const ONUPDATE = 2; function getTitle() { return __('Business rules for tickets'); } function maybeRecursive() { return true; } function isEntityAssign() { return true; } function canUnrecurs() { return true; } function maxActionsCount() { return count($this->getActions()); } /** * @since version 0.85 **/ static function getConditionsArray() { return array(static::ONADD => __('Add'), static::ONUPDATE => __('Update'), static::ONADD|static::ONUPDATE => sprintf(__('%1$s / %2$s'), __('Add'), __('Update'))); } /** * display title for action form * * @since version 0.84.3 **/ function getTitleAction() { parent::getTitleAction(); $showwarning = false; if (isset($this->actions)) { foreach ($this->actions as $key => $val) { if (isset($val->fields['field'])) { if (in_array($val->fields['field'], array('impact', 'urgency'))) { $showwarning = true; } } } } if ($showwarning) { echo ""; echo "\n"; echo "
". __('Urgency or impact used in actions, think to add Prioriy: recompute action if needed.'). "

"; } } /** * @param $params **/ function addSpecificParamsForPreview($params) { if (!isset($params["entities_id"])) { $params["entities_id"] = $_SESSION["glpiactive_entity"]; } return $params; } /** * Function used to display type specific criterias during rule's preview * * @param $fields fields values **/ function showSpecificCriteriasForPreview($fields) { $entity_as_criteria = false; foreach ($this->criterias as $criteria) { if ($criteria->fields['criteria'] == 'entities_id') { $entity_as_criteria = true; break; } } if (!$entity_as_criteria) { echo ""; } } /** * @param $output * @param $params **/ function executeActions($output,$params) { if (count($this->actions)) { foreach ($this->actions as $action) { switch ($action->fields["action_type"]) { case "send" : $ticket = new Ticket(); if ($ticket->getFromDB($output['id'])) { NotificationEvent::raiseEvent('recall', $ticket); } break; case "add_validation" : if (isset($output['_add_validation']) && !is_array($output['_add_validation'])) { $output['_add_validation'] = array($output['_add_validation']); } switch ($action->fields['field']) { case 'users_id_validate_requester_supervisor' : $output['_add_validation'][] = 'requester_supervisor'; break; case 'users_id_validate_assign_supervisor' : $output['_add_validation'][] = 'assign_supervisor'; break; case 'groups_id_validate' : $output['_add_validation']['group'][] = $action->fields["value"]; break; case 'users_id_validate' : $output['_add_validation'][] = $action->fields["value"]; break; case 'validation_percent' : $output[$action->fields["field"]] = $action->fields["value"]; break; default : $output['_add_validation'][] = $action->fields["value"]; break; } break; case "assign" : $output[$action->fields["field"]] = $action->fields["value"]; // Special case of users_id_requester if ($action->fields["field"] === '_users_id_requester') { // Add groups of requester if (!isset($output['_groups_id_of_requester'])) { $output['_groups_id_of_requester'] = array(); } foreach (Group_User::getUserGroups($action->fields["value"]) as $g) { $output['_groups_id_of_requester'][$g['id']] = $g['id']; } } break; case "append" : $actions = $this->getActions(); $value = $action->fields["value"]; if (isset($actions[$action->fields["field"]]["appendtoarray"]) && isset($actions[$action->fields["field"]]["appendtoarrayfield"])) { $value = $actions[$action->fields["field"]]["appendtoarray"]; $value[$actions[$action->fields["field"]]["appendtoarrayfield"]] = $action->fields["value"]; } $output[$actions[$action->fields["field"]]["appendto"]][] = $value; // Special case of users_id_requester if ($action->fields["field"] === '_users_id_requester') { // Add groups of requester if (!isset($output['_groups_id_of_requester'])) { $output['_groups_id_of_requester'] = array(); } foreach (Group_User::getUserGroups($action->fields["value"]) as $g) { $output['_groups_id_of_requester'][$g['id']] = $g['id']; } } break; case 'fromuser' : if (($action->fields['field'] == 'locations_id') && isset($output['users_locations'])) { $output['locations_id'] = $output['users_locations']; } break; case 'fromitem' : if ($action->fields['field'] == 'locations_id' && isset($output['items_locations'])) { $output['locations_id'] = $output['items_locations']; } if ($action->fields['field'] == '_groups_id_requester' && isset($output['items_groups'])) { $output['_groups_id_requester'] = $output['items_groups']; } break; case 'compute' : // Value could be not set (from test) $urgency = (isset($output['urgency'])?$output['urgency']:3); $impact = (isset($output['impact'])?$output['impact']:3); // Apply priority_matrix from config $output['priority'] = Ticket::computePriority($urgency, $impact); break; case "affectbyip" : case "affectbyfqdn" : case "affectbymac" : if (!isset($output["entities_id"])) { $output["entities_id"] = $params["entities_id"]; } if (isset($this->regex_results[0])) { $regexvalue = RuleAction::getRegexResultById($action->fields["value"], $this->regex_results[0]); } else { $regexvalue = $action->fields["value"]; } switch ($action->fields["action_type"]) { case "affectbyip" : $result = IPAddress::getUniqueItemByIPAddress($regexvalue, $output["entities_id"]); break; case "affectbyfqdn" : $result= FQDNLabel::getUniqueItemByFQDN($regexvalue, $output["entities_id"]); break; case "affectbymac" : $result = NetworkPortInstantiation::getUniqueItemByMac($regexvalue, $output["entities_id"]); break; default: $result = array(); } if (!empty($result)) { $output["items_id"] = array(); $output["items_id"][$result["itemtype"]][] = $result["id"]; } break; } } } return $output; } /** * @param $output **/ function preProcessPreviewResults($output) { $output = parent::preProcessPreviewResults($output); return Ticket::showPreviewAssignAction($output); } function getCriterias() { static $criterias = array(); if (count($criterias)) { return $criterias; } $criterias['name']['table'] = 'glpi_tickets'; $criterias['name']['field'] = 'name'; $criterias['name']['name'] = __('Title'); $criterias['name']['linkfield'] = 'name'; $criterias['content']['table'] = 'glpi_tickets'; $criterias['content']['field'] = 'content'; $criterias['content']['name'] = __('Description'); $criterias['content']['linkfield'] = 'content'; $criterias['itilcategories_id']['table'] = 'glpi_itilcategories'; $criterias['itilcategories_id']['field'] = 'name'; $criterias['itilcategories_id']['name'] = __('Category'); $criterias['itilcategories_id']['linkfield'] = 'itilcategories_id'; $criterias['itilcategories_id']['type'] = 'dropdown'; $criterias['type']['table'] = 'glpi_tickets'; $criterias['type']['field'] = 'type'; $criterias['type']['name'] = __('Type'); $criterias['type']['linkfield'] = 'type'; $criterias['type']['type'] = 'dropdown_tickettype'; $criterias['_users_id_requester']['table'] = 'glpi_users'; $criterias['_users_id_requester']['field'] = 'name'; $criterias['_users_id_requester']['name'] = __('Requester'); $criterias['_users_id_requester']['linkfield'] = '_users_id_requester'; $criterias['_users_id_requester']['type'] = 'dropdown_users'; $criterias['_users_id_requester']['linked_criteria'] = '_groups_id_of_requester'; $criterias['_groups_id_of_requester']['table'] = 'glpi_groups'; $criterias['_groups_id_of_requester']['field'] = 'completename'; $criterias['_groups_id_of_requester']['name'] = __('Requester in group'); $criterias['_groups_id_of_requester']['linkfield'] = '_groups_id_of_requester'; $criterias['_groups_id_of_requester']['type'] = 'dropdown'; $criterias['users_locations']['table'] = 'glpi_locations'; $criterias['users_locations']['field'] = 'completename'; $criterias['users_locations']['name'] = __('Requester location'); $criterias['users_locations']['linkfield'] = 'users_locations'; $criterias['users_locations']['type'] = 'dropdown'; $criterias['items_locations']['table'] = 'glpi_locations'; $criterias['items_locations']['field'] = 'completename'; $criterias['items_locations']['name'] = __('Item location'); $criterias['items_locations']['linkfield'] = 'items_locations'; $criterias['items_locations']['type'] = 'dropdown'; $criterias['items_groups']['table'] = 'glpi_groups'; $criterias['items_groups']['field'] = 'completename'; $criterias['items_groups']['name'] = __('Item group'); $criterias['items_groups']['linkfield'] = 'items_groups'; $criterias['items_groups']['type'] = 'dropdown'; $criterias['locations_id']['table'] = 'glpi_locations'; $criterias['locations_id']['field'] = 'completename'; $criterias['locations_id']['name'] = __('Ticket location'); $criterias['locations_id']['linkfield'] = 'locations_id'; $criterias['locations_id']['type'] = 'dropdown'; $criterias['_groups_id_requester']['table'] = 'glpi_groups'; $criterias['_groups_id_requester']['field'] = 'completename'; $criterias['_groups_id_requester']['name'] = __('Requester group'); $criterias['_groups_id_requester']['linkfield'] = '_groups_id_requester'; $criterias['_groups_id_requester']['type'] = 'dropdown'; $criterias['_users_id_assign']['table'] = 'glpi_users'; $criterias['_users_id_assign']['field'] = 'name'; $criterias['_users_id_assign']['name'] = __('Technician'); $criterias['_users_id_assign']['linkfield'] = '_users_id_assign'; $criterias['_users_id_assign']['type'] = 'dropdown_users'; $criterias['_groups_id_assign']['table'] = 'glpi_groups'; $criterias['_groups_id_assign']['field'] = 'completename'; $criterias['_groups_id_assign']['name'] = __('Technician group'); $criterias['_groups_id_assign']['linkfield'] = '_groups_id_assign'; $criterias['_groups_id_assign']['type'] = 'dropdown'; $criterias['_groups_id_assign']['condition'] = '`is_assign`'; $criterias['_suppliers_id_assign']['table'] = 'glpi_suppliers'; $criterias['_suppliers_id_assign']['field'] = 'name'; $criterias['_suppliers_id_assign']['name'] = __('Assigned to a supplier'); $criterias['_suppliers_id_assign']['linkfield'] = '_suppliers_id_assign'; $criterias['_suppliers_id_assign']['type'] = 'dropdown'; $criterias['_users_id_observer']['table'] = 'glpi_users'; $criterias['_users_id_observer']['field'] = 'name'; $criterias['_users_id_observer']['name'] = __('Watcher'); $criterias['_users_id_observer']['linkfield'] = '_users_id_observer'; $criterias['_users_id_observer']['type'] = 'dropdown_users'; $criterias['_groups_id_observer']['table'] = 'glpi_groups'; $criterias['_groups_id_observer']['field'] = 'completename'; $criterias['_groups_id_observer']['name'] = __('Watcher group'); $criterias['_groups_id_observer']['linkfield'] = '_groups_id_observer'; $criterias['_groups_id_observer']['type'] = 'dropdown'; $criterias['requesttypes_id']['table'] = 'glpi_requesttypes'; $criterias['requesttypes_id']['field'] = 'name'; $criterias['requesttypes_id']['name'] = __('Request source'); $criterias['requesttypes_id']['linkfield'] = 'requesttypes_id'; $criterias['requesttypes_id']['type'] = 'dropdown'; $criterias['itemtype']['table'] = 'glpi_tickets'; $criterias['itemtype']['field'] = 'itemtype'; $criterias['itemtype']['name'] = __('Item type'); $criterias['itemtype']['linkfield'] = 'itemtype'; $criterias['itemtype']['type'] = 'dropdown_tracking_itemtype'; $criterias['entities_id']['table'] = 'glpi_entities'; $criterias['entities_id']['field'] = 'name'; $criterias['entities_id']['name'] = __('Entity'); $criterias['entities_id']['linkfield'] = 'entities_id'; $criterias['entities_id']['type'] = 'dropdown'; $criterias['urgency']['name'] = __('Urgency'); $criterias['urgency']['type'] = 'dropdown_urgency'; $criterias['impact']['name'] = __('Impact'); $criterias['impact']['type'] = 'dropdown_impact'; $criterias['priority']['name'] = __('Priority'); $criterias['priority']['type'] = 'dropdown_priority'; $criterias['_mailgate']['table'] = 'glpi_mailcollectors'; $criterias['_mailgate']['field'] = 'name'; $criterias['_mailgate']['name'] = __('Mails receiver'); $criterias['_mailgate']['linkfield'] = '_mailgate'; $criterias['_mailgate']['type'] = 'dropdown'; $criterias['_x-priority']['name'] = __('X-Priority email header'); $criterias['_x-priority']['table'] = ''; $criterias['_x-priority']['type'] = 'text'; $criterias['slts_ttr_id']['table'] = 'glpi_slts'; $criterias['slts_ttr_id']['field'] = 'name'; $criterias['slts_ttr_id']['name'] = sprintf(__('%1$s %2$s'), __('SLT'), __('Time to resolve')); $criterias['slts_ttr_id']['linkfield'] = 'slts_ttr_id'; $criterias['slts_ttr_id']['type'] = 'dropdown'; $criterias['slts_ttr_id']['condition'] = "`glpi_slts`.`type` = '".SLT::TTR."'"; $criterias['slts_tto_id']['table'] = 'glpi_slts'; $criterias['slts_tto_id']['field'] = 'name'; $criterias['slts_tto_id']['name'] = sprintf(__('%1$s %2$s'), __('SLT'), __('Time to own')); $criterias['slts_tto_id']['linkfield'] = 'slts_tto_id'; $criterias['slts_tto_id']['type'] = 'dropdown'; $criterias['slts_tto_id']['condition'] = "`glpi_slts`.`type` = '".SLT::TTO."'"; return $criterias; } function getActions() { $actions = array(); $actions['itilcategories_id']['name'] = __('Category'); $actions['itilcategories_id']['type'] = 'dropdown'; $actions['itilcategories_id']['table'] = 'glpi_itilcategories'; $actions['type']['name'] = __('Type'); $actions['type']['table'] = 'glpi_tickets'; $actions['type']['type'] = 'dropdown_tickettype'; $actions['_users_id_requester']['name'] = __('Requester'); $actions['_users_id_requester']['type'] = 'dropdown_users'; $actions['_users_id_requester']['force_actions'] = array('assign', 'append'); $actions['_users_id_requester']['permitseveral'] = array('append'); $actions['_users_id_requester']['appendto'] = '_additional_requesters'; $actions['_users_id_requester']['appendtoarray'] = array('use_notification' => 1); $actions['_users_id_requester']['appendtoarrayfield'] = 'users_id'; $actions['_groups_id_requester']['name'] = __('Requester group'); $actions['_groups_id_requester']['type'] = 'dropdown'; $actions['_groups_id_requester']['table'] = 'glpi_groups'; $actions['_groups_id_requester']['condition'] = '`is_requester`'; $actions['_groups_id_requester']['force_actions'] = array('assign', 'append', 'fromitem'); $actions['_groups_id_requester']['permitseveral'] = array('append'); $actions['_groups_id_requester']['appendto'] = '_additional_groups_requesters'; $actions['_users_id_assign']['name'] = __('Technician'); $actions['_users_id_assign']['type'] = 'dropdown_assign'; $actions['_users_id_assign']['force_actions'] = array('assign', 'append'); $actions['_users_id_assign']['permitseveral'] = array('append'); $actions['_users_id_assign']['appendto'] = '_additional_assigns'; $actions['_users_id_assign']['appendtoarray'] = array('use_notification' => 1); $actions['_users_id_assign']['appendtoarrayfield'] = 'users_id'; $actions['_groups_id_assign']['table'] = 'glpi_groups'; $actions['_groups_id_assign']['name'] = __('Technician group'); $actions['_groups_id_assign']['type'] = 'dropdown'; $actions['_groups_id_assign']['condition'] = '`is_assign`'; $actions['_groups_id_assign']['force_actions'] = array('assign', 'append'); $actions['_groups_id_assign']['permitseveral'] = array('append'); $actions['_groups_id_assign']['appendto'] = '_additional_groups_assigns'; $actions['_suppliers_id_assign']['table'] = 'glpi_suppliers'; $actions['_suppliers_id_assign']['name'] = __('Assigned to a supplier'); $actions['_suppliers_id_assign']['type'] = 'dropdown'; $actions['_suppliers_id_assign']['force_actions'] = array('assign', 'append'); $actions['_suppliers_id_assign']['permitseveral'] = array('append'); $actions['_suppliers_id_assign']['appendto'] = '_additional_suppliers_assigns'; $actions['_users_id_observer']['name'] = __('Watcher'); $actions['_users_id_observer']['type'] = 'dropdown_users'; $actions['_users_id_observer']['force_actions'] = array('assign', 'append'); $actions['_users_id_observer']['permitseveral'] = array('append'); $actions['_users_id_observer']['appendto'] = '_additional_observers'; $actions['_users_id_observer']['appendtoarray'] = array('use_notification' => 1); $actions['_users_id_observer']['appendtoarrayfield'] = 'users_id'; $actions['_groups_id_observer']['table'] = 'glpi_groups'; $actions['_groups_id_observer']['name'] = __('Watcher group'); $actions['_groups_id_observer']['type'] = 'dropdown'; $actions['_groups_id_observer']['condition'] = '`is_requester`'; $actions['_groups_id_observer']['force_actions'] = array('assign', 'append'); $actions['_groups_id_observer']['permitseveral'] = array('append'); $actions['_groups_id_observer']['appendto'] = '_additional_groups_observers'; $actions['urgency']['name'] = __('Urgency'); $actions['urgency']['type'] = 'dropdown_urgency'; $actions['impact']['name'] = __('Impact'); $actions['impact']['type'] = 'dropdown_impact'; $actions['priority']['name'] = __('Priority'); $actions['priority']['type'] = 'dropdown_priority'; $actions['priority']['force_actions'] = array('assign', 'compute'); $actions['status']['name'] = __('Status'); $actions['status']['type'] = 'dropdown_status'; $actions['affectobject']['name'] = _n('Associated element', 'Associated elements', Session::getPluralNumber()); $actions['affectobject']['type'] = 'text'; $actions['affectobject']['force_actions'] = array('affectbyip', 'affectbyfqdn', 'affectbymac'); $actions['slts_ttr_id']['table'] = 'glpi_slts'; $actions['slts_ttr_id']['field'] = 'name'; $actions['slts_ttr_id']['name'] = sprintf(__('%1$s %2$s'), __('SLT'), __('Time to resolve')); $actions['slts_ttr_id']['linkfield'] = 'slts_ttr_id'; $actions['slts_ttr_id']['type'] = 'dropdown'; $actions['slts_ttr_id']['condition'] = "`glpi_slts`.`type` = '".SLT::TTR."'"; $actions['slts_tto_id']['table'] = 'glpi_slts'; $actions['slts_tto_id']['field'] = 'name'; $actions['slts_tto_id']['name'] = sprintf(__('%1$s %2$s'), __('SLT'), __('Time to own')); $actions['slts_tto_id']['linkfield'] = 'slts_tto_id'; $actions['slts_tto_id']['type'] = 'dropdown'; $actions['slts_tto_id']['condition'] = "`glpi_slts`.`type` = '".SLT::TTO."'"; $actions['users_id_validate']['name'] = sprintf(__('%1$s - %2$s'), __('Send an approval request'), __('User')); $actions['users_id_validate']['type'] = 'dropdown_users_validate'; $actions['users_id_validate']['force_actions'] = array('add_validation'); $actions['groups_id_validate']['name'] = sprintf(__('%1$s - %2$s'), __('Send an approval request'), __('Group')); $actions['groups_id_validate']['type'] = 'dropdown_groups_validate'; $actions['groups_id_validate']['force_actions'] = array('add_validation'); $actions['validation_percent']['name'] = sprintf(__('%1$s - %2$s'), __('Send an approval request'), __('Minimum validation required')); $actions['validation_percent']['type'] = 'dropdown_validation_percent'; $actions['users_id_validate_requester_supervisor']['name'] = __('Approval request to requester group manager'); $actions['users_id_validate_requester_supervisor']['type'] = 'yesno'; $actions['users_id_validate_requester_supervisor']['force_actions'] = array('add_validation'); $actions['users_id_validate_assign_supervisor']['name'] = __('Approval request to technician group manager'); $actions['users_id_validate_assign_supervisor']['type'] = 'yesno'; $actions['users_id_validate_assign_supervisor']['force_actions'] = array('add_validation'); $actions['locations_id']['name'] = __('Location'); $actions['locations_id']['type'] = 'dropdown'; $actions['locations_id']['table'] = 'glpi_locations'; $actions['locations_id']['force_actions'] = array('assign', 'fromuser', 'fromitem'); $actions['requesttypes_id']['name'] = __('Request source'); $actions['requesttypes_id']['type'] = 'dropdown'; $actions['requesttypes_id']['table'] = 'glpi_requesttypes'; return $actions; } /** * @since version 0.85 * * @see commonDBTM::getRights() **/ function getRights($interface='central') { $values = parent::getRights(); //TRANS: short for : Business rules for ticket (entity parent) $values[self::PARENT] = array('short' => __('Parent business'), 'long' => __('Business rules for ticket (entity parent)')); return $values; } }