Пожалуйста, войдите здесь. Часто задаваемые вопросы О нас
Задайте Ваш вопрос

Посмотрите пож диалплан - что можно сделать лучше? [закрыт]

0

Конфигурация:

  • Asterisk
  • Три шлюза Addpac на загородных площадках
  • Офисная MD110 в роли шлюза
  • Сип-телефоны через локальную сеть и интернет

; extensions.conf

[globals]

MD110 => DAHDI/g1
MEGAFON => DAHDI/g0

[general]
static=yes
writeprotect=yes
autofallthrough=yes
clearglobalvars=no
priorityjumping=no


; обработка входящих звонков

[from-hacker]
    exten => s,1,Hangup         ; дефолтный контекст для sip, iax, etc.

[from-pcm0] ; от мегафона
    include => switching        ; коммутатор

[from-pcm1] ; от офисной MD110
    include => compatibility    ; временная подстановка номеров на время перехода
    include => switching        ; коммутатор
    include => to-megafon       ; спб на мегафон 
    ;include => to-sipnet       ; россию на сипнет
    ;include => to-easyvoip     ; европу на изи

[from-factory] ; от шлюза Addpac 2640 в другом городе
    include => compatibility    ; временная подстановка номеров на время перехода
    include => switching        ; коммутатор
    include => to-megafon       ; спб на мегафон 
    ;include => to-sipnet       ; россию на сипнет
    ;include => to-easyvoip     ; европу на изи

[from-sipphone] ; звонки от сипфонов, подключенных к самому астериску
    include => compatibility    ; временная подстановка номеров, пока переделываю телефонную сеть
    include => switching        ; коммутатор
    include => to-megafon       ; спб на мегафон 
    ;include => to-sipnet       ; россию на сипнет
    ;include => to-easyvoip     ; европу на изи


[to-megafon] ; исходящий в город

    ; сейчас все звонки идут через мегафон, sipnet и easyvoip в отпуске

    ; международный вызов (номер начинается с 8-10)
    ; если у звонящего определенный номер, то разрешаем
    ; по умолчанию - запрещено
    exten => _810.,1, NOOP()
     same => n, GotoIf($["${CALLERID(num)}" = "1355"]?allow)    ; мой домашний телефон
     same => n, Goto(disallow)                                  ; по умолчанию - нельзя звонить на международные линии
     same => n(allow), Dial(${MEGAFON}/${EXTEN})                ; вызов через мегафон
     same => n(disallow), Answer
     same => n, Playtones(info)
     same => n, Wait(10)
     same => n, HangUp

    ; междугородный вызов (номер начинается с 8-(кроме единицы))
    ; если у звонящего определенный номер, то разрешаем
    ; по умолчанию - запрещено
    exten => _8[023456789].,1, NOOP()
     same => n, GotoIf($["${CALLERID(num)}" = "1355"]?allow)    ; мой домашний телефон
     same => n, GotoIf($["${CALLERID(num)}" = "1420"]?allow)    ; секретарь
     same => n, GotoIf($["${CALLERID(num)}" = "1421"]?allow)    ; секретарь
     same => n, GotoIf($["${CALLERID(num)}" = "1433"]?allow)    ; факс секретаря
     same => n, GotoIf($["${CALLERID(num)}" = "1502"]?allow)    ; главбух
     same => n, GotoIf($["${CALLERID(num)}" = "1717"]?allow)    ; директор
     same => n, GotoIf($["${CALLERID(num)}" = "1707"]?allow)    ; замначцеха 1
     same => n, GotoIf($["${CALLERID(num)}" = "1701"]?allow)    ; начцеха 1
     same => n, GotoIf($["${CALLERID(num)}" = "1706"]?allow)    ; начцеха 2
     same => n, Goto(disallow)                                  ; по умолчанию - нельзя звонить на междугородные линии
     same => n(allow), Dial(${MEGAFON}/${EXTEN})                ; вызов через мегафон
     same => n(disallow), Answer
     same => n, Playtones(info)
     same => n, Wait(10)
     same => n, HangUp

    ; мобильный вызов (номер начинается с 8-9XX)
    ; если у звонящего определенный номер - запрещаем
    ; по умолчанию разрешено
    ; (NB: код 8-9XXX у Осетии, Дагестана или чего-то такого, поэтому возможен вызов в эти области)
    exten => _89XXXXXXXXX,1, NOOP()
     same => n, GotoIf($["${CALLERID(num)}" = "1742"]?disallow) ; кладовщики
     same => n, Goto(allow)                                     ; по умолчанию - можно звонить на моб телефоны
     same => n(allow), Dial(${MEGAFON}/${EXTEN})                ; вызов через мегафон
     same => n(disallow), Answer
     same => n, Playtones(info)
     same => n, Wait(10)
     same => n, HangUp

    ; местный вызов (в номере семь цифр)
    ; по умолчанию выпускаем, но для некоторых можно сделать исключение
    exten => _XXXXXXX,1, NOOP()
     same => n, GotoIf($["${CALLERID(num)}" = "1742"]?disallow) ; кладовщики
     same => n, Goto(allow)                                     ; по умолчанию - можно звонить на городские номера
     same => n(allow), Dial(${MEGAFON}/${EXTEN})                ; вызов через мегафон
     same => n(disallow), Answer
     same => n, Playtones(info)
     same => n, Wait(10)
     same => n, HangUp

    ; экстренные службы (112, 01, 02, 03, 04, 010, 020, 030, 040, 060)
    ; выпускаются независимо от других разрешений и уровней звонящего
    exten => _0[1234],1, Dial(${MEGAFON}/${EXTEN})
    exten => _0[12346]0,1, Dial(${MEGAFON}/${EXTEN})
    exten => 112,1, Dial($MEGAFON}/${EXTEN})    


