/*
* 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.report.criteria;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import net.rrm.ehour.data.DateRange;
import net.rrm.ehour.domain.Customer;
import net.rrm.ehour.domain.Project;
import net.rrm.ehour.domain.User;
import net.rrm.ehour.domain.UserDepartment;
import net.rrm.ehour.util.DateUtil;
import org.apache.commons.lang.builder.ToStringBuilder;
import java.io.Serializable;
import java.util.*;
/**
* User selected criteria
*/
public class UserSelectedCriteria implements Serializable {
public enum ReportType {
INDIVIDUAL_USER,
PM,
REPORT
}
private static final long serialVersionUID = 375613059093184619L;
private DateRange reportRange;
private boolean onlyActiveProjects = true;
private boolean onlyActiveCustomers = true;
private boolean onlyActiveUsers = true;
private boolean onlyBillableProjects = false;
private String customerFilter;
private List<User> users;
private List<Project> projects;
private List<Customer> customers;
private Sort customerSort;
private Sort projectSort;
private Collection<UserDepartment> userDepartments;
private boolean infiniteStartDate;
private boolean infiniteEndDate;
private ReportType selectedReportType;
private Project project;
private Map<Object, Object> customParameters = Maps.newHashMap();
private User pm;
private boolean showZeroBookings = false;
private AggregateBy aggregateBy = AggregateBy.DAY;
public UserSelectedCriteria() {
resetCustomerSelection();
resetProjectSelection();
resetUserDepartmentSelection();
resetUserSelection();
infiniteStartDate = false;
infiniteEndDate = false;
reportRange = DateUtil.getDateRangeForMonth(new GregorianCalendar());
}
public final void resetCustomerSelection() {
onlyActiveCustomers = true;
customerSort = Sort.NAME;
customers = Lists.newArrayList();
}
public final void resetProjectSelection() {
onlyActiveProjects = true;
onlyBillableProjects = false;
projectSort = Sort.NAME;
projects = Lists.newArrayList();
}
public final void resetUserDepartmentSelection() {
userDepartments = Lists.newArrayList();
}
public final void resetUserSelection() {
onlyActiveUsers = true;
users = Lists.newArrayList();
}
public ReportType getSelectedReportType() {
return selectedReportType;
}
public void setSelectedReportType(ReportType selectedReportType) {
this.selectedReportType = selectedReportType;
}
public void setReportTypeToGlobal() {
users.clear();
setSelectedReportType(ReportType.REPORT);
}
public void setReportTypeToPM(User projectManager) {
users.clear();
setSelectedReportType(ReportType.PM);
setPm(projectManager);
}
public void setReportTypeToIndividualUser(User user) {
setSelectedReportType(ReportType.INDIVIDUAL_USER);
setUser(user);
}
public Sort getCustomerSort() {
return customerSort;
}
public void setCustomerSort(Sort customerSort) {
this.customerSort = customerSort;
}
public Sort getProjectSort() {
return projectSort;
}
public void setProjectSort(Sort projectSort) {
this.projectSort = projectSort;
}
private void setUser(User user) {
if (users == null) {
users = new ArrayList<>();
}
users.add(user);
}
public User getPm() {
return pm;
}
private void setPm(User pm) {
this.pm = pm;
}
public boolean isForIndividualUser() {
return selectedReportType == ReportType.INDIVIDUAL_USER;
}
public boolean isForPm() {
return selectedReportType == ReportType.PM;
}
public boolean isForGlobalReport() {
return selectedReportType == ReportType.REPORT;
}
@Override
public String toString() {
return new ToStringBuilder(this)
.append("reportRange", reportRange)
.append("users", users)
.append("projects", projects)
.append("customers", customers)
.append("departments", userDepartments)
.toString();
}
/**
* No customers selected ?
*/
public boolean isEmptyCustomers() {
return customers == null || !customers.isEmpty();
}
/**
* No projects selected ?
*/
public boolean isEmptyProjects() {
return projects == null || !projects.isEmpty();
}
/**
* No departments selected ?
*/
public boolean isEmptyDepartments() {
return userDepartments == null || !userDepartments.isEmpty();
}
/**
* No users selected ?
*/
public boolean isEmptyUsers() {
return users == null || !users.isEmpty();
}
public boolean isOnlyActiveCustomers() {
return onlyActiveCustomers;
}
public void setOnlyActiveCustomers(boolean onlyActiveCustomers) {
this.onlyActiveCustomers = onlyActiveCustomers;
}
public boolean isOnlyActiveProjects() {
return onlyActiveProjects;
}
public void setOnlyActiveProjects(boolean onlyActiveProjects) {
this.onlyActiveProjects = onlyActiveProjects;
}
public DateRange getReportRange() {
return reportRange;
}
public UserSelectedCriteria setReportRange(DateRange reportRange) {
this.reportRange = reportRange;
return this;
}
public boolean isOnlyActiveUsers() {
return onlyActiveUsers;
}
public void setOnlyActiveUsers(boolean onlyActiveUsers) {
this.onlyActiveUsers = onlyActiveUsers;
}
public List<User> getUsers() {
return users;
}
public void setUsers(List<User> users) {
this.users = users;
}
public List<Customer> getCustomers() {
return customers;
}
public void setCustomers(List<Customer> customers) {
this.customers = customers;
}
public Collection<UserDepartment> getDepartments() {
return userDepartments;
}
public void setDepartments(Collection<UserDepartment> departments) {
this.userDepartments = departments;
}
public boolean isInfiniteStartDate() {
return infiniteStartDate;
}
public void setInfiniteStartDate(boolean infiniteStartDate) {
this.infiniteStartDate = infiniteStartDate;
}
public boolean isInfiniteEndDate() {
return infiniteEndDate;
}
public void setInfiniteEndDate(boolean infiniteEndDate) {
this.infiniteEndDate = infiniteEndDate;
}
public List<Project> getProjects() {
return projects;
}
public void setProjects(List<Project> projects) {
this.projects = projects;
}
public String getCustomerFilter() {
return customerFilter;
}
public void setCustomerFilter(String customerFilter) {
this.customerFilter = customerFilter;
}
public Project getProject() {
return project;
}
public void setProject(Project project) {
this.project = project;
}
public Customer getCustomer() {
return (customers != null && customers.size() >= 1) ? customers.get(0) : null;
}
public void setCustomer(Customer customer) {
customers = new ArrayList<>();
customers.add(customer);
}
public void setCustomParameters(Map<Object, Object> customParameters) {
this.customParameters = customParameters;
}
public Map<Object, Object> getCustomParameters() {
return customParameters;
}
public boolean isOnlyBillableProjects() {
return onlyBillableProjects;
}
public void setOnlyBillableProjects(boolean onlyBillableProjects) {
this.onlyBillableProjects = onlyBillableProjects;
}
public boolean isShowZeroBookings() {
return showZeroBookings;
}
public void setShowZeroBookings(boolean showZeroBookings) {
this.showZeroBookings = showZeroBookings;
}
public AggregateBy getAggregateBy() {
return aggregateBy;
}
public void setAggregateBy(AggregateBy aggregateBy) {
this.aggregateBy = aggregateBy;
}
}