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(); } }