пятница, 15 августа 2014 г.

Включаем передаресацию вызовов без использования клиента Октелл

     Драссссте.
     В жизни так бывает, что не все пользователи Октелла используют клиентское приложение: кому-то просто достаточно подцепить IP-телефон к системе и пускать звонки туда-сюда. В этом тоже есть логика - простота и привычность работы с "трубкой". Зачем учить кого-то пользоваться компьютером и телефоном одновременно, если можно научить только трубке, например.
     По сути в IP-телефонах должна быть функция , которая включает переадресацию на тот или иной телефон, если вас нет на месте. Т.е. тыкнул кнопку и иди себе спокойно в рестораны, а все звонки будут заприходить тебе на сотовый. Однако, как я уже сказал, не во всех телефонах есть такая функция, да и не всем хочется ковыряться в этих телефонах учитывая исключительную лень человеческой натуры и большое разнообразие этих самых натур, а также производителей телефонов.


     Как-то на r.oktell.ru увидел, что кто-то ищет сцеанрий, который бы переводил пользователя (про него, кстати, речь не идет, т.к. участие пользователя в большинстве случаев означает, что у него есть клиентское место Октелл)/линию(а вот про линию и пойдет речь) в режим переадресации. Логика простая: с телефона звоним на номер, например 000123456789 и включается переадресация всех звонков с этой линии на 123456789 (как вы поняли 000 - это некий префикс, по которому и определяется суть всех дел).
     Для себя решил, что такой функционал мог бы пригодиться и в нашей компании, а значит надо сделать.
     Ну и вот что получилось. Довольно просто.

     Сценарий работает следующим образом:


  • С телефона набираем 000123456789
  • Обрезается 000 и запускается данный сценарий по этому префиксу
  • Определяем Номер линии, которая инициировала запуск сценария
  • Смотрим есть ли у линии свой пользователь или нет. Если есть то в качестве идентификатора используем GUID пользователя, если нет, то GUID линии.
  • Проверяем, что делает пользователь - выводит из переадресации или включает ее. Вывод из данного режима -  просто 000
  • В нашем случае сценарий заносит номер в переадресацию.
  • Определяем Статусом объекта личный внутренний номер линии (доступно с версии 2.10+)
Лирическое отступление. На самом деле нет. Это не совсем переадресация, а добавление к внутреннему номеру линии "внешнего номера"

и отключение всех других линий, которые были в этом номере. Т.е. для работы данного сценария должны соблюдаться некоторые условия: 
  1. У вашей линии/пользователя должен быть собственный номер
  2. У вас должен быть настроенный "Сценарий набора быстрых и внешних номеров"
  3. Вы должны принять тот факт, что при таком "раскладе" будут переадресовываться и звонки на групповой номер в котором участвует личный внутренний номер сотрудника, что является как плюсом, так и минусом одновременно. Решать вам.

Продолжаем.

  • Запрос, который добавляет во внутренний номер внешний номер довольно прост и одновременно хитёр:

update [oktell_settings].[dbo].[A_RuleRecords] set InnerAddressType=InnerAddressType+100 where ruleid = (select extraid from [oktell_settings].[dbo].[A_NumberPlanAction] where numid = (select id from [oktell_settings].[dbo].[A_NumberPlan] where prefix = @prefix))
insert into [oktell_settings].[dbo].[A_RuleRecords] values(cast(@id as uniqueidentifier), 4, 0, 90, (select extraid from [oktell_settings].[dbo].[A_NumberPlanAction] where numid = (select id from [oktell_settings].[dbo].[A_NumberPlan] where prefix = @prefix)), '00000000-0000-0000-0000-000000000001', @num)
     Мы находим все линии в определенном ранее внутреннем номере номере и меняем их тип (а бывают разные типы от 0 до 4) на  +100, что позволит нам исключить данные линии во взаимодействии с Октеллом (он просто не поймет что это)  и  одновременно сохранить их в былом виде при возврате.
      Второй строкой добавляем Внешний номер 123456789 в определенный ранее внутренний.
  • Теперь со спокойной душой ребутим сервер состояний.  Бояться не надо, на текущую работу не повлияет.
  • Готово! Все звонки поступающие на внутренний номер линии/пользователя будут поступать на его сотовый или куда бы там ни было еще. 

Что происходит, когда мы возвращаем номер в былое состояние.

  • Начнем с проверки на то, что набрал пользователь, а при возврате он набирает 000, что является признаком для вывода  его из нашей "переадресации" и удаления из его внутреннего номера Внешнего номера.
  • В данном случае запрос в базу выглядит так:
update [oktell_settings].[dbo].[A_RuleRecords] set InnerAddressType=InnerAddressType-100 where ruleid = (select ruleid from [oktell_settings].[dbo].[A_RuleRecords] where reactid ='00000000-0000-0000-0000-000000000001' and id = @id)
delete from [oktell_settings].[dbo].[A_RuleRecords] where reactid ='00000000-0000-0000-0000-000000000001' and id = @id

     В первой строке мы  возвращаем тип всех ранее существовавших линий, чтобы Октелл снова смог воспринимать их как родных - просто вычитаем 100 из типа. Добавлю, что находим мы эти линии уже не по внутреннему номеру, т.к. определить его более не возможно статусом объекта из-за его логики (он будет во втором случае определять групповой номер линии, если она привязана еще куда-либо) , а по идентификатору пользователя или линии, который присвоили нашей записи при добавлении в таблицу Внешнего номера. Довольно путано, но проблему решает, что позволяет избежать создания дополнительных таблиц в базе.
     Далее мы удаляем наш внешний номер. Тут можно придумать разную схему. Удалять или нет решать вам. можно просто изменить тип (+100) и Октелл не будет воспринимать это правило. Это будет удобно в случае, если вы хотите упростить жизнь сотрудникам, т.е. единожды создав правило переадресации они сохранят его и будут включать уже по набору какого-либо префикса. Но я не люблю упрощать жизнь людям. Пусть страдают.

  • Снова ребутим сервер состояний.
  • Готово! Номер вернулся в прежнее состояние.

     Можете смело пользоваться и радоваться. 
     Отмечу такой момент, что данные SQL-запросы можно использовать для вывода и ввода линии в/из групповые номера. Часто бывает такая потребность. Это еще называют Динамическими номерами. Удобно.

      Вот готовый сценарий в нем я учел защиту от "дурака" (некоторые набирают несколько раз 000) и добавил возможность включения переадресации на внутренний номер. Учтите, что внутри сценария проверка на внутренний/внешний номер идет путем проверки длины номера (по умолчанию 3), но, если у вас номерной план из четырехзначных номеров, то укажите тут цифру 4: