From a0b22dc8c7a11dd216ef1a7a468eaa92ec0dfbca Mon Sep 17 00:00:00 2001 From: Susana Montes Pedreira Date: Wed, 24 Mar 2010 14:12:11 +0100 Subject: [PATCH] ItEr50S13AdaptacionServiciosRESTItEr49S18 : Refactoring the enumeration UnitTypeEnum to an Entity. After the following patch, it must be updated or dropped the column unit_type to the table material. Its unit_type can be null. Option A: ALTER TABLE material ALTER unit_type TYPE BIGINT; UPDATE material SET unit_type = null; ------- Option B: ALTER TABLE material DROP unit_type BIGINT; ALTER TABLE material ADD unit_type BIGINT; --- .../business/common/Registry.java | 8 ++ .../IMaterialCategoryBootstrap.java | 3 +- .../MaterialCategoryBootstrap.java | 2 +- .../PredefinedMaterialCategories.java | 3 +- .../PredefinedUnitTypes.java} | 24 +++++- .../bootstrap/UnitTypeBootstrap.java | 55 +++++++++++++ .../business/materials/daos/IUnitTypeDAO.java | 40 ++++++++++ .../business/materials/daos/UnitTypeDAO.java | 77 +++++++++++++++++++ .../business/materials/entities/Material.java | 6 +- .../business/materials/entities/UnitType.java | 64 +++++++++++++++ .../materials/entities/Materials.hbm.xml | 21 +++-- .../web/materials/IMaterialsModel.java | 4 + .../web/materials/MaterialsController.java | 49 ++++++++++++ .../web/materials/MaterialsModel.java | 24 ++++++ .../AssignedMaterialsController.java | 65 +++++++++++++++- .../materials/AssignedMaterialsModel.java | 17 ++++ .../AssignedMaterialsToOrderElementModel.java | 9 +++ .../materials/IAssignedMaterialsModel.java | 7 ++ ...IAssignedMaterialsToOrderElementModel.java | 3 + ...dMaterialsToOrderElementTemplateModel.java | 9 +++ ...dMaterialsToOrderElementTemplateModel.java | 3 + .../ws/common/impl/OrderElementConverter.java | 2 +- .../src/main/webapp/materials/materials.zul | 10 +-- .../main/webapp/orders/_assignmentsBox.zul | 6 +- .../components/_listOrderElementMaterials.zul | 10 +-- .../templates/_materialAssignmentsBox.zul | 6 +- 26 files changed, 493 insertions(+), 34 deletions(-) rename navalplanner-business/src/main/java/org/navalplanner/business/materials/{entities => bootstrap}/IMaterialCategoryBootstrap.java (89%) rename navalplanner-business/src/main/java/org/navalplanner/business/materials/{entities => bootstrap}/MaterialCategoryBootstrap.java (97%) rename navalplanner-business/src/main/java/org/navalplanner/business/materials/{entities => bootstrap}/PredefinedMaterialCategories.java (93%) rename navalplanner-business/src/main/java/org/navalplanner/business/materials/{entities/UnitTypeEnum.java => bootstrap/PredefinedUnitTypes.java} (70%) create mode 100644 navalplanner-business/src/main/java/org/navalplanner/business/materials/bootstrap/UnitTypeBootstrap.java create mode 100644 navalplanner-business/src/main/java/org/navalplanner/business/materials/daos/IUnitTypeDAO.java create mode 100644 navalplanner-business/src/main/java/org/navalplanner/business/materials/daos/UnitTypeDAO.java create mode 100644 navalplanner-business/src/main/java/org/navalplanner/business/materials/entities/UnitType.java diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/common/Registry.java b/navalplanner-business/src/main/java/org/navalplanner/business/common/Registry.java index f8ca7feaa..b21fb4afd 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/common/Registry.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/common/Registry.java @@ -35,6 +35,7 @@ import org.navalplanner.business.labels.daos.ILabelDAO; import org.navalplanner.business.labels.daos.ILabelTypeDAO; import org.navalplanner.business.materials.daos.IMaterialCategoryDAO; import org.navalplanner.business.materials.daos.IMaterialDAO; +import org.navalplanner.business.materials.daos.IUnitTypeDAO; import org.navalplanner.business.orders.daos.IHoursGroupDAO; import org.navalplanner.business.orders.daos.IOrderDAO; import org.navalplanner.business.orders.daos.IOrderElementDAO; @@ -165,6 +166,9 @@ public class Registry { @Autowired private ICalendarExceptionTypeDAO calendarExceptionTypeDAO; + @Autowired + private IUnitTypeDAO unitTypeDAO; + private Registry() { } @@ -172,6 +176,10 @@ public class Registry { return singleton; } + public static IUnitTypeDAO getUnitTypeDAO() { + return getInstance().unitTypeDAO; + } + public static IAdvanceTypeDAO getAdvanceTypeDao() { return getInstance().advanceTypeDao; } diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/materials/entities/IMaterialCategoryBootstrap.java b/navalplanner-business/src/main/java/org/navalplanner/business/materials/bootstrap/IMaterialCategoryBootstrap.java similarity index 89% rename from navalplanner-business/src/main/java/org/navalplanner/business/materials/entities/IMaterialCategoryBootstrap.java rename to navalplanner-business/src/main/java/org/navalplanner/business/materials/bootstrap/IMaterialCategoryBootstrap.java index 89876bced..ff0ae81d3 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/materials/entities/IMaterialCategoryBootstrap.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/materials/bootstrap/IMaterialCategoryBootstrap.java @@ -18,9 +18,10 @@ * along with this program. If not, see . */ -package org.navalplanner.business.materials.entities; +package org.navalplanner.business.materials.bootstrap; import org.navalplanner.business.IDataBootstrap; +import org.navalplanner.business.materials.entities.MaterialCategory; /** * Contratct for {@link MaterialCategory}. diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/materials/entities/MaterialCategoryBootstrap.java b/navalplanner-business/src/main/java/org/navalplanner/business/materials/bootstrap/MaterialCategoryBootstrap.java similarity index 97% rename from navalplanner-business/src/main/java/org/navalplanner/business/materials/entities/MaterialCategoryBootstrap.java rename to navalplanner-business/src/main/java/org/navalplanner/business/materials/bootstrap/MaterialCategoryBootstrap.java index 7f2f84df0..e1dcb24e1 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/materials/entities/MaterialCategoryBootstrap.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/materials/bootstrap/MaterialCategoryBootstrap.java @@ -18,7 +18,7 @@ * along with this program. If not, see . */ -package org.navalplanner.business.materials.entities; +package org.navalplanner.business.materials.bootstrap; import org.navalplanner.business.calendars.entities.CalendarExceptionType; import org.navalplanner.business.materials.daos.IMaterialCategoryDAO; diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/materials/entities/PredefinedMaterialCategories.java b/navalplanner-business/src/main/java/org/navalplanner/business/materials/bootstrap/PredefinedMaterialCategories.java similarity index 93% rename from navalplanner-business/src/main/java/org/navalplanner/business/materials/entities/PredefinedMaterialCategories.java rename to navalplanner-business/src/main/java/org/navalplanner/business/materials/bootstrap/PredefinedMaterialCategories.java index 77a2bfa4f..4a3f58f73 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/materials/entities/PredefinedMaterialCategories.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/materials/bootstrap/PredefinedMaterialCategories.java @@ -18,10 +18,11 @@ * along with this program. If not, see . */ -package org.navalplanner.business.materials.entities; +package org.navalplanner.business.materials.bootstrap; import org.navalplanner.business.common.Registry; import org.navalplanner.business.common.exceptions.InstanceNotFoundException; +import org.navalplanner.business.materials.entities.MaterialCategory; /** diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/materials/entities/UnitTypeEnum.java b/navalplanner-business/src/main/java/org/navalplanner/business/materials/bootstrap/PredefinedUnitTypes.java similarity index 70% rename from navalplanner-business/src/main/java/org/navalplanner/business/materials/entities/UnitTypeEnum.java rename to navalplanner-business/src/main/java/org/navalplanner/business/materials/bootstrap/PredefinedUnitTypes.java index 5de32bba2..27a5b6f66 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/materials/entities/UnitTypeEnum.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/materials/bootstrap/PredefinedUnitTypes.java @@ -1,3 +1,5 @@ + + /* * This file is part of NavalPlan * @@ -18,9 +20,17 @@ * along with this program. If not, see . */ -package org.navalplanner.business.materials.entities; +package org.navalplanner.business.materials.bootstrap; + +import org.navalplanner.business.materials.entities.UnitType; + +/** + * Defines the default {@link UnitType}. + * + * @author Susana Montes Pedreira + */ +public enum PredefinedUnitTypes { -public enum UnitTypeEnum { UNITS("units"), KILOGRAMS("kg"), KILOMETERS("km"), @@ -32,10 +42,18 @@ public enum UnitTypeEnum { private String measure; - private UnitTypeEnum(String measure) { + private PredefinedUnitTypes(String measure) { this.measure = measure; } + public UnitType createUnitType() { + return UnitType.create(measure); + } + + public String getMeasure() { + return measure; + } + public String toString() { return measure; } diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/materials/bootstrap/UnitTypeBootstrap.java b/navalplanner-business/src/main/java/org/navalplanner/business/materials/bootstrap/UnitTypeBootstrap.java new file mode 100644 index 000000000..7efd79b06 --- /dev/null +++ b/navalplanner-business/src/main/java/org/navalplanner/business/materials/bootstrap/UnitTypeBootstrap.java @@ -0,0 +1,55 @@ +/* + * This file is part of NavalPlan + * + * 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.bootstrap; + +import org.navalplanner.business.IDataBootstrap; +import org.navalplanner.business.materials.daos.IUnitTypeDAO; +import org.navalplanner.business.materials.entities.UnitType; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +/** + * Creates the bootstrap of the predefined {@link UnitType}. + * @author Susana Montes Pedreira + */ + +@Component +@Scope("singleton") +public class UnitTypeBootstrap implements IDataBootstrap { + + @Autowired + private IUnitTypeDAO unitTypeDAO; + + @Transactional + @Override + public void loadRequiredData() { + for (PredefinedUnitTypes predefinedUnitType : PredefinedUnitTypes + .values()) { + if (!unitTypeDAO.existsUnitTypeByName(predefinedUnitType + .getMeasure())) { + unitTypeDAO.save(predefinedUnitType.createUnitType()); + } + } + } + +} diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/materials/daos/IUnitTypeDAO.java b/navalplanner-business/src/main/java/org/navalplanner/business/materials/daos/IUnitTypeDAO.java new file mode 100644 index 000000000..1bed2bdfd --- /dev/null +++ b/navalplanner-business/src/main/java/org/navalplanner/business/materials/daos/IUnitTypeDAO.java @@ -0,0 +1,40 @@ +/* + * This file is part of NavalPlan + * + * 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.daos; + +import java.util.List; + +import org.navalplanner.business.common.daos.IIntegrationEntityDAO; +import org.navalplanner.business.common.exceptions.InstanceNotFoundException; +import org.navalplanner.business.materials.entities.UnitType; + +/** + * @author Susana Montes Pedreira + */ +public interface IUnitTypeDAO extends IIntegrationEntityDAO { + + List getAll(); + + UnitType findByName(String measure) throws InstanceNotFoundException; + + boolean existsUnitTypeByName(String measure); + +} diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/materials/daos/UnitTypeDAO.java b/navalplanner-business/src/main/java/org/navalplanner/business/materials/daos/UnitTypeDAO.java new file mode 100644 index 000000000..96219409b --- /dev/null +++ b/navalplanner-business/src/main/java/org/navalplanner/business/materials/daos/UnitTypeDAO.java @@ -0,0 +1,77 @@ +/* + * This file is part of NavalPlan + * + * 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.daos; + +import java.util.List; + +import org.apache.commons.lang.StringUtils; +import org.hibernate.criterion.Restrictions; +import org.navalplanner.business.common.daos.IntegrationEntityDAO; +import org.navalplanner.business.common.exceptions.InstanceNotFoundException; +import org.navalplanner.business.materials.entities.UnitType; +import org.springframework.beans.factory.config.BeanDefinition; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Repository; + +/** + * DAO for {@link UnitType} + * @author Susana Montes Pedreira + */ +@Repository +@Scope(BeanDefinition.SCOPE_SINGLETON) +public class UnitTypeDAO extends IntegrationEntityDAO implements + IUnitTypeDAO { + + @Override + public List getAll() { + return list(UnitType.class); + } + + @Override + public UnitType findByName(String measure) throws InstanceNotFoundException { + if (StringUtils.isBlank(measure)) { + throw new InstanceNotFoundException(null, getEntityClass() + .getName()); + } + + UnitType unitType = (UnitType) getSession().createCriteria( + UnitType.class).add( + Restrictions.eq("measure", measure)).uniqueResult(); + + if (unitType == null) { + throw new InstanceNotFoundException(measure, getEntityClass() + .getName()); + } else { + return unitType; + } + } + + @Override + public boolean existsUnitTypeByName(String measure) { + try { + findByName(measure); + } catch (InstanceNotFoundException e) { + return false; + } + return true; + } + +} 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 6d13be4f2..ceef60bbb 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 @@ -45,7 +45,7 @@ public class Material extends BaseEntity implements Comparable { private BigDecimal defaultUnitPrice = new BigDecimal(0); - private UnitTypeEnum unitType; + private UnitType unitType; private boolean disabled; @@ -105,11 +105,11 @@ public class Material extends BaseEntity implements Comparable { this.defaultUnitPrice = defaultUnitPrice; } - public UnitTypeEnum getUnitType() { + public UnitType getUnitType() { return unitType; } - public void setUnitType(UnitTypeEnum unitType) { + public void setUnitType(UnitType unitType) { this.unitType = unitType; } diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/materials/entities/UnitType.java b/navalplanner-business/src/main/java/org/navalplanner/business/materials/entities/UnitType.java new file mode 100644 index 000000000..b9c1853d2 --- /dev/null +++ b/navalplanner-business/src/main/java/org/navalplanner/business/materials/entities/UnitType.java @@ -0,0 +1,64 @@ +/* + * This file is part of NavalPlan + * + * 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 org.hibernate.validator.NotEmpty; +import org.navalplanner.business.common.IntegrationEntity; +import org.navalplanner.business.common.Registry; +import org.navalplanner.business.materials.daos.IUnitTypeDAO; + +/** + * UnitType entity + * + * @author Susana Montes Pedreira + * + */ +public class UnitType extends IntegrationEntity{ + + public static UnitType create(String measure) { + return (UnitType) create(new UnitType(measure)); + } + + private String measure; + + // Default constructor, needed by Hibernate + protected UnitType() { + + } + + private UnitType(String measure) { + this.measure = measure; + } + + @NotEmpty(message = "measure not specified") + public String getMeasure() { + return measure; + } + + public void setMeasure(String measure) { + this.measure = measure; + } + + @Override + protected IUnitTypeDAO getIntegrationEntityDAO() { + return Registry.getUnitTypeDAO(); + } +} diff --git a/navalplanner-business/src/main/resources/org/navalplanner/business/materials/entities/Materials.hbm.xml b/navalplanner-business/src/main/resources/org/navalplanner/business/materials/entities/Materials.hbm.xml index 39c23fc17..c2ec68ad4 100644 --- a/navalplanner-business/src/main/resources/org/navalplanner/business/materials/entities/Materials.hbm.xml +++ b/navalplanner-business/src/main/resources/org/navalplanner/business/materials/entities/Materials.hbm.xml @@ -17,11 +17,7 @@ - - - org.navalplanner.business.materials.entities.UnitTypeEnum - - + @@ -29,6 +25,21 @@ + + + + + + 100 + + + + + + + + + diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/materials/IMaterialsModel.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/materials/IMaterialsModel.java index 93445e8c8..c5bdce961 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/materials/IMaterialsModel.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/materials/IMaterialsModel.java @@ -26,6 +26,7 @@ import java.util.List; import org.navalplanner.business.common.exceptions.ValidationException; import org.navalplanner.business.materials.entities.Material; import org.navalplanner.business.materials.entities.MaterialCategory; +import org.navalplanner.business.materials.entities.UnitType; import org.zkoss.ganttz.util.MutableTreeModel; /** @@ -53,4 +54,7 @@ public interface IMaterialsModel { void removeMaterial(Material material); + List getUnitTypes(); + + void loadUnitTypes(); } diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/materials/MaterialsController.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/materials/MaterialsController.java index a8d3327c1..a8421e599 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/materials/MaterialsController.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/materials/MaterialsController.java @@ -32,6 +32,7 @@ import org.hibernate.validator.InvalidValue; import org.navalplanner.business.common.exceptions.ValidationException; import org.navalplanner.business.materials.entities.Material; import org.navalplanner.business.materials.entities.MaterialCategory; +import org.navalplanner.business.materials.entities.UnitType; import org.navalplanner.web.common.ConstraintChecker; import org.navalplanner.web.common.IMessagesForUser; import org.navalplanner.web.common.Level; @@ -47,6 +48,10 @@ import org.zkoss.zk.ui.event.InputEvent; import org.zkoss.zk.ui.util.GenericForwardComposer; import org.zkoss.zul.Button; import org.zkoss.zul.Grid; +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.Row; import org.zkoss.zul.Rows; @@ -86,6 +91,7 @@ public class MaterialsController extends private Component messagesContainer; + private UnitTypeListRenderer unitTypeListRenderer = new UnitTypeListRenderer(); @Override public void doAfterCompose(Component comp) throws Exception { @@ -93,6 +99,9 @@ public class MaterialsController extends comp.setVariable("materialsController", this, true); messagesForUser = new MessagesForUser(messagesContainer); + // load the unit types + loadUnitTypes(); + // Renders grid and enables delete button is material is new gridMaterials.addEventListener("onInitRender", new EventListener() { @@ -115,6 +124,21 @@ public class MaterialsController extends }); } + private void loadUnitTypes() { + materialsModel.loadUnitTypes(); + } + + public List getUnitTypes() { + return materialsModel.getUnitTypes(); + } + + public void selectUnitType(Component self) { + Listitem selectedItem = ((Listbox) self).getSelectedItem(); + UnitType unitType = (UnitType) selectedItem.getValue(); + Material material = (Material) ((Row) self.getParent()).getValue(); + material.setUnitType(unitType); + } + public TreeModel getMaterialCategories() { return materialsModel.getMaterialCategories(); } @@ -410,4 +434,29 @@ public class MaterialsController extends Util.reloadBindings(gridMaterials); } + public UnitTypeListRenderer getRenderer() { + return unitTypeListRenderer; + } + + /** + * RowRenderer for a @{UnitType} element + * @author Susana Montes Pedreira + */ + public class UnitTypeListRenderer implements ListitemRenderer { + @Override + public void render(Listitem listItem, Object data) throws Exception { + final UnitType unitType = (UnitType) data; + listItem.setValue(unitType); + + Listcell listCell = new Listcell(unitType.getMeasure()); + listItem.appendChild(listCell); + + Material material = (Material) ((Row) listItem.getListbox() + .getParent()).getValue(); + if ((material.getUnitType() != null) + && (unitType.getId().equals(material.getUnitType().getId()))) { + listItem.getListbox().setSelectedItem(listItem); + } + } + } } diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/materials/MaterialsModel.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/materials/MaterialsModel.java index 5f51c0865..ae1e9623a 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/materials/MaterialsModel.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/materials/MaterialsModel.java @@ -35,8 +35,10 @@ import org.navalplanner.business.common.exceptions.InstanceNotFoundException; import org.navalplanner.business.common.exceptions.ValidationException; import org.navalplanner.business.materials.daos.IMaterialCategoryDAO; import org.navalplanner.business.materials.daos.IMaterialDAO; +import org.navalplanner.business.materials.daos.IUnitTypeDAO; import org.navalplanner.business.materials.entities.Material; import org.navalplanner.business.materials.entities.MaterialCategory; +import org.navalplanner.business.materials.entities.UnitType; import org.navalplanner.web.common.concurrentdetection.OnConcurrentModification; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.config.BeanDefinition; @@ -56,9 +58,14 @@ public class MaterialsModel implements IMaterialsModel { @Autowired IMaterialDAO materialDAO; + @Autowired + IUnitTypeDAO unitTypeDAO; + MutableTreeModel materialCategories = MutableTreeModel .create(MaterialCategory.class); + private List unitTypes = new ArrayList(); + @Override @Transactional(readOnly=true) public MutableTreeModel getMaterialCategories() { @@ -87,6 +94,9 @@ public class MaterialsModel implements IMaterialsModel { private void initializeMaterials(Set materials) { for (Material each: materials) { each.getDescription(); + if (each.getUnitType() != null) { + each.getUnitType().getMeasure(); + } } } @@ -231,4 +241,18 @@ public class MaterialsModel implements IMaterialsModel { return result; } + @Override + @Transactional(readOnly = true) + public void loadUnitTypes() { + List result = new ArrayList(); + for (UnitType each : unitTypeDAO.findAll()) { + each.getMeasure(); + result.add(each); + } + this.unitTypes = result; + } + + public List getUnitTypes() { + return this.unitTypes; + } } diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/materials/AssignedMaterialsController.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/materials/AssignedMaterialsController.java index 9db201135..6a6d684bb 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/materials/AssignedMaterialsController.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/materials/AssignedMaterialsController.java @@ -33,6 +33,7 @@ import org.apache.commons.logging.LogFactory; import org.navalplanner.business.materials.entities.Material; import org.navalplanner.business.materials.entities.MaterialAssignment; import org.navalplanner.business.materials.entities.MaterialCategory; +import org.navalplanner.business.materials.entities.UnitType; import org.navalplanner.business.orders.entities.OrderElement; import org.navalplanner.web.common.Util; import org.zkoss.zk.ui.Component; @@ -45,7 +46,9 @@ import org.zkoss.zul.Doublebox; import org.zkoss.zul.Grid; import org.zkoss.zul.Label; 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.Row; import org.zkoss.zul.SimpleListModel; @@ -88,6 +91,7 @@ public abstract class AssignedMaterialsController extends GenericForwardCo @Override public void doAfterCompose(Component comp) throws Exception { super.doAfterCompose(comp); + getModel().loadUnitTypes(); createAssignmentsBoxComponent(assignmentsBox); } @@ -508,6 +512,63 @@ public abstract class AssignedMaterialsController extends GenericForwardCo protected abstract double getUnits(A assignment); + private UnitTypeListRenderer unitTypeListRenderer = new UnitTypeListRenderer(); + + public List getUnitTypes() { + return getModel().getUnitTypes(); + } + + public void selectUnitType(Component self) { + Listitem selectedItem = ((Listbox) self).getSelectedItem(); + UnitType unitType = (UnitType) selectedItem.getValue(); + Material material = (Material) ((Row) self.getParent()).getValue(); + material.setUnitType(unitType); + } + + public UnitTypeListRenderer getRenderer() { + return unitTypeListRenderer; + } + + /** + * RowRenderer for a @{UnitType} element + * @author Susana Montes Pedreira + */ + public class UnitTypeListRenderer implements ListitemRenderer { + @Override + public void render(Listitem listItem, Object data) throws Exception { + final UnitType unitType = (UnitType) data; + listItem.setValue(unitType); + + Listcell listCell = new Listcell(unitType.getMeasure()); + listItem.appendChild(listCell); + + Listbox listbox = listItem.getListbox(); + Component parent = listbox.getParent(); + + if (parent instanceof Row) { + Object assigment = (Object) ((Row) parent).getValue(); + if (getModel().isCurrentUnitType(assigment, unitType)) { + listItem.getListbox().setSelectedItem(listItem); + } + return; + } + + if (parent instanceof Listcell) { + Material material = (Material) ((Listitem) (parent.getParent())) + .getValue(); + if (isCurrentUnitType(material, unitType)) { + listItem.getListbox().setSelectedItem(listItem); + } + } + + } + } + + private boolean isCurrentUnitType(Material material, UnitType unitType) { + return ((material != null) + && (material.getUnitType() != null) + && (unitType + .getId().equals(material.getUnitType().getId()))); + } + } - - 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 index 9a7a79768..4f2351557 100644 --- 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 @@ -26,8 +26,10 @@ import java.util.List; import org.navalplanner.business.materials.daos.IMaterialCategoryDAO; import org.navalplanner.business.materials.daos.IMaterialDAO; +import org.navalplanner.business.materials.daos.IUnitTypeDAO; import org.navalplanner.business.materials.entities.Material; import org.navalplanner.business.materials.entities.MaterialCategory; +import org.navalplanner.business.materials.entities.UnitType; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.transaction.annotation.Transactional; import org.zkoss.ganttz.util.MutableTreeModel; @@ -46,6 +48,9 @@ public abstract class AssignedMaterialsModel implements @Autowired private IMaterialDAO materialDAO; + @Autowired + private IUnitTypeDAO unitTypeDAO; + private MutableTreeModel materialCategories = MutableTreeModel .create(MaterialCategory.class); @@ -54,6 +59,8 @@ public abstract class AssignedMaterialsModel implements private List matchingMaterials = new ArrayList(); + private List unitTypes = new ArrayList(); + @Transactional(readOnly = true) public void initEdit(T element) { assignAndReattach(element); @@ -246,4 +253,14 @@ public abstract class AssignedMaterialsModel implements protected abstract BigDecimal getTotalPrice(A each); + @Override + @Transactional(readOnly = true) + public void loadUnitTypes() { + unitTypes = unitTypeDAO.findAll(); + } + + @Override + public List getUnitTypes() { + return unitTypes; + } } 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 f39a13613..1c9ae5065 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 @@ -28,6 +28,7 @@ import java.util.Set; import org.navalplanner.business.materials.entities.Material; import org.navalplanner.business.materials.entities.MaterialAssignment; import org.navalplanner.business.materials.entities.MaterialCategory; +import org.navalplanner.business.materials.entities.UnitType; import org.navalplanner.business.orders.daos.IOrderElementDAO; import org.navalplanner.business.orders.entities.OrderElement; import org.springframework.beans.factory.annotation.Autowired; @@ -139,4 +140,12 @@ public class AssignedMaterialsToOrderElementModel extends return orderElement != null; } + @Override + public boolean isCurrentUnitType(Object assigment, UnitType unitType) { + MaterialAssignment material = (MaterialAssignment) assigment; + return ((material != null) + && (material.getMaterial().getUnitType() != null) && (unitType + .getId().equals(material.getMaterial().getUnitType().getId()))); + } + } diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/materials/IAssignedMaterialsModel.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/materials/IAssignedMaterialsModel.java index 1e4354a93..9651097f7 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/materials/IAssignedMaterialsModel.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/materials/IAssignedMaterialsModel.java @@ -24,6 +24,7 @@ import java.util.List; import org.navalplanner.business.materials.entities.Material; import org.navalplanner.business.materials.entities.MaterialCategory; +import org.navalplanner.business.materials.entities.UnitType; import org.zkoss.zul.TreeModel; /** @@ -42,6 +43,8 @@ public interface IAssignedMaterialsModel { List getAssignedMaterials(MaterialCategory materialCategory); + abstract boolean isCurrentUnitType(Object assigment, UnitType unitType); + List getMatchingMaterials(); TreeModel getMaterialCategories(); @@ -54,4 +57,8 @@ public interface IAssignedMaterialsModel { void searchMaterials(String text, MaterialCategory materialCategory); + void loadUnitTypes(); + + List getUnitTypes(); + } diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/materials/IAssignedMaterialsToOrderElementModel.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/materials/IAssignedMaterialsToOrderElementModel.java index 4b7541c2e..f80d00e3e 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/materials/IAssignedMaterialsToOrderElementModel.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/materials/IAssignedMaterialsToOrderElementModel.java @@ -21,6 +21,7 @@ package org.navalplanner.web.orders.materials; import org.navalplanner.business.materials.entities.MaterialAssignment; +import org.navalplanner.business.materials.entities.UnitType; import org.navalplanner.business.orders.entities.OrderElement; @@ -30,6 +31,8 @@ import org.navalplanner.business.orders.entities.OrderElement; public interface IAssignedMaterialsToOrderElementModel extends IAssignedMaterialsModel { + boolean isCurrentUnitType(Object assigment, UnitType unitType); + OrderElement getOrderElement(); void initEdit(OrderElement orderElement); diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/templates/materials/AssignedMaterialsToOrderElementTemplateModel.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/templates/materials/AssignedMaterialsToOrderElementTemplateModel.java index e92938e05..cf97b003c 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/templates/materials/AssignedMaterialsToOrderElementTemplateModel.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/templates/materials/AssignedMaterialsToOrderElementTemplateModel.java @@ -27,6 +27,7 @@ import java.util.List; import org.navalplanner.business.materials.entities.Material; import org.navalplanner.business.materials.entities.MaterialAssignmentTemplate; import org.navalplanner.business.materials.entities.MaterialCategory; +import org.navalplanner.business.materials.entities.UnitType; import org.navalplanner.business.templates.daos.IOrderElementTemplateDAO; import org.navalplanner.business.templates.entities.OrderElementTemplate; import org.navalplanner.web.orders.materials.AssignedMaterialsModel; @@ -130,4 +131,12 @@ public class AssignedMaterialsToOrderElementTemplateModel extends template.removeMaterialAssignment(materialAssignment); } + @Override + public boolean isCurrentUnitType(Object assigment, UnitType unitType) { + MaterialAssignmentTemplate material = (MaterialAssignmentTemplate) assigment; + return ((material != null) + && (material.getMaterial().getUnitType() != null) && (unitType + .getId().equals(material.getMaterial().getUnitType().getId()))); + } + } diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/templates/materials/IAssignedMaterialsToOrderElementTemplateModel.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/templates/materials/IAssignedMaterialsToOrderElementTemplateModel.java index a1f4093b7..2f9565a5e 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/templates/materials/IAssignedMaterialsToOrderElementTemplateModel.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/templates/materials/IAssignedMaterialsToOrderElementTemplateModel.java @@ -20,6 +20,7 @@ package org.navalplanner.web.templates.materials; import org.navalplanner.business.materials.entities.MaterialAssignmentTemplate; +import org.navalplanner.business.materials.entities.UnitType; import org.navalplanner.business.templates.entities.OrderElementTemplate; import org.navalplanner.web.orders.materials.IAssignedMaterialsModel; @@ -30,6 +31,8 @@ import org.navalplanner.web.orders.materials.IAssignedMaterialsModel; public interface IAssignedMaterialsToOrderElementTemplateModel extends IAssignedMaterialsModel { + public boolean isCurrentUnitType(Object assigment, UnitType unitType); + OrderElementTemplate getTemplate(); } diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/ws/common/impl/OrderElementConverter.java b/navalplanner-webapp/src/main/java/org/navalplanner/ws/common/impl/OrderElementConverter.java index 16b6d3804..c30f43da7 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/ws/common/impl/OrderElementConverter.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/ws/common/impl/OrderElementConverter.java @@ -40,10 +40,10 @@ import org.navalplanner.business.common.Registry; import org.navalplanner.business.common.exceptions.InstanceNotFoundException; import org.navalplanner.business.common.exceptions.ValidationException; import org.navalplanner.business.labels.entities.Label; +import org.navalplanner.business.materials.bootstrap.PredefinedMaterialCategories; import org.navalplanner.business.materials.entities.Material; import org.navalplanner.business.materials.entities.MaterialAssignment; import org.navalplanner.business.materials.entities.MaterialCategory; -import org.navalplanner.business.materials.entities.PredefinedMaterialCategories; import org.navalplanner.business.orders.entities.HoursGroup; import org.navalplanner.business.orders.entities.ICriterionRequirable; import org.navalplanner.business.orders.entities.Order; diff --git a/navalplanner-webapp/src/main/webapp/materials/materials.zul b/navalplanner-webapp/src/main/webapp/materials/materials.zul index 1b44ebcbe..2aaf034d7 100644 --- a/navalplanner-webapp/src/main/webapp/materials/materials.zul +++ b/navalplanner-webapp/src/main/webapp/materials/materials.zul @@ -28,11 +28,6 @@ - - Object[] unitTypes = org.navalplanner.business.materials.entities.UnitTypeEnum - .values(); - - @@ -100,8 +95,9 @@ constraint="no empty:${i18n:_('cannot be null or empty')}" /> - +