Фиксирование времени без регистрации у пиров

Для начинающих.
Всем начинающим - сюда.

Модераторы: Admins, Модераторы

Ответить
rrv
Сообщения: 62
Зарегистрирован: 29 авг 2012, 13:23
Откуда: Харьков

Фиксирование времени без регистрации у пиров

Сообщение rrv » 11 сен 2012, 14:56

Добрый день, подскажите пожалуйста в какую сторону копать?

Есть задача, фиксировать время нахождения операторов в различных статусах (онлайн, обед и тд). Т.е. если сотрудник не может принимать звонки, он меняет статус, например на обед, и к нему звонки не идут. По сформировавшемуся в конце месяца отчету о времени нахождения в статусе "Онлайн", ему начисляется зп.

Смену статусов настроил, через специальные номера, сохраненные в адресную книгу:

Код: Выделить всё

exten => 601,1,Answer()
exten => 601,n,Wait(1)
exten => 601,n,Set(CHAN=${CUT(CHANNEL,-,1)})
exten => 601,n,Set(DB(fop2state/${CHAN})=Online)
exten => 601,n,Set(STAT=Online)
exten => 601,n,UserEvent(FOP2ASTDB,Family: fop2state,Channel: ${CHAN},Value: Online)
exten => 601,n,MYSQL(Connect connid localhost root pass asterisk)
exten => 601,n,MYSQL(Query resultid ${connid} INSERT INTO `stats` SET `Date`='${STRFTIME(${EPOCH},,%Y-%m-%d %H:%M:%S)}',`SIP`='${CHAN}',`Status`='${STAT}')
exten => 601,n,MYSQL(Clear ${resultid})
exten => 601,n,MYSQL(Disconnect ${connid})
exten => 601,n,Playback(/var/lib/asterisk/sounds/1)
exten => 601,n,HangUp()

exten => 602,1,Answer()
exten => 602,n,Wait(1)
exten => 602,n,Set(CHAN=${CUT(CHANNEL,-,1)})
exten => 602,n,Set(DB(fop2state/${CHAN})=Personal Needs)
exten => 602,n,Set(STAT=Personal Needs)
exten => 602,n,UserEvent(FOP2ASTDB,Family: fop2state,Channel: ${CHAN},Value: Personal Needs)
exten => 602,n,MYSQL(Connect connid localhost root pass asterisk)
exten => 602,n,MYSQL(Query resultid ${connid} INSERT INTO `stats` SET `Date`='${STRFTIME(${EPOCH},,%Y-%m-%d %H:%M:%S)}',`SIP`='${CHAN}',`Status`='${STAT}')
exten => 602,n,MYSQL(Clear ${resultid})
exten => 602,n,MYSQL(Disconnect ${connid})
exten => 602,n,Playback(/var/lib/asterisk/sounds/2)
exten => 602,n,HangUp()
При входящем звонке в колл-центр, звонок направляется в очередь, в которой проверяется какой статус у оператора, и в зависимости от этого соединяется с ним или перекидывается на следующего в очереди

Код: Выделить всё

[macro-fo]
exten => s,1,Set(CHAN=${CUT(CHANNEL,-,1)})
exten => s,n,Set(STAT=${DB(fop2state/${CHAN})})
exten => s,n,GotoIf($[${STAT} = Online]?:s2,1)
exten => s,n,GotoIf($[${LEN(${CDR(src)})} > 10]?:s1,1)
exten => s,n,System(curl --connect-timeout 1 --retry 0 "http://192.168.1.70/Aster/FastOperator.asmx/MakeCall?User=${CALLERID(num)}&PhoneNumber=${CDR(src):2}")
exten => s1,1,System(curl --connect-timeout 1 --retry 0 "http://192.168.1.70/Aster/FastOperator.asmx/MakeCall?User=${CALLERID(num)}&PhoneNumber=${CDR(src)}")
exten => s2,1,HangUp()
Но если оператор (используется софтфон Zoiper) снимает регистрацию, то звонок к нему не идет, оператор спокойно может покинуть рабочее место, не меняя статус.

Как можно сделать, чтоб при снятии регистрации менялся статус пользователя? Или как можно фиксировать снятие регистрации?

Аватара пользователя
Wapo
Сообщения: 1391
Зарегистрирован: 08 май 2009, 09:47
Откуда: СПб.
Контактная информация:

Сообщение Wapo » 11 сен 2012, 15:10

