Детальные статусы звонка

Начиная с версий Itgrix bx 3.5.1 и Itgrix amo 2.8.0, мы расширили список распознаваемых статусов звонков от всего двух (Успешный и Пропущенный) до почти всех, какие поддерживаются в CRM.

Теперь нам нужно Extra

Одновременно с этим возросли наши требования к настройке Asterisk: для выяснения результата звонка нам необходимо наличие поля "extra" в таблице CEL. Если вдруг у вас его нет, то статусы звонка будут работать по-старому с только двумя базовыми значениями.

Несмотря на временную поддержку CEL без extra, оставлять настройки в несоответствующем системным требованиям виде не стоит, потому что мы уже опираемся на содержание extra для обработки перехвата звонков и будем рассчитывать на наличие extra при разработке новых функций.

Если новые статусы звонка пока не соответствуют вашим ожиданиям, можно временно их отключить, сделав поле extra недоступным.

Для этого нужно в конфиге в поле database.column_name_aliases.cel_extra прописать значение "id" вместо "extra" - тогда модуль вместо extra будет смотреть в поле id, не увидит ожидаемых данных и будет работать без них по-старому.

Не забудьте перезапустить службу чтобы изменения вступили в силу и сообщить нам что нужно изменить в статусах звонков чтобы они работали более правильно.

Статусы в Asterisk

В основе статусов звонков лежит новое для нас свойство звонка - результат. Это итог попытки абонента А позвонить абоненту Б, выражаемый кодом из протокола SIP. Коды по виду и смыслу похожи на статус-коды протокола HTTP, например 404 означает "не найдено", но в приложении к телефонии.
Результат звонка не является в прямом смысле статус-кодом SIP, но набор ситуаций, описываемых этими кодами, очень подходит по смыслу.

Чтобы определить результат звонка, мы опираемся на содержимое поля extra, где есть задаваемые Asterisk'ом значения hangup_cause и dial_status.
hangup_cause принимает значения от 0 до 127, и некоторые из них соответствуют одному или нескольким статус-кодам SIP.
dial_status может быть пустым или принимать одно из 9 значений, таких как "ANSWERED" или "CANCEL".
Оба этих поля вместе позволяют нам определить результат звонка:

hangup causedial statusРезультат звонка
0 Не определено0 Неизвестно - обрабатываем звонок по-старому
любойCANCEL480 Временно недоступен
любойCHANUNAVAIL
CONGESTION
500 Ошибка сервера
1 Unallocated
20 SubscriberAbsent
ANSWER200 Успех
1 Unallocated
20 SubscriberAbsent
404 Не найдено
16 NormalClearingпусто
ANSWER
200 Успех
16 NormalClearingNOANSWER408 Таймаут запроса
16 NormalClearingBUSY486 Абонент занят
17 UserBusy486 Абонент занят
18 NoUserResponse408 Таймаут запроса
19 NoAnswer480 Временно недоступен
21 CallRejected603 Вызов отклонён
26 AnsweredElsewhere200 Успех
28 InvalidNumberFormat484 Не полный адрес
34 NormalCircuitCongestion
127 Interworking
500 Ошибка сервера
38 NetworkOutOfOrder500 Ошибка сервера
44 RequestedChanUnavailANSWER200 Успех
44 RequestedChanUnavail500 Ошибка сервера
58 BearercapabilityNotavail488 Невозможно принять
66 ChanNotImplementedANSWER200 Успех
66 ChanNotImplemented405 Метод не поддерживается

Очевидно, что здесь учтены не все 1280 возможных комбинаций. Некоторые значения hangup_cause не используются Asterisk, некоторые комбинации не имеют смысла и невозможны, но самое главное - наше предварительное исследование показало, что этот набор вариантов покрывает все распространённые случаи.
По мере обнаружения, новые случаи будут добавляться в список, а пока они будут обрабатываться по-старому, с двумя вариантами.

Статусы в CRM

Каждая CRM конечно же имеет своё представление о том, какие у звонка могут быть статусы.
Они зависят от точки зрения конкретной CRM на роль звонков в бизнес-процессе и модель взаимодействия сотрудника со звонком.
Важно, что в CRM как задавать, так и читать статус звонка могут пользователи, а не только автоматика, и поэтому список вариантов должен быть интуитивно понятным и не слишком большим.
На этот уменьшенный набор статусов мы транслируем наш набор результатов звонка.

Bitrix24

Статусы звонков в Битрикс24 основаны на статус-кодах SIP, так же как и наш результат звонка, с небольшими особенностями:

