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 @@ +