Una aplicación simple. Integración de Mantis en Asterisk.

Asterisk, Desarrollo

Integrar una aplicación en Asterisk no resulta dificil si tenemos unos conocimientos básicos del dialplan y sabemos como realizar consultas a bases de datos. En esta ocasión y a modo de sencillo ejemplo relizaremos una sencilla modificación en nuestro dialplan para enlazar asterisk con Mantis.

¿Que es Mantis?Mantis bug tracker

Para aquellos que no lo conozcais, Mantis es un completo sistema de seguimiento de incidencias, libre y funciona sobre php+mysql. No llevo mucho tiempo trabajando con Mantis, pero hasta ahora he descubierto bastantes posibilidades:

  • Las incidencias pueden pasar por diversos estados (abierta, asignada al ténico, cerrada…) facilmente reconocibles por colores, así como organizarlas por proyectos.
  • Permite la creación crear varios perfiles de usuario (técnico, desarrollador, coordinador…),
  • Es posible definir un flujo de trabajo (p. ej: el perfil X puede abrir incidencias, pero solo el perfil Y puede resolverlas y cerrarlas)
  • También nos permite mantener una comunicación directa via email con el cliente afectado, de forma que cada vez que editemos una incidencia le llegue un mensaje al usuario con los cambios realizados.

Captura mantis

Captura de Mantis.

Un caso práctico.

Bien, supongamos que la joven empresa Pepe Consulting S.L. se dedica a la reparación y mantenimiento de equipos informáticos.

Esta empresa tiene una central en la que reciben los pedidos de los clientes, llevan un registro de las incidencias y a coordinan a los técnicos que estan en la calle.

Resulta que Godofredo Cascajosa, uno de los técnicos de campo, se ha desplazado a un pueblo cercano, Villacabreros del Trabuco, para hacer una reparación y ahora necesita llamar a la central para saber cual es su próximo encargo.

Pues bien, ahí es donde entra Asterisk en acción, ¿por que tener a una operadora ocupada cuando el propio Asterisk puede darle esa información? Con el siguiente ejemplo veremos como Asterisk realiza una consulta a la base de datos de Mantis y facilita la información requerida al técnico.

Lo primero de todo es tener un buen plan, en nuestro caso hemos diseñado el diagrama de flujo que va a seguir nuestra aplicación:

Diagrama de flujo de la aplicación.

Al turróoooon!!!

