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 - renereed1

Pages: [1]
1
Improving QueueMetrics / Re: Dynamic agents
« on: September 22, 2009, 22:47:38 »

So is it possible to restrict agents from being able to dynamically login / out of queues? In my current configuration, agents can dynamically login / out of queues, but the problem is they can login / out of any queue defined in the system. I need to be able to restrict them.

As far as the second issues, you guys are currently working on this. That is wonderful news. I'll revert back to asterisk 1.4 for now, and once its ready, i'll upgrade back to 1.6.


Thanks ;-)

2
Improving QueueMetrics / Dynamic agents
« on: September 21, 2009, 21:26:43 »
While using Dynamic agent for login / logout, I would like to be able to control what queues agents have access to dynamically log in / out. This is important, because I have a sales queue, and support queue and I don't want my support group logging into the sales queue. With in the support group, there are a few queues which they should have access to. However, the support group do not work in all of the support queues everyday. So I would still need them to be able to dynamically log in and out of all support queue but restricted from queues outside of their department.


Also, dynamic agents login code is fixed to a phone exten. It would be nice if we could have dynamic login / out and also be able to move agents around to different phones.

3
Issues resolved. Agents are now able to login / out via the agent page.

Queuemetrics 1.5.3, and asterisk 1.6

In the extensions_queuemetrics.conf file, the lines

exten => 25,3,AddQueueMember(${QUEUENAME}|Local/${AGENTCODE}@from-internal)
exten => 27,3,RemoveQueueMember(${QUEUENAME}|Local/${AGENTCODE}@from-internal)


should be changed to

exten => 25,3,AddQueueMember(${QUEUENAME},Local/${AGENTCODE}@from-internal)
exten => 27,3,RemoveQueueMember(${QUEUENAME},Local/${AGENTCODE}@from-internal)



Its a difference between how asterisk 1.4 and asterisk 1.6 works. The '|' should be changed to ','.

4

Also, when logging in and out from the agent page, the queue_log file is not updated. If i login, out from the phones then I can see it in the queue_log.


queue_log

1245706108|NONE|NONE|NONE|CONFIGRELOAD|
1245706342|NONE|NONE|NONE|CONFIGRELOAD|
1245707035|NONE|NONE|NONE|CONFIGRELOAD|
1245708488|NONE|NONE|NONE|CONFIGRELOAD|
1245710234|NONE|NONE|NONE|CONFIGRELOAD|
1245710943|NONE|NONE|NONE|CONFIGRELOAD|
1245767743|NONE|NONE|NONE|CONFIGRELOAD|
1245768696|1245768688.45|300|Local/102@from-internal/n|ADDMEMBER|
1245769743|1245769736.62|300|Local/102@from-internal/n|REMOVEMEMBER|

5
Also, here is my configuration.properties. I changed the passwd here, but they are correct in the config. Please let me know if other info is needed.   Thanks in advance.





[root@pbx1 ~]# cat /usr/local/queuemetrics/webapps/queuemetrics-1.5.3/WEB-INF/configuration.properties
# This is the internal id (ex. 7, 49....) of the preselected default queue, leave blank for no default queue.
default.queue=1

# This is the default queue log file.
#default.queue_log_file=/var/log/asterisk/queue_log
default.queue_log_file=sql:P001

#This key is used only as a placeholder for CVS versioning information
00_version=$Id: configuration.properties,v 1.45 2009/04/24 10:46:59 lenz-mobile Exp $

#When the realtime page for an agent is computed, the queue_log is NOT read in its entirety but only the last 'n' bytes.
realtime.max_bytes_agent=65000

#When set to true, the live agent page will open a window each time the URL associated to the first row
#of calls detail table will changes.
realtime.agent_autoopenurl=true

#Here are defined four buttons to be shown in the realtime agent page.
realtime.agent_button_1.enabled=true
realtime.agent_button_1.caption=Call Details
realtime.agent_button_1.url=http://mysite1.com/action/[A]/

realtime.agent_button_2.enabled=true
realtime.agent_button_2.caption=Signal Problem
realtime.agent_button_2.url=http://mysite2.com/action/[A]/

