Files
btpxpress-backend/docs/concepts/11-EMPLOYE.md
2025-10-01 01:37:34 +00:00

5.7 KiB

👷 CONCEPT: EMPLOYE

📌 Vue d'ensemble

Le concept EMPLOYE gère les ressources humaines : employés, compétences, équipes, et affectations aux chantiers.

Importance: (Concept stratégique)


🗂️ Fichiers concernés

Entités JPA

Fichier Description
Employe.java Entité principale employé
EmployeCompetence.java Compétences d'un employé
FonctionEmploye.java Enum fonctions
StatutEmploye.java Enum (ACTIF, CONGE, ARRET_MALADIE, FORMATION, INACTIF)
NiveauCompetence.java Enum niveaux de compétence
Equipe.java Entité équipe
StatutEquipe.java Enum (ACTIVE, INACTIVE, EN_MISSION, DISPONIBLE)

Services

Fichier Description
EmployeService.java Service métier employés
EquipeService.java Service métier équipes

Resources

Fichier Description
EmployeResource.java API REST employés
EquipeResource.java API REST équipes

📊 Modèle de données

Entité Employe

@Entity
@Table(name = "employes")
public class Employe extends PanacheEntityBase {
  @Id
  @GeneratedValue(strategy = GenerationType.UUID)
  private UUID id;
  
  @Column(name = "nom", nullable = false)
  private String nom;
  
  @Column(name = "prenom", nullable = false)
  private String prenom;
  
  @Column(name = "email", unique = true)
  private String email;
  
  @Column(name = "telephone")
  private String telephone;
  
  @Enumerated(EnumType.STRING)
  @Column(name = "fonction")
  private FonctionEmploye fonction;
  
  @Enumerated(EnumType.STRING)
  @Column(name = "statut")
  private StatutEmploye statut = StatutEmploye.ACTIF;
  
  @Column(name = "date_embauche")
  private LocalDate dateEmbauche;
  
  @Column(name = "taux_horaire", precision = 10, scale = 2)
  private BigDecimal tauxHoraire;
  
  @ManyToOne
  @JoinColumn(name = "equipe_id")
  private Equipe equipe;
  
  @OneToMany(mappedBy = "employe", cascade = CascadeType.ALL)
  private List<EmployeCompetence> competences;
}

Enum FonctionEmploye

public enum FonctionEmploye {
  CHEF_CHANTIER,
  CONDUCTEUR_TRAVAUX,
  MACON,
  ELECTRICIEN,
  PLOMBIER,
  CHARPENTIER,
  COUVREUR,
  PEINTRE,
  CARRELEUR,
  MENUISIER,
  TERRASSIER,
  GRUTIER,
  MANOEUVRE,
  AUTRE
}

Enum StatutEmploye

public enum StatutEmploye {
  ACTIF,           // Actif et disponible
  CONGE,           // En congé
  ARRET_MALADIE,   // Arrêt maladie
  FORMATION,       // En formation
  INACTIF          // Inactif (démission, licenciement)
}

🔌 API REST

Endpoints Employés

Méthode Endpoint Description
GET /api/v1/employes Liste employés
GET /api/v1/employes/{id} Détails
POST /api/v1/employes Créer
PUT /api/v1/employes/{id} Modifier
DELETE /api/v1/employes/{id} Supprimer
GET /api/v1/employes/disponibles Employés disponibles
GET /api/v1/employes/fonction/{fonction} Par fonction
GET /api/v1/employes/stats Statistiques

Endpoints Équipes

Méthode Endpoint Description
GET /api/v1/equipes Liste équipes
GET /api/v1/equipes/{id} Détails
POST /api/v1/equipes Créer
PUT /api/v1/equipes/{id} Modifier
POST /api/v1/equipes/{id}/membres Ajouter membre
DELETE /api/v1/equipes/{id}/membres/{employeId} Retirer membre

💻 Exemples

Créer un employé

curl -X POST http://localhost:8080/api/v1/employes \
  -H "Content-Type: application/json" \
  -d '{
    "nom": "Martin",
    "prenom": "Pierre",
    "email": "pierre.martin@btpxpress.fr",
    "telephone": "+33 6 12 34 56 78",
    "fonction": "MACON",
    "dateEmbauche": "2025-01-15",
    "tauxHoraire": 25.00,
    "competences": [
      {
        "nom": "Maçonnerie traditionnelle",
        "niveau": "EXPERT"
      },
      {
        "nom": "Coffrage",
        "niveau": "CONFIRME"
      }
    ]
  }'

Créer une équipe

curl -X POST http://localhost:8080/api/v1/equipes \
  -H "Content-Type: application/json" \
  -d '{
    "nom": "Équipe Gros Œuvre A",
    "chefEquipeId": "employe-uuid",
    "membreIds": ["uuid1", "uuid2", "uuid3"]
  }'

Employés disponibles

curl -X GET http://localhost:8080/api/v1/employes/disponibles

Réponse:

[
  {
    "id": "uuid",
    "nom": "Martin",
    "prenom": "Pierre",
    "fonction": "MACON",
    "statut": "ACTIF",
    "equipe": "Équipe Gros Œuvre A",
    "competences": ["Maçonnerie", "Coffrage"]
  }
]

🔧 Services métier

EmployeService

Méthodes principales:

  • findAll() - Tous les employés
  • findDisponibles() - Employés disponibles
  • findByFonction(FonctionEmploye) - Par fonction
  • create(EmployeDTO) - Créer
  • update(UUID id, EmployeDTO) - Modifier
  • changerStatut(UUID id, StatutEmploye) - Changer statut

EquipeService

Méthodes principales:

  • create(EquipeDTO) - Créer équipe
  • ajouterMembre(UUID equipeId, UUID employeId) - Ajouter membre
  • retirerMembre(UUID equipeId, UUID employeId) - Retirer membre

📈 Relations

  • EQUIPE ⬅️ Un employé appartient à une équipe
  • CHANTIER ➡️ Un employé peut être affecté à des chantiers
  • USER ⬅️ Un employé peut avoir un compte utilisateur

Validations

  • Nom et prénom obligatoires
  • Email unique
  • Fonction obligatoire
  • Taux horaire positif
  • Date d'embauche cohérente

Dernière mise à jour: 2025-09-30
Version: 1.0