# Documentation Technique Complète
## Projet Gestion du Personnel M2L
## Table des Matières
1. [Introduction](#1-introduction)
2. [Technologies Utilisées](#2-technologies-utilisées)
3. [Architecture du Projet](#3-architecture-du-projet)
4. [Gestion des Exceptions](#5-gestion-des-exceptions)
5. [Persistance des Données](#6-persistance-des-données)
---
## 1. Introduction
### 1.1 Contexte du Projet
La Maison des Ligues de Lorraine (M2L) héberge plusieurs ligues sportives régionales. Chaque ligue emploie du personnel pour gérer ses activités administratives et opérationnelles.
Ce projet fournit une application de gestion du personnel permettant de centraliser et sécuriser la gestion de tous les employés des différentes ligues au sein d'un système unique.
### 1.2 Objectifs
- **Centralisation:** Gérer tous les employés de toutes les ligues dans une seule application
- **Validation:** Garantir la cohérence des données (dates, affectations, droits)
- **Hiérarchisation:** Système de droits avec root et administrateurs de ligue
- **Persistance:** Deux modes de sauvegarde (sérialisation et JDBC/MySQL)
- **Fiabilité:** Tests unitaires complets avec JUnit 5
### 1.3 Contraintes Fonctionnelles
- Un employé appartient à une seule ligue
- Chaque ligue a un administrateur (employé de la ligue ou root)
- La date d'arrivée doit être ≤ date de départ
- Le root ne peut pas être supprimé
- Un employé ne peut administrer que sa propre ligue
---
## 2. Technologies Utilisées
### 2.1 Java SE (Standard Edition)
**Version:** Java 11
**Fonctionnalités utilisées:**
- Programmation Orientée Objet (POO)
- Interfaces et classes abstraites
- Généricité (Collections)
- Sérialisation Java
- API `java.time.LocalDate` pour les dates
### 2.2 Base de Données
**MySQL
- Version MySQL 5.7+
- JDBC (Java Database Connectivity) pour la connexion
- Driver MySQL Connector/J 8.0+
### 2.3 Tests
**JUnit 5 (Jupiter):**
- Framework de tests unitaires
- Assertions et annotations
- Tests paramétrés
### 2.4 Dépendances Maven
```xml
<dependencies>
<!-- MySQL Connector -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.33</version>
</dependency>
<!-- JUnit 5 -->
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<version>5.9.3</version>
<scope>test</scope>
</dependency>
</dependencies>
```
---
## 3. Architecture du Projet
### 3.1 Structure des Packages
```
personnel-m2l/
├── commandLine/
│ ├── EmployeConsole.java
│ ├── LigueConsole.java
│ └── PersonnelConsole.java
├── personnel/
│ ├── Employe.java
│ ├── Ligue.java
│ ├── GestionPersonnel.java
│ ├── Passerelle.java
│ ├── DateIncoherenteException.java
│ ├── DroitsInsuffisants.java
│ ├── ImpossibleDeSupprimerRoot.java
│ └── SauvegardeImpossible.java
├── serialisation/
│ └── Serialization.java
├── jdbc/
│ ├── JDBC.java
│ └── Credentials.java
└── testsUnitaires/
├── testLigue.java
├── TestDateIncoherenteException.java
└── TestDatesincoherentes.java
```
### 3.2 Design Patterns Utilisés
**1. GestionPersonnel**
Garantit qu'une seule instance de GestionPersonnel existe:
```java
private static GestionPersonnel gestionPersonnel = null;
public static GestionPersonnel getGestionPersonnel() {
if (gestionPersonnel == null) {
gestionPersonnel = passerelle.getGestionPersonnel();
if (gestionPersonnel == null)
gestionPersonnel = new GestionPersonnel();
}
return gestionPersonnel;
}
```
**2. Passerelle**
Permet de changer le mode de persistance:
```java
public interface Passerelle {
GestionPersonnel getGestionPersonnel();
void sauvegarderGestionPersonnel(GestionPersonnel gp);
int insert(Ligue ligue);
}
```
Implémentations: `Serialization`, `JDBC`
**3. Création d'employés**
Seule la ligue peut créer des employés:
```java
public Employe addEmploye(String nom, String prenom, ...) {
Employe employe = new Employe(...);
employes.add(employe);
return employe;
}
```
**Relations:**
- GestionPersonnel contient plusieurs Ligues
- Ligue contient plusieurs Employés
- Ligue a un administrateur (Employe)
- GestionPersonnel a un root (Employe)
---
## 4. Gestion des Exceptions
### 4.1 DateIncoherenteException
**Type:** Custom exception
**Cas de déclenchement:**
- Date d'arrivée null
- Date de départ null
- Date d'arrivée > date de départ
**Exemple:**
```java
public void setDateArrivee(LocalDate dateArrivee) {
if (dateArrivee == null) {
throw new DateIncoherenteException(
"La date d'arrivée ne peut être null"
);
}
if (this.dateDepart != null &&
dateArrivee.isAfter(this.dateDepart)) {
throw new DateIncoherenteException(
"La date d'arrivée (" + dateArrivee +
") ne peut pas être postérieure à la date de départ (" +
this.dateDepart + ")"
);
}
this.dateArrivee = dateArrivee;
}
```
### 4.2 DroitsInsuffisants
**Type:** Custom Exception
**Déclenchement:**
```java
public void setAdministrateur(Employe admin) {
Employe root = gestionPersonnel.getRoot();
if (admin != root && admin.getLigue() != this) {
throw new DroitsInsuffisants();
}
this.administrateur = admin;
}
```
### 4.3 ImpossibleDeSupprimerRoot
**Type:** Custom Exception
**Déclenchement:**
```java
public void remove() {
if (this == gestionPersonnel.getRoot()) {
throw new ImpossibleDeSupprimerRoot();
}
}
```
---
## 5. Persistance des Données
### 5.1 Interface Passerelle
```java
public interface Passerelle {
GestionPersonnel getGestionPersonnel();
void sauvegarderGestionPersonnel(GestionPersonnel gp)
throws SauvegardeImpossible;
int insert(Ligue ligue) throws SauvegardeImpossible;
}
```
### 5.2 Sérialisation Java
**Fichier:** `Serialization.java`
**Principe:**
- Sauvegarde l'objet GestionPersonnel complet
- Fichier binaire: `GestionPersonnel.srz`
**Sauvegarde:**
```java
@Override
public void sauvegarderGestionPersonnel(
GestionPersonnel gp) throws SauvegardeImpossible {
try (ObjectOutputStream oos =
new ObjectOutputStream(
new FileOutputStream(FILE_NAME))) {
oos.writeObject(gp);
} catch (IOException e) {
throw new SauvegardeImpossible(e);
}
}
```
### 5.3 Persistance JDBC/MySQL
**Configuration:** `Credentials.java`
```java
private static String host = "localhost";
private static String port = "3306";
private static String database = "m2l_personnel";
private static String user = "root";
private static String password = "";
```
**Schéma de base de données:**
```sql
CREATE TABLE ligue (
id INT AUTO_INCREMENT PRIMARY KEY,
nom VARCHAR(200) NOT NULL
);
CREATE TABLE employe (
id INT AUTO_INCREMENT PRIMARY KEY,
nom VARCHAR(100) NOT NULL,
prenom VARCHAR(100) NOT NULL,
email VARCHAR(150) UNIQUE NOT NULL,
password VARCHAR(255) NOT NULL,
date_arrivee DATE NOT NULL,
date_depart DATE NOT NULL,
id_ligue INT,
est_admin BOOLEAN DEFAULT FALSE,
FOREIGN KEY (id_ligue) REFERENCES ligue(id)
);
```
## Conclusion
Cette application démontre:
- Architecture Java SE complète
- Validation robuste des données
- Exceptions personnalisées
- Persistance flexible
- Tests unitaires complets
- Interface console ergonomique