From c94f89997f80cfaddb6fbffa45646136209c37c8 Mon Sep 17 00:00:00 2001 From: Youssef Date: Tue, 7 Jul 2026 22:56:29 +0200 Subject: [PATCH] feat: add equipment duplication and name uniqueness validation --- .../web/controller/EquipementController.java | 56 +++++++++++++++++-- .../parametrage/equipements_form.html | 3 + .../parametrage/equipements_list.html | 3 + 3 files changed, 56 insertions(+), 6 deletions(-) diff --git a/as-talange-web/src/main/java/com/astalange/web/controller/EquipementController.java b/as-talange-web/src/main/java/com/astalange/web/controller/EquipementController.java index dd89b94..adedebf 100644 --- a/as-talange-web/src/main/java/com/astalange/web/controller/EquipementController.java +++ b/as-talange-web/src/main/java/com/astalange/web/controller/EquipementController.java @@ -33,34 +33,78 @@ public class EquipementController { @GetMapping("/new") public String showCreateForm(Model model) { - model.addAttribute("equipement", new Equipement()); + if (!model.containsAttribute("equipement")) { + model.addAttribute("equipement", new Equipement()); + } return "parametrage/equipements_form"; } @GetMapping("/{id}/edit") public String showEditForm(@PathVariable Long id, Model model) { - Equipement equipement = equipementRepository.findById(id) - .orElseThrow(() -> new IllegalArgumentException("Invalid equipment ID: " + id)); - model.addAttribute("equipement", equipement); + if (!model.containsAttribute("equipement")) { + Equipement equipement = equipementRepository.findById(id) + .orElseThrow(() -> new IllegalArgumentException("Invalid equipment ID: " + id)); + model.addAttribute("equipement", equipement); + } return "parametrage/equipements_form"; } @PostMapping - public String saveEquipement(@ModelAttribute("equipement") Equipement equipement) { + public String saveEquipement(@ModelAttribute("equipement") Equipement equipement, + org.springframework.web.servlet.mvc.support.RedirectAttributes redirectAttributes) { + Saison activeSaison; if (equipement.getId() == null) { - Saison activeSaison = saisonRepository.findByEstActiveTrue() + activeSaison = saisonRepository.findByEstActiveTrue() .orElseThrow(() -> new IllegalStateException("Aucune saison active trouvée")); equipement.setSaison(activeSaison); } else { Equipement existing = equipementRepository.findById(equipement.getId()) .orElseThrow(() -> new IllegalArgumentException("Invalid equipment ID: " + equipement.getId())); equipement.setSaison(existing.getSaison()); + activeSaison = existing.getSaison(); } + + if (activeSaison != null) { + for (Equipement e : equipementRepository.findBySaison(activeSaison)) { + if (e.getNom().equalsIgnoreCase(equipement.getNom()) && (equipement.getId() == null || !e.getId().equals(equipement.getId()))) { + redirectAttributes.addFlashAttribute("errorMessage", "Erreur : L'équipement '" + equipement.getNom() + "' existe déjà pour cette saison."); + redirectAttributes.addFlashAttribute("equipement", equipement); + return equipement.getId() == null ? "redirect:/equipements/new" : "redirect:/equipements/" + equipement.getId() + "/edit"; + } + } + } + equipementRepository.save(equipement); return "redirect:/equipements"; } + @PostMapping("/{id}/duplicate") + public String duplicateEquipement(@PathVariable Long id) { + Equipement existing = equipementRepository.findById(id) + .orElseThrow(() -> new IllegalArgumentException("Invalid equipment ID: " + id)); + + Equipement duplicated = new Equipement(); + String newNom = existing.getNom() + " (dupliqué)"; + if (newNom.length() > 100) { + newNom = newNom.substring(0, 100); + } + duplicated.setNom(newNom); + duplicated.setReference(existing.getReference()); + duplicated.setDescription(existing.getDescription()); + duplicated.setGestionSexe(existing.isGestionSexe()); + duplicated.setTypePublic(existing.getTypePublic()); + duplicated.setTaillesDisponibles(existing.getTaillesDisponibles()); + duplicated.setCouleursDisponibles(existing.getCouleursDisponibles()); + duplicated.setHasFlocagePrenom(existing.isHasFlocagePrenom()); + duplicated.setHasFlocageInitiales(existing.isHasFlocageInitiales()); + duplicated.setHasFlocageNumero(existing.isHasFlocageNumero()); + duplicated.setSaison(existing.getSaison()); + + equipementRepository.save(duplicated); + return "redirect:/equipements"; + } + @PostMapping("/{id}/delete") public String deleteEquipement(@PathVariable Long id) { Equipement equipement = equipementRepository.findById(id) diff --git a/as-talange-web/src/main/resources/templates/parametrage/equipements_form.html b/as-talange-web/src/main/resources/templates/parametrage/equipements_form.html index 7d7dc7b..37cf60a 100644 --- a/as-talange-web/src/main/resources/templates/parametrage/equipements_form.html +++ b/as-talange-web/src/main/resources/templates/parametrage/equipements_form.html @@ -19,6 +19,9 @@
+
+

+
diff --git a/as-talange-web/src/main/resources/templates/parametrage/equipements_list.html b/as-talange-web/src/main/resources/templates/parametrage/equipements_list.html index ae2a039..1eeed9b 100644 --- a/as-talange-web/src/main/resources/templates/parametrage/equipements_list.html +++ b/as-talange-web/src/main/resources/templates/parametrage/equipements_list.html @@ -44,6 +44,9 @@ Maillot de match officiel Modifier + + +