diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/advance/entities/AdvanceAssignment.java b/navalplanner-business/src/main/java/org/navalplanner/business/advance/entities/AdvanceAssignment.java index cf2a3e219..37fc13bbc 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/advance/entities/AdvanceAssignment.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/advance/entities/AdvanceAssignment.java @@ -77,26 +77,19 @@ public abstract class AdvanceAssignment extends BaseEntity { return this.advanceType; } - public void changeAdvanceTypeInParents(AdvanceType oldType, + public void changeAdvanceTypeInParents(final AdvanceType oldType, AdvanceType newType, AdvanceAssignment advance) { if (getOrderElement() != null) { OrderLineGroup parent = getOrderElement().getParent(); - while (parent != null) { - + if (parent != null) { IndirectAdvanceAssignment oldIndirect = parent .getIndirectAdvanceAssignment(oldType); if (oldIndirect != null) { parent.removeIndirectAdvanceAssignment(oldType); - } - - if (!parent - .existsIndirectAdvanceAssignmentWithTheSameType(newType)) { IndirectAdvanceAssignment newIndirect = advance .createIndirectAdvanceFor(parent); parent.addIndirectAdvanceAssignment(newIndirect); } - - parent = parent.getParent(); } } } diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/orders/entities/OrderElement.java b/navalplanner-business/src/main/java/org/navalplanner/business/orders/entities/OrderElement.java index 2522ac461..3c76b424e 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/orders/entities/OrderElement.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/orders/entities/OrderElement.java @@ -697,15 +697,13 @@ public abstract class OrderElement extends IntegrationEntity implements OrderElement orderElement, DirectAdvanceAssignment newAdvanceAssignment) throws DuplicateAdvanceAssignmentForOrderElementException { - for (DirectAdvanceAssignment directAdvanceAssignment : orderElement - .getDirectAdvanceAssignments()) { - if (AdvanceType.equivalentInDB(directAdvanceAssignment - .getAdvanceType(), newAdvanceAssignment.getAdvanceType())) { + if (orderElement + .existsDirectAdvanceAssignmentWithTheSameType(newAdvanceAssignment + .getAdvanceType())) { throw new DuplicateAdvanceAssignmentForOrderElementException( _("Duplicate Progress Assignment For Task"), this, OrderElement.class); - } } if (!orderElement.getChildren().isEmpty()) { for (OrderElement child : orderElement.getChildren()) { @@ -715,6 +713,16 @@ public abstract class OrderElement extends IntegrationEntity implements } } + public boolean existsDirectAdvanceAssignmentWithTheSameType(AdvanceType type) { + for (DirectAdvanceAssignment directAdvanceAssignment : directAdvanceAssignments) { + if (AdvanceType.equivalentInDB(directAdvanceAssignment + .getAdvanceType(), type)) { + return true; + } + } + return false; + } + public BigDecimal getAdvancePercentage() { if ((dirtyLastAdvanceMeasurementForSpreading == null) || dirtyLastAdvanceMeasurementForSpreading) { diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/orders/entities/OrderLineGroup.java b/navalplanner-business/src/main/java/org/navalplanner/business/orders/entities/OrderLineGroup.java index 5cd7bf101..f8ac8650d 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/orders/entities/OrderLineGroup.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/orders/entities/OrderLineGroup.java @@ -824,8 +824,10 @@ public class OrderLineGroup extends OrderElement implements public void addIndirectAdvanceAssignment( IndirectAdvanceAssignment indirectAdvanceAssignment) { - if (!existsIndirectAdvanceAssignmentWithTheSameType(indirectAdvanceAssignment - .getAdvanceType())) { + if ((!existsIndirectAdvanceAssignmentWithTheSameType(indirectAdvanceAssignment + .getAdvanceType())) + && (!existsDirectAdvanceAssignmentWithTheSameType(indirectAdvanceAssignment + .getAdvanceType()))) { indirectAdvanceAssignments.add(indirectAdvanceAssignment); } if (parent != null) { 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 9da039905..10b119151 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 @@ -362,6 +362,7 @@ public class ManageOrderElementAdvancesModel implements @Override public void removeLineAdvanceAssignment(AdvanceAssignment advance) { + advance.setOrderElement(null); this.listAdvanceAssignments.remove(advance); orderElement.removeAdvanceAssignment(advance); this.advanceAssignment = null; @@ -685,21 +686,24 @@ public class ManageOrderElementAdvancesModel implements } else { directAdvanceAssignment = calculateFakeDirectAdvanceAssignment((IndirectAdvanceAssignment) each); } - String title = getInfoAdvanceAssignment(directAdvanceAssignment); - SortedSet listAdvanceMeasurements = directAdvanceAssignment - .getAdvanceMeasurements(); - if (listAdvanceMeasurements.size() > 1) { - for (AdvanceMeasurement advanceMeasurement : listAdvanceMeasurements) { - BigDecimal value = advanceMeasurement.getValue(); - if ((selectedAdvances.size() > 1) && (value != null)) { - BigDecimal maxValue = directAdvanceAssignment - .getMaxValue(); - value = value.divide(maxValue, RoundingMode.DOWN); - } - LocalDate date = advanceMeasurement.getDate(); - if ((value != null) && (date != null)) { - xymodel.addValue(title, Long.valueOf(date - .toDateTimeAtStartOfDay().getMillis()), value); + if (directAdvanceAssignment != null) { + String title = getInfoAdvanceAssignment(directAdvanceAssignment); + SortedSet listAdvanceMeasurements = directAdvanceAssignment + .getAdvanceMeasurements(); + if (listAdvanceMeasurements.size() > 1) { + for (AdvanceMeasurement advanceMeasurement : listAdvanceMeasurements) { + BigDecimal value = advanceMeasurement.getValue(); + if ((selectedAdvances.size() > 1) && (value != null)) { + BigDecimal maxValue = directAdvanceAssignment + .getMaxValue(); + value = value.divide(maxValue, RoundingMode.DOWN); + } + LocalDate date = advanceMeasurement.getDate(); + if ((value != null) && (date != null)) { + xymodel.addValue(title, Long.valueOf(date + .toDateTimeAtStartOfDay().getMillis()), + value); + } } } }