Сегодня трудно представить современный офис без АТС с функциями маршрутизации звонков в зависимости от времени суток или дня недели, поэтому сегодня мы расскажем, как реализовать этот функционал во FreeSWITCH. Давайте приступим.
Доступные переменные:
year - Календарный год, 0-9999
yday - День в году, 1-366
mon - Месяц , 1-12 (Январь = 1)
mday - День в месяце, 1-31
week - Неделя в году, 1-53
mweek - Неделя в месяце, 1-6
wday - День недели , 1-7 (Воскресенье = 1, Понедельник = 2) или "sun", "mon", "tue".
hour - Час, 0-23
minute - Минута, 0-59
minute-of-day - Minute of the day, (1-1440)
time-of-day - Временой диапазон формата: hh:mm[:ss]-hh:mm[:ss]. Например: "08:00-17:00"
date-time - Диапазон Дата/Время формата: YYYY-MM-DD hh: mm[:ss]~YYYY-MM-DD hh:mm[:ss]. Например: 2010-10-01 00:00:01~2010-10-15 23:59:59
В основном все офисы работают с понедельника по пятницу с 9:00 до 18:00, так что перейдем в наш диалплан (dialplan) и в начало нашего контекста (context) добавим следующее:
<extension name="Время работы офиса" continue="true">
<condition wday="2-6" hour="9-18" break="never">
<!--С понедельника по пятницу с 9:00 до 18:00 -->
<action application="set" data="office_status=open" inline="true"/>
<anti-action application="set" data="office_status=closed" inline="true"/>
</condition>
</extension>
Теперь в своем диалплане вы можете использовать переменную office_status, которая будет содержать значения “open” или “close”. Добавим в наш диалплан маршрутизацию вызовов в зависимости от времени и дня:
<extension name="Входящий вызов на номер 74997099783">
<condition field="destination_number" expression="^(74997099783)$">
<action application="execute_extension" data="74997099783_${office_status}"/>
<!-- Проверяем время и день недели и возвращаем статус --> </condition></extension>
<extension name="Рабочее время">
<condition field="destination_number" expression="^(74997099783_open)$">
<action application="answer"/> <action application="ivr" data="office-ivr"/>
<action application="set" data="ringback=$${hold_music}"/>
<action application="set" data="call_timeout=60"/>
<action application="bridge" data="user/100"/>
<action application="hangup"/>
</condition>
</extension>
<extension name="Офис закрыт">
<condition field="destination_number" expression="^(74997099783_closed)$">
<action application="answer"/>
<action application="sleep" data="1000"/>
<action application="playback" data="ivr/office-close.wav"/>
<action application="sleep" data="500"/>
</condition>
</extension>
Сохраняем, переходим в консоль FreeSWITCH (fs_cli) и делаем reloadxml. Теперь входящие вызовы будут обрабатываться в зависимости от заданных вами правил.
Теперь немного изменим наш диалплан, добавив следующее правило: с понедельника по пятницу, в рабочее время, вызовы будут уходить на офисный IVR, в нерабочее время будет проигрываться сообщение о том, что офис закрыт. В субботу с 10:00 до 18:00 вызовы будут переадресовываться на мобильный, а в воскресение будет проигрываться сообщение о том, что офис закрыт.
Добавим в начало диалплана следующее:
<extension name="Время работы офиса" continue="true">
<condition wday="2-6" hour="0-9" break="never">
<action application="set" data="office_status=work-close" inline="true"/>
</condition> <condition wday="2-6" hour="9-18" break="never">
<action application="set" data="office_status=work-open" inline="true"/>
</condition>
<condition wday="2-6" hour="18-24" break="never">
<action application="set" data="office_status=work-close" inline="true"/>
</condition> <condition wday="7" hour="10-18" break="never">
<action application="set" data="office_status=weekend-mobile" inline="true"/>
</condition> <condition wday="1" break="never">
<action application="set" data="office_status=weekend-close" inline="true"/>
</condition>
</extension>
Теперь в своем диалплане вы можете использовать переменную office_status, которая будет содержать значения “work-close”, “work-open”, “weekend-mobile” или “weekend-close”. Добавим в наш диалплан маршрутизацию вызовов в зависимости от времени и дня:
<extension name="Входящий вызов от оператора">
<condition field="destination_number" expression="^(74997099783)$">
<action application="execute_extension" data="74997099783_${office_status}"/>
</condition>
</extension>
<extension name="Будни рабочее время">
<condition field="destination_number" expression="^(74997099783_work-open)$">
<action application="answer"/>
<action application="ivr" data="office-ivr"/>
<action application="set" data="ringback=$${hold_music}"/>
<action application="set" data="call_timeout=60"/>
<action application="bridge" data="user/100"/>
<action application="hangup"/>
</condition>
</extension>
<extension name="Будни офис закрыт">
<condition field="destination_number" expression="^(74997099783_work-close)$">
<action application="answer"/>
<action application="sleep" data="1000"/>
<action application="playback" data="ivr/office-close.wav"/>
<action application="sleep" data="500"/>
</condition></extension><extension name="Суббота переадресация на мобильный">
<condition field="destination_number" expression="^(74997099783_weekend-mobile)$">
<action application="bridge" data="sofia/gateway/mtt/81234567891"/>
<action application="hangup"/>
</condition>
</extension>
<extension name="Воскресенье">
<condition field="destination_number" expression="^(74997099783_weekend-close)$">
<action application="answer"/>
<action application="sleep" data="1000"/>
<action application="playback" data="ivr/office-close.wav"/>
<action application="sleep" data="500"/>
</condition>
</extension>
Сохраняем, переходим в консоль FreeSWITCH (fs_cli) и делаем reloadxml. Теперь все должно работать согласно описанной выше логике.
В данной статье мы привели простые правила маршрутизации по времени или дню недели, хотя, на самом деле, можно создавать правила намного сложнее.
Если вы в статье нашли ошибки или несоответствия, мы будем благодарны, если вы напишите нам о них в комментариях.