Тут не совсем правильный подход. Поясняю. Оператор, нажав комбинацию, подключается к ОЧЕРЕДИ обслуживания. Это и фиксируем и AddMemberQueue. Далее он ушел, НО не отключился = не принял ЗВОНКИ в течении отведенного времени!!! Значит ПО РУКАМ! Ему надо было перед уходом сделать вторую комбинацию и нам RemoveQueueMember с фиксацией в базе. А вот потом делайте ЛЮБОЙ отчет. :)
P4 3.0 + 1Gb CentOS 5.8 Aster 11.25.1
Не люблю gui-сборки: натуральный продукт вкуснее.
И еще: я ПРОФИ так как НЕ ЛЕНЮСЬ читать литературу.

rrv
Сообщения: 62
Зарегистрирован: 29 авг 2012, 13:23
Откуда: Харьков

Сообщение rrv » 11 сен 2012, 16:25

Не пойму как это поможет решить мою проблему, если оператор после подключения к очереди (AddMemberQueue) возьмет и снимет регистрацию? Он то и дальше будет агентом очереди, а звонки на него поступать не будут :?
Вот если бы при снятии регистрации выполнять RemoveQueueMember, но как?

awsswa
Сообщения: 1729
Зарегистрирован: 28 апр 2012, 10:19
Откуда: Russia, Пермь

Сообщение awsswa » 11 сен 2012, 16:31

не, надо при определенном колличестве неотвеченных выкидывать из очереди и ставить статус

rrv
Сообщения: 62
Зарегистрирован: 29 авг 2012, 13:23
Откуда: Харьков

Сообщение rrv » 11 сен 2012, 17:00