realtime.agent_button_3.enabled=false
realtime.agent_button_3.caption=Unused
realtime.agent_button_3.url=http://mysite3.com/action/[A]/

realtime.agent_button_4.enabled=true
realtime.agent_button_4.caption=Secretary
realtime.agent_button_4.url=
realtime.agent_button_4.channel=Local/104@from-internal
realtime.agent_button_4.ext=200@ext-queue

#Show AGAW information on the realtime agent page
realtime.agent.show_agaw=true

#The top level directory where monitored calls are held.
#Do NOT forget to add the ending slash.
default.monitored_calls=/var/spool/asterisk/

#How many digits to consider as a default area code
default.areacode_digits=3

default.start_hour=8

default.end_hour=18

default.days=7

#if liveclock is enabled, the system clock is synchronized with asterisk server system clock.
liveclock.enable=true

#Show summary report call time in hhmmss format instead of hours
default.showSecondsOnTotalCalls=false

#The max delay that will be shown in the TOS graph
sla.max_monitored_delay=120

#How big are time intervals for the TOS graph
sla.interval=10

#Your company logo (full or relative path) - shall be resized to be an image 200 x 72
layout.logo=$WEBAPP/img/sm_your_logo.gif

#HTML string displayed on the login page.
layout.splash=Please ask your system administrator for the correct credentials to access this instance of QueueMetrics.

# Preset 1: standard DB access. Edit to suit your DB needs.
sqlPreset.1.table=queue_log
sqlPreset.1.f_time_id=time_id
sqlPreset.1.f_call_id=call_id
sqlPreset.1.f_queue=queue
sqlPreset.1.f_agent=agent
sqlPreset.1.f_verb=verb
sqlPreset.1.f_partition=partition
sqlPreset.1.f_data1=data1
sqlPreset.1.f_data2=data2
sqlPreset.1.f_data3=data3
sqlPreset.1.f_data4=data4
sqlPreset.1.f_incr=unique_row_count

sqlPreset.2.table=queue_log
sqlPreset.2.f_time_id=time_id
sqlPreset.2.f_call_id=call_id
sqlPreset.2.f_queue=queue
sqlPreset.2.f_agent=agent
sqlPreset.2.f_verb=verb
sqlPreset.2.f_partition=
sqlPreset.2.f_data1=data1
sqlPreset.2.f_data2=data2
sqlPreset.2.f_data3=data3
sqlPreset.2.f_data4=data4
sqlPreset.2.f_incr=unique_row_count

#Is the calls panel in the realtime page invisible by default?
realtime.calls_invisible=false

#Is the agents panel in the realtime page invisible by default?
realtime.agents_invisible=false

#Are not  the only agents to be shown on the realtime page those who are "known" for the queue?
realtime.members_only=true

#Add the following key to enable default showing of all subqueues (default: false)
realtime.all_subqueues=false

#In how many seconds is the realtime page to refresh?
realtime.refresh_time=18

# Do we consider callback agents permanent until logoff (default as Asterisk 1.2), or do they get disconnected at restart?
default.permanentCallBackAgents=true

# Do we take into consideration sessions and calls that are not complet eyet for the main analysis?
default.considerIncompletetEntities=true

#callFile spool dir, set to blank for no call files at all.
#callfile.dir=/var/spool/asterisk/outgoing
callfile.dir=tcp:admin:xxxx@127.0.0.1

callfile.monitoring.enabled=true
callfile.monitoring.channel=Local/$EM@from-internal/n
callfile.monitoring.extension=11
callfile.monitoring.context=queuemetrics

callfile.outmonitoring.enabled=true
callfile.outmonitoring.channel=Local/$EM@from-internal/n
callfile.outmonitoring.extension=14
callfile.outmonitoring.context=queuemetrics

callfile.calloutcome.enabled=true
callfile.calloutcome.channel=Local/12@queuemetrics/n
callfile.calloutcome.extension=10
callfile.calloutcome.context=queuemetrics