Para que esto funcione tenemos que saber dónde almacena mantis la información sobre las incidencias dentro de la base de datos. En nuestro caso las incidencias son almacenadas en la tabla mantis_bug_table y los campos que nos interesan son:

  • id: número de incidencia
  • summary: titulo de la incidencia
  • status: estado de la incidencia (nos interesa el estado 10, incidencias abiertas

En la tabla mantis_bug_text_table encontraremos el campo description donde se almacenan la descripciones de las incidencias.
Comenzaremos creando la extension mantis, que se corresponderá con el número 101.

[mantis]
exten => 101,1,Answer()
 
;Conexion inicial a la base de datos
exten => 101,n,MYSQL(Connect CONNID host user pass dabase)
exten => 101,n,GotoIf($["${CONNID}" = ""]?errMysql)
 
exten => 101,n,NoOp(Menu inicial)
exten => 101,n(menu),Wait(1)
 
;Leemos las opciones del menu y esperamos la respuesta
exten => 101,n,Festival(Pulse UNO para listar las incidencias.)
exten => 101,n,Festival(Pulse DOS para ver detalles.)
exten => 101,n,Read(MENU,,1)  ;Recogemos la opcion pulsada
exten => 101,n,GotoIf($["${MENU}" = "1"]?opcion1)
exten => 101,n,GotoIf($["${MENU}" = "2"]?opcion2)
exten => 101,n,Goto(menu)

Con esto ya hemos conseguido crear la conexión a la base de datos y el menú inicial. Vamos con el primer apartado del menu:

; ==================================
; Opcion 1 (Listado de incidencias)
; ==================================
exten => 101,n(opcion1),NoOp(Opcion 1 seleccionada)
 
; Cuenta el número de incidencias abiertas
exten => 101,n,MYSQL(Query QCOUNT ${CONNID} SELECT\ COUNT(id)\ from\ mantis_bug_table\ WHERE\ status=10)
exten => 101,n,MYSQL(Fetch foundRow ${QCOUNT} BUG_COUNT) ; fetch row
 
; Si no existen incidencias salimos
exten => 101,n,GotoIf($["${BUG_COUNT}" = "0"]?infoNoHayBugs)
 
; Si existen incidencias indicamos el numero
exten => 101,n,Festival(Hay ${BUG_COUNT} incidencias abiertas:)
 
; Consultamos las incidencias abiertas
exten => 101,n,MYSQL(Query QBUGS ${CONNID} SELECT\ CONCAT(\'Incidencia número\ \'\,id\,\'\: \ \'\,summary)\ from\ mantis_bug_table\ WHERE\ status=10)
exten => 101,n(fetchrow),MYSQL(Fetch foundRow ${QBUGS} BUG_DESC) ; fetch row
exten => 101,n,GotoIf($["${foundRow}" = "0"]?done) ; Si no existen incidencias salimos
exten => 101,n,Wait(1)
exten => 101,n,Festival(${BUG_DESC})
exten => 101,n,Goto(fetchrow)
 
exten => 101,n,Goto(menu) ; Volvemos al menú

Fijaos que al construir la consulta debemos introducir el caracter de espacio debemos hacerlo con una barra invertida delante “\ “.
Ahora con el segundo:

; =================================
; Opcion 2 (Detalle de incidencias)
; =================================
exten => 101,n(opcion2),NoOp(Opcion 2 seleccionada)
exten => 101,n,Wait(1)
exten => 101,n,Festival(Introduzca el número de incidencia con 4 dígitos)
 
;Lectura del numero de incidencia
exten => 101,n,Read(ID,,4)
 
;Buscamos la incidencia introducida
exten => 101,n,MYSQL(Query QDESCRIPTION ${CONNID} SELECT\ description\ from\ mantis_bug_text_table\ WHERE\ id=${ID})
exten => 101,n,MYSQL(Fetch foundRow ${QDESCRIPTION} DESCRIPTION) ; fetch row
 
;Si no existe la incidencia avisamos saltamos a la subrutina que informa que la incidencia no existe
exten => 101,n,GotoIf($["${foundRow}" = "0"]?infoBugInexistente)
 
;Si existe la incidencia se lee su numero y su descripcion
exten => 101,n,Wait(1)
exten => 101,n,Festival(Incidencia numero ${ID}. Descripcion:)
exten => 101,n,Festival(${DESCRIPTION})
 
exten => 101,n,Goto(menu) ;Volvemos al menú

Y el código donde manejamos los mensajes de error:

; =======
; Errores
; =======
exten => 101,n(infoNoHayBugs),Festival(No hay incidencias abiertas.)
exten => 101,n,Goto(menu)
 
exten => 101,n(infoBugInexistente),Festival(La incidencia indicada no existe.)
exten => 101,n,Goto(menu)
 
exten => 101,n(errMysql),Festival(Se ha producido un error de conexión.)
exten => 101,n,Hangup

Un vez guardado este código en el archivo mantis.dialplan en /etc/asterisk/dialplan, tenemos que asegurarnos que lo estamos incluyendo en nuestro dialplan mediante la línea:

#include dialplan/mantis.dialplan

También nos aseguraremos de que la extension [mantis] esté habilitada para las llamadas entrantes poniendo esta linea en nuestro contexto de llamadas entrantes:

include => mantis

Reiniciamos nuestro Asterisk, y voilá! Cuando nuestro técnico llame a la central solo tendrá que marcar el 101 para acceder al menú de consulta de incidencias de Mantis.

Me gusta que los planes salgan bien

“Me gusta que los planes salgan bien…”

Leave a Comment

Your comment

You can use these tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Please note: Comment moderation is enabled and may delay your comment. There is no need to resubmit your comment.