Захват DTMF-сигналов во время разговора — различия между версиями

Материал из Oktell
Перейти к: навигация, поиск
м (Установка готовых сценариев в систему)
 
(не показано 15 промежуточных версии этого же участника)
Строка 5: Строка 5:
 
==Введение==
 
==Введение==
  
'''Задача:''' Определять во время разговора введенные DTMF-символы на внешней и внутренней линии. В зависимости от линии и введенного на ней символа запускать различные процессы на сервере и клиентском приложении сотрудника. Например, при нажатии на 1 — открыть в браузере сайт oktell.ru, при нажатии на 2 — привязать звонок к задаче Call-центра.  
+
'''Задача:''' Определять во время разговора введенные DTMF-символы на внешней и внутренней линии. В зависимости от линии и введенного на ней символа запускать различные процессы на сервере и клиентском приложении сотрудника. Например, при нажатии сотрудником на 1 — открыть в браузере сайт oktell.ru, при нажатии на 2 — привязать звонок к задаче Call-центра.  
  
 
На самом деле Oktell уже имеет похожие возможности в виде служебных номеров флеша и управления конференцией. Набрав во время разговора эти номера, система выполняет определенные действия. Например, нажав служебный номер флеш — система ставит абонента на удержание. Для управления конференцией существуют даже комбинации, которые добавляют или удаляют пользователя из конференции. К сожалению, на момент написания статьи в интерфейсе системы нельзя добавить свой служебный номер для выполнения особых действий.
 
На самом деле Oktell уже имеет похожие возможности в виде служебных номеров флеша и управления конференцией. Набрав во время разговора эти номера, система выполняет определенные действия. Например, нажав служебный номер флеш — система ставит абонента на удержание. Для управления конференцией существуют даже комбинации, которые добавляют или удаляют пользователя из конференции. К сожалению, на момент написания статьи в интерфейсе системы нельзя добавить свой служебный номер для выполнения особых действий.
Строка 11: Строка 11:
 
Однако, проблема решается с помощью самостоятельного перехвата DTMF-сигналов во время разговора. В системе есть возможность с помощью сценариев получить введенные символы как с внешней, так и с внутренней линии. В процессе настройки сценариев вы сами определяете какие действия должна выполнить система при нажатии того или иного символа (или их комбинации). Таким образом, в Oktell можно реализовать неограниченное количество "служебных комбинаций".
 
Однако, проблема решается с помощью самостоятельного перехвата DTMF-сигналов во время разговора. В системе есть возможность с помощью сценариев получить введенные символы как с внешней, так и с внутренней линии. В процессе настройки сценариев вы сами определяете какие действия должна выполнить система при нажатии того или иного символа (или их комбинации). Таким образом, в Oktell можно реализовать неограниченное количество "служебных комбинаций".
  
Функционал полезен в случаях, когда операторы часто проделывают одни и те же действия: добавить текущий контакт в CRM-систему, открыть карточку клиента в браузере. С помощью определенных символов сотрудник может пометить клиента, чтобы система, к примеру, отправила ему SMS после разговора. Введенные символы на внешней стороне применяются для ввода скрытых данных, например, пароля во время разговора. Это может быть использовано для подтверждения операций в банковской сфере, не сообщая оператору личной информации.  
+
Функционал полезен в случаях, когда операторы часто проделывают одни и те же действия: добавляют текущий контакт в CRM-систему, открывают карточку клиента в браузере. С помощью определенных символов сотрудник может пометить клиента, чтобы система, к примеру, отправила ему SMS после разговора. Введенные символы на внешней стороне применяются для ввода скрытых данных, например, пароля во время разговора. Это может быть использовано для подтверждения операций в банковской сфере, не сообщая оператору личной информации.
  
  
Строка 21: Строка 21:
 
[[Файл:Перехват DTMF-001.png|center]]
 
[[Файл:Перехват DTMF-001.png|center]]
  
 
+
<div id="out"></div>
Для внешних линий  и внутренних линий (начиная с версии 2.12) введенные DTMF дополнительно записываются в таблице <code>[oktell]..[a_stat_dtmf]</code>, если включить соответствующие настройки в разделе Администрирование/Управление базами данных — Сохранять в БД все получаемые по внешним/внутренним линиям DTMF-символы.  
+
Дополнительно все введенные DTMF сохраняются в таблице <code>[oktell]..[a_stat_dtmf]</code>. Для этого необходимо включить соответствующие настройки в разделе Администрирование/Общие настройки/Управление базами данных — ''Сохранять в БД все получаемые по внешним/внутренним линиям DTMF-символы''. Для считывания DTMF потребуется отдельный служебный сценарий, который будет циклично мониторить таблицу на предмет ввода новых символов.  
  
  
Строка 29: Строка 29:
  
 
==Главный IVR сценарий==
 
==Главный IVR сценарий==
 +
 +
Поскольку в главный IVR сценарий попадает внешняя линия, установленный "Ввод значения" будет принимать DTMF только на этой внешней линии. В рамках задачи необходимо принимать DTMF и с внутренней линии, следовательно нужно дозвониться до нее и также запустить на ней IVR сценарий. Такая операция реализуется через дозвон и конференцию с моделью поведению "Преобразовать в коммутацию".
 +
 +
 +
[[Файл:Перехват DTMF-003.png|center]]
 +
 +
 +
Компонент "'''Начальные параметры'''". Определяет параметры клиента и сохраняет в переменные:
 +
* сессионной переменной <span style="color:blue">'''phone'''</span> (строковая) присваивается внутренний номер, на который происходит переключение. В примере, строка "900".
 +
