Введение
В этой статье мы расскажем, как создать приложение для автоматического исходящего обзвона абонентов (Dialer) в 3CX Call Flow Designer, используя компонент MakeCall. Диалер автоматически дозванивается до абонентов из списка и соединяет вызов с добавочным номером или Очередью вызовов 3CX. Приложение — диалер позволяет проводить эффективные, автоматизированные кампании исходящего обзвона. Операторы колл-центра экономят силы и время, просто принимая скоммутированные вызовы — не нужно искать и набирать нужный номер!
Напомним, что в предыдущих статьях мы рассмотрели Работу CFD с базами данных (которые также можно использовать для получения номера абонента) и маршрутизацию входящих вызовов в зависимости от времени суток (которую можно комбинировать с исходящим обзвоном).
Обратите внимание — среда разработки 3CX CFD поставляется бесплатно. Но голосовые приложения будут выполняться только на 3CX редакции Pro и Enterprise. Скачать CFD можно отсюда.
Демо-проект этого голосового приложения поставляется вместе с дистрибутивом 3CX CFD и находится в папке Documents\3CX Call Flow Designer Demos.
Важно отметить, что по умолчанию диалер начинает работать в момент старта сервиса 3CX Queue Manager Service. Поэтому необходимо задать определенное условие, по которому диалер будет делать вызовы. Для этого в голосовом приложении используется компонент(ы) Create a Condition. Например, можно проверять (устанавливать) время суток, в которое должен выполняться обзвон.
Без задания условий, обзвон начинается в момент старта сервиса и продолжается до тех пор, пока не будет остановлен сервис 3CX Queue Manager Service, либо не будет удалена Очередь с этим голосовым приложением, либо голосовое приложение не будет удалено из Очереди вызовов. Согласитесь, это неудобно.
Номера для обзвона могут поступать из любого источника — текстового файла, базы данных и т.п. В нашем примере номера берутся из текстового файла. В голосовом приложении также проверяется текущие дата и время (обзвон выполняется только в рабочие дни и в рабочее время), и статус операторов для распределения вызова (если свободных операторов нет, обзвон приостанавливается).
Создание проекта
Для создания проекта CFD перейдите в File → New → Project, укажите папку размещения проекта и его имя, например, OutboundDialerDemo.
Новый проект по умолчанию содержит голосовое приложение Main.flow. В данном проекте оно не используется, поэтому удалите его в окне Project Explorer. В этом же окне добавьте новое приложение — кликните правой кнопкой мыши по названию проекта и выберите New Dialer. Назовите его MainDialer. В окне Project Explorer выберите объект MailDialer и установите его свойства в окне Properties Window, как показано ниже.
Диалер имеет два параметра, определяющих его поведение:
- ParallelDialers — количество одновременно запускаемых сущностей диалера;
- PauseBetweenDialerExecution — время, которое каждая сущность ожидает, перед выполнением вызова (строго говоря, перед началом процедуры проверки условий для выполнения вызова).
Объясним это на примере. Допустим, мы установили ParallelDialers в 5, а PauseBetweenDialerExecution в 30 сек. Приложение будет работать следующим образом:
- Создается первый диалер (сущность), получает номер для вызова, звонит и начинает ожидать 30 сек.
- Через 6 сек. создается второй диалер, получает номер, звонит и начинает ожидать 30 сек.
- Через 6 сек. создается третий диалер, получает номер, звонит и начинает ожидать 30 сек.
- Через 6 сек. создается четвертый диалер, получает номер, звонит и начинает ожидать 30 сек.
- Через 6 сек. создается пятый диалер, получает номер, звонит и начинает ожидать 30 сек.
- Через 6 сек. «просыпается» первый диалер, получает номер для вызова, звонит и начинает ожидать 30 сек.
- Через 6 сек. «просыпается» второй диалер, получает номер для вызова, звонит и начинает ожидать 30 сек.и т.д.
Как видите, эти два параметра определяют частоту обзвона. При установке ParallelDialers в 5 и PauseBetweenDialerExecution в 30 сек., будет совершаться 10 звонков в минуту. Изменяя параметры, мы определяем желаемую частоту звонков.
Определение подходящего времени обзвона
В нашем примере обзвон будет выполняться только с понедельника по пятницу с 9 до 17. Для выполнения этого условия, перетащите компонент Create a condition из боковой панели компонентов в основное окно среды разработки и назовите его checkTimeToCall. Компонент будет иметь два ветвления: timeToCall — выполняется при соответствии условиям (времени) обзвона и nothingToDo — выполняется при несоответствии условиям.
Создадим условие выполнение ветвления timeToCall (параметр Condition). В CFD для этого используется выражение C#, возвращающее True при попадании во временные рамки:
((int)DateTime.Now.DayOfWeek) > 0 && ((int)DateTime.Now.DayOfWeek) < 6 && DateTime.Now.Hour >= 9 && DateTime.Now.Hour < 17
Определение свободных операторов
Напомню, что наш диалер «берет» номер из текстового файла и коммутирует его с номером Очереди вызовов 3CX, к которой, разумеется, должны быть подключены операторы. Предположим, что номер Очереди — 800, а номера операторов 201, 202 и 203. Следует проверить, готов ли кто-нибудь из этих операторов принять вызов. Для этого выполним скрипт 3CX Call Control API из компонента Launch External Script.
Этот скрипт также пишется на C#. Он проверяет DN объекты каждого добавочного номера на наличие атрибута ActiveConnection::
using System;
using TCX.Configuration;
namespace OutboundDialerDemo
{
public class ExtensionStateHelper
{
public bool IsThereAnyFreeExtension()
{
return PhoneSystem.Root.GetDNByNumber("201").GetActiveConnections().Length == 0 ||
PhoneSystem.Root.GetDNByNumber("202").GetActiveConnections().Length == 0 ||
PhoneSystem.Root.GetDNByNumber("203").GetActiveConnections().Length == 0;
}
}
}
Сохраните скрипт в файле с именем CheckExtensionsState.cs в папке Libraries проекта. Затем перетащите компонент Launch External Script в ветвление timeToCall, назовите его checkFreeExtensions и настройте, как показано ниже.
Теперь следует проверить результат работы скрипта. Сразу под компонентом Launch External Script добавим компонент Create a condition component и назовем его isThereAnyFreeExtension. У компонента будут два ветвления: yesMakeCall и noFreeExtensions, как показано ниже.
Создадим условие выполнения ветвления yesMakeCall, которое выполняется, если предыдущий скрипт вернул True. Выражение имеет вид:
checkFreeExtensions.ReturnValue
При выполнении условия, ветвление yesMakeCall выполняется, ведь выполнены все необходимые условия: подходящее время и как минимум один свободный оператор. Можно звонить абоненту!
Получение и коммутация номера абонента
Напомню, что в нашем примере номера берутся из файла. Назовем файл NumbersToCall.txt — в каждой строке файла содержится по одному номеру.
Для успешной работы с файлом, необходимо создать индексную переменную номера строки, которая будет общей для всех сущностей диалеров. Выбирая номер, мы увеличиваем индекс, и следующий диалер «берет» номер из следующей строки, и так далее, по очереди. Создадим еще один C# скрипт CallIndexHolder.cs, в котором определим статическую переменную (скрипт также должен быть сохранен в папке Libraries.
using System;
namespace TCX
{
public class CallIndexHolder
{
private static int callIndex = 0;
public int GetCallIndex()
{
return callIndex;
}
public void SetCallIndex(int index)
{
callIndex = index;
}
}
}
Поскольку переменная callIndex объявлена как статическая, в процессе 3CX Queue Manager service присутствует только одна ее сущность, которая разделяется между диалерами.
Итак, нам потребуется еще один компонент Launch External Script (назовем его getCallIndex), который поместим во ветвление yesMakeCall и настроим, как показано ниже:
Теперь перейдем, собственно, к чтению номера из текстового файла. Сразу после компонента getCallIndex добавим компонент Read / Write to File, назовем его readNumberToCall и настроим, как показано ниже:
Обратите внимание на формат указания пути к файлу с номерами и укажите путь на вашем сервере 3CX.
Когда все строки в файле будут прочитаны, компонент readNumberToCall считает пустую строку. В этот момент выполнение вызовов должно быть приостановлено. Для этого добавим еще один компонент Create a condition, который будет проверять — считан ли номер из файла или нет. Он имеет одно ветвление с таким условием:
GREAT_THAN(LEN(readNumberToCall.Result),0)
Если условие выполнено, выполняется скрипт CallIndexHolder.cs, увеличивая переменную callindex, и компонент Make Call делает вызов. Компонент Make Call настраивается, как показано ниже:
Он делает вызов с добавочного номера Очереди 800 (к которой подключены операторы 201, 202 и 203) на номер, считанный из текстового файла.
Обратите внимание на общий вид ветвления yesMakeCall после добавления всех необходимых компонентов.
Компиляция и установка приложения на сервер 3CX
Голосовое приложение готово! Теперь его следует скомпилировать и загрузить на сервер 3CX. Для этого:
- Перейдите в меню Build > Build All, и CFD создаст файл OutboundDialerDemo.tcxvoiceapp.
- Перейдите в интерфейс управления 3CX, в раздел Очереди вызовов. Создайте новую Очередь вызовов, укажите название и добавочный номер Очереди, а затем установите опцию Голосовые приложения и загрузите скомпилированный файл.
- Сохраните изменения в Очереди вызовов. Голосовое приложение готово к использованию.