Здесь показаны различия между двумя версиями данной страницы.
— |
asterisk:holidays [2016-09-30 16:52] (текущий) |
||
---|---|---|---|
Строка 1: | Строка 1: | ||
+ | ====== Asterisk: Распределение входящих вызовов в зависимости от времени и праздничности дня ====== | ||
+ | FIXME | ||
+ | Решение для распределения звонков по времени суток встроено в asterisk и называется GotoIfTime | ||
+ | |||
+ | Пример | ||
+ | <code> | ||
+ | exten => s,1,GotoIfTime(09:00-18:00|mon-fri|*|*?menu-work,s,1) | ||
+ | same => n,Goto(menu-closed,s,1) | ||
+ | </code> | ||
+ | В данном примере если вызов приходит с 9 утра до 6 вечера в будни, то вызов уходит в ivr с названием menu-work. В остальных случаях вызов уходит в ivr menu-closed. | ||
+ | |||
+ | Теперь добавим немного изюминки. | ||
+ | |||
+ | Начнём издалека.\\ | ||
+ | Находим расписание государственных праздников на сайте ЦБ РФ. Для 2015 года -> http://www.cbr.ru/other/print.asp?file=holidays_2015.htm \\ | ||
+ | В адресе ссылки меняется только год, так что можно потом сделать парсер странички и руками вообще ничего не делать =) | ||
+ | |||
+ | Переходим к составлению таблицы праздников. Использовать будем внутренную базу данных asterisk, она простая, но нам хватит. Для начала напишу скрипт, потом опишу что и как. | ||
+ | |||
+ | |||
+ | <code bash/etc/asterisk/scripts/holidays.sh> | ||
+ | #!/bin/bash | ||
+ | asterisk -rx 'database put holiday 20140101 1' | ||
+ | asterisk -rx 'database put holiday 20140102 1' | ||
+ | asterisk -rx 'database put holiday 20140103 1' | ||
+ | asterisk -rx 'database put holiday 20140104 1' | ||
+ | asterisk -rx 'database put holiday 20140105 1' | ||
+ | asterisk -rx 'database put holiday 20140106 1' | ||
+ | asterisk -rx 'database put holiday 20140107 1' | ||
+ | asterisk -rx 'database put holiday 20140108 1' | ||
+ | asterisk -rx 'database put holiday 20140223 1' | ||
+ | asterisk -rx 'database put holiday 20140308 1' | ||
+ | asterisk -rx 'database put holiday 20140310 1' | ||
+ | asterisk -rx 'database put holiday 20140501 1' | ||
+ | asterisk -rx 'database put holiday 20140502 1' | ||
+ | asterisk -rx 'database put holiday 20140509 1' | ||
+ | asterisk -rx 'database put holiday 20140612 1' | ||
+ | asterisk -rx 'database put holiday 20140613 1' | ||
+ | asterisk -rx 'database put holiday 20141103 1' | ||
+ | asterisk -rx 'database put holiday 20141103 1' | ||
+ | exit | ||
+ | </code> | ||
+ | |||
+ | **asterisk -rx 'команда'** - выполнение команды в cli asterisk и выход\\ | ||
+ | **database put holiday** - добавление ветки holiday в базу данных asterisk\\ | ||
+ | **20140101** - дата в формате ГодМесяцДень\\ | ||
+ | **1** - вкл\\ | ||
+ | |||
+ | Теперь надо встроить обработку всей этой байды в наш диалплан | ||
+ | |||
+ | Пример | ||
+ | <code> | ||
+ | [incoming] | ||
+ | exten => s,1,Answer() | ||
+ | same => n,Set(HOLIDAY=${DB_EXISTS(holiday/${STRFTIME(${EPOCH},,%Y%m%d)})}) | ||
+ | same => n,GotoIf($["${HOLIDAY}" == "1"]?holidays;worktime) | ||
+ | same => n(worktime),GotoIfTime(09:00-18:00|mon-fri|*|*?menu-work,s,1) | ||
+ | same => n,Goto(menu-closed,s,1) | ||
+ | same => n(holidays),Goto(menu-holidays,s,1) | ||
+ | </code> | ||
+ | |||
+ | Описание | ||
+ | |||
+ | - строка - поднятие трубки | ||
+ | - строка - проверка в базе данных ветки holiday за дату звонка (ГодМесяцДень) | ||
+ | - строка - если значение 1, переход на 6 строку и переход в menu-holidays, если значение 0, переход на 4 строку и проверка времени | ||
+ | - строка - проверка рабочее/нерабочее время, если попадает по описанные условия, то рабочее и переход на строку 5 в menu-work | ||
+ | - строка - переход в menu-closed | ||
+ | - строка - переход в menu-holidays | ||
+ | |||
+ | Если где-то накосячили и надо удалить ветку в базе, выполняем | ||
+ | <code> | ||
+ | database deltree holiday | ||
+ | </code> | ||
+ | |||
+ | Если надо удалить только одну запись, то | ||
+ | <code> | ||
+ | database del holiday 20140101 | ||
+ | </code> | ||
+ | |||
+ | |||
+ | {{tag>Asterisk}} |