Бывают случаи, когда при исходящих вызовах требуется закрываться не одним номером, а произвольно подставлять номер из определенного диапазона (особенно актуально для коллекторов). В сегодняшней статье мы расскажем, как при исходящих вызовах рандомно (random) подставлять А-номер. В наличие у нас FreePBX с настроенным транком и пулом номеров: 4959999951,4959999952,4959999953,4959999954,4959999955.
Первым делом создадим исходящее правило. Переходим во вкладку Outbound Routes (Исходящие правила) и создадим обычное правило, например:

Сохраняем (Submit Changes) и применяем (Apply Config).
Теперь заходим в консоль и открываем файл
nano /etc/asterisk/extensions_additional.conf
Теперь нам нужно найти наше правило и соответствующий ему внутренний контекст FreePBX. В нашем случае ищем правило RandomOutbound. Находим примерно следующее:
include => outrt-2 ; RandomOutbound
В данном случае контекст для нашего правила (RandomOutbound) называется outrt-2. Найдем наш контекст outrt-2:
[outrt-2] ; RandomOutbound
include => outrt-2-custom
exten => _8XXXXXXXXXX,1,Macro(user-callerid,LIMIT,EXTERNAL,)
exten => _8XXXXXXXXXX/100,1,Macro(user-callerid,LIMIT,EXTERNAL,)
exten => _8XXXXXXXXXX/100,n,Gosub(sub-record-check,s,1(out,${EXTEN},dontcare))
exten => _8XXXXXXXXXX/100,n,ExecIf($[ "${CALLEE_ACCOUNCODE}" != "" ] ?Set(CDR(accountcode)=${CALLEE_ACCOUNCODE}))
exten => _8XXXXXXXXXX/100,n,Set(MOHCLASS=${IF($["${MOHCLASS}"=""]?default:${MOHCLASS})})
exten => _8XXXXXXXXXX/100,n,Set(_NODEST=)
exten => _8XXXXXXXXXX/100,n,Macro(dialout-trunk,2,${EXTEN},,off)
exten => _8XXXXXXXXXX/100,n,Macro(outisbusy,)
Открываем extensions_override_freepbx.conf
nano /etc/asterisk/extensions_override_freepbx.conf
И создадим новый контекст outrt-2 с исходящими правилами и подстановкой CID:
[outrt-2]
include => outrt-2
exten => _8XXXXXXXXXX,1,Noop
exten => _8XXXXXXXXXX,n,Gosub(pickCallerIDnum,cell${RAND(1,5)},1)
exten => _8XXXXXXXXXX,n,Dial(SIP/название транка оператора/${EXTEN},30)
[pickCallerIDnum]
exten => cell1,1,Set(CALLERID(num)= 84959999951) ;Указываем номера которыми должен закрываться вызов
same => n,Return
exten => cell2,1,Set(CALLERID(num)= 84959999952);Указываем номера которыми должен закрываться вызов
same => n,Return
exten => cell3,1,Set(CALLERID(num)= 84959999953);Указываем номера которыми должен закрываться вызов
same => n,Return
exten => cell4,1,Set(CALLERID(num)= 84959999954);Указываем номера которыми должен закрываться вызов
same => n,Return
exten => cell5,1,Set(CALLERID(num)= 84959999955);Указываем номера которыми должен закрываться вызов
same => n,Return
В консоли Asterisk делаем dialplan reload и все должно заработать.
Если в исходящих правилах вы ставили ограничение по определенным внутренними номерам или, например, запись вызова, то советуем полностью скопировать outrt 2 из extensions_additional.conf в extensions_override_freepbx.conf и добавить Gosub и [pickCallerIDnum] из предыдущего примера. Должно получиться примерно так:
nano /etc/asterisk/extensions_override_freepbx.conf
[outrt-2]
include => outrt-2
exten => _8XXXXXXXXXX/100,1,Macro(user-callerid,LIMIT,EXTERNAL,)
exten => _8XXXXXXXXXX/100,n,Gosub(sub-record-check,s,1(out,${EXTEN},yes))
exten => _8XXXXXXXXXX/100,n,Gosub(pickCallerIDnum,cell${RAND(1,5)},1)
exten => _8XXXXXXXXXX/100,n,ExecIf($[ "${CALLEE_ACCOUNCODE}" != "" ] ?Set(CDR(accountcode)=${CALLEE_ACCOUNCODE}))
exten => _8XXXXXXXXXX/100,n,Set(MOHCLASS=${IF($["${MOHCLASS}"=""]?default:${MOHCLASS})})
exten => _8XXXXXXXXXX/100,n,Set(_NODEST=)
exten => _8XXXXXXXXXX/100,n,Macro(dialout-trunk,2,${EXTEN},,off)
exten => _8XXXXXXXXXX/100,n,Macro(outisbusy,)
[pickCallerIDnum]
exten => cell1,1,Set(CALLERID(num)= 84959999951) ;Указываем номера которыми должен закрываться вызов
same => n,Return
exten => cell2,1,Set(CALLERID(num)= 84959999952);Указываем номера которыми должен закрываться вызов
same => n,Return
exten => cell3,1,Set(CALLERID(num)= 84959999953);Указываем номера которыми должен закрываться вызов
same => n,Return
exten => cell4,1,Set(CALLERID(num)= 84959999954);Указываем номера которыми должен закрываться вызов
same => n,Return
exten => cell5,1,Set(CALLERID(num)= 84959999955);Указываем номера которыми должен закрываться вызов
same => n,Return
На этом наша настройка завершена.
Если вы в статье нашли ошибки или несоответствия, мы будем благодарны, если вы напишите нам о них в комментариях.