Утверждение UserRequest

Какой у вас хороший начальник) он абсолютно прав!
Давайте начнем со сбора информации о вашей версии iTop и установленных модулях.

iTop версия 2.2.0-2459 основан на 2015-09-22 18:18:47
Модель данных: 2.2.0
MySQL: 5.5.44-MariaDB
PHP: 5.4.16

External user authentication (2.2.0)
User authentication based on LDAP (2.2.0)
User authentication based on the local DB (2.2.0)
Send Ticket Log Updates by Email (1.0.0)
Tickets Attachments (2.2.0)
Configuration Management (CMDB) (2.2.0)
Datacenter Management (2.2.0)
End-user Devices Management (2.2.0)
Ticket Creation from Emails (Standard) (2.6.2)
Advanced Storage Management (2.2.0)
Virtualization Management (2.2.0)
Network Management (2.0.1)
Links between virtualization and storage (2.2.0)
Change Management ITIL (2.2.0)
Incident Management ITIL (2.2.0)
Known Errors Database (2.2.0)
Problem Management (2.2.0)
User request Management ITIL (2.2.0)
Service Management (2.2.0)
IP Management (2.0.2)
IPv6 Management (2.0.2)
iTop Storage Mgmt Adaptor (2.0.0)
iTop Virtualization Mgmt Adaptor (2.0.0)
iTop Config Mgmt Adaptor (2.0.1)

Я нашел вот эту доку https://wiki.openitop.org/doku.php?id=2_2_0:customization:add-profile-sample
Но не разобрался, где в модели данных искать имена “stimulus”

На всякий случай прилагаю модуль для создания профиля с правами на утверждение запроса

<?xml version="1.0" encoding="UTF-8"?>
<itop_design xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.0">
  <constants>
  </constants>
  <classes>
  </classes>
  <menus>
  </menus>
  <user_rights>
    <groups>
    </groups>
    <profiles>
      <profile id="50" _delta="define">
        <name>Request Approver</name>
        <description>Request Approver</description>
        <groups>
          <group id="class:UserRequest">
            <actions>
              <action id="ev_approve" xsi:type="stimulus">allow</action>
              <action id="ev_reject" xsi:type="stimulus">allow</action>
            </actions>
          </group>
        </groups>
      </profile>
    </profiles>
  </user_rights>
</itop_design>
1 лайк

@vladimir Подскажите как переопределить существующий модуль, мне нужно скрыть приоритет при создании запроса и изменить влияние по умолчанию на персону

Возможно ли сделать автоматическую смену статуса Запроса с “Новый” на “Ожидание утверждения”. Т.е. в подкатегории услуг ввести два поля: “Требует утверждения” и “Утверждающий”. И чтоб при создании Запроса он сразу отправлялся на утверждение если флаг “Требует утверждения” - истина.

Для объектов с жизненным циклом внутри тега <lifecycle> расписаны статусы и флаги полей <flags> для каждого статуса. Этими флагами (<read_only/>,<hidden/> и др.) задаётся поведение соответствующего поля в нужном статусе. Таким образом вам нужно для поля priority в статусе new установить флаг <hidden/>. Что касается влияния, то тут нужно переопределить <default_value> внутри <field id="impact">. Чтобы переопределить существующий элемент модели данных, используется _delta="redefine". Весь код класса тянуть не нужно, достаточно только переопределяемых элементов и их родителей. Ниже пример модели данных вашего модуля.

<class id="UserRequest">
  <fields>
    <field id="impact" xsi:type="AttributeEnum">
      <values>
        <value id="1">1</value>
        <value id="2">2</value>
        <value id="3">3</value>
      </values>
      <sql>impact</sql>
      <default_value _delta="redefine">3</default_value>
      <is_null_allowed>false</is_null_allowed>
      <display_style>list</display_style>
    </field>
  </fields>
  <lifecycle>
    <states>
      <state id="new">
        <flags>
          <attribute id="priority" _delta="redefine">
            <hidden/>
          </attribute>
        </flags>
      </state>
    </states>
  </lifecycle>
