Diseño de un administrador de reportes

Luego de dejar de postear por tanto tiempo queria volver publicando algo util, liberar algun proyecto o algo por el estilo, pero entre ver el siguiente capitulo de 24 y sanear un proyecto para ser publicado siempre salio ganando 24.

Lo siguiente no es tan interesante como lo que tenia planeado pero es de utilidad para quien necesita crear plantillas de reportes y esta a punto de empezar a indagar como hacerlo con PHP.

El requerimiento

Si por algun lado hay que empezar es por aqui. Se necesita lo siguiente:

  • Tener un catalogo de reportes
  • Elegir el formato en que quiero cada reporte (el mismo reporte pueda obtenerse en distintos formatos)
  • La cantidad de parametros que cada reporte necesita sea variable

El modelo de datos

El modelo de las tablas que necesitamos se limitan a lo siguiente.

Modelo de datos de un catalogo de reportes

Modelo de datos de un catalogo de reportes

Tenemos tres tablas. Una guarda el catalogo de reportes, la otra el catalogo de formatos de archivos y una tabla de relación que describe los formatos en que cada reporte se encuentra disponible.

Clases PHP

Acostumbro a trabajar consumiendo servicios. Me parece que es mas limpio si tengo bien separado la vista (en el cliente) de la lógica del negocio (en el servidor). Ademas, si no amarro la vista a los controladores puedo utilizar otros clientes (flash, java, etc) sin hacer cambios al código.

Como dije, trabajando como servicios tengo el servicio/clase llamado Sistema_Reporte que tiene los siguientes métodos:

  • Sistema_Reporte
    • run(codigo:string, formato:string, params:array)
      Ejecuta un reporte. recibe el código del reporte, el formato en que se requiere y los parámetros que necesita el reporte para hacer su trabajo.
    • getReporte(codigo:string)
      Entrega información disponible sobre un reporte (nombre, descripción, etc).
    • getFormats(codigo:string)
      Devuelve una matriz con los formatos que un reporte puede generar.
    • getParams(codigo:string)
      Entrega una matriz con los parámetros que recibe el reporte.
    • getParamValues(parametro:string)
      Algunos parametros son predefinidos (true, false, «si», «no») y otros serán IDs de un catalogo. Este método devuelve una matriz con los valores posibles que un parámetro puede tomar cuando estos no pertenecen a una tabla catalogo.
    • scan(ruta:string)
      Busca y registra los reportes encontrados en la ruta dada (relativa a la raíz del sistema).

Lo que este servicio hace es tan solo recibir la petición y direccionarlo al reporte especificado. Los reportes seran otras clases PHP que pueden estar ubicadas todas en un mismo directorio u ordenadas en otros directorios junto a otras clases de sus modulos, eso no importa ya que en nuestro modelo de datos estamos almacenando la ruta donde se encuentra el reporte. El metodo scan realizara una busqueda de reportes en el directorio especificado usando el siguiente algoritmo:

  • Abre el directorio y lista su contenido
  • Recorre el contenido tomando en cuenta solo los archivos con extension .php
  • Carga cada archivo php y revisa si la clase cargada es hija de Sistema_Reporte_Plantilla (todos los reportes deben heredar de esta clase para ser reconocidos como tal).
  • Si la clase cumple con los requisitos es registrada en la tabla de catálogos de reportes si es que aun no se encuentra allí.

En la clase Sistema_Reporte_Plantilla definimos los métodos que todo reporte debe tener:

  • Sistema_Reporte_Plantilla
    • getName()
      Entrega el nombre del reporte
    • getDescription()
      Entrega la descripcion del reporte
    • getFormats()
      Devuelve una matriz simple con los formatos que este reporte es capaz de generar (pdf, xml, csv)
    • getParams()
      Una matriz con los parametros que el reporte debe recibir
    • getParamValues(param)
      Devuelve una matriz con los valores posibles que un parámetro puede tomar cuando estos no pertenecen a una tabla catalogo.
    • run(format, params)
      Ejecuta el reporte.

Como ves, varios métodos del reporte son bastante similares a los del servicio. El servicio tan solo va a redireccionar la petición para que el usuario no tenga acceso directo a los reportes.

[download id=»12″ format=»1″]
[download id=»13″ format=»1″]

Ahora, para implementar los formatos, debes implementar metodos como _runPDF(params) o _runXLS(params) y generar los respectivos documentos. Dale un vistazo al codigo en el metodo run() de Sistema_Reporte_Plantilla para mas información.

3 Respuestas

  1. Adrian dice:

    Pana como hago con la base de datos? podrias darmela tu para guiarme con todo el ejemplo completo?

  2. Adrian dice:

    Pana como hago con la base de datos? podrias darmela tu para guiarme con todo el ejemplo completo? gracias

  3. Adrian, la estructura de las tablas está en este post. Solo son 3 tablas.

Deja un comentario

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.