Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

Expand
titleВызов внешнего сервиса и разбор ответа в JS
Code Block
установитьПеременную("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}")+
завершить

Интеграционные сценарии для кнопок “Действия” операторов

В качестве тегов можно использовать функцию “установитьПеременнуюВДиалог“ с типом “Выпадающий список“
Expand
titleИспользование тегов в диалоге
Отправка переписки с пользователем на произвольный Email
Expand
titleВнесение оператором Email в контактные данные клиента
Code Block
установитьПеременнуюВДиалог(
    ключ = "priority",
    значение = "",
    название = "Выберите тег",
    редактируемое = true,
    показыватьОператору = true,
    обязательное = true,
    множественныйВыбор = true,
    тип = "Выпадающий список",
    варианты = "{\"Тег 1\": \"t1\", \"Тег 2\": \"t2\"}"
)+
завершить
Image RemovedImage Removed

Интеграционные сценарии для кнопок “Действия” операторов

Code Block
// Пример сценария опроса оператора с заполнением метаданных пользователя
// Сценарий предназначен для подключения в Интеграцию на событие "Нажата кнопка оператора"
установитьПеременную("_email", "{userPayload.Email}установитьПеременную("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",
  описаниетип = "EmailОднострочный редактируемый пользователятекст",
  обязательное = true
) +
//
показываемдобавитьПолеВФормуОператора(
форму оператору, покаформа оператор= не "Отправить на Email",
  переменная = "comment",
  название = "Комментарий",
  тип = "Многострочный редактируемый текст",
  значение = "",
  обязательное = false
)+
// Показываем форму оператору, пока оператор не закроет форму сценарий ждет 
// если оператор нажмет в форме Отмена - сценарий остановится
показатьФормуОператору(имя = "ОбновлениеОтправить данныхна пользователяEmail") +
комментарий("Обовлены данные пользователя")+
установитьПеременнуюПользователю("userPayload.Email// отправка запроса
вызвать.внешнийСервис("{host}", "POST").сЗаголовками(("Authorization", "{_emailtoken}")+
завершить
Expand
titleСоздание заявки в ITSM системе с использованием данных пользователя для динамического заполнения необходимых полей на примере Jira (Запуск интеграции по кнопке)
Code Block
// Адрес 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,("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}")
Image AddedImage Added
Expand
titleИспользование тегов в диалоге

В качестве тегов можно использовать функцию “установитьПеременнуюВДиалог“ с типом “Выпадающий список“

Code Block
установитьПеременнуюВДиалог(
    ключ = "priority",
    значение = "",
    название = "Выберите тег",
    редактируемое = true,
    показыватьОператору = true,
    обязательное = true,
    множественныйВыбор = true,
    тип = "Выпадающий список",
    варианты = "{\"Тег 1\": \"t1\", \"Тег 2\": \"t2\"}"
)+
завершить
Image AddedImage Added
Expand
titleВнесение оператором Email в контактные данные клиента
Code Block
// Пример сценария опроса оператора с заполнением метаданных пользователя
// Сценарий предназначен для подключения в Интеграцию на событие "Нажата кнопка оператора"
установитьПеременную("_email", "{userPayload.Email}")+
// Собираем поля для формы оператора
// Добавляем текстовое поле для отображения информации
добавитьПолеВФормуОператора(
  форма = "Обновление данных пользователя",
  переменная = "formName",
  название = "",
  значение = "Укажите новые значение или сотрите старые",
  тип = "Нередактируемый текст",
  описание = "",
  обязательное = false
) +
// Добавляем поля пользователя
добавитьПолеВФормуОператора(
  форма = "Обновление данных пользователя",
  переменная = "_email",
  название = "Email",
  тип = "Однострочный редактируемый текст",
  описание = "Email пользователя",
  обязательное = true
) +
// показываем форму оператору, пока оператор не закроет форму сценарий ждет 
// если оператор нажмет в форме Отмена - сценарий остановится
показатьФормуОператору(имя = "Обновление данных пользователя") +
комментарий("Обовлены данные пользователя")+
установитьПеременнуюПользователю("userPayload.Email", "{_email}")+
завершить
Expand
titleСоздание заявки в ITSM системе с использованием данных пользователя для динамического заполнения необходимых полей на примере Jira (Запуск интеграции по кнопке)
Code Block
// Адрес 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
)+
завершить
Image AddedImage Added

Expand
titleФорма с использованием полей различных типов (Запуск интеграции по кнопке)
Code Block
комментарий("Запуск интеграции по кнопке.")+
установитьПеременнуюВДиалог("Поле 2", значение = "Field 2", название = "Поле 2", показыватьОператору = true, обязательное = true, редактируемое = false)+
установитьПеременную("priority", "{\"v1\": \"Blocker\", \"v2\": \"Critical\", \"v3\": \"Major\", \"v4\": \"Minor\"}") +
добавитьПолеВФормуОператора(
  форма = "ОбновлениеЗаведение заявки в Jira",
  переменная = "issuetypet1",
  название = "Тег",Что вам нужно тип =сделать: "Выпадающий список",
  описаниетип = "Выберите из списка критичность заявкиНередактируемый текст",
  обязательноезначение = true,
  варианты = "{tags}"Заполните форму"
) +
//добавитьПолеВФормуОператора(
показываем форму оператору,форма пока= оператор"Заведение незаявки закроетв формуJira",
сценарий ждет переменная // если оператор нажмет в форме Отмена - сценарий остановится
показатьФормуОператору(имя= "t2",
  название = "Название заявки",
  тип = "ОбновлениеОднострочный редактируемый заявкитекст"),
+ // отправкаописание запроса= на"Введите регистрациюназвание инцидентазаводимой взаявки",
соответствии с выбраннымизначение значениями= вызвать.внешнийСервис("{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
)+
завершить
Image RemovedImage Removed

Expand
titleФорма с использованием полей различных типов (Запуск интеграции по кнопке)
Code Block
комментарий("Запуск интеграции по кнопке.")+
установитьПеременнуюВДиалог("Поле 2", значение = "Field 2", название = "Поле 2", показыватьОператору = true, обязательное = true, редактируемое = false)+
установитьПеременную("priority", "{\"v1\": \"Blocker\", \"v2\": \"Critical\", \"v3\": \"Major\", \"v4\": \"Minor\"}") +
добавитьПолеВФормуОператора(
  форма = "Заведение заявки в Jira",
  переменная = "t1",
  название = "Что вам нужно сделать: ",
  тип = "Нередактируемый текст",
  значение = "Заполните форму"
) +
добавитьПолеВФормуОператора(
  форма = "Заведение заявки в Jira",
  переменная = "t2",
  название = "Название заявки",
  тип = "Однострочный редактируемый текст",
  описание = "Введите название заводимой заявки",
  значение = "Введите",
  обязательное = true
) +
  обязательное = 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}")+
