Абонент набрав номер, почув гудки і чекає. Один, другий, третій. На четвертому багато хто кладе слухавку, бо з його боку це не відрізнити від того, що ніхто не відповідає. Оператори в цей час можуть бути на лінії й уже брати слухавку, але дзвінок втрачено.
Абонент тут не винен: гудки не дають йому жодної інформації. Тому замість гудків треба дати йому щось корисне і показати, що відбувається. Нижче розбираємо, як це зробити в Asterisk, з прикладами dialplan мовою AEL для PearlPBX2.
Суть рішення
Абонент чує корисну інформацію з першої секунди, а дзвінок операторам іде одночасно з нею, а не після неї. Для
цього привітання й корисні фрази кладуть не окремим Playback перед чергою, а першими файлами в клас музики на
утриманні. Сценарій відповідає на дзвінок і одразу віддає його в Queue:
&call_limit();
NoOp(CALL BEGIN >>>> :'${CALLERID(name)}'@<${CALLERID(num)}>);
Set(CHANNEL(language)=ua);
Set(TIMEOUT(absolute)=3600);
if (${LEN(${CALLERID(name)})} > 7) {
Set(CALLERID(num)=${CALLERID(name)});
}
&callerid_normalization();
AGI(agi://127.0.0.1:4573/blacklist,${CALLERID(num)});
if ( ${BLACKLISTED} > 0) {
Hangup(17);
}
AGI(agi://127.0.0.1:4573/whitelist,${CALLERID(num)});
if ( ${WHITELISTED} > 0) {
Set(QUEUE_PRIO=10);
}
AGI(agi://127.0.0.1:4573/mixmonitor,${CALLERID(num)},${EXTEN});
&lc_partday();
Set(CHANNEL(musicclass)=my_moh_class_${PARTDAY});
Answer();
Wait(1);
Queue(support,tT,,,90,crm_integration_agi.py);
NoOp("QUEUESTATUS=${QUEUESTATUS}");
if ("${QUEUESTATUS}" = "TIMEOUT") {
Playback(all_operators_busy);
}
Hangup();
Подивіться на кінець сценарію. Між Answer() і Queue() немає жодного Playback, лише секундна пауза.
Привітання звучить у музиці на утриманні, тож абонент слухає його, поки Asterisk уже дзвонить операторам. Якщо
вільний оператор є, розмова починається без зайвої секунди. Якщо вільних немає, абонент чує корисне замість порожніх
гудків.
Усе, що стоїть перед чергою, це ворота:
&call_limit()і&callerid_normalization()це макроси з редактора dialplan: ліміт дзвінків і приведення номера до єдиного формату.blacklistвідсіює небажаних абонентів ще до відповіді, аwhitelistпіднімає пріоритет у черзі (QUEUE_PRIO=10).mixmonitorвмикає запис за правилами з адмінки.&lc_partday()виставляєPARTDAY(morning,day,evening,night), і за ним вибирається клас музики.
Після Queue сценарій записує QUEUESTATUS в лог. Якщо за 90 секунд ніхто не відповів (TIMEOUT), абонент чує
all_operators_busy, і лише потім дзвінок завершується.
Як зібрати клас музики
Клас my_moh_class_morning (і так само _day, _evening, _night) створюється в адмінці в режимі Files із
сортуванням Alpha. Файли називають так, щоб корисна фраза йшла першою за алфавітом:
01_greeting.wav
02_music_1.wav
03_music_2.wav
Тоді кожен абонент починає слухати з файлу 01_, а не з випадкового місця. Клас, заданий через
CHANNEL(musicclass), перекриває клас самої черги: у musiconhold.conf, який генерує PearlPBX2, стоїть
preferchannelclass=yes. Тому одна черга може обслуговувати скільки завгодно класів, а вибирає dialplan.
У першому файлі варто сказати, що абонент потрапив куди треба, що оператори розмовляють і що відповідь буде скоро. Сценарії нижче доповнюють цей базовий.
Чому гудки програють
Гудки кажуть абонентові лише одне: лінія вільна, трубку ще ніхто не взяв. Скільки чекати, чи є хтось на тому кінці, чи не помилився він номером, з них зрозуміти не можна. Тож рішення, чекати далі чи ні, абонент ухвалює навмання, і чим довша тиша, тим частіше воно негативне.
Коли ви відповідаєте на дзвінок (Answer), з абонентом можна говорити. Оператор від цього на лінії не з’являється,
але замість тиші абонент чує вас.
Крок 1. Простіший варіант: фраза перед чергою
Якщо не хочете чіпати клас музики, є мінімальна версія: відповісти, зробити коротку паузу, сказати фразу і поставити в чергу. Мінус у тому, що фраза звучить до початку виклику, і кожна її секунда це секунда, коли жоден оператор ще не дзвонить. Тому тримайте її короткою.
Set(CHANNEL(language)=ua);
Answer();
Wait(1);
Playback(welcome-hold);
Queue(Support,tT,,,90);
Playback(sorry-call-later);
Hangup();
Wait(1) потрібна, щоб початок фрази не загубився в момент встановлення з’єднання. welcome-hold це ваш запис
із бібліотеки звуків в адмінці, без розширення. Фраза має відповісти абонентові, чи він туди потрапив, що буде
далі і чи варто чекати. Наприклад: «Ви зателефонували в підтримку. Усі оператори зараз розмовляють, ми відповімо
протягом хвилини. Будь ласка, залишайтесь на лінії».
У Queue(Support,tT,,,90) п’ятий аргумент це таймаут у секундах. Якщо за 90 секунд ніхто не відповів, Queue
повертає керування в dialplan, і останній Playback попросить абонента зателефонувати пізніше, а не кине його в
тишу.
Крок 2. Дати інформацію, поки він чекає
Налаштування черги в PearlPBX2 уже вміють потрібне, і для цього не треба писати код у dialplan:
- Позицію в черзі (
announce_position) і очікуваний час (announce_holdtime): абонент чує, що він третій і що чекати приблизно дві хвилини. Питання «чи хтось там є» відпадає. - Періодичне повідомлення (
periodic_announceразом ізperiodic_announce_frequency): список файлів через кому, який програється із заданою частотою. Сюди добре класти те, про що абоненти й так питають оператора: години роботи, адресу сайту, де дивитись статус замовлення. - Музику на утриманні за часом доби: клас вибирається через
CHANNEL(musicclass), і в нього теж можна покласти інформацію. Як вбудувати привітання в музику так, щоб воно звучало, поки дзвінок уже йде операторам, описано в окремій статті про вхідні дзвінки в чергу.
Усе це задається в формі черги в адмінці. Що вмикати, залежить від вашого потоку. Дві-три короткі фрази працюють краще за одну довгу.
Крок 3. Не ставити в чергу наосліп
Якщо всі оператори зайняті, а в черзі вже стоять кілька людей, чесніше сказати це одразу й запропонувати вихід.
FastAGI-сервер PearlPBX2 має для цього обробник queue-status: він виставляє READYTORECEIVE (скільки операторів
вільні) і QUEUECALLERS (скільки абонентів уже чекає).
Answer();
Wait(1);
AGI(agi://127.0.0.1:4573/queue-status,Support);
if (${READYTORECEIVE} > 0) {
Playback(welcome-hold);
Queue(Support,tT,,,90);
} else {
Playback(all-busy-wait);
Queue(Support,tT,,,120);
}
Дані обробник бере з Redis, куди їх пише сервіс дашборда. Якщо дашборд не запущений або Redis недоступний, він сам питає AMI.
Гілки відрізняються фразою. Коли вільний оператор є, достатньо короткої фрази, і дзвінок з’єднається за секунди. Коли вільних немає, фраза має чесно попередити про очікування.
Крок 4. Запропонувати передзвін замість очікування
Найкраще взагалі не змушувати чекати. Обробник add-callback кладе запит на зворотний дзвінок у базу, а демон
передзвону викликає абонента через AMI. Абонент натискає одну цифру і кладе слухавку.
Answer();
Wait(1);
AGI(agi://127.0.0.1:4573/queue-status,Support);
if (${READYTORECEIVE} > 0) {
Playback(welcome-hold);
Queue(Support,tT,,,90);
} else {
Read(CALLBACK_CHOICE,busy-offer-callback,1,,1,5);
if ("${CALLBACK_CHOICE}" = "1") {
AGI(agi://127.0.0.1:4573/add-callback,${CALLERID(num)},${EXTEN},Support,30);
if (${CALLBACK_ADDED} = 1) {
Playback(callback-scheduled);
Hangup();
}
}
Playback(welcome-hold);
Queue(Support,tT,,,120);
}
Playback(sorry-call-later);
Hangup();
Що тут відбувається:
Readпрограє запис «усі оператори зайняті, натисніть 1, щоб ми вам передзвонили» і чекає одну цифру до п’яти секунд. Значення потрапляє вCALLBACK_CHOICE.- Змінну в порівнянні взято в лапки. Якщо абонент нічого не натиснув, змінна порожня, і без лапок вираз
${CALLBACK_CHOICE} = 1для Asterisk стає синтаксичною помилкою. - Аргументи
add-callback: номер абонента, набраний номер, ім’я сервісу передзвону і затримка в секундах. Сервіс із таким іменем має існувати в налаштуваннях передзвону. CALLBACK_ADDEDдорівнює1, якщо запит записано. Тільки тоді абонентові кажуть «ми вам передзвонимо» і завершують дзвінок. Інакше він іде в чергу, як і раніше.
Якщо абонент не натиснув цифру, він нічого не втрачає: потрапляє в чергу з тим самим таймаутом.
Крок 5. Що робити після таймауту
Коли Queue повертає керування, причина лежить у ${QUEUESTATUS} (наприклад, TIMEOUT). Останній
Playback(sorry-call-later) у сценарії вище це мінімум. Пропозицію передзвону можна повторити і тут, у тому ж
блоці, щоб абонент, який відчекав дві хвилини, не пішов ні з чим.
Що це дає
Кількість операторів від цього не зростає, але за ті самі секунди з абонентом відбувається інше. Він одразу чує голос і розуміє, що потрапив куди треба. Він знає, скільки приблизно чекати. А якщо чекати не хоче, має вихід.
У PearlPBX2 це збирається з готових частин: редактор dialplan із валідацією до застосування, FastAGI-обробники
queue-status і add-callback, демон передзвону, налаштування оголошень у черзі. На дашборді видно, скільки
абонентів зараз чекає в черзі, а звіти показують пропущені дзвінки.