Zazpe – Gestión de asistencias

Hace un tiempo el director del coro Monseñor Zazpe, de la parroquia San José, me pidió algo para administrar las asistencias de los coristas. Empecé a desarrollar un programa en Mono con Gtk#. Luego de algunas dificultades que tuve para que funcione bien en Windows, me decidí por un camino más seguro: Windows.Forms. Él (la persona que me pidió este programa) trabaja en Windows, así que eso hizo que definitivamente me incline por ese toolkit.

Ventana principal de Zazpe

Ahora estoy arrepentido 🙁 Luego, después de que la interfaz esté bastante avanzada, me di cuenta de por qué aquellas pruebas con Gtk en Windows no funcionaron. Pero bue… ya está, quizá mas adelante haga algo.

UPDATE: Pueden visitar ésta página con más información al respecto

Con Zazpe (le puse ese nombre al programita) podemos ingresar personas y eventos, para luego ir registrando las asistencias a dichos acontecimientos, y también generar informes para imprimir. Esto último todavía no está totalmente implementado, y me falta escoger una forma cómoda de setear las asistencias.

Hace unas semanas, cuando me senté un rato a continuar con esto, me pregunté sobre una forma rápida para corregir los bugs del programa. Por más que uno pruebe lo que hace, siempre el que lo termina usando encuentra una forma de hacer explotar todo. Seguramente cuando le envíe alguna revisión, va a saltar una excepción y el programa se va a cerrar. No puedo pedirle que me haga un informe de error, que me cuente lo que estaba haciendo en el momento del error, porque es mucho quilombo para él.

Zazpe - Ingresar persona

Copiándole un poco el sistema a Windows y a Ubuntu, lo que hago es ir armando un informe a medida que la aplicación avanza en su ejecución. Así, registro los datos que fueron ingresados, los formularios que se cargaron, etc. Todo esto se va guardando en un archivo de texto plano. Cuando salta una excepción no capturada, le informa al usuario que ha ocurrido un error, y le pide que envíe el archivo de informe a mi mail. De esta forma, puedo verificar exactamente (bueno, casi) lo que estaba pasando, los datos ingresados, la excepción que saltó y su stacktrace. Para un software más serio, quizá esto sea demasiado “espía”.

Para hacerlo, lo que hice fue declarar una clase (subclase de Windows.Forms.Form), FormLogging, de la cual heredan todos los formularios. Ésta es la clase encargada de realizar todo el log de lo que pasa en el form. Se encarga de setear los event handlers de los controles que me interesan (como los TextBoxes, ComboBoxes, etc) para que registren lo que pasa. Todo este trabajo es totalmente transparente para los formularios que son subclases.

Un ejemplo de log sería el siguiente:

Carga: MainForm
Carga: IngresarPersona
   txtDNI: 123456
   cmbSexo: Hombre
   txtApellido: Pividori
   txtNombre: Milton
   btnCancelar presionado
Salida: IngresarPersona
Carga: AcercaDe
Salida: AcercaDe
Carga: IngresarEvento
   btnCancelar presionado
Salida: IngresarEvento
Carga: IngresarPersona
   txtDNI: 1111
   cmbSexo: Hombre
   txtApellido: Pividori
   txtNombre: Milton
   btnAceptar presionado
Excepción no capturada:
   Tipo: Zazpe.Personas.PersonaExistenteException
   Mensaje: Se está intentando ingresar una persona
      que ya existe en la base de datos.
   Source: ControladorPersonas
   StackTrace:
   ...

En él vemos que el usuario quizo ingresar una persona, agregó algunos datos, pero luego se arrepintió y cerró la ventana con el botón Cancelar. Luego le pegó un vistazo al formulario Acerca de. Pensó ingresar un evento, pero cambió de opinión luego. Después de ir a atender el timbre (había pedido una pizza, porque no tenía nada en la heladera para comer) :D, pensó que era una buena idea agregarme, después de todo, a la lista de personas, pero se olvidó de que ya lo había hecho antes… y yo me olvidé de capturar la excepción PersonaExistenteException al intentar ingresar una persona a la base de datos.

Volviendo al tema de Gtk#, no sería difícil portarlo a GNU/Linux. A la mayor parte la desarrollé en este sistema, con Mono. También utilicé NUnit para el unit testing, y SQLite como base de datos.

Dentro de poco voy a agregar una página a este blog con más información sobre Zazpe, y un link para bajar los fuentes.

Si más adelante quisiera desarrollar otro ABM, tendría que tomar mucho de lo que hice en Zazpe, y modificarlo, ya que es muy similar. ¿No conocen algún framework para automatizar esto? Me comentaron algo sobre Turbo Gears y leí de Ruby on Rails, pero estoy más interesado en que el resultado final sea una aplicación de escritorio, no una web.