В старых вебинарах я рассказывал о реализации функции “звонк на ответственного” через разработку дополнительного web-сервиса без авторизации в bpm’online. Данный сервис позволяет определить контакта по номеру телефона, найти внутренний номер сотрудника, закрепленного за этим контактом и направить звонок непосредственно на него. Только если он не ответил на протяжение n-секунд, отправить по общему правилу.
В представленной мною реализации было несколько проблем:
- Сервис без авторизации, а значит, к нему легко получить доступ. Ничего, кроме внутреннего номера ответственного по заданному номеру клиента не увидят. Но, это все же не безопасный метод.
- Есть основание полагать, что после очередного обновления bpm’online, этот сервис перестанет работать и нужна будет повторная его установка.
В документации по разработке bpm’online 7.8 появилось описание интеграции с помощью веб-службы DataService. Как уверяют меня коллеги, этот функционал был давно, но, описание появилось только начиная с 7.8
Вот на него и будем переводить нашу функцию “Звонок на ответственного”.
Для реализации поставленной задачи, нужна сборка ACR от 27.06.2016 или старше (начиная с релиза webitel v3.3.0), где была добавлена функция реверса строки и работы с Cookie. Так же, нам понадобиться логин и пароль пользователя bpm’online, у которого есть доступ на чтение в разделе Контакты.
В public маршруте проходим авторизацию с помощью httpRequestи получаем cookies в переменную:
{
"httpRequest":{
"exportCookie":"my_cookie",
"url":"https://my.bpmonline.com/ServiceModel/AuthService.svc/Login",
"method":"POST",
"headers":{
"Content-Type":"application/json"
},
"data":{
"UserName":"Supervisor",
"UserPassword":"Supervisor"
}
}
}
Дальше, имея cookie, мы можем получить доступ к DataService. Номера телефонов контактов хранятся в bpm’online в колонке Numberтаблицы ContactCommunication. И мы бы могли написать запрос, если бы не одно НО – как быть с символами, пробелами и другими знаками, что вносит пользователь в поле номера телефона? Для этого в bpm’online имеется скрытая колонка SearchNumber, где хранятся только цифры в обратном порядке (для более быстрого поиска). Этим мы и воспользуемся. Но, для начала обернем наш номер с помощью строковой функции reverse:
{
"string":{
"fn":"reverse",
"data":"${caller_id_number}",
"setVar":"reverted_caller_id_number"
}
}
В переменной reverted_caller_id_numberу нас будет обернутое значение номера телефона. Отправляем запрос на получение имени контакта по номеру и его ответственного:
{
"httpRequest":{
"url":"https://my.bpmonline.com/0/dataservice/json/reply/SelectQuery",
"method":"POST",
"headers":{
"Cookie":"${my_cookie}",
"Accept":"application/json;odata=verbose"
},
"exportVariables":{
"effective_caller_id_name":"rows.0.Name",
"owner_caller_id_number":"rows.0.OwnerLogin"
},
"data":{
"QueryType":0,
"Columns":{
"Items":{
"Name":{
"OrderDirection":0,
"OrderPosition":0,
"Caption":null,
"Expression":{
"ExpressionType":0,
"ColumnPath":"Name"
}
},
"OwnerLogin":{
"OrderDirection":0,
"OrderPosition":0,
"Caption":null,
"Expression":{
"ExpressionType":0,
"ColumnPath":"[WSysAccount:Contact:Owner].Login"
}
}
}
},
"AllColumns":false,
"IsDistinct":false,
"RowCount":1,
"Filters":{
"FilterType":6,
"ComparisonType":0,
"LogicalOperation":0,
"IsNull":true,
"IsEnabled":true,
"IsNot":false,
"Items":{
"FilterByPhone":{
"FilterType":1,
"ComparisonType":9,
"LogicalOperation":0,
"IsNull":true,
"IsEnabled":true,
"IsNot":false,
"LeftExpression":{
"ExpressionType":0,
"ColumnPath":"[ContactCommunication:Contact].SearchNumber"
},
"RightExpression":{
"ExpressionType":2,
"ColumnPath":null,
"Parameter":{
"DataValueType":1,
"Value":"${reverted_caller_id_number}"
}
}
}
}
},
"RootSchemaName":"Contact",
"OperationType":0
}
}
}
Результат мы сохраняем в 2-х переменных:
effective_caller_id_name– webitel подставит значение из этой переменной в SIP From.
owner_caller_id_number– а здесь у нас храниться внутренний номер ответственного по контакту. Теперь достаточно выполнить звонок на этот номер.
Ответственный получает входящий звонок с именем контакта:
![Звонок на ответственного]()
Полный пример маршрута Вы найдете на страницах базы знаний webitel.