feat: implémentation de la gestion des saisons (UI, service, refactoring sidebar)

This commit is contained in:
2026-05-29 22:35:33 +02:00
parent dd31d73fed
commit a429e67133
27 changed files with 591 additions and 185 deletions
@@ -1,8 +1,10 @@
package com.astalange.web.controller;
import com.astalange.core.entity.Adherent;
import com.astalange.core.entity.Saison;
import com.astalange.core.repository.AdherentRepository;
import com.astalange.core.repository.CategorieRepository;
import com.astalange.core.repository.SaisonRepository;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
@@ -18,17 +20,25 @@ public class AdherentController {
private final CategorieRepository categorieRepository;
private final com.astalange.core.repository.LicenceRepository licenceRepository;
private final com.astalange.core.repository.ModePaiementRepository modePaiementRepository;
private final SaisonRepository saisonRepository;
public AdherentController(AdherentRepository adherentRepository, CategorieRepository categorieRepository, com.astalange.core.repository.LicenceRepository licenceRepository, com.astalange.core.repository.ModePaiementRepository modePaiementRepository) {
public AdherentController(AdherentRepository adherentRepository, CategorieRepository categorieRepository, com.astalange.core.repository.LicenceRepository licenceRepository, com.astalange.core.repository.ModePaiementRepository modePaiementRepository, SaisonRepository saisonRepository) {
this.adherentRepository = adherentRepository;
this.categorieRepository = categorieRepository;
this.licenceRepository = licenceRepository;
this.modePaiementRepository = modePaiementRepository;
this.saisonRepository = saisonRepository;
}
@GetMapping
public String listAdherents(Model model) {
List<Adherent> adherents = adherentRepository.findAll();
public String listAdherents(@org.springframework.web.bind.annotation.RequestParam(required = false) String query, Model model) {
List<Adherent> adherents;
if (query != null && !query.trim().isEmpty()) {
adherents = adherentRepository.searchByQuery(query.trim());
model.addAttribute("searchQuery", query.trim());
} else {
adherents = adherentRepository.findAll();
}
model.addAttribute("adherents", adherents);
return "adherents/list";
}
@@ -57,8 +67,16 @@ public class AdherentController {
public String editAdherent(@org.springframework.web.bind.annotation.PathVariable Long id, Model model) {
Adherent adherent = adherentRepository.findById(id)
.orElseThrow(() -> new IllegalArgumentException("Adhérent invalide : " + id));
Saison saisonActive = saisonRepository.findByEstActiveTrue().orElse(null);
if (saisonActive != null) {
model.addAttribute("categories", categorieRepository.findBySaison(saisonActive));
model.addAttribute("saisonActive", saisonActive);
} else {
model.addAttribute("categories", categorieRepository.findAll());
}
model.addAttribute("adherent", adherent);
model.addAttribute("categories", categorieRepository.findAll());
model.addAttribute("licences", licenceRepository.findByAdherentId(id));
model.addAttribute("modesPaiement", modePaiementRepository.findAll());
return "adherents/form";
@@ -0,0 +1,14 @@
package com.astalange.web.controller;
import jakarta.servlet.http.HttpServletRequest;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ModelAttribute;
@ControllerAdvice
public class GlobalControllerAdvice {
@ModelAttribute("requestURI")
public String requestURI(final HttpServletRequest request) {
return request.getRequestURI();
}
}
@@ -5,11 +5,13 @@ import com.astalange.core.entity.Categorie;
import com.astalange.core.entity.Licence;
import com.astalange.core.entity.Dotation;
import com.astalange.core.entity.Equipement;
import com.astalange.core.entity.Saison;
import com.astalange.core.repository.AdherentRepository;
import com.astalange.core.repository.CategorieRepository;
import com.astalange.core.repository.LicenceRepository;
import com.astalange.core.repository.DotationRepository;
import com.astalange.core.repository.EquipementRepository;
import com.astalange.core.repository.SaisonRepository;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
@@ -25,24 +27,26 @@ public class LicenceController {
private final LicenceRepository licenceRepository;
private final EquipementRepository equipementRepository;
private final DotationRepository dotationRepository;
private final SaisonRepository saisonRepository;
public LicenceController(AdherentRepository adherentRepository,
CategorieRepository categorieRepository,
LicenceRepository licenceRepository,
EquipementRepository equipementRepository,
DotationRepository dotationRepository) {
DotationRepository dotationRepository,
SaisonRepository saisonRepository) {
this.adherentRepository = adherentRepository;
this.categorieRepository = categorieRepository;
this.licenceRepository = licenceRepository;
this.equipementRepository = equipementRepository;
this.dotationRepository = dotationRepository;
this.saisonRepository = saisonRepository;
}
@PostMapping("/adherents/{id}/licences")
public String addLicence(
@PathVariable Long id,
@RequestParam Long categorieId,
@RequestParam String saison,
@RequestParam String etat,
@RequestParam(required = false) String numeroLicence) {
@@ -56,18 +60,21 @@ public class LicenceController {
Categorie categorie = categorieRepository.findById(categorieId)
.orElseThrow(() -> new IllegalArgumentException("Invalid Categorie ID"));
Saison saisonActive = saisonRepository.findByEstActiveTrue()
.orElseThrow(() -> new IllegalStateException("Aucune saison active trouvée"));
Licence licence = new Licence();
licence.setAdherent(adherent);
licence.setCategorie(categorie);
licence.setSaison(saison);
licence.setSaison(saisonActive);
licence.setEtat(etat);
licence.setNumeroLicence(numeroLicence);
licence = licenceRepository.save(licence);
// Auto-initialize dotations for all configured equipments
List<Equipement> equipements = equipementRepository.findAll();
// Auto-initialize dotations for all configured equipments of the active season
List<Equipement> equipements = equipementRepository.findBySaison(saisonActive);
for (Equipement eq : equipements) {
Dotation dotation = new Dotation();
dotation.setLicence(licence);
@@ -82,4 +89,27 @@ public class LicenceController {
return "redirect:/adherents/" + id + "/edit";
}
@PostMapping("/adherents/{adherentId}/licences/{licenceId}/update")
public String updateLicence(
@PathVariable Long adherentId,
@PathVariable Long licenceId,
@RequestParam Long categorieId,
@RequestParam String etat,
@RequestParam(required = false) String numeroLicence) {
Licence licence = licenceRepository.findById(licenceId)
.orElseThrow(() -> new IllegalArgumentException("Invalid Licence ID"));
Categorie categorie = categorieRepository.findById(categorieId)
.orElseThrow(() -> new IllegalArgumentException("Invalid Categorie ID"));
licence.setCategorie(categorie);
licence.setEtat(etat);
licence.setNumeroLicence(numeroLicence);
licenceRepository.save(licence);
return "redirect:/adherents/" + adherentId + "/edit";
}
}
@@ -0,0 +1,61 @@
package com.astalange.web.controller;
import com.astalange.core.entity.Saison;
import com.astalange.core.repository.SaisonRepository;
import com.astalange.core.service.SaisonService;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@Controller
@RequestMapping("/saisons")
public class SaisonController {
private final SaisonRepository saisonRepository;
private final SaisonService saisonService;
public SaisonController(SaisonRepository saisonRepository, SaisonService saisonService) {
this.saisonRepository = saisonRepository;
this.saisonService = saisonService;
}
@GetMapping
public String listSaisons(Model model) {
// Optionnel: On pourrait trier par ID descendant pour avoir la plus récente en haut
List<Saison> saisons = saisonRepository.findAll();
model.addAttribute("saisons", saisons);
return "parametrage/saisons_list";
}
@GetMapping("/new")
public String showCreateForm(Model model) {
return "parametrage/saison_form";
}
@PostMapping
public String saveSaison(@RequestParam String nom, @RequestParam(defaultValue = "false") boolean importerParametrage) {
saisonService.creerNouvelleSaison(nom, importerParametrage);
return "redirect:/saisons";
}
@PostMapping("/{id}/activer")
public String activerSaison(@PathVariable Long id) {
Saison saisonAActiver = saisonRepository.findById(id)
.orElseThrow(() -> new IllegalArgumentException("Saison introuvable : " + id));
// Désactiver toutes les saisons
List<Saison> toutes = saisonRepository.findAll();
for (Saison s : toutes) {
s.setEstActive(false);
saisonRepository.save(s);
}
// Activer la saison choisie
saisonAActiver.setEstActive(true);
saisonRepository.save(saisonAActiver);
return "redirect:/saisons";
}
}