Aller au contenu

Propositions de correction

TP 2 Gestion de stock

package fr.mer.gestion.semaine2.gestionstockv2;

import java.util.Objects;

public class Produit {
    private String code;
    private String nom;
    private int quantite;
    private double prixUnitaire;

    // Constructeur complet
    public Produit(String code, String nom, int quantite, double prixUnitaire) {
        this.code = code;
        this.nom = nom;
        this.quantite = quantite;
        this.prixUnitaire = prixUnitaire;
    }

    // Constructeur sans prix
    public Produit(String code, String nom, int quantite) {
        this(code, nom, quantite, 0.0);
    }

    // Constructeur vide
    public Produit() {
        this(null, null, 0, 0.0);
    }

    // Getters et Setters
    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }

    public String getNom() {
        return nom;
    }

    public void setNom(String nom) {
        this.nom = nom;
    }

    public int getQuantite() {
        return quantite;
    }

    public void setQuantite(int quantite) {
        this.quantite = quantite;
    }

    public double getPrixUnitaire() {
        return prixUnitaire;
    }

    public void setPrixUnitaire(double prixUnitaire) {
        this.prixUnitaire = prixUnitaire;
    }

    public double getValeurStock() {
        return quantite * prixUnitaire;
    }

    @Override
    public String toString() {
        return "Code : " + code + " Libellé : " + nom + " Qté : " + quantite + " PU : " + prixUnitaire;
    }

    @Override
    public int hashCode() {
    	// écriture plus simple que dans la précédente version.
        return Objects.hash(code, nom, prixUnitaire, quantite);
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Produit other = (Produit) obj;
        return Objects.equals(code, other.code) && Objects.equals(nom, other.nom)
                && Double.doubleToLongBits(prixUnitaire) == Double.doubleToLongBits(other.prixUnitaire)
                && quantite == other.quantite;
    }
}

package fr.mer.gestion.semaine2.gestionstockv2;

import java.util.ArrayList;
import java.util.Scanner;

public class GererStock {

	// ici pour simplifier on déclare et on initialise notre ArrayList
	private ArrayList<Produit> produits = new ArrayList<>();

	// constructeur par défaut pour initialiser le stock de Produits
	public GererStock() {
		this.initialiserStock();
	}

	/**
	 * Méthode private pour initialiser le stock pour simplifier
	 */
	private void initialiserStock() {
		ajouterProduitDirect(new Produit("PRD001", "Ordinateur portable", 15, 899.99));
		ajouterProduitDirect(new Produit("PRD002", "Souris sans fil", 75, 29.99));
		ajouterProduitDirect(new Produit("PRD003", "Clavier mécanique", 45, 89.99));
		ajouterProduitDirect(new Produit("PRD004", "Écran 24 pouces", 8, 249.99));
		ajouterProduitDirect(new Produit("PRD005", "Webcam HD", 30, 79.99));
	}


	/**
	 * Méthode publique pour ajouter un produit
	 * @param produit
	 */
	public void ajouterProduitDirect(Produit produit) {
		produits.add(produit);
	}



	/**
	 * Méthode publique pour afficher le stock
	 */
	public void afficherStock() {
		System.out.println("\n╔═══════════════════════════════════════════════════════════╗");
		System.out.println("║                      STOCK ACTUEL                         ║");
		System.out.println("╚═══════════════════════════════════════════════════════════╝");
		System.out.println();

		if (produits.isEmpty()) {
			System.out.println("Aucun produit en stock !");
			return;
		}

		System.out.println("┌────────┬─────────────────────────┬──────────┬────────────┬──────────────┐");
		System.out.println("│  Code  │       Produit           │ Quantité │  Prix (€)  │  Valeur (€)  │");
		System.out.println("├────────┼─────────────────────────┼──────────┼────────────┼──────────────┤");

		// Ma boucle foreach
		for (Produit produit : produits) {
			System.out.printf("│ %-6s │ %-23s │ %8d │ %,10.2f │ %,12.2f │%n",
					produit.getCode(),
					produit.getNom(),
					produit.getQuantite(),
					produit.getPrixUnitaire(),
					produit.getValeurStock());
		}

		System.out.println("└────────┴─────────────────────────┴──────────┴────────────┴──────────────┘");
		System.out.printf("Total produits : %d%n", produits.size());
	}


