diff --git a/as-talange-core/src/main/java/com/astalange/core/service/DotationService.java b/as-talange-core/src/main/java/com/astalange/core/service/DotationService.java index a0d8f21..8f13d43 100644 --- a/as-talange-core/src/main/java/com/astalange/core/service/DotationService.java +++ b/as-talange-core/src/main/java/com/astalange/core/service/DotationService.java @@ -34,9 +34,19 @@ public class DotationService { Map groupCountMap = new LinkedHashMap<>(); for (Dotation d : dotations) { - String equipement = d.getEquipement() != null ? d.getEquipement().getNom() : "Inconnu"; - String reference = d.getEquipement() != null && d.getEquipement().getReference() != null ? d.getEquipement().getReference() : ""; - String taille = d.getTaille() != null && !d.getTaille().trim().isEmpty() ? d.getTaille() : "Non renseignée"; + // Exclure les équipements sans choix de tailles (ex: sacs à dos, ballons, etc.) + if (d.getEquipement() == null || d.getEquipement().getTaillesDisponibles() == null || d.getEquipement().getTaillesDisponibles().trim().isEmpty()) { + continue; + } + + // Exclure les dotations pour lesquelles la taille n'est pas renseignée/choisie + if (d.getTaille() == null || d.getTaille().trim().isEmpty()) { + continue; + } + + String equipement = d.getEquipement().getNom(); + String reference = d.getEquipement().getReference() != null ? d.getEquipement().getReference() : ""; + String taille = d.getTaille().trim(); String key = equipement + "|||" + reference + "|||" + taille; groupCountMap.put(key, groupCountMap.getOrDefault(key, 0) + 1); diff --git a/as-talange-core/src/test/java/com/astalange/core/service/DotationServiceTest.java b/as-talange-core/src/test/java/com/astalange/core/service/DotationServiceTest.java index 0515c74..d183cf8 100644 --- a/as-talange-core/src/test/java/com/astalange/core/service/DotationServiceTest.java +++ b/as-talange-core/src/test/java/com/astalange/core/service/DotationServiceTest.java @@ -121,4 +121,56 @@ public class DotationServiceTest { verify(dotationRepository, times(1)).save(d2); } + @Test + @DisplayName("Générer CSV Commande - Équipement regroupé par taille (Exclut les articles sans grille de tailles)") + public void testGenererCsvCommandeEquipement_ExclutSansTaille() { + Equipement eqMaillot = new Equipement(); + eqMaillot.setId(1L); + eqMaillot.setNom("Maillot de match"); + eqMaillot.setReference("REF-MAILLOT"); + eqMaillot.setTaillesDisponibles("S,M,L,XL"); + + Equipement eqSac = new Equipement(); + eqSac.setId(2L); + eqSac.setNom("Sac à dos"); + eqSac.setReference("REF-SAC"); + eqSac.setTaillesDisponibles(null); // No size options! + + Dotation dMaillot = new Dotation(); + dMaillot.setId(1L); + dMaillot.setLicence(licence); + dMaillot.setEquipement(eqMaillot); + dMaillot.setTaille("M"); + dMaillot.setChoisi(true); + dMaillot.setCommandee(false); + + Dotation dSac = new Dotation(); + dSac.setId(2L); + dSac.setLicence(licence); + dSac.setEquipement(eqSac); + dSac.setChoisi(true); + dSac.setCommandee(false); + + Dotation dMaillotSansTaille = new Dotation(); + dMaillotSansTaille.setId(3L); + dMaillotSansTaille.setLicence(licence); + dMaillotSansTaille.setEquipement(eqMaillot); + dMaillotSansTaille.setTaille(null); // Taille non choisie par l'adhérent + dMaillotSansTaille.setChoisi(true); + dMaillotSansTaille.setCommandee(false); + + when(dotationRepository.findByLicence_SaisonAndChoisiTrueAndCommandeeFalse(saison)) + .thenReturn(List.of(dMaillot, dSac, dMaillotSansTaille)); + + String csv = dotationService.genererCsvCommandeEquipement(saison); + + assertNotNull(csv); + assertTrue(csv.contains("Maillot de match")); + assertTrue(csv.contains("M")); + assertFalse(csv.contains("Sac à dos"), "Le sac à dos sans grille de tailles doit être exclu de l'export fournisseur par taille"); + assertTrue(dMaillot.getCommandee()); + assertFalse(dSac.getCommandee()); + assertFalse(dMaillotSansTaille.getCommandee(), "Le maillot dont la taille n'est pas choisie doit rester non commandé"); + } + }