From 217f702d6f276094641f7b14e76d19246a4510dc Mon Sep 17 00:00:00 2001 From: Lorenzo Tilve Date: Fri, 8 Jan 2010 12:01:34 +0100 Subject: [PATCH] ItEr41S14CUInformeTraballadorCustesHoraItEr40S19: Order costs per resource report --- .../costcategories/daos/CostCategoryDAO.java | 28 +- .../costcategories/entities/HourCost.java | 8 + .../ResourcesCostCategoryAssignment.java | 1 + .../business/orders/daos/IOrderDAO.java | 12 +- .../business/orders/daos/OrderDAO.java | 79 +++++ .../business/orders/entities/Order.java | 5 + .../orders/entities/OrderElement.java | 14 +- .../dtos/OrderCostsPerResourceDTO.java | 217 ++++++++++++ .../jasper/orderCostsPerResourceReport.jrxml | 313 ++++++++++++++++++ .../web/common/CustomMenuController.java | 12 +- .../reports/IOrderCostsPerResourceModel.java | 22 ++ .../OrderCostsPerResourceController.java | 126 +++++++ .../reports/OrderCostsPerResourceModel.java | 119 +++++++ .../reports/OrderCostsPerResourceReport.java | 32 ++ .../webapp/reports/orderCostsPerResource.zul | 136 ++++++++ 15 files changed, 1107 insertions(+), 17 deletions(-) create mode 100644 navalplanner-business/src/main/java/org/navalplanner/business/reports/dtos/OrderCostsPerResourceDTO.java create mode 100644 navalplanner-webapp/src/main/jasper/orderCostsPerResourceReport.jrxml create mode 100644 navalplanner-webapp/src/main/java/org/navalplanner/web/reports/IOrderCostsPerResourceModel.java create mode 100644 navalplanner-webapp/src/main/java/org/navalplanner/web/reports/OrderCostsPerResourceController.java create mode 100644 navalplanner-webapp/src/main/java/org/navalplanner/web/reports/OrderCostsPerResourceModel.java create mode 100644 navalplanner-webapp/src/main/java/org/navalplanner/web/reports/OrderCostsPerResourceReport.java create mode 100644 navalplanner-webapp/src/main/webapp/reports/orderCostsPerResource.zul diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/costcategories/daos/CostCategoryDAO.java b/navalplanner-business/src/main/java/org/navalplanner/business/costcategories/daos/CostCategoryDAO.java index 5c04b4302..3a9f6dc9d 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/costcategories/daos/CostCategoryDAO.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/costcategories/daos/CostCategoryDAO.java @@ -20,16 +20,22 @@ package org.navalplanner.business.costcategories.daos; +import java.math.BigDecimal; import java.util.ArrayList; import java.util.List; import org.hibernate.Criteria; import org.hibernate.criterion.Restrictions; +import org.joda.time.LocalDate; import org.navalplanner.business.common.daos.GenericDAOHibernate; import org.navalplanner.business.costcategories.entities.CostCategory; +import org.navalplanner.business.costcategories.entities.HourCost; +import org.navalplanner.business.costcategories.entities.ResourcesCostCategoryAssignment; +import org.navalplanner.business.resources.entities.Resource; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Repository; +import org.springframework.transaction.annotation.Transactional; /** * @author Jacobo Aragunde Perez @@ -39,7 +45,6 @@ import org.springframework.stereotype.Repository; public class CostCategoryDAO extends GenericDAOHibernate implements ICostCategoryDAO { - @Override public List findActive() { @@ -50,4 +55,25 @@ public class CostCategoryDAO extends GenericDAOHibernate list.addAll(c.list()); return list; } + + @Transactional(readOnly = true) + public static BigDecimal getPriceByResourceDateAndHourType( + Resource resource, + LocalDate date, String type) { + + for (ResourcesCostCategoryAssignment each : resource + .getResourcesCostCategoryAssignments()) { + if ((date.isAfter(each.getInitDate())) + && (!date.isBefore(each.getInitDate()))) { + for (HourCost hourCost : each.getCostCategory().getHourCosts()) { + if (hourCost.isActiveAtDate(date) + && hourCost.getType().getCode().equals(type)) { + return hourCost.getPriceCost(); + } + } + } + } + return null; + } + } diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/costcategories/entities/HourCost.java b/navalplanner-business/src/main/java/org/navalplanner/business/costcategories/entities/HourCost.java index 77ba00667..3bcf50c4c 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/costcategories/entities/HourCost.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/costcategories/entities/HourCost.java @@ -109,6 +109,14 @@ public class HourCost extends BaseEntity { category.addHourCost(this); } + public boolean isActiveAtDate(LocalDate date) { + if ((date.isAfter(this.getInitDate())) + && (!date.isBefore(this.getInitDate()))) { + return true; + } + return false; + } + @AssertTrue(message="The end date cannot be before the init date") public boolean checkPositiveTimeInterval() { if (endDate == null) { diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/costcategories/entities/ResourcesCostCategoryAssignment.java b/navalplanner-business/src/main/java/org/navalplanner/business/costcategories/entities/ResourcesCostCategoryAssignment.java index 91bcda50c..611ae0c3b 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/costcategories/entities/ResourcesCostCategoryAssignment.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/costcategories/entities/ResourcesCostCategoryAssignment.java @@ -97,4 +97,5 @@ public class ResourcesCostCategoryAssignment extends BaseEntity { } return (endDate.isAfter(initDate) || initDate.equals(endDate)); } + } diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/orders/daos/IOrderDAO.java b/navalplanner-business/src/main/java/org/navalplanner/business/orders/daos/IOrderDAO.java index 9582296eb..caa36fc3e 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/orders/daos/IOrderDAO.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/orders/daos/IOrderDAO.java @@ -20,22 +20,32 @@ package org.navalplanner.business.orders.daos; +import java.util.Date; import java.util.List; import org.navalplanner.business.common.daos.IGenericDAO; import org.navalplanner.business.orders.entities.Order; +import org.navalplanner.business.reports.dtos.OrderCostsPerResourceDTO; /** * Contract for {@link OrderDAO} * @author Óscar González Fernández + * @author Lorenzo Tilve Álvaro */ public interface IOrderDAO extends IGenericDAO { /** * Gets all the orders. - * * @return A {@link List} of {@link Order} objects */ List getOrders(); + /** + * Builds contents for OrderCostsPerResource report + * @return A {@link List} of {@link OrderCostsPerResourceDTO} objects for + * reporting + */ + List getOrderCostsPerResource(List orders, + Date startingDate, Date endingDate); + } diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/orders/daos/OrderDAO.java b/navalplanner-business/src/main/java/org/navalplanner/business/orders/daos/OrderDAO.java index b0d7b1a03..c682966c5 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/orders/daos/OrderDAO.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/orders/daos/OrderDAO.java @@ -20,21 +20,32 @@ package org.navalplanner.business.orders.daos; +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.Date; import java.util.List; +import org.hibernate.Query; +import org.joda.time.LocalDate; import org.navalplanner.business.common.daos.GenericDAOHibernate; import org.navalplanner.business.common.exceptions.InstanceNotFoundException; +import org.navalplanner.business.costcategories.daos.CostCategoryDAO; +import org.navalplanner.business.costcategories.daos.ITypeOfWorkHoursDAO; +import org.navalplanner.business.costcategories.entities.TypeOfWorkHours; import org.navalplanner.business.orders.entities.Order; import org.navalplanner.business.orders.entities.TaskSource; import org.navalplanner.business.planner.daos.ITaskSourceDAO; +import org.navalplanner.business.reports.dtos.OrderCostsPerResourceDTO; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Repository; +import org.springframework.transaction.annotation.Transactional; /** * Dao for {@link Order} * @author Óscar González Fernández + * @author Lorenzo Tilve Álvaro */ @Repository @Scope(BeanDefinition.SCOPE_SINGLETON) @@ -44,6 +55,9 @@ public class OrderDAO extends GenericDAOHibernate implements @Autowired private ITaskSourceDAO taskSourceDAO; + @Autowired + private ITypeOfWorkHoursDAO typeOfWorkHoursDAO; + @Override public List getOrders() { return list(Order.class); @@ -59,4 +73,69 @@ public class OrderDAO extends GenericDAOHibernate implements super.remove(id); } + private boolean isOrderNameContained(String code, List orders) { + for (Order each:orders) { + if (each.getCode().equals(code)) { + return true; + } + } + return false; + } + + @Override + @Transactional(readOnly = true) + public List getOrderCostsPerResource( + List orders, Date startingDate, Date endingDate) { + + String orderStrQuery = "FROM Order order "; + Query orderQuery = getSession().createQuery(orderStrQuery); + List orderList = orderQuery.list(); + + String strQuery = "SELECT new org.navalplanner.business.reports.dtos.OrderCostsPerResourceDTO(worker, wrl) " + + "FROM Worker worker, WorkReportLine wrl " + + "LEFT OUTER JOIN wrl.resource resource " + + "WHERE resource.id = worker.id "; + + // Order by + strQuery += "ORDER BY worker.id, wrl.date"; + + Query query = getSession().createQuery(strQuery); + List list = query.list(); + + List filteredList = new ArrayList(); + for (OrderCostsPerResourceDTO each : list) { + + Order order = each.getOrderElement().getOrder(); + + // Apply filtering + if (orders.isEmpty() + || isOrderNameContained(order.getCode(), orders)) { + + // Attach ordername value + each.setOrderName(order.getName()); + + // Attach calculated pricePerHour + BigDecimal pricePerHour = CostCategoryDAO + .getPriceByResourceDateAndHourType(each.getWorker(), + new LocalDate(each.getDate()), each + .getHoursType()); + if (pricePerHour == null) { + for (TypeOfWorkHours defaultprice : typeOfWorkHoursDAO + .list(TypeOfWorkHours.class)) { + if (defaultprice.getCode().equals(each.getHoursType())) { + pricePerHour = defaultprice.getDefaultPrice(); + } + } + } + + each.setCostPerHour(pricePerHour); + each.setCost(each.getCostPerHour().multiply( + new BigDecimal(each.getNumHours()))); + + filteredList.add(each); + } + } + return filteredList; + } + } \ No newline at end of file diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/orders/entities/Order.java b/navalplanner-business/src/main/java/org/navalplanner/business/orders/entities/Order.java index 8743b7ada..ab12dc668 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/orders/entities/Order.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/orders/entities/Order.java @@ -234,6 +234,11 @@ public class Order extends OrderLineGroup { return true; } + @Override + public Order getOrder() { + return this; + } + @Override public OrderTemplate createTemplate() { return OrderTemplate.create(this); diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/orders/entities/OrderElement.java b/navalplanner-business/src/main/java/org/navalplanner/business/orders/entities/OrderElement.java index bde8af31c..6945632df 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/orders/entities/OrderElement.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/orders/entities/OrderElement.java @@ -718,15 +718,13 @@ public abstract class OrderElement extends BaseEntity implements } public Order getOrder() { - if (this instanceof Order) { - return (Order) this; + Order order; + try { + order = parent.getOrder(); + } catch (Exception e) { + throw new RuntimeException(e); } - - if (parent != null) { - return parent.getOrder(); - } - - return null; + return order; } @Valid diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/reports/dtos/OrderCostsPerResourceDTO.java b/navalplanner-business/src/main/java/org/navalplanner/business/reports/dtos/OrderCostsPerResourceDTO.java new file mode 100644 index 000000000..8c42b1d22 --- /dev/null +++ b/navalplanner-business/src/main/java/org/navalplanner/business/reports/dtos/OrderCostsPerResourceDTO.java @@ -0,0 +1,217 @@ +/* + * This file is part of ###PROJECT_NAME### + * + * Copyright (C) 2009 Fundación para o Fomento da Calidade Industrial e + * Desenvolvemento Tecnolóxico de Galicia + * + * 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 + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package org.navalplanner.business.reports.dtos; + +import java.math.BigDecimal; +import java.util.Date; +import java.util.Set; + +import org.navalplanner.business.labels.entities.Label; +import org.navalplanner.business.orders.entities.OrderElement; +import org.navalplanner.business.resources.entities.Worker; +import org.navalplanner.business.workreports.entities.WorkReportLine; +import org.navalplanner.business.workreports.valueobjects.DescriptionValue; + +public class OrderCostsPerResourceDTO implements + Comparable { + + private String workerName; + + private Date date; + + private Date clockStart; + + private Date clockFinish; + + private Integer numHours; + + private String orderElementCode; + + private String descriptionValues; + + private String labels; + + private String hoursType; + + // Attached outside the DTO + private BigDecimal cost; + + // Attached outside the DTO + private BigDecimal costPerHour; + + // Attached outside the DTO + private String orderName; + + private OrderElement orderElement; + + private Worker worker; + + public OrderCostsPerResourceDTO(Worker worker, + WorkReportLine workReportLine) { + + this.workerName = worker.getName(); + this.date = workReportLine.getDate(); + this.clockStart = workReportLine.getClockStart(); + this.clockFinish = workReportLine.getClockFinish(); + this.numHours = workReportLine.getNumHours(); + this.descriptionValues = descriptionValuesAsString(workReportLine.getDescriptionValues()); + this.labels = labelsAsString(workReportLine.getLabels()); + this.hoursType = workReportLine.getTypeOfWorkHours().getCode(); + this.orderElement = workReportLine.getOrderElement(); + this.orderElementCode = workReportLine.getOrderElement().getCode(); + this.worker = worker; + } + + private String labelsAsString(Set