From 4a337e022395080de18e47c9a8933e3c643bb431 Mon Sep 17 00:00:00 2001 From: Manuel Rego Casasnovas Date: Mon, 25 Jan 2010 17:23:28 +0100 Subject: [PATCH] ItEr45S14CUActualizarTraballoExportadoPorSubcontrataItEr44S20: Created a list on the interface to report advances of different subcontracted projects to the customer. --- .../orders/daos/IOrderElementDAO.java | 2 + .../business/orders/daos/OrderElementDAO.java | 9 +- .../orders/entities/OrderElement.java | 2 +- .../business/orders/entities/OrderLine.java | 2 +- .../orders/entities/OrderLineGroup.java | 2 +- .../web/common/CustomMenuController.java | 3 +- .../ManageOrderElementAdvancesController.java | 6 +- .../web/subcontract/IReportAdvancesModel.java | 48 +++++ .../subcontract/ReportAdvancesController.java | 172 ++++++++++++++++++ .../web/subcontract/ReportAdvancesModel.java | 167 +++++++++++++++++ .../webapp/subcontract/reportAdvances.zul | 57 ++++++ 11 files changed, 460 insertions(+), 10 deletions(-) create mode 100644 navalplanner-webapp/src/main/java/org/navalplanner/web/subcontract/IReportAdvancesModel.java create mode 100644 navalplanner-webapp/src/main/java/org/navalplanner/web/subcontract/ReportAdvancesController.java create mode 100644 navalplanner-webapp/src/main/java/org/navalplanner/web/subcontract/ReportAdvancesModel.java create mode 100644 navalplanner-webapp/src/main/webapp/subcontract/reportAdvances.zul diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/orders/daos/IOrderElementDAO.java b/navalplanner-business/src/main/java/org/navalplanner/business/orders/daos/IOrderElementDAO.java index 6363ab7e2..12ebbd7aa 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/orders/daos/IOrderElementDAO.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/orders/daos/IOrderElementDAO.java @@ -94,4 +94,6 @@ public interface IOrderElementDAO extends IGenericDAO { List getAll(); + public List findOrderElementsWithExternalCode(); + } diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/orders/daos/OrderElementDAO.java b/navalplanner-business/src/main/java/org/navalplanner/business/orders/daos/OrderElementDAO.java index 8a9643d9e..4d0ca64b6 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/orders/daos/OrderElementDAO.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/orders/daos/OrderElementDAO.java @@ -232,4 +232,11 @@ public class OrderElementDAO extends GenericDAOHibernate return list(OrderElement.class); } -} + @Override + public List findOrderElementsWithExternalCode() { + Criteria c = getSession().createCriteria(OrderElement.class); + c.add(Restrictions.isNotNull("externalCode")); + return c.list(); + } + +} \ No newline at end of file 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 618ae4451..8d68b970d 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 @@ -354,7 +354,7 @@ public abstract class OrderElement extends BaseEntity implements protected abstract Set getAllDirectAdvanceAssignments(); - protected abstract Set getAllDirectAdvanceAssignments( + public abstract Set getAllDirectAdvanceAssignments( AdvanceType advanceType); protected abstract Set getAllDirectAdvanceAssignmentsReportGlobal(); diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/orders/entities/OrderLine.java b/navalplanner-business/src/main/java/org/navalplanner/business/orders/entities/OrderLine.java index 95f847d9e..8ae69369b 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/orders/entities/OrderLine.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/orders/entities/OrderLine.java @@ -429,7 +429,7 @@ public class OrderLine extends OrderElement { return BigDecimal.ZERO; } - protected Set getAllDirectAdvanceAssignments( + public Set getAllDirectAdvanceAssignments( AdvanceType advanceType) { Set result = new HashSet(); for (DirectAdvanceAssignment directAdvanceAssignment : directAdvanceAssignments) { 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 bfde306ba..bfca7a2ec 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 @@ -604,7 +604,7 @@ public class OrderLineGroup extends OrderElement implements } @Override - protected Set getAllDirectAdvanceAssignments( + public Set getAllDirectAdvanceAssignments( AdvanceType advanceType) { Set result = new HashSet(); diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/common/CustomMenuController.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/common/CustomMenuController.java index 3e0935b73..cdced8adf 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/common/CustomMenuController.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/common/CustomMenuController.java @@ -198,7 +198,8 @@ public class CustomMenuController extends Div implements IMenuItemsRegister { subItem(_("General resource allocation"),"/planner/index.zul;company_load","01-introducion.html#id1"), subItem(_("Orders list"), "/planner/index.zul;orders_list","01-introducion.html#id2"), subItem(_("Templates list"), "/templates/templates.zul", ""), - subItem(_("Subcontracted tasks list"),"/subcontract/subcontractedTasks.zul", "")); + subItem(_("Subcontracted tasks list"), "/subcontract/subcontractedTasks.zul", ""), + subItem(_("Report advances"), "/subcontract/reportAdvances.zul", "")); topItem(_("Resources"), "/resources/worker/worker.zul", "", subItem(_("Workers List"), "/resources/worker/worker.zul","05-recursos.html#xesti-n-de-traballadores"), diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/ManageOrderElementAdvancesController.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/ManageOrderElementAdvancesController.java index ee968089e..eb8f12dcd 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/ManageOrderElementAdvancesController.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/ManageOrderElementAdvancesController.java @@ -263,11 +263,7 @@ public class ManageOrderElementAdvancesController extends .getPossibleAdvanceTypes(advance); for(AdvanceType advanceType : listAdvanceType){ if (!advanceType.getUnitName().equals( - PredefinedAdvancedTypes.CHILDREN.getTypeName()) - && !advanceType.getUnitName() - .equals( - PredefinedAdvancedTypes.SUBCONTRACTOR - .getTypeName())) { + PredefinedAdvancedTypes.CHILDREN.getTypeName())) { Comboitem comboItem = new Comboitem(); comboItem.setValue(advanceType); comboItem.setLabel(advanceType.getUnitName()); diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/subcontract/IReportAdvancesModel.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/subcontract/IReportAdvancesModel.java new file mode 100644 index 000000000..4667395ff --- /dev/null +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/subcontract/IReportAdvancesModel.java @@ -0,0 +1,48 @@ +/* + * 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.web.subcontract; + +import java.util.List; +import java.util.Set; + +import org.navalplanner.business.advance.entities.AdvanceMeasurement; +import org.navalplanner.business.advance.entities.DirectAdvanceAssignment; +import org.navalplanner.business.orders.entities.Order; + + +/** + * Contract for {@link ReportAdvancesController}. + * + * @author Manuel Rego Casasnovas + */ +public interface IReportAdvancesModel { + + List getOrdersWithExternalCodeInAnyOrderElement(); + + AdvanceMeasurement getLastAdvanceMeasurement( + Set allDirectAdvanceAssignments); + + AdvanceMeasurement getLastAdvanceMeasurementReported( + Set allDirectAdvanceAssignments); + + boolean isAnyAdvanceMeasurementNotReported( + Set allDirectAdvanceAssignments); + +} \ No newline at end of file diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/subcontract/ReportAdvancesController.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/subcontract/ReportAdvancesController.java new file mode 100644 index 000000000..35f844627 --- /dev/null +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/subcontract/ReportAdvancesController.java @@ -0,0 +1,172 @@ +/* + * 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.web.subcontract; + +import static org.navalplanner.web.I18nHelper._; + +import java.util.List; +import java.util.Set; + +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.common.exceptions.ValidationException; +import org.navalplanner.business.orders.entities.Order; +import org.navalplanner.web.common.IMessagesForUser; +import org.navalplanner.web.common.MessagesForUser; +import org.navalplanner.web.common.Util; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.config.BeanDefinition; +import org.springframework.context.annotation.Scope; +import org.zkoss.zk.ui.Component; +import org.zkoss.zk.ui.event.Event; +import org.zkoss.zk.ui.event.EventListener; +import org.zkoss.zk.ui.event.Events; +import org.zkoss.zk.ui.util.GenericForwardComposer; +import org.zkoss.zul.Button; +import org.zkoss.zul.Label; +import org.zkoss.zul.Row; +import org.zkoss.zul.RowRenderer; +import org.zkoss.zul.api.Window; + +/** + * Controller for operations related with report advances. + * + * @author Manuel Rego Casasnovas + */ +@org.springframework.stereotype.Component +@Scope(BeanDefinition.SCOPE_PROTOTYPE) +public class ReportAdvancesController extends GenericForwardComposer { + + private Window window; + + private Component messagesContainer; + private IMessagesForUser messagesForUser; + + @Autowired + private IReportAdvancesModel reportAdvancesModel; + + private ReportAdvancesOrderRenderer reportAdvancesOrderRenderer = new ReportAdvancesOrderRenderer(); + + @Override + public void doAfterCompose(Component comp) throws Exception { + super.doAfterCompose(comp); + window = (Window) comp; + window.setVariable("controller", this, true); + messagesForUser = new MessagesForUser(messagesContainer); + } + + public List getOrdersWithExternalCodeInAnyOrderElement() { + return reportAdvancesModel.getOrdersWithExternalCodeInAnyOrderElement(); + } + + public ReportAdvancesOrderRenderer getReportAdvancesOrderRenderer() { + return reportAdvancesOrderRenderer; + } + + private class ReportAdvancesOrderRenderer implements RowRenderer { + + @Override + public void render(Row row, Object data) throws Exception { + Order order = (Order) data; + row.setValue(order); + + appendLabel(row, order.getCode()); + appendLabel(row, toString(order.getCustomerReference())); + appendLabel(row, order.getName()); + + Set allDirectAdvanceAssignments = order + .getAllDirectAdvanceAssignments(PredefinedAdvancedTypes.SUBCONTRACTOR + .getType()); + + AdvanceMeasurement lastAdvanceMeasurementReported = reportAdvancesModel + .getLastAdvanceMeasurementReported(allDirectAdvanceAssignments); + if (lastAdvanceMeasurementReported != null) { + appendLabel(row, toString(lastAdvanceMeasurementReported.getDate())); + appendLabel(row, toString(lastAdvanceMeasurementReported.getValue())); + } else { + appendLabel(row, ""); + appendLabel(row, ""); + } + + AdvanceMeasurement lastAdvanceMeasurement = reportAdvancesModel + .getLastAdvanceMeasurement(allDirectAdvanceAssignments); + if (lastAdvanceMeasurement != null) { + appendLabel(row, toString(lastAdvanceMeasurement.getDate())); + appendLabel(row, toString(lastAdvanceMeasurement.getValue())); + } else { + appendLabel(row, ""); + appendLabel(row, ""); + } + + if (reportAdvancesModel + .isAnyAdvanceMeasurementNotReported(allDirectAdvanceAssignments)) { + appendLabel(row, _("Pending update")); + appendOperations(row, order, false); + } else { + appendLabel(row, _("Updated")); + appendOperations(row, order, true); + } + + } + + private String toString(Object object) { + if (object == null) { + return ""; + } + + return object.toString(); + } + + private void appendLabel(Row row, String label) { + row.appendChild(new Label(label)); + } + + private void appendOperations(Row row, Order order, + boolean sendButtonDisabled) { + row.appendChild(getSendButton(order, sendButtonDisabled)); + } + + private Button getSendButton(final Order order, + boolean sendButtonDisabled) { + Button sendButton = new Button(_("Send")); + sendButton.addEventListener(Events.ON_CLICK, new EventListener() { + + @Override + public void onEvent(Event event) throws Exception { + try { + // TODO reportAdvancesModel.sendAdvances(order); + } catch (ValidationException e) { + messagesForUser.showInvalidValues(e); + } + + Util.reloadBindings(window); + } + + }); + + sendButton.setDisabled(sendButtonDisabled); + + return sendButton; + } + + } + +} \ No newline at end of file diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/subcontract/ReportAdvancesModel.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/subcontract/ReportAdvancesModel.java new file mode 100644 index 000000000..e1cb52002 --- /dev/null +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/subcontract/ReportAdvancesModel.java @@ -0,0 +1,167 @@ +/* + * 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.web.subcontract; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.navalplanner.business.advance.bootstrap.PredefinedAdvancedTypes; +import org.navalplanner.business.advance.daos.IAdvanceAssignmentDAO; +import org.navalplanner.business.advance.entities.AdvanceMeasurement; +import org.navalplanner.business.advance.entities.DirectAdvanceAssignment; +import org.navalplanner.business.orders.daos.IOrderElementDAO; +import org.navalplanner.business.orders.entities.Order; +import org.navalplanner.business.orders.entities.OrderElement; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.config.BeanDefinition; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +/** + * Model for operations related with report advances. + * + * @author Manuel Rego Casasnovas + */ +@Component +@Scope(BeanDefinition.SCOPE_PROTOTYPE) +public class ReportAdvancesModel implements IReportAdvancesModel { + + private static Log LOG = LogFactory.getLog(ReportAdvancesModel.class); + + @Autowired + private IOrderElementDAO orderElementDAO; + + @Autowired + private IAdvanceAssignmentDAO advanceAssignmentDAO; + + @Override + @Transactional(readOnly = true) + public List getOrdersWithExternalCodeInAnyOrderElement() { + List orderElements = orderElementDAO + .findOrderElementsWithExternalCode(); + + Map ordersMap = new HashMap(); + for (OrderElement orderElement : orderElements) { + Order order = orderElementDAO + .loadOrderAvoidingProxyFor(orderElement); + if (ordersMap.get(order.getId()) == null) { + ordersMap.put(order.getId(), order); + forceLoadDirectAdvanceAssignments(order); + } + } + + return new ArrayList(ordersMap.values()); + } + + private void forceLoadDirectAdvanceAssignments(Order order) { + order.getAllDirectAdvanceAssignments( + PredefinedAdvancedTypes.SUBCONTRACTOR.getType()).size(); + } + + @Override + @Transactional(readOnly = true) + public AdvanceMeasurement getLastAdvanceMeasurement( + Set allDirectAdvanceAssignments) { + if (allDirectAdvanceAssignments.isEmpty()) { + return null; + } + + Iterator iterator = allDirectAdvanceAssignments + .iterator(); + DirectAdvanceAssignment advanceAssignment = iterator.next(); + advanceAssignmentDAO.reattachUnmodifiedEntity(advanceAssignment); + + AdvanceMeasurement lastAdvanceMeasurement = advanceAssignment + .getLastAdvanceMeasurement(); + while (iterator.hasNext()) { + advanceAssignment = iterator.next(); + advanceAssignmentDAO.reattachUnmodifiedEntity(advanceAssignment); + AdvanceMeasurement advanceMeasurement = advanceAssignment + .getLastAdvanceMeasurement(); + if (advanceMeasurement.getDate().compareTo( + lastAdvanceMeasurement.getDate()) > 0) { + lastAdvanceMeasurement = advanceMeasurement; + } + } + + return lastAdvanceMeasurement; + } + + @Override + @Transactional(readOnly = true) + public AdvanceMeasurement getLastAdvanceMeasurementReported( + Set allDirectAdvanceAssignments) { + if (allDirectAdvanceAssignments.isEmpty()) { + return null; + } + + AdvanceMeasurement lastAdvanceMeasurementReported = null; + + for (DirectAdvanceAssignment advanceAssignment : allDirectAdvanceAssignments) { + advanceAssignmentDAO.reattachUnmodifiedEntity(advanceAssignment); + + for (AdvanceMeasurement advanceMeasurement : advanceAssignment.getAdvanceMeasurements()) { + if (advanceMeasurement.getCommunicationDate() != null) { + if (lastAdvanceMeasurementReported == null) { + lastAdvanceMeasurementReported = advanceMeasurement; + } else { + if (advanceMeasurement.getCommunicationDate() + .compareTo( + lastAdvanceMeasurementReported + .getCommunicationDate()) > 0) { + lastAdvanceMeasurementReported = advanceMeasurement; + } + } + } + } + } + + return lastAdvanceMeasurementReported; + } + + @Override + @Transactional(readOnly = true) + public boolean isAnyAdvanceMeasurementNotReported( + Set allDirectAdvanceAssignments) { + if (allDirectAdvanceAssignments.isEmpty()) { + return false; + } + + for (DirectAdvanceAssignment advanceAssignment : allDirectAdvanceAssignments) { + advanceAssignmentDAO.reattachUnmodifiedEntity(advanceAssignment); + + for (AdvanceMeasurement advanceMeasurement : advanceAssignment.getAdvanceMeasurements()) { + if (advanceMeasurement.getCommunicationDate() == null) { + return true; + } + } + } + + return false; + } + +} diff --git a/navalplanner-webapp/src/main/webapp/subcontract/reportAdvances.zul b/navalplanner-webapp/src/main/webapp/subcontract/reportAdvances.zul new file mode 100644 index 000000000..8d2afe03f --- /dev/null +++ b/navalplanner-webapp/src/main/webapp/subcontract/reportAdvances.zul @@ -0,0 +1,57 @@ + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + +
+