From ac430aba6a37eeeddfc1d30a38b501b908b86263 Mon Sep 17 00:00:00 2001 From: Manuel Rego Casasnovas Date: Mon, 19 Mar 2012 11:57:54 +0100 Subject: [PATCH] Using the new MoneyCostCalculator to print the new Money Cost bar FEA: ItEr76S17MoneyCostMonitoringSystem --- .../java/org/zkoss/ganttz/TaskComponent.java | 5 ++- .../data/DefaultFundamentalProperties.java | 23 +++++++++++-- .../data/ITaskFundamentalProperties.java | 7 +++- .../main/java/org/zkoss/ganttz/data/Task.java | 10 ++++++ .../entities/IMoneyCostCalculator.java | 14 ++++---- .../planner/entities/MoneyCostCalculator.java | 24 +++++++++++-- .../entities/MoneyCostCalculatorTest.java | 15 +------- .../org/libreplan/web/orders/OrderModel.java | 15 ++++++-- .../web/planner/TaskElementAdapter.java | 34 +++++++++++++++++-- 9 files changed, 111 insertions(+), 36 deletions(-) diff --git a/ganttzk/src/main/java/org/zkoss/ganttz/TaskComponent.java b/ganttzk/src/main/java/org/zkoss/ganttz/TaskComponent.java index 48940a2ad..fafed5db0 100644 --- a/ganttzk/src/main/java/org/zkoss/ganttz/TaskComponent.java +++ b/ganttzk/src/main/java/org/zkoss/ganttz/TaskComponent.java @@ -520,9 +520,8 @@ public class TaskComponent extends Div implements AfterCompose { public void updateCompletionMoneyCostBar() { if (task.isShowingMoneyCostBar()) { int startPixels = this.task.getBeginDate().toPixels(getMapper()); - // TODO change method, for the moment using getHoursAdvanceEndDate() - String widthMoneyCostBar = pixelsFromStartUntil( - startPixels, this.task.getHoursAdvanceEndDate()) + "px"; + String widthMoneyCostBar = pixelsFromStartUntil(startPixels, + this.task.getMoneyCostBarEndDate()) + "px"; response(null, new AuInvoke(this, "resizeCompletionMoneyCostBar", widthMoneyCostBar)); } else { diff --git a/ganttzk/src/main/java/org/zkoss/ganttz/data/DefaultFundamentalProperties.java b/ganttzk/src/main/java/org/zkoss/ganttz/data/DefaultFundamentalProperties.java index 0c72dd8c2..b768668e9 100644 --- a/ganttzk/src/main/java/org/zkoss/ganttz/data/DefaultFundamentalProperties.java +++ b/ganttzk/src/main/java/org/zkoss/ganttz/data/DefaultFundamentalProperties.java @@ -3,7 +3,7 @@ * * Copyright (C) 2009-2010 Fundación para o Fomento da Calidade Industrial e * Desenvolvemento Tecnolóxico de Galicia - * Copyright (C) 2010-2011 Igalia, S.L. + * Copyright (C) 2010-2012 Igalia, S.L. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by @@ -34,6 +34,7 @@ import org.zkoss.ganttz.data.constraint.Constraint; /** * @author Óscar González Fernández + * @author Manuel Rego Casasnovas */ public class DefaultFundamentalProperties implements ITaskFundamentalProperties { @@ -47,10 +48,14 @@ public class DefaultFundamentalProperties implements ITaskFundamentalProperties private long hoursAdvanceEndDate; + private long moneyCostBarEndDate; + private Date advanceEndDate; private BigDecimal hoursAdvancePercentage; + private BigDecimal moneyCostBarPercentage; + private BigDecimal advancePercentage; private String tooltipText; @@ -65,15 +70,19 @@ public class DefaultFundamentalProperties implements ITaskFundamentalProperties public DefaultFundamentalProperties(String name, Date beginDate, long lengthMilliseconds, String notes, Date hoursAdvanceEndDate, + Date moneyCostBarEndDate, Date advanceEndDate, - BigDecimal hoursAdvancePercentage, BigDecimal advancePercentage) { + BigDecimal hoursAdvancePercentage, + BigDecimal moneyCostBarPercentage, BigDecimal advancePercentage) { this.name = name; this.beginDate = beginDate.getTime(); this.lengthMilliseconds = lengthMilliseconds; this.notes = notes; this.hoursAdvanceEndDate = hoursAdvanceEndDate.getTime(); + this.moneyCostBarEndDate = moneyCostBarEndDate.getTime(); this.advanceEndDate = advanceEndDate; this.hoursAdvancePercentage = hoursAdvancePercentage; + this.moneyCostBarPercentage = moneyCostBarPercentage; this.advancePercentage = advancePercentage; this.tooltipText = "Default tooltip"; this.labelsText = ""; @@ -152,6 +161,11 @@ public class DefaultFundamentalProperties implements ITaskFundamentalProperties return GanttDate.createFrom(new Date(hoursAdvanceEndDate)); } + @Override + public GanttDate getMoneyCostBarEndDate() { + return GanttDate.createFrom(new Date(moneyCostBarEndDate)); + } + @Override public GanttDate getAdvanceEndDate() { return advanceEndDate != null ? GanttDate.createFrom(new Date( @@ -163,6 +177,11 @@ public class DefaultFundamentalProperties implements ITaskFundamentalProperties return hoursAdvancePercentage; } + @Override + public BigDecimal getMoneyCostBarPercentage() { + return moneyCostBarPercentage; + } + @Override public BigDecimal getAdvancePercentage() { return advancePercentage; diff --git a/ganttzk/src/main/java/org/zkoss/ganttz/data/ITaskFundamentalProperties.java b/ganttzk/src/main/java/org/zkoss/ganttz/data/ITaskFundamentalProperties.java index 99e0b9b0b..4136ce609 100644 --- a/ganttzk/src/main/java/org/zkoss/ganttz/data/ITaskFundamentalProperties.java +++ b/ganttzk/src/main/java/org/zkoss/ganttz/data/ITaskFundamentalProperties.java @@ -3,7 +3,7 @@ * * Copyright (C) 2009-2010 Fundación para o Fomento da Calidade Industrial e * Desenvolvemento Tecnolóxico de Galicia - * Copyright (C) 2010-2011 Igalia, S.L. + * Copyright (C) 2010-2012 Igalia, S.L. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by @@ -29,6 +29,7 @@ import org.zkoss.ganttz.data.constraint.Constraint; /** * @author Óscar González Fernández + * @author Manuel Rego Casasnovas */ public interface ITaskFundamentalProperties { @@ -65,10 +66,14 @@ public interface ITaskFundamentalProperties { public GanttDate getHoursAdvanceEndDate(); + public GanttDate getMoneyCostBarEndDate(); + public GanttDate getAdvanceEndDate(); public BigDecimal getHoursAdvancePercentage(); + public BigDecimal getMoneyCostBarPercentage(); + public BigDecimal getAdvancePercentage(); public String getTooltipText(); diff --git a/ganttzk/src/main/java/org/zkoss/ganttz/data/Task.java b/ganttzk/src/main/java/org/zkoss/ganttz/data/Task.java index ebe696bad..1e85d7a8f 100644 --- a/ganttzk/src/main/java/org/zkoss/ganttz/data/Task.java +++ b/ganttzk/src/main/java/org/zkoss/ganttz/data/Task.java @@ -342,6 +342,11 @@ public abstract class Task implements ITaskFundamentalProperties { return fundamentalProperties.getHoursAdvancePercentage(); } + @Override + public BigDecimal getMoneyCostBarPercentage() { + return fundamentalProperties.getMoneyCostBarPercentage(); + } + @Override public BigDecimal getAdvancePercentage() { return fundamentalProperties.getAdvancePercentage(); @@ -352,6 +357,11 @@ public abstract class Task implements ITaskFundamentalProperties { return fundamentalProperties.getHoursAdvanceEndDate(); } + @Override + public GanttDate getMoneyCostBarEndDate() { + return fundamentalProperties.getMoneyCostBarEndDate(); + } + @Override public GanttDate getAdvanceEndDate() { return fundamentalProperties.getAdvanceEndDate(); diff --git a/libreplan-business/src/main/java/org/libreplan/business/planner/entities/IMoneyCostCalculator.java b/libreplan-business/src/main/java/org/libreplan/business/planner/entities/IMoneyCostCalculator.java index 594a51471..40fe17d20 100644 --- a/libreplan-business/src/main/java/org/libreplan/business/planner/entities/IMoneyCostCalculator.java +++ b/libreplan-business/src/main/java/org/libreplan/business/planner/entities/IMoneyCostCalculator.java @@ -31,19 +31,19 @@ import org.libreplan.business.orders.entities.OrderElement; public interface IMoneyCostCalculator { /** - * Returns the money cost of a {@link TaskElement}.
+ * Returns the money cost of a {@link OrderElement} taking into account all + * its children.
* - * It uses the {@link OrderElement} (or OrderElements) associated to the - * {@link TaskElement} in order to calculate the cost using the following - * formula:
+ * It uses the {@link OrderElement} in order to calculate the cost using the + * following formula:
* Sum of all the hours devoted to a task multiplied by the cost of * each hour according to these parameters (type of hour, cost category of * the resource, date of the work report) * * @param The - * {@link TaskElement} to calculate the money cost - * @return Money cost of the task + * {@link OrderElement} to calculate the money cost + * @return Money cost of the order element and all its children */ - BigDecimal getMoneyCost(TaskElement taskElement); + BigDecimal getMoneyCost(OrderElement orderElement); } diff --git a/libreplan-business/src/main/java/org/libreplan/business/planner/entities/MoneyCostCalculator.java b/libreplan-business/src/main/java/org/libreplan/business/planner/entities/MoneyCostCalculator.java index d59e16b5d..09d1322ec 100644 --- a/libreplan-business/src/main/java/org/libreplan/business/planner/entities/MoneyCostCalculator.java +++ b/libreplan-business/src/main/java/org/libreplan/business/planner/entities/MoneyCostCalculator.java @@ -40,6 +40,10 @@ import org.springframework.stereotype.Component; * * @author Manuel Rego Casasnovas */ +/** + * @author mrego + * + */ @Component @Scope(BeanDefinition.SCOPE_SINGLETON) public class MoneyCostCalculator implements IMoneyCostCalculator { @@ -51,9 +55,7 @@ public class MoneyCostCalculator implements IMoneyCostCalculator { private IHourCostDAO hourCostDAO; @Override - public BigDecimal getMoneyCost(TaskElement taskElement) { - OrderElement orderElement = taskElement.getOrderElement(); - + public BigDecimal getMoneyCost(OrderElement orderElement) { List workReportLines = workReportLineDAO .findByOrderElementAndChildren(orderElement, false); @@ -72,4 +74,20 @@ public class MoneyCostCalculator implements IMoneyCostCalculator { return result.setScale(2, RoundingMode.HALF_UP); } + /** + * Divides {@code moneyCost} by {@code budget} if {@code budget} is + * different from 0. Otherwise, returns 0. + * + * @param moneyCost + * @param budget + * @return A BigDecimal from 0 to 1 with the proportion + */ + public static BigDecimal getMoneyCostProportion(BigDecimal moneyCost, + BigDecimal budget) { + if (budget.compareTo(BigDecimal.ZERO) == 0) { + return BigDecimal.ZERO; + } + return moneyCost.divide(budget); + } + } diff --git a/libreplan-business/src/test/java/org/libreplan/business/test/planner/entities/MoneyCostCalculatorTest.java b/libreplan-business/src/test/java/org/libreplan/business/test/planner/entities/MoneyCostCalculatorTest.java index 7227fede8..6f194706c 100644 --- a/libreplan-business/src/test/java/org/libreplan/business/test/planner/entities/MoneyCostCalculatorTest.java +++ b/libreplan-business/src/test/java/org/libreplan/business/test/planner/entities/MoneyCostCalculatorTest.java @@ -18,9 +18,6 @@ */ package org.libreplan.business.test.planner.entities; -import static org.easymock.EasyMock.expect; -import static org.easymock.classextension.EasyMock.createNiceMock; -import static org.easymock.classextension.EasyMock.replay; import static org.hamcrest.CoreMatchers.equalTo; import static org.junit.Assert.assertThat; import static org.libreplan.business.BusinessGlobalNames.BUSINESS_SPRING_CONFIG_FILE; @@ -44,7 +41,6 @@ import org.libreplan.business.orders.entities.OrderElement; import org.libreplan.business.orders.entities.OrderLine; import org.libreplan.business.planner.entities.IMoneyCostCalculator; import org.libreplan.business.planner.entities.MoneyCostCalculator; -import org.libreplan.business.planner.entities.TaskElement; import org.libreplan.business.resources.daos.IResourceDAO; import org.libreplan.business.resources.entities.Resource; import org.libreplan.business.resources.entities.Worker; @@ -97,7 +93,6 @@ public class MoneyCostCalculatorTest { private OrderElement orderElement; private WorkReportType workReportType; private WorkReport workReport; - private TaskElement taskElement; private void givenTypeOfWorkHours() { typeOfWorkHours = TypeOfWorkHours.createUnvalidated( @@ -162,13 +157,6 @@ public class MoneyCostCalculatorTest { workReportDAO.save(workReport); } - private void givenTask() { - taskElement = createNiceMock(TaskElement.class); - expect(taskElement.getOrderElement()).andReturn(orderElement) - .anyTimes(); - replay(taskElement); - } - private void givenBasicExample() { givenTypeOfWorkHours(); givenCostCategory(); @@ -176,13 +164,12 @@ public class MoneyCostCalculatorTest { givenOrderElement(); giveWorkReportType(); givenWorkReport(); - givenTask(); } @Test public void basicTest() throws InstanceNotFoundException { givenBasicExample(); - assertThat(moneyCostCalculator.getMoneyCost(taskElement), + assertThat(moneyCostCalculator.getMoneyCost(orderElement), equalTo(new BigDecimal(500).setScale(2))); } diff --git a/libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderModel.java b/libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderModel.java index 7bf3a985e..3f8a380f5 100644 --- a/libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderModel.java +++ b/libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderModel.java @@ -55,6 +55,8 @@ import org.libreplan.business.orders.entities.HoursGroup; import org.libreplan.business.orders.entities.Order; import org.libreplan.business.orders.entities.OrderElement; import org.libreplan.business.orders.entities.OrderLineGroup; +import org.libreplan.business.planner.entities.IMoneyCostCalculator; +import org.libreplan.business.planner.entities.MoneyCostCalculator; import org.libreplan.business.qualityforms.daos.IQualityFormDAO; import org.libreplan.business.qualityforms.entities.QualityForm; import org.libreplan.business.requirements.entities.DirectCriterionRequirement; @@ -167,6 +169,9 @@ public class OrderModel extends IntegrationEntityModel implements IOrderModel { @Autowired private IOrderVersionDAO orderVersionDAO; + @Autowired + private IMoneyCostCalculator moneyCostCalculator; + @Override @Transactional(readOnly = true) public List