</class>

Но и этот пример избыточен. Содержимое тега field можно было бы сократить:

    ...
    <field id="impact" xsi:type="AttributeEnum">
      <default_value _delta="redefine">3</default_value>
    </field>
    ...
1 лайк

Да, это вполне реализуемо. Посмотрите в сторону метода OnInsert в модели данных UserRequest:

    <method id="OnInsert">
      <static>false</static>
      <access>protected</access>
      <type>Overload-DBObject</type>
      <code><![CDATA[
protected function OnInsert()
{
	$this->ComputeImpactedItems();
	$this->Set('last_update', time());
	$this->Set('start_date', time());
}]]></code>
    </method>

Он срабатывает при первом сохранении объекта и может в этот момент что-то для вас сделать. Например, добавьте новый метод WaitingForApproval, который будет отправлять запрос в статус “Ожидание утверждения”. Затем добавьте проверку флаг “Требует утверждения” и вызов нового метода в OnInsert если флаг TRUE.

Добрый день. У нашего начальства возник вопрос многоуровневого утверждения. Т.е. сначала утверждает начальник отдела, потом начальник департамента, потом СБ. Это вообще возможно сделать ???

Добрый день. Метод OnInsert не помог. Объект еще не создан. Использовал Метод AfterInsert.
Пока все получилось, даже 3-х уровневое утверждение (в ручном и в автомате).
Но, возникла масса вопросов.Где найти список Стандартных методов и список Стандартных событий, по которым они вызываются? Как в Доп. меню заблокировать некоторые пункты по условию? Например: если я описал, что данная подкат. услуг не требует утверждения - не нужно выводить в доп. меню “Ожидать утверждения”? Или, хотя-бы выводить сообщение, что не нужно делать это действие? Метод “SetApprover” из класса “UserRequest”- не помог. Я вообще не понял, когда он срабатывает.Как оперативно изменить список выводимых полей для редактирования, если другое поле изменилось? Например: поле имеет значение “Запрос” - список утверждающих появляется, поле имеет значение “Инцидент” - исчезает.

Только в коде приложения.

https://wiki.openitop.org/doku.php?id=2_2_0:customization:extensions_api
Через iPopupMenuExtension можно добавить кнопку, если нужно утверждение.

Переписать iTop. Набор полей определяется классом объекта, а их отображение - статусами этого объекта.

Большое спасибо Владимир. Только Вы в основном и отвечаете.Но я все равно не очень понимаю механизм. В КАКОЙ МОМЕНТ срабатывают методы.(например из userrequets - методы SetApprover и ComputeValue - это стандартные методы ?) Если имя метода начинается с Set, Get, Calc, On, After - это стандартные методы ? Как свой метод подключить к событию ? Точки останова нет. Как мне оперативно посмотреть, что происходит с iTop в какой то момент времени? Сработал метод или нет ? Можно ли что-то вывести на экран ? Echo не срабатывает. Заранее спасибо за терпение и понимание.

Итак, мы незаметно перешли от доработки iTop к разработке на PHP))

Что в вашем понимании “стандартные методы”? В моем - всё стандартное заканчивается на этой странице: http://www.combodo.com/documentation/api-ref-extensions/namespaces/global.html. Любые изменения iTop вне этих интерфейсов нужно делать с пониманием всего внутреннего устройства, которое даже при всем желании я не смогу описать на форуме.

Если хотите по-хорошему, ставьте PhpStorm или NetBeans, настраивайте xdebug, и будут вам точки останова и полное текущее состояние. Пару-тройку дней придется потратить на изучение самих инструментов, но оно того стоит!

Если хотите по-быстрому, то var_dump(), error_log() и Sublime Text вполне могут сгодиться. Используйте для вывода php_error.log, в веб-интерфейс часто не попадает вывод. И выставьте в php.ini настройки для development режима.

Подскажите, как решить задачу.
Необходимо в чтобы в списке “утверждающих” был список лиц, не только из одной организации.
т.е. оргструктура организации такая

