Antes de discutir que framework usar o que patrón de desarrollo es el
ideal creo que lo mejor es empezar a definir un modelo de datos para
la aplicación. Como el UML además de complicado es un dolor de muelas
voy a exponer un posible modelo utilizando Json (más bien literales de
javascript) que lo entendemos todos y es muy sencillo de escribir.
El modelo está pensado con dos prioridades en mente: facilidad de
implementación y máxima flexibilidad. De hecho solo voy a definir dos
tipos de entidades: Tarea y Auditoría. Mi idea inicial era reducirlo
todo a una Tarea pero para facilitar la implementación y pensando en
optimizar el transporte de datos he decidido dividirlo en esas dos
entidades donde la Auditoría es opcional y solo sería necesaria para
generar informes.
Una Tarea sería algo así:
{
id : 'A12HDEF213FG21BC',
code : 'newproject',
title : 'My new Project',
description : {
format : 'html',
value : 'This is my <strong>first</strong> project',
},
priority : 'normal',
status : 'new',
parent : null,
children : [ 'BFA31D8742BCD', '233HGFDAC239C' ],
hours : {
projected : 50.0,
children : 34.0,
worked : 5.3,
},
attachments : [
{
name : 'layout.png',
mime : 'image/png',
size : 485234,
},
],
owner : 'drslump',
cc : [ 'dani', 'gerard' ],
bcc : [ '
in...@cliente.org' ],
tags : [ 'published' ]
}
La idea es utilizar un espacio global para todas las tareas a fin de
facilitar la implementación. Las tareas tienen un estructura de árbol,
lo que permite una organización jerarquica en lugar de relacional que
en mi opinión es más sencilla de comprender y de utilizar.
"id" es el identificador global de una tarea.
"code" es un identificador propuesto por el usuario que debe ser único
en su misma rama del árbol, se puede utilizar para referenciar una
tarea de una forma facilmente recordable (i.e.: /myproject/3 sería la
3 tarea del projecto 'myproject' ).
"title" es simplemente el título de la tarea.
"description" es importante porque además de describir una tarea puede
servir para incluir información del cliente en una tarea raiz (un
proyecto).
"priority" y "status" son simplemente la prioridad y el estado.
"parent" si es Null es que la tarea es una raiz, si es un string es
una referencia a la tarea padre.
"children" un array que por defecto esta vacio con la lista tareas
hijas, pueden ser o bien referencias al id de otra tarea o un objecto
tarea.
"hours" incluye las horas proyectadas, las acumuladas de las tareas
hijas (computadas) y las logeadas para esa tarea en cuestion
"attachments" es una lista de ficheros adjuntos. Solo se incluye el
nombre (que sirve de identificador), el mimetype y el tamaño. El
fichero adjunto en si debe ser obtenido por separado.
"owner": es el usuario propietario de la tarea (podría ser un array
para permitir más de uno pero no creo que sea necesario).
"cc": son los usuarios que están siguiendo esa tarea y que pueden
modificarla.
"bcc": son los usuarios que están siguiendo esa tarea pero que no
pueden modificarla.
"tags": simples tags que pueden usarse para filtrar las tareas
Con esa entidad podemos llevar la gestión de las tareas de una forma
sencilla y dinámica. Con la entidad de auditoría podemos generar
informes y saber todos los detalles de una tarea.
[
{
task : 'A12HDEF213FG21BC',
timestamp : '2007-11-08T09:45:44Z',
action : 'workedhours',
user : 'drslump',
params : [ 2.4 ], // the number of worked hours
log : 'Implemented the menu'
},
{
task : 'A12HDEF213FG21BC',
timestamp : '2007-11-05T18:23:56Z',
action : 'newchild',
user : 'drslump',
params : [ 'BFA31D8742BCD' ], // the id of the subtask added
log : ''
},
{
task : 'A12HDEF213FG21BC',
timestamp : '2007-11-05T12:44:23Z',
action : 'created',
user : 'drslump',
params : [],
log : ''
}
]
Es un array con todos los cambios realizados en un tarea en concreto o
un conjunto de tareas. Basicamente nos permite saber la fecha en que
se hizo el cambio, quien lo hizo y que se hizo.
"task" es la referencia a la tarea, es necesario incluirlo porque
puede ser obtengamos una auditoria de un conjunto de tareas.
"timestamp" es la fecha en que se hizo el cambio.
"action" es la acción realizada.
"user" es el usuario que realizo el cambio.
"params" es un vector con los parametros utilizados para realizar el
cambio (un id de una nueva subtarea, el nombre de un adjunto, horas
logeadas...).
"log" un campo textual donde el usuario puede poner una descripción
del cambio. Muy similar al log de un cvs o subversion.
La lista de auditorias nos permite en principio sacar informes sobre
los cambios en un proyecto o consultarlo para generar RSS o emails
automatizados. Sin embargo, con un poco más de código puede permitir
la sincronización de bases de datos o deshacer cambios.