/* * This file is part of LibrePlan * * Copyright (C) 2009-2010 Fundación para o Fomento da Calidade Industrial e * Desenvolvemento Tecnolóxico de Galicia * Copyright (C) 2010-2011 Igalia, S.L. * * Copyright (C) 2011-2012 WirelessGalicia, S.L. * * 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 <http://www.gnu.org/licenses/>. */ package org.libreplan.web.subcontract; import static org.libreplan.web.I18nHelper._; import java.io.IOException; import java.util.List; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.libreplan.business.common.exceptions.ValidationException; import org.libreplan.business.orders.entities.Order; import org.libreplan.business.planner.entities.SubcontractedTaskData; import org.libreplan.web.common.IMessagesForUser; import org.libreplan.web.common.Level; import org.libreplan.web.common.MessagesForUser; import org.libreplan.web.common.Util; import org.libreplan.web.subcontract.exceptions.ConnectionProblemsException; import org.libreplan.web.subcontract.exceptions.UnrecoverableErrorServiceException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.context.annotation.Scope; import org.zkoss.ganttz.servlets.CallbackServlet; import org.zkoss.ganttz.servlets.CallbackServlet.DisposalMode; import org.zkoss.ganttz.servlets.CallbackServlet.IServletRequestHandler; import org.zkoss.zk.ui.Component; import org.zkoss.zk.ui.Executions; 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.Column; import org.zkoss.zul.Grid; import org.zkoss.zul.Label; import org.zkoss.zul.ext.Sortable; import org.zkoss.zul.Row; import org.zkoss.zul.RowRenderer; import org.zkoss.zul.Vbox; import org.zkoss.zul.Window; /** * Controller for operations related with subcontracted tasks. * * @author Manuel Rego Casasnovas <mrego@igalia.com> * @author Susana Montes Pedreira <smontes@wirelessgalicia.com> */ @org.springframework.stereotype.Component @Scope(BeanDefinition.SCOPE_PROTOTYPE) public class SubcontractedTasksController extends GenericForwardComposer { private Window window; private Column columnBySort; private Grid listing; private Component messagesContainer; private IMessagesForUser messagesForUser; @Autowired private ISubcontractedTasksModel subcontractedTasksModel; private SubcontractedTasksRenderer subcontractedTasksRenderer = new SubcontractedTasksRenderer(); @Override public void doAfterCompose(Component comp) throws Exception { super.doAfterCompose(comp); window = (Window) comp; window.setAttribute("controller", this, true); messagesForUser = new MessagesForUser(messagesContainer); } public List<SubcontractedTaskData> getSubcontractedTasks() { return subcontractedTasksModel.getSubcontractedTasks(); } public SubcontractedTasksRenderer getSubcontractedTasksRenderer() { return subcontractedTasksRenderer; } private class SubcontractedTasksRenderer implements RowRenderer { @Override public void render(Row row, Object o, int i) throws Exception { SubcontractedTaskData subcontractedTaskData = (SubcontractedTaskData) o; row.setValue(subcontractedTaskData); Order order = getOrder(subcontractedTaskData); appendLabel(row, Util.formatDateTime(subcontractedTaskData.getSubcontratationDate())); appendLabel(row, Util.formatDateTime(subcontractedTaskData.getSubcontractCommunicationDate())); appendLabel(row, getExternalCompany(subcontractedTaskData)); appendLabel(row, getOrderCode(order)); appendLabel(row, getOrderName(order)); appendLabel(row, subcontractedTaskData.getSubcontractedCode()); appendLabel(row, getTaskName(subcontractedTaskData)); row.setTooltiptext(subcontractedTaskData.getWorkDescription()); appendLabel(row, Util.addCurrencySymbol(subcontractedTaskData.getSubcontractPrice())); appendLabel(row, Util.formatDate(subcontractedTaskData.getLastRequiredDeliverDate())); appendLabel(row, _(toString(subcontractedTaskData.getState()))); appendOperations(row, subcontractedTaskData); } private String getOrderCode(Order order) { return (order != null) ? order.getCode() : ""; } private String getOrderName(Order order) { return (order != null) ? order.getName() : ""; } private Order getOrder(SubcontractedTaskData subcontractedTaskData) { return subcontractedTasksModel.getOrder(subcontractedTaskData); } private String toString(org.libreplan.business.planner.entities.SubcontractState object) { if ( object == null ) { return ""; } return object.toString(); } private void appendLabel(Row row, String label) { row.appendChild(new Label(label)); } private String getTaskName(SubcontractedTaskData subcontractedTaskData) { return subcontractedTaskData.getTask().getName(); } private String getExternalCompany(SubcontractedTaskData subcontractedTaskData) { return subcontractedTaskData.getExternalCompany().getName(); } private void appendOperations(Row row, SubcontractedTaskData subcontractedTaskData) { Vbox vbox = new Vbox(); vbox.appendChild(getExportButton(subcontractedTaskData)); vbox.appendChild(getSendButton(subcontractedTaskData)); row.appendChild(vbox); } private Button getExportButton(final SubcontractedTaskData subcontractedTaskData) { Button exportButton = new Button("XML"); exportButton.setClass("add-button"); exportButton.addEventListener(Events.ON_CLICK, new EventListener() { IServletRequestHandler requestHandler = new IServletRequestHandler() { @Override public void handle(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/xml"); String xml = subcontractedTasksModel.exportXML(subcontractedTaskData); response.getWriter().write(xml); } }; @Override public void onEvent(Event event) { String uri = CallbackServlet.registerAndCreateURLFor( (HttpServletRequest) Executions.getCurrent().getNativeRequest(), requestHandler, false, DisposalMode.WHEN_NO_LONGER_REFERENCED); Executions.getCurrent().sendRedirect(uri, "_blank"); } }); return exportButton; } private Button getSendButton(final SubcontractedTaskData subcontractedTaskData) { Button sendButton = new Button(_("Send")); sendButton.setClass("add-button"); sendButton.addEventListener(Events.ON_CLICK, event -> { try { subcontractedTasksModel.sendToSubcontractor(subcontractedTaskData); messagesForUser.showMessage(Level.INFO, _("Subcontracted task sent successfully")); } catch (UnrecoverableErrorServiceException e) { messagesForUser.showMessage(Level.ERROR, e.getMessage()); } catch (ConnectionProblemsException e) { messagesForUser.showMessage(Level.ERROR, e.getMessage()); } catch (ValidationException e) { messagesForUser.showInvalidValues(e); } reload(); }); sendButton.setDisabled(!subcontractedTaskData.isSendable()); return sendButton; } } public void reload() { Util.reloadBindings(window); forceSortGridSatisfaction(); } public void forceSortGridSatisfaction() { Column column = columnBySort; Sortable model = (Sortable) listing.getModel(); if ("ascending".equals(column.getSortDirection())) { model.sort(column.getSortAscending(), true); } if ( "descending".equals(column.getSortDirection()) ) { model.sort(column.getSortDescending(), false); } } public void initRender() { forceSortGridSatisfaction(); } }