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 extends A> 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;
+ }
+
}