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

История изменений [назад]

нажмите, чтобы скрыть/показать версии 1
изначальная версия
редактировать

спросил 2011-04-28 12:56:44 +0400

andy77 Gravatar andy77

http://www.cmlt.ru/

Проблемы с Dial и переменными после Queue

Добрый день! Возникла следующая проблема. Логика звонка следующая: Клиент звонит на определенный номер, ему предлагают авторизоваться при помощи набора кода с клавиатуры. После ввода с клавиатуры пароля, в базе проверяется соответствие телефона клиента и пароля. База возвращает несколько переменных. Если клиент есть то возвращается его индетификатор (${retval}) и данные о том отплавляет он обычно факсы или нет (${faxval}). В случае отсутствия клиента в базе ретвал возвращается 0 или 3 если какая та ошибка и он пихается в очередь к операторам. Если факсвал равен 1 то клиенту предлагается отправить факс. во всех других случаях в очередь. После отправки факса, записываем переменную в базу и тоже в очередь. После того как он отстоит в очереди и прежде чем вызвать оператора мы проверяем отправлял ли он факс. Если да, то резервируем оператора(ставим на паузу в очереди или вообще выводим из очереди, не важно), печатаем факс, говорим клиетну, что сейчас оператор обрабатывает его факс и паркуем клиента. Оператор в это время получает факс (печатает, электронка, тоже не важно), и снимает после того как готов говорить с клиентом его с парковки и начинает душевную беседу. Если нет факса, то начинается беседа, но оператор может в любой момент переключить клиента на факс. При переключении оператор паркуется. Клиент отправив факс, забирает с парковки своего оператора, а сам слышит фразу о том что его факс обрабатывается оператором и ставиться на парковку. Оператор при готовности, снимает клиента с парковки. По хенгапу оператор опять ставиться в очередь, и печатается факс, если он не был распечатан. В принципе всё :-) чуть короче диалплана получилось :-) А вот собственно сам диалплан курсив ;============================================================================== ; ; Основной алгоритм ; ;====================================================================================

