Страница 1 из 1

запись поля accountcode в cdr

СообщениеДобавлено: 13 мар 2019, 21:17
Merk83
Asterisk 13.17.0 во Freepbx
Хочу писать в cdr имя агента, который ответил на вызов.
Модифицировал контекст вызова очереди след образом:
Код: выделить все
exten => 500,n(qcall),Queue(500,${QOPTIONS},,${QAANNOUNCE},${QMAXWAIT},${QAGI},,set-accountcode,s,1,${QRULE},${QPOSITION})

Т.е. добавил опцию вызова Gosub когда оператор отвечает на звонок. Вот сам контекст, который вызывается очередью:
Код: выделить все
[set-accountcode]
exten => s,1,Set(CHANNEL(accountcode)=${MEMBERNAME})
exten => s,n,Verbose(<<<<<<<<<<<<<<set as ${MEMBERNAME}>>>>>>>>>>>>>>>)
exten => s,n,Return

В консоли видно как отрабатывает Verbose, показывая значение переменной MEMBERNAME (она не пустая), значит при ответе оператора контекст set-accountcode выполняется и переменная accountcode устанавливается. Но в базе cdr поле accountcode записи этого звонка пустое. Не записывается оно никак.
Если же установить accountcode ПЕРЕД вызовом Queue, то в базу оно попадает корректно. Как обновлять accountcode во время выполнения Queue?

Re: запись поля accountcode в cdr

СообщениеДобавлено: 14 мар 2019, 11:51
ded
Код: выделить все
[set-accountcode]
exten => s,1,Set(CDR(accountcode)=${MEMBERNAME})
exten => s,n,Verbose(<<<<<<<<<<<<<<set as ${MEMBERNAME}>>>>>>>>>>>>>>>)
exten => s,n,Return

Re: запись поля accountcode в cdr

СообщениеДобавлено: 14 мар 2019, 14:15
Merk83
не работает так))
Еще и астериск ругается на то. что Set(CDR(.. устарело, типа используй Set(CHANNEL(

Похоже, когда очередь уже "Началась", R\W-поля CDR, доступные пользователю, уже недоступны для записи. Или же макрос, запускаемый очередью, выполняется для нового канала (который с агентом очереди, а не с клиентом). Учитывая, что в базу CDR во Freepbx пишутся данные по первому каналу, который содержит позвонившего в очередь, в итоге accountcode в базе пустое.
Пробовал использовать функцию SHARED(), но она пишет в отдельное пространство переменных и как потом передать это обратно в первый канал, в нужную мне переменную канала, ума не приложу.

Re: запись поля accountcode в cdr

СообщениеДобавлено: 14 мар 2019, 16:25
ded
${CDR(clid)} Caller ID
${CDR(src)} Source
${CDR(dst)} Destination
${CDR(dcontext)} Destination context
${CDR(channel)} Channel name
${CDR(dstchannel)} Destination channel
${CDR(lastapp)} Last app executed
${CDR(lastdata)} Last app's arguments
${CDR(start)} Time the call started.
${CDR(answer)} Time the call was answered.
${CDR(end)} Time the call ended.
${CDR(duration)} Duration of the call.
${CDR(billsec)} Duration of the call once it was answered.
${CDR(disposition)} ANSWERED, NO ANSWER, BUSY
${CDR(amaflags)} DOCUMENTATION, BILL, IGNORE etc
${CDR(accountcode)} The channel's account code.
${CDR(uniqueid)} The channel's unique id.
${CDR(userfield)} The channels uses specified field.

https://wiki.asterisk.org/wiki/display/ ... +Variables
Не знаю, зачем они там всё меняют. Вот в 16-м Астериске - https://wiki.asterisk.org/wiki/display/ ... nction_CDR
CDR()
Synopsis

Gets or sets a CDR variable.
Description

All of the CDR field names are read-only, except for accountcode, userfield, and amaflags. You may, however, supply a name not on the above list, and create your own variable, whose value can be changed with this function, and this variable will be stored on the CDR.

accountcode, userfield, and amaflags - перезаписываемые.

Re: запись поля accountcode в cdr

СообщениеДобавлено: 14 мар 2019, 20:41
BorisTheBlade
gosub выполняется в канале оператора, CDR пишет инициатор звонка, попробуйте в AGI писать, он на строне вызывающего запускается.

Re: запись поля accountcode в cdr

СообщениеДобавлено: 09 апр 2019, 17:42
union1111
проверьте в cli при вызове какой используются канал в Queue() и какой в [set-accountcode] , возможно они разные, тогда и некуда писать SET CDR