	/**
	 * Méthode publique pour ajouter un produit
	 * @param scanner
	 */
	public void ajouterProduit(Scanner scanner) {
		System.out.println("\n=== AJOUTER UN PRODUIT ===");
		System.out.print("Code produit : ");
		String code = scanner.nextLine();

		if (codeExiste(code)) {
			System.out.println(" Erreur : Ce code produit existe déjà !");
			return;
		}

		System.out.print("Nom du produit : ");
		String nom = scanner.nextLine();

		System.out.print("Quantité : ");
		int quantite = scanner.nextInt();

		System.out.print("Prix unitaire : ");
		double prix = scanner.nextDouble();
		scanner.nextLine();

		produits.add(new Produit(code, nom, quantite, prix));
		System.out.println("✓ Produit ajouté avec succès !");
	}

	/**
	 * Méthode privée pour vérifier si un code existe
	 * @param code
	 * @return
	 */
	private boolean codeExiste(String code) {
		for (Produit produit : produits) {
			if (produit.getCode().equals(code)) {
				return true;
			}
		}
		return false;
	}


	/**
	 * Méthode publique pour modifier la quantité
	 * @param scanner
	 */
	public void modifierQuantite(Scanner scanner) {
		System.out.println("\n=== MODIFIER LA QUANTITÉ ===");
		System.out.print("Code produit : ");
		String code = scanner.nextLine();

		Produit produit = trouverProduitParCode(code);

		if (produit == null) {
			System.out.println(" Produit non trouvé !");
			return;
		}

		System.out.println("Produit : " + produit.getNom());
		System.out.println("Quantité actuelle : " + produit.getQuantite());

		System.out.println("\n1. Définir nouvelle quantité");
		System.out.println("2. Ajouter à la quantité (réception)");
		System.out.println("3. Retirer de la quantité (vente)");
		System.out.print("Choix : ");

		int choix = scanner.nextInt();
		scanner.nextLine();

		switch (choix) {
		case 1:
			System.out.print("Nouvelle quantité : ");
			int nouvelleQte = scanner.nextInt();
			produit.setQuantite(nouvelleQte);
			System.out.println(" Quantité mise à jour : " + nouvelleQte);
			break;

		case 2:
			System.out.print("Quantité à ajouter : ");
			int ajouter = scanner.nextInt();
			produit.setQuantite(produit.getQuantite()+ajouter);
			System.out.println(" Réception enregistrée. Nouvelle quantité : " + produit.getQuantite());
			break;

		case 3:
			System.out.print("Quantité à retirer : ");
			int retirer = scanner.nextInt();
			int qteActuelle = produit.getQuantite();

			if (retirer > qteActuelle) {
				System.out.println(" Erreur : Stock insuffisant !");
			} else {
				int qteApresRetrait = qteActuelle - retirer;
				produit.setQuantite(qteApresRetrait);
				System.out.println(" Vente enregistrée. Nouvelle quantité : " + qteApresRetrait);
			}
			break;

		default:
			System.out.println("Choix invalide !");
		}
	}

	/**
	 * Méthode privée pour trouver un produit par son code
	 * @param code
	 * @return
	 */
	private Produit trouverProduitParCode(String code) {
		for (Produit produit : produits) {
			if (produit.getCode().equals(code)) {
				return produit;
			}
		}
		return null;
	}

	/**
	 * Méthode publique pour supprimer un produit
	 * @param scanner
	 */
	public void supprimerProduit(Scanner scanner) {
		System.out.println("\n=== SUPPRIMER UN PRODUIT ===");

		System.out.print("Code produit : ");
		String code = scanner.nextLine();

		Produit produit = trouverProduitParCode(code);

		if (produit == null) {
			System.out.println(" Produit introuvable !");
			return;
		}

		System.out.println("Produit à supprimer : " + produit.getNom());
		System.out.print("Confirmer la suppression (O/N) ? ");
		String confirmation = scanner.nextLine();

		if (confirmation.equalsIgnoreCase("O")) {
			produits.remove(produit);
			System.out.println(" Produit supprimé !");
		} else {
			System.out.println("Suppression annulée.");
		}
	}

