From 833e510e0c09a07e8a2e7fd4fcf68566bbba315e Mon Sep 17 00:00:00 2001 From: Susana Montes Pedreira Date: Wed, 18 Nov 2009 14:02:23 +0100 Subject: [PATCH] ItEr35S17CUObtencionRequisitosEnProxectoPlanificacionItEr34S17 : Change the informative list hours group into orderLineGroup. --- .../business/orders/entities/HoursGroup.java | 7 +- ...onRequirementToOrderElementController.java | 192 +++++++++++++++++- ...iterionRequirementToOrderElementModel.java | 8 +- ...iterionRequirementToOrderElementModel.java | 7 + .../web/orders/OrderCRUDController.java | 2 +- ..._listOrderElementCriterionRequirements.zul | 34 ++-- 6 files changed, 229 insertions(+), 21 deletions(-) diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/orders/entities/HoursGroup.java b/navalplanner-business/src/main/java/org/navalplanner/business/orders/entities/HoursGroup.java index 447f512e8..7ba57bf96 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/orders/entities/HoursGroup.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/orders/entities/HoursGroup.java @@ -149,9 +149,14 @@ public class HoursGroup extends BaseEntity implements Cloneable { public Set getCriterions() { Set criterions = new HashSet(); - for(CriterionRequirement criterionRequirement: criterionRequirements){ + for (CriterionRequirement criterionRequirement : getDirectCriterionRequirement()) { criterions.add(criterionRequirement.getCriterion()); } + for (IndirectCriterionRequirement requirement : getIndirectCriterionRequirement()) { + if (requirement.isIsValid()) { + criterions.add(requirement.getCriterion()); + } + } return Collections.unmodifiableSet(criterions); } diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/AssignedCriterionRequirementToOrderElementController.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/AssignedCriterionRequirementToOrderElementController.java index 2f94354f1..d61d82c23 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/AssignedCriterionRequirementToOrderElementController.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/AssignedCriterionRequirementToOrderElementController.java @@ -24,12 +24,18 @@ import static org.navalplanner.web.I18nHelper._; import java.math.BigDecimal; import java.util.ArrayList; +import java.util.HashMap; +import java.util.HashSet; import java.util.List; +import java.util.Map; +import java.util.Set; import org.apache.commons.logging.LogFactory; import org.navalplanner.business.orders.entities.HoursGroup; import org.navalplanner.business.orders.entities.OrderElement; import org.navalplanner.business.orders.entities.OrderLine; +import org.navalplanner.business.resources.entities.Criterion; +import org.navalplanner.business.resources.entities.CriterionType; import org.navalplanner.business.resources.entities.CriterionWithItsType; import org.navalplanner.business.resources.entities.ResourceEnum; import org.navalplanner.business.workreports.entities.WorkReportLine; @@ -47,11 +53,15 @@ import org.zkoss.zul.Constraint; import org.zkoss.zul.Grid; import org.zkoss.zul.Hbox; import org.zkoss.zul.Intbox; +import org.zkoss.zul.Listbox; +import org.zkoss.zul.Listcell; import org.zkoss.zul.Listitem; +import org.zkoss.zul.ListitemRenderer; import org.zkoss.zul.Messagebox; import org.zkoss.zul.Panel; import org.zkoss.zul.Row; import org.zkoss.zul.Rows; +import org.zkoss.zul.Textbox; import org.zkoss.zul.Vbox; /** @@ -71,7 +81,9 @@ public class AssignedCriterionRequirementToOrderElementController extends private IAssignedCriterionRequirementToOrderElementModel assignedCriterionRequirementToOrderElementModel; - private Vbox vbox; + private Vbox vboxCriterionRequirementsAndHoursGroups; + + private Listbox hoursGroupsInOrderLineGroup; List listResourceTypes = new ArrayList(); @@ -86,7 +98,7 @@ public class AssignedCriterionRequirementToOrderElementController extends super.doAfterCompose(comp); messagesForUser = new MessagesForUser(messagesContainer); comp.setVariable("assignedCriterionRequirementController", this, true); - vbox = (Vbox) comp; + vboxCriterionRequirementsAndHoursGroups = (Vbox) comp; // init the resorcesType listResourceTypes.add(ResourceEnum.MACHINE); @@ -97,6 +109,14 @@ public class AssignedCriterionRequirementToOrderElementController extends return assignedCriterionRequirementToOrderElementModel.getOrderElement(); } + public IOrderModel getOrderModel() { + return assignedCriterionRequirementToOrderElementModel.getOrderModel(); + } + + public Set getCriterionTypes() { + return assignedCriterionRequirementToOrderElementModel.getTypes(); + } + public void setOrderElement(OrderElement orderElement) { assignedCriterionRequirementToOrderElementModel.setOrderElement(orderElement); } @@ -109,7 +129,7 @@ public class AssignedCriterionRequirementToOrderElementController extends public void openWindow(OrderElement orderElement) { assignedCriterionRequirementToOrderElementModel.init(orderElement); - Util.reloadBindings(vbox); + Util.reloadBindings(vboxCriterionRequirementsAndHoursGroups); } public boolean close() { @@ -229,10 +249,14 @@ setValidCriterionRequirementWrapper(requirement, true); Util.reloadBindings(listHoursGroups); } - private void reload() { + public void reload() { Util.reloadBindings(listingRequirements); Util.reloadBindings(orderElementTotalHours); - Util.reloadBindings(listHoursGroups); + if (isReadOnly()) { + Util.reloadBindings(hoursGroupsInOrderLineGroup); + } else { + Util.reloadBindings(listHoursGroups); + } } private boolean showInvalidValues() { @@ -359,7 +383,6 @@ setValidCriterionRequirementWrapper(requirement, true); return assignedCriterionRequirementToOrderElementModel .getHoursGroupsWrappers(); } - /** * Adds a new {@link HoursGroup} to the current {@link OrderElement} The * {@link OrderElement} should be a {@link OrderLine} @@ -514,4 +537,161 @@ setValidCriterionRequirementWrapper(requirement, true); Util.reloadBindings(orderElementTotalHours); } +/*Operations to return the agrouped list of hours Group */ + + /** + * Returns a {@link List} of {@link HoursGroup}. If the current element is + * an {@link OrderLine} this method just returns the {@link HoursGroup} of + * this {@link OrderLine}. Otherwise, this method gets all the + * {@link HoursGroup} of all the children {@link OrderElement}, and + * aggregates them if they have the same {@link Criterion}. + * @return The {@link HoursGroup} list of the current {@link OrderElement} + */ + public List getHoursGroups() { + + if ((getOrderElement() == null) + || (assignedCriterionRequirementToOrderElementModel == null)) { + return new ArrayList(); + } + + // Creates a map in order to join HoursGroup with the same + // Criterions. + Map>, HoursGroup> map = new HashMap>, HoursGroup>(); + + List hoursGroups = getOrderElement().getHoursGroups(); + for (HoursGroup hoursGroup : hoursGroups) { + Map> key = getKeyFor(hoursGroup); + + HoursGroup hoursGroupAggregation = map.get(key); + if (hoursGroupAggregation == null) { + // This is not a real HoursGroup element, it's just an + // aggregation that join HoursGroup with the same Criterions + hoursGroupAggregation = new HoursGroup(); + hoursGroupAggregation.setWorkingHours(hoursGroup + .getWorkingHours()); + hoursGroupAggregation.setCriterionRequirements(hoursGroup + .getCriterionRequirements()); + hoursGroupAggregation.setResourceType(hoursGroup + .getResourceType()); + } else { + Integer newHours = hoursGroupAggregation.getWorkingHours() + + hoursGroup.getWorkingHours(); + hoursGroupAggregation.setWorkingHours(newHours); + } + + map.put(key, hoursGroupAggregation); + } + return new ArrayList(map.values()); + } + + private Map> getKeyFor(HoursGroup hoursGroup) { + Map> keys = new HashMap>(); + ResourceEnum resourceType = hoursGroup.getResourceType(); + Set criterions = getKeyCriterionsFor(hoursGroup); + keys.put(resourceType, criterions); + return keys; + } + + private Set getKeyCriterionsFor(HoursGroup hoursGroup) { + Set key = new HashSet(); + for (Criterion criterion : hoursGroup.getCriterions()) { + if (criterion != null) { + key.add(criterion); + } + } + return key; + } + + private transient ListitemRenderer renderer = new HoursGroupListitemRender(); + + public ListitemRenderer getRenderer() { + return renderer; + } + + public class HoursGroupListitemRender implements ListitemRenderer{ + + @Override + public void render(Listitem item, Object data) throws Exception { + final HoursGroup hoursGroup = (HoursGroup) data; + + // Criterion Requirements hours Group + Listcell cellCriterionRequirements = new Listcell(); + cellCriterionRequirements.setParent(item); + cellCriterionRequirements.appendChild( appendRequirements(hoursGroup)); + + // Type hours Group + Listcell cellType = new Listcell(); + cellType.setParent(item); + cellType.appendChild(appendType(hoursGroup)); + + // Working hours + Listcell cellWorkingHours = new Listcell(); + cellWorkingHours.setParent(item); + cellWorkingHours.appendChild(appendWorkingHours(hoursGroup)); + } + } + + private Textbox appendRequirements(final HoursGroup hoursGroup) { + Textbox requirementsTextbox = new Textbox(); + requirementsTextbox.setReadonly(true); + requirementsTextbox.setRows(2); + requirementsTextbox.setWidth("550px"); + return Util.bind(requirementsTextbox, new Util.Getter() { + @Override + public String get() { + return getLabelRequirements(hoursGroup); + } + }, new Util.Setter() { + @Override + public void set(String value) { + } + }); + } + + private Textbox appendType(final HoursGroup hoursGroup) { + Textbox type = new Textbox(); + type.setHeight("15px"); + type.setReadonly(true); + return Util.bind(type, new Util.Getter() { + @Override + public String get() { + return hoursGroup.getResourceType().toString(); + } + }, new Util.Setter() { + @Override + public void set(String value) { + } + }); + } + + private Intbox appendWorkingHours(final HoursGroup hoursGroup) { + Intbox workingHoursBox = new Intbox(); + workingHoursBox.setReadonly(true); + workingHoursBox.setHeight("15px"); + workingHoursBox.setWidth("150px"); + return Util.bind(workingHoursBox, new Util.Getter() { + @Override + public Integer get() { + return hoursGroup.getWorkingHours(); + } + }, new Util.Setter() { + @Override + public void set(Integer value) { + } + }); + } + + private String getLabelRequirements(HoursGroup hoursGroup) { + String label = ""; + for (Criterion criterion : hoursGroup.getCriterions()) { + if (!label.equals("")) { + label = label.concat(", "); + } + label = label.concat(criterion.getName()); + } + if (!label.equals("")) { + label = label.concat("."); + } + return label; + } } \ No newline at end of file diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/AssignedCriterionRequirementToOrderElementModel.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/AssignedCriterionRequirementToOrderElementModel.java index fa962cfa3..5513dbdc1 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/AssignedCriterionRequirementToOrderElementModel.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/AssignedCriterionRequirementToOrderElementModel.java @@ -66,6 +66,11 @@ public class AssignedCriterionRequirementToOrderElementModel implements private List hoursGroupsWrappers = new ArrayList(); + @Override + public IOrderModel getOrderModel() { + return orderModel; + } + @Override public OrderElement getOrderElement() { return orderElement; @@ -134,7 +139,8 @@ public class AssignedCriterionRequirementToOrderElementModel implements } } - private Set getTypes(){ + @Override + public Set getTypes() { return getMapCriterions().keySet(); } diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/IAssignedCriterionRequirementToOrderElementModel.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/IAssignedCriterionRequirementToOrderElementModel.java index 8120c6dac..0edf3f644 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/IAssignedCriterionRequirementToOrderElementModel.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/IAssignedCriterionRequirementToOrderElementModel.java @@ -6,9 +6,11 @@ package org.navalplanner.web.orders; import java.util.List; +import java.util.Set; import org.navalplanner.business.common.exceptions.ValidationException; import org.navalplanner.business.orders.entities.OrderElement; +import org.navalplanner.business.resources.entities.CriterionType; import org.navalplanner.business.resources.entities.CriterionWithItsType; /** @@ -16,8 +18,13 @@ import org.navalplanner.business.resources.entities.CriterionWithItsType; * @author Susana Montes Pedreira */ public interface IAssignedCriterionRequirementToOrderElementModel { + + IOrderModel getOrderModel(); + OrderElement getOrderElement(); + Set getTypes(); + void setOrderElement(OrderElement orderElement); void init(OrderElement orderElement); diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/OrderCRUDController.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/OrderCRUDController.java index e21a0545d..973c69991 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/OrderCRUDController.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/OrderCRUDController.java @@ -232,7 +232,7 @@ public class OrderCRUDController extends GenericForwardComposer { public void reloadHoursGroupOrder() { assignedCriterionRequirementController .openWindow(getOrderElementModel()); - Util.reloadBindings(editWindow); + assignedCriterionRequirementController.reload(); } private void showWindow(Window window) { diff --git a/navalplanner-webapp/src/main/webapp/orders/_listOrderElementCriterionRequirements.zul b/navalplanner-webapp/src/main/webapp/orders/_listOrderElementCriterionRequirements.zul index 61aeb8991..55d318df7 100644 --- a/navalplanner-webapp/src/main/webapp/orders/_listOrderElementCriterionRequirements.zul +++ b/navalplanner-webapp/src/main/webapp/orders/_listOrderElementCriterionRequirements.zul @@ -109,11 +109,27 @@
- - + + + + + + + + + + + + + + + - +