?

Log in

No account? Create an account

Previous Entry

Всегда на связи

"Менеджеры должны быть на связи всегда" - руководство недовольно, что пришла весна и народ стал часто курить на улице. Ведь при этом они теряют входящие звонки от клиентов, что сказывается на бизнесе - "Вообщем, сделай ЭТО".

Локальный-сотовый.

Итак. У каждого менеджера (да и всех сотрудников фирмы) есть сотовый. Вот и будем их использовать.
Чтобы долго не заморачиваться с базой или еще чем-то я сделал файлик local_cell.txt такого содержимого:

101:Иванов:89215550000
201:Петров:89117700100

Теперь делаем AGI-PHP скрипт:

   $par=$argv[1];

require_once('phpagi.php');
$agi= new AGI();
$DOP="";

$f=fopen("/home/samba/public/local_cell.txt","r");
while(!feof($f))
{
    $str=rtrim(fgets($f));
    if(substr($str,0,1)!=";")
    {
    list($local,$fio,$phone)=explode(":",$str);
    if($local==$par)
    {
        $DOP='&Local/'.$phone.'@local-gsm';
        break;
    }

    }

}
fclose($f);
$agi->set_variable('DOP',$DOP);

?>


Обратите внимание, что в скрипте стоит проверка - строка будет восприниматься если первым символом не является точка с запятой - это для удобства управления (например менеджер ушел в отпуск).

Теперь правим диалплан asterisk:

exten => _XXX,1,NoOp()
same => n(dial),ExecIfTime(09:00-18:00,mon-fri,*,*?AGI(local_call.php,${EXTEN}))
same => n,ExecIf($["${DOP}" != ""]?Set(FILE(/tmp/${EXTEN}.txt)=${CALLERID(num)}))
same => n,Dial(SIP/${EXTEN}${DOP},90,tTkK)

[local-gsm]
exten => _X.,1,NoOp(Call to ${EXTEN})
same => n,Wait(10)
same => n,Macro(dial-out,${EXTEN})



Итак. В рабочее время звонок на локальный номер вызывает выполнение скрипта с параметром КУДА идет звонок. Если в списке внутренний номер присутствует - он будет возвращен в переменной ${DOP} в виде "&Local/89215550000@local-gsm". Иначе переменная будет пустой. Следующей строкой стоит создание временного файла в котором указывается кто звонил последним по данному номеру (об этом чуть ниже).

Звонок идет на локальный телефон и ... одновременно попадает в контекст, где на 10 секунд "замораживается", а после этого начинает звонить на сотовый.

Все, сделано. Правда выяснилось, что 10 секунд - слишком долго: народ просто бросал трубку не дождавшись ответа. Сейчас уменьшили интервал до 6 секунд.

Кто ГАМЛЕТА ЗОВЕТ?

Из-за постоянно торопящихся сотрудников, которые ждут не более 13-15 секунд ответа и просто бросают трубку, на сотовых телефонах менеджеров стало образовываться куча пропущенных из офиса звонков (за один перекур до 7-ми штук!!!).

Понадоблся механизм, который позволил бы понять кто последний звонил и не дождался ответа. Для этого в диалплане, в контексте где принимаем звонки на городской и привествуем голосовым меню сделал номер 000:

exten => 000,1,NoOp(Test for last call)
same => n,AGI(who_call.php,${CALLERID(num)})
same => n,Set(sip=${FILE(/tmp/${LOC}.txt)})
same => n,Festival('-. Звонок от абонента ')
same => n,SayDigits(${sip})
same => n,GotoIf($[ LEN(${SIP}) > 3 ]?gorod)
same => n,GotoIf($["${DEVICE_STATE(SIP/${sip})}" = "NOT_INUSE"]?redial)
same => n,Festival(' сейчас он занят ')
same => n,Hangup
same => n(redial),Festival(' соединяю с ним ')
same => n,Dial(SIP/${sip},,tTkT)
same => n,Hangup

same => n(gorod),Festival(' соединяю с ним ')
same => n,Dial(Local/${sip}@office,,tTkT)
same => n,Hangup


Итак. При выборе 000 стартует AGI-скрипт who_call.php, который практически полностью совпадает с первым скриптом, но только в файлике ищет номер сотового, который позвонил и соотвествие внутреннего номера. В переменной ${LOC} появляется имя временного файла, который был сформирован для данного звонка. Считываем оттуда кто звонил и...

Вот тут пришлось еще и проверку сделать - звонок мог идти как от внутреннего абонента так и от внешнего. Если внутренний - проверяем его состояние и если он свободен - начинаем его вызывать. Иначе просто завершаем звонок с извинениями.
Для внешних абонентов - просто пускаем дозвон.

Все. РАБОТАЕТ на УРА. Плюс управлять всем этим легко и просто, меняя содержимое списка телефонов в текстовом редакторе.

Минитрабла.

В один прекрасный день вырубился и интернет и телефония из-за аварии на линии провайдера. Хорошо, что у меня кэширующий DNS стоит и asterisk это пережил нормально. Но вот этот механизм "заглючил" как-то странно: если в списке телефон олкальных присутствует - скрипт local_call.php корректно завершал свою работу и выдавал значения. А вот если в списке телефона не было - скрипт подвисал на 10-15 секунд!!!. Странно.

Comments

( 5 comments — Leave a comment )
Abdulkarim Isagadjiev
Sep. 6th, 2018 09:14 am (UTC)
Офисная телефония - быстро и качественно
а

Edited at 2018-09-06 09:20 am (UTC)
Abdulkarim Isagadjiev
Sep. 6th, 2018 09:17 am (UTC)
Офисная телефония - быстро и качественно
Добрый день!
Нужна Телефония для небольшой службы такси.
Помогите телефонизировать службу.
Xas.991@gmail.com
Абдул
bob_ling
Oct. 23rd, 2018 01:13 am (UTC)
Поздравляю, всех благ! :)
kosenko_danila
Oct. 23rd, 2018 07:58 am (UTC)
Вряд ли Вы читаете комменты, но всё равно - с днём рождения! Всяческих благ!
wapo_spb
Oct. 23rd, 2018 08:10 am (UTC)
Читаю, так что СПАСИБО
( 5 comments — Leave a comment )