From f577f7a794976838e5634ee2cdf3a72e4bd119f4 Mon Sep 17 00:00:00 2001 From: Manuel Rego Casasnovas Date: Mon, 16 Nov 2009 11:44:24 +0100 Subject: [PATCH] ItEr34S13CUAsignacionRecursosEspecificosAPlanificacionItEr33S15: Added dedication chart to stretches function configuration. --- .../allocation/IStretchesFunctionModel.java | 5 ++ .../StretchesFunctionController.java | 65 +++++++++++++++++-- .../allocation/StretchesFunctionModel.java | 26 ++++++++ .../webapp/planner/stretches_function.zul | 11 ++++ 4 files changed, 101 insertions(+), 6 deletions(-) diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/allocation/IStretchesFunctionModel.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/allocation/IStretchesFunctionModel.java index 99d41f2bd..ea1abbbf1 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/allocation/IStretchesFunctionModel.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/allocation/IStretchesFunctionModel.java @@ -24,6 +24,7 @@ import java.math.BigDecimal; import java.util.Date; import java.util.List; +import org.joda.time.LocalDate; import org.navalplanner.business.common.exceptions.ValidationException; import org.navalplanner.business.planner.entities.AssignmentFunction; import org.navalplanner.business.planner.entities.Stretch; @@ -64,6 +65,10 @@ public interface IStretchesFunctionModel { void setStretchLengthPercentage(Stretch stretch, BigDecimal lengthPercentage) throws IllegalArgumentException; + LocalDate getTaskStartDate(); + + Integer getTaskHours(); + /* * Final conversation steps */ diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/allocation/StretchesFunctionController.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/allocation/StretchesFunctionController.java index 3d66ed110..f3d684832 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/allocation/StretchesFunctionController.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/allocation/StretchesFunctionController.java @@ -27,6 +27,8 @@ import java.math.RoundingMode; import java.util.Date; import java.util.List; +import org.joda.time.Days; +import org.joda.time.LocalDate; import org.navalplanner.business.common.exceptions.ValidationException; import org.navalplanner.business.planner.entities.AssignmentFunction; import org.navalplanner.business.planner.entities.ResourceAllocation; @@ -48,6 +50,8 @@ import org.zkoss.zul.Listcell; import org.zkoss.zul.Listitem; import org.zkoss.zul.ListitemRenderer; import org.zkoss.zul.Messagebox; +import org.zkoss.zul.SimpleXYModel; +import org.zkoss.zul.XYModel; import org.zkoss.zul.api.Window; public class StretchesFunctionController extends GenericForwardComposer { @@ -82,7 +86,7 @@ public class StretchesFunctionController extends GenericForwardComposer { stretchesFunctionModel.initCreate(task); } } - reloadStretchesList(); + reloadStretchesListAndCharts(); } public void showWindow() throws SuspendNotAllowedException, @@ -155,7 +159,7 @@ public class StretchesFunctionController extends GenericForwardComposer { public void set(Date value) { try { stretchesFunctionModel.setStretchDate(stretch, value); - reloadStretchesList(); + reloadStretchesListAndCharts(); } catch (IllegalArgumentException e) { throw new WrongValueException(tempDatebox, e .getMessage()); @@ -183,7 +187,7 @@ public class StretchesFunctionController extends GenericForwardComposer { stretchesFunctionModel .setStretchLengthPercentage(stretch, value); - reloadStretchesList(); + reloadStretchesListAndCharts(); } catch (IllegalArgumentException e) { throw new WrongValueException(tempDecimalbox, e .getMessage()); @@ -210,6 +214,7 @@ public class StretchesFunctionController extends GenericForwardComposer { new BigDecimal(100), RoundingMode.DOWN); try { stretch.setAmountWorkPercentage(value); + reloadStretchesListAndCharts(); } catch (IllegalArgumentException e) { throw new WrongValueException(tempDecimalbox, _("Amount work percentage should be between 0 and 100")); @@ -229,7 +234,7 @@ public class StretchesFunctionController extends GenericForwardComposer { @Override public void onEvent(Event event) throws Exception { stretchesFunctionModel.removeStretch(stretch); - reloadStretchesList(); + reloadStretchesListAndCharts(); } }); @@ -240,11 +245,59 @@ public class StretchesFunctionController extends GenericForwardComposer { public void addStretch() { stretchesFunctionModel.addStretch(); - reloadStretchesList(); + reloadStretchesListAndCharts(); } - private void reloadStretchesList() { + private void reloadStretchesListAndCharts() { Util.reloadBindings(window.getFellow("stretchesList")); + Util.reloadBindings(window.getFellow("dedicationChart")); + } + + public XYModel getDedicationChartData() { + XYModel xymodel = new SimpleXYModel(); + + List stretches = stretchesFunctionModel.getStretches(); + if (stretches.isEmpty()) { + return xymodel; + } + + String title = "hours"; + + LocalDate previousDate = stretchesFunctionModel.getTaskStartDate(); + BigDecimal previousPercentage = BigDecimal.ZERO; + + BigDecimal taskHours = new BigDecimal(stretchesFunctionModel + .getTaskHours()); + + xymodel.addValue(title, previousDate.toDateTimeAtStartOfDay() + .getMillis(), 0); + + for (Stretch stretch : stretches) { + BigDecimal amountWork = stretch.getAmountWorkPercentage().subtract( + previousPercentage).multiply(taskHours); + Integer days = Days.daysBetween(previousDate, stretch.getDate()) + .getDays(); + // TODO subtract bank holidays + + int hoursPerDay = 0; + if (days > 0) { + hoursPerDay = amountWork.divide(new BigDecimal(days), + RoundingMode.DOWN).intValue(); + } + + xymodel.addValue(title, previousDate.toDateTimeAtStartOfDay() + .getMillis() + 1, hoursPerDay); + xymodel.addValue(title, stretch.getDate().toDateTimeAtStartOfDay() + .getMillis(), hoursPerDay); + + previousDate = stretch.getDate(); + previousPercentage = stretch.getAmountWorkPercentage(); + } + + xymodel.addValue(title, previousDate.toDateTimeAtStartOfDay() + .getMillis() + 1, 0); + + return xymodel; } } diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/allocation/StretchesFunctionModel.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/allocation/StretchesFunctionModel.java index 1407d0fab..e708383ff 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/allocation/StretchesFunctionModel.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/allocation/StretchesFunctionModel.java @@ -30,13 +30,16 @@ import java.util.List; import org.joda.time.LocalDate; import org.navalplanner.business.common.exceptions.ValidationException; +import org.navalplanner.business.planner.daos.ITaskElementDAO; import org.navalplanner.business.planner.entities.AssignmentFunction; import org.navalplanner.business.planner.entities.Stretch; import org.navalplanner.business.planner.entities.StretchesFunction; import org.navalplanner.business.planner.entities.Task; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; /** * Model for UI operations related to {@link StretchesFunction} configuration. @@ -51,10 +54,14 @@ public class StretchesFunctionModel implements IStretchesFunctionModel { * Conversation state */ private StretchesFunction stretchesFunction; + private Task task; private StretchesFunction originalStretchesFunction; + @Autowired + private ITaskElementDAO taskElementDAO; + @Override public void initCreate(Task task) { stretchesFunction = StretchesFunction.create(); @@ -191,4 +198,23 @@ public class StretchesFunctionModel implements IStretchesFunctionModel { stretch.setDate(new LocalDate(stretchDate)); } + @Override + public LocalDate getTaskStartDate() { + if (task == null) { + return null; + } + return new LocalDate(task.getStartDate()); + } + + @Transactional(readOnly = true) + @Override + public Integer getTaskHours() { + if (task == null) { + return null; + } + + taskElementDAO.reattach(task); + return task.getHoursSpecifiedAtOrder(); + } + } diff --git a/navalplanner-webapp/src/main/webapp/planner/stretches_function.zul b/navalplanner-webapp/src/main/webapp/planner/stretches_function.zul index f6f1180ba..b518445a3 100644 --- a/navalplanner-webapp/src/main/webapp/planner/stretches_function.zul +++ b/navalplanner-webapp/src/main/webapp/planner/stretches_function.zul @@ -30,6 +30,7 @@ + @@ -57,6 +58,16 @@ + + + + + +