diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/montecarlo/MonteCarloController.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/montecarlo/MonteCarloController.java index 8b2a94261..648643eae 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/montecarlo/MonteCarloController.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/montecarlo/MonteCarloController.java @@ -43,6 +43,7 @@ import org.zkoss.zk.ui.event.EventListener; import org.zkoss.zk.ui.event.Events; import org.zkoss.zk.ui.util.GenericForwardComposer; import org.zkoss.zul.Button; +import org.zkoss.zul.Checkbox; import org.zkoss.zul.Decimalbox; import org.zkoss.zul.Grid; import org.zkoss.zul.Intbox; @@ -78,6 +79,8 @@ public class MonteCarloController extends GenericForwardComposer { private Button btnRunMonteCarlo; + private Checkbox cbGroupByWeeks; + private Window monteCarloChartWindow; public MonteCarloController() { @@ -157,8 +160,10 @@ public class MonteCarloController extends GenericForwardComposer { "/planner/montecarlo_function.zul", self, args); MonteCarloGraphController controller = (MonteCarloGraphController) result .getVariable("monteCarloGraphController", true); + final String orderName = monteCarloModel.getOrderName(); - controller.generateMonteCarloGraph(orderName, data); + final boolean groupByWeeks = cbGroupByWeeks.isChecked(); + controller.generateMonteCarloGraph(orderName, data, groupByWeeks); return result; } diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/montecarlo/MonteCarloGraphController.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/montecarlo/MonteCarloGraphController.java index 23dfee694..fe1258240 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/montecarlo/MonteCarloGraphController.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/montecarlo/MonteCarloGraphController.java @@ -3,11 +3,9 @@ package org.navalplanner.web.montecarlo; import java.math.BigDecimal; import java.util.ArrayList; import java.util.Collections; -import java.util.Comparator; import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.Set; import org.joda.time.LocalDate; import org.springframework.beans.factory.config.BeanDefinition; @@ -47,16 +45,58 @@ public class MonteCarloGraphController extends GenericForwardComposer { self.setVisible(false); } - public void generateMonteCarloGraph(String orderName, Map data) { - CategoryModel xymodel = new SimpleCategoryModel(); - - List dates = new ArrayList(data.keySet()); - Collections.sort(dates); - for (LocalDate each: dates) { - String labelDate = each.toString(); - xymodel.setValue(orderName, labelDate, data.get(each)); + public void generateMonteCarloGraph(String orderName, Map data, boolean byWeek) { + CategoryModel xymodel; + if (byWeek) { + xymodel = generateMonteCarloGraphByWeek(orderName, groupByWeek(data)); + } else { + xymodel = generateMonteCarloGraphByDay(orderName, data); } monteCarloChart.setModel(xymodel); } + private CategoryModel generateMonteCarloGraphByDay(String orderName, Map data) { + CategoryModel result = new SimpleCategoryModel(); + + List dates = new ArrayList(data.keySet()); + Collections.sort(dates); + for (LocalDate date: dates) { + String labelDate = date.toString(); + result.setValue(orderName, labelDate, data.get(date)); + } + return result; + } + + private CategoryModel generateMonteCarloGraphByWeek(String orderName, Map data) { + CategoryModel result = new SimpleCategoryModel(); + + List weeks = new ArrayList(data.keySet()); + Collections.sort(weeks); + Integer first = weeks.get(0); + Integer last = weeks.get(weeks.size() - 1); + for (Integer i = first; i <= last; i = i + 1) { + String labelDate = "W" + i; + BigDecimal probability = data.get(i); + if (probability == null) { + probability = BigDecimal.ZERO; + } + result.setValue(orderName, labelDate, probability); + } + + return result; + } + + private Map groupByWeek(Map data) { + Map result = new HashMap(); + + // Group values of each date by week + for (LocalDate date: data.keySet()) { + Integer week = Integer.valueOf(date.getWeekOfWeekyear()); + BigDecimal value = result.get(week); + value = (value != null) ? value.add(data.get(date)) : data.get(date); + result.put(week, value); + } + return result; + } + } diff --git a/navalplanner-webapp/src/main/webapp/montecarlo/_montecarlo.zul b/navalplanner-webapp/src/main/webapp/montecarlo/_montecarlo.zul index 2a8af53cc..44a6fa66a 100644 --- a/navalplanner-webapp/src/main/webapp/montecarlo/_montecarlo.zul +++ b/navalplanner-webapp/src/main/webapp/montecarlo/_montecarlo.zul @@ -61,17 +61,24 @@ + + +