Инструменты пользователя

Инструменты сайта


asterisk:holidays

Asterisk: Распределение входящих вызовов в зависимости от времени и праздничности дня

FIXME

Решение для распределения звонков по времени суток встроено в asterisk и называется GotoIfTime

Пример

exten => s,1,GotoIfTime(09:00-18:00|mon-fri|*|*?menu-work,s,1)
same => n,Goto(menu-closed,s,1)

В данном примере если вызов приходит с 9 утра до 6 вечера в будни, то вызов уходит в ivr с названием menu-work. В остальных случаях вызов уходит в ivr menu-closed.

Теперь добавим немного изюминки.

Начнём издалека.
Находим расписание государственных праздников на сайте ЦБ РФ. Для 2015 года → http://www.cbr.ru/other/print.asp?file=holidays_2015.htm
В адресе ссылки меняется только год, так что можно потом сделать парсер странички и руками вообще ничего не делать =)

Переходим к составлению таблицы праздников. Использовать будем внутренную базу данных asterisk, она простая, но нам хватит. Для начала напишу скрипт, потом опишу что и как.

#!/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

asterisk -rx 'команда' - выполнение команды в cli asterisk и выход
database put holiday - добавление ветки holiday в базу данных asterisk
20140101 - дата в формате ГодМесяцДень
1 - вкл

Теперь надо встроить обработку всей этой байды в наш диалплан

Пример

[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)

Описание

  1. строка - поднятие трубки
  2. строка - проверка в базе данных ветки holiday за дату звонка (ГодМесяцДень)
  3. строка - если значение 1, переход на 6 строку и переход в menu-holidays, если значение 0, переход на 4 строку и проверка времени
  4. строка - проверка рабочее/нерабочее время, если попадает по описанные условия, то рабочее и переход на строку 5 в menu-work
  5. строка - переход в menu-closed
  6. строка - переход в menu-holidays

Если где-то накосячили и надо удалить ветку в базе, выполняем

database deltree holiday

Если надо удалить только одну запись, то

database del holiday 20140101
asterisk/holidays.txt · Последние изменения: 2016-09-30 16:52 (внешнее изменение)