CallBack сценарий для Октелл или как удаленно пользоваться офисной телефонией
В этой теме я хочу поделиться наработкой по реализации описанного в теме функционала. Сценарии не претендуют на роль эталона, каждый может реализовать данную функцию так как он хочет, но это реально работающе на протяжении нескольких лет решение.
И так начнем с постановки задачи:
- При вызове определенного номера Октелл должен определить, что звоню именно я.
- Отбить вызов
- Перезвонить мне
- Дать возможность набрать внутренний номер, городской номер, междугородний номер.
Небольшое, но ля меня необходимое дополнение: если я звоню с неизвестного Октеллу номера, он дает мне возможность прописать этот номер в БД и далее действовать по описанному выше сценарию. (данная функция полезна, например, в коммандировке, когда я беру местную симку и мне надо, не имея удаленного доступа к серверу, совершать с нее вызовы.)
Итак начнем с подготовки таблиц в базе данных (БД):
создаю таблицу с зарегистрированными номерами следующего вида:
id- идентификатор (практически номер по-порядку)
aon- аон вызывающего абонента
num- набираемый номер со всеми префиксами (в моем случае 08+номер, т.к. префикс выхода на город-"0", 8-ка- для вызова федерального мобильного номера)
outaun- аон, который должен "уходить" в ТфОП
каждый может сделать так как ему удобнее, у меня в результате нескольких переделок сформировалась такая таблица, так и оставил.
SQL-запрос на создание таблицы urg_callback:
CREATE TABLE [dbo].[urg_callback]( [id] [int] NOT NULL, [aon] [varchar](50) NULL, [num] [varchar](50) NULL, [outaon] [varchar](50) NULL, CONSTRAINT [PK_urg_callback] PRIMARY KEY CLUSTERED ( [id] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY]
мне захотелось сохранить следы всех дозвонов в отдельной таблице и я сделал отдельную таблицу для лога:
id- идентификатор (практически номер по-порядку)
date- дата и времы вызова
aon- номер телефона звонящего
SQL-запрос на создание таблицы urg_callback_logs:
CREATE TABLE [dbo].[urg_callback_logs]( [id] [int] NOT NULL, [date] [varchar](max) NULL, [aon] [varchar](50) NULL, CONSTRAINT [PK_urg_callback_logs] PRIMARY KEY CLUSTERED ( [id] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY]
Логика работы сценария по приему вызова:
Поступает вызов. (определяется АОН вызывающего абонента)
Происходит запрос в БД и проверка на наличие АОНА в БД
аон есть в БД аона нет в БД
ищется максимальное значение id (последняя запись) в таблице urg_callback_logs
делается запись в таблицу лога urg_callback_logs
|
запускается служебный сценарий "Перезвон" (набор номера вызывающего абонента) с параметром запуска "аон" и отбивается входящий вызов.
вызывающему абоненту воспроизводится звуковой сигнал (файл ding.wav)
В течение 20-ти секунд абонент должен ввести "Пароль". В выложенном сценарии для примера я переделал под проверку текущей даты. В моем сценарии Вы должны ввести день, месяц, год и номер АОНа, который будет "уходить" в ТфОП при исходящем вызове с сервера.. Например: 140920124951234567
Происходит проверка на корректность введения пароля. В случае неправильного введенного пароля происходит "отбой" абонента. Если пароль введен правильно, то в таблицу urg_callback нашей БД вноситься новая запись с id на единицу больше, чем id последней записи. В таблицу добавляется: аон абонента (aon), формируется в зависимости от того городской или междугородний номер значение набираемого номера со всеми префиксами (num) и аон, отдаваемый в ТфОП (outaon)- то значение, которое мы вместе с паролем ввели.
Таким образов мы автоматически внесли в БД новый номер. Теперь при вызове нашего сценария с этого номера обработка вызова будет осуществляться по соседней ветке: " аон есть в БД "
Служебный Сценарий "Перезвон":
Здесь, я думаю, особо объяснять нет смысла. Происходит запрос в БД и поиск строки по параметру запуска, которым является аон абонента. Осуществляется набор номера (таблицf urg_callback) из столбца num с аоном outaon. У меня происходит одиночный набор номера. Можно сделать по типу автодозвона: повторение наборов в случае занятости или неответа абонента. Коку как нравится, мне этого не надо было.
После ответа абонента управление передается в IVR-сценарий однофамилец "Перезвон" с параметром запуска aon.
ИВР-сценарий "Перезвон":
В этом сценарии происходит запрос в БД для определения исходящего аона, передаваемого в ТфОП ( outaon ), затем абоненту дается возможность донабрать любой внешний номер. У меня сделано так, что необходимо вводить номер со всеми префиксами (0-выход на город, 8-для выхода на межгород). Конец набора номера- "#". После этого происходит набор номера во внешнюю сеть.
Еще маленькая доработка: если я ввожу 1 и #, то происходит удаление из БД записи с моим аоном.