Примеры сценариев (старая версия)
Aleksandr Pletnev
Denis Kiselev
Vlad Belyaev
Dennis Victorovich
Диалоговые сценарии
установитьПеременную("baseURL", "https://swapi.dev/api") +
вызвать.внешнийСервис("{baseURL}/people/1/", "GET").сЗаголовками(("Content-Type", "application/json")).сохранитьРезультатКакСтроку("results")+
выполнитьJs("""
var result = JSON.parse(results);
var exit = {'name':result.name, 'gender':result.gender}; exit;
""")+
сообщениеПользователю.сШаблоном("name {name}<br>gender {gender}")+
завершить
Интеграционные сценарии для кнопок “Действия” операторов
установитьПеременную("host", "https://api.sendgrid.com/v3/mail/send")+
установитьПеременную("token", "token")+
установитьПеременную("from_email", "noreply@autofaq.ai")+
установитьПеременную("from_name", "autofaq")+
установитьПеременную("subject", "Переписка с пользователем {userFullName}")+
установитьПеременную("user_info", "Пользователь:\n{userFullName}")+
// Получаем историю сообщений
выполнитьJs("""
var messages = conversation.messages.filter(function (str) {return ['Question', 'AnswerOperator'].indexOf(str.tpe) != -1});
var msg_history = '';
messages.forEach(function (item, i, arr) {
msg_history += ((i > 0) ? '\n\n':'') + ((item.tpe == 'Question') ? 'Клиент:' : 'Оператор:') + '\n' + item.txt.replace(/<\/?[^>]+(>|$)/g, "");
});
var exit = {'msg_history':msg_history};
exit;
""")+
// Собираем поля для формы оператора
// Добавляем текстовое поле для отображения информации
добавитьПолеВФормуОператора(
форма = "Отправить на Email",
переменная = "formName",
название = "Действие:",
значение = "Отправка сообщения на Email",
тип = "Нередактируемый текст",
описание = "",
обязательное = false
)+
//
добавитьПолеВФормуОператора(
форма = "Отправить на Email",
переменная = "email",
название = "Email",
значение = "xxx@gmail.com",
тип = "Однострочный редактируемый текст",
обязательное = true
)+
//
добавитьПолеВФормуОператора(
форма = "Отправить на Email",
переменная = "comment",
название = "Комментарий",
тип = "Многострочный редактируемый текст",
значение = "",
обязательное = false
)+
// Показываем форму оператору, пока оператор не закроет форму сценарий ждет
// если оператор нажмет в форме Отмена - сценарий остановится
показатьФормуОператору(имя = "Отправить на Email")+
// отправка запроса
вызвать.внешнийСервис("{host}", "POST").сЗаголовками(("Authorization", "{token}"),("Content-Type","application/json")).сТеломСообщения("{\"personalizations\":[{\"to\":[{\"email\":\"{email}\",\"name\":\"{userFullName}\"}],\"subject\":\"{subject}\"}],\"content\": [{\"type\": \"text/plain\", \"value\": \"Комментарий оператора:\\n{comment}\\n\\n{user_info}\\n\\nИстория сообщений:\\n{msg_history}\"}],\"from\":{\"email\":\"{from_email}\",\"name\":\"{from_name}\"},\"reply_to\":{\"email\":\"{from_email}\",\"name\":\"{from_name}\"}}").сохранитьРезультат()+
// обработка ошибок
если("{http_code} > 202").то(
//если запрос завершен с ошибкой сценарий помещает в диалог соответствующий комментарий и завершает свою работу
комментарий("При запросе возникла ошибка {http_code}, обратитесь к системному администратору")+
завершить
)+
// помещаем комментарий в диалог об успешной регистрации инцидента
комментарий("Сообщение отправлено на {email}")
В качестве тегов можно использовать функцию “установитьПеременнуюВДиалог“ с типом “Выпадающий список“
установитьПеременнуюВДиалог(
ключ = "priority",
значение = "",
название = "Выберите тег",
редактируемое = true,
показыватьОператору = true,
обязательное = true,
множественныйВыбор = true,
тип = "Выпадающий список",
варианты = "{\"Тег 1\": \"t1\", \"Тег 2\": \"t2\"}"
)+
завершить
// Пример сценария опроса оператора с заполнением метаданных пользователя
// Сценарий предназначен для подключения в Интеграцию на событие "Нажата кнопка оператора"
установитьПеременную("_email", "{userPayload.Email}")+
// Собираем поля для формы оператора
// Добавляем текстовое поле для отображения информации
добавитьПолеВФормуОператора(
форма = "Обновление данных пользователя",
переменная = "formName",
название = "",
значение = "Укажите новые значение или сотрите старые",
тип = "Нередактируемый текст",
описание = "",
обязательное = false
) +
// Добавляем поля пользователя
добавитьПолеВФормуОператора(
форма = "Обновление данных пользователя",
переменная = "_email",
название = "Email",
тип = "Однострочный редактируемый текст",
описание = "Email пользователя",
обязательное = true
) +
// показываем форму оператору, пока оператор не закроет форму сценарий ждет
// если оператор нажмет в форме Отмена - сценарий остановится
показатьФормуОператору(имя = "Обновление данных пользователя") +
комментарий("Обовлены данные пользователя")+
установитьПеременнуюПользователю("userPayload.Email", "{_email}")+
завершить
// Адрес API ITSM системы - получить у администратора системы
установитьПеременную("jira_host", "https://ххххххх.atlassian.net/rest/api/2/issue/")+
установитьПеременную("tags", "{\"Bug\": \"Проблема\", \"2\": \"Задача\", \"3\": \"Комментарий\", \"4\": \"Прочее\"}") +
// Собираем поля для формы оператора
// Добавляем текстовое поле для отображения информации
добавитьПолеВФормуОператора(
форма = "Обновление заявки",
переменная = "formName",
название = "Действие:",
значение = "Регистрация нового инцидента",
тип = "Нередактируемый текст",
описание = "",
обязательное = false
) +
// Добавляем обязательное поле для резюме, форма сохранит введенный текст в переменную summary
// Для подставновки ФИО пользователя используем переменную userFullName
добавитьПолеВФормуОператора(
форма = "Обновление заявки",
переменная = "summary",
название = "Резюме",
значение = "Заявка для {userFullName}",
тип = "Однострочный редактируемый текст",
обязательное = true
) +
// Добавляем обязательное поле для описания, форма сохранит введенный текст в переменную description
// Для подставновки логина пользователя используем переменную userLogin
// Чтобы ускорить процесс добавим вопрос пользователя к описанию с помощью переменной platformInMessageQuery
добавитьПолеВФормуОператора(
форма = "Обновление заявки",
переменная = "description",
название = "Описание заявки",
тип = "Многострочный редактируемый текст",
описание = "Опишите вашу проблему",
значение = "Пользователь: {userFullName} логин: {userLogin} сообщает: {platformInMessageQuery}",
обязательное = true
) +
// Добавляем обязательное поле для выбора тега из списка тегов tags, сохранит выбранное значение в переменную tag
добавитьПолеВФормуОператора(
форма = "Обновление заявки",
переменная = "issuetype",
название = "Тег",
тип = "Выпадающий список",
описание = "Выберите из списка критичность заявки",
обязательное = true,
варианты = "{tags}"
) +
// показываем форму оператору, пока оператор не закроет форму сценарий ждет
// если оператор нажмет в форме Отмена - сценарий остановится
показатьФормуОператору(имя = "Обновление заявки") +
// отправка запроса на регистрацию инцидента в соответствии с выбранными значениями
вызвать.внешнийСервис("{jira_host}", "POST").сЗаголовками(("Content-Type", "application/json"),("charset", "utf-8"),("Authorization", "Basic YWFwbGV0bjFAZ21haWwuY25IUUdmR05VRGdFOXlTMkhuRkE3RA==")).сТеломСообщения("{\"fields\":{\"project\":{\"key\":\"INT\"},\"summary\":\"{summary}\",\"description\":\"{description}\",\"issuetype\":{\"name\":\"{issuetype}\"}}}").сохранитьРезультат(("id","ticketid"),("key","key"),("self","link"))+
// обработка ошибок
если("{http_code} != 201").то(
// если запрос завершен с ошибкой сценарий помещает в диалог соответствующий комментарий и завершает свою работу
комментарий("При запросе на регистрацию инцидента возникла ошибка {http_code}, обратитесь к системному администратору")+
завершить
)+
// помещаем комментарий в диалог об успешной регистрации инцидента
комментарий("Зарегистрирован инцидент: заявка {link}")+
// добавляем переменную чата со ссылкой на инцидент, переменная отобразится в боковой панели оператора без возможности редактирования
установитьПеременнуюВДиалог(
ключ = "linkJira",
значение = "{link}",
название = "Ссылка на Jira",
показыватьОператору = true,
редактируемое = false,
обязательное = false,
тип = "Текст"
)+
установитьПеременнуюВДиалог(
ключ = "incNum",
значение = "{key}",
название = "Инцидент №",
тип = "Текст",
показыватьОператору = true,
обязательное = false,
редактируемое = false
)+
завершить
комментарий("Запуск интеграции по кнопке.")+
установитьПеременнуюВДиалог("Поле 2", значение = "Field 2", название = "Поле 2", показыватьОператору = true, обязательное = true, редактируемое = false)+
установитьПеременную("priority", "{\"v1\": \"Blocker\", \"v2\": \"Critical\", \"v3\": \"Major\", \"v4\": \"Minor\"}") +
добавитьПолеВФормуОператора(
форма = "Заведение заявки в Jira",
переменная = "t1",
название = "Что вам нужно сделать: ",
тип = "Нередактируемый текст",
значение = "Заполните форму"
) +
добавитьПолеВФормуОператора(
форма = "Заведение заявки в Jira",
переменная = "t2",
название = "Название заявки",
тип = "Однострочный редактируемый текст",
описание = "Введите название заводимой заявки",
значение = "Введите",
обязательное = true
) +
добавитьПолеВФормуОператора(
форма = "Заведение заявки в Jira",
переменная = "t3",
название = "Критичность",
тип = "Выпадающий список",
описание = "Выберите из списка критичность заявки",
обязательное = true,
значение = "v3",
варианты = "{priority}"
) +
добавитьПолеВФормуОператора(
форма = "Заведение заявки в Jira",
переменная = "t4",
название = "Описание",
тип = "Многострочный редактируемый текст",
описание = "Опишите вашу проблему",
обязательное = true
) +
добавитьПолеВФормуОператора(
форма = "Заведение заявки в Jira",
переменная = "t5",
название = "Уведомить руководителя?",
тип = "Переключатель",
обязательное = false
) +
установитьПеременную("tags", "{\"v1\": \"Teacher\", \"v2\": \"Student\", \"v3\": \"Sales\", \"v4\": \"Tech\"}") +
добавитьПолеВФормуОператора(
форма = "Заведение заявки в Jira",
переменная = "t6",
название = "Теги",
тип = "Множественный выбор",
описание = "Выберите теги, которыми пометить обращение",
варианты = "{tags}",
обязательное = true
) +
добавитьПолеВФормуОператора(
форма = "Заведение заявки в Jira",
переменная = "t7",
тип = "Целое число",
название = "Частота возникновения проблемы",
описание = "% пользователей, у которых возникает проблема"
) +
показатьФормуОператору(имя = "Заведение заявки в Jira") +
комментарий("Вот что у нас получилось: {t2}, {t3}, {t4}")+
комментарий("Конец сценария интеграции!")
// Пример сценария опроса оператора с заполнением метаданных пользователя
// Сценарий предназначен для подключения в Интеграцию на событие "Нажата кнопка оператора"
// После установки переменных новые данные отправляются в CRM и сохраняются в профиле пользователя в АФ
//
установитьПеременную("host", "http://xxxx")+
установитьПеременную("_height", "{userPayload.Рост}")+
установитьПеременную("_weight", "{userPayload.Вес}")+
установитьПеременную("_typeNum", "{userPayload.Тип}")+
установитьПеременную("_comment", "{userPayload.Комментарий}")+
// Списки вариантов тегов
установитьПеременную("types", "{\"Ученик\": \"Ученик\", \"Лид\": \"Лид\", \"Преподаватель\": \"Преподаватель\", \"Прочее\": \"Прочее\"}") +
// Собираем поля для формы оператора
// Добавляем текстовое поле для отображения информации
добавитьПолеВФормуОператора(
форма = "Обновление данных пользователя",
переменная = "formName",
название = "",
значение = "Укажите новые значение или сотрите старые",
тип = "Нередактируемый текст",
описание = "",
обязательное = false
) +
// Добавляем поля пользователя
добавитьПолеВФормуОператора(
форма = "Обновление данных пользователя",
переменная = "_height",
название = "Рост",
тип = "Целое число",
описание = "Рост пользователя, см",
обязательное = false
) +
добавитьПолеВФормуОператора(
форма = "Обновление данных пользователя",
переменная = "_weight",
название = "Вес",
тип = "Целое число",
описание = "Вес пользователя, кг",
обязательное = false
) +
добавитьПолеВФормуОператора(
форма = "Обновление данных пользователя",
переменная = "_type",
название = "Тип",
тип = "Выпадающий список",
описание = "Выберите из списка тип пользователя",
обязательное = false,
варианты = "{types}"
) +
добавитьПолеВФормуОператора(
форма = "Обновление данных пользователя",
переменная = "_comment",
название = "Комментарий",
тип = "Многострочный редактируемый текст",
описание = "Комменатрий к пользователю",
обязательное = false
) +
// показываем форму оператору, пока оператор не закроет форму сценарий ждет
// если оператор нажмет в форме Отмена - сценарий остановится
показатьФормуОператору(имя = "Обновление данных пользователя") +
// отправка запроса на регистрацию инцидента в соответствии с выбранными значениями
вызвать.внешнийСервис("{host}", "POST").сЗаголовками(("Content-Type", "application/json"),("charset", "utf-8")).сТеломСообщения("{\"name\":\"{userFullName}\",\"type\":\"{_type}\",\"weight\":\"{_weight}\",\"comment\":\"{_comment}\",\"height\":\"{_height}\"}").сохранитьРезультатКакСтроку("answer")+
// обработка ошибок
если("{http_code} != 200").то(
// если запрос завершен с ошибкой сценарий помещает в диалог соответствующий комментарий и завершает свою работу
комментарий("Данные пользователя не обновлены. При запросе на регистрацию данных пользователя возникла ошибка {http_code}, обратитесь к системному администратору")+
завершить
)+
комментарий("Обовлены данные пользователя. Новые данные отправлены в CRM")+
установитьПеременнуюПользователю("userPayload.Рост", "{_height}")+
установитьПеременнуюПользователю("userPayload.Вес", "{_weight}")+
установитьПеременнуюПользователю("userPayload.Тип", "{_type}")+
установитьПеременнуюПользователю("userPayload.Комментарий", "{_comment}")+
установитьПеременнуюВДиалог(
ключ = "user_chat",
значение = "{_comment}",
название = "Редактируемый комментарий",
тип = "Текст",
показыватьОператору = true,
обязательное = false,
редактируемое = true
)+
завершить
Сценарии для модуля Приветствие
Реализован для Московского времени, где +3 GMT, переменная HourOffset
установитьПеременную("HourOffset", "3")+
установитьПеременную("startHour", "9")+
установитьПеременную("endHour", "22")+
выполнитьJs("""
var serverTime = new Date();
var serverTimeStamp = serverTime.getTime();
var timeZoneOffset = serverTime.getTimezoneOffset();
var currentTimeStamp = serverTimeStamp + (parseInt(HourOffset) * 3600000) - (timeZoneOffset * 60000);
var currentDate = new Date(currentTimeStamp);
var currentHour = parseInt(currentDate.getHours());
var start = parseInt(startHour);
var stop = parseInt(endHour);
if (currentHour >= start && currentHour < stop) {
var workTime = 1;
} else {
var workTime = 0;
}
var exit = {'workTime':workTime};
exit;
""") +
если("{platformInMessageQuery} == /start").и("{workTime} == 0").то(
комментарий("Это присоединение к боту в нерабочее время")+
сообщениеПользователю.сШаблоном("Сейчас служба поддержки не работает. Просим писать нам с {startHour}:00 по {endHour}:00 МСК.<br>Unfortunately you contacted us outside of our support service hours. We will reply to you in the morning. Thank you for waiting.")+
завершитьИЗакрытьДиалог()
)+
если("{platformInMessageQuery} == /start").и("{workTime} == 1").то(
комментарий("Это присоединение к боту в рабочее время")+
сообщениеПользователю.сШаблоном("Чем могу вам помочь?<br>How can I help you?")+
завершитьИЗакрытьДиалог()
)+
запросВБазыЗнаний("{platformInMessageQuery}", "botKnows")+
если("{botKnows} == true").то(
комментарий("Бот знает ответ, продолжаем не взирая на график.")+
завершитьСНовымЗапросом("{platformInMessageQuery}")
)+
если("{workTime} == 0").то(
комментарий("Мой график работы с {startHour} по {endHour} по МСК. Сейчас {currentHour} часов - я не работаю.")+
сообщениеПользователю.сШаблоном("Сейчас служба поддержки не работает. Просим писать нам с {startHour}:00 по {endHour}:00 МСК.<br>Unfortunately you contacted us outside of our support service hours. We will reply to you in the morning. Thank you for waiting.")+
завершитьСНовымЗапросом("{platformInMessageQuery}")
)+
комментарий("Мой график работы с {startHour} по {endHour} по МСК. Сейчас я работаю.")+
завершитьСНовымЗапросом("{platformInMessageQuery}")
задатьПользователюВопрос("Здравствуйте 😊<br>Что Вас интересует?").сВариантамиОтвета("Первое","Второе","Компот").сохранитьРезультат("userChoice")+
если("{userChoice} == Первое").то(завершитьСНовымЗапросом("Первые блюда"))+
если("{userChoice} == Второе").то(завершитьСНовымЗапросом("Вторые блюда"))+
если("{userChoice} == Компот").то(завершитьСШаблоном("Закончился. Всего хорошего!"))+
завершитьСНовымЗапросом("{userChoice}")
если("{channelType} == Telegram").то(сообщениеПользователю.сШаблоном("Добро пожаловать в наш Telegram"))+
если("{channelId} == 2f7ce72f-8003-4e17-b879-e3c71f239149").то(сообщениеПользователю.сШаблоном("Здравствуйте!"))+
завершитьСНовымЗапросом("{platformInMessageQuery}")
если("{channelType} == Telegram").то(сообщениеПользователю.сШаблоном("Добро пожаловать в наш Telegram"))+
если("{channelId} == 2f7ce72f-8003-4e17-b879-e3c71f239149").то(
// Запоминаем запрос пользователя в переменную message, чтобы продолжить работу в случае успеха
установитьПеременную("message","{platformInMessageQuery}")+
сообщениеПользователю.сШаблоном("Здравствуйте!")+
задатьПользователюВопрос("Введите пароль").сохранитьРезультат("password")+
// Перейти на проверку пароля
перейтиНаМетку("проверка"))+
// После проверки всех условий продолжаем работу с пользователем повторив его запрос
завершитьСНовымЗапросом("{platformInMessageQuery}")+
// Проверка пароля
установитьМетку("проверка")+
если("{password} == valid_password").то(сообщениеПользователю.сШаблоном("Успех! Можете продолжить работу в системе")+завершитьСНовымЗапросом("{message}"))+
если("{password} != valid_password").то(сообщениеПользователю.сШаблоном("Ошибка! Попробуйте еще раз")+повторитьСШага(6))
Принцип работы: для перемещения по меню пользователь вводит названия нужных документов в базах знаний. С помощью команды “задатьПользователюВопрос“ можно сделать процесс ввода текста более удобным и понятным.
В качестве приветствия будем использовать сценарий:
сообщениеПользователю.сШаблоном("Добро пожаловать в наш магазин")+завершитьСНовымЗапросом("Меню")
Таким образом все пользователи изначально будут попадать в наше меню
Создадим новую базу знаний. Для удобства назовем ее “Меню“
Добавим документ-сценарий с именем “Главное меню“ и вопросом “меню“ задатьПользователюВопрос("Для уточнения информации выберите раздел").сВариантамиОтвета("Смартфоны","Планшеты","Аксессуары","Другие вопросы").сохранитьРезультат("userChoice")+
если("{userChoice} == Смартфоны").то(завершитьСНовымЗапросом("Смартфоны"))+
если("{userChoice} == Планшеты").то(завершитьСНовымЗапросом("Планшеты"))+
если("{userChoice} == Аксессуары").то(завершитьСНовымЗапросом("Аксессуары"))+
завершитьСНовымЗапросом("{userChoice}") | |
Добавим документ-сценарий с именем “Смартфоны“ и вопросом “Смартфоны“. Он будет являться каталогом смартфонов. Для удобства можно создать отдельную базу знаний задатьПользователюВопрос("Выберите смартфон").сВариантамиОтвета("Смартфон_1","Смартфон_2","Смартфон_3", "Меню").сохранитьРезультат("userChoice")+
если("{userChoice} == Смартфон_1").то(завершитьСНовымЗапросом("Смартфон_1"))+
если("{userChoice} == Смартфон_2").то(завершитьСНовымЗапросом("Смартфон_2"))+
если("{userChoice} == Смартфон_3").то(завершитьСНовымЗапросом("Смартфон_3"))+
если("{userChoice} == Меню").то(завершитьСНовымЗапросом("Меню"))+
завершитьСНовымЗапросом("{userChoice}") |
|
Добавим документ-сценарий с именем “Смартфон_1“ и вопросом “Смартфон_1“. В данном документе можно разместить фото и описание отдельно взятого смартфона сообщениеПользователю.сФайлами(852).сШаблоном("")+
задатьПользователюВопрос("Оченю хороший смартфон").сВариантамиОтвета("Позвать оператора","Назад","Меню").сохранитьРезультат("userChoice")+
если("{userChoice} == Позвать оператора").то(завершитьИПеревестиНаОператора)+
если("{userChoice} == Назад").то(завершитьСНовымЗапросом("Смартфоны"))+
если("{userChoice} == Меню").то(завершитьСНовымЗапросом("Меню"))+
завершитьСНовымЗапросом("{userChoice}") |
|
Для других пунктов меню необходимо проделать ту же самую процедуру
База знаний “Меню“ с созданными документами
Пример работы
Прочие сценарии
выполнитьJs("""
var answers = conversation.answers.filter(function (str) {return str.serviceId > 0;});
var topicSet = [];
for (var i = 0; i < answers.length; i++) {
var topic = answers[i]['autofaqServiceTitle'];
if (topicSet.indexOf(topic) < 0) {topicSet.push(topic);}
}
var exit = {'topics':JSON.stringify(topicSet)};
exit;
""")+
комментарий("{topics}")+
завершить
см пример из Использование SQL запросов
установитьПеременную("id", "42")+
установитьПеременную("requestxml", "<request ID=\"{id}\" reqType=\"BALANCE\"/>")+
вызвать.внешнийСервис("https://account/api/query", "POST").сЗаголовками(("Content-Type", "text/xml;charset=UTF-8"),("Accept", "text/xml"), ("Authorization", "Basic PASSWORD")).сТеломСообщения("{requestxml}").сохранитьРезультатКакСтроку("formResponse")+
выполнитьJs("""
function escapeHtml(text) { return text.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">").replace(/"/g, """).replace(/'/g, "'") }
var exit = {}
try {
// remove <?xml ... ?> header
formResponse = formResponse.replace(/<\?xml.+\?>|<!DOCTYPE.+]>/, '')
// parse XML
var parser = new marknote.Parser();
var doc = parser.parse(formResponse);
// extract info
exit.accountBalance = doc.getRootElement().getAttributeValue('accountBalance');
exit.formResponseHTML = escapeHtml(formResponse);
} catch(e) {
exit.error = 'error' + JSON.stringify({message: e.message, stack: e.stack});
}
exit;
""") +
комментарий("{error}") +
// комментарий("formResponseHTML: {formResponseHTML}") +
завершитьСШаблоном("Балланс: {accountBalance}")
завершить
// заполнение переменных чата по результатам
// назначение ответственного на заявку
// обновление переменных чата по итогам
установитьПеременную("IntegrationSign", "Accident") +
установитьПеременную("ContactCompany", "Блок платформ") +
установитьПеременную("ServiceName", "Сервис") +
установитьПеременную("IncidentType", "Incident") +
установитьПеременную("Priority", "Medium") +
установитьПеременную("Urgency", "Regular") +
установитьПеременную("Description", "{platformInMessageQuery}") +
установитьПеременную("DetailedDescription", "Тестовый инцидент, просьба закрыть") +
установитьПеременную("Action", "CREATE") +
установитьПеременную("Company", "Компания") +
установитьПеременную("Organization", "Организация") +
установитьПеременную("Group", "Группа") +
установитьПеременную("GroupID", "26514") +
установитьПеременную("RequesterFullName", "?") +
установитьПеременную("RequesterLogin", "?") +
установитьПеременную("host", "http://Х.Х.Х.Х/arsys/services/ARService") +
выполнитьJs("""
var getClientInfoTemplate = <<EOF
<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:urn="urn:RTL:HPD:IncidentCreate">
<soapenv:Header>
<urn:AuthenticationInfo>
<urn:userName>autofaq.intergration</urn:userName>
<urn:password>.g!e:BI_qZdh</urn:password>
<!--Optional:-->
<urn:authentication>?</urn:authentication>
<!--Optional:-->
<urn:locale>?</urn:locale>
<!--Optional:-->
<urn:timeZone>?</urn:timeZone>
</urn:AuthenticationInfo>
</soapenv:Header>
<soapenv:Body>
<urn:CreateNewIncident>
<urn:Integration_Sign>${IntegrationSign}</urn:Integration_Sign>
<urn:Contact_Company>${ContactCompany}</urn:Contact_Company>
<urn:ServiceCI>${ServiceName}</urn:ServiceCI>
<urn:Incident_Type>${IncidentType}</urn:Incident_Type>
<urn:Priority>${Priority}</urn:Priority>
<urn:Urgency>${Urgency}</urn:Urgency>
<urn:Description>${Description}</urn:Description>
<urn:Detailed_Decription>${DetailedDescription}</urn:Detailed_Decription>
<urn:z1D_Action>${Action}</urn:z1D_Action>
<urn:Company>${Company}</urn:Company>
<urn:Organization>${Organization}</urn:Organization>
<urn:Group>${Group}</urn:Group>
<urn:GroupID>${GroupID}</urn:GroupID>
<urn:RequesterFullName>${RequesterFullName}</urn:RequesterFullName>
<urn:RequestreLogin>${RequesterLogin}</urn:RequestreLogin>
</urn:CreateNewIncident>
</soapenv:Body>
</soapenv:Envelope>
EOF
var exit = {'getClientInfoRqEncoded': getClientInfoTemplate.replace(/(\r\n|\n|\r)/gm,'')};
exit;
""")+
вызвать.внешнийСервис("{host}", "POST").сЗаголовками(("Content-Type", "text/xml;charset=UTF-8"),("SOAPAction","RTL:HPD:IncidentCreate")).сПараметрами(("server","skuf-ar"),("webService","RTL:HPD:IncidentCreate")).сТеломСообщения("{getClientInfoRqEncoded}").сохранитьРезультатКакСтроку("getClientInfoRs")+
комментарий("Запрос со статусом {http_code}")+
выполнитьJs("""
var parser = new marknote.Parser();
var doc = parser.parse(getClientInfoRs);
var error = 0;
var incNum = '';
var incDate = '';
var faultstring = '';
try {
incNum = doc.getRootElement().getChildElement("ns0:CreateNewIncidentResponse").getChildElement("ns0:Request_ID").getText();
incDate = doc.getRootElement().getChildElement("ns0:CreateNewIncidentResponse").getChildElement("ns0:Create_Date").getText();
} catch(e) {
error = 1;
}
try {
faultstring = doc.getRootElement().getChildElement("soapenv:Fault").getChildElement("faultstring").getText();
} catch(e) {
faultstring = '';
}
var exit = {'error': error, 'faultstring': faultstring, 'incDate':incDate, 'incNum':incNum};
exit;
""")+
если("{http_code} > 210").то(комментарий("Возникла ошибка при создании инцидента: {http_code}, {faultstring}")+
установитьПеременнуюВДиалог("a_incNum",значение = "-", название = "Номер инцидента", показыватьОператору = true, обязательное = false, редактируемое = false)+
установитьПеременнуюВДиалог("b_incDate",значение = "-", название = "Дата инцидента", показыватьОператору = true, обязательное = false, редактируемое = false)+
установитьПеременнуюВДиалог("c_incComment",значение = "", название = "Причина закрытия", показыватьОператору = true, обязательное = false, редактируемое = true)+
завершить)+
если("{error} == 1").то(комментарий("Возникла ошибка при создании инцидента. {faultstring}")+
установитьПеременнуюВДиалог("a_incNum",значение = "-", название = "Номер инцидента", показыватьОператору = true, обязательное = false, редактируемое = false)+
установитьПеременнуюВДиалог("b_incDate",значение = "-", название = "Дата инцидента", показыватьОператору = true, обязательное = false, редактируемое = false)+
установитьПеременнуюВДиалог("c_incComment",значение = "", название = "Причина закрытия", показыватьОператору = true, обязательное = false, редактируемое = true)+
завершить)+
комментарий("Создан инцидент {incNum} от {incDate}")+
установитьПеременнуюВДиалог("a_incNum",значение = "{incNum}", название = "Номер инцидента", показыватьОператору = true, обязательное = false, редактируемое = false)+
установитьПеременнуюВДиалог("b_incDate",значение = "{incDate}", название = "Дата инцидента", показыватьОператору = true, обязательное = false, редактируемое = false)+
установитьПеременнуюВДиалог("c_incComment",значение = "", название = "Причина закрытия", показыватьОператору = true, обязательное = true, редактируемое = true)+
установитьПеременнуюВДиалог("d_incStatus",значение = "-", название = "Статус инцидента", показыватьОператору = true, обязательное = false, редактируемое = false)+
установитьПеременнуюВДиалог("e_incPriority",значение = "-", название = "Приоритет инцидента", показыватьОператору = true, обязательное = false, редактируемое = false)+
установитьПеременнуюВДиалог("f_incUrgency",значение = "-", название = "Срочность инцидента", показыватьОператору = true, обязательное = false, редактируемое = false)+
установитьПеременнуюВДиалог("g_incAssignedGroup",значение = "-", название = "Назначенная группа", показыватьОператору = true, обязательное = false, редактируемое = false)+
// регистрация ответственного
установитьПеременную("Assignee", "Иванов") +
установитьПеременную("AssigneeLogin", "e.ivanov") +
выполнитьJs("""
var setGroupTemplate = <<EOF
<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:urn="urn:RTL:HPD:IncidentCreate">
<soapenv:Header>
<urn:AuthenticationInfo>
<urn:userName>autofaq.intergration</urn:userName>
<urn:password>.g!e:BI_qZdh</urn:password>
<!--Optional:-->
<urn:authentication>?</urn:authentication>
<!--Optional:-->
<urn:locale>?</urn:locale>
<!--Optional:-->
<urn:timeZone>?</urn:timeZone>
</urn:AuthenticationInfo>
</soapenv:Header>
<soapenv:Body>
<urn:SetGroup>
<!--Optional:-->
<urn:Company>${Company}</urn:Company>
<!--Optional:-->
<urn:Organization>${Organization}</urn:Organization>
<!--Optional:-->
<urn:Group>${Group}</urn:Group>
<!--Optional:-->
<urn:GroupID>${GroupID}</urn:GroupID>
<!--Optional:-->
<urn:Incident_Number>{incNum}</urn:Incident_Number>
<!--Optional:-->
<urn:Assignee>${Assignee}</urn:Assignee>
<!--Optional:-->
<urn:AssigneeLogin>${AssigneeLogin}</urn:AssigneeLogin>
</urn:SetGroup>
</soapenv:Body>
</soapenv:Envelope>
EOF
var exit = {'setGroupEncoded': setGroupTemplate.replace(/(\r\n|\n|\r)/gm,'')};
exit;
""")+
вызвать.внешнийСервис("{host}", "POST").сЗаголовками(("Content-Type", "text/xml;charset=UTF-8"),("SOAPAction","RTL:HPD:IncidentCreate")).сПараметрами(("server","skuf-ar"),("webService","RTL:HPD:IncidentCreate")).сТеломСообщения("{setGroupEncoded}").сохранитьРезультатКакСтроку("responseSetGroupEncoded")+
выполнитьJs("""
var parser = new marknote.Parser();
var doc = parser.parse(responseSetGroupEncoded);
var updateError = 0;
var updaredIncNum = '';
var updateFaultstring = '';
try {
updaredIncNum = doc.getRootElement().getChildElement("ns0:SetGroupResponse").getChildElement("ns0:Incident_Type").getText();
} catch(e) {
updateError = 1;
}
try {
updateFaultstring = doc.getRootElement().getChildElement("soapenv:Fault").getChildElement("faultstring").getText();
} catch(e) {
updateFaultstring = '';
}
var exit = {'updateError': updateError, 'updateFaultstring': updateFaultstring, 'updaredIncNum':updaredIncNum};
exit;
""")+
если("{http_code} > 210").то(комментарий("Возникла ошибка при назначении ответственного: {http_code}, {faultstring}")+
завершить)+
если("{updateError} == 1").то(комментарий("Возникла ошибка при назначении ответственного: {faultstring}")+
завершить)+
комментарий("Назначен отвественный {Assignee}, группа {Group}")+
завершить