Пошагово процесс создания модуля интеграции с IP-телефонией с примером описан в справке:
https://elma365.com/ru/help/ip-tel-integration.html
Если кратко, то в модуле интеграции с IP-телефонией обязательно должны быть реализованы 5 функций:
async function VoipTestConnection(): Promise<VoipTestConnectionResult>
async function VoipParseWebhookRequest(request: FetchRequest): Promise<VoipWebhookParseResult
async function VoipGetMembers(): Promise<VoipMember[]>
async function VoipGenerateCall(srcPhone: string, dstPhone: string): Promise<void>
async function VoipGetCallLink(callData: any): Promise<string>
При этом на форме настроек модуля появится дополнительная форма Настроек телефонии.
Реализация функций зависит от API виртуальной АТС, но есть общие моменты для любого провайдера:
VoipTestConnection() вызывается при нажатии кнопки «Проверить соединение». В ней делается любой запрос к API ВАТС и в формате VoipTestConnectionResult возвращается либо успешный ответ, либо ошибка.
VoipGetMembers() вызывается при нажатии кнопки «Настроить». Здесь начитываются пользователи ВАТС для таблицы сопоставлений пользователя ВАТС с пользователем ELMA365. При звонке значение из поля id возвращаемой структуры VoipMember будет сопоставляться с dstPhone из объекта VoipWebhookParseResult, возвращенного из VoipParseWebhookRequest(), поэтому они должны содержать одинаковое свойство пользователя ВАТС.
VoipParseWebhookRequest(request: FetchRequest) обрабатывает запросы, пришедшие на Webhook URL. Обычно там находится switch-case, разбирающий данные от ВАТС в объект VoipWebhookParseResult:
{
event: event, // данные о этапе звонка, номер звонящего и ответившего пользователя и т.д.
callRecord: callRecord, // данные для записи в историю звонков в карточке контакта
response: response, // ответ ВАТС
}
VoipGenerateCall(srcPhone: string, dstPhone: string) вызывается при совершении звонка из интерфейса ELMA365. При этом после получения команды ВАТС сначала сгенерирует звонок на номер звонящего srcPhone, а после его ответа вызов начнет идти у вызываемого абонента dstPhone.
VoipGetCallLink() вызывается из карточки контакта при проигрывании записи и должен возвращать прямую ссылку на запись.
Была добавлена еще одна функция VoipOnWebhookUpdated(webhookUrl: string): Promise<void> для получения вебхука из скриптов модуля. В аргументе webhookUrl передается полная ссылка на вебхук в таком же виде, как она отображается на странице модуля в разделе «Настройка телефонии». Эта функция является необязательной к реализации. Функция вызывается после обновления настроек телефонии (по нажатию на кнопку «Сохранить») или когда модуль впервые инициализируется (при публикации скриптов в случае если реализован контракт телефонии).
Если надо сохранить вебхук для дальнейшего использования, можно использовать storage: Namespace.storage.setItem(...).
async function VoipOnWebhookUpdated(webhookUrl: string): Promise<void> {
Namespace.storage.setItem("webhookUrl_mango", webhookUrl);
}
Настройка софтфонов для тестирования звонков.
Я для тестирования использовала 3CX Phone 6 и X-Lite 3.0. Интерфейс добавления аккаунта у них примерно одинаковый: заполняются Номер/ID пользователя, пароль, домен, если есть – прокси сервер. После этого можно совершать звонки по внутреннему номеру в ВАТС.