Возникла следующая проблема. Логика звонка следующая:
Клиент звонит на определенный номер, ему предлагают авторизоваться при помощи набора кода с клавиатуры. После ввода с клавиатуры пароля, в базе проверяется соответствие телефона клиента и пароля. База возвращает несколько переменных. Если клиент есть то возвращается его индетификатор (${ret_val}) и данные о том отплавляет он обычно факсы или нет (${fax_val}). В случае отсутствия клиента в базе рет_вал возвращается 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})