Show Posts

This section allows you to view all posts made by this member. Note that you can only see posts made in areas you currently have access to.


Messages - qmax

Pages: 1 [2] 3 4
16
it would be nice if the translation manual had mapping between string codes and pages where to find this mesages.

17
Hi again.

And what is motivation of such design?

The usage pattern with static queues + dynamic members quite makes a sense,
when the work schedule of operators are not fixed.

P.S.
workaround is to create fake agent, adding him as static member of all created queues.

18
in queues.conf we do not configure any members - they are all added dynamically.
config wizard rejects loading such file, saying "no queues configured"

19
That's not a functionality lack,
But periodically reloading pages look not very user-friendly in the age of web-2.0
Browser moves page to top, while user may be looking at the bottom.
When an alarm is sounded, browser may popup annoying alarm window, if there's no builting wav player.
And obvious drawback is absence of real-time notifications for real-time pages like agent live, online monitor, wallboard, and for "realtime live".

Turning all these in real live will significantly improve QM usability.

P.S.
There exist several comet-solutions, for such style of notifications.

20
AFAIK,
queue has to be registered in asterisk only if
agents use CallbackLogin, as trigered by buttons on agent live page.
this command - CallBackLogin is depricated in asterisk-1.4 and removed in asteris-1.6

21
We'd like to integrate QM with another system we use (CATI).

Basically, we need:
- provide some data, known to QM (but not to asterisk) to that system:
- access and display some call details, known to that system
(or, maybe - stored in cdr.userfield[1-9])

Are there some ways to achieve this ?


22
Here is dialplan we developed for our call-center.
I'm not sure it works perfectly in all cases, but for last months it showed no problems.
I'm publishing it here in hope that it may appear useful for someone else,
and may be improved by community.

Features are:
  • agents do register on the line using special dial-code
  • all outbound calls from registered line assigned to that agent and queue
  • calls w/out agent registration are prohibited
  • agents are marked on pause between calls
  • agents do release line using another dial-code
  • dialplan handles bogus registration/deregistration
  • registration data stored in astdb and thus stay persistent
  • there's one easter egg inside

This example uses:
  • code 08*agentnum*queuenum - for registering line, agentnum is exact 3 digits. im not sure if pattern with "*.*." will work
  • code 09 - for releasing line
  • code 22 - as pause code between calls
  • Dial(Local/...@outbound-allroutes) for making external calls. the context outbound-allroutes is taken from dialplan generated by FreePBX outbound calls routing. it simply selects appropriate trunk for call.
  • playing "agent-music" while dialing
  • various custom speech files from directory callcenter/ for audial status and actions confirmation
  • recording all calls into /var/spool/asterisk/monitor/q${QUEUEID}-${UNIQUEID}.wav
All this stuff could and probably should be adjusted.

Code: [Select]
[callcenter]
; NB: adjust terminal devices to do not handle '*'-containg codes
exten => _08*XXX*.,1,Answer
exten => _08*XXX*.,n,Macro(register-outque,${CALLERID(num)},${EXTEN:3:3},${EXTEN:7})
exten => _08*XXX*.,n,Hangup

exten => _09,1,Answer
exten => _09,n,Macro(unregister-outque,${CALLERID(num)})
exten => _09,n,Hangup

exten => _NXXXXX.,1,Answer
exten => _NXXXXX.,n,GotoIf($[${DB_EXISTS(outques/${CALLERID(num)}/agent)}]?:notregistered)
exten => _NXXXXX.,n,Macro(outbound-queue-call,${CALLERID(num)},${EXTEN})
exten => _NXXXXX.,n,Hangup
exten => _NXXXXX.,n(notregistered),Playback(callcenter/agent-registration-required)
exten => _NXXXXX.,n,Hangup

; telling the line number
exten => *65,1,Answer()
exten => *65,n,Playback(callcenter/nomer-linii)
exten => *65,n,SayDigits(${CALLERID(num)})
exten => *65,n,Hangup()

; telling the line agent and queue
exten => *64,1,Answer()
exten => *64,n,GotoIf($[${DB_EXISTS(outques/${CALLERID(num)}/agent)}]?:notregistered)
exten => *64,n,Set(AGENTID=${DB(outques/${CALLERID(num)}/agent)})
exten => *64,n,Set(QUEUEID=${DB(outques/agent${AGENTID}/queue)})
exten => *64,n,Playback(callcenter/line-registered-&callcenter/for-agent-)
exten => *64,n,SayDigits(${AGENTID})
exten => *64,n,Playback(callcenter/in-queue-)
exten => *64,n,SayDigits(${QUEUEID})
exten => *64,n,Hangup
exten => *64,n(notregistered),Playback(callcenter/line-is-not registered)
exten => *64,n,Hangup

