Как можно отслеживать незавершённые звонки в очереди?

Здравствуйте! <br/> Мне нужно настроить уведомление о неотвеченных вызовах в чат Telegram. Для этого я внес изменения в файл extensions_override_freepbx.conf и добавил следующий код: <br/> <pre><code>[ext-queues]
exten =&gt; h,1,Noop(${CDR(disposition)})
;exten =&gt; h,n,ExecIf($["${CDR(disposition)}" = "NO ANSWER"] | $["${CDR(disposition)}" = "BUSY"])?AGI(tg-noanswer.php, ${CALLERID(num)}, ${STRFTIME(${EPOCH},,%Y.%m.%d-%H:%M:%S)})
exten =&gt; h,n,Macro(hangupcall,)</code></pre> <br/> Во время тестирования все работало корректно, но в процессе эксплуатации я обнаружил, что переменная ${CDR(disposition)} может принимать значение "NO ANSWER" даже в случаях, когда звонок был принят. <br/> <br/> Как можно в таких условиях правильно отслеживать неотвеченные вызовы в очереди?
  • 11 сентября 2024 г. 9:23
Ответы на вопрос 2
Для отслеживания незавершённых звонков в очереди можно использовать более надежные методы, чтобы избежать проблем с неправильной интерпретацией переменной `${CDR(disposition)}`.

Вот несколько шагов и советов, которые могут помочь:

1. **Используйте статус очереди**: При использовании очередей в Asterisk можно отслеживать больше информации о вызовах, например, используя специальный контекст для управления очередями. При завершении вызова в очереди можно воспользоваться дополнительными переменными, такими как `${QUEUESTATUS}`.

2. **Измените логику**: Вместо того, чтобы полагаться на переменную `${CDR(disposition)}`, вы можете отслеживать статус вызова на основе других переменных, которые указывают на то, что вызов был неотвечен. Например, можно добавить дополнительную логику, отправляющую уведомление в Telegram, если вызов был в очереди, но не был распределён ни одному  
агенту.

3. **Использование `Queue` метода**: Внутри вашей очереди можно воспользоваться параметрами, такими как `queue_position`, чтобы определить, что вызов не был обработан. Вы можете установить таймер ожидания и, если истечёт время, отправить уведомление о неотвеченном вызове.

4. **Добавьте AGI-скрипт**: Используйте AGI-скрипт, который будет вызываться в момент, когда вызов не был принят. Сохраните состояние вызова в переменные и работайте с ним для отправки уведомлений.

Пример кода для отслеживания состояния вызова на основе тайм-аутов в очереди:

```bash
[ext-queues]
exten => h,1,Noop(${CDR(disposition)})
same => n,Set(VARS=(${CDR(disposition)}))
same => n,ExecIf($["${VARS}" = "NO ANSWER"]?AGI(tg-noanswer.php,${CALLERID(num)}, ${STRFTIME(${EPOCH},,%Y.%m.%d-%H:%M:%S)}))
same => n,Macro(hangupcall)
```

5. **Логирование и анализ**: Включите логирование для отслеживания состояния вызовов. Например, в случае, если звонок не был завершён, записывайте данные в файл или базу данных для последующего анализа.

6. **Обновление и тестирование**: Убедитесь, что вы протестировали ваши изменения в тестовой среде, прежде чем перенести их на рабочую систему, чтобы избежать неприятных сюрпризов.

Используя эти методы, вы сможете более точно отслеживать незавершённые вызовы в очереди и отправлять уведомления в Telegram только при действительно неотвеченных вызовах.
может быть NO ANSWER да же, если кто-то ответил на звонок.

Логично, допустим в очереди 3 агента, один ответил на звонок а остальные естественно нет, а проверку ты делаеш в hangup, а для 3х агентов будет 3 хенгапа)

Надо делать через handler. Надо переписать начало звонка и перед вызовом queue вставить handler такого вида.

;; Это надо вставить перед вызовом очереди 
same => n,Set(CHANNEL(hangup_handler_push)=hdlr-queue-miss-call,s,1(${CALLERID(num)})

[hdlr-queue-miss-call]
exten => s,1,Noop(---==== Handler queue miss call ===---)
same => n,Set(CLIENT_NUMBER=${ARG1})
same => n,GotoIf($[${ABANDONED}]?:end_call)
same => n,AGI(tg-noanswer.php, ${CLIENT_NUMBER}, ${STRFTIME(${EPOCH},,%Y.%m.%d--H:%M:%S)})
same => n(end_call),Hangup()
Похожие вопросы