/**
  * Calculate whether given hours can be fitted to the given week. Each day is assumed 8 hours
  * long.
  *
  * @param currentWeek
  * @param targetWeek
  * @param totalWorkload
  * @return
  */
 private boolean isAccommodableWorkload(
     int currentWeek, int targetWeek, AFTime totalWorkload, User user) {
   if (user == null) {
     return false;
   }
   long totalInWeek = 5;
   int daysLeft = 5;
   if (currentWeek == targetWeek) {
     Calendar cal = GregorianCalendar.getInstance();
     daysLeft = 1;
     while (cal.get(Calendar.DAY_OF_WEEK) != Calendar.FRIDAY && daysLeft < 6) {
       cal.add(Calendar.DAY_OF_YEAR, 1);
       daysLeft++;
     }
   }
   totalInWeek =
       (long)
           (user.getWeekHours().getTime()
               * (1.0 * daysLeft * settingBusiness.getCriticalLow() / (5 * 100)));
   if (totalInWeek < totalWorkload.getTime()) {
     return false;
   }
   return true;
 }
  public HashMap<Integer, String> calculateEffortLefts(
      Date from, int weeksAhead, Map<Backlog, List<BacklogItem>> items) {
    GregorianCalendar cal = new GregorianCalendar();
    CalendarUtils cUtils = new CalendarUtils();
    HashMap<Integer, String> effortLefts = new HashMap<Integer, String>();

    Date start = from;
    Date end = cUtils.nextMonday(start);
    cal.setTime(start);
    Integer week = cal.get(GregorianCalendar.WEEK_OF_YEAR);
    for (int i = 1; i <= weeksAhead; i++) {
      // 1. Get Backlogs that hit for the week
      log.debug("Projects searched from :" + start);
      log.debug("Projects searched ending :" + end);
      cal.setTime(start);
      week = cal.get(GregorianCalendar.WEEK_OF_YEAR);
      log.debug("Calculating sums for week" + week);

      // 2. Get projects that hit current week
      List<Backlog> list =
          this.getProjectsAndIterationsInTimeFrame(
              new ArrayList<Backlog>(items.keySet()), start, end);
      log.debug(list.size() + " projects found for given time frame");

      // 3. Calculate effort sum from items in those projects
      AFTime total = new AFTime(0);
      for (Backlog blog : list) {
        Project pro = null;
        Iteration it = null;
        if (blog.getClass().equals(Project.class)) {
          pro = (Project) blog;
          List<BacklogItem> blis = items.get((Backlog) pro);
          if (blis != null) {
            // Dividing for weeks that project hits
            AFTime sum =
                this.backlogBusiness.getEffortLeftResponsibleDividedSum(blis).getEffortHours();
            int projectLength = CalendarUtils.getLengthInDays(pro.getStartDate(), pro.getEndDate());
            log.debug("Week Project length: " + projectLength + " days");
            int weekEndDaysInProject = cUtils.getWeekEndDays(pro.getStartDate(), pro.getEndDate());
            log.debug("Excluding " + weekEndDaysInProject + " days from project as week end days");
            projectLength = projectLength - weekEndDaysInProject;
            if (projectLength == 0) { // TODO Find better way to
              // prevent null divination
              // if project on weekend
              projectLength = 1;
            }
            List<Date> dates =
                cUtils.getProjectDaysList(
                    pro.getStartDate(),
                    pro.getEndDate(),
                    start,
                    new Date(end.getTime() - 86400000L),
                    false);
            int projectDaysOnWeek = 0;
            if (dates != null) {
              projectDaysOnWeek = dates.size();
            }
            log.debug("Week Project length (modified): " + projectLength + " days");
            log.debug("Week Project days:" + projectDaysOnWeek);
            log.debug(
                "Week Project effort per day: " + new AFTime(sum.getTime() / (long) projectLength));
            sum = new AFTime((sum.getTime() / (long) projectLength) * projectDaysOnWeek);
            if (sum != null) {
              total.add(sum);
              log.debug("Week effort sum: " + sum);
            }
          }
        }
        if (blog.getClass().equals(Iteration.class)) {
          it = (Iteration) blog;
          List<BacklogItem> blis = items.get((Backlog) it);
          if (blis != null) {
            // Dividing for weeks that project hits
            AFTime sum =
                this.backlogBusiness.getEffortLeftResponsibleDividedSum(blis).getEffortHours();
            int projectLength = CalendarUtils.getLengthInDays(it.getStartDate(), it.getEndDate());
            log.debug("Week Project length: " + projectLength + " days");
            int weekEndDaysInProject = cUtils.getWeekEndDays(it.getStartDate(), it.getEndDate());
            log.debug("Excluding " + weekEndDaysInProject + " days from project as week end days");
            projectLength = projectLength - weekEndDaysInProject;
            if (projectLength == 0) { // TODO Find better way to
              // prevent null division if
              // project on weekend
              projectLength = 1;
            }
            List<Date> dates =
                cUtils.getProjectDaysList(
                    it.getStartDate(),
                    it.getEndDate(),
                    start,
                    new Date(end.getTime() - 86400000L),
                    false);
            int projectDaysOnWeek = 0;
            if (dates != null) {
              projectDaysOnWeek = dates.size();
            }
            log.debug("Week Project length(modified): " + projectLength + " days");
            log.debug("Week Project days:" + projectDaysOnWeek);
            log.debug(
                "Week Project effort per day: " + new AFTime(sum.getTime() / (long) projectLength));
            sum = new AFTime((sum.getTime() / (long) projectLength) * projectDaysOnWeek);
            if (sum != null) {
              total.add(sum);
              log.debug("Week effort sum: " + sum);
            }
          }
        }
      }

      effortLefts.put(week, total.toString());
      start = cUtils.nextMonday(start);
      end = cUtils.nextMonday(start);
      cal.setTime(start);
      week = cal.get(GregorianCalendar.WEEK_OF_YEAR);
    }

    return effortLefts;
  }