Aller au contenu

Mini-projet Java – Chocolaterie de Pâques

Contexte

Vous travaillez pour La Maison du Cacao Royal, une chocolaterie française de très grande renommée située à Mer.

À l’approche de Pâques, l’entreprise souhaite disposer d’une application Java en console pour gérer :

L’interface graphique n’est pas demandée. Un menu console sera fourni pour faciliter les tests.

L’objectif du projet est de mettre en pratique plusieurs notions vues en cours :


1. Compétences à mobiliser

Votre projet devra obligatoirement mettre en œuvre les points suivants :

L’utilisation de Maven est fortement conseillée.


2. Fonctionnalités attendues

L’application devra permettre au minimum de :

Gestion des produits

Gestion des clients

Gestion des commandes


3. Diagramme de cas d’utilisation (Use Case)

Le diagramme suivant décrit les principales actions attendues dans le système.

use case


4. Diagramme de classes UML

Le diagramme de classes suivant vous aide à identifier les principales classes métier et techniques.

use case


5. MCD / Schéma relationnel

Le projet s’appuie sur 5 tables.

use case


6. Structure minimale attendue du projet

Une organisation possible est la suivante :

src/main/java/
 └─ fr/chocolaterie/
    ├─ config/
    │   └─ DatabaseConnection.java
    ├─ model/
    │   ├─ Categorie.java
    │   ├─ Produit.java
    │   ├─ Client.java
    │   ├─ Commande.java
    │   └─ LigneCommande.java
    ├─ dao/
    │   ├─ ProduitDAO.java
    │   ├─ ClientDAO.java
    │   └─ CommandeDAO.java
    ├─ dao/impl/
    │   ├─ ProduitDAOImpl.java
    │   ├─ ClientDAOImpl.java
    │   └─ CommandeDAOImpl.java
    ├─ exception/
    │   └─ DataAccessException.java
    └─ service/
       └─ ConsoleMenuService.java

7. Design patterns imposés

7.1 Singleton

Vous devez utiliser le pattern Singleton pour la gestion de la connexion à la base de données.

Exemple attendu :

7.2 DAO

Vous devez utiliser le pattern DAO pour l’accès aux données.

Exemple attendu :


8. CRUD obligatoire

Un CRUD complet doit être réalisé sur au moins l’entité Produit :

Vous pouvez également faire un CRUD complet sur Client si vous souhaitez aller plus loin.


9. Contraintes techniques


10. Script SQL – création de la base

Vous pouvez utiliser PostgreSQL avec les scripts suivants.

10.1 Création des tables

DROP TABLE IF EXISTS ligne_commande;
DROP TABLE IF EXISTS commande;
DROP TABLE IF EXISTS produit;
DROP TABLE IF EXISTS client;
DROP TABLE IF EXISTS categorie;

CREATE TABLE categorie (
    id SERIAL PRIMARY KEY,
    libelle VARCHAR(100) NOT NULL UNIQUE
);

CREATE TABLE produit (
    id SERIAL PRIMARY KEY,
    nom VARCHAR(150) NOT NULL,
    description VARCHAR(255),
    prix NUMERIC(10,2) NOT NULL,
    stock INTEGER NOT NULL,
    categorie_id INTEGER NOT NULL,
    CONSTRAINT fk_produit_categorie
        FOREIGN KEY (categorie_id) REFERENCES categorie(id)
);

CREATE TABLE client (
    id SERIAL PRIMARY KEY,
    nom VARCHAR(100) NOT NULL,
    prenom VARCHAR(100) NOT NULL,
    email VARCHAR(150) NOT NULL UNIQUE,
    telephone VARCHAR(30)
);

CREATE TABLE commande (
    id SERIAL PRIMARY KEY,
    date_commande DATE NOT NULL,
    statut VARCHAR(50) NOT NULL,
    montant_total NUMERIC(10,2) NOT NULL,
    client_id INTEGER NOT NULL,
    CONSTRAINT fk_commande_client
        FOREIGN KEY (client_id) REFERENCES client(id)
);

CREATE TABLE ligne_commande (
    quantite INTEGER NOT NULL,
    prix_unitaire NUMERIC(10,2) NOT NULL,
    produit_id INTEGER NOT NULL,
    commande_id INTEGER NOT NULL,
    PRIMARY KEY (produit_id, commande_id),
    CONSTRAINT fk_ligne_produit
        FOREIGN KEY (produit_id) REFERENCES produit(id),
    CONSTRAINT fk_ligne_commande
        FOREIGN KEY (commande_id) REFERENCES commande(id)
);

10.2 Insertion de données fictives

INSERT INTO categorie (libelle) VALUES
('Oeufs de Pâques'),
('Lapins en chocolat'),
('Fritures'),
('Coffrets prestige');

INSERT INTO produit (nom, description, prix, stock, categorie_id) VALUES
('Œuf praliné signature', 'Grand œuf noir garni de praliné noisette', 29.90, 25, 1),
('Lapin lait croustillant', 'Lapin en chocolat au lait avec éclats caramélisés', 18.50, 40, 2),
('Friture royale assortie', 'Assortiment de petits chocolats de Pâques', 12.90, 60, 3),
('Coffret impérial de Pâques', 'Sélection prestige de la maison', 49.00, 15, 4),
('Œuf noir intense 72%', 'Œuf en chocolat noir grand cru', 31.50, 20, 1);

INSERT INTO client (nom, prenom, email, telephone) VALUES
('Martin', 'Claire', 'claire.martin@example.com', '0601020304'),
('Dupont', 'Hugo', 'hugo.dupont@example.com', '0611223344'),
('Petit', 'Sarah', 'sarah.petit@example.com', '0677889900');

INSERT INTO commande (date_commande, statut, montant_total, client_id) VALUES
('2026-03-20', 'EN_PREPARATION', 42.80, 1),
('2026-03-22', 'VALIDEE', 49.00, 2);

-- le produit_id et commande_id constitue la clef primaire composite.
INSERT INTO ligne_commande (quantite, prix_unitaire, produit_id, commande_id) VALUES
(1, 29.90, 1, 1),
(1, 12.90, 3, 1),
(1, 49.00, 4, 2);

11. Travail demandé

Partie 1 – Analyse

À partir des diagrammes fournis :

  1. identifier les classes métier,
  2. identifier les relations entre les objets,
  3. identifier les tables nécessaires,
  4. repérer les DAO à créer,
  5. expliquer où et pourquoi utiliser Singleton.

Partie 2 – Base de données

  1. créer la base,
  2. exécuter le script SQL,
  3. vérifier les données insérées.

Partie 3 – Développement Java

  1. créer les classes métier,
  2. créer les interfaces DAO,
  3. créer les implémentations JDBC,
  4. créer le Singleton de connexion,
  5. implémenter le menu console,
  6. réaliser le CRUD complet sur Produit.

Partie 4 – Bonus

  1. ajouter le CRUD complet sur Client,
  2. permettre la création de commandes multi-lignes,
  3. décrémenter le stock après validation d’une commande,
  4. ajouter des exceptions personnalisées plus explicites.

12. Livrables attendus

Vous devez rendre :


13. Conseils


14. Critères


15. Résultat attendu

À la fin du mini-projet, l’utilisateur doit pouvoir lancer l’application en console et effectuer des opérations comme :

Le tout dans une architecture propre, orientée objet et connectée à une base relationnelle (PostGreSQL)