Колл-центр з ACD, skill-групами і WebRTC-клієнтом для обробки вхідних дзвінків

Організація черг дзвінків і розподіл дзвінків по операторам є однією з основних завдань колл-центру, який обслуговує вхідні дзвінки, коли кількість викликів перевищує кількість доступних операторів (стандартна ситуація для більшості колл-центрів). Дзвонить ставлять у чергу під певним номером, про що йому повідомляє IVR, і програють музику, періодично розповідаючи про зміну місця в черзі і передбачуваному часу очікування (до того як відповість оператор). Якщо пощастить, то музика буде приємною, а очікування не занадто довгим. Хочете дізнатися як швидко організувати колл-центр з описаним функціоналом, не влізаючи в нетрі та складності IP-телефонії — ласкаво просимо під кат.
Для реалізації нашої задачі скористаємося функціонал платформи VoxImplant, завдяки якому нам потрібно тільки знання JavaScript, а також ми будемо використовувати модуль ACD, який підключається прямо у сценарії обробки дзвінків. Завдяки цьому модулю написання коду буде зведено до мінімуму.

Якщо розбити задачу на частини, то вийде наступний список:
  1. Створюємо додаток VoxImplant (можна пафосно назвати його callcenter)
  2. Створюємо користувачів і чіпляємо їх з додатком (у нашому випадку користувачі програми — оператори колл-центру)
  3. Створюємо і налаштовуємо чергу для нашого додатка
  4. Створюємо і налаштовуємо скілл-групу
  5. Створюємо сценарій VoxEngine, який буде обробляти вхідні дзвінки: ставити їх в чергу, розповідати скільки ще чекати відповіді і т.д.
  6. Відправляємо всі вхідні дзвінки до нашого сценарієм з допомогою правила (rule) програми
  7. Робимо веб-інтерфейс оператора за допомогою Web SDK
Виглядає страшно, але, як кажуть, очі бояться, а руки роблять. Приступимо.

Додаток VoxImplant

Відкриваємо розділ Applications/Програми в панелі управління і створюємо новий додаток. Давайте назвемо його callcenter. Повна назва програми буде виглядати наступним чином callcenter.имя_вашего_аккаунта.voximplant.com

Користувачі/оператори

Відкриваємо розділ Users/Користувачі і створюємо кілька користувачів, можна назвати їх operator1, operator2 і т.д. При створенні їх можна причіпляти до додатка, яке ми створили перед цим.

черги

Відкриваємо розділ Queues/Черги (в меню Settings) і створюємо нову чергу з наступними параметрами:


Створення скілл-групи

Відкриваємо розділ Skills/Скілл-групи (в меню Settings) і створюємо нову групу, вказуємо чергу і користувачів, яких ми створили раніше:


Створення сценарію VoxEngine

Відкриваємо розділ Scenarios/Сценарії і створюємо новий сценарій:
// Підключаємо модуль ACD
require(Modules.ACD);

var request, // <-- тут будемо зберігати примірник ACDRequest
originalCall, // <-- вхідний дзвінок
callerid,
statusInterval;

// Вішаємо обробник вхідного виклику
VoxEngine.addEventListener(AppEvents.CallAlerting, handleInboundCall);

// Обробляємо вхідний дзвінок
function handleInboundCall(e) {
originalCall = e.call;
callerid = e.callerid;
// Вішаємо обробники
originalCall.addEventListener(CallEvents.Connected, handleCallConnected);
originalCall.addEventListener(CallEvents.PlaybackFinished, handlePlaybackFinished);
originalCall.addEventListener(CallEvents.Failed, cleanup);
originalCall.addEventListener(CallEvents.Disconnected, cleanup);
// Відповідаємо на дзвінок
originalCall.answer();
}

// Завершуємо сесію
function cleanup(e) {
if (request) {
// Якщо дзвінок в черзі - видаляємо
request.cancel();
request = null;
}
// Закінчити сесію
VoxEngine.terminate();
}

// Граємо музику після закінчення програвання голосу або музики
function handlePlaybackFinished(e) {
e.call.startPlayback("http://cdn.voximplant.com/toto.mp3");
}

