Есть задача, посредством asterisk перечислить абоненту его текущие заказы (от 2 до 9) с выбором одного заказа из перечисленного списка (от 1 до Х, где Х - текущее кол-во заказов). Дополнительное условие, если клиент нажал клавишу, которая выходит из диапазона перечисляемого списка, то воспроизведение не должно останавливаться.
Мой решение задачи основывается на выборе опции m и установки четвертого параметра функции Background, в котором подключается нужный контекст, в зависимости от кол-ва заказов абонента:
- Код: выделить все
[test-ivr]
exten => s,1,AGI(gen-msg,${CHANNEL},${EXTEN}) ; формируем голосовой файл с перечисляемыми заказами и пишем его в /tmp/asterisk/${CHANNEL}
same => n,Set(ORDERS_COUNT=ODBC_GET_ORDERS_COUNT(${EXTEN})) ; получаем кол-во заказов из БД
same => n,Answer
same => n,Set(RETURN_CONTEXT=${CONTEXT}) ; Запоминаем контекст в который необходимо вернуться
same => n,Background(/tmp/asterisk/${CHANNEL}&silence/5,m,,order-count-${ORDERS_COUNT}) ; Запускаем чтение подготовленного файла, с поиском выбора в нужном контексте
same => n(order-select),Verbose(0,"Abonent chose ${EE}")
same => n,Hangup
[order-count-2]
exten => _[1-2],1,Set(EE=${EXTEN})
same => n,Goto(${RETURN_CONTEXT},s,order-select)
[order-count-3]
exten => _[1-3],1,Set(EE=${EXTEN})
same => n,Goto(${RETURN_CONTEXT},s,order-select)
[order-count-4]
exten => _[1-4],1,Set(EE=${EXTEN})
same => n,Goto(${RETURN_CONTEXT},s,order-select)
[order-count-5]
exten => _[1-5],1,Set(EE=${EXTEN})
same => n,Goto(${RETURN_CONTEXT},s,order-select)
[order-count-6]
exten => _[1-6],1,Set(EE=${EXTEN})
same => n,Goto(${RETURN_CONTEXT},s,order-select)
[order-count-7]
exten => _[1-7],1,Set(EE=${EXTEN})
same => n,Goto(${RETURN_CONTEXT},s,order-select)
[order-count-8]
exten => _[1-8],1,Set(EE=${EXTEN})
same => n,Goto(${RETURN_CONTEXT},s,order-select)
[order-count-9]
exten => _[1-9],1,Set(EE=${EXTEN})
same => n,Goto(${RETURN_CONTEXT},s,order-select)
Есть ли более оптимальное решение данной задачи?