[switching]  ; распределение звонков в зависимости от номера

    ; унификация набранных номеров
    ; это нужно:
    ; 1. для обработки номеров из сип-клиентов: номера в записной книжке сотового телефона обычно в международном формате
    ; 2. чтобы не запрещать звонки на 8-812-123-45-67: хоть и через восьмерку, но это местный звонок
    ;
    exten => _+., 1,    Goto(810${EXTEN:1},1)   ; если номер пришел в международном формате (+1-555-555-55-55), отрезаем плюс и приделываем 810
    exten => _+7.,1,    Goto(8${EXTEN:2},1)     ; если номер пришел в международном формате (+7-931-555-55-55), отрезаем +7 и приделываем 8
    exten => _+7812.,1, Goto(${EXTEN:5},1)      ; если номер пришел в международном формате (+7-812-555-55-55), отрезаем +7812
    exten => _8107.,1,  Goto(8${EXTEN:4},1)     ; если звонок в Россию через 8-10-7, то отрезаем 8-10-7 и приделываем 8
    exten => _8812.,1,  Goto(${EXTEN:4},1)      ; если звонок в Петербург через 8-812, то отрезаем 8-812
    exten => _8107812.,1, Goto(${EXTEN:7},1)    ; если звонок в СПб через 8-10-7-812, то отрезаем 8-10-7-812

    ; распределение входящих звонков (заодно звонки из офиса самим себе не тарифицируются)
    exten => 4234560,1,Goto(opt_ivr,s,1)        ; ivr оптового отдела
    exten => 4234561,1,Goto(opt_ivr,s,1)        ; временно свободный номер: ivr оптового отдела
    exten => 4234562,1,Dial(${MD110}/1722,180)  ; кладовщик
    exten => 4234563,1,Dial(${MD110}/1709,180)  ; максим ловкий
    exten => 4234564,1,Goto(opt_ivr,s,1)        ; временно свободный номер: ivr оптового отдела
    exten => 4234565,1,Goto(opt_ivr,s,1)        ; временно свободный номер: ivr оптового отдела
    exten => 4234566,1,Dial(SIP/1523,180)       ; программисты
    exten => 4234567,1,Goto(roznica_ivr,s,1)    ; ivr розницы
    exten => 4234568,1,Goto(lesopilka_ivr,${EXTEN},1)   ; ivr лесопилки
    exten => 4315248,1,Goto(lesopilka_ivr,${EXTEN},1)   ; ivr лесопилки (бывший Лосево)
    exten => 4442523,1,Goto(lesopilka_ivr,${EXTEN},1)   ; ivr лесопилки (бывший Поле)
    exten => 4242424,1,Dial(${MD110}/4242424)           ; disa на md110 (пока не сделал удобную здесь)
    exten => 4299032,1,Dial(${MD110}/1720,180)          ; соседний офис

    ; автоматический факс
    exten=> 1300,1,Goto(opt_ivr,2,1)

    ; диктофон для записи автоответчика
    exten => 1399,1,Noop(Recorder)
     same => n, Festival('это диктофон. говорите после сигнала. когда закончите, положите трубку.')
     same => n, Set(RECFILE=/files/common/rec/rec_${STRFTIME(${EPOCH},,%Y-%m-%d_%H-%M-%S)})
     same => n, Record(${RECFILE}.wav,,,yk)
     same => n, Hangup()

    ; в принципе, избыточно, но явно: номерные группы раскидываю пр местам назначения
    exten => _11XX,1,Dial(${MD110}/${EXTEN},180)
    exten => _12XX,1,Dial(${MD110}/${EXTEN},180)
    exten => _13XX,1,Dial(IAX2/${EXTEN},180)            ; софтфоны и сипфоны
    exten => _14XX,1,Dial(${MD110}/${EXTEN},180)
    exten => _15XX,1,Dial(${MD110}/${EXTEN},180)
    exten => _16XX,1,Dial(${MD110}/${EXTEN},180)
    exten => _17XX,1,Dial(SIP/${EXTEN},180)             ; шлюз производства
    exten => _18XX,1,Dial(${MD110}/${EXTEN},180)
    exten => _19XX,1,Dial(${MD110}/${EXTEN},180)

    ; "быстрый набор" на сотовые
    exten => 1001,1,Dial(${MEGAFON}/89311234566,180) ; Павлов
    exten => 1002,1,Dial(${MEGAFON}/89212345678,180) ; Чернякова
    exten => 1003,1,Dial(${MEGAFON}/89213456789,180) ; Волжанин
    exten => 1004,1,Dial(${MEGAFON}/89211345678,180) ; Эльдар
    exten => 1005,1,Dial(${MEGAFON}/89211414141,180) ; Ловчиков
    exten => 1006,1,Dial(${MEGAFON}/89218484844,180) ; Дмитрий Павлов
    exten => 1007,1,Dial(${MEGAFON}/89218585864,180) ; Казимиров