комментарий("Конец сценария интеграции!")
Image Added
Expand
titleУправление метаданными пользователя через форму оператора
Code Block
// Пример сценария опроса оператора с заполнением метаданных пользователя
// Сценарий предназначен для подключения в Интеграцию на событие "Нажата кнопка оператора"
// После установки переменных новые данные отправляются в CRM и сохраняются в профиле пользователя в АФ
// 
установитьПеременную("host", "http://xxxx")+
установитьПеременную("_height", "{userPayload.Рост}")+
установитьПеременную("_weight", "{userPayload.Вес}")+
установитьПеременную("_typeNum", "{userPayload.Тип}")+
установитьПеременную("_comment", "{userPayload.Комментарий}")+
// Списки вариантов тегов 
установитьПеременную("types", "{\"Ученик\": \"Ученик\", \"Лид\": \"Лид\", \"Преподаватель\": \"Преподаватель\", \"Прочее\": \"Прочее\"}") +
// Собираем поля для формы оператора
// Добавляем текстовое поле для отображения информации
добавитьПолеВФормуОператора(
  форма = "ЗаведениеОбновление заявкиданных в Jiraпользователя",
  переменная = "t3formName",
  название = "Критичность",
  типзначение = "ВыпадающийУкажите список",новые значение или описаниесотрите = "Выберите из списка критичность заявки"старые",
  обязательноетип = "Нередактируемый trueтекст",
  значениеописание = "v3",
   вариантыобязательное = "{priority}"false
) +
// Добавляем поля пользователя
добавитьПолеВФормуОператора(
  форма = "Заведение заявкиОбновление вданных Jiraпользователя",
  переменная = "t4_height",
  название = "ОписаниеРост",
  тип = "МногострочныйЦелое редактируемый текстчисло",
  описание = "ОпишитеРост вашупользователя, проблемусм",
  обязательное = truefalse
) +
добавитьПолеВФормуОператора(
  форма = "ЗаведениеОбновление заявкиданных в Jiraпользователя",
  переменная = "t5_weight",
  название = "Уведомить руководителя?Вес",
  тип = "ПереключательЦелое число",
  обязательноеописание = false
) +
установитьПеременную("tags""Вес пользователя, "{\"v1\": \"Teacher\", \"v2\": \"Student\", \"v3\": \"Sales\", \"v4\": \"Tech\"}"кг",
  обязательное = false
) +
добавитьПолеВФормуОператора(
  форма = "ЗаведениеОбновление заявкиданных в Jiraпользователя",
  переменная = "t6_type",
  название = "ТегиТип",
  тип = "МножественныйВыпадающий выборсписок",
  описание = "Выберите теги,из которымисписка пометитьтип обращениепользователя",
  вариантыобязательное = "{tags}"false,
  обязательноеварианты = true"{types}"
) +
добавитьПолеВФормуОператора(
  форма = "Заведение заявки в Jira",
  переменная = "t7",
  тип = "Целое число",(
  названиеформа = "ЧастотаОбновление возникновенияданных проблемыпользователя",
  описаниепеременная = "% пользователей, у которых возникает проблема" 
) +
показатьФормуОператору(имя = "Заведение заявки в Jira") +
комментарий("Вот что у нас получилось: {t2}, {t3}, {t4}")+
комментарий("Конец сценария интеграции!")
Image Removed
Expand
titleУправление метаданными пользователя через форму оператора
Code Block
// Пример сценария опроса оператора с заполнением метаданных пользователя
// Сценарий предназначен для подключения в Интеграцию на событие "Нажата кнопка оператора"
// После установки переменных новые данные отправляются в 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
)+
завершить

...

_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
)+
завершить

