В старых вебинарах я рассказывал о реализации функции “звонк на ответственного” через разработку дополнительного 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.