@SuppressWarnings("unchecked")
  @Path("/encadrant/{id}")
  @GET
  @Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
  public List<Collaborateur> getCollaborateurByEncadrant(@PathParam("id") int id) {

    Session session = HibernateUtil.getSessionFactory().getCurrentSession();
    List<Collaborateur> collaborateurs = null;

    try {
      session.beginTransaction();
      Encadrant encadrant = (Encadrant) session.get(Encadrant.class, new Long(id));

      if (encadrant != null) {
        collaborateurs =
            session
                .createQuery(
                    "select distinct col from Collaborateur as col join col.fichesEvaluations as fiche"
                        + " join fiche.evaluations as eval where eval.encadrant = :encadrant")
                .setEntity("encadrant", encadrant)
                .list();
      }
      session.getTransaction().commit();
    } catch (Exception e) {
      if (session.getTransaction() != null) session.getTransaction().rollback();
    } finally {
      if (session.isOpen()) {
        session.close();
      }
    }

    return collaborateurs;
  }
  @Path("{id}")
  @PUT
  @Consumes({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
  @Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
  public Collaborateur modifierCollaborateur(Collaborateur collaborateur) {

    Session session = HibernateUtil.getSessionFactory().getCurrentSession();

    try {
      session.beginTransaction();
      String mdp =
          (String)
              session
                  .createQuery(
                      "select col.motDePasse from Collaborateur col WHERE col = :collaborateur")
                  .setEntity("collaborateur", collaborateur)
                  .uniqueResult();

      if (!collaborateur.getMotDePasse().equals(mdp))
        collaborateur.setMotDePasse(
            Security.get_SHA_1_SecurePassword(collaborateur.getMotDePasse()));

      session.update(collaborateur);

      session.getTransaction().commit();
    } catch (Exception e) {
      if (session.getTransaction() != null) session.getTransaction().rollback();
    } finally {
      if (session.isOpen()) {
        session.close();
      }
    }

    return collaborateur;
  }
  @SuppressWarnings("unchecked")
  @Path("/managerrh/{id}")
  @GET
  @Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
  public List<Collaborateur> getCollaborateurByManagerRh(@PathParam("id") int id) {

    Session session = HibernateUtil.getSessionFactory().getCurrentSession();
    List<Collaborateur> collaborateurs = null;

    try {
      session.beginTransaction();
      ManagerRh managerRh = (ManagerRh) session.get(ManagerRh.class, new Long(id));

      if (managerRh != null) {
        collaborateurs =
            session
                .createQuery(
                    " select col from Collaborateur col, ManagerRh man"
                        + " where man = :managerrh AND col IN elements(man.collaborateurs)")
                .setEntity("managerRh", managerRh)
                .list();
      }

      session.getTransaction().commit();
    } catch (Exception e) {
      if (session.getTransaction() != null) session.getTransaction().rollback();
    } finally {
      if (session.isOpen()) {
        session.close();
      }
    }

    return collaborateurs;
  }
  @SuppressWarnings("unchecked")
  @Path("/bapstatut/{idencadrant}/{statut}")
  @GET
  @Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
  public List<Collaborateur> getCollaborateurByBapStatut(
      @PathParam("idencadrant") int id, @PathParam("statut") StatutBAP statut) {

    Session session = HibernateUtil.getSessionFactory().getCurrentSession();
    List<Collaborateur> collaborateurs = null;

    try {
      session.beginTransaction();
      ManagerRh managerRh = (ManagerRh) session.get(ManagerRh.class, new Long(id));

      if (managerRh != null) {

        collaborateurs =
            session
                .createQuery(
                    "select distinct col"
                        + " from Collaborateur as col, BAP as bap"
                        + " where bap.ficheObjectifsTraites IN elements(col.ficheObjectifs)"
                        + " AND bap.statut = :statut"
                        + " AND col.managerRh = :managerRh")
                .setString("statut", statut.name())
                .setEntity("managerRh", managerRh)
                .list();
      }

      session.getTransaction().commit();
    } catch (Exception e) {
      if (session.getTransaction() != null) session.getTransaction().rollback();
    } finally {
      if (session.isOpen()) {
        session.close();
      }
    }

    return collaborateurs;
  }
  @Path("{id}")
  @GET
  @Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
  public Collaborateur getCollaborateurById(@PathParam("id") int id) {

    Session session = HibernateUtil.getSessionFactory().getCurrentSession();
    Collaborateur collaborateur = null;

    try {
      session.beginTransaction();
      collaborateur = (Collaborateur) session.get(Collaborateur.class, new Long(id));

      session.getTransaction().commit();
    } catch (Exception e) {
      if (session.getTransaction() != null) session.getTransaction().rollback();
    } finally {
      if (session.isOpen()) {
        session.close();
      }
    }

    return collaborateur;
  }
  @SuppressWarnings("unchecked")
  @GET
  @Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
  public List<Collaborateur> getAllCollaborateurs() {

    Session session = HibernateUtil.getSessionFactory().getCurrentSession();
    List<Collaborateur> collaborateurs = null;

    try {
      session.beginTransaction();
      collaborateurs = session.createQuery("from Collaborateur").list();

      session.getTransaction().commit();
    } catch (Exception e) {
      if (session.getTransaction() != null) session.getTransaction().rollback();
    } finally {
      if (session.isOpen()) {
        session.close();
      }
    }

    return collaborateurs;
  }
  @POST
  @Consumes({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
  @Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
  public Collaborateur ajouterCollaborateur(Collaborateur collaborateur) {

    Session session = HibernateUtil.getSessionFactory().getCurrentSession();

    try {
      session.beginTransaction();
      collaborateur.setMotDePasse(Security.get_SHA_1_SecurePassword(collaborateur.getMotDePasse()));

      session.save(collaborateur);

      session.getTransaction().commit();
    } catch (Exception e) {
      if (session.getTransaction() != null) session.getTransaction().rollback();
    } finally {
      if (session.isOpen()) {
        session.close();
      }
    }

    return collaborateur;
  }
  @Path("{idmanager}")
  @POST
  @Consumes({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
  @Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
  public Collaborateur ajouterCollaborateurWithManager(
      Collaborateur collaborateur, @PathParam("idmanager") int idManager) {

    Session session = HibernateUtil.getSessionFactory().getCurrentSession();

    try {
      session.beginTransaction();
      ManagerRh managerRh = (ManagerRh) session.get(ManagerRh.class, new Long(idManager));

      if (managerRh != null) {
        collaborateur.setMotDePasse(
            Security.get_SHA_1_SecurePassword(collaborateur.getMotDePasse()));
        session.save(collaborateur);

        SQLQuery query =
            session.createSQLQuery(
                "update collaborateur set id_manager = "
                    + managerRh.getId()
                    + " where id = "
                    + collaborateur.getId());
        query.executeUpdate();

        BAP nouveauBap = new BAP();
        Calendar cal = Calendar.getInstance();
        cal.setTime(new Date());
        cal.add(Calendar.YEAR, 1);

        nouveauBap.setDateBilan(cal.getTime());
        nouveauBap.setStatut(StatutBAP.EN_ATTENTE);
        nouveauBap.setCollaborateur(collaborateur);

        FicheEvaluations ficheEvaluation = new FicheEvaluations();
        ficheEvaluation.setAutorisationAcces(false);
        ficheEvaluation.setDateEvaluation(new Date());
        ficheEvaluation.setNoteFinale(0);

        FicheObjectifs ficheObjectifs = new FicheObjectifs();
        ficheObjectifs.setAutorisationAcces(false);
        ficheObjectifs.setDateFicheObjectifs(new Date());

        nouveauBap.setFicheEvaluations(ficheEvaluation);
        nouveauBap.setFicheObjectifsTraites(ficheObjectifs);
        nouveauBap.setNombreRejet(0);
        session.save(nouveauBap);

        session.getTransaction().commit();

        session = HibernateUtil.getSessionFactory().getCurrentSession();
        session.beginTransaction();
        session.update(ficheObjectifs);
        session.getTransaction().commit();

        session = HibernateUtil.getSessionFactory().getCurrentSession();
        session.beginTransaction();
        session.update(ficheEvaluation);
        session.getTransaction().commit();

        session = HibernateUtil.getSessionFactory().getCurrentSession();
        session.beginTransaction();
        session.update(nouveauBap.getCollaborateur());
      }

      session.getTransaction().commit();
    } catch (Exception e) {
      if (session.getTransaction() != null) session.getTransaction().rollback();
    } finally {
      if (session.isOpen()) {
        session.close();
      }
    }

    return collaborateur;
  }