AF
Asterisk Forum
обсуждения телефонии, VoIP и IP-PBX
12разделов
5 423тем
34 385сообщений
← К списку тем

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

Newbies/FAQ Forum 16 сообщений -
#1

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

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

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

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) снимает регистрацию, то звонок к нему не идет, оператор спокойно может покинуть рабочее место, не меняя статус.

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

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

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

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

awsswa @ Вт Сен 11, 2012 17:31 писал(а):
не, надо при определенном колличестве неотвеченных выкидывать из очереди и ставить статус

Так неотвеченных не будет, при снятой регистрации
#6

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

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

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

Как использовать 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()

Я хочу понять, как фиксировать снятие регистрации оператором, в тот момент когда оператор уже добавил себя в очередь
#10

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

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

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

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

rrv @ Чт Сен 13, 2012 20:00 писал(а):
То ли я вас не пойму, то ли вы меня, для меня критически важно, чтобы при снятии регистрации с софтфона это фиксировалось в БД. Может переменная есть показывающая наличие/отсутствие регистрации пира на сервере? Тогда можно было бы обрабатывать по условию.
Честно говоря, не могу понять, как queue_log может мне в этом помощь?


Теперь понял. Негодяи остаются в очереди, но при этом отключают софтфоны? В данном случае, думаю, можно использовать локальные каналы и проверять ${DIALSTATUS}.
#15

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

Added after 1 hours 23 minutes:

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

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

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