[macro-register-outque]
exten => s,1,NoOp(CC: registering line ${ARG1} for agent ${ARG2} in queue ${ARG3})
exten => s,n,MacroIf($[${DB_EXISTS(outques/${ARG1}/agent)}]?unregister-outque,${ARG1})
exten => s,n,MacroIf($[${DB_EXISTS(outques/agent${ARG2}/line)}]?unregister-outque,${DB(outques/agent${ARG2}/line)})
exten => s,n,Set(LINE=${ARG1})
exten => s,n,Set(AGENTID=${ARG2})
exten => s,n,Set(QUEUEID=${ARG3})
exten => s,n,Set(DB(outques/${LINE}/agent)=${AGENTID})
exten => s,n,Set(DB(outques/agent${AGENTID}/queue)=${QUEUEID})
exten => s,n,Set(DB(outques/agent${AGENTID}/line)=${CALLERID(num)})
exten => s,n,QueueLog(${QUEUEID},${UNIQUEID},Agent/${AGENTID},ADDMEMBER)
exten => s,n,QueueLog(NONE,NONE,Agent/${AGENTID},PAUSEALL)
exten => s,n,QueueLog(NONE,${UNIQUEID},Agent/${AGENTID},PAUSEREASON,22)
exten => s,n,Playback(callcenter/line-registered-&callcenter/for-agent-)
exten => s,n,SayDigits(${AGENTID})
exten => s,n,Playback(callcenter/in-queue-)
exten => s,n,SayDigits(${QUEUEID})

[macro-unregister-outque]
exten => s,1,NoOp(CC: releasing line ${ARG1})
exten => s,n,Set(LINEID=${ARG1})
exten => s,n,Set(AGENTID=${DB(outques/${LINEID}/agent)})
exten => s,n,GotoIf($["${AGENTID}"=""]?skip)
exten => s,n,Set(QUEUEID=${DB(outques/agent${AGENTID}/queue)})
exten => s,n,DbDel(outques/${LINEID}/agent)
exten => s,n,DbDel(outques/agent${AGENTID}/line)
exten => s,n,DbDel(outques/agent${AGENTID}/queue)
exten => s,n,QueueLog(${QUEUEID},${UNIQUEID},Agent/${AGENTID},REMOVEMEMBER)
exten => s,n,Playback(callcenter/line-released)
exten => s,n,MacroExit()
exten => s,n(skip),Playback(callcenter/line-was-not-registered)
exten => s,n,MacroExit()

[macro-outbound-queue-call]
exten => s,1,NoOp(CC: outbound call from ${ARG1} to ${ARG2})
exten => s,n,Set(CALLER=${ARG1})
exten => s,n,Set(DIALNUM=${ARG2})
exten => s,n,Set(AGENTID=${DB(outques/${CALLER}/agent)})
exten => s,n,Set(QUEUEID=${DB(outques/agent${AGENTID}/queue)})
exten => s,n,QueueLog(NONE,NONE,Agent/${AGENTID},UNPAUSEALL)
exten => s,n,QueueLog(${QUEUEID},${UNIQUEID},Agent/${AGENTID},CALLOUTBOUND,-,${DIALNUM})
exten => s,n,Dial(Local/${DIALNUM}@outbound-allroutes,30,m(agent-music)M(outbound-answer^${CALLER}^${UNIQUEID}^${QUEUEID}^${AGENTID}^${EPOCH})g)
exten => s,n,NoOp(CC: outbound call from ${CALLER} to ${DIALNUM} canceled: ${DIALSTATUS})
exten => s,n,QueueLog(NONE,NONE,Agent/${AGENTID},PAUSEALL)
exten => s,n,QueueLog(NONE,${UNIQUEID},Agent/${AGENTID},PAUSEREASON,22)
exten => s,n,GotoIf($["${DIALSTATUS}" == "ANSWER"]?answered)
exten => s,n(failed),QueueLog(${QUEUEID},${UNIQUEID},Agent/${AGENTID},ABANDON,1,1,${DIALEDTIME})
exten => s,n,Playback(callcenter/${DIALSTATUS})
exten => s,n,MacroExit()
exten => s,n(answered),QueueLog(${QUEUEID},${UNIQUEID},Agent/${AGENTID},COMPLETEAGENT,$[${DIALEDTIME} - ${ANSWEREDTIME}],${ANSWEREDTIME})
exten => s,n,Playback(callcenter/CANCEL)
exten => s,n,Wait(3)
exten => s,n,Playback(callcenter/how-vexing-excl)
exten => s,n,MacroExit()

exten => h,1,NoOp(CC: outbound call from ${CALLER} to ${DIALNUM} completed: ${DIALSTATUS})
exten => h,n,QueueLog(NONE,NONE,Agent/${AGENTID},PAUSEALL)
exten => h,n,QueueLog(NONE,${UNIQUEID},Agent/${AGENTID},PAUSEREASON,22)
exten => h,n,GotoIf($["${DIALSTATUS}" == "ANSWER"]?answered)
; CHANUNAVAIL | CONGESTION | NOANSWER | BUSY | CANCEL
exten => h,n(failed),QueueLog(${QUEUEID},${UNIQUEID},Agent/${AGENTID},ABANDON,1,1,${DIALEDTIME})
exten => h,n,MacroExit()
; ANSWERED
exten => h,n(answered),QueueLog(${QUEUEID},${UNIQUEID},Agent/${AGENTID},COMPLETECALLER,$[${DIALEDTIME} - ${ANSWEREDTIME}],${ANSWEREDTIME})
exten => h,n,MacroExit()

