@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;
  }