Colas y Agentes.
Aunque a vote pronto parece que esto se guisa entre dos ficheros dentro de /etc/asterisk/ "agents.conf" y "queues.conf" (el fichero queuerules.conf ni lo toco es relativo a sistema de penalización entre colas.) Yo no he sido capaz de entender bien el como de agents.conf
parece sencillo, pero es mas bien para agentes estáticos, y usar agentes dinamicos y estaticos, como que no lo pillo.
De tal modo que dejo de lado el fichero "agents.conf" sin tocar, (o comentando todos los agentes default) y uso el "dialplan" junto con "queues.conf" para manejar "agentes dinámicos."
Los agentes dinámicos, no requieren gran cosa, usaremos estas aplicaciones:AddQueueMember(), PauseQueueMember(), UnpauseQueueMember() y RemoveQueueMember() en el extensions.conf, para que mediante el marcado se produzcan estos hechos.
Antes que nada tendremos que crear las colas, en mi caso para estas pruebas, crearemos dos colas, una de "Tecnicos" y otra de "Ventas"
Las opciones basicas [general] se parecen a estas. (en mi caso) Pero el fichero tiene un montón de opciones y posibilidades y merece la pena leerlo con atención.(Tiene mucha mucha tela)
[general]
persistentmembers = yes ; esta opción creara en la DDBB de asterisk (SQLite3) una linea por cola en la que se irán metiendo todos los agentes que se "logan" en las distintas colas. Apareciendo cosas como esta en "database show" /Queue/PersistentMembers/Tecnicos : SIP/403;0;0;SIP/403;SIP/403|SIP/402;0;0;SIP/402;SIP/402|SIP/401;0;0;SIP/401;SIP/401
autofill = no ;Esto es para que las llamadas en espera se asigen de golpe a los agentes o por orden, por defecto no, "pos fale".
monitor-type = MixMonitor ; esto a estas alturas.....
updatecdr = no ; esto hace que no se actualize el CDR, si decimos que yes, usara el parámetro "membername" para meter en la columna "dstchannel" y que tendremos que definir en AddQueueMember() Parece confuso pero no.
shared_lastcall=no ;Esto es para manejar el parámetro wrapuptime, en agentes que están en mas de 1 cola y dar mas tiempo o no al agente. En nuestro caso, no hay agentes en mas de una cola.
;mis colas
[Ventas]
musicclass = default ;la musica de estepera tipica
strategy = linear ; la estrategia esto tiene mucha miga, digo las estrategias, hay que probarlas para comprender como funcionan y si afectan o no a "timeout" y a "retry".
timeout = 10 ;este parametro dependera de la estratigia que tome efecto o no.
retry = 2 ;este parametro dependera de la estratigia que tome efecto o no.
timeoutpriority = conf ;Este va en consonancia con timeout, pero tambien con el que tengamos en Queue(), leer mas en el propio fichero.
wrapuptime=5 ;un tiempito para que el agente descanse entre llamadas, o tome apuntes o cumplimente alguna nota.
announce-frequency = 90 ;Todos estos son anuncios y son configurables, en cuanto a los contenidos y tiempos.
min-announce-frequency = 15
periodic-announce-frequency=60
random-periodic-announce=no
relative-periodic-announce=yes
announce-holdtime = once
announce-position = yes
announce-to-first-user = no
announce-position-limit = 5
announce-round-seconds = 10
[Tecnicos]
musicclass = default
;Tipos de estrategia
strategy = rrmemory
timeout = 10
retry = 1
timeoutpriority = app
wrapuptime=10
announce-frequency = 90
min-announce-frequency = 15
periodic-announce-frequency=60
random-periodic-announce=no
relative-periodic-announce=yes
announce-holdtime = once
announce-position = yes
announce-to-first-user = no
announce-position-limit = 5
announce-round-seconds = 10
Con esto ya podemos recargar el modulo y ver que tenemos las dos colas creadas.
ASX93*CLI> reload app_queue.so
Module 'app_queue.so' reloaded successfully.
-- Reloading module 'app_queue.so' (True Call Queueing)
[Feb 2 11:17:44] NOTICE[21621]: app_queue.c:8718 reload_queue_rules: queuerules.conf has not changed since it was last loaded. Not taking any action.
== Parsing '/etc/asterisk/queues.conf': Found
Y ya podremos mirar en la consola las colas.
ASX93*CLI> queue show
Tecnicos has 0 calls (max unlimited) in 'rrmemory' strategy (0s holdtime, 0s talktime), W:0, C:0, A:1, SL:0.0% within 0s
No Members
No Callers
Ventas has 0 calls (max unlimited) in 'linear' strategy (0s holdtime, 0s talktime), W:0, C:0, A:5, SL:0.0% within 0s
No Members
No Callers
El comando "queue" nos permite hacer de todo, añadir, eliminar, pausar, reanudar agentes, en fin desde la consola se puede hacer casi de todo. Incluso de forma Opaca al personal, pueden estar atendiendo llamadas sin saber que pertenecen a colas ni que se les etiqueto como "agentes"
NOTA relacionado al pensamiento de las distintas estrategias, Si a un agente le suena el Tlf, se coge, la idea o prueba de, suena y no lo coges, no está contemplada, El agente no puede estar ocupado en otra cosa, osea o esta BUSY, atendiendo a otra llamada, o está fuera de cola (ya no es un agente) o esta en pausa(o en ultima instancia está en su tiempito de relajo o no entre llamadas "wrapuptime"). Este razonamiento, se ha de tener en cuenta, para comprender las distintas estrategias y su aplicación.
Los Agentes.
Como decimos serán Dinámicos , se añadirán mediante el "dialplan", veamos como creamos un par de contextos, para el logado a las distintas colas.
El concepto:
Un puesto (Extensión) de una persona tiene la capacidad de atender llamadas que vienen de la calle o no, para solucionar dudas tecnicas, o comerciales.
Bien, esta persona desde su terminal, marcara una serie de digitos, que crearan distintas situaciones.
A saber, para la cola de Ventas, se marcaran:
*301 Para que ese terminal entre en la cola de Ventas
*300 Para que ese terminal salga de la cola de Ventas
*311 Para Pausar la actividad del agente, está en la cola, pero no se le pasaran llamadas.
*310 Reanuda su actividad en la cola, ya se le pueden pasar llamadas.
Este concepto es idéntico para la cola de Tecnicos, solo cambiara la marcación que empezara por "*4xx"
Veamos en el fichero extensión.conf como reflejamos esto.
Mejoraremos algo, este dialplan, para que en caso de que un agente no sepa o no recuerde cual es su estado (dentro o fuera, pausado o no) pueda preguntarlo o forzar el estado lógico siguiente.
exten => *301,1,NoOp(metemos a un agente en cola)
same => n,Answer()
same => n,AddQueueMember(Ventas)
same => n,Playback(EntrandoVentas)
same => n,HangUp()
exten => *311,1,NoOp(Pausamos a un agente de la cola)
same => n,Answer()
same => n,PauseQueueMember(Ventas,SIP/${CALLERID(num)},,Descanso5min)
same => n,Playback(AtencionPausa5min)
same => n,HangUp()
exten => *310,1,NoOp(Reanudamos la actividad del agente)
same => n,Answer()
same => n,UnpauseQueueMember(Ventas,SIP/${CALLERID(num)},,FinDescanso)
same => n,Playback(Aceptandollamadas)
same => n,HangUp()
exten => *300,1,NoOp(Sacamos a un agente de cola)
same => n,Answer()
same => n,RemoveQueueMember(Ventas)
same => n,Playback(AbandonandoVentas)
same => n,HangUp()
En los "Playback" anunciamos al agente lo que ocurre, para que no se produzcan errores.
Por alguna razón tanto en "RemoveQueueMember()" como en AddQueueMember() en las opciones, SI puedo añadir el interfaz, PERO no es necesario, automaticamente crea la interfaz en función del canal, con lo que no se requiere poner la opción del interfaz (Si la de la cola), PERO no ocurre lo mismo en los comandos UnpauseQueueMember(),PauseQueueMember() estos no "detectan" y se ha de poner la interfaz, con un poco de imaginación yo lo solucione de este modo.
Bien una vez hecho esto recargamos el dialplan y vemos que si ejecutamos las marcaciones, se ven sus respuestas en la cola Ventas que es la que tenemos preparada.
Marcamos un *301 y en la consola nos tira.... (Nota, los avisos del Playback, se cogieron default menos en la reanudación que ponemos beep,beep)
== Using SIP RTP CoS mark 5
> 0xb45577f0 -- Strict RTP learning after remote address set to: 192.168.3.179:55900
-- Executing [*301@Ventas:1] NoOp("SIP/303-0000004a", "metemos a un agente en cola") in new stack
-- Executing [*301@Ventas:2] Answer("SIP/303-0000004a", "") in new stack
> 0xb45577f0 -- Strict RTP switching to RTP target address 192.168.3.179:55900 as source
-- Executing [*301@Ventas:3] AddQueueMember("SIP/303-0000004a", "Ventas") in new stack
[Feb 2 14:00:17] NOTICE[22249][C-0000003d]: app_queue.c:7767 aqm_exec: Added interface 'SIP/303' to queue 'Ventas'
-- Executing [*301@Ventas:4] Playback("SIP/303-0000004a", "agent-loginok") in new stack
-- <SIP/303-0000004a> Playing 'agent-loginok.ulaw' (language 'es')
-- Executing [*301@Ventas:5] Hangup("SIP/303-0000004a", "") in new stack
== Spawn extension (Ventas, *301, 5) exited non-zero on 'SIP/303-0000004a'
Si marcamos *300 la consola dice.....
== Using SIP RTP CoS mark 5
> 0xb45577f0 -- Strict RTP learning after remote address set to: 192.168.3.179:52022
-- Executing [*300@Ventas:1] NoOp("SIP/303-0000004b", "Sacamos a un agente de cola se supone que dinamico") in new stack
-- Executing [*300@Ventas:2] Answer("SIP/303-0000004b", "") in new stack
> 0xb45577f0 -- Strict RTP switching to RTP target address 192.168.3.179:52022 as source
-- Executing [*300@Ventas:3] RemoveQueueMember("SIP/303-0000004b", "Ventas") in new stack
[Feb 2 14:04:59] NOTICE[22254][C-0000003e]: app_queue.c:7693 rqm_exec: Removed interface 'SIP/303' from queue 'Ventas'
-- Executing [*300@Ventas:4] Playback("SIP/303-0000004b", "agent-loggedoff") in new stack
-- <SIP/303-0000004b> Playing 'agent-loggedoff.ulaw' (language 'es')
-- Executing [*300@Ventas:5] Hangup("SIP/303-0000004b", "") in new stack
== Spawn extension (Ventas, *300, 5) exited non-zero on 'SIP/303-0000004b'
Y si marcamos *311 (evidentemente se tiene que estar en la cola OJO) (hemos conbinado en los playback agente logado + pausado)
== Using SIP RTP CoS mark 5
> 0xb45577f0 -- Strict RTP learning after remote address set to: 192.168.3.179:51598
-- Executing [*311@Ventas:1] NoOp("SIP/303-0000004e", "Pausamos a un agente de la cola se supone que dinamico") in new stack
-- Executing [*311@Ventas:2] Answer("SIP/303-0000004e", "") in new stack
> 0xb45577f0 -- Strict RTP switching to RTP target address 192.168.3.179:51598 as source
-- Executing [*311@Ventas:3] PauseQueueMember("SIP/303-0000004e", "Ventas,SIP/303,,Descanso5min") in new stack
-- Executing [*311@Ventas:4] Playback("SIP/303-0000004e", "agent-loginok") in new stack
-- <SIP/303-0000004e> Playing 'agent-loginok.ulaw' (language 'es')
-- Executing [*311@Ventas:5] Playback("SIP/303-0000004e", "dictate/paused") in new stack
-- <SIP/303-0000004e> Playing 'dictate/paused.ulaw' (language 'es')
-- Executing [*311@Ventas:6] Hangup("SIP/303-0000004e", "") in new stack
== Spawn extension (Ventas, *311, 6) exited non-zero on 'SIP/303-0000004e'
Y si pulsamos *310 (Tambien tenemos que estar "pausados" OJO)(hemos conbinado en los playback beep + beep)
== Using SIP RTP CoS mark 5
> 0xb45577f0 -- Strict RTP learning after remote address set to: 192.168.3.179:59238
-- Executing [*310@Ventas:1] NoOp("SIP/303-0000004f", "Quitamos pausa a un agente ya en cola se supone que dinamico") in new stack
-- Executing [*310@Ventas:2] Answer("SIP/303-0000004f", "") in new stack
> 0xb45577f0 -- Strict RTP switching to RTP target address 192.168.3.179:59238 as source
-- Executing [*310@Ventas:3] UnpauseQueueMember("SIP/303-0000004f", "Ventas,SIP/303,,FinDescanso") in new stack
-- Executing [*310@Ventas:4] Playback("SIP/303-0000004f", "beep") in new stack
-- <SIP/303-0000004f> Playing 'beeperr.ulaw' (language 'es')
-- Executing [*310@Ventas:5] Playback("SIP/303-0000004f", "beep") in new stack
-- <SIP/303-0000004f> Playing 'beeperr.ulaw' (language 'es')
-- Executing [*310@Ventas:6] Hangup("SIP/303-0000004f", "") in new stack
== Spawn extension (Ventas, *310, 6) exited non-zero on 'SIP/303-0000004f'
En cuanto a la comprobación por consola de las colas, con "queue show", se podrán ver los distintos estados de las distintas colas y de sus agentes, un ejemplo.
ASX93*CLI> queue show
Tecnicos has 0 calls (max unlimited) in 'rrmemory' strategy (0s holdtime, 0s talktime), W:0, C:0, A:1, SL:0.0% within 0s
No Members
No Callers
Ventas has 0 calls (max unlimited) in 'linear' strategy (2s holdtime, 0s talktime), W:0, C:0, A:5, SL:0.0% within 0s
Members:
SIP/303 (ringinuse enabled) (dynamic) (in call) (In use) has taken no calls yet
SIP/301 (ringinuse enabled) (dynamic) (paused) (Not in use) has taken no calls yet
SIP/302 (ringinuse enabled) (dynamic) (Not in use) has taken no calls yet
Podemos ver los tres estados En uso y en llamada, Pausado y Sin uso y Sin uso de los tres agentes de esta cola de ventas con estrategia Linear.
Ya solo nos queda entrar en la o las colas. Esto es sencillo, usaremos otra vez el dialplan, para llamar a Queue(), Veamos como.
[Colas]
exten => #300,1,Answer()
same => n,Ringing()
same => n,NoOp(Estado de la cola ${QUEUESTATUS})
same => n,Queue(Ventas,,,,120)
same => n,NoOp(Estado de la cola ${QUEUESTATUS} y ${ABANDONED})
same => n,HangUp()
exten => #400,1,Answer()
same => n,Ringing()
same => n,NoOp(Estado de la cola ${QUEUESTATUS})
same => n,Queue(Tecnicos,,,,120)
same => n,NoOp(Estado de la cola ${QUEUESTATUS} y ${ABANDONED})
same => n,HangUp()
Con la marcación #300, se estrara en la cola de Ventas, con un "timeout" fijo de 2min, y con el #400 se hará lo propio en la de Tecnicos.
Estos timeouts, está en relación con el fichero queues.conf y ciertos parametros de tiempo que comente mas arriba.