/**
   * permet de recupérer les dernières infos d'absences lié à un utilisateur et de calculer les nb
   * de jours de congés/rtt restant
   *
   * @param utilisateur
   * @return
   * @throws AbsenceException
   */
  public SessionUtilisateur loadSessionUtilisateur(Long utilisateurId, Date dateAbsence)
      throws Exception {

    // date du jour
    Date now = new Date();
    now = DateUtils.truncate(now, Calendar.DATE);

    Utilisateur utilisateur = utilisateurRepository.findOne(utilisateurId);

    SessionUtilisateur session = new SessionUtilisateur();
    session.setUtilisateur(utilisateur);

    // recuperation des rtt de l'utilisateur sur la période liée à la date d'absence souhaitée
    List<DemandeAbsence> rtts =
        absenceRepository.findByUtilisateur(
            utilisateur.getId(),
            getDateDebutPeriodeRTT(dateAbsence),
            getDateFinPeriodeRTT(dateAbsence),
            TypeAbsence.RTT);

    // recuperation des conges de l'utilisateur sur la période liée à la date d'absence souhaitée
    List<DemandeAbsence> conges =
        absenceRepository.findByUtilisateur(
            utilisateur.getId(),
            getDateDebutPeriodeConges(dateAbsence),
            getDateFinPeriodeConges(dateAbsence),
            TypeAbsence.CONGE);

    // recuperation des conges de l'utilisateur sur la période liée à la date d'absence souhaitée
    List<DemandeAbsence> autresConges =
        absenceRepository.findByUtilisateur(
            utilisateur.getId(), now, DateUtils.addYears(now, 1), TypeAbsence.AUTRE);

    // init des compteurs par rapport aux infos utilisateurs (congés/RTT de l'année + deltas
    // éventuels)
    CompteurConges compteurs = new CompteurConges();
    session.setCompteurs(compteurs);
    compteurs.setCongesAposer(utilisateur.getNbConges());
    compteurs.setRttAposer(utilisateur.getNbRTT());

    // prise en compte des deltas si la date de l'absence se trouve dans la période courante
    if (isPeriodeCouranteConges(dateAbsence)) {
      compteurs.setCongesAposer(compteurs.getCongesAposer() + utilisateur.getDeltaJoursConges());
    }
    if (isPeriodeCouranteRTT(dateAbsence)) {
      compteurs.setRttAposer(compteurs.getRttAposer() + utilisateur.getDeltaJoursRTT());
    }

    // maj des compteurs par rapport à la liste des absences
    // TODO gérer les cas de 80%
    for (DemandeAbsence rtt : rtts) {
      if (!rtt.getStatut().equals(StatutAbsence.REFUSE)) {
        float nbJours = getNbJoursForAbsence(rtt);
        compteurs.setRttAposer(compteurs.getRttAposer() - nbJours);
        if (rtt.getStatut().equals(StatutAbsence.POSE)) {
          compteurs.setRttEnAttente(compteurs.getRttEnAttente() + nbJours);
        }
      }
      if (rtt.getDateDebut().after(now)) {
        session.getAbsences().add(rtt);
      }
    }

    for (DemandeAbsence conge : conges) {
      if (!conge.getStatut().equals(StatutAbsence.REFUSE)) {
        float nbJours = getNbJoursForAbsence(conge);
        compteurs.setCongesAposer(compteurs.getCongesAposer() - nbJours);
        if (conge.getStatut().equals(StatutAbsence.POSE)) {
          compteurs.setCongesEnAttente(compteurs.getCongesEnAttente() + nbJours);
        }
      }
      if (conge.getDateDebut().after(now)) {
        session.getAbsences().add(conge);
      }
    }

    for (DemandeAbsence conge : autresConges) {
      if (conge.getDateDebut().after(now)) {
        session.getAbsences().add(conge);
      }
    }

    Collections.sort(session.getAbsences());

    // ajout des absences sur la période suivante
    List<DemandeAbsence> rttFuturs =
        absenceRepository.findByUtilisateur(
            utilisateur.getId(),
            DateUtils.addDays(getDateFinPeriodeRTT(dateAbsence), 1),
            TypeAbsence.RTT);
    List<DemandeAbsence> congesFuturs =
        absenceRepository.findByUtilisateur(
            utilisateur.getId(),
            DateUtils.addDays(getDateFinPeriodeConges(dateAbsence), 1),
            TypeAbsence.CONGE);
    List<DemandeAbsence> autresCongesFuturs =
        absenceRepository.findByUtilisateur(
            utilisateur.getId(),
            DateUtils.addDays(getDateFinPeriodeConges(dateAbsence), 1),
            TypeAbsence.AUTRE);
    session.getAbsencesFutures().addAll(rttFuturs);
    session.getAbsencesFutures().addAll(congesFuturs);
    session.getAbsencesFutures().addAll(autresCongesFuturs);
    Collections.sort(session.getAbsencesFutures());

    return session;
  }