СтатусОписание от Битрикс24Пример отображаемого текста
200 Успешный звонокзапрос был успешно принят, распознан и подтвержденВходящий звонок от <номер> завершен. Успешный звонок
304 Пропущенный звонокдля этого статуса мы взяли нестандартный кодПропущен входящий звонок от <номер>. Пропущенный звонок
402 Недостаточно средств на счетутребуется оплатаВы не можете совершить звонок, на вашем счету недостаточно средств.
403 Запрещеноабонент не зарегистрированЗвонок на номер <номер> завершен. Запрещено
404 Неверный номервызываемый абонент не найден, нет такого SIP-номераЗвонок на номер <номер> невозможен. Данное направление не обслуживается.
423 Заблокированосервер отклоняет запрос, так как слишком короткий интервал (или номер в черном списке Битрикс24)нет
480 Временно не доступенвременно недоступное направление, попробуйте позвонить позжеАбонент <номер> временно недоступен.
484 Данное направление не доступнопринят запрос с неполным адресомЗвонок на номер <номер> невозможен. Данное направление не обслуживается.
486 Занятоабонент занятАбонент <номер> занят другим звонком.
500 Внутренняя ошибка серверазвонок на абонента, который не зарегистрирован в сети, либо выключил телефоннет
503 Данное направление не доступносервер не может в данный момент обслужить вызов из-за перегрузки или проведения технического обслуживанияЗвонок на номер <номер> завершен. Данное направление не доступно
603 Отклоненовызов отменен из-за "падения" сетиАбонент <номер> отменил вызов.
603-S Вызов отмененвызываемый пользователь не желает принимать входящие вызовы, не указывая причину отказаЗвонок на номер <номер> отменен.

Итоговый статус определяется по результату звонка:

Результат звонкаДоп условияСтатус BX24
200 УспехЗвонок входящий неотвеченный304 Пропущенный звонок
200 Успех200 Успешный звонок
404 Не найдено404 Неверный номер
405 Метод не поддерживается405
408 Таймаут запроса304 Пропущенный звонок
480 Временно недоступен304 Пропущенный звонок
484 Не полный адрес484 Данное направление не доступно
486 Абонент занятЗвонок входящий неотвеченный304 Пропущенный звонок
486 Абонент занят486 Занято
488 Невозможно принять484 Данное направление не доступно
500 Ошибка сервера500 Внутренняя ошибка сервера
603 Вызов отклонён603 Отклонено
0 НеизвестноОтвеченный звонок200 Успешный звонок
0 НеизвестноНеотвеченный звонок304 Пропущенный звонок

amoCRM

Статусы звонка в Amo не основаны на статус-кодах SIP, а нацелены по смыслу на заполнение пользователем:

  1. Оставил голосовое сообщение
  2. Перезвонить позже
  3. Нет на месте
  4. Разговор состоялся
  5. Неверный номер
  6. Не дозвонился
  7. Номер занят

Кроме статуса, в Амо также есть поле "Результат звонка", которое содержит произвольный текст. Мы постарались использовать этот текст чтобы сделать статус интуитивно понятным.

Данные звонка Amo по результату звонка определяются так:

Результат звонкаДоп условияСтатус amoCRMТекст
200 УспехЗвонок входящий неотвеченный6 Не дозвонилсяПропущенный звонок
200 Успех4 Разговор состоялсяУспешный звонок
404 Не найдено5 Неверный номерНомер не обслуживается
408 Таймаут запроса
480 Временно недоступен
3 Нет на местеАбонент не ответил
488 Невозможно принять5 Неверный номерОшибка оператора связи
484 Не полный адрес5 Неверный номерНекорректный номер
486 Абонент занятЗвонок входящий неотвеченный6 Не дозвонилсяНомер занят
486 Абонент занят7 Номер занятНомер занят
603 Вызов отклонён2 Перезвонить позжеВызов отклонён
0 НеизвестноОтвеченный звонок4 Разговор состоялся
0 НеизвестноНеотвеченный звонок6 Не дозвонился

Настройка статуса звонка в кастомизации

Если по какой то причине (маршрутизация, механика работы оператора телефонии) статус звонка приходит неверный (например пропущенный вместо успешного), его можно кастомизировать.

Кастомизация делается в коде скрипта, файл /opt/itgrix_{crm}/customizer/actions/process_final_params.php

Пример:

$this->logDebug('params: '.json_encode($params));

if ($params['call_full']['channel']['was_answered'] == true)  {
   $params['STATUS_CODE'] = 200;
}

return array(
   'state' => 'success',
   'data'  => $params,
);

На этой странице