/* * 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.DetailedReportDao; import net.rrm.ehour.persistence.report.dao.ReportAggregatedDao; import net.rrm.ehour.report.criteria.ReportCriteria; import net.rrm.ehour.report.reports.ReportData; import net.rrm.ehour.report.reports.element.FlatReportElement; import net.rrm.ehour.report.reports.element.FlatReportElementBuilder; import net.rrm.ehour.report.reports.element.LockableDate; import net.rrm.ehour.timesheet.service.TimesheetLockService; import net.rrm.ehour.util.DomainUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.Date; import java.util.List; /** * Report service for detailed reports implementation */ @Service("detailedReportService") public class DetailedReportServiceImpl extends AbstractReportServiceImpl<FlatReportElement> implements DetailedReportService { private DetailedReportDao detailedReportDao; DetailedReportServiceImpl() { } @Autowired public DetailedReportServiceImpl(ReportCriteriaService reportCriteriaService, ProjectDao projectDao, TimesheetLockService lockService, DetailedReportDao detailedReportDao, ReportAggregatedDao reportAggregatedDAO) { super(reportCriteriaService, projectDao, lockService, reportAggregatedDAO); this.detailedReportDao = detailedReportDao; } public ReportData getDetailedReportData(ReportCriteria reportCriteria) { return getReportData(reportCriteria); } @Override protected List<FlatReportElement> getReportElements(List<User> users, List<Project> projects, List<Date> lockedDates, DateRange reportRange, boolean showZeroBookings) { List<Integer> userIds = DomainUtil.getIdsFromDomainObjects(users); List<Integer> projectIds = DomainUtil.getIdsFromDomainObjects(projects); List<FlatReportElement> elements = getElements(userIds, projectIds, reportRange); for (FlatReportElement element : elements) { Date date = element.getDayDate(); element.setLockableDate(new LockableDate(date, lockedDates.contains(date))); } if (showZeroBookings) { List<FlatReportElement> reportElementsForAssignmentsWithoutBookings = getReportElementsForAssignmentsWithoutBookings(reportRange, userIds, projectIds); reportElementsForAssignmentsWithoutBookings.addAll(elements); return reportElementsForAssignmentsWithoutBookings; } else { return elements; } } private List<FlatReportElement> getReportElementsForAssignmentsWithoutBookings(DateRange reportRange, List<Integer> userIds, List<Integer> projectIds) { List<ProjectAssignment> assignments = getAssignmentsWithoutBookings(reportRange, userIds, projectIds); List<FlatReportElement> elements = Lists.newArrayList(); for (ProjectAssignment assignment : assignments) { elements.add(FlatReportElementBuilder.buildFlatReportElement(assignment)); } return elements; } private List<FlatReportElement> getElements(List<Integer> userIds, List<Integer> projectIds, DateRange reportRange) { List<FlatReportElement> elements; if (userIds.isEmpty() && projectIds.isEmpty()) { elements = detailedReportDao.getHoursPerDay(reportRange); } else if (projectIds.isEmpty()) { elements = detailedReportDao.getHoursPerDayForUsers(userIds, reportRange); } else if (userIds.isEmpty()) { elements = detailedReportDao.getHoursPerDayForProjects(projectIds, reportRange); } else { elements = detailedReportDao.getHoursPerDayForProjectsAndUsers(projectIds, userIds, reportRange); } return elements; } }