. * --------------------------------------------------------------------- */ if (!defined('GLPI_ROOT')) { die("Sorry. You can't access this file directly"); } /** * CommonITILActor Class **/ abstract class CommonITILActor extends CommonDBRelation { // items_id_1, items_id_2, itemtype_1 and itemtype_2 are defined inside the inherited classes static public $checkItem_2_Rights = self::DONT_CHECK_ITEM_RIGHTS; static public $logs_for_item_2 = false; public $auto_message_on_action = false; // Requester const REQUESTER = 1; // Assign const ASSIGN = 2; // Observer const OBSERVER = 3; function getActorForeignKey() { return static::$items_id_2; } static function getItilObjectForeignKey() { return static::$items_id_1; } /** * @since 0.84 * * @param $input array of data to be added * * @see CommonDBRelation::isAttach2Valid() **/ function isAttach2Valid(Array &$input) { // Anonymous user is valid if 'alternative_email' field is not empty if (isset($input['users_id']) && ($input['users_id'] == 0) && isset($input['alternative_email']) && !empty($input['alternative_email'])) { return true; } // Anonymous supplier is valid if 'alternative_email' field is not empty if (isset($input['suppliers_id']) && ($input['suppliers_id'] == 0) && isset($input['alternative_email']) && !empty($input['alternative_email'])) { return true; } return false; } /** * @param $items_id **/ function getActors($items_id) { global $DB; $users = []; $iterator = $DB->request([ 'FROM' => $this->getTable(), 'WHERE' => [static::getItilObjectForeignKey() => $items_id], 'ORDER' => 'id ASC' ]); while ($data = $iterator->next()) { $users[$data['type']][] = $data; } return $users; } /** * @param $items_id * @param $email **/ function isAlternateEmailForITILObject($items_id, $email) { global $DB; $iterator = $DB->request([ 'FROM' => $this->getTable(), 'WHERE' => [ static::getItilObjectForeignKey() => $items_id, 'alternative_email' => $email ], 'START' => 0, 'LIMIT' => 1 ]); if (count($iterator) > 0) { return true; } return false; } function canUpdateItem() { return (parent::canUpdateItem() || (isset($this->fields['users_id']) && ($this->fields['users_id'] == Session::getLoginUserID()))); } /** * @since 0.84 **/ function canDeleteItem() { return (parent::canDeleteItem() || (isset($this->fields['users_id']) && ($this->fields['users_id'] == Session::getLoginUserID()))); } /** * Print the object user form for notification * * @param $ID integer ID of the item * @param $options array * * @return void **/ function showUserNotificationForm($ID, $options = []) { $this->check($ID, UPDATE); if (!isset($this->fields['users_id'])) { return false; } $item = new static::$itemtype_1(); echo "
"; echo "
"; echo ""; echo ""; echo ""; $user = new User(); $default_email = ""; $emails = []; if ($user->getFromDB($this->fields["users_id"])) { $default_email = $user->getDefaultEmail(); $emails = $user->getAllEmails(); } echo ""; echo ""; echo ""; echo ""; echo ""; echo ""; echo ""; echo ""; echo "
".$item->getTypeName(1).""; if ($item->getFromDB($this->fields[static::getItilObjectForeignKey()])) { echo $item->getField('name'); } echo "
".User::getTypeName(1)."".$user->getName()."
".__('Email Followup').""; Dropdown::showYesNo('use_notification', $this->fields['use_notification']); echo "
"._n('Email', 'Emails', 1).""; if ((count($emails) == 1) && !empty($default_email) && NotificationMailing::isUserAddressValid($default_email)) { echo $default_email; } else if (count($emails) > 1) { // Several emails : select in the list $emailtab = []; foreach ($emails as $new_email) { $emailtab[$new_email] = $new_email; } Dropdown::showFromArray("alternative_email", $emailtab, ['value' => $this->fields['alternative_email']]); } else { echo ""; } echo "
"; echo ""; echo ""; echo "
"; Html::closeForm(); } /** * Print the object user form for notification * * @since 0.85 * * @param $ID integer ID of the item * @param $options array * * @return void **/ function showSupplierNotificationForm($ID, $options = []) { $this->check($ID, UPDATE); if (!isset($this->fields['suppliers_id'])) { return false; } $item = new static::$itemtype_1(); echo "
"; echo "
"; echo ""; echo ""; echo ""; $supplier = new Supplier(); $default_email = ""; if ($supplier->getFromDB($this->fields["suppliers_id"])) { $default_email = $supplier->fields['email']; } echo ""; echo ""; echo ""; echo ""; echo ""; echo ""; echo ""; echo ""; echo "
".$item->getTypeName(1).""; if ($item->getFromDB($this->fields[static::getItilObjectForeignKey()])) { echo $item->getField('name'); } echo "
".Supplier::getTypeName(1)."".$supplier->getName()."
".__('Email Followup').""; Dropdown::showYesNo('use_notification', $this->fields['use_notification']); echo "
"._n('Email', 'Emails', 1).""; if (empty($this->fields['alternative_email'])) { $this->fields['alternative_email'] = $default_email; } echo ""; echo "
"; echo ""; echo ""; echo "
"; Html::closeForm(); } function post_deleteFromDB() { global $CFG_GLPI; $donotif = !isset($this->input['_disablenotif']) && $CFG_GLPI["use_notifications"]; $item = $this->getConnexityItem(static::$itemtype_1, static::getItilObjectForeignKey()); if ($item instanceof CommonDBTM) { if (($item->countSuppliers(CommonITILActor::ASSIGN) == 0) && ($item->countUsers(CommonITILActor::ASSIGN) == 0) && ($item->countGroups(CommonITILActor::ASSIGN) == 0) && ($item->fields['status'] != CommonITILObject::CLOSED) && ($item->fields['status'] != CommonITILObject::SOLVED)) { $status = CommonITILObject::INCOMING; if (in_array($item->fields['status'], Change::getNewStatusArray())) { $status = $item->fields['status']; } $item->update(['id' => $this->fields[static::getItilObjectForeignKey()], 'status' => $status]); } else { $item->updateDateMod($this->fields[static::getItilObjectForeignKey()]); if ($donotif) { $options = []; if (isset($this->fields['users_id'])) { $options = ['_old_user' => $this->fields]; } NotificationEvent::raiseEvent("update", $item, $options); } } } parent::post_deleteFromDB(); } /** * @since 0.85 * * @see CommonDBRelation::prepareInputForAdd() **/ function prepareInputForAdd($input) { if (!isset($input['alternative_email']) || is_null($input['alternative_email'])) { $input['alternative_email'] = ''; } else if ($input['alternative_email'] != '' && !NotificationMailing::isUserAddressValid($input['alternative_email'])) { Session::addMessageAfterRedirect( __('Invalid email address'), false, ERROR ); return false; } return $input; } function prepareInputForUpdate($input) { if (isset($input['alternative_email']) && $input['alternative_email'] == '') { if (isset($input['users_id'])) { $actor = new User(); if ($actor->getFromDB($input["users_id"])) { $input['alternative_email'] = $actor->getDefaultEmail(); } } if (isset($input['suppliers_id'])) { $actor = new Supplier; if ($actor->getFromDB($input["suppliers_id"])) { $input['alternative_email'] = $actor->fields['email']; } } } if (isset($input['alternative_email']) && $input['alternative_email'] != '' && !NotificationMailing::isUserAddressValid($input['alternative_email'])) { Session::addMessageAfterRedirect( __('Invalid email address'), false, ERROR ); return false; } $input = parent::prepareInputForUpdate($input); return $input; } function post_addItem() { $item = new static::$itemtype_1(); $no_stat_computation = true; if ($this->input['type'] == CommonITILActor::ASSIGN) { // Compute "take into account delay" unless "do not compute" flag was set by business rules $no_stat_computation = $item->isTakeIntoAccountComputationBlocked($this->input); } $item->updateDateMod($this->fields[static::getItilObjectForeignKey()], $no_stat_computation); if ($item->getFromDB($this->fields[static::getItilObjectForeignKey()])) { // Check object status and update it if needed if (!isset($this->input['_from_object']) && in_array($item->fields["status"], $item->getNewStatusArray()) && in_array(CommonITILObject::ASSIGNED, array_keys($item->getAllStatusArray()))) { $item->update(['id' => $item->getID(), 'status' => CommonITILObject::ASSIGNED, '_from_assignment' => true]); } // raise notification for this actor addition if (!isset($this->input['_disablenotif'])) { $string_type = ""; switch ($this->input['type']) { case self::REQUESTER: $string_type = "requester"; break; case self::OBSERVER: $string_type = "observer"; break; case self::ASSIGN: $string_type = "assign"; break; } // example for event: assign_group $event = $string_type."_".strtolower($this::$itemtype_2); NotificationEvent::raiseEvent($event, $item); } } parent::post_addItem(); } }