* сессионной переменной <span style="color:blue">'''key'''</span> (строковая) присваивается значение выражения <code>RANDOM(999999)</code>. Переменная используется в качестве ключа конференции.
 +
* сессионной переменной <span style="color:blue">'''CallerId'''</span> (строковая) присваивается значение функции Номер абонента (CallerId). Переменная хранит номер абонента.
 +
 +
 +
[[Файл:Перехват DTMF-005.png|center]]
 +
 +
 +
Компонент "'''В конференцию'''". Отправляет клиента в конференцию с моделью поведения "Преобразовать в коммутацию". Как только в эту коммутацию присоединится второй участник она преобразуется в обычный разговор. Ключ конференции предварительно генерируется случайным образом.
 +
*Ключ конференции — переменная '''key'''
 +
*Создать, если отсутствует - да
 +
*Расширенная настройка — да
 +
*Модель поведения - Преобразовать в коммутацию
 +
 +
 +
Компонент "'''На дозвон'''". Запускает сценарий дозвона до внутреннего номера с последующим добавлением в конференцию. Все сессионные переменные будут переданы в этот сценарий автоматически.
 +
*Тип запуска — асинхронный служебный
 +
*Сценарий - Перехват DTMF (служебный сценарий дозвона)
 +
 +
 +
Компонент "'''Перехват DTMF'''". Запускает сценарий для считывания DTMF-сигналов с данной внешней линии. Параметр запуска '''0''' означает, что сценарий запускается для внешней линии (рассматривается ниже).
 +
* Тип запуска - вложенный
 +
* Сценарий - Перехват DTMF (IVR сценарий перехвата DTMF)
 +
* Параметр запуска - строка "0"
 +
 +
 +
[[Файл:Перехват DTMF-004.png|center]]
 +
  
 
==Служебный сценарий дозвона==  
 
==Служебный сценарий дозвона==  
 +
 +
Сценарий дозванивается до внутреннего пользователя и запускает на его линии IVR сценарий добавления в конференцию. В сценарии не предусмотрен случай, когда внутренний абонент не берет трубку.
 +
 +
 +
[[Файл:Перехват DTMF-006.png|center]]
 +
 +
 +
Компонент "'''Дозвон'''". Все используемые сессионные переменные должны строго иметь такие же наименования, как и в главном сценарии.
 +
* Номер/команда - сессионная переменная <span style="color:blue">'''phone'''</span> (строковая)
 +
* Среда - внутренний номерной план
 +
* Обслуживание - IVR
 +
* Сценарий IVR - Перехват DTMF (IVR сценарий входа в конференцию)
 +
* Параметр запуска - сессионная переменная <span style="color:blue">'''key'''</span> (строковая)
 +
* CallerId - сессионная переменная <span style="color:blue">'''CallerId'''</span> (строковая)
 +
  
 
==IVR сценарий входа в конференцию==
 
==IVR сценарий входа в конференцию==
 +
 +
Сценарий запускается после ответа внутреннего сотрудника и добавляет его в конференцию, которая сразу же преобразовывается в коммутацию. После этого начинает считывать вводимые DTMF с данной внутренней линии.
 +
 +
 +
[[Файл:Перехват_DTMF-007.png|center]]
 +
 +
 +
Компонент "'''Старт'''". На вход сценария передается номер конференции, в которую следует добавить внутреннего сотрудника. Параметр запуска сохраняется в переменную '''key'''.
 +
*Параметр запуска - переменная '''key''' (строковая)
 +
 +
 +
Компонент "'''В конференцию'''". Добавляет сотрудника в конференцию с указанным ключом.
 +
*Ключ конференции — переменная '''key'''
 +
*Создать, если отсутствует - да
 +
*Расширенная настройка — да
 +
*Модель поведения - Преобразовать в коммутацию
 +
 +
Компонент "'''Перехват DTMF'''". Запускает сценарий для считывания DTMF-сигналов с текущей внутренней линии. Параметр запуска '''1''' означает, что сценарий запускается для внутренней линии (рассматривается ниже).
 +
* Тип запуска - вложенный
 +
* Сценарий - Перехват DTMF (IVR сценарий перехвата DTMF)
 +
* Параметр запуска - строка "1"
 +
 +
 +
[[Файл:Перехват DTMF-008.png|center]]
 +
  
 
==IVR сценарий перехвата DTMF==
 
==IVR сценарий перехвата DTMF==
 +
 +
Основной сценарий для захвата DTMF и выполнения служебных действий. Главная идея — зациклить компонент "Ввод значения", анализируя введенные значения. Напомним, что этот сценарий — единый для внешних и внутренних линий, поэтому на старт передавался флаг, поясняющий тип линии: 0 - внешняя линия, 1 - внутренняя. Такое разделение помогает реализовать различный функционал для сотрудников и клиентов.
 +
 +
 +
[[Файл:Перехват DTMF-009.png|center]]
 +
 +
 +
Компонент "'''Старт'''". На вход сценария передается тип линии. Компонент сохраняет параметр запуска в переменную '''startParam'''.
 +
*Параметр запуска - переменная '''startParam''' (строковая)
 +
 +
 +
Компонент "'''Внутренняя линия?'''". Определяет тип линии и направляет сценарий на соответствующую ветку.
 +
*Аргумент 1 — переменная '''startParam'''
 +
*Аргумент 2 — строка '''1'''
 +
*Тип сравнения — "="
 +
*Переход, если правда — на компонент "Ввод с внутренней линии"
 +
