En este entrada se comienza a dar solución de forma total al primer objetivo del proyecto, en la entrada anterior, se vio como configurar las llamadas y el servicio de correo de voz mediante un macro, para lograr solucionar completamente el objetivo uno "comunicar todas las extensiones internas (dispositivos SIP) entre sí y brindarles servicios de correo, directorio telefónico entre otros".
El contexto entrante, como su nombre lo indica, recibe las llamadas que ingresen por las troncales analógicas o digitales según sea el caso. Cuando se llame utilizando el número 01800123, una contestadora automática da una bienvenida para seleccionar la opción de un menú. El menú dirige al cliente a una de las siguientes opciones, según el número marcado:
[entrante]
exten =>
1,1,Macro(llamadas,SIP/4001)
exten =>
2,1,Macro(colas,${COLA1})
exten =>
3,1,Macro(colas,${COLA2})
exten => 4,1,Playback(conference-call)
exten => 4,2,Goto(conferencia,s,1)
exten =>
5,1,Goto(ivr,s,1)
Es por esto que se
crearan una serie de contextos los cuales van a permitir manejar de cierta
forma las llamadas internas, brindando a
los usuarios servicios como por ejemplo, correo de voz, Directorio, Control de
llamadas y además, dentro del proyecto se permitirá acceder directamente a las
opciones del IVR
[entrante]
#include
llamadas_internas.conf
archivo llamadas_internas.conf
[agentes]
include =>
llamadas_internas
[supervisor]
include =>
llamadas_internas
include =>
Directorio
[llamadas_internas]
exten =>
01800123,1,Goto(entrante,s,1)
exten =>
_40XX,1,Macro(llamadas,SIP/${EXTEN},agentes)
exten =>
150,1,VoiceMailMain(${CALLERID(num)}@agentes)
El contexto Directorio se
crea para buscar un usuario asignado a un número telefónico, como se vio al crear el contexto llamadas_internas, el numero para ejecutar el directorio será
el 150, esta aplicación relaciona dos contextos en este orden, el creado en el
archivo voicemail.conf ya que en este están registrados los usuarios asociados
a los números telefónicos y el contexto llamadas internas ya
que si encuentra la persona asociada al número de extensión esta extensión
timbrara.
[Directorio]
exten =>
155,1,Directory(agentes,llamadas_internas)
[agentes]
include =>
Directorio
[supervisor]
include =>
Directorio
Para
empezar a recibir llamadas, el agente debe identificarse en el sistema mediante
su número de agente y contraseña. A partir de ese momento, el agente
permanecerá conectado, escuchando una música hasta que haya alguna llamada para
atender, este tipo de agentes es utilizado en call centers donde se puede
utilizar una extensión exclusivamente para atender llamadas, pero si el call
center cuenta con pocas extensiones, no será posible estar todo el tiempo
conectado como agente, es necesario realizar las actividades cotidianas con los
teléfonos y al mismo tiempo atender las llamadas.
Para
configurar los agentes que atenderán las llamadas entrantes a las distintas
colas hay que modificar el archivo agents.conf.
[general]
persistentagents=yes
[agents]
autologoff=15
agent => 1151,4321,Dexter Morgan
agent => 1152,4321,Walter White
exten => _115X,1,Agentlogin(${EXTEN})
same => n,Hangup
Para
que los agentes puedan autenticarse y atender las colas de que son miembros, se
utiliza en el dialplan la aplicación Agentlogin
exten => 115,1,Addqueuemember(Telecontacto,SIP/${CALLERID(num)})
same => n,Playback(agent-loginok)
same => n,Hangup
exten => 116,1,Removequeuemember(Telecontacto,SIP/${CALLERID(num)})
same => n,Playback(agent-loggedoff)
same => n,Hangup
Como
es poco productivo tener un agente conectado permanentemente a una cola ya que
utiliza parte del ancho de banda disponible, es por esto que se podrían
conectar de forma dinámica y que mientras esperan las llamadas en cola puedan
utilizar el teléfono para otro tipo de actividad, para añadir y eliminar de
forma dinámica a la cola en el dial plan, se utilizan aplicaciones como AddQueueMember
y RemoveQueueMember
CLI> module reload chan_agent.so
CLI> agent show
Las
Colas permiten administrar de manera más eficiente las llamadas entrantes,
estas llamadas que entran a una cola serán distribuidas por orden de llegada y
serán atendidas por los agentes.
En el archivo
queues.conf se configuran las distintas colas de espera, cuando se envía una
llamada a una cola a través del dialplan, esta llamada se queda en espera hasta
el momento en el que pueda ser atendida por un agente.
Las llamadas que entran en una cola serán distribuidas por orden de llegada entre los miembros de esta cola. Para decidir a qué usuario se envía cada llamada, el sistema usará una serie de estrategias de distribución de que dispone
Las llamadas que entran en una cola serán distribuidas por orden de llegada entre los miembros de esta cola. Para decidir a qué usuario se envía cada llamada, el sistema usará una serie de estrategias de distribución de que dispone
[general]
persistentmembers=yes
autofill=yes
[Telecontacto]
joinempty=paused,unavailable,invalid,unknown
leavewhenempty=paused,unavailable,invalid,unknown
member => Agent/1151
member => Agent/1152
exten => 110,1,Answer
same => n,Set(SPYGROUP=Telecontacto)
same => n,Queue(Telecontacto)
same => n,Voicemail(4002@agentes)
same => n,Hangup
CLI> module reload app_queue.so
CLI> queue show
Telecontacto
En Asterisk el archivo
del dialplan extensions.conf se divide en tres bloques:
La etiqueta que da
inicio a la parte general,
La etiqueta donde empieza la definición de las
variables globales,
Terminada la configuración [general] y [globals] se empieza a
construir el dialplan, creando los contextos que ya se han visto.
#include
variables_globales.conf
[globals]
COLA1 = Telecontacto
Supervisor = SIP/4001
[macro-colas]
exten =>
s,1,Queue(${ARG1})
same => n,Voicemail(4002@agentes)
same => n,Hangup
exten =>
1,1,Macro(llamadas,${Supervisor})
Este
contexto [control_llamadas] se crea para escuchar las conversaciones telefónicas por parte del
supervisor sin que los teléfonos involucrados o espiados se den cuenta, este
contexto permitirá controlar la calidad de las llamadas y al mismo tiempo ir
capacitando a los agentes en sus actividades dentro del call center.
La
aplicación chan_spy permite escuchar las conversaciones entre extensiones,
tiene la opción de que las extensiones no de den cuenta de que están siendo
vigiladas, se puede también hablar con la extensión que se monitorea sin que el
interlocutor pueda escuchar la conversación, hablar con las dos extensiones
simultáneamente etc.
.
La variable ${SPYGROUP} permite escuchar solo los
canales que pertenecen a un grupo, que por ejemplo, podrían ser los de la cola
de espera Telecontacto
[control_llamadas]
exten => 160,1,ChanSpy(SIP,qbg(Telecontacto))
same => n,Hangup
[supervisor]
include => control_llamadas
exten => 110,1,Answer
same => n,Set(SPYGROUP=Telecontacto)
same =>
n,Queue(Telecontacto)
[macro-colas]
exten => s,1,Answer
same => n,Set(SPYGROUP=${ARG1})
same =>
n,Queue(${ARG1})