Сценарии для модуля Приветствие

Expand
titleПриветствие с сообщением об отсутствии поддержки в зависимости от времени суток

Реализован для Московского времени, где +3 GMT, переменная HourOffset

Code Block
установитьПеременную("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}")
Expand
titleПриветствие пользователя с интерактивным меню
Code Block
задатьПользователюВопрос("Здравствуйте 😊<br>Что Вас интересует?").сВариантамиОтвета("Первое","Второе","Компот").сохранитьРезультат("userChoice")+
если("{userChoice} == Первое").то(завершитьСНовымЗапросом("Первые блюда"))+
если("{userChoice} == Второе").то(завершитьСНовымЗапросом("Вторые блюда"))+
если("{userChoice} == Компот").то(завершитьСШаблоном("Закончился. Всего хорошего!"))+
завершитьСНовымЗапросом("{userChoice}")

...

Expand
titleРеализация пользовательского меню

Принцип работы: для перемещения по меню пользователь вводит названия нужных документов в базах знаний. С помощью команды “задатьПользователюВопрос“ можно сделать процесс ввода текста более удобным и понятным.

В качестве приветствия будем использовать сценарий:

Code Block
сообщениеПользователю.сШаблоном("Добро пожаловать в наш магазин")+завершитьСНовымЗапросом("Меню")

Таким образом все пользователи изначально будут попадать в наше меню

Создадим новую базу знаний. Для удобства назовем ее “Меню“

Добавим документ-сценарий с именем “Главное меню“ и вопросом “меню“

Code Block
задатьПользователюВопрос("Для уточнения информации выберите раздел").сВариантамиОтвета("Смартфоны","Планшеты","Аксессуары","Другие вопросы").сохранитьРезультат("userChoice")+
если("{userChoice} == Смартфоны").то(завершитьСНовымЗапросом("Смартфоны"))+
если("{userChoice} == Планшеты").то(завершитьСНовымЗапросом("Планшеты"))+
если("{userChoice} == Аксессуары").то(завершитьСНовымЗапросом("Аксессуары"))+
завершитьСНовымЗапросом("{userChoice}")
Image Modified

Добавим документ-сценарий с именем “Смартфоны“ и вопросом “Смартфоны“. Он будет являться каталогом смартфонов. Для удобства можно создать отдельную базу знаний

Code Block
задатьПользователюВопрос("Выберите смартфон").сВариантамиОтвета("Смартфон_1","Смартфон_2","Смартфон_3", "Меню").сохранитьРезультат("userChoice")+
если("{userChoice} == Смартфон_1").то(завершитьСНовымЗапросом("Смартфон_1"))+
если("{userChoice} == Смартфон_2").то(завершитьСНовымЗапросом("Смартфон_2"))+
если("{userChoice} == Смартфон_3").то(завершитьСНовымЗапросом("Смартфон_3"))+
если("{userChoice} == Меню").то(завершитьСНовымЗапросом("Меню"))+
завершитьСНовымЗапросом("{userChoice}")
Image Modified

Добавим документ-сценарий с именем “Смартфон_1“ и вопросом “Смартфон_1“. В данном документе можно разместить фото и описание отдельно взятого смартфона

Code Block
сообщениеПользователю.сФайлами(852).сШаблоном("")+
задатьПользователюВопрос("Оченю хороший смартфон").сВариантамиОтвета("Позвать оператора","Назад","Меню").сохранитьРезультат("userChoice")+
если("{userChoice} == Позвать оператора").то(завершитьИПеревестиНаОператора)+
если("{userChoice} == Назад").то(завершитьСНовымЗапросом("Смартфоны"))+
если("{userChoice} == Меню").то(завершитьСНовымЗапросом("Меню"))+
завершитьСНовымЗапросом("{userChoice}")
Image Modified

Для других пунктов меню необходимо проделать ту же самую процедуру

База знаний “Меню“ с созданными документами

Пример работы

...