diff --git a/ganttzk/src/main/java/org/zkoss/ganttz/util/MutableTreeModel.java b/ganttzk/src/main/java/org/zkoss/ganttz/util/MutableTreeModel.java index 976d6eeac..569d5d293 100644 --- a/ganttzk/src/main/java/org/zkoss/ganttz/util/MutableTreeModel.java +++ b/ganttzk/src/main/java/org/zkoss/ganttz/util/MutableTreeModel.java @@ -328,4 +328,33 @@ public class MutableTreeModel extends AbstractTreeModel { return getChildCount(node) > 0; } + public boolean contains(T parent, T child) { + Node parentNode = find(parent); + Node childNode = find(child); + + if (parentNode != null && (childNode != null && childNode.getParent() != null)) { + return childNode.getParent().equals(parentNode); + } + return false; + } + + public List asList() { + List result = new ArrayList(); + asList(getRoot(), result); + return result; + } + + private void asList(T root, List result) { + List list = new ArrayList(); + for (int i = 0; i < getChildCount(root); i++) { + final T child = getChild(root, i); + list.add(child); + result.add(child); + } + + for (T each: list) { + asList(each, result); + } + } + } diff --git a/ganttzk/src/test/java/org/zkoss/ganttz/util/MutableTreeModelTest.java b/ganttzk/src/test/java/org/zkoss/ganttz/util/MutableTreeModelTest.java index 0035ca634..f75c0c5bc 100644 --- a/ganttzk/src/test/java/org/zkoss/ganttz/util/MutableTreeModelTest.java +++ b/ganttzk/src/test/java/org/zkoss/ganttz/util/MutableTreeModelTest.java @@ -440,6 +440,29 @@ public class MutableTreeModelTest { assertThat(model.getChild(model.getRoot(), 1), equalTo(prueba2)); } + @Test + public void treeParentContainsChild() { + final MutableTreeModel model = MutableTreeModel + .create(Prueba.class); + + Prueba parent = new Prueba(); + model.addToRoot(parent); + Prueba child = new Prueba(); + model.add(parent, child); + assertTrue(model.contains(parent, child)); + } + + @Test + public void treeParentDoesNotContainChild() { + final MutableTreeModel model = MutableTreeModel + .create(Prueba.class); + + Prueba parent = new Prueba(); + model.addToRoot(parent); + Prueba child = new Prueba(); + assertFalse(model.contains(parent, child)); + } + private void checkIsValid(TreeDataEvent event, int type, Prueba expectedParent, int expectedPosition) { checkIsValid(event, type, expectedParent, expectedPosition, @@ -461,4 +484,5 @@ public class MutableTreeModelTest { } return list.get(list.size() - 1); } + } diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/materials/daos/IMaterialDAO.java b/navalplanner-business/src/main/java/org/navalplanner/business/materials/daos/IMaterialDAO.java index f2855614f..1d7199390 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/materials/daos/IMaterialDAO.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/materials/daos/IMaterialDAO.java @@ -21,17 +21,50 @@ package org.navalplanner.business.materials.daos; import java.util.List; +import java.util.Set; import org.navalplanner.business.common.daos.IGenericDAO; import org.navalplanner.business.materials.entities.Material; +import org.navalplanner.business.materials.entities.MaterialCategory; /** * Interface IMaterialDAO * * @author Jacobo Aragunde Perez + * @author Diego Pino Garcia */ public interface IMaterialDAO extends IGenericDAO { + /** + * Searches {@link Material} by code and description (ilike matching) within + * categories + * + * @param text + * @param categories + * @return + */ + List findMaterialsInCategories(String text, + Set categories); + + /** + * Searches {@link Material} by code and description (ilike matching) within + * category and its subcategories + * + * @param text + * @param materialCategory + * @return + */ + List findMaterialsInCategoryAndSubCategories(String text, + MaterialCategory materialCategory); + List getAll(); + /** + * Returns all subcategories for materialCategory + * + * @param materialCategory + * @return + */ + Set getAllSubcategories(MaterialCategory materialCategory); + } diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/materials/daos/MaterialDAO.java b/navalplanner-business/src/main/java/org/navalplanner/business/materials/daos/MaterialDAO.java index 3a6b6a069..dd7b9c30c 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/materials/daos/MaterialDAO.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/materials/daos/MaterialDAO.java @@ -20,10 +20,15 @@ package org.navalplanner.business.materials.daos; +import java.util.HashSet; import java.util.List; +import java.util.Set; +import org.hibernate.Criteria; +import org.hibernate.criterion.Restrictions; import org.navalplanner.business.common.daos.GenericDAOHibernate; import org.navalplanner.business.materials.entities.Material; +import org.navalplanner.business.materials.entities.MaterialCategory; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Repository; @@ -32,6 +37,7 @@ import org.springframework.stereotype.Repository; * DAO for {@link Material} * * @author Jacobo Aragunde Perez + * @author Diego Pino Garcia */ @Repository @Scope(BeanDefinition.SCOPE_SINGLETON) @@ -43,4 +49,44 @@ public class MaterialDAO extends GenericDAOHibernate implements return list(Material.class); } + @Override + public List findMaterialsInCategoryAndSubCategories(String text, + MaterialCategory materialCategory) { + Set materialCategories = new HashSet(); + if (materialCategory != null) { + materialCategories.add(materialCategory); + materialCategories.addAll(getAllSubcategories(materialCategory)); + } + return findMaterialsInCategories(text, materialCategories); + } + + @Override + public Set getAllSubcategories(MaterialCategory materialCategory) { + Set result = new HashSet(); + getAllSubcategories(result, materialCategory.getSubcategories()); + return result; + } + + private void getAllSubcategories(Set materialCategories, Set subcategories) { + for (MaterialCategory each: subcategories) { + materialCategories.add(each); + getAllSubcategories(materialCategories, each.getSubcategories()); + } + } + + @SuppressWarnings("unchecked") + @Override + public List findMaterialsInCategories(String text, + Set categories) { + Criteria criteria = this.getSession().createCriteria(Material.class); + + text = "%" + text + "%"; + criteria.add(Restrictions.or(Restrictions.ilike("code", text), Restrictions.eq("description", text))); + criteria.add(Restrictions.eq("disabled", false)); + if (categories != null && !categories.isEmpty()) { + criteria.add(Restrictions.in("category", categories)); + } + return criteria.list(); + } + } diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/materials/entities/Material.java b/navalplanner-business/src/main/java/org/navalplanner/business/materials/entities/Material.java index 32fe0f98f..d07ec1382 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/materials/entities/Material.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/materials/entities/Material.java @@ -40,7 +40,7 @@ public class Material extends BaseEntity implements Comparable { private String description; - private BigDecimal defaultUnitPrice; + private BigDecimal defaultUnitPrice = new BigDecimal(0); private UnitTypeEnum unitType; @@ -113,7 +113,6 @@ public class Material extends BaseEntity implements Comparable { @Override public int compareTo(Object arg0) { final Material material = (Material) arg0; - return code.compareTo(material.getCode()); } diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/materials/entities/MaterialAssignment.java b/navalplanner-business/src/main/java/org/navalplanner/business/materials/entities/MaterialAssignment.java new file mode 100644 index 000000000..a83a08292 --- /dev/null +++ b/navalplanner-business/src/main/java/org/navalplanner/business/materials/entities/MaterialAssignment.java @@ -0,0 +1,139 @@ +/* + * 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.materials.entities; + +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.util.Date; + +import org.navalplanner.business.common.BaseEntity; +import org.navalplanner.business.orders.entities.OrderElement; + +/** + * + * @author Diego Pino Garcia + * + */ +public class MaterialAssignment extends BaseEntity implements Comparable { + + Material material; + + double units = 0; + + BigDecimal unitPrice = new BigDecimal(0); + + Date estimatedAvailability; + + MaterialStatusEnum status = MaterialStatusEnum.PENDING; + + OrderElement orderElement; + + public static MaterialAssignment create() { + return BaseEntity.create(new MaterialAssignment()); + } + + protected MaterialAssignment() { + + } + + public static MaterialAssignment create(Material material) { + MaterialAssignment materialAssignment = create(); + materialAssignment.setUnitPrice(material.getDefaultUnitPrice()); + materialAssignment.setMaterial(material); + return materialAssignment; + } + + public static MaterialAssignment create(MaterialAssignment materialAssignment) { + MaterialAssignment result = create(); + result.setMaterial(materialAssignment.getMaterial()); + result.setUnits(materialAssignment.getUnits()); + result.setUnitPrice(materialAssignment.getUnitPrice()); + result.setEstimatedAvailability(materialAssignment.getEstimatedAvailability()); + result.setStatus(materialAssignment.getStatus()); + return result; + } + + public Material getMaterial() { + return material; + } + + public void setMaterial(Material material) { + this.material = material; + } + + public double getUnits() { + return units; + } + + public void setUnits(double units) { + this.units = units; + } + + public BigDecimal getUnitPrice() { + return unitPrice; + } + + public void setUnitPrice(BigDecimal unitPrice) { + this.unitPrice = unitPrice; + } + + public BigDecimal getTotalPrice() { + BigDecimal result = new BigDecimal(getUnits()); + return result.multiply(getUnitPrice()); + } + + public void setTotalPrice(BigDecimal totalPrice) { + BigDecimal unitPrice = totalPrice; + unitPrice = unitPrice.divide(new BigDecimal(units), 3, RoundingMode.HALF_UP); + setUnitPrice(unitPrice); + } + + public Date getEstimatedAvailability() { + return estimatedAvailability; + } + + public void setEstimatedAvailability(Date estimatedAvailability) { + this.estimatedAvailability = estimatedAvailability; + } + + public MaterialStatusEnum getStatus() { + return status; + } + + public void setStatus(MaterialStatusEnum status) { + this.status = status; + } + + public OrderElement getOrderElement() { + return orderElement; + } + + public void setOrderElement(OrderElement orderElement) { + this.orderElement = orderElement; + } + + @Override + public int compareTo(Object arg0) { + final MaterialAssignment materialAssignment = (MaterialAssignment) arg0; + return materialAssignment.getMaterial().compareTo(getMaterial()); + } + +} diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/materials/entities/MaterialStatusEnum.java b/navalplanner-business/src/main/java/org/navalplanner/business/materials/entities/MaterialStatusEnum.java new file mode 100644 index 000000000..2d1ffe05f --- /dev/null +++ b/navalplanner-business/src/main/java/org/navalplanner/business/materials/entities/MaterialStatusEnum.java @@ -0,0 +1,34 @@ +/* + * 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.materials.entities; + +/** + * + * @author Diego Pino Garcia + * + */ +public enum MaterialStatusEnum { + RECEIVED, + PENDING, + ORDERED, + PROCESSING, + CANCELED +} 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 e8936012f..9be1977d2 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 @@ -42,6 +42,7 @@ import org.navalplanner.business.advance.exceptions.DuplicateAdvanceAssignmentFo import org.navalplanner.business.advance.exceptions.DuplicateValueTrueReportGlobalAdvanceException; import org.navalplanner.business.common.BaseEntity; import org.navalplanner.business.labels.entities.Label; +import org.navalplanner.business.materials.entities.MaterialAssignment; import org.navalplanner.business.orders.entities.SchedulingState.ITypeChangedListener; import org.navalplanner.business.orders.entities.SchedulingState.Type; import org.navalplanner.business.orders.entities.TaskSource.TaskSourceSynchronization; @@ -68,6 +69,8 @@ public abstract class OrderElement extends BaseEntity { protected Set directAdvanceAssignments = new HashSet(); + protected Set materialAssignments = new HashSet(); + private Set