[macro-outbound-answer]
exten => s,1,NoOp(CC: connection in outbound queue: caller:${ARG1} uid:${ARG2} queue:${ARG3} agent:${ARG4} time:${ARG5})
exten => s,n,MixMonitor(/var/spool/asterisk/monitor/q${ARG3}-${ARG2}.wav)
exten => s,n,QueueLog(${ARG3},${ARG2},Agent/${ARG4},CONNECT,$[${EPOCH} - ${ARG5}])

23
I'd again request module LocalFilesByNamePattern

just like ByDay, with pattern matching filename as well, and extended to contain literal letters and some %ID
this could be MUCH faster, since no search needed at all.

24
i've tried both configurations,
with monitor/%QU and monitor/%YY/%QU
find example is only from first.
each time i restarted whole tomcat.

no effect.

is it possible to turn on some verbose logging to get more details from LocalFilesByDay ?

25
as in documentation, i've set
audio.server=it.loway.app.queuemetrics.callListen.listeners.LocalFilesByDay

i've tried to separate monitor files into:
/var/spool/asterisk/queue/
or
/var/spool/asterisk/year/queue/

set this up with:
default.monitored_calls=/var/spool/asterisk/%QU/
or
default.monitored_calls=/var/spool/asterisk/%YY/%QU/

retrieving call datails still cannot find record

$Id: LocalFilesByDay.java,v 1.2 2009/02/16 11:40:28 lenz-mobile Exp $ is searching.... found 0 files
[D965F3B96481F3C48E4F5597A4819650] Tempo totale esecuzione verbo 'qm_popup_call': 30 ms
[D965F3B96481F3C48E4F5597A4819650] Tempo totale esecuzione verbo 'qm_qa_popup': 40 ms

files could be found using command line utility:
astra:~ # find /var/spool/asterisk/monitor/ -name '*1247813990.28938*'
/var/spool/asterisk/monitor/2009/6/q6-1247813990.28938.wav

what's wrong here?

26
ok.
i've set up it this way:
audio.server=it.loway.app.queuemetrics.callListen.listeners.LocalFilesByDay
default.monitored_calls=/var/spool/asterisk/%QU/
and restarted queuemetrics

now i have:
astra:/var/spool/asterisk/monitor # find -name '*1247745633.22860*'
./6/q6-1247745633.22860.wav

but details popup only shows Call ID, but not link to file.

what's wrong here ?

27
Running QueueMetrics / Re: loading agents.conf in utf8
« on: July 15, 2009, 11:43:01 »
i posted new bugreport with more details and more issues

28
Running QueueMetrics / Re: [major bug] unicode issues
« on: July 15, 2009, 11:38:44 »
Some details:

in the list of loaded agents to select for inmorting,
each byte of original utf8 string is displayed as U+FFDD "replacement char"

when comments are placed in QA form,
every byte of string is saved as U+00xx, where xx is value of that byte.
e.g. character U+0410 in utf presended as bytes D0 90 and thansaved as U+00D0 U+0090

P.S.
headers and questions in QA forms are all saved and displayed properly.

29
Running QueueMetrics / [major bug] unicode issues
« on: July 15, 2009, 11:03:06 »
Installation:

mysql server is configured to use utf8 by all defaults:
character-set-client-handshake    TRUE
character-set-filesystem          binary
character-set-server              utf8
default-character-set             utf8

all database tables were created or converted to:
CREATE TABLE ... ( ... ) DEFAULT CHARSET=utf8

mysql jdbcdriver is set up like following:
jdbc:mysql://localhost/queuemetrics?...&useUnicode=true&characterEncoding=utf8&characterSetResults=utf8


file agents.conf are like following:
agent=>001,,"Василий Пупкин
(here is utf-8 string after quote)

Content-Type of all pages is: text/html; charset=UTF-8

User selected Language is "Russian"

Issues:

1. Setup Wizard
when loading agents from file agents.conf, after specifying filenames,
after page "The specified sources have been succesfully read."
on stage "Source > Agents" it displays unicode strings incorrectly.
(a string of invalid chars 2 times longer then initial)

if to proceed further, on last stage it produces error:
Quote
Fail: Problema update DB: java.sql.SQLException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'INVALID CHARS' at line 1
the "INVALID CHARS" is string invalid chars (4 times longer then initial string.)

when agent name is put into database tables directly, using mysql-tools, then quemetrics displays it correctly everywhere.

2. Track QA
when track QA window is opened, and there comment put, it saves in database incorrectly,
and then redisplayed in the wrong way.

when comment is put into database tables directly, using mysql-tools, then quemetrics displays it correctly

3. Exporting
Exporting just any table into XLS or CSV replaces all unicode characters into "?"
Only XML export works.

30
Running QueueMetrics / Re: loading agents.conf in utf8
« on: July 14, 2009, 09:19:30 »
database is already converted to utf and all mysql parameters set to utf (i missed resultsEncoding though)

misencoding appears when loading agents from file, before they placed in database, at stage
Source > Agents
this page yet displays names in wrong encoding

Pages: 1 [2] 3 4