callfile.agentlogin.enabled=false
callfile.agentlogin.channel=Local/20@queuemetrics/n
callfile.agentlogin.extension=10
callfile.agentlogin.context=queuemetrics

callfile.agentlogoff.enabled=false
callfile.agentlogoff.channel=Local/21@queuemetrics/n
callfile.agentlogoff.extension=10
callfile.agentlogoff.context=queuemetrics

callfile.agentpause.enabled=true
callfile.agentpause.channel=Local/22@queuemetrics/n
callfile.agentpause.extension=10
callfile.agentpause.context=queuemetrics

callfile.agentunpause.enabled=true
callfile.agentunpause.channel=Local/23@queuemetrics/n
callfile.agentunpause.extension=10
callfile.agentunpause.context=queuemetrics

callfile.agentaddmember.enabled=true
callfile.agentaddmember.channel=Local/25@queuemetrics/n
callfile.agentaddmember.extension=10
callfile.agentaddmember.context=queuemetrics

callfile.agentremovemember.enabled=true
callfile.agentremovemember.channel=Local/27@queuemetrics/n
callfile.agentremovemember.extension=10
callfile.agentremovemember.context=queuemetrics

callfile.customdial.enabled=true
callfile.customdial.channel=Local/$EM@from-internal/n
callfile.customdial.extension=28
callfile.customdial.context=queuemetrics


# Rewrites Local/XXX@ext channels in the format Agent/XXX
default.rewriteLocalChannels=true

# DO NOT CHANGE
realtime.use_sql_now=false

#The default time zone offset. Valid values -24...24 hours
default.timeZoneOffset=0

#If an ongoing call has a wait time that exceeds this value, drop it. 0: ignore
default.maxOngoingWaitTime=1000

#If an ongoing call has a talk time that exceeds this value, drop it. 0: ignore
default.maxOngoingTalkTime=2000

#Ignore QUEUESTART statements.
default.ignoreQueueStarts=false

#The hour of the day to start realtime monitoring or sXX: sliding window of XX hours
realtime.startHour=0

# The default locale for QueueMetrics. DO NOT CHANGE unless you know what you're doing.
default.language=en
default.country=US

#Disable the history back navigation button in browsers
default.disablebackhistory=true

# Which channel name to show for a call: True: last one seen - False: first one found
default.useEndingChannelName=false

# How to create Excel files: True: Excel 2003 XML - False: CSV
default.useXmlExcel=false

# Show the queue composition or just the main queue name
default.showQueueComposition=true


# how long is an hour for hourly breakdown; default 60 minutes
default.hourly_slot=15

# Asterisk Unique ID visibility and related callback URL associated to the icon
default.crmapp=http://server/app?agent=[A]&unique=
default.showAstClid=false

# Join multi-stint calls as a default
default.joinMultiStintCalls=false

# Decide whether to check for alarms on the wait time of ongoing conversations.
realtime.waitAlarmOnLiveCalls=true
sound.yellowAlarm=../img/sounds/dingdong.wav
sound.redAlarm=../img/sounds/ringer.wav

# Cluster to poll for RT data
# list of pipe-separated members of the cluster
# if callfilesdir = "", the commands will be sent through the manager API
cluster.servers=aleph|trix

cluster.aleph.manager=tcp:dial:12345@10.10.3.5
cluster.aleph.queuelog=sql:P001
cluster.aleph.monitored_calls=z:/qm_streamcall/server_aleph
cluster.aleph.callfilesdir=
cluster.aleph.audioRpcServer=
cluster.aleph.agentSecurityKey=

cluster.trix.manager=tcp:admin:xxxx@127.0.0.1
cluster.trix.queuelog=sql:P002
cluster.trix.monitored_calls=z:/qm_streamcall/server_trix
cluster.trix.callfilesdir=
cluster.trix.audioRpcServer=
cluster.trix.agentSecurityKey=

# If true, hide export buttons on the Realtime page
realtime.hideExportButtons=false

# If true, show all agent sessions. If false, show only agent sessions with at least one call.
default.useRawAgentSessions=false

