From 14633d8e7a0f6a70f0279938d9dd3217c31bd633 Mon Sep 17 00:00:00 2001 From: Manuel Rego Casasnovas Date: Fri, 21 Oct 2011 18:06:31 +0200 Subject: [PATCH] [Bug #1227] Fix problem with percentage advances not being created Now these are created in SaveCommand, while it's doing the saving. FEA: ItEr75S04BugFixing --- .../IManageOrderElementAdvancesModel.java | 4 -- .../ManageOrderElementAdvancesController.java | 9 ---- .../ManageOrderElementAdvancesModel.java | 43 ----------------- .../web/orders/OrderCRUDController.java | 34 ------------- .../web/planner/order/SaveCommandBuilder.java | 48 +++++++++++++++++++ .../web/orders/OrderModelTest.java | 2 +- 6 files changed, 49 insertions(+), 91 deletions(-) diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/IManageOrderElementAdvancesModel.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/IManageOrderElementAdvancesModel.java index 5d5fd217e..9645da4fd 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/IManageOrderElementAdvancesModel.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/IManageOrderElementAdvancesModel.java @@ -116,10 +116,6 @@ public interface IManageOrderElementAdvancesModel { AdvanceAssignment getSpreadAdvance(); - void createPercentageAdvances(OrderElement orderElement) - throws DuplicateAdvanceAssignmentForOrderElementException, - DuplicateValueTrueReportGlobalAdvanceException; - void cancel(); } diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/ManageOrderElementAdvancesController.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/ManageOrderElementAdvancesController.java index 0aeedb09d..a69c0b6ea 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/ManageOrderElementAdvancesController.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/ManageOrderElementAdvancesController.java @@ -1269,15 +1269,6 @@ public class ManageOrderElementAdvancesController extends messagesForUser.showMessage(Level.ERROR, message); } - public void createPercentageAdvances(IOrderElementModel orderElementModel) - throws DuplicateAdvanceAssignmentForOrderElementException, - DuplicateValueTrueReportGlobalAdvanceException { - setOrderElementModel(orderElementModel); - manageOrderElementAdvancesModel.initEdit(getOrderElement()); - manageOrderElementAdvancesModel - .createPercentageAdvances(getOrderElement()); - } - private String validateValueAdvanceMeasurement( AdvanceMeasurement measurement) { if (manageOrderElementAdvancesModel.greatThanMaxValue(measurement)) { diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/ManageOrderElementAdvancesModel.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/ManageOrderElementAdvancesModel.java index 37bea4793..42f365fe2 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/ManageOrderElementAdvancesModel.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/ManageOrderElementAdvancesModel.java @@ -179,49 +179,6 @@ public class ManageOrderElementAdvancesModel implements } } - public void createPercentageAdvances(OrderElement orderElement) - throws DuplicateAdvanceAssignmentForOrderElementException, - DuplicateValueTrueReportGlobalAdvanceException { - - if (orderElement != null) { - DirectAdvanceAssignment advancePercentage = orderElement - .getAdvanceAssignmentByType(PredefinedAdvancedTypes.PERCENTAGE - .getType()); - - boolean existDirectPercentageAdvance = ((advancePercentage != null) && (!advancePercentage - .isFake())); - - if ((orderElement.isSchedulingPoint()) - && (orderElement.getReportGlobalAdvanceAssignment() == null) - && (!existDirectPercentageAdvance)) { - createPercentageAdvance(orderElement); - - } else if (!existDirectPercentageAdvance) { - - for (OrderElement child : orderElement.getChildren()) { - createPercentageAdvances(child); - } - } - } - } - - private void createPercentageAdvance(OrderElement orderElement) - throws DuplicateAdvanceAssignmentForOrderElementException, - DuplicateValueTrueReportGlobalAdvanceException { - DirectAdvanceAssignment newAdvance = DirectAdvanceAssignment.create(); - newAdvance.setOrderElement(orderElement); - - for (AdvanceType type : this.listAdvanceTypes) { - if (type.getUnitName().equals( - PredefinedAdvancedTypes.PERCENTAGE.getTypeName())) { - newAdvance.setAdvanceType(type); - newAdvance.setMaxValue(getMaxValue(type)); - } - } - newAdvance.setReportGlobalAdvance(true); - orderElement.addAdvanceAssignment(newAdvance); - } - @Override @Transactional(readOnly = true) public void initEdit(OrderElement orderElement) { diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/OrderCRUDController.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/OrderCRUDController.java index f1ff5c7a2..ce8cdb1f7 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/OrderCRUDController.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/OrderCRUDController.java @@ -35,8 +35,6 @@ import javax.annotation.Resource; import org.apache.commons.lang.StringUtils; import org.apache.commons.logging.LogFactory; import org.hibernate.validator.InvalidValue; -import org.navalplanner.business.advance.exceptions.DuplicateAdvanceAssignmentForOrderElementException; -import org.navalplanner.business.advance.exceptions.DuplicateValueTrueReportGlobalAdvanceException; import org.navalplanner.business.calendars.entities.BaseCalendar; import org.navalplanner.business.common.exceptions.ValidationException; import org.navalplanner.business.externalcompanies.entities.ExternalCompany; @@ -784,8 +782,6 @@ public class OrderCRUDController extends GenericForwardComposer { } } - createPercentageAdvances(); - // come back to the default tab. if (getCurrentTab() != null) { selectTab(getCurrentTab().getId()); @@ -801,36 +797,6 @@ public class OrderCRUDController extends GenericForwardComposer { Tab tabGeneralData; - private void createPercentageAdvances() { - - try { - if (manageOrderElementAdvancesController == null) { - Component orderElementAdvances = editWindow - .getFellowIfAny("orderElementAdvances"); - manageOrderElementAdvancesController = (ManageOrderElementAdvancesController) orderElementAdvances - .getVariable("manageOrderElementAdvancesController", - true); - } - manageOrderElementAdvancesController - .createPercentageAdvances(getOrderElementModel()); - } catch (DuplicateAdvanceAssignmentForOrderElementException e) { - messagesForUser - .showMessage( - Level.ERROR, - _("cannot include a progress of the same progress type twice")); - } catch (DuplicateValueTrueReportGlobalAdvanceException e) { - messagesForUser - .showMessage( - Level.ERROR, - _("spread values are not valid, at least one value should be true")); - } catch (Exception e) { - messagesForUser - .showMessage( - Level.ERROR, - _("incorrect initialization of the progress assignment controller.")); - } - } - private void selectDefaultTab() { selectTab(DEFAULT_TAB); } diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/order/SaveCommandBuilder.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/order/SaveCommandBuilder.java index 174f0c715..fe7af3d7d 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/order/SaveCommandBuilder.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/order/SaveCommandBuilder.java @@ -36,8 +36,12 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.hibernate.validator.InvalidValue; import org.joda.time.LocalDate; +import org.navalplanner.business.advance.bootstrap.PredefinedAdvancedTypes; import org.navalplanner.business.advance.entities.AdvanceMeasurement; +import org.navalplanner.business.advance.entities.AdvanceType; import org.navalplanner.business.advance.entities.DirectAdvanceAssignment; +import org.navalplanner.business.advance.exceptions.DuplicateAdvanceAssignmentForOrderElementException; +import org.navalplanner.business.advance.exceptions.DuplicateValueTrueReportGlobalAdvanceException; import org.navalplanner.business.common.BaseEntity; import org.navalplanner.business.common.IAdHocTransactionService; import org.navalplanner.business.common.IOnTransaction; @@ -315,6 +319,7 @@ public class SaveCommandBuilder { if (order.isCodeAutogenerated()) { generateOrderElementCodes(order); } + createAdvancePercentagesIfRequired(order); calculateAndSetTotalHours(order); checkConstraintOrderUniqueCode(order); checkConstraintHoursGroupUniqueCode(order); @@ -341,6 +346,49 @@ public class SaveCommandBuilder { subcontractedTaskDataDAO.removeOrphanedSubcontractedTaskData(); } + private void createAdvancePercentagesIfRequired(Order order) { + List allChildren = order.getAllChildren(); + for (OrderElement each : allChildren) { + if (each.isLeaf()) { + createAdvancePercentageIfRequired(each); + } + } + } + + private void createAdvancePercentageIfRequired(OrderElement orderElement) { + DirectAdvanceAssignment advancePercentage = orderElement + .getDirectAdvanceAssignmentByType(PredefinedAdvancedTypes.PERCENTAGE + .getType()); + + if ((orderElement.isSchedulingPoint()) + && (orderElement.getReportGlobalAdvanceAssignment() == null) + && (advancePercentage == null)) { + createAdvancePercentage(orderElement); + } + } + + private void createAdvancePercentage(OrderElement orderElement) { + DirectAdvanceAssignment newAdvance = DirectAdvanceAssignment + .create(); + newAdvance.setOrderElement(orderElement); + + AdvanceType type = PredefinedAdvancedTypes.PERCENTAGE.getType(); + newAdvance.setAdvanceType(type); + newAdvance.setMaxValue(type.getDefaultMaxValue()); + newAdvance.setReportGlobalAdvance(true); + + try { + orderElement.addAdvanceAssignment(newAdvance); + } catch (DuplicateValueTrueReportGlobalAdvanceException e) { + // This shouldn't happen + throw new RuntimeException(e); + } catch (DuplicateAdvanceAssignmentForOrderElementException e) { + // Do nothing. + // This means that some parent has already defined an advance + // percentage so we don't need to create it at this point + } + } + private void generateOrderElementCodes(Order order) { order.generateOrderElementCodes(entitySequenceDAO .getNumberOfDigitsCode(EntityNameEnum.ORDER)); diff --git a/navalplanner-webapp/src/test/java/org/navalplanner/web/orders/OrderModelTest.java b/navalplanner-webapp/src/test/java/org/navalplanner/web/orders/OrderModelTest.java index 735ba1b87..b0f550418 100644 --- a/navalplanner-webapp/src/test/java/org/navalplanner/web/orders/OrderModelTest.java +++ b/navalplanner-webapp/src/test/java/org/navalplanner/web/orders/OrderModelTest.java @@ -362,7 +362,7 @@ public class OrderModelTest { for (OrderElement orderElement : elements) { assertThat(((OrderLineGroup) orderElement) .getIndirectAdvanceAssignments().size(), - equalTo(0)); + equalTo(2)); } for (int i = 0; i < containers.length; i++) { assertThat(elements.get(i).getId(),