/*
* 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-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.Calendar;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Set;
import net.sf.jasperreports.engine.JRDataSource;
import org.libreplan.business.labels.entities.Label;
import org.libreplan.business.reports.dtos.LabelFilterType;
import org.libreplan.business.resources.entities.Criterion;
import org.libreplan.business.resources.entities.Resource;
import org.libreplan.business.resources.entities.Worker;
import org.libreplan.web.common.Util;
import org.libreplan.web.common.components.Autocomplete;
import org.libreplan.web.common.components.bandboxsearch.BandboxSearch;
import org.zkoss.zk.ui.Component;
import org.zkoss.zk.ui.WrongValueException;
import org.zkoss.zk.ui.event.Event;
import org.zkoss.zk.ui.event.EventListener;
import org.zkoss.zk.ui.event.Events;
import org.zkoss.zul.Button;
import org.zkoss.zul.Checkbox;
import org.zkoss.zul.Comboitem;
import org.zkoss.zul.Datebox;
import org.zkoss.zul.Listbox;
import org.zkoss.zul.Listcell;
import org.zkoss.zul.Listitem;
import org.zkoss.zul.ListitemRenderer;
import org.zkoss.zul.Radio;
/**
* @author Diego Pino Garcia <dpino@igalia.com>
* @author Susana Montes Pedreira <smontes@wirelessgalicia.com>
*/
public class HoursWorkedPerWorkerController extends LibrePlanReportController {
private static final String REPORT_NAME = "hoursWorkedPerWorkerReport";
private IHoursWorkedPerWorkerModel hoursWorkedPerWorkerModel;
private Listbox lbResources;
private Listbox lbLabels;
private Listbox lbCriterions;
private Datebox startingDate;
private Datebox endingDate;
private Autocomplete filterResource;
private BandboxSearch bdLabels;
private BandboxSearch bdCriterions;
private ResourceListRenderer resourceListRenderer = new ResourceListRenderer();
private Radio filterByWorkReports;
private Radio filterByOrderElements;
private Radio filterByBoth;
@Override
public void doAfterCompose(Component comp) throws Exception {
super.doAfterCompose(comp);
comp.setVariable("controller", this, true);
hoursWorkedPerWorkerModel.init();
}
public Set<Resource> getResources() {
return hoursWorkedPerWorkerModel.getResources();
}
@Override
protected String getReportName() {
return REPORT_NAME;
}
@Override
protected JRDataSource getDataSource() {
return hoursWorkedPerWorkerModel.getHoursWorkedPerWorkerReport(
getSelectedResources(), getSelectedLabels(),
getSelectedFilterLabels(),
getSelectedCriterions(),
getStartingDate(), getEndingDate());
}
private LabelFilterType getSelectedFilterLabels() {
if (filterByWorkReports.isChecked()) {
return LabelFilterType.WORK_REPORT;
}
if (filterByOrderElements.isChecked()) {
return LabelFilterType.ORDER_ELEMENT;
}
if (filterByBoth.isChecked()) {
return LabelFilterType.BOTH;
}
return LabelFilterType.ANY;
}
private List<Resource> getSelectedResources() {
List<Resource> result = new ArrayList<Resource>();
final List<Listitem> listItems = lbResources.getItems();
for (Listitem each : listItems) {
result.add((Resource) each.getValue());
}
return result;
}
private Date getStartingDate() {
if (startingDate.getValue() == null) {
return null;
}
Calendar calendar = Calendar.getInstance();
calendar.setTime(startingDate.getValue());
calendar.set(calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH),
calendar.get(Calendar.DATE), 0, 0, 0);
return calendar.getTime();
}
private Date getEndingDate() {
if (endingDate.getValue() == null) {
return null;
}
Calendar calendar = Calendar.getInstance();
calendar.setTime(endingDate.getValue());
calendar.set(calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH),
calendar.get(Calendar.DATE), 23, 59, 59);
return calendar.getTime();
}
@Override
protected Map<String, Object> getParameters() {
Map<String, Object> result = super.getParameters();
result.put("startingDate", getStartingDate());
result.put("endingDate", getEndingDate());
result.put("criteria", getParameterCriterions());
result.put("labels", getParameterLabels());
result.put("showNote", hoursWorkedPerWorkerModel.isShowReportMessage());
return result;
}
public void onAddResource() {
Resource resource = getSelectedCurrentResource();
if (resource != null) {
boolean result = hoursWorkedPerWorkerModel
.addSelectedResource(resource);
if (!result) {
throw new WrongValueException(filterResource,
_("This resource has already been added."));
} else {
Util.reloadBindings(lbResources);
}
}
}
public void onRemoveResource(Resource resource) {
hoursWorkedPerWorkerModel.removeSelectedResource(resource);
Util.reloadBindings(lbResources);
}
private Resource getSelectedCurrentResource() {
Comboitem itemSelected = filterResource.getSelectedItem();
if ((itemSelected != null)
&& (((Resource) itemSelected.getValue()) != null)) {
return (Resource) itemSelected.getValue();
}
return null;
}
public ResourceListRenderer getRenderer() {
return resourceListRenderer;
}
/**
* ListitemRenderer for a @{Resource} element
* @author Susana Montes Pedreira <smontes@wirelessgalicia.com>
*/
public class ResourceListRenderer implements ListitemRenderer {
@Override
public void render(Listitem item, Object data) {
final Resource resource = (Resource) data;
item.setValue(resource);
appendType(item);
appendLimiting(item);
appendName(item);
appendCode(item);
appendDeleteButton(item);
}
}
private void appendType(final Listitem item) {
Resource resource = (Resource) item.getValue();
org.zkoss.zul.Label typeLabel = new org.zkoss.zul.Label(
getType(resource));
Listcell typeResourceCell = new Listcell();
typeResourceCell.appendChild(typeLabel);
item.appendChild(typeResourceCell);
}
private void appendLimiting(final Listitem item) {
final Resource resource = (Resource) item.getValue();
final Checkbox limitingCheckbox = new Checkbox();
limitingCheckbox.setChecked(resource.isLimitingResource());
limitingCheckbox.setDisabled(true);
Listcell limitingResourceCell = new Listcell();
limitingResourceCell.appendChild(limitingCheckbox);
item.appendChild(limitingResourceCell);
}
private void appendName(final Listitem item) {
Resource resource = (Resource) item.getValue();
org.zkoss.zul.Label nameLabel = new org.zkoss.zul.Label(
getName(resource));
Listcell nameResourceCell = new Listcell();
nameResourceCell.appendChild(nameLabel);
item.appendChild(nameResourceCell);
}
private void appendCode(Listitem item) {
Resource resource = (Resource) item.getValue();
org.zkoss.zul.Label codeLabel = new org.zkoss.zul.Label(resource
.getCode());
Listcell codeResourceCell = new Listcell();
codeResourceCell.appendChild(codeLabel);
item.appendChild(codeResourceCell);
}
private void appendDeleteButton(final Listitem item) {
Button delete = new Button("", "/common/img/ico_borrar1.png");
delete.setHoverImage("/common/img/ico_borrar.png");
delete.setSclass("icono");
delete.setTooltiptext(_("Delete"));
delete.addEventListener(Events.ON_CLICK, new EventListener() {
@Override
public void onEvent(Event event) {
onRemoveResource((Resource) item.getValue());
}
});
Listcell deleteResourceCell = new Listcell();
deleteResourceCell.appendChild(delete);
item.appendChild(deleteResourceCell);
}
private String getName(Resource resource) {
if ((resource instanceof Worker) && (((Worker) resource).isReal())) {
return ((Worker) resource).getShortDescription();
}
return resource.getName();
}
private String getType(Resource resource) {
if (resource instanceof Worker) {
if (((Worker) resource).isReal()) {
return _("Worker");
} else {
return _("Virtual worker");
}
}
return "Machine";
}
public List<Label> getAllLabels() {
return hoursWorkedPerWorkerModel.getAllLabels();
}
public void onSelectLabel() {
Label label = (Label) bdLabels.getSelectedElement();
if (label == null) {
throw new WrongValueException(bdLabels, _("please, select a label"));
}
boolean result = hoursWorkedPerWorkerModel.addSelectedLabel(label);
if (!result) {
throw new WrongValueException(bdLabels,
_("Label has already been added."));
} else {
Util.reloadBindings(lbLabels);
}
bdLabels.clear();
}
public void onRemoveLabel(Label label) {
hoursWorkedPerWorkerModel.removeSelectedLabel(label);
Util.reloadBindings(lbLabels);
}
public List<Label> getSelectedLabels() {
return hoursWorkedPerWorkerModel.getSelectedLabels();
}
public List<Criterion> getAllCriterions() {
return hoursWorkedPerWorkerModel.getCriterions();
}
public void onSelectCriterion() {
Criterion criterion = (Criterion) bdCriterions.getSelectedElement();
if (criterion == null) {
throw new WrongValueException(bdCriterions,
_("please, select a Criterion"));
}
boolean result = hoursWorkedPerWorkerModel
.addSelectedCriterion(criterion);
if (!result) {
throw new WrongValueException(bdCriterions,
_("This Criterion has already been added."));
} else {
Util.reloadBindings(lbCriterions);
}
}
public void onRemoveCriterion(Criterion criterion) {
hoursWorkedPerWorkerModel.removeSelectedCriterion(criterion);
Util.reloadBindings(lbCriterions);
}
public List<Criterion> getSelectedCriterions() {
return hoursWorkedPerWorkerModel.getSelectedCriterions();
}
private String getParameterCriterions() {
return hoursWorkedPerWorkerModel.getSelectedCriteria();
}
private String getParameterLabels() {
return hoursWorkedPerWorkerModel.getSelectedLabel();
}
}