diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/resources/entities/Resource.java b/navalplanner-business/src/main/java/org/navalplanner/business/resources/entities/Resource.java index 96840ece3..14a2ea9e3 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/resources/entities/Resource.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/resources/entities/Resource.java @@ -1,3 +1,4 @@ + package org.navalplanner.business.resources.entities; import java.util.ArrayList; @@ -26,6 +27,7 @@ import org.navalplanner.business.resources.daos.ResourcesDaoRegistry; /** * This class acts as the base class for all resources. * @author Fernando Bellas Permuy + * @author Susana Montes Pedreira */ public abstract class Resource { @@ -35,6 +37,8 @@ public abstract class Resource { private Set criterionSatisfactions = new HashSet(); + public abstract String getDescription(); + private interface Predicate { public boolean accepts(CriterionSatisfaction satisfaction); } diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/resources/entities/Worker.java b/navalplanner-business/src/main/java/org/navalplanner/business/resources/entities/Worker.java index 3946765ed..89b6f1e39 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/resources/entities/Worker.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/resources/entities/Worker.java @@ -6,6 +6,7 @@ import org.hibernate.validator.NotEmpty; /** * This class models a worker. * @author Fernando Bellas Permuy + * @author Susana Montes Pedreira */ public class Worker extends Resource { @NotEmpty @@ -30,6 +31,11 @@ public class Worker extends Resource { this.dailyHours = dailyHours; } + @Override + public String getDescription(){ + return getFirstName()+" "+getSurname(); + } + public String getFirstName() { return firstName; } diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/workreports/daos/IWorkReportLineDAO.java b/navalplanner-business/src/main/java/org/navalplanner/business/workreports/daos/IWorkReportLineDAO.java index f6c5fb782..0ab56d077 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/workreports/daos/IWorkReportLineDAO.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/workreports/daos/IWorkReportLineDAO.java @@ -1,13 +1,16 @@ package org.navalplanner.business.workreports.daos; +import java.util.List; import org.navalplanner.business.common.daos.IGenericDao; +import org.navalplanner.business.orders.entities.OrderElement; import org.navalplanner.business.workreports.entities.WorkReportLine; /** * Dao for {@link WorkReportLine} * * @author Diego Pino García + * @author Susana Montes Pedreira */ -public interface IWorkReportLineDAO extends IGenericDao { - +public interface IWorkReportLineDAO extends IGenericDao{ + public List findByOrderElement(OrderElement orderElement); } diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/workreports/daos/WorkReportLineDAO.java b/navalplanner-business/src/main/java/org/navalplanner/business/workreports/daos/WorkReportLineDAO.java index cfc1951e6..8f145f4df 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/workreports/daos/WorkReportLineDAO.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/workreports/daos/WorkReportLineDAO.java @@ -1,19 +1,33 @@ package org.navalplanner.business.workreports.daos; +import java.util.List; import org.navalplanner.business.common.daos.impl.GenericDaoHibernate; import org.navalplanner.business.workreports.entities.WorkReportLine; +import org.navalplanner.business.orders.entities.OrderElement; +import org.springframework.stereotype.Repository; +import org.hibernate.Criteria; +import org.hibernate.criterion.Restrictions; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.context.annotation.Scope; -import org.springframework.stereotype.Repository; +import org.springframework.stereotype.Service; + /** * Dao for {@link WorkReportLineDAO} * * @author Diego Pino García + * @author Susana Montes Pedreira */ +@Service @Repository @Scope(BeanDefinition.SCOPE_SINGLETON) public class WorkReportLineDAO extends GenericDaoHibernate implements IWorkReportLineDAO { + @Override + public List findByOrderElement(OrderElement orderElement){ + Criteria c = getSession().createCriteria(WorkReportLine.class).createCriteria("orderElement"); + c.add(Restrictions.idEq(orderElement.getId())); + return (List)c.list(); + } } diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/workreports/entities/WorkReportLine.java b/navalplanner-business/src/main/java/org/navalplanner/business/workreports/entities/WorkReportLine.java index 45fd09730..3973cdad2 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/workreports/entities/WorkReportLine.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/workreports/entities/WorkReportLine.java @@ -8,6 +8,7 @@ import org.navalplanner.business.resources.entities.Resource; /** * @author Diego Pino García + * @author Susana Montes Pedreira */ public class WorkReportLine { @@ -74,11 +75,11 @@ public class WorkReportLine { return criterions; } - public void setCriterions(Set criterions) { + public void setCriterions(Set criterions){ this.criterions = criterions; } - public WorkReport getWorkReport() { + public WorkReport getWorkReport(){ return workReport; } diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/AsignedHoursToOrderElementController.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/AsignedHoursToOrderElementController.java new file mode 100644 index 000000000..05cee0f11 --- /dev/null +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/AsignedHoursToOrderElementController.java @@ -0,0 +1,62 @@ +package org.navalplanner.web.orders; + +import java.util.List; +import org.navalplanner.business.workreports.entities.WorkReportLine; +import org.zkoss.zul.Window; +import org.navalplanner.web.common.Util; +import org.zkoss.zk.ui.util.GenericForwardComposer; +import org.zkoss.zk.ui.Component; + +/** + * Controller for show the asigned hours of the selected order element
+ * + * @author Susana Montes Pedreria + */ +public class AsignedHoursToOrderElementController extends + GenericForwardComposer { + + private Window window; + + IAsignedHoursToOrderElementModel asignedHoursToOrderElementModel; + + @Override + public void doAfterCompose(Component comp) throws Exception { + super.doAfterCompose(comp.getFellow("listOrderElementHours")); + comp.setVariable("asignedHoursToOrderElementController", this, true); + window = (Window) comp; + } + + public List getWorkReportLines() { + return asignedHoursToOrderElementModel.getWorkReportLines(); + } + + public int getTotalAsignedDirectHours() { + return asignedHoursToOrderElementModel.getAsignedDirectHours(); + } + + public int getTotalAsignedHours() { + return asignedHoursToOrderElementModel.getTotalAsignedHours(); + } + + public void back() { + window.setVisible(false); + Util.reloadBindings(window.getParent()); + } + + public int getHoursChildren() { + return asignedHoursToOrderElementModel.getAsignedDirectHoursChildren(); + } + + public int getEstimatedHours() { + return asignedHoursToOrderElementModel.getEstimatedHours(); + } + + public int getProgressWork() { + return asignedHoursToOrderElementModel.getProgressWork(); + } + + public void openWindow(IOrderElementModel orderElementModel) { + this.asignedHoursToOrderElementModel.initOrderElement(orderElementModel + .getOrderElement()); + } +} diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/AsignedHoursToOrderElementModel.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/AsignedHoursToOrderElementModel.java new file mode 100644 index 000000000..8c6b707aa --- /dev/null +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/AsignedHoursToOrderElementModel.java @@ -0,0 +1,146 @@ +package org.navalplanner.web.orders; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import org.apache.commons.lang.Validate; +import org.navalplanner.business.orders.entities.OrderElement; +import org.navalplanner.business.workreports.daos.IWorkReportLineDAO; +import org.navalplanner.business.workreports.entities.WorkReportLine; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.beans.factory.config.BeanDefinition; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Service; + +/** + * Service to show the asigned hours of a selected order element + * + * @author Susana Montes Pedreira + */ +@Service +@Scope(BeanDefinition.SCOPE_PROTOTYPE) +public class AsignedHoursToOrderElementModel implements + IAsignedHoursToOrderElementModel { + + @Autowired + private final IWorkReportLineDAO workReportLineDAO; + + private int asignedDirectHours; + + private OrderElement orderElement; + + private List listWRL; + + @Autowired + public AsignedHoursToOrderElementModel(IWorkReportLineDAO workReportLineDAO) { + Validate.notNull(workReportLineDAO); + this.workReportLineDAO = workReportLineDAO; + this.asignedDirectHours = 0; + } + + @Override + @Transactional(readOnly = true) + public List getWorkReportLines() { + if (orderElement == null) { + return new ArrayList(); + } + this.asignedDirectHours = 0; + this.listWRL = workReportLineDAO.findByOrderElement(orderElement); + Iterator iterador = listWRL.iterator(); + while (iterador.hasNext()) { + WorkReportLine w = iterador.next(); + w.getResource().getDailyCapacity(); + w.getOrderElement().getWorkHours(); + w.getWorkReport().getDate(); + this.asignedDirectHours = this.asignedDirectHours + w.getNumHours(); + } + return listWRL; + } + + @Override + public int getAsignedDirectHours() { + if (orderElement == null) { + return 0; + } + return this.asignedDirectHours; + } + + @Override + @Transactional(readOnly = true) + public int getTotalAsignedHours() { + if (orderElement == null) { + return 0; + } + return getAddAsignedHours(this.orderElement); + } + + @Transactional(readOnly = true) + private int getAddAsignedHours(OrderElement orderElement) { + int addAsignedHoursChildren = 0; + if (!orderElement.getChildren().isEmpty()) { + List children = orderElement.getChildren(); + Iterator iterador = children.iterator(); + while (iterador.hasNext()) { + OrderElement w = iterador.next(); + addAsignedHoursChildren = addAsignedHoursChildren + + getAddAsignedHours(w); + } + } + List listWRL = this.workReportLineDAO + .findByOrderElement(orderElement); + return (getAsignedDirectHours_(listWRL) + addAsignedHoursChildren); + } + + @Transactional(readOnly = true) + private int getAsignedDirectHours_(List listWRL) { + int asignedDirectHours = 0; + Iterator iterator = listWRL.iterator(); + while (iterator.hasNext()) { + asignedDirectHours = asignedDirectHours + + iterator.next().getNumHours(); + } + return asignedDirectHours; + } + + @Override + @Transactional(readOnly = true) + public int getAsignedDirectHoursChildren() { + if (orderElement == null) { + return 0; + } + if (orderElement.getChildren().isEmpty()) + return 0; + int asignedDirectChildren = getTotalAsignedHours() + - this.asignedDirectHours; + return asignedDirectChildren; + } + + @Override + @Transactional(readOnly = true) + public void initOrderElement(OrderElement orderElement) { + this.orderElement = orderElement; + } + + @Override + @Transactional(readOnly = true) + public int getEstimatedHours() { + if (orderElement == null) { + return 0; + } + return orderElement.getWorkHours(); + } + + @Override + @Transactional(readOnly = true) + public int getProgressWork() { + if (orderElement == null) { + return 0; + } + double addAsignedHours = getTotalAsignedHours(); + double estimatedHours = getEstimatedHours(); + if (estimatedHours < 1) + return 0; + return (int) (((double) (addAsignedHours / estimatedHours)) * 100); + } +} diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/IAsignedHoursToOrderElementModel.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/IAsignedHoursToOrderElementModel.java new file mode 100644 index 000000000..3bd051461 --- /dev/null +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/IAsignedHoursToOrderElementModel.java @@ -0,0 +1,18 @@ +package org.navalplanner.web.orders; + +import java.util.List; +import org.navalplanner.business.orders.entities.OrderElement; +import org.navalplanner.business.workreports.entities.WorkReportLine; + +/** + * @author Susana Montes Pedreira + */ +public interface IAsignedHoursToOrderElementModel{ + public List getWorkReportLines(); + public int getAsignedDirectHours(); + public int getTotalAsignedHours(); + public int getAsignedDirectHoursChildren(); + public void initOrderElement(OrderElement orderElement); + public int getEstimatedHours(); + public int getProgressWork(); +} diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/OrderElementController.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/OrderElementController.java index 15089b6c8..eca0da448 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/OrderElementController.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/OrderElementController.java @@ -42,6 +42,7 @@ import org.zkoss.zul.api.Listhead; * Controller for {@link OrderElement} view of {@link Order} entities
* * @author Manuel Rego Casasnovas + * @author Susana Montes Pedreira */ public class OrderElementController extends GenericForwardComposer { @@ -70,6 +71,8 @@ public class OrderElementController extends GenericForwardComposer { */ private Set selectedCriterionTypes = new LinkedHashSet(); + private AsignedHoursToOrderElementController asignedHoursController; + public OrderElement getOrderElement() { if (model == null) { return new OrderLine(); @@ -154,10 +157,17 @@ public class OrderElementController extends GenericForwardComposer { public void doAfterCompose(Component comp) throws Exception { super.doAfterCompose(comp); comp.setVariable("orderElementController", this, true); - window = (Window) comp; + setupAsignedHoursToOrderElementController(comp); } + + private void setupAsignedHoursToOrderElementController(Component comp)throws Exception{ + asignedHoursController = new AsignedHoursToOrderElementController(); + asignedHoursController.doAfterCompose(comp); + } + + /** * Open the window to edit a {@link OrderElement}. If it's a * {@link OrderLineGroup} less fields will be enabled. @@ -165,12 +175,14 @@ public class OrderElementController extends GenericForwardComposer { * @param orderElement * The {@link OrderElement} to be edited */ - public void openWindow(IOrderElementModel model) { + public void openWindow(IOrderElementModel model){ this.model = model; final OrderElement orderElement = model.getOrderElement(); + asignedHoursController.openWindow(model); + // If is a container if (orderElement instanceof OrderLineGroup) { // Disable fields just used in the OrderLine diff --git a/navalplanner-webapp/src/main/webapp/orders/_editOrderElement.zul b/navalplanner-webapp/src/main/webapp/orders/_editOrderElement.zul index 8f25b3ec1..b2d95c4e5 100644 --- a/navalplanner-webapp/src/main/webapp/orders/_editOrderElement.zul +++ b/navalplanner-webapp/src/main/webapp/orders/_editOrderElement.zul @@ -1,6 +1,12 @@ - - + + + + + + + + + + + + + + + + diff --git a/navalplanner-webapp/src/main/webapp/orders/_listOrderElementHours.zul b/navalplanner-webapp/src/main/webapp/orders/_listOrderElementHours.zul new file mode 100644 index 000000000..3bc984529 --- /dev/null +++ b/navalplanner-webapp/src/main/webapp/orders/_listOrderElementHours.zul @@ -0,0 +1,68 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +