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 33bdcfb9a..97191b75b 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 @@ -216,7 +216,7 @@ public abstract class OrderElement extends BaseEntity { } } - private void checkNoOtherGlobalAdvanceAssignment( + protected void checkNoOtherGlobalAdvanceAssignment( DirectAdvanceAssignment newAdvanceAssignment) throws DuplicateValueTrueReportGlobalAdvanceException { if (!newAdvanceAssignment.getReportGlobalAdvance()) { 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 aef0b6242..b692c6f6c 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 @@ -21,6 +21,7 @@ import org.navalplanner.business.advance.entities.AdvanceType; import org.navalplanner.business.advance.entities.DirectAdvanceAssignment; import org.navalplanner.business.advance.entities.IndirectAdvanceAssignment; import org.navalplanner.business.advance.exceptions.DuplicateAdvanceAssignmentForOrderElementException; +import org.navalplanner.business.advance.exceptions.DuplicateValueTrueReportGlobalAdvanceException; public class OrderLineGroup extends OrderElement implements IOrderLineGroup { @@ -619,4 +620,22 @@ public class OrderLineGroup extends OrderElement implements IOrderLineGroup { return false; } + @Override + protected void checkNoOtherGlobalAdvanceAssignment( + DirectAdvanceAssignment newAdvanceAssignment) + throws DuplicateValueTrueReportGlobalAdvanceException { + if (!newAdvanceAssignment.getReportGlobalAdvance()) { + return; + } + Set advanceAssignments = new HashSet(); + advanceAssignments.addAll(directAdvanceAssignments); + advanceAssignments.addAll(indirectAdvanceAssignments); + for (AdvanceAssignment advanceAssignment : advanceAssignments) { + if (advanceAssignment.getReportGlobalAdvance()) { + throw new DuplicateValueTrueReportGlobalAdvanceException( + "Duplicate Value True ReportGlobalAdvance For Order Element", + this, OrderElement.class); + } + } + } } diff --git a/navalplanner-business/src/test/java/org/navalplanner/business/test/orders/entities/AddAdvanceAssignmentsToOrderElementTest.java b/navalplanner-business/src/test/java/org/navalplanner/business/test/orders/entities/AddAdvanceAssignmentsToOrderElementTest.java index 1dbd804bf..5945aaad1 100644 --- a/navalplanner-business/src/test/java/org/navalplanner/business/test/orders/entities/AddAdvanceAssignmentsToOrderElementTest.java +++ b/navalplanner-business/src/test/java/org/navalplanner/business/test/orders/entities/AddAdvanceAssignmentsToOrderElementTest.java @@ -237,7 +237,8 @@ public class AddAdvanceAssignmentsToOrderElementTest { advanceAssignmentB.setAdvanceType(advanceTypeB); advanceAssignmentB.getAdvanceMeasurements().add(advanceMeasurement); - + OrderElementTest + .removeReportGlobalAdvanceFromChildrenAdvance(container); container.addAdvanceAssignment(advanceAssignmentA); son.addAdvanceAssignment(advanceAssignmentB); } @@ -254,6 +255,8 @@ public class AddAdvanceAssignmentsToOrderElementTest { DirectAdvanceAssignment advanceAssignmentA = createValidAdvanceAssignment(true); advanceAssignmentA.setAdvanceType(advanceTypeA); + OrderElementTest + .removeReportGlobalAdvanceFromChildrenAdvance(container); container.addAdvanceAssignment(advanceAssignmentA); assertThat(container.getDirectAdvanceAssignments().size(), equalTo(1)); @@ -273,6 +276,7 @@ public class AddAdvanceAssignmentsToOrderElementTest { DirectAdvanceAssignment anotherAssignmentWithSameType = createValidAdvanceAssignment(false); anotherAssignmentWithSameType.setAdvanceType(advanceTypeA); + OrderElementTest.removeReportGlobalAdvanceFromChildrenAdvance(father); father.addAdvanceAssignment(advanceAssignmentA); try { @@ -350,4 +354,19 @@ public class AddAdvanceAssignmentsToOrderElementTest { } } + @Test(expected = DuplicateValueTrueReportGlobalAdvanceException.class) + public void cannotAddTwoAssignmetsDirectAndIndirectWithGlobalReportValue() + throws Exception { + OrderLineGroup orderLineGroup = OrderLineGroup.create(); + orderLineGroup.setName("test"); + orderLineGroup.setCode("1"); + + AdvanceType advanceType = createAndSaveType("test"); + + DirectAdvanceAssignment advanceAssignment = createValidAdvanceAssignment(true); + advanceAssignment.setAdvanceType(advanceType); + + orderLineGroup.addAdvanceAssignment(advanceAssignment); + } + } diff --git a/navalplanner-business/src/test/java/org/navalplanner/business/test/orders/entities/OrderElementTest.java b/navalplanner-business/src/test/java/org/navalplanner/business/test/orders/entities/OrderElementTest.java index 1286c8a6a..8710b985c 100644 --- a/navalplanner-business/src/test/java/org/navalplanner/business/test/orders/entities/OrderElementTest.java +++ b/navalplanner-business/src/test/java/org/navalplanner/business/test/orders/entities/OrderElementTest.java @@ -372,10 +372,11 @@ public class OrderElementTest { public void checkAdvancePercentageOrderGroupLineWithAssignments1() throws DuplicateValueTrueReportGlobalAdvanceException, DuplicateAdvanceAssignmentForOrderElementException { - OrderElement orderElement = givenOrderLineGroupWithTwoOrderLines(1000, + OrderLineGroup orderLineGroup = givenOrderLineGroupWithTwoOrderLines( + 1000, 2000); - List children = orderElement.getChildren(); + List children = orderLineGroup.getChildren(); addAvanceAssignmentWithMeasurement(children.get(0), PredefinedAdvancedTypes.UNITS.getType(), new BigDecimal(1000), new BigDecimal(400), true); @@ -383,11 +384,12 @@ public class OrderElementTest { PredefinedAdvancedTypes.UNITS.getType(), new BigDecimal(2000), new BigDecimal(200), true); - addAvanceAssignmentWithMeasurement(orderElement, + removeReportGlobalAdvanceFromChildrenAdvance(orderLineGroup); + addAvanceAssignmentWithMeasurement(orderLineGroup, PredefinedAdvancedTypes.PERCENTAGE.getType(), new BigDecimal( 100), new BigDecimal(90), true); - assertThat(orderElement.getAdvancePercentage(), equalTo(new BigDecimal( + assertThat(orderLineGroup.getAdvancePercentage(), equalTo(new BigDecimal( 90).divide(new BigDecimal(100)))); } @@ -673,6 +675,7 @@ public class OrderElementTest { AdvanceType advanceType2 = AdvanceType.create("test2", new BigDecimal( 10000), true, new BigDecimal(1), true, false); + removeReportGlobalAdvanceFromChildrenAdvance(orderLineGroup_1_1); addAvanceAssignmentWithMeasurement(orderLineGroup_1_1, advanceType2, new BigDecimal(100), new BigDecimal(50), true); @@ -882,4 +885,16 @@ public class OrderElementTest { .setScale(2))); } + public static void removeReportGlobalAdvanceFromChildrenAdvance( + OrderLineGroup orderLineGroup) { + for (IndirectAdvanceAssignment indirectAdvanceAssignment : orderLineGroup + .getIndirectAdvanceAssignments()) { + if (indirectAdvanceAssignment.getAdvanceType().getUnitName() + .equals(PredefinedAdvancedTypes.CHILDREN.getTypeName())) { + indirectAdvanceAssignment.setReportGlobalAdvance(false); + break; + } + } + } + }