Cálculo automático de porcentaje para tareas madres y porcentaje de avance de proyecto en web2project

9 mayo, 2011 at 11:39

Llevo varios años utilizando sistemas de gestión de proyectos y uno de los sistemas libres que más me gusta el DotProject , sin embargo el poco movimiento que ha tenido en los últimos años me ha hecho moverme a una de sus variantes, Web2project.

Web2project es un clon mejorado de Dorproject, tiene varios plugins publicados que incrementan notablemente las capacidades del sistema. Sin embargo posee algunos detalles que se podrían considerar como críticos por algún project manager.

Una problemática que me ha dejado bastante intranquilo es que actualmente en web2project no se calcula automáticamente el porcentaje de avance de las tareas madres cuando una tarea hija es modificada. Es decir si una tarea contiene 4 subtareas, es lógico que el porcentaje de avance cambie si una de sus subtareas lo hace. De la misma forma si una subtarea de una tarea cambia, es lógico que el porcentaje de avance total del proyecto también lo haga, cosa que actualmente no sucede.

Para solucionar este problema, hemos implementado un trigger, que se preocupa de verificar los % de avance de cada tarea madre cada vez que una tarea hija sufre cambios. de esta forma el % de avance total del proyecto siempre indicará el valor correcto del momento.

Dejo a continuación los códigos SQL que implementan la función que calcula el nuevo porcentaje y el código del Trigger que se mantendrá atento cuando se realicen cambios.

//*****************************************
// FUNCION QUE CALCULA EL NUEVO PORCENTAJE
//*****************************************
CREATE FUNCTION new_percent (id_tarea int) RETURNS decimal(6,2)
BEGIN
DECLARE salida decimal(6,2);

SELECT
CAST(
round(
IF(
( SELECT COUNT(stasks.task_id)
FROM ((`tasks` AS stasks))
WHERE stasks.task_id <> tasks.task_id
AND stasks.task_parent = tasks.task_id
) = 0,
task_percent_complete,
( SELECT ifnull(SUM(stasks.task_percent_complete),0)/if(COUNT(stasks.task_id)=0,1,COUNT(stasks.task_id))
FROM ((`tasks` AS stasks))
WHERE stasks.task_id <> tasks.task_id
AND stasks.task_parent = tasks.task_id
)
),2)
AS DECIMAL(6,2)
)
AS X into salida
FROM ((`tasks` AS tasks))
where task_id = id_tarea;
RETURN salida;
END

//*****************************************
// Trigger
//*****************************************

CREATE TRIGGER update_task AFTER UPDATE ON tasks
FOR EACH ROW
BEGIN

update tasks set task_percent_complete = round(new_percent(task_id),0);
END

espero les sea útil.