// Дзвінок з'єднаний
function handleCallConnected(e) {
// Відправляємо дзвінок в чергу 'MainQueue', яку ми створили в панелі управління
request = VoxEngine.enqueueACDRequest("MainQueue", callerid);

// Отримуємо статус після того як дзвінок поставлений в чергу
request.addEventListener(ACDEvents.Queued, function (acdevent) {
request.getStatus();
});

// Повідомляємо, хто телефонує про приблизний час очікування місці в черзі
request.addEventListener(ACDEvents.Waiting, function (acdevent) {
var minutesLeft = acdevent.ewt + 1;
var minutesWord = " хвилини.";
if ((minutesLeft > 10 && minutesLeft < 20) || (minutesLeft % 10 > 4 || minutesLeft % 10 == 0)) {
minutesWord = " хвилин."; 
} else if (minutesLeft % 10 == 1) {
minutesWord = " хвилину.";
}
originalCall.say("Ви знаходитесь у черзі під номером " + acdevent.position +
". Оператор відповість Вам менш ніж через " + (acdevent.ewt + 1) + minutesWord, Language.RU_RUSSIAN_FEMALE);
});

// Відправляємо дзвінок оператору
request.addEventListener(ACDEvents.OperatorReached, function (acdevent) {
VoxEngine.sendMediaBetween(acdevent.operatorCall, originalCall);
acdevent.operatorCall.addEventListener(CallEvents.Disconnected, VoxEngine.terminate);
clearInterval(statusInterval);
});

// Немає доступних операторів - жоден оператор не обслуговує чергу
request.addEventListener(ACDEvents.Offline, function (acdevent) {
originalCall.say("На жаль, зараз немає доступних операторів. Будь ласка, спробуйте зателефонувати пізніше.", Language.RU_RUSSIAN_FEMALE);
originalCall.addEventListener(CallEvents.PlaybackFinished, function (e) {
VoxEngine.terminate();
});
});

// Отримуємо і повідомляємо статус кожні 30 секунд
statusInterval = setInterval(request.getStatus, 30000);
}

Називаємо сценарій 'ACD' і зберігаємо. Тепер можна взяти який-небудь номер телефону в VoxImplant, щоб всі дзвінки з нього відправити в наш IVR з чергою.

Підключаємо номер

Відкриваємо розділ Phone numbers/Номери і можна прямо в ньому придбати номер:

У розділі Мої номери чіпляємо номер до нашого додатком:


Відправляємо вхідні дзвінки з номера в сценарій

Йдемо в розділ Applications/Програми, заходимо в редагування програми і відкриваємо розділ Rules/Правила, натискаємо Add Rule/Додати правило. Можна назвати його InboundCalls, Pattern вставити придбаний номер телефону і залишилося перетягнути наш сценарій ACD в колонку Assigned/Прив'язані:

Натискаємо Add і бачимо тільки що створене правило:


Створення інтерфейсу оператора колл-центру

Останнє, що потрібно зробити — створити простий веб-інтерфейс, в якому оператори будуть працювати. Це можна зробити за допомогою Web SDK від VoxImplant, в сучасних браузерах у цьому випадку буде використовуватися WebRTC. Щоб встановлювати поточний статус оператора Web SDK доступна функція setOperatorACDStatus, куди ми будемо передавати один із статусів VoxImplant.OperatorACDStatuses. Коли статус встановлено VoxImplant.OperatorACDStatuses.Ready вхідні дзвінки будуть розподілятися на даного оператора. У нас вийде такий простенький інтерфейс:

Можна стягнути готове додаток GitHub. Тільки вкажіть своє ім'я облікового запису (див. змінну ACCNAME).

P.S. У цьому матеріалі спеціально не розглянуті більш складні сценарії, коли черг і скілл-груп кілька, можливість ставити клієнта в чергу і давати йому можливість відключатися, щоб потім зробити callback на телефон, коли черга підійшла і т.д. Все це реально реалізувати в рамках функціоналу VoxImplant.

PSS Важливою частиною колл-центру є звітність — вона теж доступна, як з панелі управління, так і через HTTP API. Кілька прикладів:
Приклад 1
Приклад 2
Приклад 3

Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.