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 653df1717..b14f2926c 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 @@ -30,8 +30,8 @@ import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; -import java.util.Map.Entry; import java.util.Set; +import java.util.Map.Entry; import org.apache.commons.lang.Validate; import org.hibernate.validator.AssertTrue; @@ -1259,4 +1259,14 @@ public abstract class OrderElement extends IntegrationEntity implements return sumChargedHours; } + public void updateAdvancePercentageTaskElement() { + BigDecimal advancePercentage = this.getAdvancePercentage(); + if (this.getTaskSource() != null) { + if (this.getTaskSource().getTask() != null) { + this.getTaskSource().getTask().setAdvancePercentage( + advancePercentage); + } + } + } + } 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 cfe9d88a4..44aa9fe0f 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 @@ -544,10 +544,6 @@ public class OrderElementTest { new BigDecimal(1000), two, new BigDecimal(100), three, new BigDecimal(350), four, new BigDecimal(400)); - System.out.println("advance " + orderElement.getAdvancePercentage()); - System.out.println("otro " - + new BigDecimal(4333).divide(new BigDecimal(10000)) - .setScale(4)); assertThat(orderElement.getAdvancePercentage(), equalTo(new BigDecimal( 4333).divide(new BigDecimal(10000)).setScale(4))); diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/OrderModel.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/OrderModel.java index 5ae7b0cbd..ba76de3bf 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/OrderModel.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/OrderModel.java @@ -28,7 +28,6 @@ import java.util.Collection; import java.util.ConcurrentModificationException; import java.util.Date; import java.util.HashMap; -import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; @@ -89,7 +88,6 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; import org.zkoss.ganttz.IPredicate; import org.zkoss.zul.Messagebox; @@ -567,13 +565,7 @@ public class OrderModel implements IOrderModel { } private void calculateAdvancePercentage(OrderElement orderElement) { - BigDecimal advancePercentage = orderElement.getAdvancePercentage(); - if (orderElement.getTaskSource() != null) { - if (orderElement.getTaskSource().getTask() != null) { - orderElement.getTaskSource().getTask().setAdvancePercentage( - advancePercentage); - } - } + orderElement.updateAdvancePercentageTaskElement(); } private void createAndSaveNewOrderVersion(Scenario currentScenario, diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/TaskElementAdapter.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/TaskElementAdapter.java index 5cd505636..0733305d1 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/TaskElementAdapter.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/TaskElementAdapter.java @@ -247,8 +247,12 @@ public class TaskElementAdapter implements ITaskElementAdapter { @Override public Date getHoursAdvanceEndDate() { OrderElement orderElement = taskElement.getOrderElement(); - Integer assignedHours = - orderElement.getSumChargedHours().getTotalChargedHours(); + + Integer assignedHours = 0; + if (orderElement.getSumChargedHours() != null) { + assignedHours = orderElement.getSumChargedHours() + .getTotalChargedHours(); + } LocalDate date = calculateLimitDate(assignedHours); if (date == null) { diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/advances/AdvanceAssignmentPlanningModel.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/advances/AdvanceAssignmentPlanningModel.java index 85ae05713..c6dbce091 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/advances/AdvanceAssignmentPlanningModel.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/advances/AdvanceAssignmentPlanningModel.java @@ -21,8 +21,6 @@ package org.navalplanner.web.planner.advances; -import java.math.BigDecimal; - import org.navalplanner.business.advance.entities.AdvanceAssignment; import org.navalplanner.business.advance.entities.AdvanceMeasurement; import org.navalplanner.business.advance.entities.DirectAdvanceAssignment; @@ -76,7 +74,6 @@ public class AdvanceAssignmentPlanningModel implements calculateAdvancePercentage(parent); parent = parent.getParent(); } - } @Override @@ -151,13 +148,7 @@ public class AdvanceAssignmentPlanningModel implements } private void calculateAdvancePercentage(OrderElement orderElement) { - BigDecimal advancePercentage = orderElement.getAdvancePercentage(); - if (orderElement.getTaskSource() != null) { - if (orderElement.getTaskSource().getTask() != null) { - orderElement.getTaskSource().getTask().setAdvancePercentage( - advancePercentage); - } - } + orderElement.updateAdvancePercentageTaskElement(); } } diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/ws/subcontract/impl/ReportAdvancesServiceREST.java b/navalplanner-webapp/src/main/java/org/navalplanner/ws/subcontract/impl/ReportAdvancesServiceREST.java index 00fc0d099..d165a5c54 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/ws/subcontract/impl/ReportAdvancesServiceREST.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/ws/subcontract/impl/ReportAdvancesServiceREST.java @@ -32,6 +32,7 @@ import javax.ws.rs.Produces; import org.apache.commons.lang.StringUtils; import org.navalplanner.business.advance.bootstrap.PredefinedAdvancedTypes; +import org.navalplanner.business.advance.entities.AdvanceAssignment; import org.navalplanner.business.advance.entities.AdvanceMeasurement; import org.navalplanner.business.advance.entities.DirectAdvanceAssignment; import org.navalplanner.business.advance.exceptions.DuplicateAdvanceAssignmentForOrderElementException; @@ -41,7 +42,11 @@ import org.navalplanner.business.common.exceptions.ValidationException; import org.navalplanner.business.externalcompanies.daos.IExternalCompanyDAO; import org.navalplanner.business.externalcompanies.entities.ExternalCompany; import org.navalplanner.business.orders.daos.IOrderElementDAO; +import org.navalplanner.business.orders.entities.Order; import org.navalplanner.business.orders.entities.OrderElement; +import org.navalplanner.business.scenarios.bootstrap.PredefinedScenarios; +import org.navalplanner.business.scenarios.entities.OrderVersion; +import org.navalplanner.business.scenarios.entities.Scenario; import org.navalplanner.ws.common.api.AdvanceMeasurementDTO; import org.navalplanner.ws.common.api.InstanceConstraintViolationsDTO; import org.navalplanner.ws.common.api.InstanceConstraintViolationsListDTO; @@ -119,6 +124,7 @@ public class ReportAdvancesServiceREST implements IReportAdvancesService { DirectAdvanceAssignment advanceAssignmentSubcontractor = orderElement .getDirectAdvanceAssignmentSubcontractor(); + if (advanceAssignmentSubcontractor == null) { DirectAdvanceAssignment reportGlobal = orderElement .getReportGlobalAdvanceAssignment(); @@ -160,6 +166,24 @@ public class ReportAdvancesServiceREST implements IReportAdvancesService { } } + // set the advance assingment subcontractor like spread + AdvanceAssignment spreadAdvance = orderElement + .getReportGlobalAdvanceAssignment(); + if (spreadAdvance != null + && !spreadAdvance + .equals(advanceAssignmentSubcontractor)) { + spreadAdvance.setReportGlobalAdvance(false); + advanceAssignmentSubcontractor.setReportGlobalAdvance(true); + } + // update the advance percentage in its related task + Scenario scenarioMaster = PredefinedScenarios.MASTER + .getScenario(); + Order order = orderElementDAO + .loadOrderAvoidingProxyFor(orderElement); + OrderVersion orderVersion = order.getScenarios().get( + scenarioMaster); + updateAdvancePercentage(orderVersion, orderElement); + orderElement.validate(); orderElementDAO.save(orderElement); } catch (ValidationException e) { @@ -183,4 +207,15 @@ public class ReportAdvancesServiceREST implements IReportAdvancesService { instanceConstraintViolationsList); } + private void updateAdvancePercentage(OrderVersion orderVersion, + OrderElement orderElement) { + orderElement.useSchedulingDataFor(orderVersion); + orderElement.updateAdvancePercentageTaskElement(); + OrderElement parent = orderElement.getParent(); + while (parent != null) { + parent.useSchedulingDataFor(orderVersion); + parent.updateAdvancePercentageTaskElement(); + parent = parent.getParent(); + } + } } diff --git a/navalplanner-webapp/src/test/java/org/navalplanner/web/test/ws/subcontract/ReportAdvancesServiceTest.java b/navalplanner-webapp/src/test/java/org/navalplanner/web/test/ws/subcontract/ReportAdvancesServiceTest.java index 3de34bde0..0520f91ca 100644 --- a/navalplanner-webapp/src/test/java/org/navalplanner/web/test/ws/subcontract/ReportAdvancesServiceTest.java +++ b/navalplanner-webapp/src/test/java/org/navalplanner/web/test/ws/subcontract/ReportAdvancesServiceTest.java @@ -50,9 +50,11 @@ import org.navalplanner.business.advance.entities.DirectAdvanceAssignment; import org.navalplanner.business.common.IAdHocTransactionService; import org.navalplanner.business.common.IOnTransaction; import org.navalplanner.business.common.daos.IConfigurationDAO; +import org.navalplanner.business.common.exceptions.InstanceNotFoundException; import org.navalplanner.business.externalcompanies.daos.IExternalCompanyDAO; import org.navalplanner.business.externalcompanies.entities.ExternalCompany; import org.navalplanner.business.orders.daos.IOrderDAO; +import org.navalplanner.business.orders.daos.IOrderElementDAO; import org.navalplanner.business.orders.entities.Order; import org.navalplanner.business.orders.entities.OrderElement; import org.navalplanner.business.orders.entities.OrderLine; @@ -117,6 +119,9 @@ public class ReportAdvancesServiceTest { @Autowired private IOrderDAO orderDAO; + @Autowired + private IOrderElementDAO orderElementDAO; + @Autowired private IConfigurationDAO configurationDAO; @@ -145,7 +150,7 @@ public class ReportAdvancesServiceTest { @Test public void validAdvancesReport() { - Order order = givenValidOrderAlreadyStored(); + Order order = givenOrder(); String orderElementCode = order.getChildren().get(0).getCode(); Date date = new Date(); @@ -195,6 +200,16 @@ public class ReportAdvancesServiceTest { .asList(orderElementWithAdvanceMeasurementsDTO)); } + private Order givenOrder() { + return transactionService + .runOnAnotherTransaction(new IOnTransaction() { + @Override + public Order execute() { + return givenValidOrderAlreadyStored(); + } + }); + } + private Order givenValidOrderAlreadyStored() { Order order = Order.create(); order.setCode(UUID.randomUUID().toString()); @@ -212,8 +227,12 @@ public class ReportAdvancesServiceTest { orderLine.setName("Order line name"); orderDAO.save(order); - - return order; + orderDAO.flush(); + try { + return orderDAO.find(order.getId()); + } catch (InstanceNotFoundException e) { + return null; + } } }