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 1873c1355..7135b97f3 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 @@ -29,6 +29,7 @@ import java.util.Set; import org.libreplan.business.orders.entities.Order; import org.libreplan.business.planner.entities.TaskStatusEnum; import org.libreplan.web.dashboard.DashboardModel.Interval; +import org.libreplan.web.planner.order.OrderPlanningController; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; @@ -72,8 +73,8 @@ public class DashboardController extends GenericForwardComposer { super.doAfterCompose(comp); } - public void setCurrentOrder(Order order) { - dashboardModel.setCurrentOrder(order); + public void setCurrentOrder(Order order, OrderPlanningController orderPlanningController) { + dashboardModel.setCurrentOrder(order, orderPlanningController); if (dashboardModel.tasksAvailable()) { if (self != null) { renderGlobalProgress(); 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 9e6720ee9..4c448b127 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 @@ -48,6 +48,7 @@ import org.libreplan.business.planner.entities.visitors.CalculateFinishedTasksEs import org.libreplan.business.planner.entities.visitors.CalculateFinishedTasksLagInCompletionVisitor; import org.libreplan.business.planner.entities.visitors.ResetTasksStatusVisitor; import org.libreplan.business.workingday.EffortDuration; +import org.libreplan.web.planner.order.OrderPlanningController; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.context.annotation.Scope; @@ -80,6 +81,7 @@ public class DashboardModel implements IDashboardModel { public static double LTC_STRETCHES_MAX_VALUE = 0; private Order currentOrder; + private OrderPlanningController orderPlanningController; private Integer taskCount = null; private final Map taskStatusStats; @@ -95,10 +97,12 @@ public class DashboardModel implements IDashboardModel { } @Override - public void setCurrentOrder(Order order) { + public void setCurrentOrder(Order order, OrderPlanningController orderPlanningController) { this.currentOrder = order; + this.orderPlanningController = orderPlanningController; this.taskCount = null; if (tasksAvailable()) { + this.calculateGlobalProgress(); this.calculateTaskStatusStatistics(); this.calculateTaskViolationStatusStatistics(); this.calculateAbsoluteMarginWithDeadLine(); @@ -147,13 +151,18 @@ public class DashboardModel implements IDashboardModel { } /* Progress KPI: "Global Progress of the Project" */ - @Override - public BigDecimal getAdvancePercentageByHours() { - TaskGroup rootTask = (TaskGroup) getRootTask(); + private void calculateGlobalProgress() { + TaskGroup rootTask = getRootTask(); if (rootTask == null) { throw new RuntimeException("Root task is null"); } - return asPercentage(rootTask.getProgressAllByNumHours()); + rootTask.updateCriticalPathProgress(orderPlanningController + .getCriticalPath()); + } + + @Override + public BigDecimal getAdvancePercentageByHours() { + return asPercentage(getRootTask().getProgressAllByNumHours()); } private BigDecimal asPercentage(BigDecimal value) { @@ -163,49 +172,29 @@ public class DashboardModel implements IDashboardModel { @Override public BigDecimal getExpectedAdvancePercentageByHours() { - TaskGroup rootTask = (TaskGroup) getRootTask(); - if (rootTask == null) { - throw new RuntimeException("Root task is null"); - } - return asPercentage(rootTask + return asPercentage(getRootTask() .getTheoreticalProgressByNumHoursForAllTasksUntilNow()); } @Override public BigDecimal getCriticalPathProgressByNumHours() { - TaskGroup rootTask = (TaskGroup) getRootTask(); - if (rootTask == null) { - throw new RuntimeException("Root task is null"); - } - return asPercentage(rootTask.getCriticalPathProgressByNumHours()); + return asPercentage(getRootTask().getCriticalPathProgressByNumHours()); } @Override public BigDecimal getExpectedCriticalPathProgressByNumHours() { - TaskGroup rootTask = (TaskGroup) getRootTask(); - if (rootTask == null) { - throw new RuntimeException("Root task is null"); - } - return asPercentage(rootTask + return asPercentage(getRootTask() .getTheoreticalProgressByNumHoursForCriticalPathUntilNow()); } @Override public BigDecimal getCriticalPathProgressByDuration() { - TaskGroup rootTask = (TaskGroup) getRootTask(); - if (rootTask == null) { - throw new RuntimeException("Root task is null"); - } - return asPercentage(rootTask.getCriticalPathProgressByDuration()); + return asPercentage(getRootTask().getCriticalPathProgressByDuration()); } @Override public BigDecimal getExpectedCriticalPathProgressByDuration() { - TaskGroup rootTask = (TaskGroup) getRootTask(); - if (rootTask == null) { - throw new RuntimeException("Root task is null"); - } - return asPercentage(rootTask + return asPercentage(getRootTask() .getTheoreticalProgressByDurationForCriticalPathUntilNow()); } @@ -223,7 +212,7 @@ public class DashboardModel implements IDashboardModel { this.marginWithDeadLine = null; return; } - TaskElement rootTask = getRootTask(); + TaskGroup rootTask = getRootTask(); Days orderDuration = Days.daysBetween(rootTask.getStartAsLocalDate(), rootTask.getEndAsLocalDate()); @@ -490,7 +479,7 @@ public class DashboardModel implements IDashboardModel { } } - private TaskElement getRootTask() { + private TaskGroup getRootTask() { return currentOrder.getAssociatedTaskElement(); } 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 c9fa5fff4..296cc4816 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 @@ -25,10 +25,11 @@ import java.util.Map; import org.libreplan.business.orders.entities.Order; import org.libreplan.business.planner.entities.TaskStatusEnum; import org.libreplan.web.dashboard.DashboardModel.Interval; +import org.libreplan.web.planner.order.OrderPlanningController; interface IDashboardModel { - void setCurrentOrder(Order order); + void setCurrentOrder(Order order, OrderPlanningController orderPlanningController); boolean tasksAvailable(); diff --git a/libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningModel.java b/libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningModel.java index b54ac4562..f4d91f400 100644 --- a/libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningModel.java +++ b/libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningModel.java @@ -58,7 +58,6 @@ import org.libreplan.business.planner.entities.ICostCalculator; import org.libreplan.business.planner.entities.IOrderEarnedValueCalculator; import org.libreplan.business.planner.entities.IOrderResourceLoadCalculator; import org.libreplan.business.planner.entities.TaskElement; -import org.libreplan.business.planner.entities.TaskGroup; import org.libreplan.business.resources.entities.CriterionSatisfaction; import org.libreplan.business.resources.entities.Resource; import org.libreplan.business.scenarios.IScenarioManager; @@ -398,25 +397,11 @@ public class OrderPlanningModel implements IOrderPlanningModel { // Calculate critical path progress, needed for 'Project global progress' chart in Dashboard view planner.addGraphChangeListenersFromConfiguration(configuration); - updateCriticalPathProgress(); long overalProgressContentTime = System.currentTimeMillis(); PROFILING_LOG.info("overalProgressContent took: " + (System.currentTimeMillis() - overalProgressContentTime)); } - /** - * First time a project is loaded, it's needed to calculate the theoretical - * critical path progress and real critical path progress. These values are - * later updated whenever the project is saved - */ - private void updateCriticalPathProgress() { - if (planningState.isEmpty() || planner == null) { - return; - } - TaskGroup rootTask = planningState.getRootTask(); - rootTask.updateCriticalPathProgress(planner.getCriticalPath()); - } - private OrderEarnedValueChartFiller earnedValueChartFiller; private void setupAdvanceAssignmentPlanningController(final Planner planner, diff --git a/libreplan-webapp/src/main/java/org/libreplan/web/planner/tabs/DashboardTabCreator.java b/libreplan-webapp/src/main/java/org/libreplan/web/planner/tabs/DashboardTabCreator.java index a59dce413..e393ea03f 100644 --- a/libreplan-webapp/src/main/java/org/libreplan/web/planner/tabs/DashboardTabCreator.java +++ b/libreplan-webapp/src/main/java/org/libreplan/web/planner/tabs/DashboardTabCreator.java @@ -30,8 +30,8 @@ import org.libreplan.business.common.IOnTransaction; import org.libreplan.business.common.Registry; import org.libreplan.business.orders.entities.Order; import org.libreplan.web.dashboard.DashboardController; +import org.libreplan.web.planner.order.OrderPlanningController; import org.libreplan.web.planner.order.PlanningStateCreator; -import org.libreplan.web.planner.order.PlanningStateCreator.IActionsOnRetrieval; import org.libreplan.web.planner.order.PlanningStateCreator.PlanningState; import org.libreplan.web.planner.tabs.CreatedOnDemandTab.IComponentCreator; import org.zkoss.ganttz.extensions.ITab; @@ -52,23 +52,27 @@ public class DashboardTabCreator { public static ITab create(Mode mode, PlanningStateCreator planningStateCreator, DashboardController dashboardController, + OrderPlanningController orderPlanningController, Component breadcrumbs) { return new DashboardTabCreator(mode, planningStateCreator, - dashboardController, breadcrumbs).build(); + dashboardController, orderPlanningController, breadcrumbs).build(); } private final PlanningStateCreator planningStateCreator; private final Mode mode; private final DashboardController dashboardController; + private final OrderPlanningController orderPlanningController; private final Component breadcrumbs; private DashboardTabCreator(Mode mode, PlanningStateCreator planningStateCreator, DashboardController dashboardController, + OrderPlanningController orderPlanningController, Component breadcrumbs) { this.mode = mode; this.planningStateCreator = planningStateCreator; this.dashboardController = dashboardController; + this.orderPlanningController = orderPlanningController; this.breadcrumbs = breadcrumbs; } @@ -100,7 +104,8 @@ public class DashboardTabCreator { protected void afterShowAction() { PlanningState planningState = getPlanningState(mode.getOrder(), getDesktop()); Order currentOrder = planningState.getOrder(); - dashboardController.setCurrentOrder(currentOrder); + dashboardController.setCurrentOrder(currentOrder, + orderPlanningController); breadcrumbs.getChildren().clear(); breadcrumbs.appendChild(new Image(BREADCRUMBS_SEPARATOR)); breadcrumbs.appendChild(new Label(getSchedulingLabel())); @@ -117,6 +122,7 @@ public class DashboardTabCreator { .getTransactionService(); return transactionService .runOnTransaction(new IOnTransaction() { + @Override public PlanningState execute() { return planningStateCreator.retrieveOrCreate(desktop, order); diff --git a/libreplan-webapp/src/main/java/org/libreplan/web/planner/tabs/MultipleTabsPlannerController.java b/libreplan-webapp/src/main/java/org/libreplan/web/planner/tabs/MultipleTabsPlannerController.java index af3e640aa..3afc61dae 100644 --- a/libreplan-webapp/src/main/java/org/libreplan/web/planner/tabs/MultipleTabsPlannerController.java +++ b/libreplan-webapp/src/main/java/org/libreplan/web/planner/tabs/MultipleTabsPlannerController.java @@ -271,7 +271,7 @@ public class MultipleTabsPlannerController implements Composer, }, parameters); dashboardTab = DashboardTabCreator.create(mode, planningStateCreator, - dashboardController, breadcrumbs); + dashboardController, orderPlanningController, breadcrumbs); final boolean isMontecarloVisible = isMonteCarloVisible(); if (isMontecarloVisible) {