O de France — Application de Gestion Commerciale en JavaFX
Présentation du projet
Dans le cadre de la SAE 2.01, O de France est une application de gestion commerciale destinée à une entreprise vendant de l’eau en bouteilles (plate et gazeuse).
Elle permet de gérer efficacement :
- les clients (particuliers, entreprises, établissements publics),
- les stocks d’eau dans différents entrepôts,
- les commandes avec un système de remises et de bouteilles gratuites selon la fidélité client.
L’application utilise :
- une architecture Modèle-Vue-Contrôleur (MVC) stricte
- le langage Java 11+
- le framework JavaFX
- le langage de définition d’interface FXML
Objectifs du projet
- Maîtriser la conception MVC en JavaFX
- Implémenter une gestion complète clients, stocks et commandes
- Appliquer la POO : héritage, polymorphisme, interfaces
- Gérer les remises et fidélités de manière flexible
- Proposer une interface utilisateur intuitive et réactive
Architecture du projet
1. Structure des packages
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
fr.iutlens.odefrance/
├── controller/ # Contrôleurs JavaFX
│ ├── ClientController.java
│ ├── StockController.java
│ ├── CommandeController.java
│ ├── ClientFormController.java
│ ├── StockFormController.java
│ └── CommandeFormController.java
├── model/ # Classes métier et données
│ ├── Client.java
│ ├── ClientParticulier.java
│ ├── ClientEntreprise.java
│ ├── ClientEtablissementPublic.java
│ ├── StockEau.java
│ ├── StockGlobal.java
│ ├── Commande.java
│ ├── LigneDeCommande.java
│ ├── Entrepot.java
│ └── Adresse.java
└── resources/ # FXML, CSS, images
├── fxml/
└── css/
|
2. Modèle-Vue-Contrôleur (MVC)
- Modèle : Logique métier et gestion des données
- Vue : Interfaces graphiques définies en FXML + CSS
- Contrôleur : Liaison entre la vue et le modèle, gestion des événements
Modules fonctionnels
Module Clients
Hiérarchie des classes
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
public abstract class Client {
protected int code;
protected Date dateInscription;
protected Adresse adresse;
protected double pointsFidelite;
public abstract String getTypeClient();
public abstract void ajoutPointsFidelite(double montantAchat);
}
public class ClientParticulier extends Client {
private String nom;
private String prenom;
private String email;
private String telephone;
@Override
public String getTypeClient() { return "Particulier"; }
}
public class ClientEntreprise extends Client {
private String nom;
private String contact;
private String siret;
@Override
public String getTypeClient() { return "Entreprise"; }
}
public class ClientEtablissementPublic extends Client {
private String nom;
private TypeEtablissement type;
@Override
public String getTypeClient() { return "Établissement public"; }
}
|
Fonctionnalités
- Gestion complète CRUD (création, lecture, mise à jour, suppression)
- Validation des données (email, téléphone, SIRET)
- Calcul et attribution des points de fidélité
- Recherche multicritère
- Import/export des clients
Module Stocks
Modèle StockEau
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
public class StockEau {
private Categorie categorie; // EAU_PLATE ou EAU_GAZEUSE
private Entrepot entrepot;
private int quantite; // en caisses
public void deltaQuantity(int delta) {
setQuantite(this.quantite + delta);
}
public void setQuantite(int quantite) {
if (quantite < 0) throw new IllegalArgumentException("Quantité négative");
this.quantite = quantite;
}
}
|
Gestion globale des stocks
1
2
3
4
5
6
7
8
9
10
11
|
public class StockGlobal {
private final ObservableList<StockEau> stocks;
public void addStockEau(StockEau stock) {
// Ajoute ou met à jour si existe déjà
}
public void diminuerQuantite(StockEau stock, int quantite) {
// Vérifie le stock avant déduction
}
}
|
Interface utilisateur
- Visualisation des stocks par entrepôt
- Alertes pour stocks faibles
- Modification par delta (+/-)
- Historique des mouvements
Module Commandes
Modèle Commande
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
public class Commande implements RemisesPossibles {
private Client client;
private Date dateCommande;
private ObservableList<LigneDeCommande> lignes;
public double montantTotal() {
return lignes.stream().mapToDouble(LigneDeCommande::getMontantTotal).sum();
}
public double montantDeLaRemise() {
// Calcul selon type client et points fidélité
}
public int nombreBouteillesGratuites() {
// 1 gratuite par 12/60/120 bouteilles selon client
}
}
|
Processus de commande
- Sélection du client
- Ajout de lignes (type d’eau + quantité)
- Application automatique des remises et bouteilles gratuites
- Validation et mise à jour des stocks
Points techniques remarquables
Polymorphisme
1
2
3
4
|
public void ajouterClient(Client client) {
clients.add(client);
client.ajoutPointsFidelite(montantAchat); // comportement propre selon type client
}
|
Validation spécifique
1
2
3
4
5
6
7
8
9
10
|
private boolean validerClient() {
if (nomField.getText().trim().isEmpty()) {
afficherErreur("Nom obligatoire");
return false;
}
if (client instanceof ClientEntreprise && !validerSiret()) {
return false;
}
return true;
}
|
Bindings JavaFX
1
2
|
<!-- Affichage conditionnel selon type client -->
<TextField fx:id="siretField" visible="\${typeClientCombo.value == 'Entreprise'}"/>
|
Design Patterns
- Observer : mises à jour automatiques des vues
- Factory : création des clients selon type
- Strategy : calcul des remises
Captures d’écran
Gestion Clients
Interface de gestion des clients

Stocks
Visualisation des stocks avec indicateurs

Formulaire Commande
Formulaire de commande avec calcul automatique

Conclusion
Cette application démontre :
- Une architecture MVC rigoureuse
- Une bonne maîtrise de JavaFX et FXML
- L’utilisation des concepts avancés de POO
- Une interface intuitive et réactive
- Une gestion robuste des données