Создание в портале Incident&UserRequest

Добрый день
Необходимо, чтобы пользователь из портала мог создавать как UserRequest, так и Incident. В конфигурационном файле есть опция portal_tickets - в случае задания одного типа тикета все работает, а в случае выбора обоих типов (запрос и инцидент) нет возможности выбора, по умолчанию создается UserRequest.
Подскажите, как можно реализовать данную возможность?

Смотри itop/portal/readme.txt, там описаны шаги по добавлению новых типов тикетов на портал. Конфиг portal_tickets - это первый шаг. Кроме этого есть ещё с десяток констант, которые нужно определить. Определять их можно в itop/portal/index.php, но я бы рекомендовал вынести все константы в отдельный конфиг-файл портала и подключить его к index.php.

Просто такой тип тикета уже ж есть в системе и успешно отрабатывает. Не решали подобную задачу? В результате у пользователя будет возможность выбора типа тикета перед типом услуги?

В системе он есть, но чтобы он стал доступен через портал, нужно его “включить”, как написано в readme.txt: How to add a type of ticket (example: Incident) и т.д. 7 пунктов.

Решал и решил. У меня на портале создаются два кастомных типа тикетов вместо UresRequest.
Не совсем очевидно: когда ты создаёшь подкатегории услуг, там есть поле Тип запроса (request_type). Этот тип запроса и определяет то, что будет создаваться на портале (Incident или User Request) при выборе этой подкатегории. Отдельного поля выбора типа тикета нет.

Какие значения можно присваивать константам, описанным в itop\portal\readme.txt, можно посмотреть в itop\datamodels\2.x\itop-request-mgmt-itil\datamodel.itop-request-mgmt-itil.xml.

How to add a type of ticket (example: Incident)

  1. Add it to the list of supported tickets classes: itop-config.php/portal_tickets
  2. Define PORTAL_SET_TYPE_FROM (if not already done) as the attribute of ServiceSubcategory, that will define the request type, depending on the user selection
  3. Map the different values of this request type (in class ServiceSubcategory) to the supported ticket classes
    YOU MUST MAKE SURE THAT ANY OF THE VALUE HAS A MAPPING SO AS TO EXCLUDE SUBCATEGORIES IF THE CORRESPONDING CLASS ARE NOT ENABLED IN THE CONFIG.
  4. Make sure that the queries PORTAL_SERVICE_SUBCATEGORY_QUERY and PORTAL_VALIDATE_SERVICESUBCATEGORY_QUERY will not exclude the expected type
  5. Define the various constants for this class (PORTAL__XXXX).
  6. Adjust PORTAL_TICKETS_SEARCH_CRITERIA. Those criteria are common to all types of tickets. Giving too many criteria can lead to confusion.
  7. Test, test and re-test!!!
  1. Отредактировали в config-itop.php:
    ‘portal_tickets’ => ‘UserRequest’, ‘Incident’,
  2. В web интерфейсе в разделе Управление услугами - Подкатегории услуг создал записи с типами запроса Incident и UserRequest.
    3…6 Не понятно где это искать - толи в Web, толи в php/xml коде…
    Поясните плиз
  1. portal_tickets - CSV list of classes supported in the portal. 'UserRequest', 'Incident' - не правильно, ‘UserRequest,Incident’ - правильно.
  2. Уже сделано.
  3. Ты сделал.
  4. Искать в itop\datamodels\2.x\itop-tickets\datamodel.itop-tickets.xml, но тебя это не должно касаться, если ты это не менял.
  5. Дальше нужно определить константы PORTAL_INCIDENT_ЧТО-ТО-ТАМ, можно прям в index.php портала, но если у тебя стоит модуль itop-incident-mgmt-itil, то они уже должны быть определены.
  6. Ещё одна константа из п.4, но её трогать тоже не обязательно.

В общем, похоже тебе нужно поправить п.1.

Версия iTop 2.1.0?

Да, iTop 2.1.0
Тупил в мелочи - да, все заработало. Спасибо большое. Жаль, что у пользователя при создании тикета не спрашивает тип (запрос, инцидент) - если юзер по подкатегории не разберется и направит заявку не в ту очередь, то в админке потом нельзя уже будет сменить тип тикета.

Ну тут есть три варианта:

  1. Более конкретно называть подкатегории и использовать поле Описание (оно тоже выводится на портале). Подключение нового телефона и Не работает телефон вполне однозначно трактуются как Запрос и Инцидент соответственно.
  2. Использовать услуги с одними типами тикетов, т.е. для инцидентов одна услуга, для запросов - другая.
  3. Позволять пользователям портала создавать только запросы, а инциденты на основе поступивших запросов (только если инцидент реально присутствует) пусть открывают инженеры. В этом случае функционал используется наиболее полно и привильно. Несколько запросов могут быть вызваны одним инцидентом, что будет отражено через связи между тикетами. При изменении и решении инцидента будет происходить автоматическое решение запросов.

Сложно рассуждать, не зная специфики вашей компании. У нас используется третий вариант.

Хотел приспособить четвертый вариант - при выводе подкатегорий в портале отделять их заголовками, как в случае отображения открытых заявок. Т. е.:
Запрос:
…подкатегории…
Инцидент:
…подкатегории…
Формируется все это в /portal/index.php:
function SelectServiceSubCategory()

Только вот не придумаю как лучше реализовать… Менять sql запрос или при выводе определять класс тикета. Не смотрели в эту сторону, не подскажете в таком варианте решение?

Думаю, лучше поправить SelectServiceSubCategory(). Я бы в блоке while($oSubService = $oSet->Fetch()) вместо непосредственного добавления html на страницу сформировал бы две переменные с html-фрагментми (запросы и инциденты), которые после окончания while вывел бы у нужном порядке.

Именно так и реализовал. Спасибо

В случае такой организации инженерам приходится самим копировать/заполнять поля Incident’а или можно как-то организовать перенос заполненных полей из UserRequest?

А какие поля можно было бы копировать? Мне кажется, таких нет.
К примеру, пришел запрос от пользователя “Не могу попасть в Одноклассники”. Инженер проверил, что дело не в кривых руках пользователя, который неправильно набирает адрес сайта, а просто лежит канал, и после этого регистрирует инцидент “Упал линк до провайдера”. Пришёл еще один запрос “Не могу проверить почту”, и инженер привязывает его к созданному ранее инциденту. Дублирующихся полей нет, поскольку запрос и инцидент используются для разных целей и дополняют друг друга. Пользователи не знают и не должны знать об упавшем линке, а IT отделу все равно, на какие сайты не могут попасть пользователи. После восстановления линка инженер закрывает инцидент, а все привязанные запросы закрываются автоматически.
Когда инцидент и запросы связаны, в них отображаются ссылки друг на друга.

Возник еще один вопрос: как Incident’у установить статус rejected. Для UserRequest статус rejected устанавливается после статуса waiting for approval. А как быть с Incident’ом? В моделе данных он описан, а как его в web интерфейсе назначить - так и не нашел…

У меня в стардатрном iTop 2.1.0 для статуса инцидента такие варианты: ENUM('assigned','closed','escalated_tto','escalated_ttr','new','pending','resolved'), По умолчанию: "new", Null НЕ разрешён. Модуль ITIL Incident Mgmt.

Разобрался, все получилось. Спасибо