Кто звонил клиенту?

Лет 7 тому назад, я уже писал на тему обработки входящего звонка от клиента, с поиском внутреннего номера сотрудника, который последним звонил на номер клиента. Теперь пришло время написать похожую статью, как такое реализовать в webitel, тем более, что начиная с версии 3.8.2 (UPD: как оказалось, нужна версия старше 3.8.2) у нас в маршрутизации появилось отдельное приложение для запросов в базу elasticsearch, где и хранится вся информация о звонках. Давайте рассмотрим пример, как научить webitel соединять клиентов с последним звонившим.

Предположим, что у нас уже имеется любая существующая схема с IVR и другими полезностями. Мы хотим добавить в начале проверку по номеру телефона, звонящего к нам в офис, кто из сотрудников последним звонил на данный номер. Дополнительно мы еще добавим ограничение в “за последние 30 минут”. Все это мы можем сделать с помощью запроса в cdr:

{
   "cdr":{
      "exportVar":{
         "last_cid":"hits.hits.0.fields.User ID.0"
      },
      "elastic":{
         "limit":1,
         "sort":{
            "Call start time":{
               "order":"desc",
               "unmapped_type":"boolean"
            }
         },
         "query":"*",
         "columns":[
            "User ID"
         ],
         "filter":[
            {
               "bool":{
                  "must":[
                     {
                        "range":{
                           "variables.start_stamp":{
                              "gte":"now-30m/m",
                              "lte":"now"
                           }
                        }
                     },
                     {
                        "match_phrase":{
                           "Call direction":{
                              "query":"outbound"
                           }
                        }
                     },
                     {
                        "regexp":{
                           "Destination number":{
                              "value":".*${caller_id_number}",
                              "max_determinized_states":20000
                           }
                        }
                     }
                  ],
                  "must_not":[

                  ]
               }
            }
         ]
      }
   }
}

Данный запрос осуществляет поиск всех исходящих звонков за последние 30 минут в базе elasticearch по номеру клиента ${caller_id_number} и сохраняет последний результат в новую переменную ${last_cid}.

Вот мы уже точно знаем кто мог звонить на данный номер. Но, прежде чем соединять, давайте убедимся, что сотрудник не разговаривает по телефону. Для этого мы воспользуемся приложением userData:

{
   "userData":{
      "name":"${last_cid}",
      "var":"account_state",
      "setVar":"acc_state"
   }
}

Теперь у нас появилась новая переменная ${acc_state} в которой записи текущий статус регистрации телефона сотрудника. Остается направить звонок на сотрудника:

{
   "if":{
      "expression":"${last_cid} && ${acc_state} == 'onhook'",
      "then":[
         {
            "bridge":{
               "endpoints":[
                  {
                     "name":"${last_cid}",
                     "type":"user",
                     "parameters":[
                        "leg_timeout=15"
                     ]
                  }
               ]
            }
         }
      ]
   }
}

Вот и все магия! Дальше, ваша стандартная схема маршрутизации, если сотрудник не поднимет трубку за 15 секунд, вызов отработается как обычно.

Полный пример реализации одного из наших IVR меню, мы сможете просмотреть по ссылке: https://docs.webitel.com/display/acr/The inbound call with cdr searches

Leave a Reply

Your email address will not be published. Required fields are marked *