# If true, the agent cannot change their code in the login/logoff/pause popups.
default.lockedAgentPopupCode=false

#If true, the user will not be able to monitor without a given location.
realtime.assignedLocationsOnly=false

# Shall we display absolute or relative agent logon times on the RT page? (def. true)
realtime.absolutePauseTimes=true

# Which buttons on the realtime page are enabled?
realtime.calls_invisible.buttonEnabled=true
realtime.agents_invisible.buttonEnabled=true
realtime.members_only.buttonEnabled=true
realtime.all_subqueues.buttonEnabled=true

# Create a text dump of the manager conversation for the Live page (#326)
manager.dump=false

# If a filter is on, no "lost" calls should be shown
default.showLostCallsWhenFiltering=false

# The default length of a manually-closed call
default.closeDuration=5

# This is the name of the class that finds recordings. See documentation.
audio.server=it.loway.app.queuemetrics.callListen.listeners.LocalFiles

# This is the name of the class that starts live listening. See documentation.
audio.liveserver=it.loway.app.queuemetrics.callListen.RTlisteners.ClassicQMListenerRT

# Is it possible to see Tech Info on the licence page and run DBTest?
default.viewTechInfo=true

# Oldest obsolete AGAW run to keep when running a database optimization, in minutes
dbmaint.agaw_oldestRun=30

# Oldest AGAW log to keep when running a database optimization, in minutes
dbmaint.agaw_oldestLog=30

# Oldest obsolete broadcast entry to keep when running a database optimization, in minutes
dbmaint.agaw_oldestBroadcast=180

# Defines some default values for the autoconfiguration tool
default.autoconf.source=file
default.autoconf.fileagents=/etc/asterisk/agents.conf
default.autoconf.filequeues=/etc/asterisk/queues.conf
default.autoconf.fileusers=/etc/asterisk/users.conf
default.autoconf.filequeuelog=/var/log/asterisk/queue_log
default.autoconf.realtimedrv=com.mysql.jdbc.Driver
default.autoconf.realtimeuri=jdbc:mysql://127.0.0.1/asteriskrealtime?zeroDateTimeBehavior=convertToNull&jdbcCompliantTruncation=false&user=admin&password=amp111

# If set to true, when an agent logs on, he will always be unpaused. Since v1.5.2
default.alwaysLogonUnpaused=false

6

I have

# Rewrites Local/XXX@ext channels in the format Agent/XXX
default.rewriteLocalChannels=true

in my configuration.properties file. I also noticed that in my agents file, I have the wrong agent id. I corrected it so my agents.conf file now reads

agents.conf
[general]
persistentagents=yes
[agents]
agent => 102,,Ricky Reed


I'm able to log in and out of the queue using the phone (300* and 300**) but when I do it from the agent page, from the asterisk cli it looks as if its working, but on the agent page it still says Agent/102: Agent status cannot be determined.

7
Hello,

I have a new installation of asterisk 1.6 and queuemetrics 1.5.3. I'm having issues with agents being able to login from the agent page. They can login them in and out via the asterisk CLI.

I will paste what I have here so far. Any assistance will be greatly appreciated. This setup is not in production.




This is what I  get when I try to login via the agent page

Connected to Asterisk 1.6.1.1 currently running on pbx1 (pid = 3966)
Verbosity is at least 7
  == Manager 'admin' logged on from 127.0.0.1
    -- Executing [25@queuemetrics:1] Answer("Local/25@queuemetrics-c259;2", "") in new stack
       > Channel Local/25@queuemetrics-c259;1 was answered.
    -- Executing [10@queuemetrics:1] Answer("Local/25@queuemetrics-c259;1", "") in new stack
    -- Executing [10@queuemetrics:2] Wait("Local/25@queuemetrics-c259;1", "10") in new stack
    -- Executing [25@queuemetrics:2] NoOp("Local/25@queuemetrics-c259;2", " "QM: AddQueueMember (asterisk v1.4+) Agent/102 on queue 300 made by 'Agent/102'" ") in new stack
    -- Executing [25@queuemetrics:3] AddQueueMember("Local/25@queuemetrics-c259;2", "300|Local/102@from-internal") in new stack
    -- Executing [25@queuemetrics:4] System("Local/25@queuemetrics-c259;2", " echo "1245709761|$(UNIQUEID}|300|Local/102@from-internal|ADDMEMBER|" >> /var/log/asterisk/queue_log ") in new stack
    -- Executing [25@queuemetrics:5] Hangup("Local/25@queuemetrics-c259;2", "") in new stack
  == Spawn extension (queuemetrics, 25, 5) exited non-zero on 'Local/25@queuemetrics-c259;2'
  == Spawn extension (queuemetrics, 10, 2) exited non-zero on 'Local/25@queuemetrics-c259;1'
  == Manager 'admin' logged off from 127.0.0.1






