Vlad1983, это было сказано не в плане, что нет данных, а в том плане, что не вижу в логах события записи cdr, а вот события записи queue_log вполне себе есть.
В общем решил проблему таким методом:
Вход в очередь:
Код: Выделить всё
exten => s,n,Queue(sop,XxTtm,,,5,,ivrmixmon)
мемберы выглядят так:
Код: Выделить всё
member=Local/529@incoming-ivr/n
member=Local/504@incoming-ivr/n
и т.д.
Макрос ivrmixmon:
Код: Выделить всё
[macro-ivrmixmon]
exten => s,1,NoOp(Starting record)
same => n,Set(MON_FILE=${UNIQUEID}-${STRFTIME(${EPOCH},,%Y-%m-%d-%H_%M)}-${CDR(src)}-${CALLERID(num)})
same => n,Set(MON_OPT=nice -n 19 /usr/bin/lame -b 32 --silent "${WAV}/${MON_FILE}.wav" "${MP3}/${MON_FILE}.mp3" && rm -f "${WAV}/${MON_FILE}.wav" && chmod o+r "${MP3}/${MON_FILE}.mp3")
same => n,MixMonitor(${WAV}/${MON_FILE}.wav,b,${MON_OPT})
same => n,Set(DBPATH=${CUT(CHANNEL,\;,1)})
same => n,Set(DB(${DBPATH})=${MON_FILE})
контекст incoming-ivr, в котором набираются звонки:
Код: Выделить всё
[incoming-ivr]
exten => _X.,1,NoOp()
same => n,NoCDR()
same => n,Dial(SIP/${EXTEN},,TtXx)
same => n,NoOp()
exten => h,1,NoOp(Call is end)
same => n,Set(DBPATH=${CUT(CHANNEL,\;,1)})
same => n,Set(FILENAME=${DB_DELETE(${DBPATH})})
same => n,GotoIf($[ "x${FILENAME}" == "x" ]?end)
same => n,NoOp(File Name is ${FILENAME})
same => n,Set(CDR(filename)=${FILENAME}.mp3)
same => n,Set(CDR(userfield)=IncomingCallFromIVR)
same => n,Set(ODBC_NEWCDR(${CDR(start)},${CALLERID(all)},${CALLERID(num)},${CDR(dst)},${CDR(dcontext)},${CHANNEL},dstchannel,${CDR(lastapp)},lastdata,${CDR(duration)},${CDR(billsec)},${DIALSTATUS},amaflags,${CDR(accountcode)},${CDR(uniqueid)},${CDR(userfield)},${CDR(filename)},filename2)=123)
same => n(end),ResetCDR()
Все отлично работает. Не получилось заставить CDR писать, как мне надо. Сам пишу CDR.
Строка same => n,Set(ODBC_NEWCDR блабла -- после завершение звонка пишет в базу цдр све необходимые мне значения по этому звонку и корректно отображается в статистике.
НО! Всегда есть но. Выплыла одна не приятная штука. При трансфере звонка встроенными средствами астериск, получается, что изначальный канал разрывается после того, как переведенная сторона кладет трубку. Т.е. у того кто принял звонок и перевел на нужного человека в записях разговоров идет полностьб запись всего раговора, от момета поднятия трубки оператором и до момента завершения звонка сотрудником на которого перевели звонок.
Как это побороть? как завершить запись разговора для канала? и сделать отдельную запись для ексеншена на который перевели (у него запись есть своя от момента как на него перевели и до момента завершения звонка).
Спасибо.
P.S. Так же, у меня остался открытый вопрос, просто кастомные поля ЦДР.
При этом задаю CDR(filename) и в завершении звонка вызывая NoOp(${CDR(filename)}) он мне показывает содержимое переменной, но в базе поле не заполняется. Как бы заявленно, что цдр без пробле пишет кастомные поля, лишь бы в базе такое было, но не хочет он писать.
Если объявить в cdr_managers.conf в мапингах filename => filename, то начинет писать поля, но дублируются записи, т.е. по одному звонку в таблице две идентичные записи, что тоже не очень хорошо.
Спасибо за ответы и подсказки.