diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/materials/AssignedMaterialsModel.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/materials/AssignedMaterialsModel.java new file mode 100644 index 000000000..7a5ad6a35 --- /dev/null +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/materials/AssignedMaterialsModel.java @@ -0,0 +1,245 @@ +/* + * 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.web.orders.materials; + +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +import org.navalplanner.business.materials.daos.IMaterialCategoryDAO; +import org.navalplanner.business.materials.daos.IMaterialDAO; +import org.navalplanner.business.materials.entities.Material; +import org.navalplanner.business.materials.entities.MaterialCategory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.transaction.annotation.Transactional; +import org.zkoss.ganttz.util.MutableTreeModel; +import org.zkoss.zul.TreeModel; + +/** + * @author Óscar González Fernández + * + */ +public abstract class AssignedMaterialsModel { + + @Autowired + private IMaterialCategoryDAO categoryDAO; + + @Autowired + private IMaterialDAO materialDAO; + + private MutableTreeModel materialCategories = MutableTreeModel + .create(MaterialCategory.class); + + private MutableTreeModel allMaterialCategories = MutableTreeModel + .create(MaterialCategory.class); + + private List matchingMaterials = new ArrayList(); + + @Transactional(readOnly = true) + public void initEdit(T element) { + assignAndReattach(element); + materialCategories = MutableTreeModel.create(MaterialCategory.class); + initializeMaterialAssigments(); + // Initialize matching materials + matchingMaterials.clear(); + matchingMaterials.addAll(materialDAO.getAll()); + initializeMaterials(matchingMaterials); + } + + protected abstract void initializeMaterialAssigments(); + + protected abstract void assignAndReattach(T element); + + private void initializeMaterials(Collection materials) { + for (Material each : materials) { + initializeMaterial(each); + } + } + + protected void initializeMaterialCategories( + Collection materialCategories) { + for (MaterialCategory each : materialCategories) { + initializeMaterialCategory(each); + } + } + + protected void initializeMaterialCategory(MaterialCategory materialCategory) { + materialCategory.getName(); + initializeMaterials(materialCategory.getMaterials()); + initializeMaterialCategories(materialCategory.getSubcategories()); + } + + private void initializeMaterial(Material material) { + material.getDescription(); + material.getCategory().getName(); + } + + @Transactional(readOnly = true) + public MutableTreeModel getMaterialCategories() { + if (isInitialized() && materialCategories.isEmpty()) { + feedTree(materialCategories, getAssignments()); + initializeMaterialCategories(materialCategories.asList()); + } + return materialCategories; + } + + protected abstract List getAssignments(); + + protected abstract Material getMaterial(A assignment); + + private void feedTree(MutableTreeModel tree, + Collection materialAssignments) { + for (A each : materialAssignments) { + final Material material = getMaterial(each); + addCategory(tree, material.getCategory()); + } + } + + /** + * Adds category to treeModel If category.parent is not in treeModel add it + * to treeModel recursively. + */ + private void addCategory( + MutableTreeModel materialCategories, + MaterialCategory materialCategory) { + + categoryDAO.reattach(materialCategory); + final MaterialCategory parent = materialCategory.getParent(); + if (parent == null) { + if (!materialCategories.contains(parent, materialCategory)) { + materialCategories.addToRoot(materialCategory); + } + } else { + if (!materialCategories.contains(parent, materialCategory)) { + addCategory(materialCategories, parent); + materialCategories.add(parent, materialCategory); + } + } + } + + @Transactional(readOnly = true) + public TreeModel getAllMaterialCategories() { + if (allMaterialCategories.isEmpty()) { + feedTree(allMaterialCategories, categoryDAO.getAll()); + initializeMaterialCategories(allMaterialCategories.asList()); + } + return allMaterialCategories; + } + + private void feedTree(MutableTreeModel tree, + List materialCategories) { + for (MaterialCategory each : materialCategories) { + addCategory(tree, each); + } + } + + protected abstract boolean isInitialized(); + + public List getAssignedMaterials(MaterialCategory materialCategory) { + List result = new ArrayList(); + if (isInitialized()) { + for (A each : getAssignments()) { + final Material material = getMaterial(each); + if (materialCategory == null + || materialCategory.getId().equals( + material.getCategory().getId())) { + result.add(each); + } + } + } + return result; + } + + @Transactional(readOnly = true) + public void searchMaterials(String text, MaterialCategory materialCategory) { + matchingMaterials = materialDAO + .findMaterialsInCategoryAndSubCategories(text, materialCategory); + initializeMaterials(matchingMaterials); + } + + public List getMatchingMaterials() { + return matchingMaterials; + } + + protected abstract void addMaterialAssignment(Material material); + + @Transactional(readOnly = true) + public void addMaterialAssignment(A materialAssignment) { + MaterialCategory category = addAssignment(materialAssignment); + addCategory(materialCategories, category); + } + + protected abstract MaterialCategory addAssignment(A materialAssignment); + + protected abstract MaterialCategory removeAssignment(A materialAssignment); + + public void removeMaterialAssignment(A materialAssignment) { + MaterialCategory materialCategory = removeAssignment(materialAssignment); + removeCategory(materialCategories, materialCategory); + } + + private void removeCategory( + MutableTreeModel materialCategories, + MaterialCategory materialCategory) { + + categoryDAO.reattach(materialCategory); + final boolean canDelete = materialCategory.getSubcategories().isEmpty() + && getAssignedMaterials(materialCategory).isEmpty(); + if (canDelete) { + materialCategories.remove(materialCategory); + final MaterialCategory parent = materialCategory.getParent(); + if (parent != null) { + removeCategory(materialCategories, parent); + } + } + } + + public double getUnits(MaterialCategory materialCategory) { + double result = 0; + if (isInitialized()) { + for (A each : getAssignments()) { + final Material material = getMaterial(each); + if (materialCategory.equals(material.getCategory())) { + result += getUnits(each); + } + } + } + return result; + } + + protected abstract Double getUnits(A assigment); + + public BigDecimal getPrice(MaterialCategory category) { + BigDecimal result = new BigDecimal(0); + if (isInitialized()) { + for (A each : getAssignments()) { + final Material material = getMaterial(each); + if (category.equals(material.getCategory())) { + result = result.add(getTotalPrice(each)); + } + } + } + return result; + } + + protected abstract BigDecimal getTotalPrice(A each); + +} diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/materials/AssignedMaterialsToOrderElementModel.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/materials/AssignedMaterialsToOrderElementModel.java index 51eb587aa..52adf17a6 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/materials/AssignedMaterialsToOrderElementModel.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/materials/AssignedMaterialsToOrderElementModel.java @@ -22,12 +22,9 @@ package org.navalplanner.web.orders.materials; import java.math.BigDecimal; import java.util.ArrayList; -import java.util.Collection; import java.util.List; import java.util.Set; -import org.navalplanner.business.materials.daos.IMaterialCategoryDAO; -import org.navalplanner.business.materials.daos.IMaterialDAO; import org.navalplanner.business.materials.entities.Material; import org.navalplanner.business.materials.entities.MaterialAssignment; import org.navalplanner.business.materials.entities.MaterialCategory; @@ -38,48 +35,30 @@ import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import org.zkoss.ganttz.util.MutableTreeModel; -import org.zkoss.zul.TreeModel; /** * @author Diego Pino Garcia */ @Service @Scope(BeanDefinition.SCOPE_PROTOTYPE) -public class AssignedMaterialsToOrderElementModel implements +public class AssignedMaterialsToOrderElementModel extends + AssignedMaterialsModel implements IAssignedMaterialsToOrderElementModel { - @Autowired - private IMaterialCategoryDAO categoryDAO; - - @Autowired - private IMaterialDAO materialDAO; - @Autowired private IOrderElementDAO orderElementDAO; private OrderElement orderElement; - private MutableTreeModel materialCategories = MutableTreeModel - .create(MaterialCategory.class); - - private MutableTreeModel allMaterialCategories = MutableTreeModel - .create(MaterialCategory.class); - - private List matchingMaterials = new ArrayList(); + @Override + protected void assignAndReattach(OrderElement element) { + this.orderElement = element; + orderElementDAO.reattach(this.orderElement); + } @Override - @Transactional(readOnly = true) - public void initEdit(OrderElement orderElement) { - this.orderElement = orderElement; - orderElementDAO.reattach(this.orderElement); - materialCategories = MutableTreeModel.create(MaterialCategory.class); + protected void initializeMaterialAssigments() { initializeMaterialAssigments(this.orderElement.getMaterialAssignments()); - - // Initialize matching materials - matchingMaterials.clear(); - matchingMaterials.addAll(materialDAO.getAll()); - initializeMaterials(matchingMaterials); } private void initializeMaterialAssigments( @@ -90,123 +69,27 @@ public class AssignedMaterialsToOrderElementModel implements } } - @Transactional(readOnly = true) - private void initializeMaterialCategories( - Collection materialCategories) { - for (MaterialCategory each : materialCategories) { - initializeMaterialCategory(each); - } - } - - private void initializeMaterialCategory(MaterialCategory materialCategory) { - materialCategory.getName(); - initializeMaterials(materialCategory.getMaterials()); - initializeMaterialCategories(materialCategory.getSubcategories()); - } - - private void initializeMaterials(Collection materials) { - for (Material each : materials) { - initializeMaterial(each); - } - } - - private void initializeMaterial(Material material) { - material.getDescription(); - material.getCategory().getName(); - } - @Override public OrderElement getOrderElement() { return orderElement; } @Override - @Transactional(readOnly = true) - public MutableTreeModel getMaterialCategories() { - if (orderElement != null && materialCategories.isEmpty()) { - feedTree(materialCategories, orderElement.getMaterialAssignments()); - initializeMaterialCategories(materialCategories.asList()); - } - return materialCategories; - } - - private void feedTree(MutableTreeModel tree, - Set materialAssignments) { - for (MaterialAssignment each : materialAssignments) { - final Material material = (Material) each.getMaterial(); - addCategory(tree, material.getCategory()); - } - } - - /** - * Adds category to treeModel - * - * If category.parent is not in treeModel add it to treeModel recursively. - * - */ - private void addCategory( - MutableTreeModel materialCategories, - MaterialCategory materialCategory) { - - categoryDAO.reattach(materialCategory); - final MaterialCategory parent = materialCategory.getParent(); - if (parent == null) { - if (!materialCategories.contains(parent, materialCategory)) { - materialCategories.addToRoot(materialCategory); - } - } else { - if (!materialCategories.contains(parent, materialCategory)) { - addCategory(materialCategories, parent); - materialCategories.add(parent, materialCategory); - } - } + protected List getAssignments() { + return new ArrayList(orderElement + .getMaterialAssignments()); } @Override - @Transactional(readOnly = true) - public TreeModel getAllMaterialCategories() { - if (allMaterialCategories.isEmpty()) { - feedTree(allMaterialCategories, categoryDAO.getAll()); - initializeMaterialCategories(allMaterialCategories.asList()); - } - return allMaterialCategories; - } - - private void feedTree(MutableTreeModel tree, - List materialCategories) { - for (MaterialCategory each : materialCategories) { - addCategory(tree, each); - } + protected Material getMaterial(MaterialAssignment assignment) { + return assignment.getMaterial(); } @Override - public List getAssignedMaterials( - MaterialCategory materialCategory) { - List result = new ArrayList(); - if (orderElement != null) { - for (MaterialAssignment materialAssigment : orderElement - .getMaterialAssignments()) { - final Material material = materialAssigment.getMaterial(); - if (materialCategory == null - || materialCategory.getId().equals(material.getCategory().getId())) { - result.add(materialAssigment); - } - } - } - return result; - } - - @Override - @Transactional(readOnly = true) - public void searchMaterials(String text, MaterialCategory materialCategory) { - matchingMaterials = materialDAO - .findMaterialsInCategoryAndSubCategories(text, materialCategory); - initializeMaterials(matchingMaterials); - } - - @Override - public List getMatchingMaterials() { - return matchingMaterials; + protected MaterialCategory removeAssignment( + MaterialAssignment materialAssignment) { + orderElement.removeMaterialAssignment(materialAssignment); + return materialAssignment.getMaterial().getCategory(); } @Override @@ -219,51 +102,15 @@ public class AssignedMaterialsToOrderElementModel implements } @Override - @Transactional(readOnly = true) - public void addMaterialAssignment(MaterialAssignment materialAssignment) { + protected MaterialCategory addAssignment( + MaterialAssignment materialAssignment) { orderElement.addMaterialAssignment(materialAssignment); - // Add material category to materialCategories tree - final MaterialCategory materialCategory = materialAssignment.getMaterial().getCategory(); - addCategory(materialCategories, materialCategory); + return materialAssignment.getMaterial().getCategory(); } @Override - @Transactional(readOnly = true) - public void removeMaterialAssignment(MaterialAssignment materialAssignment) { - orderElement.removeMaterialAssignment(materialAssignment); - // Remove material category from materialCategories tree - final MaterialCategory materialCategory = materialAssignment.getMaterial().getCategory(); - removeCategory(materialCategories, materialCategory); - } - - private void removeCategory( - MutableTreeModel materialCategories, - MaterialCategory materialCategory) { - - categoryDAO.reattach(materialCategory); - final boolean canDelete = materialCategory.getSubcategories().isEmpty() && getAssignedMaterials(materialCategory).isEmpty(); - if (canDelete) { - materialCategories.remove(materialCategory); - final MaterialCategory parent = materialCategory.getParent(); - if (parent != null) { - removeCategory(materialCategories, parent); - } - } - } - - @Override - public double getUnits(MaterialCategory materialCategory) { - double result = 0; - if (orderElement != null) { - for (MaterialAssignment materialAssignment : orderElement - .getMaterialAssignments()) { - final Material material = materialAssignment.getMaterial(); - if (materialCategory.equals(material.getCategory())) { - result += materialAssignment.getUnits(); - } - } - } - return result; + protected Double getUnits(MaterialAssignment assigment) { + return assigment.getUnits(); } @Override @@ -281,4 +128,14 @@ public class AssignedMaterialsToOrderElementModel implements return result; } + @Override + protected BigDecimal getTotalPrice(MaterialAssignment materialAssignment) { + return materialAssignment.getTotalPrice(); + } + + @Override + protected boolean isInitialized() { + return orderElement != null; + } + }