/*
* 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.reports;
import net.sf.jasperreports.engine.JRDataSource;
import org.zkoss.util.Locales;
import org.zkoss.zk.ui.Component;
import org.zkoss.zkplus.spring.SpringUtil;
import org.zkoss.zul.Listbox;
import org.zkoss.zul.Listitem;
import java.text.DateFormatSymbols;
import java.util.Calendar;
import java.util.Map;
/**
* @author Diego Pino Garcia <dpino@igalia.com>
*/
public class HoursWorkedPerWorkerInAMonthController extends LibrePlanReportController {
private static final String REPORT_NAME = "hoursWorkedPerWorkerInAMonthReport";
private IHoursWorkedPerWorkerInAMonthModel hoursWorkedPerWorkerInAMonthModel;
private Listbox lbYears;
private Listbox lbMonths;
public HoursWorkedPerWorkerInAMonthController(){
hoursWorkedPerWorkerInAMonthModel =
(IHoursWorkedPerWorkerInAMonthModel) SpringUtil.getBean("hoursWorkedPerWorkerInAMonthModel");
}
@Override
public void doAfterCompose(Component comp) throws Exception {
super.doAfterCompose(comp);
comp.setAttribute("controller", this, true);
hoursWorkedPerWorkerInAMonthModel.init();
initYears();
initMonths();
}
private void initMonths() {
String months[] = DateFormatSymbols.getInstance(Locales.getCurrent()).getMonths();
// Using 12 instead of months.length because of the array has 13 positions.
// The reason to return 13 positions is because of some lunar calendars would have 13 months instead of 12.
for (int i = 0; i < 12; i++) {
Listitem month = new Listitem();
month.setLabel(months[i]);
month.setValue("" + (i + 1));
if (Calendar.getInstance().get(Calendar.MONTH) == i)
month.setSelected(true);
else
month.setSelected(false);
lbMonths.appendChild(month);
}
}
private void initYears() {
int beginYear = hoursWorkedPerWorkerInAMonthModel.getBeginDisplayYears();
int endYear = hoursWorkedPerWorkerInAMonthModel.getEndDisplayYears();
if (beginYear != 0 && endYear != 0) {
for (int i = beginYear; i <= endYear; i++) {
Listitem year = new Listitem();
year.setLabel("" + i);
year.setValue("" + i);
if (Calendar.getInstance().get(Calendar.YEAR) == i)
year.setSelected(true);
else
year.setSelected(false);
lbYears.appendChild(year);
}
} else {
int year = Calendar.getInstance().get(Calendar.YEAR);
Listitem itemYear = new Listitem();
itemYear.setLabel("" + year);
itemYear.setValue("" + year);
lbYears.appendChild(itemYear);
}
}
@Override
protected String getReportName() {
return REPORT_NAME;
}
private String getSelectedMonth() {
return getSelectedValue(lbMonths);
}
private String getSelectedValue(Listbox listbox) {
Listitem item = listbox.getSelectedItem();
return (item != null) ? (String) item.getValue() : getFirst(listbox);
}
private String getFirst(Listbox listbox) {
final Listitem item = listbox.getItems().iterator().next();
return (String) item.getValue();
}
private String getSelectedYear() {
return getSelectedValue(lbYears);
}
@Override
protected JRDataSource getDataSource() {
return hoursWorkedPerWorkerInAMonthModel.getHoursWorkedPerWorkerReport(
asInt(getSelectedYear()), asInt(getSelectedMonth()));
}
private Integer asInt(String str) {
return Integer.parseInt(str);
}
@Override
protected Map<String, Object> getParameters() {
Map<String, Object> result = super.getParameters();
result.put("year", getSelectedYear());
result.put("month", monthAsLiteral(getSelectedMonth()));
result.put("showNote", hoursWorkedPerWorkerInAMonthModel.isShowReportMessage());
return result;
}
private String monthAsLiteral(String monthNumber) {
Integer number = Integer.parseInt(monthNumber);
String months[] = DateFormatSymbols.getInstance(Locales.getCurrent()).getMonths();
return months[number - 1];
}
}