28.10.2015

Transfer

Взято у IGORG, чтоб не забыть.
Оригинал


Самой важной задачей, которую выполняет АТС предприятия — принять звонок, передать необходимому сотруднику и совершить обмен информацией. Совершенно неприемлемой ситуацией является, когда звонок по какой-либо причине теряется. Лояльности это уж точно не добавит.
Одной из важнейших функций PBX является функция перевода вызова, которая, к сожалению в Asterisk работает не так, как, скажем, в традиционном для российского офиса Panasonic. В этом я убедился устанавливая Asterisk в компании на 60 человек, в которой эта функция была критична, но не работала как надо ни на адаптерах, ни на Asterisk. Решилось тогда административными мерами: человек, переводящий звонок, должен был дождаться ответа третьей стороны. Но это не решение, решение далее.
В версии 1.6 усилиями разработчиков появилась функция, позволяющая возвращать вызов сотруднику, делавшему перевод вызова, если на другой стороне вызов принят не был. При этом при возврате вызова Asterisk может сделать несколько вызовов, ведь он может уже быть занят новым разговором. Вот опции, отвечающие за работу:
  • atxferdropcall. Допустим кто-либо осуществляет перевод вызова с согласованием и ложит трубку до того как вызов соединён. Если выбрано значение «yes», то используется старое поведение — при невозможности соединить позвонившего вызов сбрасывается. Если выбрано «no», то система вернёт вызов обратно осуществлявшему transfer.
  • atxfernoanswertimeout. Таймаут, в течении которого система пытается соединиться со третей стороной. По-молчанию 15 секунд.
  • atxferloopdelay. Задержка перед повторным возвратом вызова делавшему transfer сотруднику.
  • atxfercallbackretries. Количество попыток возврата вызова, по-умолчанию 2.
Оказывается можно сделать аналогичным образом и в 1.4 с помощью только функций и переменных диал-плана. Вот пример extensions.conf:
  1. [globals]  
  2. XFERNOANSTIMEOUT=15  
  3. XFERRETRIES=2  
  4. XFERLOOPDELAY=10  
  5.   
  6. [office]  
  7. exten => _XXX,1,Set(TRANSFER_CONTEXT=office-xfer)  
  8. exten => _XXX,n,Dial(SIP/${EXTEN},,Tt)  
  9. [office-xfer]  
  10. exten => _XXX,1,Set(RETRIES=0)  
  11. exten => _XXX,n,ChanIsAvail(SIP/${EXTEN},s)  
  12. exten => _XXX,n,GotoIf($[${LEN(${AVAILCHAN})} = 0]?ret)  
  13. exten => _XXX,n,Dial(SIP/${EXTEN},${XFERNOANSTIMEOUT},Tt)  
  14. exten => _XXX,n(ret),GotoIf($[${BRIDGEPEER} = ${TRANSFERERNAME}]?(h,1))  
  15. exten => _XXX,n,Dial(SIP/${TRANSFERERNAME:4:3},${XFERNOANSTIMEOUT},Tt)  
  16. exten => _XXX,n,Set(RETRIES=$[${RETRIES}+1])  
  17. exten => _XXX,n,GotoIf($[${RETRIES} < ${XFERRETRIES}]?ret)  
  18. exten => _XXX,n,Wait(${XFERLOOPDELAY})  
  19. exten => _XXX,n,Playback(sorry)  
  20. exten => _XXX,n,Hangup()  
  21. exten => h,1,Hangup()  
Такое решение более гибко, чем настройки в features.conf, так как вы можете вместо обратного вызова припарковать клиента или отправить сообщение менеджеру на Jabber о том, что перевод вызова не удался.
В приведённом примере достаточно много шелухи, если постараться то все дополнения уместятся в три-четыре строки. Ключевым здесь является использование переменной. Вот ещё некоторые переменные, которые вы можете использовать:
  • BRIDGEPEER — переменная с именем канала, в данный момент соединённого с данным
  • BLIND_TRANSFER — переменная с именем пира, осуществившего перевод вызова в-слепую
  • TRANSFERERNAME — переменная содержащая имя канала. осуществляющего transfer (это относится только к attented transfer)
 

Комментариев нет:

Отправить комментарий