diff --git a/libreplan-webapp/src/main/java/org/libreplan/web/dashboard/DashboardController.java b/libreplan-webapp/src/main/java/org/libreplan/web/dashboard/DashboardController.java index 4ddbdf57b..316167007 100644 --- a/libreplan-webapp/src/main/java/org/libreplan/web/dashboard/DashboardController.java +++ b/libreplan-webapp/src/main/java/org/libreplan/web/dashboard/DashboardController.java @@ -62,6 +62,7 @@ public class DashboardController extends GenericForwardComposer { private Grid gridTasksSummary; private Grid gridMarginWithDeadline; + private Label lblOvertimeRatio; private org.zkoss.zk.ui.Component costStatus; @@ -88,6 +89,7 @@ public class DashboardController extends GenericForwardComposer { renderMarginWithDeadline(); renderEstimationAccuracy(); renderCostStatus(order); + renderOvertimeRatio(); } showCharts(); } else { @@ -95,6 +97,11 @@ public class DashboardController extends GenericForwardComposer { } } + private void renderOvertimeRatio() { + lblOvertimeRatio.setValue(String.format("%.2f", dashboardModel + .getOvertimeRatio().doubleValue())); + } + private void renderCostStatus(Order order) { CostStatusController costStatusController = getCostStatusController(); costStatusController.setOrder(order); diff --git a/libreplan-webapp/src/main/java/org/libreplan/web/dashboard/DashboardModel.java b/libreplan-webapp/src/main/java/org/libreplan/web/dashboard/DashboardModel.java index 5bfc81a12..1e0acbdf8 100644 --- a/libreplan-webapp/src/main/java/org/libreplan/web/dashboard/DashboardModel.java +++ b/libreplan-webapp/src/main/java/org/libreplan/web/dashboard/DashboardModel.java @@ -21,11 +21,13 @@ package org.libreplan.web.dashboard; import java.math.BigDecimal; import java.math.MathContext; +import java.math.RoundingMode; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.Date; import java.util.EnumMap; +import java.util.Iterator; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; @@ -34,6 +36,9 @@ import java.util.Set; import org.joda.time.Days; import org.joda.time.LocalDate; import org.libreplan.business.orders.entities.Order; +import org.libreplan.business.planner.chart.ContiguousDaysLine; +import org.libreplan.business.planner.chart.ContiguousDaysLine.OnDay; +import org.libreplan.business.planner.entities.IOrderResourceLoadCalculator; import org.libreplan.business.planner.entities.TaskDeadlineViolationStatusEnum; import org.libreplan.business.planner.entities.TaskElement; import org.libreplan.business.planner.entities.TaskGroup; @@ -43,6 +48,8 @@ import org.libreplan.business.planner.entities.visitors.AccumulateTasksStatusVis import org.libreplan.business.planner.entities.visitors.CalculateFinishedTasksEstimationDeviationVisitor; import org.libreplan.business.planner.entities.visitors.CalculateFinishedTasksLagInCompletionVisitor; import org.libreplan.business.planner.entities.visitors.ResetTasksStatusVisitor; +import org.libreplan.business.workingday.EffortDuration; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; @@ -595,4 +602,30 @@ public class DashboardModel implements IDashboardModel { return getRootTask() != null; } -} + @Autowired + private IOrderResourceLoadCalculator resourceLoadCalculator; + + @Override + public BigDecimal getOvertimeRatio() { + EffortDuration load = sumAll(resourceLoadCalculator.getAllLoad()); + EffortDuration overload = sumAll(resourceLoadCalculator + .getAllOverload()); + return EffortDuration.sum(load, overload) + .dividedByAndResultAsBigDecimal(load) + .setScale(2, RoundingMode.HALF_UP); + } + + private EffortDuration sumAll( + ContiguousDaysLine contiguousDays) { + EffortDuration result = EffortDuration.zero(); + Iterator> iterator = contiguousDays + .iterator(); + while (iterator.hasNext()) { + OnDay value = iterator.next(); + EffortDuration effort = value.getValue(); + result = EffortDuration.sum(result, effort); + } + return result; + } + +} \ No newline at end of file diff --git a/libreplan-webapp/src/main/java/org/libreplan/web/dashboard/IDashboardModel.java b/libreplan-webapp/src/main/java/org/libreplan/web/dashboard/IDashboardModel.java index 0411ad222..d0f5dc7e3 100644 --- a/libreplan-webapp/src/main/java/org/libreplan/web/dashboard/IDashboardModel.java +++ b/libreplan-webapp/src/main/java/org/libreplan/web/dashboard/IDashboardModel.java @@ -77,6 +77,10 @@ interface IDashboardModel { Map calculateTaskCompletion(); + /* Resources KPI: "Overtime Ratio" */ Map calculateEstimationAccuracy(); + // (Load + Overload) / Load + BigDecimal getOvertimeRatio(); + } diff --git a/libreplan-webapp/src/main/webapp/dashboard/_dashboardfororder.zul b/libreplan-webapp/src/main/webapp/dashboard/_dashboardfororder.zul index 61cefce43..cb83413e5 100644 --- a/libreplan-webapp/src/main/webapp/dashboard/_dashboardfororder.zul +++ b/libreplan-webapp/src/main/webapp/dashboard/_dashboardfororder.zul @@ -113,6 +113,20 @@ + + + + + + + + + + + +