IVR con MYSQL. Elastix

por | diciembre 25, 2009

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:

[sourcecode language=»text»]
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 =&gt; 3,1,Hangup</td>
[/sourcecode]

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.

4 pensamientos en “IVR con MYSQL. Elastix

  1. jj-felipe

    Gracias
    Buena Info gacias

    pdt:
    Las distribuciones de GNU-Linux
    que por lo que veo son 100% te falta trisquel
    que es una distibuccion españoleta muy buena y libre
    Y te advierto que estrella roja tiene algunas cositas mala
    manten tu blog actualizado
    saludes amigo y gracias otra vez

    1. Alejandro Ayala

      Gracias a ti. He probado casi todas las versiones de trisquel, la trisquel-gammers es muy buena, he instalado la version sugar y es la q mas me gusta. La tenía en la lista pero gracias a mi despiste no me di cuenta que han quitado el enlace de la imagen, ahora está pero directamente desde mi blog. Gracias por la sugerencia. Con respecto a estrella roja, aunque no comparto toda su ideología me parece interesante su postura, por eso la puse.
      Trato de mantener activo el blog, cualquier aporte es bienvenido.

      Saludos

  2. Sanders

    Imaginen que tengan que escribir el IVR de un carrito de compras, verificación de balances en un banco, o jugadas de lotería. En todos estos ejemplos y muchos más la lógica de programación se complica y se hace prácticamente imposible de mantener usando sólo el dialplan, o puede necesitas acceder una base de datos no soportada nativamente por Asterisk.

    En ese caso es recomendable usar AGI. En existen en el mercado varias librerías en casi todos los lenguajes de programación para «envolver» AGI. Para los desarrolladores en Java les invito a echarle un vistazo a Astive en astive.phonytive.com.

Los comentarios están cerrados.