it still says "Agent/102: Agent status cannot be determined "

 If I try from the command line, it works.




agents.conf

[general]
persistentagents=yes
[agents]
agent => 201,,Ricky Reed






extensions_queuemetrics.conf

[root@pbx1 queuemetrics-1.5.3]# cat /etc/asterisk/extensions_queuemetrics.conf

;
; ============================================================================
; The following dialplan context is used by QueueMetrics
; through the manager API.
; - $Id: extensions_queuemetrics.conf,v 1.9 2009/04/09 10:18:39 marcos Exp $
;
; You should modify it to fit your system.
;
; To enable this file, copy it to /etc/asterisk
; and add the line:
;   #include extensions_queuemetrics.conf
; by the end of your extensions.conf file.
; ============================================================================
;

[queuemetrics]
; extension 0 is a dummy end point
exten => 10,1,Answer
exten => 10,2,Wait(10)
exten => 10,3,Hangup

; extension 11 makes remote monitoring possible
exten => 11,1,Answer
exten => 11,2,NoOp( "QM_AGENT_CODE: ${QM_AGENT_CODE}" )
exten => 11,3,NoOp( "QM_EXT_MONITOR: ${QM_EXT_MONITOR}" )
exten => 11,4,NoOp( "QM_AGENT_EXT: ${QM_AGENT_EXT}" )
exten => 11,5,NoOp( "QM_LOGIN: ${QM_LOGIN}" )
exten => 11,6,ChanSpy(${QM_AGENT_CODE})
exten => 11,7,Hangup

; extension 12: set call status code
exten => 12,1,Answer
exten => 12,2,NoOp( "QM: Setting call status '${CALLSTATUS}' on call '${CALLID}' for agent '${AGENTCODE}' made by '${QM_LOGIN}'" )
exten => 12,3,System( echo "${EPOCH}|${CALLID}|NONE|Agent/${AGENTCODE}|CALLSTATUS|${CALLSTATUS}" >> /var/log/asterisk/queue_log )
exten => 12,4,Hangup

; extension 14 makes remote monitoring possible for OUTBOUND CALLS
exten => 14,1,Answer
exten => 14,2,NoOp( "QM_AGENT_CODE: ${QM_AGENT_CODE}" )
exten => 14,3,NoOp( "QM_EXT_MONITOR: ${QM_EXT_MONITOR}" )
exten => 14,4,NoOp( "QM_AGENT_EXT: ${QM_AGENT_EXT}" )
exten => 14,5,NoOp( "QM_LOGIN: ${QM_LOGIN}" )
exten => 14,6,ChanSpy(Local/${QM_AGENT_CODE:6}@from-internal)
exten => 14,7,Hangup

; extension 20: agent callback login
;               For this to work, there must be no password on the agent.
exten => 20,1,Answer
exten => 20,2,NoOp( "QM: Logging on Agent/${AGENTCODE} to extension ${AGENT_EXT}@from-internal made by '${QM_LOGIN}'" )
exten => 20,3,AgentCallBackLogin(${AGENTCODE}||${AGENT_EXT}@from-internal)
exten => 20,4,Hangup

