Archivo de la etiqueta: IVR

IVR con MYSQL. Elastix

Configurar un IVR es muy sencillo desde la interfaz web de Elastix, simple para direccionar opciones a extensiones agregadas a nuestra PBX. Pero sabemos que muchas de las veces requerimos hacer cosas mas elaboradas, por ejemplo gestionar datos de una BD y hacerlos interactuar con nuestra central telefónica.

Para este ejemplo mi aplicación contiene:

  • Un saludo de bienvenida.
  • Un menú principal
  • Menus secundarios
  • Audios de ingresos correctos e incorrectos.

Para grabar estos archivos podemos hacerlo desde nuestro editor favorito, yo utilizo Audacity respetando ciertas configuraciones de muestreo y otras cosas. Para facilitar nuestro trabajo podemos realizar las grabaciones desde una extensión de nuestra PBX y con la ayuda de un softphone grabar nuestra voz. En la página de elastix hay mucha información de cómo realizar esta labor. Recomiendo los manuales de “Comunicaciones Unificadas con Elastix” volumen 1 y volumen 2.

La aplicación es sencilla y se la puede complicar tanto como queramos.

Empezamos con editar el archivo de configuración extensions_custom.conf, desde nuestra interfaz web llegamos a este archivo de la siguiente manera:

  1. Clic en PBX
  2. Clic en Tools
  3. Clic en File Editor

Acceso archivo extension_custom.conf

Para encontrar rapidamente el archivo podemos filtarlo por su nombre:

Filtranto el archivo extensions_custom.conf

Agregamos lo siguiente a nuestro archivo:

include => inicio
include => IVR
include => IVR1
include => IVR2

[globals]

;——– VARIABLES

telefono=
total=
estadof=
numero=
flaq=
estado=

[inicio]

exten => 1800,1,Answer
exten => 1800,2,Ringing
exten => 1800,3,Wait,2
exten => 1800,4,goto(IVR,s,1)

[IVR]
exten => s,1,Wait(1) ;espera un segundo
exten => s,2,Set(TIMEOUT(response)=10) ; 10 seg espera para que el llamante presione una tecla
exten => s,3,Playback(custom/welcome) ; menu y escucha si el llamante presiona alguna tecla
exten => s,4,BackGround(custom/menu)
exten => s,5,WaitExten() ; espera que el llamante presione alguna tecla
exten => 1,1,goto(IVR1,s,1) ; si presiona 1 va al contexto IVR1, extension s, prioridad 1
exten => 2,1,goto(IVR2,s,1) ; si presiona 2 va al contexto IVR2, extension s, prioridad 1
exten => 0,1,Hungup
exten => t,1,Goto(#,1)
exten => i,1,BackGround(custom/noOp)
exten => i,2,Goto(s,4)

[IVR1]
exten => s,1,Playback(custom/inFono)
exten => s,2,Read(telefono,,8) ; variable telefono recupera lo q el usuario ingreso 8 caracteres
exten => s,3,MYSQL(Connect conn localhost root eLaStIx.2oo7 informacion) ; usuario: root, pass:eLaStIx.2oo7, informacion es el nombre de la BD
exten => s,4,MYSQL(Query resultid ${conn} SELECT total from CNT where idfono=${telefono}) ; consulta tabla CNT, campo idfono
exten => s,5,MYSQL(Fetch fetchid ${resultid} suu) ; recupera el valor
exten => s,6,Set(total=${suu}) ; guarda en la variable total
exten => s,7,MYSQL(Clear ${resultid}) ;limpia
exten => s,8,MYSQL(Disconnect ${conn}) ;desconecta
exten => s,9,GotoIf($[${LEN(${total})} = 0]?11:20) ; si la consulta retorna valores vacios
exten => s,10,Goto(11)
exten => s,11,BackGround(custom/losiento) ; se le dice al usuario que no hubo datos de su consulta
exten => s,12,Goto(23)
exten => s,20,BackGround(custom/totales)
exten => s,21,SayNumber(${total}) ; si la consulta retorna un valor, una voz femenina lee el valor(en ingles)
exten => s,22,Playback(custom/dolares)
exten => s,23,BackGround(custom/pregunta) ; si desea hacer otra consulta
exten => s,24,WaitExten(3)
exten => 1,1,Goto(IVR1,s,1)
exten => 2,1,Goto(IVR,s,4)
exten => 3,1,Hangup

[IVR2]
exten => s,1,Playback(custom/inFono)
exten => s,2,Read(telefono,,8)
exten => s,3,MYSQL(Connect con localhost root eLaStIx.2oo7 informacion)
exten => s,4,MYSQL(Query resul ${con} SELECT estado from CNT where idfono=${telefono})
exten => s,5,MYSQL(Fetch fetchid ${resul} su)
exten => s,6,Set(estadof=${su})
exten => s,7,MYSQL(Clear ${con})
exten => s,8,MYSQL(Disconnect ${con})
exten => s,9,GotoIf($[${LEN(${estadof})} = 0]?11:20)
exten => s,10,Goto(11)
exten => s,11,BackGround(custom/losiento)
exten => s,12,Goto(22)
exten => s,20,BackGround(custom/estadoes)
exten => s,21,Playback(custom/${estadof}) ; el resultado de la consulta es la misma que el  nombre de un archivo de audio
exten => s,22,BackGround(custom/pregunta2)
exten => s,23,WaitExten(3)
exten => 1,1,Goto(IVR2,s,1)
exten => 2,1,Goto(IVR,s,4)
exten => 3,1,Hangup

Parte del código esta comentado para su entendimiento, es muy fácil seguir su secuencia y probar sus opciones mentalmente. Todo empieza con el contexto [inicio], la extensión de nuestra IVR es 1800, esta a su vez puede ser configurada como ruta entrante de las llamadas o puede ser configurada para que primero sea contestada en un Call Center, etc., son muchas nuestras posibilidades, todo esto se explica en detalle en la documentación oficial.

Luego va al contexto [IVR] donde reproducimos el saludo (PlayBack) y luego el menú (Background), la diferencia entre las dos es que la primera hará caso omiso al usuario hasta terminar de reproducir todo el archivo y background reproducirá el archivo hasta que el usuario presione alguna opción del teclado y el IVR interprete esta opción.

La secuencia depende del número de su secuencia y con “Goto” podemos prácticamente pasearnos por nuestras opciones.

La consulta de conexión a la BD viene con los datos de usuario y password que se menciona en la explicación del código, estos valores vienen por default en Elastix

La aplicación le da al usuario dos opciones:

  • Presione 1 para revisar su saldo. Contexto [IVR1]
  • Presione 2 para revisar el estado actual de su línea. Contexto [IVR2]

[IVR1]

  • El usuario ingresa su numero de telefono 8 caracteres
  • Se realiza la consulta
  • El IVR lee el resultado de la consulta
  • Menu para consultar otro numero o regresar al menú principal o salir

[IVR2]

  • El usuario ingresa su numero de telefono 8 caracteres
  • Se realiza la consulta
  • Los resultados siempre tienen 4 estados de la linea posibles:
    • En reparacion
    • En mora
    • Suspendido
    • En linea
  • El resultado de la consulta cualquiera que estos fueran tienen un audio con el nombre de archivo igual al  de la consulta. Ejemplo: si la consulta devuelve suspendido en el sistema se encuentra un audio llamado suspendido.wav
  • Menu para consultar otro numero o regresar al menú principal o salir

Por el momento es todo y hay mucho que se puede hacer, espero le sea de utilidad a alguien. Hasta pronto.

Anuncios