[compatibility] ; переход со старой станции на новую
    exten => 1588,1,NOOP(proger)
     same => n, Festival('новый номер программистов 15 23')
     same => n, Dial(SIP/1523, 180)
     same => n, Congestion

    ; сделать через неделю: оповещение вместо переключения
    exten => 1501,1, Dial(SIP/1700, 180)
    exten => 1820,1, Dial(SIP/1720, 180)
    exten => 1622,1, Dial(SIP/1722, 180)
    exten => 1423,1, Dial(SIP/1723, 180)
    exten => 1534,1, Dial(SIP/1714, 180)
    exten => 1134,1, Dial(SIP/1731, 180)


; ================== DISA todo =====================

[disa]
exten => s,1,Noop(DISA)
 same => n, Read(LastThreeDigits,,3,s,1,10)                         ; ждать тонового ввода трех цифр с таймаутом 10 сек   Read(variable[,filename][,maxdigits][,option][,attempts][,timeout])
 same => n, GotoIf($[ "${LEN(${LastThreeDigits})}"=="3" ]?dial:bye) ; если набрано другое число цифр, то положить трубку
 same => n(dial), Set(NumberToDial=${EXTEN}${LastThreeDigits})      ; переменная "NumberToDial" - это набранное число блока (1) и набранные тоном три цифры
 same => n, NOOP(DISA: ${NumberToDial} to dial)
 same => n, Goto(switching,${NumberToDial},1)                       
 same => n(bye), Hangup()