; extension 21: agent callback logoff
exten => 21,1,Answer
exten => 21,2,NoOp( "QM: Logging off Agent/${AGENTCODE} made by '${QM_LOGIN}'" )
exten => 21,3,System(asterisk -rx "agent logoff Agent/${AGENTCODE}")
exten => 21,4,Hangup

; extension 22: agent pause (with pause code)
exten => 22,1,Answer
exten => 22,2,NoOp( "QM: Pausing Agent/${AGENTCODE} with pause reason '${PAUSEREASON}' made by '${QM_LOGIN}' " )
exten => 22,3,PauseQueueMember(|Agent/${AGENTCODE})
exten => 22,4,System( echo "${EPOCH}|${UNIQUEID}|NONE|Agent/${AGENTCODE}|PAUSEREASON|${PAUSEREASON}" >> /var/log/asterisk/queue_log )
exten => 22,5,Hangup

; extension 23: agent unpause
exten => 23,1,Answer
exten => 23,2,NoOp( "QM: Unpausing Agent/${AGENTCODE} made by '${QM_LOGIN}' " )
exten => 23,3,UnpauseQueueMember(|Agent/${AGENTCODE})
exten => 23,4,Hangup

; extension 24: agent addqueuemember (for asterisk v1.2)
exten => 24,1,Answer
exten => 24,2,NoOp( "QM: AddQueueMember (asterisk v1.2) Agent/${AGENTCODE} on queue ${QUEUENAME} made by '${QM_LOGIN}'" )
exten => 24,3,System( echo "${EPOCH}|${UNIQUEID}|${QUEUENAME}|Local/${AGENTCODE}@from-internal|ADDMEMBER|" >> /var/log/asterisk/queue_log )
exten => 24,4,Hangup

; extension 25: agent addqueuemember (for asterisk v1.4+)
exten => 25,1,Answer
exten => 25,2,NoOp( "QM: AddQueueMember (asterisk v1.4+) Agent/${AGENTCODE} on queue ${QUEUENAME} made by '${QM_LOGIN}'" )
exten => 25,3,AddQueueMember(${QUEUENAME}|Local/${AGENTCODE}@from-internal)
exten => 25,4,System( echo "${EPOCH}|$(UNIQUEID}|${QUEUENAME}|Local/${AGENTCODE}@from-internal|ADDMEMBER|" >> /var/log/asterisk/queue_log )
exten => 25,5,Hangup

; extension 26: agent removequeuemember
exten => 26,1,Answer
exten => 26,2,NoOp( "QM: RemoveQueueMember (asterisk v1.2) Agent/${AGENTCODE} on queue ${QUEUENAME} made by '${QM_LOGIN}'" )
exten => 26,3,System( echo "${EPOCH}|${UNIQUEID}|${QUEUENAME}|Local/${AGENTCODE}@from-internal|REMOVEMEMBER|" >> /var/log/asterisk/queue_log )
exten => 26,4,Hangup

; extension 27: agent removequeuemember (for asterisk v1.4+)
exten => 27,1,Answer
exten => 27,2,NoOp( "QM: RemoveQueueMember (asterisk v1.4+) Agent/${AGENTCODE} on queue ${QUEUENAME} made by '${QM_LOGIN}'" )
exten => 27,3,RemoveQueueMember(${QUEUENAME}|Local/${AGENTCODE}@from-internal)
exten => 27,4,Hangup

; extension 28: agent custom dial
exten => 28,1,Answer
exten => 28,2,NoOp( "QM: Agent Custom Dial. Dialing ${EXTTODIAL} on queue ${OUTQUEUE}  made by '${QM_LOGIN}'" )
exten => 28,3,Set(QDIALER_QUEUE=${OUTQUEUE})
exten => 28,4,Set(QDIALER_NUMBER=${EXTTODIAL})
exten => 28,5,Set(QDIALER_AGENT=Agent/${AGENTCODE})
exten => 28,6,Set(QDIALER_CHANNEL=SIP/${QDIALER_NUMBER})
exten => 28,7,Set(QueueName=${QDIALER_QUEUE})
exten => 28,8,MixMonitor(Q-${QDIALER_QUEUE}-${UNIQUEID}.WAV|b|)
exten => 28,9,Goto(qm-queuedial,s,1)
exten => 28,10,Hangup

