@Override
  public ProjectManagerReport getProjectManagerDetailedReport(Project project) {
    ProjectManagerReport report = new ProjectManagerReport();

    // get the project
    report.setProject(project);

    // get a proper report range
    DateRange reportRange = getReportRangeForProject(project);
    report.setReportRange(reportRange);

    // get all aggregates
    List<Project> projects = Arrays.asList(project);
    SortedSet<AssignmentAggregateReportElement> aggregates =
        new TreeSet<AssignmentAggregateReportElement>(
            reportAggregatedDAO.getCumulatedHoursPerAssignmentForProjects(projects, reportRange));

    // filter out just the id's
    List<Integer> assignmentIds = new ArrayList<>();
    for (AssignmentAggregateReportElement aggregate : aggregates) {
      assignmentIds.add(aggregate.getProjectAssignment().getAssignmentId());
    }

    // get all assignments for this period regardless whether they booked hours on it
    List<ProjectAssignment> allAssignments =
        projectAssignmentService.getProjectAssignments(project, reportRange);

    for (ProjectAssignment assignment : allAssignments) {
      if (!assignmentIds.contains(assignment.getAssignmentId())) {
        AssignmentAggregateReportElement emptyAggregate = new AssignmentAggregateReportElement();
        emptyAggregate.setProjectAssignment(assignment);

        aggregates.add(emptyAggregate);
      }
    }

    report.setAggregates(aggregates);
    report.deriveTotals();

    return report;
  }
  private List<AssignmentAggregateReportElement> findAggregates(
      List<User> users, List<Project> projects, DateRange reportRange) {
    List<AssignmentAggregateReportElement> aggregates = new ArrayList<>();

    if (users.isEmpty() && projects.isEmpty()) {
      aggregates = reportAggregatedDAO.getCumulatedHoursPerAssignment(reportRange);
    } else if (projects.isEmpty()) {
      if (!CollectionUtils.isEmpty(users)) {
        aggregates = reportAggregatedDAO.getCumulatedHoursPerAssignmentForUsers(users, reportRange);
      }
    } else if (users.isEmpty()) {
      if (!CollectionUtils.isEmpty(projects)) {
        aggregates =
            reportAggregatedDAO.getCumulatedHoursPerAssignmentForProjects(projects, reportRange);
      }
    } else {
      if (!CollectionUtils.isEmpty(users) && !CollectionUtils.isEmpty(projects)) {
        aggregates =
            reportAggregatedDAO.getCumulatedHoursPerAssignmentForUsers(
                users, projects, reportRange);
      }
    }
    return aggregates;
  }