*Переход, если ложь — на компонент "Ввод с внешней линии"
 +
 +
 +
Компонент "'''Ввод с внутренней линии'''". Ожидает ввода одного символа с внутренней линии, затем сохраняет введенный символ в переменную '''DTMF'''. Переход к анализу происходит только если символ введен.
 +
*Буфер для DTMF - переменная '''DTMF''' (строковая)
 +
*Очистить буфер - Да
 +
*Макс время, с - 20
 +
*Количество символов - 1
 +
*Переход - на компонент "Ув2"
 +
*Переход, таймаут - на компонент "->"
 +
 +
 +
[[Файл:Перехват DTMF-010.png|center]]
 +
 +
 +
Компонент "'''Ув2'''". Отладочное уведомление для вывода захваченного символа
 +
* Текст — выражение <code>ScriptFunc( 'Имя пользователя' )+' набрал символ '+[DTMF]</code>
 +
* Способ оповещения — Всплывающее уведомление
 +
* Ключ получателя — введите внутренний номер вашего пользователя
 +
 +
 +
Компонент "'''Определение символа'''". Анализирует введенный символ — по нажатию на 1 у сотрудника должна открыться веб-страница в браузере, а по нажатию на 2 звонок должен прикрепиться к задаче.
 +
* Аргумент - переменная '''DTMF'''
 +
* Значения -
 +
: 1 - на компонент "Ув3"
 +
: 2 - на компонент "Ув4"
 +
* Переход, прочее — на компонент "->"
 +
 +
 +
[[Файл:Перехват DTMF-011.png|center]]
 +
 +
 +
Компоненты "'''Ув3 и Ув4'''". Отладочные уведомления о выбранных действиях.
 +
 +
 +
Компонент "'''Действие 1'''". Запускает сценарий для открытия страницы Oktell.ru в браузере. На вход сценария передается идентификатор оператора, для которого нужно это выполнить.
 +
* Тип запуска - Асинхронный служебный
 +
* Сценарий - Перехват DTMF (Служебный сценарий для открытия сайта)
 +
* Параметр запуска - функция "Guid-идентификатор пользователя".
 +
 +
 +
Компонент "'''Действие 2'''". Запускает сценарий для привязки звонка к задаче. На вход сценария передается идентификатор оператора, для которого нужно это выполнить.
 +
* Тип запуска - Асинхронный служебный
 +
* Сценарий - Перехват DTMF (Служебный сценарий для привязки звонка к задаче)
 +
* Параметр запуска - функция "Guid-идентификатор пользователя".
 +
 +
 +
[[Файл:Перехват DTMF-012.png|center]]
 +
 +
 +
Компонент "'''->'''". Не имеет функционального предназначения, используется для связки компонентов.
 +
* Время задержки, мс - 0
 +
 +
 +
Компонент "'''Ввод с внешней линии'''". Аналогичные действия выполняются для внешней линии. Компонент считывает DTMF, введенные на внешней линии.
 +
*Буфер для DTMF - переменная '''DTMF''' (строковая)
 +
*Очистить буфер - Да
 +
*Макс время, с - 20
 +
*Количество символов - 1
 +
*Переход - на компонент "Ув1"
 +
*Переход, таймаут - на компонент "->"
 +
 +
 +
Компонент "'''Ув1'''". Отладочное уведомление для вывода захваченного символа. После компонента вы можете аналогично реализовать функционал для внешних линий.
 +
* Текст — выражение <code>'Линия '+ScriptFunc( 'Номер линии' )+' набрал символ '+[DTMF]</code>
 +
* Способ оповещения — Всплывающее уведомление
 +
* Ключ получателя — введите внутренний номер вашего пользователя
 +
 +
 +
[[Файл:Перехват DTMF-013.png|center]]
 +
  
 
==Служебный сценарий для открытия сайта==
 
==Служебный сценарий для открытия сайта==
 +
 +
Сценарий выполняется после нажатия на внутренней линии символа "1". Открывает страницу <nowiki>https://oktell.ru</nowiki> в браузере на компьютере сотрудника. Ключ сотрудника передается на вход сценария.
 +
 +
 +
[[Файл:Перехват DTMF-014.png|center]]
 +
 +
 +
Компонент "'''Старт'''". На вход сценария передается идентификатор пользователя. Компонент сохраняет параметр запуска в переменную '''GUID пользователя'''.
 +
*Параметр запуска - переменная '''GUID пользователя''' (строковая)
 +
 +
 +
Компонент "'''Открыть веб-страницу'''". Открывает указанную веб-страницу в браузере по умолчанию на компьютере пользователя.
 +
*Ключ пользователя - переменная '''GUID пользователя'''
 +
*Файл - строка "''https://oktell.ru''"
 +
*Путь - Абсолютный
 +
*Режим запуска - С помощью оболочки
 +
 +
 +
[[Файл:Перехват DTMF-016.png|center]]
 +
  
 
==Служебный сценарий для привязки звонка к задаче==
 
==Служебный сценарий для привязки звонка к задаче==
 +
 +
Сценарий выполняется после нажатия символа "2" на внутренней линии. Прикрепляет текущий звонок к задаче. Напомним, что прикрепление звонка к задаче работает только во время действующего разговора, при наличии данного оператора в режиме Call-центр и активной задаче. Если одно из этих условий не выполнено, то сценарий не сработает. Ключ сотрудника, для которого нужно прикрепить звонок, передается на вход сценария.
 +
 +
 +
[[Файл:Перехват DTMF-015.png|center]]
 +
 +
 +