exten => Remzova,1,NoOp(Звонок с номера 2697-550) same => n,Set(phonenum=${CALLERID(num)}) same => n,Set(retval=0) same => n,Set(faxval=0) ;same => n,Answer() same => n,PlayBack(116,noanswer) same => n,Set(popytka=1) same => n,Goto(read) same => n(r0),Gotoif($[${popytka}>3]?rv1) same => n,Read(passval,18,5,,1,8) same => n,Goto(set) same => n(read),Read(passval,17,5,,3,5) same => n(set),Set(popytka=[${popytka}+1]) same => n(agi),AGI(agi://localhost/storedprocedurecall.agi,Asteriskidentification,${passval},${phonenum},out,retval,faxval) same => n,NoOp(${retval}, ${faxval}) same => n,GotoIf($[${retval} = 0]?r0) same => n,GotoIf($[${retval} = 3]?rv1) same => n,Goto(fax) same => n(rv1),Set(_retval=0000000003) same => n(r1),PlayBack(19) same => n(q1),Set(CALLERID(name)=${retval}${faxval}) same => n,Queue(Remzova,tTkK) same => n,Goto(callfromqueueremzova,,p0) same => n,NoOp(выход из очереди Remzova) same => n,HangUp() same => n(fax),GotoIf($[${faxval} = 1]?:q1) same => n,Read(youwanttosendafax,11,1,,1,10) same => n,GotoIf($[${youwanttosendafax} = 1]?:q1) same => n,Macro(faxremzova,0) same => n,PlayBack(14) same => n,Goto(r1)

;exten => h,1,NoOp(связь прекращена по какой либо причине) ;exten => h,n,System(/usr/bin/lp ${faxremzovaname}.pdf)

;==================================================================================== ; ; Звонки из очереди Remzova ; ;====================================================================================

[callfromqueueremzova] exten => _[1-9]XX,1,NoOp(Звонок из очереди Remzova) same => n,NoOp(${CALLERID(name)}) same => n,Set(GOTOONBLINDXFR=callfromqueueremzova,${EXTEN},p0) same => n,Set(faxval=${CALLERID(name):-1}) same => n,Set(retval=${CALLERID(name):0:10}) same => n,Set(TRANSFERCONTEXT=faxfromqueueremzova) same => n,Set(PARKINGEXTEN=9${EXTEN}) same => n,Set(CALLINGPRES=${retval}${faxval}${PARKINGEXTEN}) same => n,Set(operatorline=Local/${EXTEN}@callfromqueueremzova) same => n,RemoveQueueMember(Remzova,${operatorline}) same => n,Macro(channel,${EXTEN}) same => n(echo),System(echo ${retval} > /home/Remzova/DAHDI${EXTEN}) same => n,GotoIf($[${faxval} = 2]?:agent) same => n,Playback(117) same => n(p0),NoOp(${DIALSTATUS}) same => n,Set(PARKINGEXTEN=9${EXTEN}) same => n,Park(36000000,,,,s) same => n(s1),HangUp(телефон занят или не доступен) same => n(agent),Dial(${channel},60,tTg) ;same => n,PauseQueueMember(Remzova,${operatorline}) same => n,Goto(p0)

;==================================================================================== ; ; Возможность оператору переключить на факс клиетна во время разговора ; ;==================================================================================== [faxfromqueueremzova] exten => 0,1,NoOp(Переключение оператором на факс) same => n,NoOp(${CALLINGPRES}) same => n,Set(faxval=${CALLINGPRES:10:1}) same => n,Set(retval=${CALLINGPRES:0:10}) same => n,Set(PARKINGEXTEN=${CALLINGPRES:-4}) same => n,Macro(faxremzova,${retval}) same => n,System(/usr/bin/lp ${faxremzovaname}.pdf) same => n,Set(printfax = 1) same => n,NoOp(${PARKINGEXTEN},${faxval},${retval}) same => n,PlayBack(_117) ;same => n,NoOp(${channel}) ;same => n,Dial(${channel},1) ;same => n,Park(120,,,,s) ;same => n(agent),Dial(${channel},60,tT) same => n,ParkedCall(${PARKINGEXTEN})

exten => h,1,NoOp(проверка не забыли ли распечатать факс и снятие оператора с паузы в очереди) exten => h,n,GotoIf($[${printfax} = 1]?h1) exten => h,n,System(/usr/bin/lp ${faxremzovaname}.pdf) exten => h,n(h1),NoOp(факса либо не было либо он напечатан) exten => h,n,AddQueueMember(Remzova,${operatorline}) exten => h,n,NoOp(оператор снят с паузы)

;==================================================================================== ; ; Макрос оперделения линии DAHDI оператора по внутреннему номеру ; ;====================================================================================

[macro-channel] exten => s,1,NoOp(Макрос определение канала DAHDI по EXTEN) same => n,GotoIf($[${ARG1} = 260]?D144) same => n,GotoIf($[${ARG1} = 261]?D145) same => n,GotoIf($[${ARG1} = 503]?D503) same => n,GotoIf($[${ARG1} = 512]?D512) same => n,HangUp(Какая та ошибка) same => n(D144),Set(channel=DAHDI/144) same => n,MacroExit() same => n(D145),Set(channel=DAHDI/145) same => n,MacroExit() same => n(D503),Set(channel=DAHDI/130) same => n,MacroExit() same => n(D512),Set(channel=DAHDI/125) same => n,MacroExit()

;==================================================================================== ; ; Макрос прием факса ; ;====================================================================================

[macro-faxremzova] exten => s,1,NoOp(Макрос приема факса платного угла) same => n,NoOp(${TRANSFERCONTEXT},${PARKINGEXTEN},${channel},${faxval},${retval},${CALLERID(name)}) same => n,Set(faxremzovaname=/home/FAXRemzova/${STRFTIME(${EPOCH},,%Y)}/${STRFTIME(${EPOCH},,%m)}/${STRFTIME(${EPOCH},,%d)}/${ARG1}) same => n,ReceiveFAX(${filename}.tif) same => n,System(/usr/bin/tiff2pdf ${filename}.tif -o ${filename}.pdf) same => n,Set(retfaxname=${ARG1}.pdf) same => n,GotoIf($[${ARG1} =! 0 & ${ARG1} =! 3]?:f1) same => n,AGI(agi://localhost/storedprocedurecall.agi,Asteriskwritefax,${ARG1},${retfaxname},out,writeval) same => n(f1),PlayBack(_13) same => n,MacroExit() курсив

А проблем собственно две. 1. Все переменные которые мы назначаем до постановки клиента в очередь, при постановки теряются. Это решилось передачей всех необходимых параметров через переменную ${CALLERID(name)}. Но после её переназначения при выходи из очереди она не изменяется почему та. То есть остается ровно такой какая была до очереди. Это не удобно. 2. При выполнение Dial как только оператор подымает трубку срабатывает экстеншен h. Собственно поэтому он и был убран в другой контекст. И после того как оператор переключает клиента на факс, сам он сбрасывается, хотя по идее должен парковаться. Уже неделю бьюсь над этим. Если кто может, подскажите пожалуйста, куда копать. Спасибо.

P.S. У меня есть другой контекст, где в принципе всё это реализовано и работает, но там нет Queue. Вот он. курсив ;==================================================================================== ; ; Прозвон клиентов из формса ; ;====================================================================================

exten => s,1,Set(PARKINGEXTEN=${parkn}) ;exten => s,2,Dial(SIP/now/${nomerval},30,tT) ;same => n,Goto(asteroid,${nomerval},1) same => n,Set(CALLERID(all)=2697551) same => n,Dial(DAHDI/g1/${nomerval},30,tT) same => n,NoOp(${DIALSTATUS}) same => n,GotoIf($[${DIALSTATUS} = ANSWER]?:s1) same => n,Park(36000000,,,,s) same => n(s1),HangUp(телефон занят или не доступен)

exten => 0,1,NoOp(${PARKINGEXTEN}) same => n,Set(popytka=0) ;same => n,Set(retval=5) same => n,Goto(v1) same => n(v0),Set(popytka=[${popytka}+1]) same => n,Gotoif($[${popytka}>3]?v3) same => n(v1),Read(passval,110,5,,3,5) same => n,NoOp(${PARKINGEXTEN}) same => n,NoOp(${nomerval}) same => n,NoOp(${passval}) same => n,AGI(agi://localhost/storedprocedurecall.agi,Asteriskcontrolpassword,${passval},${nomerval},out,retval) same => n,NoOp(${nomerval}) same => n,NoOp(${passval}) same => n,Gotoif($[${retval}=1]?v2) same => n,PlayBack(111) same => n,Goto(v0) same => n(v2),PlayBack(112&113) same => n(v3),ParkedCall(${PARKINGEXTEN}) курсив

Проблемы с Dial и переменными после Queue

Добрый день! Возникла следующая проблема. Логика звонка следующая: Клиент звонит на определенный номер, ему предлагают авторизоваться при помощи набора кода с клавиатуры. После ввода с клавиатуры пароля, в базе проверяется соответствие телефона клиента и пароля. База возвращает несколько переменных. Если клиент есть то возвращается его индетификатор (${retval}) и данные о том отплавляет он обычно факсы или нет (${faxval}). В случае отсутствия клиента в базе ретвал возвращается 0 или 3 если какая та ошибка и он пихается в очередь к операторам. Если факсвал равен 1 то клиенту предлагается отправить факс. во всех других случаях в очередь. После отправки факса, записываем переменную в базу и тоже в очередь. После того как он отстоит в очереди и прежде чем вызвать оператора мы проверяем отправлял ли он факс. Если да, то резервируем оператора(ставим на паузу в очереди или вообще выводим из очереди, не важно), печатаем факс, говорим клиетну, что сейчас оператор обрабатывает его факс и паркуем клиента. Оператор в это время получает факс (печатает, электронка, тоже не важно), и снимает после того как готов говорить с клиентом его с парковки и начинает душевную беседу. Если нет факса, то начинается беседа, но оператор может в любой момент переключить клиента на факс. При переключении оператор паркуется. Клиент отправив факс, забирает с парковки своего оператора, а сам слышит фразу о том что его факс обрабатывается оператором и ставиться на парковку. Оператор при готовности, снимает клиента с парковки. По хенгапу оператор опять ставиться в очередь, и печатается факс, если он не был распечатан. В принципе всё :-) чуть короче диалплана получилось :-) А вот собственно сам диалплан курсив

;==============================================================================
;
;                               Основной алгоритм
;
;====================================================================================

;==================================================================================== exten => Remzova,1,NoOp(Звонок с номера 2697-550) same => n,Set(phonenum=${CALLERID(num)}) same => n,Set(retval=0) same => n,Set(faxval=0) n,Set(_phone_num=${CALLERID(num)}) same => n,Set(__ret_val=0) same => n,Set(__fax_val=0) ;same => n,Answer() same => n,PlayBack(116,noanswer) n,PlayBack(_116,noanswer) same => n,Set(popytka=1) same => n,Goto(read) same => n(r0),Gotoif($[${popytka}>3]?rv1) same => n,Read(passval,18,5,,1,8) n,Read(pass_val,_18,5,,1,8) same => n,Goto(set) same => n(read),Read(passval,17,5,,3,5) n(read),Read(pass_val,_17,5,,3,5) same => n(set),Set(popytka=[${popytka}+1]) same => n(agi),AGI(agi://localhost/storedprocedurecall.agi,Asteriskidentification,${passval},${phonenum},out,retval,faxval) same => n,NoOp(${retval}, ${faxval}) same => n,GotoIf($[${retval} n(agi),AGI(agi://localhost/stored_procedure_call.agi,Asterisk_identification,${pass_val},${phone_num},out,ret_val,fax_val) same => n,NoOp(${ret_val}, ${fax_val}) same => n,GotoIf($[${ret_val} = 0]?r0) same => n,GotoIf($[${retval} n,GotoIf($[${ret_val} = 3]?rv1) same => n,Goto(fax) same => n(rv1),Set(_retval=0000000003) same => n(r1),PlayBack(19) same => n(q1),Set(CALLERID(name)=${retval}${faxval}) n(rv1),Set(__ret_val=0000000003) same => n(r1),PlayBack(_19) same => n(q1),Set(CALLERID(name)=${ret_val}${fax_val}) same => n,Queue(Remzova,tTkK) same => n,Goto(callfromqueueremzova,,p0) n,Goto(call_from_queue_remzova,,p0) same => n,NoOp(выход из очереди Remzova) same => n,HangUp() same => n(fax),GotoIf($[${faxval} n(fax),GotoIf($[${fax_val} = 1]?:q1) same => n,Read(youwanttosendafax,11,1,,1,10) same => n,GotoIf($[${youwanttosendafax} n,Read(you_want_to_send_a_fax,_11,1,,1,10) same => n,GotoIf($[${you_want_to_send_a_fax} = 1]?:q1) same => n,Macro(faxremzova,0) same => n,PlayBack(14) same => n,Goto(r1)

n,Macro(fax_remzova,0) same => n,PlayBack(_14) same => n,Goto(r1) ;exten => h,1,NoOp(связь прекращена по какой либо причине) ;exten => h,n,System(/usr/bin/lp ${faxremzovaname}.pdf)

${fax_remzova_name}.pdf) ;==================================================================================== ; ; Звонки из очереди Remzova ; ;====================================================================================

[callfromqueueremzova] ;==================================================================================== [call_from_queue_remzova] exten => _[1-9]XX,1,NoOp(Звонок из очереди Remzova) same => n,NoOp(${CALLERID(name)}) same => n,Set(GOTOONBLINDXFR=callfromqueueremzova,${EXTEN},p0) same => n,Set(faxval=${CALLERID(name):-1}) same => n,Set(retval=${CALLERID(name):0:10}) same => n,Set(TRANSFERCONTEXT=faxfromqueueremzova) same => n,Set(PARKINGEXTEN=9${EXTEN}) same => n,Set(CALLINGPRES=${retval}${faxval}${PARKINGEXTEN}) same => n,Set(operatorline=Local/${EXTEN}@callfromqueueremzova) same => n,RemoveQueueMember(Remzova,${operatorline}) n,Set(GOTO_ON_BLINDXFR=call_from_queue_remzova,${EXTEN},p0) same => n,Set(__fax_val=${CALLERID(name):-1}) same => n,Set(__ret_val=${CALLERID(name):0:10}) same => n,Set(__TRANSFER_CONTEXT=fax_from_queue_remzova) same => n,Set(__PARKINGEXTEN=9${EXTEN}) same => n,Set(__CALLINGPRES=${ret_val}${fax_val}${PARKINGEXTEN}) same => n,Set(__operator_line=Local/${EXTEN}@call_from_queue_remzova) same => n,RemoveQueueMember(Remzova,${operator_line}) same => n,Macro(channel,${EXTEN}) same => n(echo),System(echo ${retval} ${ret_val} > /home/Remzova/DAHDI${EXTEN}) same => n,GotoIf($[${faxval} /home/Remzova/DAHDI_${EXTEN}) same => n,GotoIf($[${fax_val} = 2]?:agent) same => n,Playback(117) n,Playback(_117) same => n(p0),NoOp(${DIALSTATUS}) same => n,Set(PARKINGEXTEN=9${EXTEN}) n,Set(__PARKINGEXTEN=9${EXTEN}) same => n,Park(36000000,,,,s) same => n(s1),HangUp(телефон занят или не доступен) same => n(agent),Dial(${channel},60,tTg) ;same => n,PauseQueueMember(Remzova,${operatorline}) same => n,Goto(p0)

n,PauseQueueMember(Remzova,${operator_line}) same => n,Goto(p0) ;==================================================================================== ; ; Возможность оператору переключить на факс клиетна во время разговора ; ;==================================================================================== [faxfromqueueremzova] [fax_from_queue_remzova] exten => 0,1,NoOp(Переключение оператором на факс) same => n,NoOp(${CALLINGPRES}) same => n,Set(faxval=${CALLINGPRES:10:1}) same => n,Set(retval=${CALLINGPRES:0:10}) same => n,Set(PARKINGEXTEN=${CALLINGPRES:-4}) same => n,Macro(faxremzova,${retval}) n,Set(__fax_val=${CALLINGPRES:10:1}) same => n,Set(__ret_val=${CALLINGPRES:0:10}) same => n,Set(__PARKINGEXTEN=${CALLINGPRES:-4}) same => n,Macro(fax_remzova,${ret_val}) same => n,System(/usr/bin/lp ${faxremzovaname}.pdf) same => n,Set(printfax ${fax_remzova_name}.pdf) same => n,Set(__print_fax = 1) same => n,NoOp(${PARKINGEXTEN},${faxval},${retval}) n,NoOp(${PARKINGEXTEN},${fax_val},${ret_val}) same => n,PlayBack(_117) ;same => n,NoOp(${channel}) ;same => n,Dial(${channel},1) ;same => n,Park(120,,,,s) ;same => n(agent),Dial(${channel},60,tT) same => n,ParkedCall(${PARKINGEXTEN})

n,ParkedCall(${PARKINGEXTEN}) exten => h,1,NoOp(проверка не забыли ли распечатать факс и снятие оператора с паузы в очереди) exten => h,n,GotoIf($[${printfax} h,n,GotoIf($[${print_fax} = 1]?h1) exten => h,n,System(/usr/bin/lp ${faxremzovaname}.pdf) ${fax_remzova_name}.pdf) exten => h,n(h1),NoOp(факса либо не было либо он напечатан) exten => h,n,AddQueueMember(Remzova,${operatorline}) h,n,AddQueueMember(Remzova,${operator_line}) exten => h,n,NoOp(оператор снят с паузы)

паузы) ;==================================================================================== ; ; Макрос оперделения линии DAHDI оператора по внутреннему номеру ; ;====================================================================================

;==================================================================================== [macro-channel] exten => s,1,NoOp(Макрос определение канала DAHDI по EXTEN) same => n,GotoIf($[${ARG1} = 260]?D144) same => n,GotoIf($[${ARG1} = 261]?D145) same => n,GotoIf($[${ARG1} = 503]?D503) same => n,GotoIf($[${ARG1} = 512]?D512) same => n,HangUp(Какая та ошибка) same => n(D144),Set(channel=DAHDI/144) n(D144),Set(__channel=DAHDI/144) same => n,MacroExit() same => n(D145),Set(channel=DAHDI/145) n(D145),Set(__channel=DAHDI/145) same => n,MacroExit() same => n(D503),Set(channel=DAHDI/130) n(D503),Set(__channel=DAHDI/130) same => n,MacroExit() same => n(D512),Set(channel=DAHDI/125) same => n,MacroExit()

n(D512),Set(__channel=DAHDI/125) same => n,MacroExit() ;==================================================================================== ; ; Макрос прием факса ; ;====================================================================================

[macro-faxremzova] ;==================================================================================== [macro-fax_remzova] exten => s,1,NoOp(Макрос приема факса платного угла) same => n,NoOp(${TRANSFERCONTEXT},${PARKINGEXTEN},${channel},${faxval},${retval},${CALLERID(name)}) same => n,Set(faxremzovaname=/home/FAXRemzova/${STRFTIME(${EPOCH},,%Y)}/${STRFTIME(${EPOCH},,%m)}/${STRFTIME(${EPOCH},,%d)}/${ARG1}) n,NoOp(${TRANSFER_CONTEXT},${PARKINGEXTEN},${channel},${fax_val},${ret_val},${CALLERID(name)}) same => n,Set(__fax_remzova_name=/home/FAX_Remzova/${STRFTIME(${EPOCH},,%Y)}/${STRFTIME(${EPOCH},,%m)}/${STRFTIME(${EPOCH},,%d)}/${ARG1}) same => n,ReceiveFAX(${filename}.tif) same => n,System(/usr/bin/tiff2pdf ${filename}.tif -o ${filename}.pdf) same => n,Set(retfaxname=${ARG1}.pdf) n,Set(__ret_fax_name=${ARG1}.pdf) same => n,GotoIf($[${ARG1} =! 0 & ${ARG1} =! 3]?:f1) same => n,AGI(agi://localhost/storedprocedurecall.agi,Asteriskwritefax,${ARG1},${retfaxname},out,writeval) n,AGI(agi://localhost/stored_procedure_call.agi,Asterisk_write_fax,${ARG1},${ret_fax_name},out,write_val) same => n(f1),PlayBack(_13) same => n,MacroExit() курсив

*курсив* А проблем собственно две. 1. Все переменные которые мы назначаем до постановки клиента в очередь, при постановки теряются. Это решилось передачей всех необходимых параметров через переменную ${CALLERID(name)}. Но после её переназначения при выходи из очереди она не изменяется почему та. То есть остается ровно такой какая была до очереди. Это не удобно. 2. При выполнение Dial как только оператор подымает трубку срабатывает экстеншен h. Собственно поэтому он и был убран в другой контекст. И после того как оператор переключает клиента на факс, сам он сбрасывается, хотя по идее должен парковаться. Уже неделю бьюсь над этим. Если кто может, подскажите пожалуйста, куда копать. Спасибо.

Спасибо. P.S. У меня есть другой контекст, где в принципе всё это реализовано и работает, но там нет Queue. Вот он. курсив *курсив* ;==================================================================================== ; ; Прозвон клиентов из формса ; ;====================================================================================

exten => s,1,Set(PARKINGEXTEN=${parkn}) ;==================================================================================== exten => s,1,Set(_PARKINGEXTEN=${parkn}) ;exten => s,2,Dial(SIP/now/${nomerval},30,tT) s,2,Dial(SIP/now/${nomer_val},30,tT) ;same => n,Goto(asteroid,${nomerval},1) n,Goto(asteroid,${nomer_val},1) same => n,Set(CALLERID(all)=2697551) same => n,Dial(DAHDI/g1/${nomerval},30,tT) n,Dial(DAHDI/g1/${nomer_val},30,tT) same => n,NoOp(${DIALSTATUS}) same => n,GotoIf($[${DIALSTATUS} = ANSWER]?:s1) same => n,Park(36000000,,,,s) same => n(s1),HangUp(телефон занят или не доступен)

доступен) exten => 0,1,NoOp(${PARKINGEXTEN}) same => n,Set(popytka=0) ;same => n,Set(retval=5) n,Set(ret_val=5) same => n,Goto(v1) same => n(v0),Set(popytka=[${popytka}+1]) same => n,Gotoif($[${popytka}>3]?v3) same => n(v1),Read(passval,110,5,,3,5) n(v1),Read(pass_val,_110,5,,3,5) same => n,NoOp(${PARKINGEXTEN}) same => n,NoOp(${nomerval}) same => n,NoOp(${passval}) same => n,AGI(agi://localhost/storedprocedurecall.agi,Asteriskcontrolpassword,${passval},${nomerval},out,retval) same => n,NoOp(${nomerval}) same => n,NoOp(${passval}) same => n,Gotoif($[${retval}=1]?v2) same => n,PlayBack(111) n,NoOp(${nomer_val}) same => n,NoOp(${pass_val}) same => n,AGI(agi://localhost/stored_procedure_call.agi,Asterisk_control_password,${pass_val},${nomer_val},out,ret_val) same => n,NoOp(${nomer_val}) same => n,NoOp(${pass_val}) same => n,Gotoif($[${ret_val}=1]?v2) same => n,PlayBack(_111) same => n,Goto(v0) same => n(v2),PlayBack(112&113) n(v2),PlayBack(_112&_113) same => n(v3),ParkedCall(${PARKINGEXTEN}) курсив

*курсив*

Проблемы с Dial и переменными после Queue

Добрый день! Возникла следующая проблема. Логика звонка следующая: Клиент звонит на определенный номер, ему предлагают авторизоваться при помощи набора кода с клавиатуры. После ввода с клавиатуры пароля, в базе проверяется соответствие телефона клиента и пароля. База возвращает несколько переменных. Если клиент есть то возвращается его индетификатор (${retval}) и данные о том отплавляет он обычно факсы или нет (${faxval}). В случае отсутствия клиента в базе ретвал возвращается 0 или 3 если какая та ошибка и он пихается в очередь к операторам. Если факсвал равен 1 то клиенту предлагается отправить факс. во всех других случаях в очередь. После отправки факса, записываем переменную в базу и тоже в очередь. После того как он отстоит в очереди и прежде чем вызвать оператора мы проверяем отправлял ли он факс. Если да, то резервируем оператора(ставим на паузу в очереди или вообще выводим из очереди, не важно), печатаем факс, говорим клиетну, что сейчас оператор обрабатывает его факс и паркуем клиента. Оператор в это время получает факс (печатает, электронка, тоже не важно), и снимает после того как готов говорить с клиентом его с парковки и начинает душевную беседу. Если нет факса, то начинается беседа, но оператор может в любой момент переключить клиента на факс. При переключении оператор паркуется. Клиент отправив факс, забирает с парковки своего оператора, а сам слышит фразу о том что его факс обрабатывается оператором и ставиться на парковку. Оператор при готовности, снимает клиента с парковки. По хенгапу оператор опять ставиться в очередь, и печатается факс, если он не был распечатан. В принципе всё :-) чуть короче диалплана получилось :-) А вот собственно сам диалплан курсив

;==============================================================================
;
;                               Основной алгоритм
;
;====================================================================================

exten => Remzova,1,NoOp(Звонок с номера 2697-550)
same => n,Set(_phone_num=${CALLERID(num)})
same => n,Set(__ret_val=0)
same => n,Set(__fax_val=0)
;same => n,Answer()
same => n,PlayBack(_116,noanswer)
same => n,Set(popytka=1)
same => n,Goto(read)
same => n(r0),Gotoif($[${popytka}>3]?rv1)
same => n,Read(pass_val,_18,5,,1,8)
same => n,Goto(set)
same => n(read),Read(pass_val,_17,5,,3,5)
same => n(set),Set(popytka=[${popytka}+1])
same => n(agi),AGI(agi://localhost/stored_procedure_call.agi,Asterisk_identification,${pass_val},${phone_num},out,ret_val,fax_val)
same => n,NoOp(${ret_val}, ${fax_val})
same => n,GotoIf($[${ret_val} = 0]?r0)
same => n,GotoIf($[${ret_val} = 3]?rv1)
same => n,Goto(fax)
same => n(rv1),Set(__ret_val=0000000003)
same => n(r1),PlayBack(_19)
same => n(q1),Set(CALLERID(name)=${ret_val}${fax_val})
same => n,Queue(Remzova,tTkK)
same => n,Goto(call_from_queue_remzova,,p0)
same => n,NoOp(выход из очереди Remzova)
same => n,HangUp()
same => n(fax),GotoIf($[${fax_val} = 1]?:q1)
same => n,Read(you_want_to_send_a_fax,_11,1,,1,10)
same => n,GotoIf($[${you_want_to_send_a_fax} = 1]?:q1)
same => n,Macro(fax_remzova,0)
same => n,PlayBack(_14)
same => n,Goto(r1)

;exten => h,1,NoOp(связь прекращена по какой либо причине)
;exten => h,n,System(/usr/bin/lp ${fax_remzova_name}.pdf)

;====================================================================================
;
;                               Звонки из очереди Remzova
;
;====================================================================================

[call_from_queue_remzova]
exten => _[1-9]XX,1,NoOp(Звонок из очереди Remzova)
same => n,NoOp(${CALLERID(name)})
same => n,Set(GOTO_ON_BLINDXFR=call_from_queue_remzova,${EXTEN},p0)
same => n,Set(__fax_val=${CALLERID(name):-1})
same => n,Set(__ret_val=${CALLERID(name):0:10})
same => n,Set(__TRANSFER_CONTEXT=fax_from_queue_remzova)
same => n,Set(__PARKINGEXTEN=9${EXTEN})
same => n,Set(__CALLINGPRES=${ret_val}${fax_val}${PARKINGEXTEN})
same => n,Set(__operator_line=Local/${EXTEN}@call_from_queue_remzova)
same => n,RemoveQueueMember(Remzova,${operator_line})
same => n,Macro(channel,${EXTEN})
same => n(echo),System(echo ${ret_val} > /home/Remzova/DAHDI_${EXTEN})
same => n,GotoIf($[${fax_val} = 2]?:agent)
same => n,Playback(_117)
same => n(p0),NoOp(${DIALSTATUS})
same => n,Set(__PARKINGEXTEN=9${EXTEN})
same => n,Park(36000000,,,,s)
same => n(s1),HangUp(телефон занят или не доступен)
same => n(agent),Dial(${channel},60,tTg)
;same => n,PauseQueueMember(Remzova,${operator_line})
same => n,Goto(p0)

;====================================================================================
;
;                               Возможность оператору переключить на факс клиетна во время разговора
;
;====================================================================================
[fax_from_queue_remzova]
exten => 0,1,NoOp(Переключение оператором на факс)
same => n,NoOp(${CALLINGPRES})
same => n,Set(__fax_val=${CALLINGPRES:10:1})
same => n,Set(__ret_val=${CALLINGPRES:0:10})
same => n,Set(__PARKINGEXTEN=${CALLINGPRES:-4})
same => n,Macro(fax_remzova,${ret_val})
same => n,System(/usr/bin/lp ${fax_remzova_name}.pdf)
same => n,Set(__print_fax = 1)
same => n,NoOp(${PARKINGEXTEN},${fax_val},${ret_val})
same => n,PlayBack(_117)
;same => n,NoOp(${channel})
;same => n,Dial(${channel},1)
;same => n,Park(120,,,,s)
;same => n(agent),Dial(${channel},60,tT)
same => n,ParkedCall(${PARKINGEXTEN})

exten => h,1,NoOp(проверка не забыли ли распечатать факс и снятие оператора с паузы в очереди)
exten => h,n,GotoIf($[${print_fax} = 1]?h1)
exten => h,n,System(/usr/bin/lp ${fax_remzova_name}.pdf)
exten => h,n(h1),NoOp(факса либо не было либо он напечатан)
exten => h,n,AddQueueMember(Remzova,${operator_line})
exten => h,n,NoOp(оператор снят с паузы)

;====================================================================================
;
;                               Макрос оперделения линии DAHDI оператора по внутреннему номеру
;
;====================================================================================


[macro-channel]
exten => s,1,NoOp(Макрос определение канала DAHDI по EXTEN)
same => n,GotoIf($[${ARG1} = 260]?D144)
same => n,GotoIf($[${ARG1} = 261]?D145)
same => n,GotoIf($[${ARG1} = 503]?D503)
same => n,GotoIf($[${ARG1} = 512]?D512)
same => n,HangUp(Какая та ошибка)
same => n(D144),Set(__channel=DAHDI/144)
same => n,MacroExit()
same => n(D145),Set(__channel=DAHDI/145)
same => n,MacroExit()
same => n(D503),Set(__channel=DAHDI/130)
same => n,MacroExit()
same => n(D512),Set(__channel=DAHDI/125)
same => n,MacroExit()

;====================================================================================
;
;                               Макрос прием факса
;
;====================================================================================

[macro-fax_remzova]
exten => s,1,NoOp(Макрос приема факса платного угла)
same => n,NoOp(${TRANSFER_CONTEXT},${PARKINGEXTEN},${channel},${fax_val},${ret_val},${CALLERID(name)})
same => n,Set(__fax_remzova_name=/home/FAX_Remzova/${STRFTIME(${EPOCH},,%Y)}/${STRFTIME(${EPOCH},,%m)}/${STRFTIME(${EPOCH},,%d)}/${ARG1})
same => n,ReceiveFAX(${filename}.tif)
same => n,System(/usr/bin/tiff2pdf ${filename}.tif -o ${filename}.pdf)
same => n,Set(__ret_fax_name=${ARG1}.pdf)
same => n,GotoIf($[${ARG1} =! 0 & ${ARG1} =! 3]?:f1)
same => n,AGI(agi://localhost/stored_procedure_call.agi,Asterisk_write_fax,${ARG1},${ret_fax_name},out,write_val)
same => n(f1),PlayBack(_13)
same => n,MacroExit()
*курсив*

А проблем собственно две.
1. Все переменные которые мы назначаем до постановки клиента в очередь, при постановки теряются. Это решилось передачей всех необходимых параметров через переменную ${CALLERID(name)}. Но после её переназначения при выходи из очереди она не изменяется почему та. То есть остается ровно такой какая была до очереди. Это не удобно.
2. При выполнение Dial как только оператор подымает трубку срабатывает экстеншен h. Собственно поэтому он и был убран в другой контекст. И после того как оператор переключает клиента на факс, сам он сбрасывается, хотя по идее должен парковаться. Уже неделю бьюсь над этим. Если кто может, подскажите пожалуйста, куда копать. Спасибо.

P.S. У меня есть другой контекст, где в принципе всё это реализовано и работает, но там нет Queue. Вот он.
*курсив*
;====================================================================================
;
;                                       Прозвон клиентов из формса
;
;====================================================================================


exten => s,1,Set(_PARKINGEXTEN=${parkn})
;exten => s,2,Dial(SIP/now/${nomer_val},30,tT)
;same => n,Goto(asteroid,${nomer_val},1)
same => n,Set(CALLERID(all)=2697551)
same => n,Dial(DAHDI/g1/${nomer_val},30,tT)
same => n,NoOp(${DIALSTATUS})
same => n,GotoIf($[${DIALSTATUS} = ANSWER]?:s1)
same => n,Park(36000000,,,,s)
same => n(s1),HangUp(телефон занят или не доступен)


exten => 0,1,NoOp(${PARKINGEXTEN})
same => n,Set(popytka=0)
;same => n,Set(ret_val=5)
same => n,Goto(v1)
same => n(v0),Set(popytka=[${popytka}+1])
same => n,Gotoif($[${popytka}>3]?v3)
same => n(v1),Read(pass_val,_110,5,,3,5)
same => n,NoOp(${PARKINGEXTEN})
same => n,NoOp(${nomer_val})
same => n,NoOp(${pass_val})
same => n,AGI(agi://localhost/stored_procedure_call.agi,Asterisk_control_password,${pass_val},${nomer_val},out,ret_val)
same => n,NoOp(${nomer_val})
same => n,NoOp(${pass_val})
same => n,Gotoif($[${ret_val}=1]?v2)
same => n,PlayBack(_111)
same => n,Goto(v0)
same => n(v2),PlayBack(_112&_113)
same => n(v3),ParkedCall(${PARKINGEXTEN})
*курсив*

P.S. Поправил. Ответа так и не нашел.

Проблемы с Dial и переменными после Queue

Добрый день! Возникла следующая проблема. Логика звонка следующая: Клиент звонит на определенный номер, ему предлагают авторизоваться при помощи набора кода с клавиатуры. После ввода с клавиатуры пароля, в базе проверяется соответствие телефона клиента и пароля. База возвращает несколько переменных. Если клиент есть то возвращается его индетификатор (${retval}) и данные о том отплавляет он обычно факсы или нет (${faxval}). В случае отсутствия клиента в базе ретвал возвращается 0 или 3 если какая та ошибка и он пихается в очередь к операторам. Если факсвал равен 1 то клиенту предлагается отправить факс. во всех других случаях в очередь. После отправки факса, записываем переменную в базу и тоже в очередь. После того как он отстоит в очереди и прежде чем вызвать оператора мы проверяем отправлял ли он факс. Если да, то резервируем оператора(ставим на паузу в очереди или вообще выводим из очереди, не важно), печатаем факс, говорим клиетну, что сейчас оператор обрабатывает его факс и паркуем клиента. Оператор в это время получает факс (печатает, электронка, тоже не важно), и снимает после того как готов говорить с клиентом его с парковки и начинает душевную беседу. Если нет факса, то начинается беседа, но оператор может в любой момент переключить клиента на факс. При переключении оператор паркуется. Клиент отправив факс, забирает с парковки своего оператора, а сам слышит фразу о том что его факс обрабатывается оператором и ставиться на парковку. Оператор при готовности, снимает клиента с парковки. По хенгапу оператор опять ставиться в очередь, и печатается факс, если он не был распечатан. В принципе всё :-) чуть короче диалплана получилось :-) А вот собственно сам диалплан курсив

;==============================================================================
;
;                               Основной алгоритм
;
;====================================================================================

exten => Remzova,1,NoOp(Звонок с номера 2697-550)
same => n,Set(_phone_num=${CALLERID(num)})
same => n,Set(__ret_val=0)
same => n,Set(__fax_val=0)
;same => n,Answer()
same => n,PlayBack(_116,noanswer)
same => n,Set(popytka=1)
same => n,Goto(read)
same => n(r0),Gotoif($[${popytka}>3]?rv1)
same => n,Read(pass_val,_18,5,,1,8)
same => n,Goto(set)
same => n(read),Read(pass_val,_17,5,,3,5)
same => n(set),Set(popytka=[${popytka}+1])
same => n(agi),AGI(agi://localhost/stored_procedure_call.agi,Asterisk_identification,${pass_val},${phone_num},out,ret_val,fax_val)
same => n,NoOp(${ret_val}, ${fax_val})
same => n,GotoIf($[${ret_val} = 0]?r0)
same => n,GotoIf($[${ret_val} = 3]?rv1)
same => n,Goto(fax)
same => n(rv1),Set(__ret_val=0000000003)
same => n(r1),PlayBack(_19)
same => n(q1),Set(CALLERID(name)=${ret_val}${fax_val})
same => n,Queue(Remzova,tTkK)
same => n,Goto(call_from_queue_remzova,,p0)
same => n,NoOp(выход из очереди Remzova)
same => n,HangUp()
same => n(fax),GotoIf($[${fax_val} = 1]?:q1)
same => n,Read(you_want_to_send_a_fax,_11,1,,1,10)
same => n,GotoIf($[${you_want_to_send_a_fax} = 1]?:q1)
same => n,Macro(fax_remzova,0)
same => n,PlayBack(_14)
same => n,Goto(r1)

;exten => h,1,NoOp(связь прекращена по какой либо причине)
;exten => h,n,System(/usr/bin/lp ${fax_remzova_name}.pdf)

;====================================================================================
;
;                               Звонки из очереди Remzova
;
;====================================================================================

[call_from_queue_remzova]
exten => _[1-9]XX,1,NoOp(Звонок из очереди Remzova)
same => n,NoOp(${CALLERID(name)})
same => n,Set(GOTO_ON_BLINDXFR=call_from_queue_remzova,${EXTEN},p0)
same => n,Set(__fax_val=${CALLERID(name):-1})
same => n,Set(__ret_val=${CALLERID(name):0:10})
same => n,Set(__TRANSFER_CONTEXT=fax_from_queue_remzova)
same => n,Set(__PARKINGEXTEN=9${EXTEN})
same => n,Set(__CALLINGPRES=${ret_val}${fax_val}${PARKINGEXTEN})
same => n,Set(__operator_line=Local/${EXTEN}@call_from_queue_remzova)
same => n,RemoveQueueMember(Remzova,${operator_line})
same => n,Macro(channel,${EXTEN})
same => n(echo),System(echo ${ret_val} > /home/Remzova/DAHDI_${EXTEN})
same => n,GotoIf($[${fax_val} = 2]?:agent)
same => n,Playback(_117)
same => n(p0),NoOp(${DIALSTATUS})
same => n,Set(__PARKINGEXTEN=9${EXTEN})
same => n,Park(36000000,,,,s)
same => n(s1),HangUp(телефон занят или не доступен)
same => n(agent),Dial(${channel},60,tTg)
;same => n,PauseQueueMember(Remzova,${operator_line})
same => n,Goto(p0)

;====================================================================================
;
;                               Возможность оператору переключить на факс клиетна во время разговора
;
;====================================================================================
[fax_from_queue_remzova]
exten => 0,1,NoOp(Переключение оператором на факс)
same => n,NoOp(${CALLINGPRES})
same => n,Set(__fax_val=${CALLINGPRES:10:1})
same => n,Set(__ret_val=${CALLINGPRES:0:10})
same => n,Set(__PARKINGEXTEN=${CALLINGPRES:-4})
same => n,Macro(fax_remzova,${ret_val})
same => n,System(/usr/bin/lp ${fax_remzova_name}.pdf)
same => n,Set(__print_fax = 1)
same => n,NoOp(${PARKINGEXTEN},${fax_val},${ret_val})
same => n,PlayBack(_117)
;same => n,NoOp(${channel})
;same => n,Dial(${channel},1)
;same => n,Park(120,,,,s)
;same => n(agent),Dial(${channel},60,tT)
same => n,ParkedCall(${PARKINGEXTEN})

exten => h,1,NoOp(проверка не забыли ли распечатать факс и снятие оператора с паузы в очереди)
exten => h,n,GotoIf($[${print_fax} = 1]?h1)
exten => h,n,System(/usr/bin/lp ${fax_remzova_name}.pdf)
exten => h,n(h1),NoOp(факса либо не было либо он напечатан)
exten => h,n,AddQueueMember(Remzova,${operator_line})
exten => h,n,NoOp(оператор снят с паузы)

;====================================================================================
;
;                               Макрос оперделения линии DAHDI оператора по внутреннему номеру
;
;====================================================================================


[macro-channel]
exten => s,1,NoOp(Макрос определение канала DAHDI по EXTEN)
same => n,GotoIf($[${ARG1} = 260]?D144)
same => n,GotoIf($[${ARG1} = 261]?D145)
same => n,GotoIf($[${ARG1} = 503]?D503)
same => n,GotoIf($[${ARG1} = 512]?D512)
same => n,HangUp(Какая та ошибка)
same => n(D144),Set(__channel=DAHDI/144)
same => n,MacroExit()
same => n(D145),Set(__channel=DAHDI/145)
same => n,MacroExit()
same => n(D503),Set(__channel=DAHDI/130)
same => n,MacroExit()
same => n(D512),Set(__channel=DAHDI/125)
same => n,MacroExit()

;====================================================================================
;
;                               Макрос прием факса
;
;====================================================================================

[macro-fax_remzova]
exten => s,1,NoOp(Макрос приема факса платного угла)
same => n,NoOp(${TRANSFER_CONTEXT},${PARKINGEXTEN},${channel},${fax_val},${ret_val},${CALLERID(name)})
same => n,Set(__fax_remzova_name=/home/FAX_Remzova/${STRFTIME(${EPOCH},,%Y)}/${STRFTIME(${EPOCH},,%m)}/${STRFTIME(${EPOCH},,%d)}/${ARG1})
same => n,ReceiveFAX(${filename}.tif)
same => n,System(/usr/bin/tiff2pdf ${filename}.tif -o ${filename}.pdf)
same => n,Set(__ret_fax_name=${ARG1}.pdf)
same => n,GotoIf($[${ARG1} =! 0 & ${ARG1} =! 3]?:f1)
same => n,AGI(agi://localhost/stored_procedure_call.agi,Asterisk_write_fax,${ARG1},${ret_fax_name},out,write_val)
same => n(f1),PlayBack(_13)
same => n,MacroExit()
*курсив*
 

А проблем собственно две. 1. Все переменные которые мы назначаем до постановки клиента в очередь, при постановки теряются. Это решилось передачей всех необходимых параметров через переменную ${CALLERID(name)}. Но после её переназначения при выходи из очереди она не изменяется почему та. То есть остается ровно такой какая была до очереди. Это не удобно. 2. При выполнение Dial как только оператор подымает трубку срабатывает экстеншен h. Собственно поэтому он и был убран в другой контекст. И после того как оператор переключает клиента на факс, сам он сбрасывается, хотя по идее должен парковаться. Уже неделю бьюсь над этим. Если кто может, подскажите пожалуйста, куда копать. Спасибо. Спасибо.

P.S. У меня есть другой контекст, где в принципе всё это реализовано и работает, но там нет Queue. Вот он. *курсив* он.

;==================================================================================== ; ; Прозвон клиентов из формса ; ;==================================================================================== ;====================================================================================

exten => s,1,Set(_PARKINGEXTEN=${parkn})
;exten => s,2,Dial(SIP/now/${nomer_val},30,tT)
;same => n,Goto(asteroid,${nomer_val},1)
same => n,Set(CALLERID(all)=2697551)
same => n,Dial(DAHDI/g1/${nomer_val},30,tT)
same => n,NoOp(${DIALSTATUS})
same => n,GotoIf($[${DIALSTATUS} = ANSWER]?:s1)
same => n,Park(36000000,,,,s)
same => n(s1),HangUp(телефон занят или не доступен)


exten => 0,1,NoOp(${PARKINGEXTEN})
same => n,Set(popytka=0)
;same => n,Set(ret_val=5)
same => n,Goto(v1)
same => n(v0),Set(popytka=[${popytka}+1])
same => n,Gotoif($[${popytka}>3]?v3)
same => n(v1),Read(pass_val,_110,5,,3,5)
same => n,NoOp(${PARKINGEXTEN})
same => n,NoOp(${nomer_val})
same => n,NoOp(${pass_val})
same => n,AGI(agi://localhost/stored_procedure_call.agi,Asterisk_control_password,${pass_val},${nomer_val},out,ret_val)
same => n,NoOp(${nomer_val})
same => n,NoOp(${pass_val})
same => n,Gotoif($[${ret_val}=1]?v2)
same => n,PlayBack(_111)
same => n,Goto(v0)
same => n(v2),PlayBack(_112&_113)
same => n(v3),ParkedCall(${PARKINGEXTEN})
*курсив*

P.S. Поправил. Ответа так и не нашел.

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