Прошло 4000 лет и руководство выделило денюшку на телефоны, ура!
Наконец то будем допиливать Asterisk до конца с новым рвением, уже в продакшене.
Сори за прилюдию, а теперь к теме вопроса.
Не работает перевод с IVR. Забито слепой перевод через #, перевод с предупреждением *. Перевод работает корректно. (с внутренних на внутренние переводится, так же корректно работает перевод, если звонящий набрал в тоновом режиме номер, попал на вызываемого, вызываемый нормально переводит и через # и через * (имеется ввиду во время проигрывания бекграунда вводим прямой номер, например 100).)
Но если звонок поступает с IVR, получается попадает в очередь (например на секретаря), то от туда не переводится. Вместо этого просто играют DTMF сигналы.
Вроде t стоит, должно работать, но не работает, может что то не учел в очередях, я с ними слаб (я вообще слаб так то ) )
Ниже конфиги, Если надо еще что то -- скажите.
Надеюсь на помощь, а то мы уже почти в продакшене, а тут такой косяк, не переводятся входящие...
PRIME_BBCODE_SPOILER_SHOW PRIME_BBCODE_SPOILER: extensions.conf
[general]
static=yes
writeprotect=yes
[globals]
;Если 0, запись разговоров отключена
;Если 1, запись разговоров включена с одновременной конвертацией в MP3
;Если 2, запись разговоров включена и выполняется запись в формат WAV. Преобразование в MP3 формат должно быть выполнено скриптом "proc_records.sh"
RECORDING=1;
;Путь к папке с записями разговоров
DIR_RECORDS=/records/callrecords/;
[default]
; MixMonitor
[macro-recording]
exten => s,1,GoToIf($["${RECORDING}" = "1"]?mp3)
exten => s,n,GoToIf($["${RECORDING}" = "2"]?wav:no)
exten => s,n(mp3),Set(fname=${UNIQUEID}-${STRFTIME(${EPOCH},,%Y-%m-%d-%H_%M)}-${ARG1}-${ARG2});
exten => s,n,Set(monopt=nice -n 19 /usr/bin/lame -b 32 --silent "${DIR_RECORDS}${fname}.wav" "${DIR_RECORDS}${fname}.mp3" && rm -f "${DIR_RECORDS}${fname}.wav" && chmod o+r "${DIR_RECORDS}${fname}.mp3");
exten => s,n,Set(CDR(filename)=${fname}.mp3);
exten => s,n,Set(CDR(realdst)=${ARG2});
exten => s,n,Set(CDR(remoteip)=${CHANNEL(recvip)});
exten => s,n,MixMonitor(${DIR_RECORDS}${fname}.wav,b,${monopt});
exten => s,n,Goto(no);
exten => s,n(wav),Set(fname=${UNIQUEID}-${STRFTIME(${EPOCH},,%Y-%m-%d-%H_%M)}-${ARG1}-${ARG2});
exten => s,n,Set(CDR(filename)=${fname}.wav);
exten => s,n,Set(CDR(realdst)=${ARG2});
exten => s,n,Set(CDR(remoteip)=${CHANNEL(recvip)});
exten => s,n,MixMonitor(${DIR_RECORDS}${fname}.wav,b);
exten => s,n,Goto(no);
exten => s,n(no),Verbose(Exit record);
[outcoling]
exten => _X.,1,Macro(recording,${CALLERID(num)},${EXTEN}) ;_X., означает, что для ЛЮБЫХ исходящих номеров начинает определятся название файла
exten => _xxx,2,Dial(SIP/${EXTEN},,t&m)
exten => _X.,2,Dial(SIP/ntel/${EXTEN})
exten => _X.,3,Hangup()
exten => 700,3,Goto(menu,s,1) ;если мы изнутри позвоним на этот номер, то мы сможем проверить работу нашего голосового меню.
[incoming]
exten => _x.,1,Set(CALLERID(num)=8${CALLERID(num)}) ;добавляем 8 к входящему, что бы корректно перезванивать
exten => _x.,2,Macro(recording,${CALLERID(num)},${EXTEN}) ;запуск макроса на запись
exten =>_x.,3,Goto(menu,s,1) ;перевод на меню menu ivrsaga
exten => _X.,4,Hangup()
[menu]
exten => s,1,Background(/var/lib/asterisk/moh/ivr/ivrsaga) ;здесь ловится звонок из контекста incoming и проигрывается записанное нами приветствие.
exten => 1,1,Dial Queue(managers,,,,120,t&m) ; 1 нажал, в отдел продаж попал
exten => 2,1,Dial Queue(buh,,,,120,t&m) ; 2 нажал, в бухгалтерию попал
exten => 3,1,Dial Queue(logistic,,,,120,t&m) ; 3 нажал, в логистику попал
exten => 4,1,Dial(SIP/170,,,,120,t&m) ; 4 нажал, к юристу попал
exten => 5,1,Dial(SIP/100,,,,120,t&m) ;5 нажал, в IT-отдел попал
exten => 0,1,Queue(secretar,,,,120,t&m) ; 0 нажал, на секретаря попал Queue(secretar,,,,120,t&m)
exten => _XXX,1,Dial(SIP/${EXTEN},30,t&m) ; набор трехзначного внутреннего номера
exten => _XXX,n,Voicemail(${EXTEN}@default)
exten => _XXX,n,Set(dstNUM=${EXTEN}) ;Задаем переменную для передачи в голосовую почту
exten => _XXX,n,GotoIf($["${SIPPEER(${EXTEN},status)}" = ""]?num-not-exist,1) ;Проверяем статус пира, существует или нет
exten => _XXX,n,GotoIf($["${SIPPEER(${EXTEN},status):0:2}" = "UN"]?num-not-connected,1) ;Проверяем статус пира, подключен или нет
exten => _XXX,n,ChanIsAvail(SIP/${EXTEN},s) ;Проверяем канал на занятость
exten => _XXX,n,NoOp(=========== ChanIsAvail STATUS: ${AVAILSTATUS} ===========) ;Выводим в лог значение функции ChanIsAvail, нужно только для отладки, можно удалить строку
exten => _XXX,n,GoToIf($[${AVAILSTATUS} = 2]?num-BUSY,1) ;Если функция возвращает 2 или 3, значит абонент занят
exten => _XXX,n,GoToIf($[${AVAILSTATUS} = 3]?num-BUSY,1) ;Если функция возвращает 2 или 3, значит абонент занят
exten => _XXX,n,Goto(num-${DIALSTATUS},1) ;Обрабатываем остальные статусы
exten => num-not-exist,1,Wait(2)
exten => num-not-exist,n,Playback(invalid) ;Если номера не существует говорим "Ошибочный номер, попробуйте еще раз"
exten => num-not-connected,1,Wait(2)
exten => num-not-connected,n,Playback(ss-noservice) ;Если номер не подключен, говорим "Набранный вами номер отключен, проверьте номер и повторите попытку
exten => num-BUSY,1,Wait(2)
exten => num-BUSY,n,Playback(vm-isonphone) ;Если номер занят, говорим "Занято"
exten => num-NOANSWER,1,Wait(2)
exten => num-NOANSWER,n,Voicemail(${dstNUM},u) ;Если номер не отвечает, включаем голосовую почту
exten => num-CHANUNAVAIL,1,Wait(2)
exten => num-CHANUNAVAIL,n,Playback(vm-isunavail) ;Если еще по какой-то причине будет статус CHANUNAVAIL, говорим, что номер не доступен в данный момент
exten => t,1,Dial(SIP/100,15) ;Если в голосовом меню не выбрали внутренний номер, адресуем звонок секретарю
exten => s,n,WaitExten(5) ;если человек не нажал ничего, ждем 5 секунд и
exten => s,n,Queue(secretar,,,,120,t&m) ; переводим на секретаря? ждем 30 сек
exten => s,n,Voicemail(100@default) ; если нет ответа секретаря 30 сек переводим на автоответчик 100@default
static=yes
writeprotect=yes
[globals]
;Если 0, запись разговоров отключена
;Если 1, запись разговоров включена с одновременной конвертацией в MP3
;Если 2, запись разговоров включена и выполняется запись в формат WAV. Преобразование в MP3 формат должно быть выполнено скриптом "proc_records.sh"
RECORDING=1;
;Путь к папке с записями разговоров
DIR_RECORDS=/records/callrecords/;
[default]
; MixMonitor
[macro-recording]
exten => s,1,GoToIf($["${RECORDING}" = "1"]?mp3)
exten => s,n,GoToIf($["${RECORDING}" = "2"]?wav:no)
exten => s,n(mp3),Set(fname=${UNIQUEID}-${STRFTIME(${EPOCH},,%Y-%m-%d-%H_%M)}-${ARG1}-${ARG2});
exten => s,n,Set(monopt=nice -n 19 /usr/bin/lame -b 32 --silent "${DIR_RECORDS}${fname}.wav" "${DIR_RECORDS}${fname}.mp3" && rm -f "${DIR_RECORDS}${fname}.wav" && chmod o+r "${DIR_RECORDS}${fname}.mp3");
exten => s,n,Set(CDR(filename)=${fname}.mp3);
exten => s,n,Set(CDR(realdst)=${ARG2});
exten => s,n,Set(CDR(remoteip)=${CHANNEL(recvip)});
exten => s,n,MixMonitor(${DIR_RECORDS}${fname}.wav,b,${monopt});
exten => s,n,Goto(no);
exten => s,n(wav),Set(fname=${UNIQUEID}-${STRFTIME(${EPOCH},,%Y-%m-%d-%H_%M)}-${ARG1}-${ARG2});
exten => s,n,Set(CDR(filename)=${fname}.wav);
exten => s,n,Set(CDR(realdst)=${ARG2});
exten => s,n,Set(CDR(remoteip)=${CHANNEL(recvip)});
exten => s,n,MixMonitor(${DIR_RECORDS}${fname}.wav,b);
exten => s,n,Goto(no);
exten => s,n(no),Verbose(Exit record);
[outcoling]
exten => _X.,1,Macro(recording,${CALLERID(num)},${EXTEN}) ;_X., означает, что для ЛЮБЫХ исходящих номеров начинает определятся название файла
exten => _xxx,2,Dial(SIP/${EXTEN},,t&m)
exten => _X.,2,Dial(SIP/ntel/${EXTEN})
exten => _X.,3,Hangup()
exten => 700,3,Goto(menu,s,1) ;если мы изнутри позвоним на этот номер, то мы сможем проверить работу нашего голосового меню.
[incoming]
exten => _x.,1,Set(CALLERID(num)=8${CALLERID(num)}) ;добавляем 8 к входящему, что бы корректно перезванивать
exten => _x.,2,Macro(recording,${CALLERID(num)},${EXTEN}) ;запуск макроса на запись
exten =>_x.,3,Goto(menu,s,1) ;перевод на меню menu ivrsaga
exten => _X.,4,Hangup()
[menu]
exten => s,1,Background(/var/lib/asterisk/moh/ivr/ivrsaga) ;здесь ловится звонок из контекста incoming и проигрывается записанное нами приветствие.
exten => 1,1,Dial Queue(managers,,,,120,t&m) ; 1 нажал, в отдел продаж попал
exten => 2,1,Dial Queue(buh,,,,120,t&m) ; 2 нажал, в бухгалтерию попал
exten => 3,1,Dial Queue(logistic,,,,120,t&m) ; 3 нажал, в логистику попал
exten => 4,1,Dial(SIP/170,,,,120,t&m) ; 4 нажал, к юристу попал
exten => 5,1,Dial(SIP/100,,,,120,t&m) ;5 нажал, в IT-отдел попал
exten => 0,1,Queue(secretar,,,,120,t&m) ; 0 нажал, на секретаря попал Queue(secretar,,,,120,t&m)
exten => _XXX,1,Dial(SIP/${EXTEN},30,t&m) ; набор трехзначного внутреннего номера
exten => _XXX,n,Voicemail(${EXTEN}@default)
exten => _XXX,n,Set(dstNUM=${EXTEN}) ;Задаем переменную для передачи в голосовую почту
exten => _XXX,n,GotoIf($["${SIPPEER(${EXTEN},status)}" = ""]?num-not-exist,1) ;Проверяем статус пира, существует или нет
exten => _XXX,n,GotoIf($["${SIPPEER(${EXTEN},status):0:2}" = "UN"]?num-not-connected,1) ;Проверяем статус пира, подключен или нет
exten => _XXX,n,ChanIsAvail(SIP/${EXTEN},s) ;Проверяем канал на занятость
exten => _XXX,n,NoOp(=========== ChanIsAvail STATUS: ${AVAILSTATUS} ===========) ;Выводим в лог значение функции ChanIsAvail, нужно только для отладки, можно удалить строку
exten => _XXX,n,GoToIf($[${AVAILSTATUS} = 2]?num-BUSY,1) ;Если функция возвращает 2 или 3, значит абонент занят
exten => _XXX,n,GoToIf($[${AVAILSTATUS} = 3]?num-BUSY,1) ;Если функция возвращает 2 или 3, значит абонент занят
exten => _XXX,n,Goto(num-${DIALSTATUS},1) ;Обрабатываем остальные статусы
exten => num-not-exist,1,Wait(2)
exten => num-not-exist,n,Playback(invalid) ;Если номера не существует говорим "Ошибочный номер, попробуйте еще раз"
exten => num-not-connected,1,Wait(2)
exten => num-not-connected,n,Playback(ss-noservice) ;Если номер не подключен, говорим "Набранный вами номер отключен, проверьте номер и повторите попытку
exten => num-BUSY,1,Wait(2)
exten => num-BUSY,n,Playback(vm-isonphone) ;Если номер занят, говорим "Занято"
exten => num-NOANSWER,1,Wait(2)
exten => num-NOANSWER,n,Voicemail(${dstNUM},u) ;Если номер не отвечает, включаем голосовую почту
exten => num-CHANUNAVAIL,1,Wait(2)
exten => num-CHANUNAVAIL,n,Playback(vm-isunavail) ;Если еще по какой-то причине будет статус CHANUNAVAIL, говорим, что номер не доступен в данный момент
exten => t,1,Dial(SIP/100,15) ;Если в голосовом меню не выбрали внутренний номер, адресуем звонок секретарю
exten => s,n,WaitExten(5) ;если человек не нажал ничего, ждем 5 секунд и
exten => s,n,Queue(secretar,,,,120,t&m) ; переводим на секретаря? ждем 30 сек
exten => s,n,Voicemail(100@default) ; если нет ответа секретаря 30 сек переводим на автоответчик 100@default
PRIME_BBCODE_SPOILER_SHOW PRIME_BBCODE_SPOILER: queues.conf
[general]
persistentmembers = yes
monitor-type = MixMonitor
strategy = ringall
[secretar]
member => SIP/101
;(SIP/150&SIP/151&SIP/152&SIP/153&SIP/154&SIP/155&SIP/156&SIP/157&SIP/158&SIP/159&SIP/160,,t&m) ; 1 нажал, в отдел продаж попал
[managers]
member => SIP/150
member => SIP/151
member => SIP/152
member => SIP/153
member => SIP/154
member => SIP/155
member => SIP/156
member => SIP/157
member => SIP/158
member => SIP/159
member => SIP/160
;(SIP/140&SIP/141&SIP/142&SIP/143&SIP/144&SIP/145&SIP/146&SIP/147&SIP/148,,t&m) ; 2 нажал, в бухгалтерию попал
[buh]
member => SIP/140
member => SIP/141
member => SIP/142
member => SIP/143
member => SIP/144
member => SIP/145
member => SIP/146
member => SIP/147
member => SIP/148
;(SIP/131&SIP/132&SIP/133&SIP/134,,t&m) ; 3 нажал, в логистику попал
[logistic]
member => SIP/131
member => SIP/132
member => SIP/133
member => SIP/134
persistentmembers = yes
monitor-type = MixMonitor
strategy = ringall
[secretar]
member => SIP/101
;(SIP/150&SIP/151&SIP/152&SIP/153&SIP/154&SIP/155&SIP/156&SIP/157&SIP/158&SIP/159&SIP/160,,t&m) ; 1 нажал, в отдел продаж попал
[managers]
member => SIP/150
member => SIP/151
member => SIP/152
member => SIP/153
member => SIP/154
member => SIP/155
member => SIP/156
member => SIP/157
member => SIP/158
member => SIP/159
member => SIP/160
;(SIP/140&SIP/141&SIP/142&SIP/143&SIP/144&SIP/145&SIP/146&SIP/147&SIP/148,,t&m) ; 2 нажал, в бухгалтерию попал
[buh]
member => SIP/140
member => SIP/141
member => SIP/142
member => SIP/143
member => SIP/144
member => SIP/145
member => SIP/146
member => SIP/147
member => SIP/148
;(SIP/131&SIP/132&SIP/133&SIP/134,,t&m) ; 3 нажал, в логистику попал
[logistic]
member => SIP/131
member => SIP/132
member => SIP/133
member => SIP/134
Надеюсь на помощь! А то у меня гугл сломался, сам пока не могу найти решение. есть еще параметр T, но судя по описанию (T: Разрешает звонящему пользователю перевести звонок), можно хакнуть систему, нажав #номергвадемалы, и перевести себя же на любой номер. мб я ошибаюсь и тут