Компонент "'''Старт'''". На вход сценария передается идентификатор пользователя. Компонент сохраняет параметр запуска в переменную '''GUID пользователя'''.
 +
*Параметр запуска - переменная '''GUID пользователя''' (строковая)
 +
 +
 +
Компонент "'''Привязать звонок к задаче'''". Прикрепляет текущий звонок пользователя к указанной задаче.
 +
*Действие - Установить
 +
*Тип объекта - Задача
 +
*Задача - выберите задачу Call-центра
 +
*Свойство/действие - Привязать к звонку оператора
 +
*Значение - переменная '''GUID пользователя'''
 +
 +
 +
[[Файл:Перехват DTMF-017.png|center]]
 +
  
 
==IVR сценарий исходящей маршрутизации==
 
==IVR сценарий исходящей маршрутизации==
 +
 +
Ранее мы подробно рассмотрели перехват DTMF во время входящего звонка. В данном параграфе рассматривается перехват DTMF во время исходящего звонка. Для реализации функционала потребуется модифицировать сценарий исходящей маршрутизации.
 +
 +
Поскольку этот сценарий запускается на внутренней линии, изначально мы сможем перехватывать только сигналы с внутренних линий. Как говорилось ранее, нам для перехвата DTMF нужно запустить IVR сценарий на требуемой линии. Вы можете воспользоваться указанным выше алгоритмом через создание конференции, однако мы рассмотрим альтернативный способ считывания сигналов непосредственно из БД. Для работы данного сценария необходимо [[Захват_DTMF-сигналов_во_время_разговора#out|установить]] флажок "''Сохранять в БД все получаемые по внешним/внутренним линиям DTMF-символы''" в модуле ''Администрирование/Общие настройки/Управление базами данных''.
 +
 +
В сценарии исходящей маршрутизации после успешного соединения нужно установить запуск служебного сценария для получения DTMF из БД и IVR сценарий для захвата сигналов с данной линии. Также чтобы получать DTMF с нужной внешней линии, необходимо сохранить ее идентификатор в компоненте "'''ВНЕШНИЕ'''".
 +
 +
 +
[[Файл:Перехват DTMF-018.png|center]]
 +
 +
 +
Компонент "'''ВНЕШНИЕ'''". В компоненте необходимо сохранить идентификатор выбранной линии в сессионную переменную "<span style="color:blue">'''Line'''</span>" (строковая)
 +
*Идентификатор выбранной линии - сессионная переменная "<span style="color:blue">'''Line'''</span>" (строковая)
 +
 +
 +
Компонент "'''Получение DTMF из БД'''". Запускает сценарий для мониторинга таблицы <code>a_stat_dtmf</code>
 +
* Тип запуска - Асинхронный служебный
 +
* Сценарий - Перехват DTMF (Служебный сценарий для получения DTMF из БД)
 +
 +
 +
Компонент "'''Перехват DTMF'''". Запускает сценарий для считывания DTMF-сигналов с текущей внутренней линии. Параметр запуска '''1''' означает, что сценарий запускается для внутренней линии. Сценарий рассмотрен выше.
 +
* Тип запуска - вложенный
 +
* Сценарий - Перехват DTMF (IVR сценарий перехвата DTMF)
 +
* Параметр запуска - строка "1"
 +
 +
 +
[[Файл:Перехват DTMF-019.png|center]]
 +
  
 
==Служебный сценарий для получения DTMF из БД==
 
==Служебный сценарий для получения DTMF из БД==
 +
Основная идея сценария - циклично осуществлять запросы в таблицу <code>[oktell]..[a_stat_dtmf]</code> и последовательно считывать все введенные символы с внешней линии. На каждой итерации символы анализируются и производятся заранее настроенные действия. Через сессионную переменную <span style="color:blue">'''Line'''</span> сценарий получает идентификатор линии, по которой нужно захватывать DTMF.
 +
 +
 +
[[Файл:Перехват DTMF-020.png|center]]
 +
 +
 +
Компонент "'''Текущее время'''". Сохраняет текущее время в переменную '''dt'''. Используется в качестве начального параметра для поиска DTMF в таблице.
 +
* переменной '''dt''' (дата/время) присваивается значение функции "''Текущие дата и время''"
 +
 +
 +
Компонент "'''idchain'''". Определяет текущий идентификатор цепочки коммутаций на внешней линии. Требуется для поиска DTMF в таблице, а также для проверки существования коммутации.
 +
*Действие - Определить
 +
*Тип объекта - Линия
 +
*Ключ линии - сессионная переменная <span style="color:blue">'''Line'''</span> (строковая)
 +
*Значение в переменную - переменная '''idchain''' (строковая)
 +
 +
 +
Компонент "'''Ув1'''". Отладочное уведомление для вывода значения переменной '''idchain'''.
 +
*Отладочный режим - Да
 +
*Текст - переменная '''idchain'''
 +
*Ключ получателя - введите ваш внутренний номер
 +
 +
 +
[[Файл:Перехват DTMF-021.png|center]]
 +
 +
 +
Компонент "'''Не в коммутации?'''". Проверяет существование сессии (цепочки коммутаций) на линии. Если текущая цепочка коммутаций равна строке "''00000000-0000-0000-0000-000000000000''" заканчивает служебный сценарий.
 +
*Аргумент 1 - переменная '''idchain'''
 +
*Аргумент 2 - строка ''00000000-0000-0000-0000-000000000000''
 +
*Тип сравнения - "="
 +
*Переход, если правда - на компонент "Ув2".
 +
*Переход, если ложь - на компонент "получить DTMF"
 +
 +
 +
Компонент "'''Ув2'''". Уведомляет администратора о завершении сценарии.
 +
*Текст - строка ''Сценарий получения DTMF завершен''
 +
*Ключ получателя - введите ваш внутренний номер
 +
 +
 +
Компонент "'''Получить DTMF'''". Выполняет SQL-запрос в таблицу <code>[oktell]..[a_stat_dtmf]</code> для получения последнего DTMF по текущей цепочки коммутаций на данной линии. Запрос построен таким образом, что последовательно считывает введенные символы, сохраняя каждый раз временную метку. Таким образом, вне зависимости от скорости ввода символов запрос гарантирует их последовательный перебор.
 +
 +
select top 1 @dt=dt, @symbol = symbol from a_stat_dtmf
 +
where idchain = @idchain
 +
and dt > @dt
 +
order by dt asc
 +
где
 +
*@dt - переменная '''dt'''
 +
*@idchain - переменная '''idchain'''
 +
*@symbol - переменная '''symbol''' (строковая)
 +
 +
 +
[[Файл:Перехват DTMF-022.png|center]]
 +
 +
 +
Компонент "'''пусто'''". Проверяет был ли введен символ.
 +
*Аргумент 1 - переменная '''symbol'''
 +
*Аргумент 2 - пустая строка
 +
*Тип сравнения - "="
 +
*Переход, если правда - на компонент "1000ms".
 +
*Переход, если ложь - на компонент "Ув3"
 +
 +
 +
Компонент "'''Ув3'''". Выводит на экран принятый DTMF-символ. После компонента вы можете реализовать функционал для внешних линий, аналогично вышеописанному сценарию перехвата символов.
 +
*Отладочный режим - Нет
 +
*Текст - выражение <code>'Линия '+[NumLine]+' набрала символ '+[symbol]</code>
 +
*Ключ получателя - введите ваш внутренний номер.
 +
 +
 +
Компонент "'''1000ms'''". Пауза перед следующей итерацией. Во избежание загрузки базы данных не рекомендуется ставить интервал менее 500 мс.
 +
*Время задержки, мс - 1000
 +
 +
 +
[[Файл:Перехват DTMF-023.png|center]]
 +
 +
 +
Компонент "'''->'''". Не имеет функционального предназначения, используется для связки компонентов.
 +
* Время задержки, мс - 0
 +
 +
 +
Компонент "'''Обнуляем'''". Очищает переменную '''symbol''' перед новой итерацией.
 +
* переменной '''symbol''' присваивается пустая строка.
 +
 +
 +
[[Файл:Перехват DTMF-024.png|center]]
 +
  
 
==Установка готовых сценариев в систему==
 
==Установка готовых сценариев в систему==
 +
* Скачайте и импортируйте сценарии из архива: [[Media:%D0%9F%D0%B5%D1%80%D0%B5%D1%85%D0%B2%D0%B0%D1%82_DTMF.zip|Перехват DTMF.zip]] (''собраны на версии 2.12.0.150423'')
 +
* Установите сценарий ''Перехват DTMF (Главный IVR сценарий)'' в качестве главного IVR сценария. Присвойте переменной '''phone''' - внутренний номер для переключения.
 +
* Установите ''Перехват DTMF (IVR сценарий исходящей маршрутизации)'' в качестве IVR сценария исходящей маршрутизации.
 +
* Реализуйте нужный функционал с помощью служебных сценариев и назначьте их в сценарии ''Перехват DTMF (IVR сценарий перехвата DTMF)''

Текущая версия на 12:08, 31 марта 2023

Наверх

Введение

Задача: Определять во время разговора введенные DTMF-символы на внешней и внутренней линии. В зависимости от линии и введенного на ней символа запускать различные процессы на сервере и клиентском приложении сотрудника. Например, при нажатии сотрудником на 1 — открыть в браузере сайт oktell.ru, при нажатии на 2 — привязать звонок к задаче Call-центра.

На самом деле Oktell уже имеет похожие возможности в виде служебных номеров флеша и управления конференцией. Набрав во время разговора эти номера, система выполняет определенные действия. Например, нажав служебный номер флеш — система ставит абонента на удержание. Для управления конференцией существуют даже комбинации, которые добавляют или удаляют пользователя из конференции. К сожалению, на момент написания статьи в интерфейсе системы нельзя добавить свой служебный номер для выполнения особых действий.

Однако, проблема решается с помощью самостоятельного перехвата DTMF-сигналов во время разговора. В системе есть возможность с помощью сценариев получить введенные символы как с внешней, так и с внутренней линии. В процессе настройки сценариев вы сами определяете какие действия должна выполнить система при нажатии того или иного символа (или их комбинации). Таким образом, в Oktell можно реализовать неограниченное количество "служебных комбинаций".

Функционал полезен в случаях, когда операторы часто проделывают одни и те же действия: добавляют текущий контакт в CRM-систему, открывают карточку клиента в браузере. С помощью определенных символов сотрудник может пометить клиента, чтобы система, к примеру, отправила ему SMS после разговора. Введенные символы на внешней стороне применяются для ввода скрытых данных, например, пароля во время разговора. Это может быть использовано для подтверждения операций в банковской сфере, не сообщая оператору личной информации.


Основная идея

Чтобы перехватывать DTMF-сигналы с любой линии, необходимо в IVR-сценарии после успешного переключения зациклить компонент Ввод значения. В таком случае на линии параллельно с разговором будет работать IVR сценарий, фиксирующий все введенные символы.


Перехват DTMF-001.png

Дополнительно все введенные DTMF сохраняются в таблице [oktell]..[a_stat_dtmf]. Для этого необходимо включить соответствующие настройки в разделе Администрирование/Общие настройки/Управление базами данных — Сохранять в БД все получаемые по внешним/внутренним линиям DTMF-символы. Для считывания DTMF потребуется отдельный служебный сценарий, который будет циклично мониторить таблицу на предмет ввода новых символов.


Перехват DTMF-002.png


Главный IVR сценарий

Поскольку в главный IVR сценарий попадает внешняя линия, установленный "Ввод значения" будет принимать DTMF только на этой внешней линии. В рамках задачи необходимо принимать DTMF и с внутренней линии, следовательно нужно дозвониться до нее и также запустить на ней IVR сценарий. Такая операция реализуется через дозвон и конференцию с моделью поведению "Преобразовать в коммутацию".


Перехват DTMF-003.png


Компонент "Начальные параметры". Определяет параметры клиента и сохраняет в переменные:

  • сессионной переменной phone (строковая) присваивается внутренний номер, на который происходит переключение. В примере, строка "900".
  • сессионной переменной key (строковая) присваивается значение выражения RANDOM(999999). Переменная используется в качестве ключа конференции.
  • сессионной переменной CallerId (строковая) присваивается значение функции Номер абонента (CallerId). Переменная хранит номер абонента.


Перехват DTMF-005.png


Компонент "В конференцию". Отправляет клиента в конференцию с моделью поведения "Преобразовать в коммутацию". Как только в эту коммутацию присоединится второй участник она преобразуется в обычный разговор. Ключ конференции предварительно генерируется случайным образом.

  • Ключ конференции — переменная key
  • Создать, если отсутствует - да
  • Расширенная настройка — да
  • Модель поведения - Преобразовать в коммутацию


Компонент "На дозвон". Запускает сценарий дозвона до внутреннего номера с последующим добавлением в конференцию. Все сессионные переменные будут переданы в этот сценарий автоматически.

  • Тип запуска — асинхронный служебный
  • Сценарий - Перехват DTMF (служебный сценарий дозвона)


Компонент "Перехват DTMF". Запускает сценарий для считывания DTMF-сигналов с данной внешней линии. Параметр запуска 0 означает, что сценарий запускается для внешней линии (рассматривается ниже).

  • Тип запуска - вложенный
  • Сценарий - Перехват DTMF (IVR сценарий перехвата DTMF)
  • Параметр запуска - строка "0"


Перехват DTMF-004.png


Служебный сценарий дозвона

Сценарий дозванивается до внутреннего пользователя и запускает на его линии IVR сценарий добавления в конференцию. В сценарии не предусмотрен случай, когда внутренний абонент не берет трубку.


Перехват DTMF-006.png


Компонент "Дозвон". Все используемые сессионные переменные должны строго иметь такие же наименования, как и в главном сценарии.

  • Номер/команда - сессионная переменная phone (строковая)
  • Среда - внутренний номерной план
  • Обслуживание - IVR
  • Сценарий IVR - Перехват DTMF (IVR сценарий входа в конференцию)
  • Параметр запуска - сессионная переменная key (строковая)
  • CallerId - сессионная переменная CallerId (строковая)


IVR сценарий входа в конференцию

Сценарий запускается после ответа внутреннего сотрудника и добавляет его в конференцию, которая сразу же преобразовывается в коммутацию. После этого начинает считывать вводимые DTMF с данной внутренней линии.


Перехват DTMF-007.png


Компонент "Старт". На вход сценария передается номер конференции, в которую следует добавить внутреннего сотрудника. Параметр запуска сохраняется в переменную key.

  • Параметр запуска - переменная key (строковая)


Компонент "В конференцию". Добавляет сотрудника в конференцию с указанным ключом.

  • Ключ конференции — переменная key
  • Создать, если отсутствует - да
  • Расширенная настройка — да
  • Модель поведения - Преобразовать в коммутацию

Компонент "Перехват DTMF". Запускает сценарий для считывания DTMF-сигналов с текущей внутренней линии. Параметр запуска 1 означает, что сценарий запускается для внутренней линии (рассматривается ниже).

  • Тип запуска - вложенный
  • Сценарий - Перехват DTMF (IVR сценарий перехвата DTMF)
  • Параметр запуска - строка "1"


Перехват DTMF-008.png


IVR сценарий перехвата DTMF

Основной сценарий для захвата DTMF и выполнения служебных действий. Главная идея — зациклить компонент "Ввод значения", анализируя введенные значения. Напомним, что этот сценарий — единый для внешних и внутренних линий, поэтому на старт передавался флаг, поясняющий тип линии: 0 - внешняя линия, 1 - внутренняя. Такое разделение помогает реализовать различный функционал для сотрудников и клиентов.


Перехват DTMF-009.png


Компонент "Старт". На вход сценария передается тип линии. Компонент сохраняет параметр запуска в переменную startParam.

  • Параметр запуска - переменная startParam (строковая)


Компонент "Внутренняя линия?". Определяет тип линии и направляет сценарий на соответствующую ветку.

  • Аргумент 1 — переменная startParam
  • Аргумент 2 — строка 1
  • Тип сравнения — "="
  • Переход, если правда — на компонент "Ввод с внутренней линии"
  • Переход, если ложь — на компонент "Ввод с внешней линии"


Компонент "Ввод с внутренней линии". Ожидает ввода одного символа с внутренней линии, затем сохраняет введенный символ в переменную DTMF. Переход к анализу происходит только если символ введен.

  • Буфер для DTMF - переменная DTMF (строковая)
  • Очистить буфер - Да
  • Макс время, с - 20
  • Количество символов - 1
  • Переход - на компонент "Ув2"
  • Переход, таймаут - на компонент "->"


Перехват DTMF-010.png


Компонент "Ув2". Отладочное уведомление для вывода захваченного символа

  • Текст — выражение ScriptFunc( 'Имя пользователя' )+' набрал символ '+[DTMF]
  • Способ оповещения — Всплывающее уведомление
  • Ключ получателя — введите внутренний номер вашего пользователя


Компонент "Определение символа". Анализирует введенный символ — по нажатию на 1 у сотрудника должна открыться веб-страница в браузере, а по нажатию на 2 звонок должен прикрепиться к задаче.

  • Аргумент - переменная DTMF
  • Значения -
1 - на компонент "Ув3"
2 - на компонент "Ув4"
  • Переход, прочее — на компонент "->"


Перехват DTMF-011.png


Компоненты "Ув3 и Ув4". Отладочные уведомления о выбранных действиях.


Компонент "Действие 1". Запускает сценарий для открытия страницы Oktell.ru в браузере. На вход сценария передается идентификатор оператора, для которого нужно это выполнить.

  • Тип запуска - Асинхронный служебный
  • Сценарий - Перехват DTMF (Служебный сценарий для открытия сайта)
  • Параметр запуска - функция "Guid-идентификатор пользователя".


Компонент "Действие 2". Запускает сценарий для привязки звонка к задаче. На вход сценария передается идентификатор оператора, для которого нужно это выполнить.

  • Тип запуска - Асинхронный служебный
  • Сценарий - Перехват DTMF (Служебный сценарий для привязки звонка к задаче)
  • Параметр запуска - функция "Guid-идентификатор пользователя".


Перехват DTMF-012.png


Компонент "->". Не имеет функционального предназначения, используется для связки компонентов.

  • Время задержки, мс - 0


Компонент "Ввод с внешней линии". Аналогичные действия выполняются для внешней линии. Компонент считывает DTMF, введенные на внешней линии.

  • Буфер для DTMF - переменная DTMF (строковая)
  • Очистить буфер - Да
  • Макс время, с - 20
  • Количество символов - 1
  • Переход - на компонент "Ув1"
  • Переход, таймаут - на компонент "->"


Компонент "Ув1". Отладочное уведомление для вывода захваченного символа. После компонента вы можете аналогично реализовать функционал для внешних линий.

  • Текст — выражение 'Линия '+ScriptFunc( 'Номер линии' )+' набрал символ '+[DTMF]
  • Способ оповещения — Всплывающее уведомление
  • Ключ получателя — введите внутренний номер вашего пользователя


Перехват DTMF-013.png


Служебный сценарий для открытия сайта

Сценарий выполняется после нажатия на внутренней линии символа "1". Открывает страницу https://oktell.ru в браузере на компьютере сотрудника. Ключ сотрудника передается на вход сценария.


Перехват DTMF-014.png


Компонент "Старт". На вход сценария передается идентификатор пользователя. Компонент сохраняет параметр запуска в переменную GUID пользователя.

  • Параметр запуска - переменная GUID пользователя (строковая)


Компонент "Открыть веб-страницу". Открывает указанную веб-страницу в браузере по умолчанию на компьютере пользователя.

  • Ключ пользователя - переменная GUID пользователя
  • Файл - строка "https://oktell.ru"
  • Путь - Абсолютный
  • Режим запуска - С помощью оболочки


Перехват DTMF-016.png


Служебный сценарий для привязки звонка к задаче

Сценарий выполняется после нажатия символа "2" на внутренней линии. Прикрепляет текущий звонок к задаче. Напомним, что прикрепление звонка к задаче работает только во время действующего разговора, при наличии данного оператора в режиме Call-центр и активной задаче. Если одно из этих условий не выполнено, то сценарий не сработает. Ключ сотрудника, для которого нужно прикрепить звонок, передается на вход сценария.


Перехват DTMF-015.png


Компонент "Старт". На вход сценария передается идентификатор пользователя. Компонент сохраняет параметр запуска в переменную GUID пользователя.

  • Параметр запуска - переменная GUID пользователя (строковая)


Компонент "Привязать звонок к задаче". Прикрепляет текущий звонок пользователя к указанной задаче.

  • Действие - Установить
  • Тип объекта - Задача
  • Задача - выберите задачу Call-центра
  • Свойство/действие - Привязать к звонку оператора
  • Значение - переменная GUID пользователя


Перехват DTMF-017.png


IVR сценарий исходящей маршрутизации

Ранее мы подробно рассмотрели перехват DTMF во время входящего звонка. В данном параграфе рассматривается перехват DTMF во время исходящего звонка. Для реализации функционала потребуется модифицировать сценарий исходящей маршрутизации.

Поскольку этот сценарий запускается на внутренней линии, изначально мы сможем перехватывать только сигналы с внутренних линий. Как говорилось ранее, нам для перехвата DTMF нужно запустить IVR сценарий на требуемой линии. Вы можете воспользоваться указанным выше алгоритмом через создание конференции, однако мы рассмотрим альтернативный способ считывания сигналов непосредственно из БД. Для работы данного сценария необходимо установить флажок "Сохранять в БД все получаемые по внешним/внутренним линиям DTMF-символы" в модуле Администрирование/Общие настройки/Управление базами данных.

В сценарии исходящей маршрутизации после успешного соединения нужно установить запуск служебного сценария для получения DTMF из БД и IVR сценарий для захвата сигналов с данной линии. Также чтобы получать DTMF с нужной внешней линии, необходимо сохранить ее идентификатор в компоненте "ВНЕШНИЕ".


Перехват DTMF-018.png


Компонент "ВНЕШНИЕ". В компоненте необходимо сохранить идентификатор выбранной линии в сессионную переменную "Line" (строковая)

  • Идентификатор выбранной линии - сессионная переменная "Line" (строковая)


Компонент "Получение DTMF из БД". Запускает сценарий для мониторинга таблицы a_stat_dtmf

  • Тип запуска - Асинхронный служебный
  • Сценарий - Перехват DTMF (Служебный сценарий для получения DTMF из БД)


Компонент "Перехват DTMF". Запускает сценарий для считывания DTMF-сигналов с текущей внутренней линии. Параметр запуска 1 означает, что сценарий запускается для внутренней линии. Сценарий рассмотрен выше.

  • Тип запуска - вложенный
  • Сценарий - Перехват DTMF (IVR сценарий перехвата DTMF)
  • Параметр запуска - строка "1"


Перехват DTMF-019.png


Служебный сценарий для получения DTMF из БД

Основная идея сценария - циклично осуществлять запросы в таблицу [oktell]..[a_stat_dtmf] и последовательно считывать все введенные символы с внешней линии. На каждой итерации символы анализируются и производятся заранее настроенные действия. Через сессионную переменную Line сценарий получает идентификатор линии, по которой нужно захватывать DTMF.


Перехват DTMF-020.png


Компонент "Текущее время". Сохраняет текущее время в переменную dt. Используется в качестве начального параметра для поиска DTMF в таблице.

  • переменной dt (дата/время) присваивается значение функции "Текущие дата и время"


Компонент "idchain". Определяет текущий идентификатор цепочки коммутаций на внешней линии. Требуется для поиска DTMF в таблице, а также для проверки существования коммутации.

  • Действие - Определить
  • Тип объекта - Линия
  • Ключ линии - сессионная переменная Line (строковая)
  • Значение в переменную - переменная idchain (строковая)


Компонент "Ув1". Отладочное уведомление для вывода значения переменной idchain.

  • Отладочный режим - Да
  • Текст - переменная idchain
  • Ключ получателя - введите ваш внутренний номер


Перехват DTMF-021.png


Компонент "Не в коммутации?". Проверяет существование сессии (цепочки коммутаций) на линии. Если текущая цепочка коммутаций равна строке "00000000-0000-0000-0000-000000000000" заканчивает служебный сценарий.

  • Аргумент 1 - переменная idchain
  • Аргумент 2 - строка 00000000-0000-0000-0000-000000000000
  • Тип сравнения - "="
  • Переход, если правда - на компонент "Ув2".
  • Переход, если ложь - на компонент "получить DTMF"


Компонент "Ув2". Уведомляет администратора о завершении сценарии.

  • Текст - строка Сценарий получения DTMF завершен
  • Ключ получателя - введите ваш внутренний номер


Компонент "Получить DTMF". Выполняет SQL-запрос в таблицу [oktell]..[a_stat_dtmf] для получения последнего DTMF по текущей цепочки коммутаций на данной линии. Запрос построен таким образом, что последовательно считывает введенные символы, сохраняя каждый раз временную метку. Таким образом, вне зависимости от скорости ввода символов запрос гарантирует их последовательный перебор.

select top 1 @dt=dt, @symbol = symbol from a_stat_dtmf 
where idchain = @idchain
and dt > @dt
order by dt asc

где

  • @dt - переменная dt
  • @idchain - переменная idchain
  • @symbol - переменная symbol (строковая)


Перехват DTMF-022.png


Компонент "пусто". Проверяет был ли введен символ.

  • Аргумент 1 - переменная symbol
  • Аргумент 2 - пустая строка
  • Тип сравнения - "="
  • Переход, если правда - на компонент "1000ms".
  • Переход, если ложь - на компонент "Ув3"


Компонент "Ув3". Выводит на экран принятый DTMF-символ. После компонента вы можете реализовать функционал для внешних линий, аналогично вышеописанному сценарию перехвата символов.

  • Отладочный режим - Нет
  • Текст - выражение 'Линия '+[NumLine]+' набрала символ '+[symbol]
  • Ключ получателя - введите ваш внутренний номер.


Компонент "1000ms". Пауза перед следующей итерацией. Во избежание загрузки базы данных не рекомендуется ставить интервал менее 500 мс.

  • Время задержки, мс - 1000


Перехват DTMF-023.png


Компонент "->". Не имеет функционального предназначения, используется для связки компонентов.

  • Время задержки, мс - 0


Компонент "Обнуляем". Очищает переменную symbol перед новой итерацией.

  • переменной symbol присваивается пустая строка.


Перехват DTMF-024.png


Установка готовых сценариев в систему

  • Скачайте и импортируйте сценарии из архива: Перехват DTMF.zip (собраны на версии 2.12.0.150423)
  • Установите сценарий Перехват DTMF (Главный IVR сценарий) в качестве главного IVR сценария. Присвойте переменной phone - внутренний номер для переключения.
  • Установите Перехват DTMF (IVR сценарий исходящей маршрутизации) в качестве IVR сценария исходящей маршрутизации.
  • Реализуйте нужный функционал с помощью служебных сценариев и назначьте их в сценарии Перехват DTMF (IVR сценарий перехвата DTMF)