================= CALL RECORDING todo =================

[callrecorder]
exten => record,1,NOOP(CALL RECORDING)
 same => n, Set(RECFILE=/files/common/rec/${STRFTIME(${EPOCH},,%Y-%m-%d_%H-%M-%S)}-${CALLERID(num)}
 same => n, MixMonitor(${RECFILE}.wav)
 same => n, Return



; =================== ОПТОВИКИ ==========================================

[opt_ivr]
exten => s,1,Noop(OPT IVR GREETING)
 ;same => n, Gosub(record_call,1)
 same => n(replay), Wait(1)
 same => n, Background(/files/asterisk/alaw/irina_hello2,m)
 same => n, Background(/files/asterisk/alaw/irina_press2,m)

 same => n, GotoIfTime(9:00-18:00,mon-fri,*,*?workday:weekend)

 same => n(weekend), NOOP('OPT IVR S:weekend')
 same => n, Background(/files/asterisk/alaw/irina_office_off_now)
 same => n, Background(/files/asterisk/alaw/irina_call_worktime)
 same => n, Background(/files/asterisk/alaw/irina_office_workhours)
 same => n, Background(/files/asterisk/alaw/irina_disa)
 same => n, Wait(10)
 same => n, Playback(/files/asterisk/alaw/irina_bye)
 same => n, Hangup()

 same => n(workday), NOOP('OPT IVR S:workday')
 same => n, Background(/files/asterisk/alaw/irina_press4560,m)

 same => n(disa), NOOP('OPT IVR S:disa')
 same => n, Background(/files/asterisk/alaw/irina_disa) 
 same => n, WaitExten(10)
 same => n, Goto(0,1)

exten => 1,1,NOOP(OPT IVR DISA)
 same => n, Read(LastThreeDigits,,3,s,1,10)   ; ждать тонового ввода трех цифр с таймаутом 10 сек   Read(variable[,filename][,maxdigits][,option][,attempts][,timeout])
 same => n, GotoIf($[ "${LEN(${LastThreeDigits})}"=="3" ]?dial:bye) ; если набрано другое число цифр, то положить трубку
 same => n(dial), Set(NumberToDial=${EXTEN}${LastThreeDigits})      ; переменная "NumberToDial" - это набранное число блока (1) и набранные тоном три цифры
 same => n, NOOP(OPT IVR DISA: ${NumberToDial} to dial)
 same => n, Goto(switching,${NumberToDial},1)                       
 same => n(bye), Hangup()

exten => 2,1,NOOP(OPT IVR FAX)
 same => n, Set(FNAME=${STRFTIME(${EPOCH},,%Y-%m-%d_%H-%M-%S)}-${CALLERID(num)}-${CALLERID(dnid)})
 same => n, ReceiveFax(/files/faxes/${FNAME}.tif)
 same => n, System(/bin/cp "/files/faxes/${FNAME}.tif" /files/opt)
 same => n, System(echo HELLO|/usr/bin/mailx -v -r "zak@microsoft.ru" -s "OPT FAX ROBOT ${CALLERID(num)}" -S smtp="relay.peterstar.net" -a /files/faxes/${FNAME}.tif zak@microsoft.ru)
 same => n, Hangup()

exten => 4,1,NOOP(OPT IVR TRANSFER TO BUH)
 same => n, Playback(/files/asterisk/alaw/irina_transfer2)
 same => n, Dial(${MD110}/1600&${MD110}/1601&${MD110}/1402&${MD110}/1403,30,m)
 same => n, Goto(s,replay)

exten => 5,1,NOOP(OPT IVR TRANSFER TO GARANT)
 same => n, Playback(/files/asterisk/alaw/irina_transfer2)
 same => n, Dial(${MD110}/1501,30,m)
 same => n, Goto(s,replay)

exten => 6,1,NOOP(OPT IVR TRANSFER TO LOGIST)
 same => n, Playback(/files/asterisk/alaw/irina_transfer2)
 same => n, Dial(${MD110}/1503,30,m)
 same => n, Goto(s,replay)

exten => 0,1,NOOP(OPT IVR TRANSFER TO OPERATOR)
 same => n, Playback(/files/asterisk/alaw/irina_transfer2)
 same => n, Dial(${MD110}/1220,15,m)
 same => n, Dial(${MD110}/1221,15,m)
 same => n, Playback(/files/asterisk/alaw/irina_noanswer)
 same => n, Wait(2)
 same => n, Goto(s,replay)

exten => record_call,1,NOOP(CALL RECORDING)
 same => n, Set(RECFILE=/files/common/opt_${STRFTIME(${EPOCH},,%Y-%m-%d_%H-%M-%S)}-from-${CALLERID(num)})
 same => n, MixMonitor(${RECFILE}.wav)
 same => n, Return


; =============== ЛЕСОПИЛКА  ======================

;   голосовое меню лесопилки

[lesopilka_ivr]
exten => _XXXXXXX,1,Noop(lesopilka)
 same => n, Answer()    ; снимаем трубку
 ;same => n, Gosub(callrecorder,record,1) ; debug purpose

 same => n, Wait(1)     ; здесь пауза, чтобы не проглатывались первые звуки

 ; здесь определены номера телефонов и транки, через которые
 ; эти номера будут набраны
 same => n, Set(losevo=${MEGAFON}/3453454)
 same => n, Set(sosnovo=${MEGAFON}/5345256)
 same => n, Set(pole=${MEGAFON}/9345345)
 same => n, Set(manager=${MD110}/1480&${MD110}/1229) ; todo: сделать по очереди!

 ; если пн-сб, 10-20 часов - переход на метку workday (рабочий день)
 ; иначе на метку offtime (нерабочее время)
 same => n, GotoIfTime(10:00-20:00,mon-sat,*,*?workday:offtime) 

 ; нерабочее время: проигрываем звонящему сообщение и кладем трубку
 same => n(offtime), NOOP('OFFTIME')
 ;same => n, Set(CDR(userfield)=offtime)
 same => n, Background(/files/asterisk/alaw/lesopilka-off,m)
 same => n, Hangup()

 ; рабочий день:
 ; звоним в каждый офис по 12 секунд
 ; вместо гудков проигрываем музыку группы lesopilka (определена в musiconhold.conf)
 ; если никто не ответил - пробуем опять дозвониться
 same => n(workday), NOOP('WORKDAY')
 ;same => n, Dial(${losevo}&${sosnovo}&${pole},16,m(manager))

 same => n,Set(CDR(userfield)=3453454)
 same => n,Dial(${losevo},12,m(lesopilka))

 same => n,Set(CDR(userfield)=5345256)
 same => n,Dial(${sosnovo},12,m(lesopilka))

 same => n,Set(CDR(userfield)=9345345)
 same => n,Dial(${pole},12,m(lesopilka))

 same => n,Set(CDR(userfield)=1480-1229)
 same => n,Dial(${manager},12,m(lesopilka))
 same => n,Goto(workday)


; =============== РОЗНИЦА ======================

[roznica_ivr]
exten => s,1,Noop(ROZNICA)
 ;same => n, Gosub(record_call,1)
 same => n(replay), Wait(1)
 same => n, Background(/files/asterisk/alaw/roznica-greeting,m)

 same => n, GotoIfTime(9:00-19:00,mon-fri,*,*?workday:offtime)

 same => n(offtime), NOOP('OFFTIME')
 same => n, Background(/files/asterisk/alaw/roznica-offtime,m)
 same => n, Background(/files/asterisk/alaw/roznica-schedule,m)
 same => n, Background(/files/asterisk/alaw/roznica-website,m)
 same => n, Wait(1)
 same => n, Background(/files/asterisk/alaw/roznica-press2,m)
 same => n, Background(/files/asterisk/alaw/roznica-disa,m)
 same => n, Wait(10)
 same => n, Hangup()

 same => n(workday), NOOP('OPT IVR S:workday')
 same => n, Background(/files/asterisk/alaw/roznica-disa,m)
 same => n, Background(/files/asterisk/alaw/roznica-press2,m)
 same => n, Background(/files/asterisk/alaw/roznica-press3,m)
 same => n, Wait(3)
 same => n, Goto(0,1)

exten => 1,1,NOOP(DISA)
 same => n, Read(LastThreeDigits,,3,s,1,10)   ; ждать тонового ввода трех цифр с таймаутом 10 сек   Read(variable[,filename][,maxdigits][,option][,attempts][,timeout])
 same => n, GotoIf($[ "${LEN(${LastThreeDigits})}"=="3" ]?dial:bye) ; если набрано другое число цифр, то положить трубку
 same => n(dial), Set(NumberToDial=${EXTEN}${LastThreeDigits})      ; переменная "NumberToDial" - это набранное число блока (1) и набранные тоном три цифры
 same => n, NOOP(DISA: ${NumberToDial} to dial)
 same => n, Goto(switching,${NumberToDial},1)                       
 same => n(bye), Hangup()

exten => 3,1,NOOP(ROZNICA SALES)
 same => n, Playback(/files/asterisk/alaw/roznica-transer)
 same => n, Dial(${MD110}/1274&${MD110}/1275&${MD110}/1276&${MD110}/1250,30,m)
 same => n, Goto(s,replay)

exten => 0,1,NOOP(ROZNICA TRANSFER TO OPERATOR)
 same => n, Playback(/files/asterisk/alaw/roznica-transfer-operator)
 same => n, Dial(${MD110}/1280,15,m)
 same => n, Dial(${MD110}/1281,15,m)
 same => n, Wait(2)
 same => n, Goto(s,replay)
удалить переоткрыть спам изменить тег редактировать

спросил 2016-04-07 23:08:17 +0400

likov Gravatar likov
1 1 1

Comments

это бизнес предложение? "лучше" чего? быстрее? проще? меньше обращений к диску? разумнее? диалплан фиговый. почитайте книжки, extensions.conf.sample

meral ( 2016-04-08 00:34:32 +0400 )редактировать

Мягко говоря - нахальненько .

zzuz ( 2016-04-08 00:44:34 +0400 )редактировать

Фиговый - понятно. Что именно фигово?

likov ( 2016-04-08 11:28:49 +0400 )редактировать

Нет модульности, нет ясности, зачемто длинные пути файлов(хотя достаточно сделать один симлинк), нет анализа резултатов вызова абонента перед вызовом следующего, callerid секция выполняется попорядку вместо использования callerid matching. ну и пользователь хочет дорогой експертный совет получить бесплатно, причем не уточняет критерия и вылаживает простыню на прочтение которой 10 минут уходит, что тоже немаловажно.

meral ( 2016-04-09 03:45:06 +0400 )редактировать

Закладки и информация

Добавить закладку

подписаться на rss ленту новостей

Статистика

Задан: 2016-04-07 23:08:17 +0400

Просмотрен: 1,094 раз

Обновлен: Apr 07 '16

Похожие вопросы:

Проект компании "АТС Дизайн"
Asterisk® и Digium® являются зарегистрированными торговыми марками компании Digium, Inc., США.
IP АТС Asterisk распространяется под лицензией GNU GPL.