/*
* This file is part of LibrePlan
*
* Copyright (C) 2012 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.reports;
import static org.libreplan.web.I18nHelper._;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import net.sf.jasperreports.engine.JRDataSource;
import net.sf.jasperreports.engine.JREmptyDataSource;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
import org.codehaus.plexus.util.StringUtils;
import org.libreplan.business.common.entities.Configuration;
import org.libreplan.business.common.Registry;
import org.libreplan.business.labels.entities.Label;
import org.libreplan.business.orders.entities.Order;
import org.libreplan.business.reports.dtos.ProjectStatusReportDTO;
import org.libreplan.business.resources.entities.Criterion;
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.common.components.bandboxsearch.BandboxSearch;
import org.zkoss.zk.ui.Component;
import org.zkoss.zk.ui.WrongValueException;
import org.zkoss.zkplus.spring.SpringUtil;
import org.zkoss.zul.Listbox;
import com.libreplan.java.zk.components.JasperreportComponent;
/**
* Controller for UI operations of Project Satus report.
*
* @author Manuel Rego Casasnovas <rego@igalia.com>
*/
@SuppressWarnings("serial")
public class ProjectStatusReportController extends LibrePlanReportController {
private static final String REPORT_NAME = "projectStatusReport";
private static final String REPORT_WITH_HOURS_BUDGET_NAME = "projectStatusReportWithHoursBudget";
private IProjectStatusReportModel projectStatusReportModel;
private BandboxSearch bandboxSelectOrder;
private BandboxSearch bandboxLabels;
private Listbox listboxLabels;
private BandboxSearch bandboxCriteria;
private Listbox listboxCriteria;
private IMessagesForUser messagesForUser;
private Component messagesContainer;
public ProjectStatusReportController() {
projectStatusReportModel = (IProjectStatusReportModel) SpringUtil.getBean("projectStatusReportModel");
}
@Override
public void doAfterCompose(Component comp) throws Exception {
super.doAfterCompose(comp);
comp.setAttribute("controller", this);
messagesForUser = new MessagesForUser(messagesContainer);
}
@Override
protected String getReportName() {
Configuration configuration = Registry.getConfigurationDAO().getConfigurationWithReadOnlyTransaction();
return configuration != null && configuration.isEnabledAutomaticBudget()
? REPORT_WITH_HOURS_BUDGET_NAME
: REPORT_NAME;
}
@Override
protected JRDataSource getDataSource() {
List<ProjectStatusReportDTO> dtos = projectStatusReportModel.getProjectStatusReportDTOs(getSelectedOrder());
return dtos.isEmpty()
? new JREmptyDataSource()
: new JRBeanCollectionDataSource(dtos);
}
@Override
public void showReport(JasperreportComponent jasperreport) {
final Order order = getSelectedOrder();
if (order == null && projectStatusReportModel.isNotFiltering()) {
messagesForUser.showMessage(Level.ERROR, _("You should filter the report by project, labels or criteria"));
} else {
super.showReport(jasperreport);
}
}
private Order getSelectedOrder() {
return (Order) bandboxSelectOrder.getSelectedElement();
}
public List<Order> getOrders() {
return projectStatusReportModel.getOrders();
}
@Override
protected Map<String, Object> getParameters() {
Map<String, Object> result = super.getParameters();
Order order = getSelectedOrder();
if (order != null) {
result.put("project", order.getName() + " (" + order.getCode() + ")");
} else {
result.put("filter", getFilterSummary());
}
ProjectStatusReportDTO totalDTO = projectStatusReportModel.getTotalDTO();
result.put("estimatedHours", totalDTO.getEstimatedHours());
result.put("plannedHours", totalDTO.getPlannedHours());
result.put("imputedHours", totalDTO.getImputedHours());
result.put("hoursMark", totalDTO.getHoursMark());
result.put("budget", Util.addCurrencySymbol(totalDTO.getBudget()));
result.put("resourcesBudget", Util.addCurrencySymbol(totalDTO.getResourcesBudget()));
result.put("expensesBudget", Util.addCurrencySymbol(totalDTO.getExpensesBudget()));
result.put("hoursCost", Util.addCurrencySymbol(totalDTO.getHoursCost()));
result.put("expensesCost", Util.addCurrencySymbol(totalDTO.getExpensesCost()));
result.put("totalCost", Util.addCurrencySymbol(totalDTO.getTotalCost()));
result.put("costMark", totalDTO.getCostMark());
return result;
}
private String getFilterSummary() {
String filter = "";
Set<Label> labels = projectStatusReportModel.getSelectedLabels();
if (!labels.isEmpty()) {
List<String> labelNames = new ArrayList<>();
for (Label label : labels) {
labelNames.add(label.getName());
}
filter += _("Labels") + ": " + StringUtils.join(labelNames.toArray(), ", ");
}
Set<Criterion> criteria = projectStatusReportModel.getSelectedCriteria();
if (!criteria.isEmpty()){
List<String> criterionNames = new ArrayList<>();
for (Criterion criterion : criteria) {
criterionNames.add(criterion.getName());
}
if (!filter.isEmpty()) {
filter += ". ";
}
filter += _("Criteria") + ": " + StringUtils.join(criterionNames.toArray(), ", ");
}
return filter;
}
public List<Label> getAllLabels() {
return projectStatusReportModel.getAllLabels();
}
public void addLabel() {
Label label = (Label) bandboxLabels.getSelectedElement();
if (label == null) {
throw new WrongValueException(bandboxLabels, _("please, select a label"));
}
projectStatusReportModel.addSelectedLabel(label);
Util.reloadBindings(listboxLabels);
bandboxLabels.clear();
}
public void removeLabel(Label label) {
projectStatusReportModel.removeSelectedLabel(label);
Util.reloadBindings(listboxLabels);
}
public Set<Label> getSelectedLabels() {
return projectStatusReportModel.getSelectedLabels();
}
public List<Criterion> getAllCriteria() {
return projectStatusReportModel.getAllCriteria();
}
public void addCriterion() {
Criterion criterion = (Criterion) bandboxCriteria.getSelectedElement();
if (criterion == null) {
throw new WrongValueException(bandboxCriteria, _("please, select a criterion"));
}
projectStatusReportModel.addSelectedCriterion(criterion);
Util.reloadBindings(listboxCriteria);
bandboxCriteria.clear();
}
public void removeCriterion(Criterion criterion) {
projectStatusReportModel.removeSelectedCriterion(criterion);
Util.reloadBindings(listboxCriteria);
}
public Set<Criterion> getSelectedCriteria() {
return projectStatusReportModel.getSelectedCriteria();
}
}