Но при этом в CDR генерируются 4 записи:
src: Клиент, dst: Оператор 1 [начало звонка - начало перевода звонка]
src: Оператор 1, dst: Оператор 2 [начало перевода - оператор 1 кладет трубку]
src: Клиент, dst: Оператор 1 [время начала и конца соответствует предыдущей запси] <-- Видимо, соответствует каналу, где висит клиент на удержании, пока операторы разговаривают
src: Клиент, dst: Оператор 1 [оператор 1 кладет трубку, начало разговора оператора 2 с клиентом - конец разговора]
Вопрос по последней записи. По идее, там д.б. Оператор 2, вместо 1. В выводе консоли в этом simple_bridge операторы меняются местами, оператор 1 покидает, а оператор 2 помещается в него, и такое событие, судя по всему, не обновляет значения переменных об участниках канала.
Есть ли способы это пофиксить хотя бы костылями?
Что пробовал:
- В диалплане какого-то отдельного обработчика, срабатываемого после attended transfer, когда операторы меняются местами, я не нашел (можно было бы установить из него свои переменные CDR).
- Думал хотя бы по окончании разговора фиксировать последнего оператора: в hangup handler при завершении разговора делаю dumpchan, во всех переменных канала фигурирует оператор 1. В секции Info оператор 2 присутствует в поле ConnectedLineIDNum. Но проблема в том, что Info в dumpchan это не переменная канала, и непонятно, как это значение можно дёрнуть из диалплана. Можно было бы на худой конец распарсить вывод dumpchan, но само приложение не возвращает никакого значения, оно просто выводит текст в консоль, в диалплане он недоступен
- Посмотрел в сырцах dumpchan, там юзается внутренняя функция
- Код: выделить все
S_COR(ast_channel_connected(c)->id.number.valid, ast_channel_connected(c)->id.number.str, "(N/A)"),
- Код: выделить все
struct ast_party_connected_line *ast_channel_connected(struct ast_channel *chan)
{
return &chan->connected;
}
ведущая в chan_internal_api.c:
В исходниках ни одного приложения или функции диалплана не нашел возврата chan->connected в диалплан (на то наверное оно и internal api).