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

Acerca de Alejandro Ayala

Nací en el ombligo del mundo, latitud 0, el centro del universo, la hora!, no la recuerdo, y tampoco me interesa!, las estrellas ya me dijeron cual es mi misión... se pa' que vine y sé a donde voy. Ver todas las entradas de Alejandro Ayala

20 responses to “IVR con MYSQL. Elastix

  • 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

    • 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

  • Lucas

    Muy buen artículo!!
    Lo que no puedo lograr es ligar este IVR desde la interfaz web.

  • Juan Vargas

    Saludos
    Alejandro una pregunta, dentro de tu experiencia haz realizado una IVR donde te permita guardar un valor verdadero o falso dependiendo de que se oprima una tecla, es decir si oprimo 1 me guarda el valor 1 en la tabla de mysql, Gracias por tu respuesta

  • george

    hola me gustaria saber como hacer si quisiera insertar datos en una tabla de mysql necesita recolectar varios datos e insertarlos y despues consultarlos ya se como insertar y consultar cuando es un solo campo pero cuando son varios no me funciona

  • ricardo

    gracias por el aporte me sirvio muchisimo… pero tengo una pregunta esas variables estan por defecto en el elastix? ¿y como creo una base de datos en el mysql de el elastix? gracias saludos

  • oscar ivan gomez

    amigo, gracias por esta inmensa ayuda, sin embargo tengo muchas preguntas que me gustaria responder ya que esto me a ayudado muchisimo para basarme en mi proyecto de grado donde pued ocomunicarme contigo, e-mail, Facebook, twitter

  • fabian

    hola estoy probando un ejemplo, en la ultima version de elastix, y no me funciona, apenas presiono la extension, no la reconoce. les agradezco si me ayudan

  • fabian

    que version de elastix usaste???

  • Esteban Santillan

    Hola, esta muy bueno su post, tengo una gran duda, ¿Qué pasa si dos personas llaman al mismo tiempo a hacer la misma consulta?
    ¿Sucede algún tipo de redundancia o confusión con los valores de las variables en ese momento?

  • Felipe Villar

    Que tal Alejandro, que buen post tienes acá. Te comento que estoy montando una ivr con conexión a una BD sin embargo en la linea en la que intento hacer conexión, no la hace.

    Al mirar en la CLI que sucede me tira este error:

    WARNING[16131]: pbx.c:4235 pbx_extension_helper: No application ‘MySQL’ for extension (ivr, s, 2)

    Spawn extension (ivr, s, 2) exited non-zero on ‘SIP/telefono1-00000027’

    Nota: la línea de comando en donde hago la conexión es la sgte.

    exten => s,n,MYSQL(Connect conn localhost user pass dbname)

    Uso asterisk 1.8 y lo he recompilado y no pasa nada, reinstalado el mysql y el phpmyadmin pero tampoco. No se si estaré omitiendo algo en alguna config.

    Te agradecería mucho si me puedes orientar.

    Saludos.

  • Diego Muñoz

    Muy buen aporte lo probare y cualquier cosa te contactare

  • Alan Rodriguez

    HOLA! sigues activo?

  • miguel

    hola alejandro como me púedo comunicar contigo directamente me interesa este proyecto que estoy seguro que ya tienes definido y nesecito soporte

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: