/* * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ package net.rrm.ehour.ui.timesheet.export; import net.rrm.ehour.data.DateRange; import net.rrm.ehour.domain.Project; import net.rrm.ehour.project.util.ProjectUtil; import net.rrm.ehour.report.criteria.ReportCriteria; import net.rrm.ehour.ui.common.panel.AbstractBasePanel; import net.rrm.ehour.ui.common.panel.datepicker.LocalizedDatePicker; import net.rrm.ehour.ui.common.report.excel.ExcelRequestHandler; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.html.form.*; import org.apache.wicket.markup.html.list.ListItem; import org.apache.wicket.markup.html.list.ListView; import org.apache.wicket.model.IModel; import org.apache.wicket.model.PropertyModel; import java.io.Serializable; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Collection; import java.util.Date; import java.util.List; /** * TimesheetExportCriteriaPanel holding the form for month based exports for consultants */ public class TimesheetExportCriteriaPanel extends AbstractBasePanel<ReportCriteria> { private static final long serialVersionUID = -3732529050866431376L; private Projects billableProjects; private Projects unbillableProjects; public TimesheetExportCriteriaPanel(String id, IModel<ReportCriteria> model) { super(id, model); setOutputMarkupId(true); add(createCriteriaPanel("criteriaForm", model)); } /** * Create the criteria panel with the form, assignments and submit buttons */ private Form<ReportCriteria> createCriteriaPanel(String id, IModel<ReportCriteria> model) { SelectionForm form = new SelectionForm(id, model); ReportCriteria criteria = (ReportCriteria) getDefaultModelObject(); List<Project> allProjects = criteria.getAvailableCriteria().getProjects(); billableProjects = new Projects(); unbillableProjects = new Projects(); form.add(createBillableProjectGroup("billableProjectGroup", allProjects)); form.add(createUnbillableProjectGroup("unbillableProjectGroup", allProjects)); form.add(createSignOffCheck("signOff")); form.add(createSubmitButton("store", form)); form.add(new LocalizedDatePicker("startDate", new PropertyModel<Date>(model, "reportRange.dateStart"))); form.add(new LocalizedDatePicker("endDate", new PropertyModel<Date>(model, "reportRange.dateEnd"))); return form; } @SuppressWarnings("serial") private SubmitLink createSubmitButton(String id, SelectionForm form) { return new SubmitLink(id, form); } private CheckBox createSignOffCheck(String id) { CheckBox signOffCheck = new CheckBox(id, new PropertyModel<Boolean>(this.getDefaultModel(), "userSelectedCriteria.customParameters[INCL_SIGN_OFF]")); signOffCheck.setMarkupId("signoff"); return signOffCheck; } private CheckGroup<Project> createUnbillableProjectGroup(String id, List<Project> allProjects) { CheckGroup<Project> unbillableGroup = new CheckGroup<>(id, new PropertyModel<Collection<Project>>(unbillableProjects, "projects")); unbillableGroup.add(new CheckGroupSelector("checkall")); List<Project> unbillableProjects = ProjectUtil.filterUnbillable(allProjects); unbillableGroup.setVisible(!unbillableProjects.isEmpty()); ListView<Project> unbillableProjectsView = getAssignmentCheckboxesView("unbillableProjects", unbillableProjects); unbillableGroup.add(unbillableProjectsView); return unbillableGroup; } private CheckGroup<Project> createBillableProjectGroup(String id, List<Project> allProjects) { CheckGroup<Project> billableGroup = new CheckGroup<>(id, new PropertyModel<Collection<Project>>(billableProjects, "projects")); billableGroup.add(new CheckGroupSelector("checkall")); List<Project> billableProjects = ProjectUtil.filterBillable(allProjects); billableGroup.setVisible(!billableProjects.isEmpty()); ListView<Project> billableProjectsView = getAssignmentCheckboxesView("billableProjects", billableProjects); billableGroup.add(billableProjectsView); return billableGroup; } @SuppressWarnings("serial") private ListView<Project> getAssignmentCheckboxesView(String id, List<Project> projects) { return new ListView<Project>(id, projects) { @Override protected void populateItem(ListItem<Project> item) { item.add(new Check<>("check", item.getModel())); item.add(new Label("project", new PropertyModel<String>(item.getModel(), "fullNameWithCustomer"))); } }; } /** * Created on Feb 18, 2009, 5:39:23 PM * * @author Thies Edeling (thies@te-con.nl) */ private class SelectionForm extends Form<ReportCriteria> { private static final long serialVersionUID = -8232635495078008621L; public SelectionForm(String id, IModel<ReportCriteria> model) { super(id, model); } @Override protected void onSubmit() { final ReportCriteria reportCriteria = mergeBillablesAndUnbillables(); final TimesheetExcelExport timesheetExcelExport = new TimesheetExcelExport(reportCriteria); String filename = createFilename(reportCriteria); getRequestCycle().scheduleRequestHandlerAfterCurrent(new ExcelRequestHandler(filename, timesheetExcelExport)); } private ReportCriteria mergeBillablesAndUnbillables() { List<Project> projects = new ArrayList<>(TimesheetExportCriteriaPanel.this.billableProjects.getProjects()); projects.addAll(TimesheetExportCriteriaPanel.this.unbillableProjects.getProjects()); final ReportCriteria reportCriteria = getModelObject(); reportCriteria.getUserSelectedCriteria().setProjects(projects); return reportCriteria; } private String createFilename(ReportCriteria reportCriteria) { DateRange reportRange = reportCriteria.getUserSelectedCriteria().getReportRange(); SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMdd"); String start = formatter.format(reportRange.getDateStart()); String end = formatter.format(reportRange.getDateEnd()); return String.format("eHour_export_%s-%s.xlsx", start, end); } } private static class Projects implements Serializable { private List<Project> projects = new ArrayList<>(); private List<Project> getProjects() { return projects; } private void setProjects(List<Project> projects) { this.projects = projects; } } }