diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/materials/entities/MaterialCategory.java b/navalplanner-business/src/main/java/org/navalplanner/business/materials/entities/MaterialCategory.java index a524c0f0c..1a6ff546d 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/materials/entities/MaterialCategory.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/materials/entities/MaterialCategory.java @@ -30,9 +30,11 @@ import java.util.Set; import org.apache.commons.lang.StringUtils; import org.hibernate.validator.AssertTrue; import org.hibernate.validator.NotEmpty; +import org.hibernate.validator.NotNull; import org.hibernate.validator.Valid; import org.navalplanner.business.common.IntegrationEntity; import org.navalplanner.business.common.Registry; +import org.navalplanner.business.common.entities.EntitySequence; import org.navalplanner.business.common.exceptions.InstanceNotFoundException; import org.navalplanner.business.materials.daos.IMaterialCategoryDAO; @@ -53,6 +55,17 @@ public class MaterialCategory extends IntegrationEntity { return result; } + public static List getAllMaterialsWithoutAutogeneratedCodeFrom( + Collection categories) { + List result = new ArrayList(); + for (MaterialCategory each : categories) { + if (!each.isCodeAutogenerated()) { + result.addAll(each.getMaterials()); + } + } + return result; + } + @NotEmpty private String name; @@ -64,6 +77,8 @@ public class MaterialCategory extends IntegrationEntity { @Valid private Set materials = new HashSet(); + private Integer lastMaterialSequenceCode = 0; + // Default constructor, needed by Hibernate protected MaterialCategory() { @@ -247,4 +262,32 @@ public class MaterialCategory extends IntegrationEntity { } return result; } + + public void generateMaterialCodes(int numberOfDigits) { + for (Material material : this.getMaterials()) { + if ((material.getCode() == null) || (material.getCode().isEmpty()) + || (!material.getCode().startsWith(this.getCode()))) { + this.incrementLastMaterialSequenceCode(); + String materialCode = EntitySequence.formatValue( + numberOfDigits, this.getLastMaterialSequenceCode()); + material + .setCode(this.getCode() + + EntitySequence.CODE_SEPARATOR_CHILDREN + + materialCode); + } + } + } + + public void incrementLastMaterialSequenceCode() { + if (this.lastMaterialSequenceCode == null) { + this.lastMaterialSequenceCode = 0; + } + this.lastMaterialSequenceCode++; + } + + @NotNull(message = "last material sequence code not specified") + public Integer getLastMaterialSequenceCode() { + return lastMaterialSequenceCode; + } + } 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 00ae17904..4e3733618 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 @@ -62,6 +62,8 @@ + + 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 99b90df33..067101a48 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 @@ -250,6 +250,7 @@ public class MaterialsController extends codeTb.setValue(materialCategory.getCode()); codeTb.setDisabled(ce.isChecked()); Util.reloadBindings(codeTb); + Util.reloadBindings(gridMaterials); } }); Treecell generateCodeTc = new Treecell(); 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 8a8b58154..8c7bf9107 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 @@ -85,6 +85,8 @@ public class MaterialsModel extends IntegrationEntityModel implements private Map oldCodes = new HashMap(); + private Map oldMaterialCodes = new HashMap(); + @Override @Transactional(readOnly = true) public MutableTreeModel getMaterialCategories() { @@ -107,10 +109,16 @@ public class MaterialsModel extends IntegrationEntityModel implements initializeMaterials(materialCategory.getMaterials()); materialCategories.addToRoot(materialCategory); addCategories(materialCategory, materialCategory.getSubcategories()); + storeOldCodes(materialCategory); + } + } - // it stores temporaly the autogenerated code. - if (materialCategory.isCodeAutogenerated()) { - oldCodes.put(materialCategory, materialCategory.getCode()); + private void storeOldCodes(MaterialCategory materialCategory) { + // it stores temporaly the autogenerated code. + if (materialCategory.isCodeAutogenerated()) { + oldCodes.put(materialCategory, materialCategory.getCode()); + for (Material child : materialCategory.getMaterials()) { + oldMaterialCodes.put(child, child.getCode()); } } } @@ -128,6 +136,7 @@ public class MaterialsModel extends IntegrationEntityModel implements for (MaterialCategory category: categories) { initializeMaterials(category.getMaterials()); materialCategories.add(materialCategory, category); + storeOldCodes(category); final Set subcategories = category.getSubcategories(); if (subcategories != null) { addCategories(category, subcategories); @@ -233,15 +242,24 @@ public class MaterialsModel extends IntegrationEntityModel implements public void confirmSave() throws ValidationException { final List categories = materialCategories.asList(); checkNoCodeRepeatedAtNewMaterials(categories); + Integer numberOfDigits = getNumberOfDigitsCode(); for (MaterialCategory each: categories) { + generateMaterialCodesIfIsNecessary(each, numberOfDigits); categoryDAO.save(each); } } + private void generateMaterialCodesIfIsNecessary(MaterialCategory category, + Integer numberOfDigits) { + if (category.isCodeAutogenerated()) { + category.generateMaterialCodes(numberOfDigits); + } + } + private void checkNoCodeRepeatedAtNewMaterials( final List categories) throws ValidationException { List allMaterials = MaterialCategory - .getAllMaterialsFrom(categories); + .getAllMaterialsWithoutAutogeneratedCodeFrom(categories); Map byCode = new HashMap(); for (Material each : allMaterials) { if (byCode.containsKey(each.getCode())) { @@ -307,6 +325,12 @@ public class MaterialsModel extends IntegrationEntityModel implements @Override protected void restoreOldCodes() { getCurrentEntity().setCode(oldCodes.get(getCurrentEntity())); + for (Material child : ((MaterialCategory) getCurrentEntity()) + .getMaterials()) { + if (!child.isNewObject()) { + child.setCode(oldMaterialCodes.get(child)); + } + } } public void setCodeAutogenerated(boolean codeAutogenerated, diff --git a/navalplanner-webapp/src/main/webapp/materials/materials.zul b/navalplanner-webapp/src/main/webapp/materials/materials.zul index 82a6b24fe..92a9d0a6b 100644 --- a/navalplanner-webapp/src/main/webapp/materials/materials.zul +++ b/navalplanner-webapp/src/main/webapp/materials/materials.zul @@ -89,6 +89,7 @@