/*
* 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.service;
import com.google.common.collect.Lists;
import net.rrm.ehour.data.DateRange;
import net.rrm.ehour.domain.Project;
import net.rrm.ehour.domain.ProjectAssignment;
import net.rrm.ehour.domain.User;
import net.rrm.ehour.persistence.project.dao.ProjectDao;
import net.rrm.ehour.persistence.report.dao.ReportAggregatedDao;
import net.rrm.ehour.report.criteria.ReportCriteria;
import net.rrm.ehour.report.criteria.UserSelectedCriteria;
import net.rrm.ehour.report.reports.ReportData;
import net.rrm.ehour.report.reports.element.ProjectStructuredReportElement;
import net.rrm.ehour.timesheet.service.TimesheetLockService;
import net.rrm.ehour.timesheet.service.TimesheetLockService$;
import org.joda.time.Interval;
import scala.collection.Seq;
import java.util.Date;
import java.util.List;
/**
* Abstract report service provides utility methods for dealing
* with the usercriteria obj
*/
public abstract class AbstractReportServiceImpl<RE extends ProjectStructuredReportElement> {
private ProjectDao projectDao;
private TimesheetLockService lockService;
protected ReportAggregatedDao reportAggregatedDao;
private ReportCriteriaService reportCriteriaService;
AbstractReportServiceImpl() {
}
protected AbstractReportServiceImpl(ReportCriteriaService reportCriteriaService, ProjectDao projectDao, TimesheetLockService lockService, ReportAggregatedDao reportAggregatedDao) {
this.reportCriteriaService = reportCriteriaService;
this.projectDao = projectDao;
this.lockService = lockService;
this.reportAggregatedDao = reportAggregatedDao;
}
ReportData getReportData(ReportCriteria reportCriteria) {
UserSelectedCriteria userSelectedCriteria = reportCriteria.getUserSelectedCriteria();
DateRange reportRange = reportCriteria.getReportRange();
Seq<Interval> lockedDatesAsIntervals = lockService.findLockedDatesInRange(reportRange.getDateStart(), reportRange.getDateEnd());
List<Date> lockedDates = TimesheetLockService$.MODULE$.intervalToJavaDates(lockedDatesAsIntervals);
List<RE> allReportElements = generateReport(userSelectedCriteria, lockedDates, reportRange);
if (userSelectedCriteria.isForPm()) {
List<ProjectStructuredReportElement> elem = evictNonPmReportElements(userSelectedCriteria, allReportElements);
return new ReportData(lockedDates, elem, reportRange, userSelectedCriteria);
} else {
return new ReportData(lockedDates, allReportElements, reportRange, userSelectedCriteria);
}
}
private List<ProjectStructuredReportElement> evictNonPmReportElements(UserSelectedCriteria userSelectedCriteria, List<RE> allReportElements) {
List<Integer> projectIds = fetchAllowedProjectIds(userSelectedCriteria);
List<ProjectStructuredReportElement> allowedElements = Lists.newArrayList();
for (ProjectStructuredReportElement reportElement : allReportElements) {
if (projectIds.contains(reportElement.getProjectId())) {
allowedElements.add(reportElement);
}
}
return allowedElements;
}
private List<Integer> fetchAllowedProjectIds(UserSelectedCriteria userSelectedCriteria) {
List<Project> allowedProjects = projectDao.findActiveProjectsWhereUserIsPM(userSelectedCriteria.getPm());
List<Integer> projectIds = Lists.newArrayList();
for (Project allowedProject : allowedProjects) {
projectIds.add(allowedProject.getProjectId());
}
return projectIds;
}
private List<RE> generateReport(UserSelectedCriteria userSelectedCriteria, List<Date> lockedDates, DateRange reportRange) {
UsersAndProjects usersAndProjects = reportCriteriaService.criteriaToUsersAndProjects(userSelectedCriteria);
return getReportElements(usersAndProjects.getUsers(),
usersAndProjects.getProjects(),
lockedDates,
reportRange,
userSelectedCriteria.isShowZeroBookings());
}
/**
* Get the actual data
*/
protected abstract List<RE> getReportElements(List<User> users,
List<Project> projects,
List<Date> lockedDates,
DateRange reportRange,
boolean showZeroBookings);
protected List<ProjectAssignment> getAssignmentsWithoutBookings(DateRange reportRange, List<Integer> userIds, List<Integer> projectIds) {
List<ProjectAssignment> assignmentsWithoutBookings = reportAggregatedDao.getAssignmentsWithoutBookings(reportRange);
List<ProjectAssignment> filteredAssignmentsWithoutBookings = Lists.newArrayList();
for (ProjectAssignment assignmentsWithoutBooking : assignmentsWithoutBookings) {
boolean passedUserFilter = isEmpty(userIds) || userIds.contains(assignmentsWithoutBooking.getUser().getUserId());
boolean passedProjectFilter = isEmpty(projectIds) || projectIds.contains(assignmentsWithoutBooking.getProject().getProjectId());
if (passedUserFilter && passedProjectFilter) {
filteredAssignmentsWithoutBookings.add(assignmentsWithoutBooking);
}
}
return filteredAssignmentsWithoutBookings;
}
private boolean isEmpty(List<?> list) {
return list == null || list.isEmpty();
}
}