	/**
	 * Méthode publique pour rechercher un produit
	 * @param scanner
	 */
	public void rechercherProduit(Scanner scanner) {
		System.out.println("\n=== RECHERCHER UN PRODUIT ===");

		System.out.println("1. Rechercher par code");
		System.out.println("2. Rechercher par nom");
		System.out.print("Choix : ");

		int choix = scanner.nextInt();
		scanner.nextLine();

		switch (choix) {
		case 1:
			System.out.print("Code produit : ");
			String code = scanner.nextLine();
			Produit produit = trouverProduitParCode(code);

			if (produit != null) {
				afficherDetailProduit(produit);
			} else {
				System.out.println("✗ Produit non trouvé !");
			}
			break;

		case 2:
			System.out.print("Nom du produit (partiel) : ");
			String recherche = scanner.nextLine().toLowerCase();
			rechercherProduitsParNomPartiel(recherche);
			break;

		default:
			System.out.println("Choix invalide !");
		}
	}

	/**
	 * Méthode privée pour afficher les détails
	 * @param produit
	 */
	private void afficherDetailProduit(Produit produit) {
		System.out.println("\n┌─────────────────────────────────────────────┐");
		System.out.println("│         DÉTAIL DU PRODUIT                   │");
		System.out.println("├─────────────────────────────────────────────┤");
		System.out.printf("│ Code        : %-29s │%n", produit.getCode());
		System.out.printf("│ Nom         : %-29s │%n", produit.getNom());
		System.out.printf("│ Quantité    : %-29d │%n", produit.getQuantite());
		System.out.printf("│ Prix        : %,-29.2f │%n", produit.getPrixUnitaire());
		System.out.printf("│ Valeur      : %,-29.2f │%n", produit.getValeurStock());
		System.out.println("└─────────────────────────────────────────────┘");
	}

	/**
	 * Méthode privée pour rechercher des produits par le nom partiellement
	 * @param recherche
	 */
	private void rechercherProduitsParNomPartiel(String recherche) {
		boolean trouve = false;
		System.out.println("\nRésultats de la recherche pour \"" + recherche + "\" :");

		for (Produit produit : produits) {
			if (produit.getNom().toLowerCase().contains(recherche)) {
				afficherDetailProduit(produit);
				trouve = true;
			}
		}

		if (!trouve) {
			System.out.println("✗ Aucun produit trouvé !");
		}
	}

	/**
	 * Méthode publique pour afficher les statistiques
	 */
	public void afficherStatistiques() {
		System.out.println("\n╔═══════════════════════════════════════════════════════════╗");
		System.out.println("║                      STATISTIQUES                         ║");
		System.out.println("╚═══════════════════════════════════════════════════════════╝");
		System.out.println();

		if (produits.isEmpty()) {
			System.out.println("Aucune donnée disponible !");
			return;
		}

		int quantiteTotale = 0;
		double valeurTotale = 0;

		for (Produit produit : produits) {
			quantiteTotale += produit.getQuantite();
			valeurTotale += produit.getValeurStock();
		}

		double valeurMoyenne = valeurTotale / produits.size();

		Produit produitPlusCher = produits.get(0);
		Produit produitMoinsCher = produits.get(0);
		Produit produitPlusGrandeValeur = produits.get(0);
		double plusGrandeValeur = produitPlusGrandeValeur.getValeurStock();

		for (Produit produit : produits) {
			if (produit.getPrixUnitaire() > produitPlusCher.getPrixUnitaire()) {
				produitPlusCher = produit;
			}
			if (produit.getPrixUnitaire() < produitMoinsCher.getPrixUnitaire()) {
				produitMoinsCher = produit;
			}
			if (produit.getValeurStock() > plusGrandeValeur) {
				plusGrandeValeur = produit.getValeurStock();
				produitPlusGrandeValeur = produit;
			}
		}

		System.out.printf("Nombre de produits      : %d%n", produits.size());
		System.out.printf("Quantité totale         : %d unités%n", quantiteTotale);
		System.out.printf("Valeur totale du stock  : %,.2f €%n", valeurTotale);
		System.out.printf("Valeur moyenne/produit  : %,.2f €%n", valeurMoyenne);
		System.out.println();

		System.out.println("Produit le plus cher :");
		System.out.printf("  %s - %,.2f €%n", produitPlusCher.getNom(), produitPlusCher.getPrixUnitaire());

		System.out.println();
		System.out.println("Produit le moins cher :");
		System.out.printf("  %s - %,.2f €%n", produitMoinsCher.getNom(), produitMoinsCher.getPrixUnitaire());

		System.out.println();
		System.out.println("Produit avec la plus grande valeur stock :");
		System.out.printf("  %s - %,.2f € (qté: %d)%n",
				produitPlusGrandeValeur.getNom(),
				produitPlusGrandeValeur.getValeurStock(),
				produitPlusGrandeValeur.getQuantite());
	}

