/*
* 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.
*
* 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.advance.entities.AdvanceMeasurement;
import org.libreplan.business.common.exceptions.ValidationException;
import org.libreplan.business.orders.entities.Order;
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.Hbox;
import org.zkoss.zul.Label;
import org.zkoss.zul.Row;
import org.zkoss.zul.RowRenderer;
import org.zkoss.zul.Window;
/**
* Controller for operations related with report advances.
*
* @author Manuel Rego Casasnovas <mrego@igalia.com>
*/
@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.setAttribute("controller", this, true);
messagesForUser = new MessagesForUser(messagesContainer);
}
public List<Order> getOrdersWithExternalCodeInAnyOrderElement() {
return reportAdvancesModel.getOrdersWithExternalCodeInAnyOrderElement();
}
public ReportAdvancesOrderRenderer getReportAdvancesOrderRenderer() {
return reportAdvancesOrderRenderer;
}
private class ReportAdvancesOrderRenderer implements RowRenderer {
@Override
public void render(Row row, Object data, int i) {
Order order = (Order) data;
row.setValue(order);
appendLabel(row, order.getCode());
appendLabel(row, toString(order.getCustomerReference()));
appendLabel(row, order.getName());
// Append the last advance measurement reported
AdvanceMeasurement lastAdvanceMeasurementReported = reportAdvancesModel
.getLastAdvanceMeasurementReported(order.getDirectAdvanceAssignmentOfTypeSubcontractor());
if (lastAdvanceMeasurementReported != null) {
appendLabel(row, toString(lastAdvanceMeasurementReported.getDate()));
appendLabel(row, toString(lastAdvanceMeasurementReported.getValue()));
} else {
appendLabel(row, "");
appendLabel(row, "");
}
// Append the last advance measurement not reported
AdvanceMeasurement lastAdvanceMeasurement = reportAdvancesModel
.getLastAdvanceMeasurement(order.getDirectAdvanceAssignmentOfTypeSubcontractor());
if (lastAdvanceMeasurement != null) {
appendLabel(row, toString(lastAdvanceMeasurement.getDate()));
appendLabel(row, toString(lastAdvanceMeasurement.getValue()));
} else {
appendLabel(row, "");
appendLabel(row, "");
}
// append the status
String status = reportAdvancesModel.getStatus(order);
appendLabel(row, _(status));
// append the operations
if ("Updated".equals(status)) {
appendOperations(row, order, true);
} else {
appendOperations(row, order, false);
}
}
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) {
Hbox hbox = new Hbox();
hbox.appendChild(getExportButton(order));
hbox.appendChild(getSendButton(order, sendButtonDisabled));
row.appendChild(hbox);
}
private Button getExportButton(final Order order) {
Button exportButton = new Button("XML");
exportButton.setSclass("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 = reportAdvancesModel.exportXML(order);
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 Order order, boolean sendButtonDisabled) {
Button sendButton = new Button(_("Send"));
sendButton.setSclass("add-button");
sendButton.addEventListener(Events.ON_CLICK, event -> {
try {
reportAdvancesModel.sendAdvanceMeasurements(order);
messagesForUser.showMessage(Level.INFO, _("Progress 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);
}
Util.reloadBindings(window);
});
sendButton.setDisabled(sendButtonDisabled);
return sendButton;
}
}
}