[url=http://asteriskforum.ru/viewtopic.php?p=65564#65564][img]http://asteriskforum.ru/images/quotebackarrow.gif[/img][/url] awsswa @ Вт Сен 11, 2012 17:31 писал(а):не, надо при определенном колличестве неотвеченных выкидывать из очереди и ставить статус
Так неотвеченных не будет, при снятой регистрации

Аватара пользователя
Wapo
Сообщения: 1391
Зарегистрирован: 08 май 2009, 09:47
Откуда: СПб.
Контактная информация:

Сообщение Wapo » 12 сен 2012, 07:36

Так. Опять таки. Есть AddQueueMember = пользователь ВСТАЛ на обслуживание и ждет ПРИХОДА звонка. При этом его телефон ВЫКЛЮЧЕН, а не в режиме "трубка поднята, слушаю музыку, жду".
P4 3.0 + 1Gb CentOS 5.8 Aster 11.25.1
Не люблю gui-сборки: натуральный продукт вкуснее.
И еще: я ПРОФИ так как НЕ ЛЕНЮСЬ читать литературу.

rrv
Сообщения: 62
Зарегистрирован: 29 авг 2012, 13:23
Откуда: Харьков

Сообщение rrv » 13 сен 2012, 16:13

Так вот я и пытаюсь понять, как можно узнать, что пользователь выключил телефон :?

vldmr
Сообщения: 17
Зарегистрирован: 27 окт 2011, 14:52

Сообщение vldmr » 13 сен 2012, 16:18

AddQueueMember, RemoveQueueMember, PauseQueueMember, UnpauseQueueMember, queue_log в БД и строй нужную статистику.

rrv
Сообщения: 62
Зарегистрирован: 29 авг 2012, 13:23
Откуда: Харьков

Сообщение rrv » 13 сен 2012, 16:50

Как использовать AddQueueMember, RemoveQueueMember и тд вопросов нет, уже все работает и пишется в базу

Код: Выделить всё

exten => 601,1,Answer()
exten => 601,n,Wait(1)
exten => 601,n,Set(CHAN=${CUT(CHANNEL,-,1)})
exten => 601,n,Set(DB(fop2state/${CHAN})=Online)
exten => 601,n,Set(STAT=Online)
exten => 601,n,UserEvent(FOP2ASTDB,Family: fop2state,Channel: ${CHAN},Value: Online)
exten => 601,n,AddQueueMember(cc)
exten => 601,n,MYSQL(Connect connid localhost root pass asterisk)
exten => 601,n,MYSQL(Query resultid ${connid} INSERT INTO `stats` SET `Date`='${STRFTIME(${EPOCH},,%Y-%m-%d %H:%M:%S)}',`SIP`='${CHAN}',`Status`='${STAT}')
exten => 601,n,MYSQL(Clear ${resultid})
exten => 601,n,MYSQL(Disconnect ${connid})
exten => 601,n,Playback(/var/lib/asterisk/sounds/1)
exten => 601,n,HangUp()

exten => 602,1,Answer()
exten => 602,n,Wait(1)
exten => 602,n,Set(CHAN=${CUT(CHANNEL,-,1)})
exten => 602,n,Set(DB(fop2state/${CHAN})=Personal Needs)
exten => 602,n,Set(STAT=Personal Needs)
exten => 602,n,UserEvent(FOP2ASTDB,Family: fop2state,Channel: ${CHAN},Value: Personal Needs)
exten => 602,n,RemoveQueueMember(cc)
exten => 602,n,MYSQL(Connect connid localhost root pass asterisk)
exten => 602,n,MYSQL(Query resultid ${connid} INSERT INTO `stats` SET `Date`='${STRFTIME(${EPOCH},,%Y-%m-%d %H:%M:%S)}',`SIP`='${CHAN}',`Status`='${STAT}')
exten => 602,n,MYSQL(Clear ${resultid})
exten => 602,n,MYSQL(Disconnect ${connid})
exten => 602,n,Playback(/var/lib/asterisk/sounds/2)
exten => 602,n,HangUp()
Я хочу понять, как фиксировать снятие регистрации оператором, в тот момент когда оператор уже добавил себя в очередь

vldmr
Сообщения: 17
Зарегистрирован: 27 окт 2011, 14:52

Сообщение vldmr » 13 сен 2012, 17:07

Я штатными средствами пишу queue_log в MySQL, при начале и окончании работы с помощью QueueLog заношу нужную информацию.

rrv
Сообщения: 62
Зарегистрирован: 29 авг 2012, 13:23
Откуда: Харьков

Сообщение rrv » 13 сен 2012, 18:00

То ли я вас не пойму, то ли вы меня, для меня критически важно, чтобы при снятии регистрации с софтфона это фиксировалось в БД. Может переменная есть показывающая наличие/отсутствие регистрации пира на сервере? Тогда можно было бы обрабатывать по условию.
Честно говоря, не могу понять, как queue_log может мне в этом помощь?

awsswa
Сообщения: 1729
Зарегистрирован: 28 апр 2012, 10:19
Откуда: Russia, Пермь

Сообщение awsswa » 13 сен 2012, 18:20

как вариант проверять статус CHANUNAVAIL и при наличии этого статуса выкидывать из очереди

Аватара пользователя
noize
Сообщения: 913
Зарегистрирован: 29 ноя 2006, 12:51
Откуда: Москва

Сообщение noize » 14 сен 2012, 07:04

Написать демона, который через ami будет мониторить состояние абонентов. Штатными средствами астериска не сделать.

vldmr
Сообщения: 17
Зарегистрирован: 27 окт 2011, 14:52

Сообщение vldmr » 14 сен 2012, 08:03

[url=http://asteriskforum.ru/viewtopic.php?p=65637#65637][img]http://asteriskforum.ru/images/quotebackarrow.gif[/img][/url] rrv @ Чт Сен 13, 2012 20:00 писал(а):То ли я вас не пойму, то ли вы меня, для меня критически важно, чтобы при снятии регистрации с софтфона это фиксировалось в БД. Может переменная есть показывающая наличие/отсутствие регистрации пира на сервере? Тогда можно было бы обрабатывать по условию.
Честно говоря, не могу понять, как queue_log может мне в этом помощь?
Теперь понял. Негодяи остаются в очереди, но при этом отключают софтфоны? В данном случае, думаю, можно использовать локальные каналы и проверять ${DIALSTATUS}.

rrv
Сообщения: 62
Зарегистрирован: 29 авг 2012, 13:23
Откуда: Харьков

Сообщение rrv » 14 сен 2012, 12:51

Про ${DIALSTATUS} и CHANUNAVAIL как то сразу не подумал, думаю получится реализовать, спасибо всем откликнувшимся :D

Added after 1 hours 23 minutes:

Подумал, не получится ${DIALSTATUS} напрямую из астериска проверять, придется скрипт ваять.
Одно радует знаю в какую сторону идти :)

andyk74
Сообщения: 240
Зарегистрирован: 22 мар 2011, 12:25

Сообщение andyk74 » 14 сен 2012, 14:30

Можно настройть, чтобы при регистрации сип акаунта одновременно регестрировался экреншн (regexten, regcontext в sip.conf).
Далее есть функции для проверки наличия дайлплана.

Если нужно конкретно обрабатывать событие сразу после регистрации или ее потери, тогда надо писать обработчик на астериск менеджер.

Ответить