;
; ================================================================
; The following dialplan is used in order to make oubound calls
; that are tracked through QueueMetrics.
; See http://forum.queuemetrics.com/index.php?board=12.0
; ================================================================


[queuedial]
; this piece of dialplan is just a calling hook into the [qm-queuedial] context that actually does the
; outbound dialing - replace as needed - just fill in the same variables.
exten => _XXX.,1,Set(QDIALER_QUEUE=q-${EXTEN:0:3})
exten => _XXX.,n,Set(QDIALER_NUMBER=${EXTEN:3})
exten => _XXX.,n,Set(QDIALER_AGENT=Agent/${CALLERID(num)})
exten => _XXX.,n,Set(QDIALER_CHANNEL=SIP/${QDIALER_NUMBER})
exten => _XXX.,n,Set(QueueName=${QDIALER_QUEUE})
exten => _XXX.,n,MixMonitor(Q-${QDIALER_QUEUE}-${UNIQUEID}.WAV|b|)
exten => _XXX.,n,Goto(qm-queuedial,s,1)


[queuedial-loggedon]
; This piece of dialplan will let only logged on agents dial out
exten => _XXX.,1,Set(QDIALER_QUEUE=q-${EXTEN:0:3})
exten => _XXX.,n,Set(QDIALER_NUMBER=${EXTEN:3})
exten => _XXX.,n,Set(QDIALER_AGENT=Agent/${AGENTBYCALLERID_${CALLERID(num)}})
exten => _XXX.,n,Set(QDIALER_CHANNEL=SIP/${QDIALER_NUMBER})
exten => _XXX.,n,Set(QueueName=${QDIALER_QUEUE})
exten => _XXX.,n,MixMonitor(Q-${QDIALER_QUEUE}-${UNIQUEID}.WAV|b|)
exten => _XXX.,n,GotoIf($[${LEN(${QDIALER_AGENT})} > 6]?qm-queuedial,s,1)
exten => _XXX.,n,NoOp,Extension ${CALLERID(num)} is not logged on as agent.
exten => _XXX.,n,Playback(agent-loggedoff)
exten => _XXX.,n,Congestion


[qm-queuedial]
; We use a global variable to pass values back from the answer-detect macro.
; STATUS = U unanswered
;        = A answered    (plus CAUSECOMPLETE=C when callee hung up)
; The 'g' dial parameter must be used in order to track callee disconnecting.
; Note that we'll be using the 'h' hook in any case to do the logging when channels go down.
; We set the CDR(accountcode) for live monitoring by QM.
;
exten => s,1,NoOp,Outbound call -> A:${QDIALER_AGENT} N:${QDIALER_NUMBER} Q:${QDIALER_QUEUE} Ch:${QDIALER_CHANNEL}
exten => s,n,Set(CDR(accountcode)=QDIALAGI)
exten => s,n,Set(ST=${EPOCH})
exten => s,n,Set(GM=QDV-${QDIALER_AGENT})
exten => s,n,Set(GLOBAL(${GM})=U)
exten => s,n,Set(GLOBAL(${GM}ans)=0)
exten => s,n,Macro(queuelog,${ST},${UNIQUEID},${QDIALER_QUEUE},${QDIALER_AGENT},CALLOUTBOUND,-,${QDIALER_NUMBER})
exten => s,n,Dial(${QDIALER_CHANNEL},30,gM(queuedial-answer^${UNIQUEID}^${GM}^${QDIALER_QUEUE}^${QDIALER_AGENT}^${ST}))
exten => s,n,Set(CAUSECOMPLETE=${IF($["${DIALSTATUS}" = "ANSWER"]?C)})

; Trapping call termination here
exten => h,1,NoOp( "Call exiting: status ${GLOBAL(${GM})} answered at: ${GLOBAL(${GM}ans)} DS: ${DIALSTATUS}"  )
exten => h,n,Goto(case-${GLOBAL(${GM})})
exten => h,n,Hangup()

