From 369874f7ee0292949df8c3f3ad7e48e8ff2e2b54 Mon Sep 17 00:00:00 2001 From: Susana Montes Pedreira Date: Mon, 7 May 2012 19:47:20 +0100 Subject: [PATCH] Includes the currency format in the expenses module, and in the report of order cost per resource. FEA: ItEr76S24AdapatingProjectsToExpenses --- .../entities/IMoneyCostCalculator.java | 50 ++++++++++++++++--- .../planner/entities/MoneyCostCalculator.java | 20 +++++--- .../jasper/costExpenseSheetLinesReport.jrxml | 9 ++-- .../jasper/costWorkReportLinesReport.jrxml | 15 +++--- .../jasper/orderCostsPerResourceReport.jrxml | 6 +++ .../ExpenseSheetCRUDController.java | 5 ++ .../AssignedHoursToOrderElementModel.java | 8 +-- .../web/planner/TaskElementAdapter.java | 46 ++++++++++------- .../main/webapp/expensesheet/expenseSheet.zul | 5 +- .../webapp/orders/_listOrderElementHours.zul | 36 +++++++++---- 10 files changed, 142 insertions(+), 58 deletions(-) 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 22cbc81cc..7fcbfbc02 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 @@ -27,6 +27,7 @@ import org.libreplan.business.orders.entities.OrderElement; * Interface to calculate the money cost of a {@link TaskElement}. * * @author Manuel Rego Casasnovas + * @author Susana Montes Pedreira */ public interface IMoneyCostCalculator { @@ -44,11 +45,14 @@ public interface IMoneyCostCalculator { * the cost categories, the price used is the default one for the type of * hour. * + * In addition, it includes the costs because of expenses. + * * @param The * {@link OrderElement} to calculate the money cost - * @return Money cost of the order element and all its children + * @return Money cost of the order element and all its children, including the + * costs because of hours and because of expenses. */ - // BigDecimal getMoneyCost(OrderElement orderElement); + BigDecimal getTotalMoneyCost(OrderElement orderElement); /** * Resets the map used to save cached values of money cost for each @@ -56,10 +60,44 @@ public interface IMoneyCostCalculator { */ void resetMoneyCostMap(); - BigDecimal getCostOfHours(OrderElement orderElement); + /** + * Returns the money cost of a {@link OrderElement} taking into account all + * its children.
+ * + * 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)
+ * + * If there is not relationship between resource and type of hour through + * the cost categories, the price used is the default one for the type of + * hour. + * + * @param The + * {@link OrderElement} to calculate the money cost according + * to the hours + * @return Money cost of the order element and all its children + */ + BigDecimal getHoursMoneyCost(OrderElement orderElement); - BigDecimal getCostOfExpenses(OrderElement orderElement); - - BigDecimal getMoneyCostTotal(OrderElement orderElement); + /** + * Returns the money cost of a {@link OrderElement} taking into account all + * its children.
+ * + * It uses the {@link OrderElement} in order to calculate the cost using the + * following formula:
+ * Sum of its direct expenses and its indirect expenses according to its + * relationship with @{SumExpenses} + * + * If there is not relationship between orderElement and any SumExpenses + * the cost will be zero. + * + * @param The + * {@link OrderElement} to calculate the money cost according to + * the expenses. + * @return Money cost of the order element and all its children + */ + BigDecimal getExpensesMoneyCost(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 d513ce4d6..d23e2dcbb 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 @@ -44,6 +44,7 @@ import org.springframework.stereotype.Component; * be reseted when needed with method {@code resetMoneyCostMap}. * * @author Manuel Rego Casasnovas + * @author Susana Montes Pedreira */ @Component @Scope(BeanDefinition.SCOPE_SINGLETON) @@ -57,7 +58,7 @@ public class MoneyCostCalculator implements IMoneyCostCalculator { private Map moneyCostTotalMap = new HashMap(); - public class MoneyCost { + private class MoneyCost { private BigDecimal costOfHours; private BigDecimal costOfExpenses; @@ -88,21 +89,24 @@ public class MoneyCostCalculator implements IMoneyCostCalculator { } @Override - public BigDecimal getMoneyCostTotal(OrderElement orderElement) { + public BigDecimal getTotalMoneyCost(OrderElement orderElement) { BigDecimal result = BigDecimal.ZERO.setScale(2); - BigDecimal moneyCostOfHours = getCostOfHours(orderElement); + BigDecimal moneyCostOfHours = getHoursMoneyCost(orderElement); if (moneyCostOfHours != null) { result = result.add(moneyCostOfHours); } - BigDecimal moneyCostOfExpenses = getCostOfExpenses(orderElement); + BigDecimal moneyCostOfExpenses = getExpensesMoneyCost(orderElement); if (moneyCostOfExpenses != null) { - result = result.add(moneyCostOfExpenses).setScale(2, RoundingMode.HALF_UP); + result = result.add(moneyCostOfExpenses); + } + if (result != null) { + result = result.setScale(2, RoundingMode.HALF_UP); } return result; } @Override - public BigDecimal getCostOfHours(OrderElement orderElement) { + public BigDecimal getHoursMoneyCost(OrderElement orderElement) { MoneyCost moneyCost = moneyCostTotalMap.get(orderElement); if (moneyCost != null) { BigDecimal result = moneyCost.getCostOfHours(); @@ -113,7 +117,7 @@ public class MoneyCostCalculator implements IMoneyCostCalculator { BigDecimal result = BigDecimal.ZERO.setScale(2); for (OrderElement each : orderElement.getChildren()) { - result = result.add(getCostOfHours(each)); + result = result.add(getHoursMoneyCost(each)); } result = result.add(getMoneyCostFromOwnWorkReportLines(orderElement)) @@ -169,7 +173,7 @@ public class MoneyCostCalculator implements IMoneyCostCalculator { } @Override - public BigDecimal getCostOfExpenses(OrderElement orderElement) { + public BigDecimal getExpensesMoneyCost(OrderElement orderElement) { MoneyCost moneyCost = moneyCostTotalMap.get(orderElement); if (moneyCost != null) { BigDecimal result = moneyCost.getCostOfExpenses(); diff --git a/libreplan-webapp/src/main/jasper/costExpenseSheetLinesReport.jrxml b/libreplan-webapp/src/main/jasper/costExpenseSheetLinesReport.jrxml index 55a803807..0eb163498 100644 --- a/libreplan-webapp/src/main/jasper/costExpenseSheetLinesReport.jrxml +++ b/libreplan-webapp/src/main/jasper/costExpenseSheetLinesReport.jrxml @@ -2,6 +2,7 @@ + @@ -31,10 +32,10 @@ - + - + @@ -130,10 +131,10 @@ - + - + diff --git a/libreplan-webapp/src/main/jasper/costWorkReportLinesReport.jrxml b/libreplan-webapp/src/main/jasper/costWorkReportLinesReport.jrxml index ff9d18cd5..e1ba91ee6 100644 --- a/libreplan-webapp/src/main/jasper/costWorkReportLinesReport.jrxml +++ b/libreplan-webapp/src/main/jasper/costWorkReportLinesReport.jrxml @@ -2,6 +2,7 @@ + @@ -63,10 +64,10 @@ - + - + @@ -159,7 +160,7 @@ - + @@ -192,20 +193,20 @@ - + - + - + - + diff --git a/libreplan-webapp/src/main/jasper/orderCostsPerResourceReport.jrxml b/libreplan-webapp/src/main/jasper/orderCostsPerResourceReport.jrxml index 7c95f58b2..c05837df4 100644 --- a/libreplan-webapp/src/main/jasper/orderCostsPerResourceReport.jrxml +++ b/libreplan-webapp/src/main/jasper/orderCostsPerResourceReport.jrxml @@ -142,6 +142,9 @@ + + + @@ -151,6 +154,9 @@ + + + diff --git a/libreplan-webapp/src/main/java/org/libreplan/web/expensesheet/ExpenseSheetCRUDController.java b/libreplan-webapp/src/main/java/org/libreplan/web/expensesheet/ExpenseSheetCRUDController.java index 38bd01e69..440aeb6d2 100644 --- a/libreplan-webapp/src/main/java/org/libreplan/web/expensesheet/ExpenseSheetCRUDController.java +++ b/libreplan-webapp/src/main/java/org/libreplan/web/expensesheet/ExpenseSheetCRUDController.java @@ -478,6 +478,7 @@ public class ExpenseSheetCRUDController extends BaseCRUDController }); dbValue.setConstraint(checkConstraintExpenseValue()); + dbValue.setFormat(Util.getMoneyFormat()); row.appendChild(dbValue); } @@ -626,4 +627,8 @@ public class ExpenseSheetCRUDController extends BaseCRUDController return _("Expense sheets"); } + public String getCurrencySymbol() { + return Util.getCurrencySymbol(); + } + } diff --git a/libreplan-webapp/src/main/java/org/libreplan/web/orders/AssignedHoursToOrderElementModel.java b/libreplan-webapp/src/main/java/org/libreplan/web/orders/AssignedHoursToOrderElementModel.java index e775ed527..2bf1a2128 100644 --- a/libreplan-webapp/src/main/java/org/libreplan/web/orders/AssignedHoursToOrderElementModel.java +++ b/libreplan-webapp/src/main/java/org/libreplan/web/orders/AssignedHoursToOrderElementModel.java @@ -242,7 +242,7 @@ public class AssignedHoursToOrderElementModel implements IAssignedHoursToOrderEl if (orderElement == null) { return BigDecimal.ZERO; } - return moneyCostCalculator.getMoneyCostTotal(orderElement); + return moneyCostCalculator.getTotalMoneyCost(orderElement); } @Override @@ -267,7 +267,7 @@ public class AssignedHoursToOrderElementModel implements IAssignedHoursToOrderEl if (orderElement == null) { return BigDecimal.ZERO.setScale(2); } - return moneyCostCalculator.getCostOfExpenses(orderElement); + return moneyCostCalculator.getExpensesMoneyCost(orderElement); } @Override @@ -276,7 +276,7 @@ public class AssignedHoursToOrderElementModel implements IAssignedHoursToOrderEl if (orderElement == null) { return BigDecimal.ZERO.setScale(2); } - return moneyCostCalculator.getCostOfHours(orderElement); + return moneyCostCalculator.getHoursMoneyCost(orderElement); } @Override @@ -286,7 +286,7 @@ public class AssignedHoursToOrderElementModel implements IAssignedHoursToOrderEl return BigDecimal.ZERO; } return MoneyCostCalculator.getMoneyCostProportion( - moneyCostCalculator.getMoneyCostTotal(orderElement), orderElement.getBudget()) + moneyCostCalculator.getTotalMoneyCost(orderElement), orderElement.getBudget()) .multiply( new BigDecimal(100)); } diff --git a/libreplan-webapp/src/main/java/org/libreplan/web/planner/TaskElementAdapter.java b/libreplan-webapp/src/main/java/org/libreplan/web/planner/TaskElementAdapter.java index 623e1ce44..32a94416b 100644 --- a/libreplan-webapp/src/main/java/org/libreplan/web/planner/TaskElementAdapter.java +++ b/libreplan-webapp/src/main/java/org/libreplan/web/planner/TaskElementAdapter.java @@ -37,7 +37,6 @@ import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.Date; -import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; @@ -658,29 +657,37 @@ public class TaskElementAdapter { @Override public BigDecimal execute() { - return moneyCostCalculator.getMoneyCostTotal(taskElement + return moneyCostCalculator.getTotalMoneyCost(taskElement .getOrderElement()); } }); } - private Map getMoneyItemizedCost() { + private BigDecimal getHoursMoneyCost() { if ((taskElement == null) || (taskElement.getOrderElement() == null)) { - Map costs = new HashMap(); - costs.put("costHours", BigDecimal.ZERO); - costs.put("costExpenses", BigDecimal.ZERO); - return costs; + return BigDecimal.ZERO; } + return transactionService - .runOnReadOnlyTransaction(new IOnTransaction>() { + .runOnReadOnlyTransaction(new IOnTransaction() { @Override - public Map execute() { - Map costs = new HashMap(); - costs.put("costHours", moneyCostCalculator - .getCostOfHours(taskElement.getOrderElement())); - costs.put("costExpenses", moneyCostCalculator - .getCostOfExpenses(taskElement.getOrderElement())); - return costs; + public BigDecimal execute() { + return moneyCostCalculator.getHoursMoneyCost(taskElement.getOrderElement()); + } + }); + } + + private BigDecimal getExpensesMoneyCost() { + if ((taskElement == null) || (taskElement.getOrderElement() == null)) { + return BigDecimal.ZERO; + } + + return transactionService + .runOnReadOnlyTransaction(new IOnTransaction() { + @Override + public BigDecimal execute() { + return moneyCostCalculator.getExpensesMoneyCost(taskElement + .getOrderElement()); } }); } @@ -1057,15 +1064,16 @@ public class TaskElementAdapter { } else { String budget = Util.addCurrencySymbol(getBudget()); String moneyCost = Util.addCurrencySymbol(getMoneyCost()); - Map mapCosts = getMoneyItemizedCost(); - String costHours = Util.addCurrencySymbol(mapCosts.get("costHours")); - String costExpenses = Util.addCurrencySymbol(mapCosts.get("costExpenses")); + + String costHours = Util.addCurrencySymbol(getHoursMoneyCost()); + String costExpenses = Util.addCurrencySymbol(getExpensesMoneyCost()); result.append( _("Budget: {0}, Consumed: {1} ({2}%)", budget, moneyCost, getMoneyCostBarPercentage().multiply(new BigDecimal(100)))) .append("
"); result.append( - _("cost because of worked hours: {0}€, cost because of expenses: {1}€", +_( + "cost because of worked hours: {0}, cost because of expenses: {1}", costHours, costExpenses)); } diff --git a/libreplan-webapp/src/main/webapp/expensesheet/expenseSheet.zul b/libreplan-webapp/src/main/webapp/expensesheet/expenseSheet.zul index 1cdcd72f5..e4fcc2a97 100644 --- a/libreplan-webapp/src/main/webapp/expensesheet/expenseSheet.zul +++ b/libreplan-webapp/src/main/webapp/expensesheet/expenseSheet.zul @@ -64,7 +64,10 @@ @@ -104,21 +107,30 @@ @@ -215,11 +227,17 @@