diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/ws/common/impl/OrderElementConverter.java b/navalplanner-webapp/src/main/java/org/navalplanner/ws/common/impl/OrderElementConverter.java
index 065ca0120..7b8fc2207 100644
--- a/navalplanner-webapp/src/main/java/org/navalplanner/ws/common/impl/OrderElementConverter.java
+++ b/navalplanner-webapp/src/main/java/org/navalplanner/ws/common/impl/OrderElementConverter.java
@@ -691,4 +691,13 @@ public final class OrderElementConverter {
return directAdvanceAssignment;
}
+ public static AdvanceMeasurement toEntity(
+ AdvanceMeasurementDTO advanceMeasurementDTO) {
+ AdvanceMeasurement advanceMeasurement = AdvanceMeasurement.create(
+ LocalDate
+ .fromDateFields(advanceMeasurementDTO.date),
+ advanceMeasurementDTO.value);
+ return advanceMeasurement;
+ }
+
}
\ No newline at end of file
diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/ws/subcontract/api/IReportAdvancesService.java b/navalplanner-webapp/src/main/java/org/navalplanner/ws/subcontract/api/IReportAdvancesService.java
new file mode 100644
index 000000000..075ea429c
--- /dev/null
+++ b/navalplanner-webapp/src/main/java/org/navalplanner/ws/subcontract/api/IReportAdvancesService.java
@@ -0,0 +1,35 @@
+/*
+ * This file is part of ###PROJECT_NAME###
+ *
+ * Copyright (C) 2009 Fundación para o Fomento da Calidade Industrial e
+ * Desenvolvemento Tecnolóxico de Galicia
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see .
+ */
+
+package org.navalplanner.ws.subcontract.api;
+
+import org.navalplanner.ws.common.api.InstanceConstraintViolationsListDTO;
+
+/**
+ * Service for managing advances reporting.
+ *
+ * @author Manuel Rego Casasnovas
+ */
+public interface IReportAdvancesService {
+
+ InstanceConstraintViolationsListDTO updateAdvances(
+ OrderElementWithAdvanceMeasurementsListDTO orderElementWithAdvanceMeasurementsListDTO);
+
+}
diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/ws/subcontract/api/OrderElementWithAdvanceMeasurementsDTO.java b/navalplanner-webapp/src/main/java/org/navalplanner/ws/subcontract/api/OrderElementWithAdvanceMeasurementsDTO.java
new file mode 100644
index 000000000..beab6a9ab
--- /dev/null
+++ b/navalplanner-webapp/src/main/java/org/navalplanner/ws/subcontract/api/OrderElementWithAdvanceMeasurementsDTO.java
@@ -0,0 +1,58 @@
+/*
+ * This file is part of ###PROJECT_NAME###
+ *
+ * Copyright (C) 2009 Fundación para o Fomento da Calidade Industrial e
+ * Desenvolvemento Tecnolóxico de Galicia
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see .
+ */
+
+package org.navalplanner.ws.subcontract.api;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import javax.xml.bind.annotation.XmlAttribute;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlElementWrapper;
+import javax.xml.bind.annotation.XmlRootElement;
+
+import org.navalplanner.business.orders.entities.OrderElement;
+import org.navalplanner.ws.common.api.AdvanceMeasurementDTO;
+
+/**
+ * DTO for {@link OrderElement} just with information about advances.
+ *
+ * @author Manuel Rego Casasnovas
+ */
+@XmlRootElement(name = "order-element")
+public class OrderElementWithAdvanceMeasurementsDTO {
+
+ @XmlAttribute
+ public String code;
+
+ @XmlElementWrapper(name = "advance-measurements")
+ @XmlElement(name = "advance-measurement")
+ public Set advanceMeasurements = new HashSet();
+
+ public OrderElementWithAdvanceMeasurementsDTO() {
+ }
+
+ public OrderElementWithAdvanceMeasurementsDTO(String code,
+ Set advanceMeasurements) {
+ this.code = code;
+ this.advanceMeasurements = advanceMeasurements;
+ }
+
+}
diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/ws/subcontract/api/OrderElementWithAdvanceMeasurementsListDTO.java b/navalplanner-webapp/src/main/java/org/navalplanner/ws/subcontract/api/OrderElementWithAdvanceMeasurementsListDTO.java
new file mode 100644
index 000000000..f035d78cb
--- /dev/null
+++ b/navalplanner-webapp/src/main/java/org/navalplanner/ws/subcontract/api/OrderElementWithAdvanceMeasurementsListDTO.java
@@ -0,0 +1,50 @@
+/*
+ * This file is part of ###PROJECT_NAME###
+ *
+ * Copyright (C) 2009 Fundación para o Fomento da Calidade Industrial e
+ * Desenvolvemento Tecnolóxico de Galicia
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see .
+ */
+
+package org.navalplanner.ws.subcontract.api;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlRootElement;
+
+import org.navalplanner.business.orders.entities.OrderElement;
+
+/**
+ * DTO for {@link OrderElement} just with information about advances.
+ *
+ * @author Manuel Rego Casasnovas
+ */
+@XmlRootElement(name = "order-element-list")
+public class OrderElementWithAdvanceMeasurementsListDTO {
+
+ @XmlElement(name = "order-element")
+ public List orderElements = new ArrayList();
+
+ public OrderElementWithAdvanceMeasurementsListDTO() {
+ }
+
+ public OrderElementWithAdvanceMeasurementsListDTO(
+ List orderElements) {
+ this.orderElements = orderElements;
+ }
+
+}
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
new file mode 100644
index 000000000..9a3823877
--- /dev/null
+++ b/navalplanner-webapp/src/main/java/org/navalplanner/ws/subcontract/impl/ReportAdvancesServiceREST.java
@@ -0,0 +1,159 @@
+/*
+ * This file is part of ###PROJECT_NAME###
+ *
+ * Copyright (C) 2009 Fundación para o Fomento da Calidade Industrial e
+ * Desenvolvemento Tecnolóxico de Galicia
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see .
+ */
+
+package org.navalplanner.ws.subcontract.impl;
+
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import javax.ws.rs.Consumes;
+import javax.ws.rs.POST;
+import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
+
+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.DirectAdvanceAssignment;
+import org.navalplanner.business.advance.exceptions.DuplicateAdvanceAssignmentForOrderElementException;
+import org.navalplanner.business.advance.exceptions.DuplicateValueTrueReportGlobalAdvanceException;
+import org.navalplanner.business.common.exceptions.InstanceNotFoundException;
+import org.navalplanner.business.common.exceptions.ValidationException;
+import org.navalplanner.business.orders.daos.IOrderElementDAO;
+import org.navalplanner.business.orders.entities.OrderElement;
+import org.navalplanner.ws.common.api.AdvanceMeasurementDTO;
+import org.navalplanner.ws.common.api.InstanceConstraintViolationsDTO;
+import org.navalplanner.ws.common.api.InstanceConstraintViolationsListDTO;
+import org.navalplanner.ws.common.impl.ConstraintViolationConverter;
+import org.navalplanner.ws.common.impl.OrderElementConverter;
+import org.navalplanner.ws.common.impl.Util;
+import org.navalplanner.ws.subcontract.api.IReportAdvancesService;
+import org.navalplanner.ws.subcontract.api.OrderElementWithAdvanceMeasurementsDTO;
+import org.navalplanner.ws.subcontract.api.OrderElementWithAdvanceMeasurementsListDTO;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+/**
+ * REST-based implementation of {@link IReportAdvancesService}.
+ *
+ * @author Manuel Rego Casasnovas
+ */
+@Path("/reportadvances/")
+@Produces("application/xml")
+@Service("reportAdvancesServiceREST")
+public class ReportAdvancesServiceREST implements IReportAdvancesService {
+
+ @Autowired
+ private IOrderElementDAO orderElementDAO;
+
+ private InstanceConstraintViolationsListDTO getErrorMessage(String code,
+ String message) {
+ // FIXME review errors returned
+ return new InstanceConstraintViolationsListDTO(Arrays
+ .asList(InstanceConstraintViolationsDTO.create(Util
+ .generateInstanceId(1, code), message)));
+ }
+
+ @Override
+ @POST
+ @Consumes("application/xml")
+ @Transactional
+ public InstanceConstraintViolationsListDTO updateAdvances(OrderElementWithAdvanceMeasurementsListDTO orderElementWithAdvanceMeasurementsListDTO) {
+
+ List instanceConstraintViolationsList = new ArrayList();
+
+ InstanceConstraintViolationsDTO instanceConstraintViolationsDTO = null;
+
+ List orderElements = orderElementWithAdvanceMeasurementsListDTO.orderElements;
+ for (OrderElementWithAdvanceMeasurementsDTO orderElementWithAdvanceMeasurementsDTO : orderElements) {
+ try {
+ OrderElement orderElement = orderElementDAO
+ .findUniqueByCode(orderElementWithAdvanceMeasurementsDTO.code);
+
+ DirectAdvanceAssignment advanceAssignmentSubcontractor = orderElement
+ .getDirectAdvanceAssignmentSubcontractor();
+ if (advanceAssignmentSubcontractor == null) {
+ DirectAdvanceAssignment reportGlobal = orderElement
+ .getReportGlobalAdvanceAssignment();
+
+ advanceAssignmentSubcontractor = DirectAdvanceAssignment
+ .create((reportGlobal == null), new BigDecimal(100));
+ advanceAssignmentSubcontractor
+ .setAdvanceType(PredefinedAdvancedTypes.SUBCONTRACTOR
+ .getType());
+ advanceAssignmentSubcontractor
+ .setOrderElement(orderElement);
+
+ try {
+ orderElement
+ .addAdvanceAssignment(advanceAssignmentSubcontractor);
+ } catch (DuplicateValueTrueReportGlobalAdvanceException e) {
+ // This shouldn't happen, because new advance is only
+ // marked as report global if there is not other advance
+ // as report global
+ throw new RuntimeException(e);
+ } catch (DuplicateAdvanceAssignmentForOrderElementException e) {
+ return getErrorMessage(
+ orderElementWithAdvanceMeasurementsDTO.code,
+ "someone in the same branch has the same advance type");
+ }
+ }
+
+ for (AdvanceMeasurementDTO advanceMeasurementDTO : orderElementWithAdvanceMeasurementsDTO.advanceMeasurements) {
+ AdvanceMeasurement advanceMeasurement = advanceAssignmentSubcontractor
+ .getAdvanceMeasurement(LocalDate
+ .fromDateFields(advanceMeasurementDTO.date));
+ if (advanceMeasurement == null) {
+ advanceAssignmentSubcontractor
+ .addAdvanceMeasurements(OrderElementConverter
+ .toEntity(advanceMeasurementDTO));
+ } else {
+ advanceMeasurement
+ .setValue(advanceMeasurementDTO.value);
+ }
+ }
+
+ orderElement.validate();
+ orderElementDAO.save(orderElement);
+ } catch (ValidationException e) {
+ instanceConstraintViolationsDTO = ConstraintViolationConverter
+ .toDTO(Util.generateInstanceId(1,
+ orderElementWithAdvanceMeasurementsDTO.code), e
+ .getInvalidValues());
+ } catch (InstanceNotFoundException e) {
+ return getErrorMessage(
+ orderElementWithAdvanceMeasurementsDTO.code,
+ "instance not found");
+ }
+ }
+
+ if (instanceConstraintViolationsDTO != null) {
+ instanceConstraintViolationsList
+ .add(instanceConstraintViolationsDTO);
+ }
+
+ return new InstanceConstraintViolationsListDTO(
+ instanceConstraintViolationsList);
+ }
+
+}
diff --git a/navalplanner-webapp/src/main/resources/navalplanner-webapp-spring-config.xml b/navalplanner-webapp/src/main/resources/navalplanner-webapp-spring-config.xml
index 0e34b5459..a50853e92 100644
--- a/navalplanner-webapp/src/main/resources/navalplanner-webapp-spring-config.xml
+++ b/navalplanner-webapp/src/main/resources/navalplanner-webapp-spring-config.xml
@@ -51,6 +51,7 @@
+