	/**
	 * Méthode publique pour afficher les alertes
	 */
	public void afficherAlertes() {
		System.out.println("\n╔═══════════════════════════════════════════════════════════╗");
		System.out.println("║                    ALERTES STOCK                          ║");
		System.out.println("╚═══════════════════════════════════════════════════════════╝");
		System.out.println();

		final int SEUIL_RUPTURE = 10;
		final int SEUIL_CRITIQUE = 5;

		boolean alerteTrouvee = false;

		System.out.println(" STOCK CRITIQUE (< " + SEUIL_CRITIQUE + " unités) :");
		for (Produit produit : produits) {
			if (produit.getQuantite() < SEUIL_CRITIQUE) {
				System.out.printf("  • %s - %s : %d unités%n",
						produit.getCode(),
						produit.getNom(),
						produit.getQuantite());
				alerteTrouvee = true;
			}
		}
		if (!alerteTrouvee) {
			System.out.println("  Aucune alerte critique.");
		}

		System.out.println();
		alerteTrouvee = false;

		System.out.println(" STOCK FAIBLE (< " + SEUIL_RUPTURE + " unités) :");
		for (Produit produit : produits) {
			if (produit.getQuantite() >= SEUIL_CRITIQUE && produit.getQuantite() < SEUIL_RUPTURE) {
				System.out.printf("  • %s - %s : %d unités%n",
						produit.getCode(),
						produit.getNom(),
						produit.getQuantite());
				alerteTrouvee = true;
			}
		}
		if (!alerteTrouvee) {
			System.out.println("  Aucune alerte de stock faible.");
		}
	}

 
	/**
	 * méthode publique pour afficher le menu
	 */
	public void afficherMenu() {
		System.out.println("\n╔═══════════════════════════════════════════════════════════╗");
		System.out.println("║                      MENU PRINCIPAL                       ║");
		System.out.println("╠═══════════════════════════════════════════════════════════╣");
		System.out.println("║  1. Afficher le stock                                     ║");
		System.out.println("║  2. Ajouter un produit                                    ║");
		System.out.println("║  3. Modifier la quantité                                  ║");
		System.out.println("║  4. Supprimer un produit                                  ║");
		System.out.println("║  5. Rechercher un produit                                 ║");
		System.out.println("║  6. Afficher les statistiques                             ║");
		System.out.println("║  7. Afficher les alertes stock                            ║");
		System.out.println("║  0. Quitter                                               ║");
		System.out.println("╚═══════════════════════════════════════════════════════════╝");
		System.out.print("Votre choix : ");
	}
}

package fr.mer.gestion.semaine2;

import java.util.Scanner;

/**
 * On pourrait faire encore plus simple...
 */
public class Main {
    public static void main(String[] args) {
        System.out.println("╔═══════════════════════════════════════════════════════════╗");
        System.out.println("║            SYSTÈME DE GESTION DE STOCK                    ║");
        System.out.println("╚═══════════════════════════════════════════════════════════╝");
        System.out.println();

        // instanciation de GererStock et initialisation des produits
        GererStock gererStock = new GererStock();

        Scanner scanner = new Scanner(System.in);
        int choix;

        do {
            gererStock.afficherMenu();
            choix = scanner.nextInt();
            scanner.nextLine(); 

            switch (choix) {
                case 1:
                    gererStock.afficherStock();
                    break;
                case 2:
                    gererStock.ajouterProduit(scanner);
                    break;
                case 3:
                    gererStock.modifierQuantite(scanner);
                    break;
                case 4:
                    gererStock.supprimerProduit(scanner);
                    break;
                case 5:
                    gererStock.rechercherProduit(scanner);
                    break;
                case 6:
                    gererStock.afficherStatistiques();
                    break;
                case 7:
                    gererStock.afficherAlertes();
                    break;
                case 0:
                    System.out.println("Au revoir !");
                    break;
                default:
                    System.out.println("Choix invalide !");
            }

            if (choix != 0) {
                System.out.println("\nAppuyez sur Entrée pour continuer...");
                scanner.nextLine();
            }

        } while (choix != 0);

        scanner.close();
    }
}