grthtrhthjhtyjytjytkergtrhtrjytjerhrfh4:24 29/09/2026. -------------------------------------------------------------------------- */ /** @file * @brief */ if (!defined('GLPI_ROOT')) { die("Sorry. You can't access this file directly"); } /** * Notification Class **/ class Notification extends CommonDBTM { // MAILING TYPE //Notification to a user (sse mailing users type below) const USER_TYPE = 1; //Notification to users of a profile const PROFILE_TYPE = 2; //Notification to users of a group const GROUP_TYPE = 3; //Notification to the people in charge of the database synchronisation const MAILING_TYPE = 4; //Notification to the supervisor of a group const SUPERVISOR_GROUP_TYPE = 5; //Notification to all users of a group except supervisor const GROUP_WITHOUT_SUPERVISOR_TYPE = 6; // MAILING USERS TYPE //Notification to the GLPI global administrator const GLOBAL_ADMINISTRATOR = 1; //Notification to the technicial who's assign to a ticket const ASSIGN_TECH = 2; //Notification to the owner of the item const AUTHOR = 3; //Notification to the technician previously in charge of the ticket const OLD_TECH_IN_CHARGE = 4; //Notification to the technician in charge of the item const ITEM_TECH_IN_CHARGE = 5; //Notification to the item's user const ITEM_USER = 6; //Notification to the ticket's recipient const RECIPIENT = 7; //Notificartion to the ticket's assigned supplier const SUPPLIER = 8; //Notification to the ticket's assigned group const ASSIGN_GROUP = 9; //Notification to the supervisor of the ticket's assigned group const SUPERVISOR_ASSIGN_GROUP = 10; //Notification to the entity administrator const ENTITY_ADMINISTRATOR = 11; //Notification to the supervisor of the ticket's requester group const SUPERVISOR_REQUESTER_GROUP = 12; //Notification to the ticket's requester group const REQUESTER_GROUP = 13; //Notification to the ticket's validation approver const VALIDATION_APPROVER = 14; //Notification to the ticket's validation requester const VALIDATION_REQUESTER = 15; //Notification to the task assigned user const TASK_ASSIGN_TECH = 16; //Notification to the task author const TASK_AUTHOR = 17; //Notification to the followup author const FOLLOWUP_AUTHOR = 18; //Notification to the user const USER = 19; //Notification to the ticket's observer group const OBSERVER_GROUP = 20; //Notification to the ticket's observer user const OBSERVER = 21; //Notification to the supervisor of the ticket's observer group const SUPERVISOR_OBSERVER_GROUP = 22; //Notification to the group of technicians in charge of the item const ITEM_TECH_GROUP_IN_CHARGE = 23; // Notification to the ticket's assigned group without supervisor const ASSIGN_GROUP_WITHOUT_SUPERVISOR = 24; //Notification to the ticket's requester group without supervisor const REQUESTER_GROUP_WITHOUT_SUPERVISOR = 25; //Notification to the ticket's observer group without supervisor const OBSERVER_GROUP_WITHOUT_SUPERVISOR = 26; // Notification to manager users const MANAGER_USER = 27; // Notification to manager groups const MANAGER_GROUP = 28; // Notification to supervisor of manager group const MANAGER_GROUP_SUPERVISOR = 29; // Notification to manager group without supervisor const MANAGER_GROUP_WITHOUT_SUPERVISOR = 30; // Notification to team users const TEAM_USER = 31; // Notification to team groups const TEAM_GROUP = 32; // Notification to supervisor of team groups const TEAM_GROUP_SUPERVISOR = 33; // Notification to team groups without supervisor const TEAM_GROUP_WITHOUT_SUPERVISOR = 34; // Notification to team contacts const TEAM_CONTACT = 35; // Notification to team suppliers const TEAM_SUPPLIER = 36; //Notification to the task assigned group const TASK_ASSIGN_GROUP = 37; // From CommonDBTM public $dohistory = true; static $rightname = 'notification'; static function getTypeName($nb=0) { return _n('Notification', 'Notifications', $nb); } /** * @see CommonGLPI::getMenuContent() * * @since version 0.85 **/ static function getMenuContent() { global $CFG_GLPI; $menu = array(); if (Notification::canView() || Config::canView()) { $menu['title'] = _n('Notification', 'Notifications', Session::getPluralNumber()); $menu['page'] = '/front/setup.notification.php'; $menu['options']['notification']['title'] = _n('Notification', 'Notifications', Session::getPluralNumber()); $menu['options']['notification']['page'] = '/front/notification.php'; $menu['options']['notification']['links']['add'] = '/front/notification.form.php'; $menu['options']['notification']['links']['search'] = '/front/notification.php'; $menu['options']['config']['title'] = __('Setup'); $menu['options']['config']['page'] = '/front/notificationmailsetting.form.php'; $menu['options']['notificationtemplate']['title'] = _n('Notification template', 'Notification templates', Session::getPluralNumber()); $menu['options']['notificationtemplate']['page'] = '/front/notificationtemplate.php'; $menu['options']['notificationtemplate']['links']['add'] = '/front/notificationtemplate.form.php'; $menu['options']['notificationtemplate']['links']['search'] = '/front/notificationtemplate.php'; } if (count($menu)) { return $menu; } return false; } function defineTabs($options=array()) { $ong = array(); $this->addDefaultFormTab($ong); $this->addStandardTab('NotificationTarget', $ong, $options); $this->addStandardTab('Log', $ong, $options); return $ong; } function showForm($ID, $options=array()) { global $CFG_GLPI; $this->initForm($ID, $options); $this->showFormHeader($options); echo "" . __('Name') . ""; echo ""; Html::autocompletionTextField($this, "name"); echo ""; echo "".__('Comments').""; echo ""; echo "" . __('Active') . ""; echo ""; Dropdown::showYesNo('is_active', $this->fields['is_active']); echo ""; echo "" . __('Type') . ""; echo ""; if (!Session::haveRight(static::$rightname, UPDATE)) { $itemtype = $this->fields['itemtype']; echo $itemtype::getTypeName(1); $rand =''; } else if (Config::canUpdate() && ($this->getEntityID() == 0)) { $rand = Dropdown::showItemTypes('itemtype', $CFG_GLPI["notificationtemplates_types"], array('value' => $this->fields['itemtype'])); } else { $rand = Dropdown::showItemTypes('itemtype', array_diff($CFG_GLPI["notificationtemplates_types"], array('Crontask', 'DBConnection', 'User')), array('value' => $this->fields['itemtype'])); } $params = array('itemtype' => '__VALUE__'); Ajax::updateItemOnSelectEvent("dropdown_itemtype$rand", "show_events", $CFG_GLPI["root_doc"]."/ajax/dropdownNotificationEvent.php", $params); Ajax::updateItemOnSelectEvent("dropdown_itemtype$rand", "show_templates", $CFG_GLPI["root_doc"]."/ajax/dropdownNotificationTemplate.php", $params); echo ""; echo "" . __('Notification method') . ""; echo ""; self::dropdownMode(array('value'=>$this->fields['mode'])); echo ""; echo "" . NotificationEvent::getTypeName(1) . ""; echo ""; NotificationEvent::dropdownEvents($this->fields['itemtype'], array('value'=>$this->fields['event'])); echo ""; echo "". NotificationTemplate::getTypeName(1).""; echo ""; NotificationTemplate::dropdownTemplates('notificationtemplates_id', $this->fields['itemtype'], $this->fields['notificationtemplates_id']); echo ""; $this->showFormButtons($options); return true; } /** * @since version 0.84 * * @param $field * @param $values * @param $options array **/ static function getSpecificValueToDisplay($field, $values, array $options=array()) { if (!is_array($values)) { $values = array($field => $values); } switch ($field) { case 'event': if (isset($values['itemtype']) && !empty($values['itemtype'])) { return NotificationEvent::getEventName($values['itemtype'],$values[$field]); } break; case 'mode': return self::getMode($values[$field]); } return parent::getSpecificValueToDisplay($field, $values, $options); } /** * @since version 0.84 * * @param $field * @param $name (default '') * @param $values (default '') * @param $options array **/ static function getSpecificValueToSelect($field, $name='', $values='', array $options=array()) { if (!is_array($values)) { $values = array($field => $values); } $options['display'] = false; switch ($field) { case 'event' : if (isset($values['itemtype']) && !empty($values['itemtype'])) { $options['value'] = $values[$field]; $options['name'] = $name; return NotificationEvent::dropdownEvents($values['itemtype'],$options); } break; case 'mode' : $options['value'] = $values[$field]; $options['name'] = $name; return self::dropdownMode($options); } return parent::getSpecificValueToSelect($field, $name, $values, $options); } function getSearchOptions() { $tab = array(); $tab['common'] = __('Characteristics'); $tab[1]['table'] = $this->getTable(); $tab[1]['field'] = 'name'; $tab[1]['name'] = __('Name'); $tab[1]['datatype'] = 'itemlink'; $tab[1]['massiveaction'] = false; $tab[2]['table'] = $this->getTable(); $tab[2]['field'] = 'event'; $tab[2]['name'] = _n('Event', 'Events', 1); $tab[2]['massiveaction'] = false; $tab[2]['datatype'] = 'specific'; $tab[2]['additionalfields'] = array('itemtype'); $tab[3]['table'] = $this->getTable(); $tab[3]['field'] = 'mode'; $tab[3]['name'] = __('Notification method'); $tab[3]['massiveaction'] = false; $tab[3]['datatype'] = 'specific'; $tab[3]['searchtype'] = array('equals', 'notequals'); $tab[4]['table'] = 'glpi_notificationtemplates'; $tab[4]['field'] = 'name'; $tab[4]['name'] = _n('Notification template', 'Notification templates', Session::getPluralNumber()); $tab[4]['datatype'] = 'itemlink'; $tab[5]['table'] = $this->getTable(); $tab[5]['field'] = 'itemtype'; $tab[5]['name'] = __('Type'); $tab[5]['datatype'] = 'itemtypename'; $tab[5]['itemtype_list'] = 'notificationtemplates_types'; $tab[5]['massiveaction'] = false; $tab[6]['table'] = $this->getTable(); $tab[6]['field'] = 'is_active'; $tab[6]['name'] = __('Active'); $tab[6]['datatype'] = 'bool'; $tab[16]['table'] = $this->getTable(); $tab[16]['field'] = 'comment'; $tab[16]['name'] = __('Comments'); $tab[16]['datatype'] = 'text'; $tab[80]['table'] = 'glpi_entities'; $tab[80]['field'] = 'completename'; $tab[80]['name'] = __('Entity'); $tab[80]['massiveaction'] = false; $tab[80]['datatype'] = 'dropdown'; $tab[86]['table'] = $this->getTable(); $tab[86]['field'] = 'is_recursive'; $tab[86]['name'] = __('Child entities'); $tab[86]['datatype'] = 'bool'; return $tab; } function canViewItem() { if ((($this->fields['itemtype'] == 'Crontask') || ($this->fields['itemtype'] == 'DBConnection')) && !Config::canView()) { return false; } return Session::haveAccessToEntity($this->getEntityID(), $this->isRecursive()); } /** * Is the current user have right to update the current notification ? * * @return boolean **/ function canCreateItem() { if ((($this->fields['itemtype'] == 'Crontask') || ($this->fields['itemtype'] == 'DBConnection')) && !Config::canUpdate()) { return false; } return Session::haveAccessToEntity($this->getEntityID()); } /** * Display a dropdown with all the available notification modes * * @param $options array of options **/ static function dropdownMode($options) { $p['name'] = 'mode'; $p['display'] = true; $p['value'] = ''; if (is_array($options) && count($options)) { foreach ($options as $key => $val) { $p[$key] = $val; } } return Dropdown::showFromArray($p['name'], self::getModes(), $p); } /** * Get notification method label (email only for the moment) * * @param $mode the mode to use * * @return the mode's label **/ static function getMode($mode) { $tab = self::getModes(); if (isset($tab[$mode])) { return $tab[$mode]; } return NOT_AVAILABLE; } /** * Get notification method label (email only for the moment) * * @since versin 0.84 * * @return the mode's label **/ static function getModes() { return array('mail' => __('Email')); } function cleanDBonPurge() { global $DB; $query = "DELETE FROM `glpi_notificationtargets` WHERE `notifications_id` = '".$this->fields['id']."'"; $DB->query($query); } /** * @param $mailing_options **/ static function send($mailing_options) { $mail = new NotificationMail(); $mail->sendNotification($mailing_options); // $mail->ClearAddresses(); } /** * Get the mailing signature for the entity * * @param $entity **/ static function getMailingSignature($entity) { global $DB, $CFG_GLPI; foreach ($DB->request('glpi_entities', array('id' => $entity)) as $data) { if (!empty($data['mailing_signature'])) { return $data['mailing_signature']; } } return $CFG_GLPI['mailing_signature']; } /** * @param $event * @param $itemtype * @param $entity **/ static function getNotificationsByEventAndType($event, $itemtype, $entity) { global $DB; $query = "SELECT `glpi_notifications`.* FROM `glpi_notifications` LEFT JOIN `glpi_entities` ON (`glpi_entities`.`id` = `glpi_notifications`.`entities_id`) WHERE `glpi_notifications`.`itemtype` = '$itemtype' AND `glpi_notifications`.`event` = '$event' ". getEntitiesRestrictRequest("AND", "glpi_notifications", 'entities_id', $entity, true) ." AND `glpi_notifications`.`is_active`='1' ORDER BY `glpi_entities`.`level` DESC"; return $DB->request($query); } /** * @since version 0.90.4 * @see CommonDBTM::prepareInputForAdd() **/ function prepareInputForAdd($input) { if (isset($input["itemtype"]) && empty($input["itemtype"])) { $message = __('Field itemtype is mandatory'); Session::addMessageAfterRedirect($message, false, ERROR); return false; } return $input; } /** * @since version 0.90.4 * @see CommonDBTM::prepareInputForUpdate() **/ function prepareInputForUpdate($input) { if (isset($input["itemtype"]) && empty($input["itemtype"])) { $message = __('Field itemtype is mandatory'); Session::addMessageAfterRedirect($message, false, ERROR); return false; } return $input; } }