; Call unanswered
exten => h,n(case-U),Set(WT=$[${EPOCH} - ${ST}])
exten => h,n,Macro(queuelog,${EPOCH},${UNIQUEID},${QDIALER_QUEUE},${QDIALER_AGENT},ABANDON,1,1,${WT})
exten => h,n,Hangup()

; call answered: agent/callee hung
exten => h,n(case-A)i,Set(COMPLETE=${IF($["${CAUSECOMPLETE}" = "C"]?COMPLETECALLER:COMPLETEAGENT)})
exten => h,n,Set(WT=$[${GLOBAL(${GM}ans)} - ${ST}])
exten => h,n,Set(CT=$[${EPOCH} - ${GLOBAL(${GM}ans)}])
exten => h,n,Macro(queuelog,${EPOCH},${UNIQUEID},${QDIALER_QUEUE},${QDIALER_AGENT},${COMPLETE},${WT},${CT})
exten => h,n,Hangup()


[macro-queuedial-answer]
; Expecting $ARG1: uniqueid of the caller channel
;           $ARG2: global variable to store the answer results
;           $ARG3: queue name
;           $ARG4: agent name
;           $ARG5: enterqueue
;
exten => s,1,NoOp("Macro: queuedial-answer UID:${ARG1} GR:${ARG2} Q:${ARG3} A:${ARG4} E:${ARG5}")
exten => s,n,Set(NOW=${EPOCH})
exten => s,n,Set(WD=$[${NOW} - ${ARG5}])
exten => s,n,Macro(queuelog,${NOW},${ARG1},${ARG3},${ARG4},CONNECT,${WD})
exten => s,n,Set(GLOBAL(${ARG2})=A)
exten => s,n,Set(GLOBAL(${ARG2}ans)=${NOW})
exten => s,n,NoOp("Macro queuedial-answer terminating" )

[macro-queuelog]
; The advantage of using this macro is that you can choose whether to use the Shell version
; (where you have complete control of what gets written) or the Application version (where you
; do not need a shellout, so it's way faster).
;
; Expecting  $ARG1: Timestamp
;            $ARG2: Call-id
;            $ARG3: Queue
;            $ARG4: Agent
;            $ARG5: Verb
;            $ARG6: Param1
;            $ARG7: Param2
;            $ARG8: Param3
;
;exten => s,1,System( echo "${ARG1}|${ARG2}|${ARG3|${ARG4}|${ARG5}|${ARG6}|${ARG7}|${ARG8}" >> /var/log/asterisk/queue_log )
exten => s,1,QueueLog(${ARG3},${ARG2},${ARG4},${ARG5},${ARG6}|${ARG7}|${ARG8})



; --------------------------------------------------------------------
; $Log: extensions_queuemetrics.conf,v $
; Revision 1.9  2009/04/09 10:18:39  marcos
; Added the extension 14 for monitoring outbound calls
;
; Revision 1.8  2009/03/06 11:10:17  marcos
; #620: Custom dial on agent's live page
;
; Revision 1.7  2009/02/16 10:37:47  marcos
; #619: Add AddQueueMember and RemoveQueueMember triggering buttons on agent's live page.
;
; Revision 1.6  2009/02/10 18:17:26  lenz
; Bug #498: CALLOUTBOUND
;
; Revision 1.5  2009/01/12 12:05:47  marcos
; #600 Added QM_LOGIN on all asterisk dialplan calls
;
; Revision 1.4  2008/06/10 16:53:50  lenz
; Aggiunto[queuedial-loggedon] per tutorial outbound 2.0
;
; Revision 1.3  2008/06/07 11:16:58  lenz
; Pure-scripting outbound solution.
;
; Revision 1.2  2007/07/30 15:43:55  lenz
; Bug #173: default compatibili con TrixBox.
;
; Revision 1.1  2007/06/18 13:30:24  lenz
; Prima versione.
;
;
;




extensions_custom.conf


#include extensions_queuemetrics.conf

[from-internal-custom]












Pages: [1]