Компания
-Руководство
-Отдел управления
-Отдел тех поддержки
-Отдел 1,2,3…

заявку может завести пользователь из “Отдел 1”, а запросить “Утверждение” необходимо у лица, который находится в организации “руководство”.

Попробуйте создать профиль для утверждающих Request Approver и переписать SELECT для approver_id в классе UserRequest.
Тогда в списке утверждающих будут только те люди, которые имеют профиль Request Approver.

Текст datadomel примерно такой:

Извините. Вот текст:

<itop_design xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.0">
  <constants>
  </constants>
  <classes>
<class id="UserRequest" _delta="must_exist">	
  <fields>
    <field id="approver_id" xsi:type="AttributeExternalKey" _delta="redefine">
      <filter><![CDATA[SELECT Person AS pe JOIN User AS u1 ON u1.contactid=pe.id JOIN URP_UserProfile AS u2 ON u2.userid=u1.id WHERE u2.profile='Request Approver']]></filter>
      <sql>approver_id</sql>
      <target_class>Person</target_class>
      <is_null_allowed>true</is_null_allowed>
      <on_target_delete>DEL_MANUAL</on_target_delete>
      <allow_target_creation>false</allow_target_creation>
    </field>
  </fields>
 </classes>
  <menus>
 </menus>
 <user_rights>
<groups>
</groups>
<profiles>
  <profile id="50" _delta="define">
    <name>Request Approver</name>
    <description>Request Approver</description>
    <groups>
      <group id="UserRequest">
        <actions>
          <action id="ev_approve" xsi:type="stimulus">allow</action>
  		  <action id="ev_reject" xsi:type="stimulus">allow</action>
		      <action id="stimulus:ev_reopen">allow</action>
          <action id="action:write">allow</action>
          <action xsi:type="read">allow</action>
          <action xsi:type="bulk read">allow</action>
    	</actions>
      </group>
    </groups>
  </profile>
  </profiles>
  </user_rights>
  </itop_design>

Вариантов много. Один из них подсказал @iilitv. Но профиль делать не обязательно, можно просто поиграться с селектом в approver_id.

Если у вас структура простая и нет строгих ограничений, то можно просто выбрать всех Персон:

SELECT Person

Если структура такая:

  1. Компания 1
    1.1 Руководство 1
    1.2 Служба 1
    1.2.1 Отдел в службе 1
  2. Компания 2
    2.1 Руководство 2
    2.2 Отдел 2

То можно из Отдела в службе 1 можно выбрать Персон ветки Компании 1 так:

SELECT Person AS p
JOIN Organization AS node1 ON p.org_id = node1.id
JOIN Organization AS node2 ON node1.parent_id BELOW node2.id
JOIN Organization AS node3 ON node2.parent_id ABOVE node3.id
WHERE node3.id = :this->org_id

Именно так и хотелось сделать.
Спасибо! попробуем сделать!

Профиль сделан для того, что-бы не давать утверждающим никаких других прав в Админ. окне itop кроме как утвердить или отклонить. Иначе, для этого действия, придется давать рабочий профиль. И что они там натворят неизвестно.

Всем добрый день.
Была поставлена задача автоматически подачи Запроса на утверждение.
Добавил в подкат. услуг флаг автоутверждения и утверждающего.
В OnUpdate прописал
$oStatus = $this->Get(‘status’);
switch ($oStatus)
{
case ‘new’:
$oApprover1 = $this->Get(‘approver_id_1_service’);
if (!empty($oApprover1))
{
$this->Set(‘approver_id’, $oApprover1);
$this->Set(‘status’,‘waiting_for_approval’);
$this->ApplyStimulus(‘ev_wait_for_approval’);
$this->DBUpdate();
}
Статус меняется, но триггер не срабатывает и уведомление не отправляется.
Пробовал на начало состояния waiting_for_approval, на конец состояния new - ни один не срабатывает.
Подскажите пожалуйста - как заставить триггера работать.