feat: gestion des utilisateurs, rôles et équipes

- Ajout de la section de gestion des utilisateurs avec rôles (Admin, Trésorerie, Agent de Saisie).
- Restriction des accès par rôle (Admin a tout, Trésorerie a adhérents/paiements, Agent de saisie a adhérents/planning).
- Flux de modification obligatoire de mot de passe temporaire au premier login (par défaut AsTalange123).
- Intégration de la configuration des équipes du club.
This commit is contained in:
2026-05-30 23:11:12 +02:00
parent 7e9504ffe0
commit 8a15139efb
29 changed files with 948 additions and 35 deletions
@@ -1,17 +1,7 @@
package com.astalange.web.controller;
import com.astalange.core.entity.Adherent;
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 com.astalange.core.entity.*;
import com.astalange.core.repository.*;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
@@ -28,19 +18,22 @@ public class LicenceController {
private final EquipementRepository equipementRepository;
private final DotationRepository dotationRepository;
private final SaisonRepository saisonRepository;
private final EquipeRepository equipeRepository;
public LicenceController(AdherentRepository adherentRepository,
CategorieRepository categorieRepository,
LicenceRepository licenceRepository,
EquipementRepository equipementRepository,
DotationRepository dotationRepository,
SaisonRepository saisonRepository) {
SaisonRepository saisonRepository,
EquipeRepository equipeRepository) {
this.adherentRepository = adherentRepository;
this.categorieRepository = categorieRepository;
this.licenceRepository = licenceRepository;
this.equipementRepository = equipementRepository;
this.dotationRepository = dotationRepository;
this.saisonRepository = saisonRepository;
this.equipeRepository = equipeRepository;
}
@PostMapping("/adherents/{id}/licences")
@@ -48,7 +41,8 @@ public class LicenceController {
@PathVariable Long id,
@RequestParam Long categorieId,
@RequestParam String etat,
@RequestParam(required = false) String numeroLicence) {
@RequestParam(required = false) String numeroLicence,
@RequestParam(required = false) Long equipeId) {
Adherent adherent = adherentRepository.findById(id)
.orElseThrow(() -> new IllegalArgumentException("Invalid Adherent ID"));
@@ -71,6 +65,12 @@ public class LicenceController {
licence.setEtat(etat);
licence.setNumeroLicence(numeroLicence);
if (equipeId != null) {
Equipe equipe = equipeRepository.findById(equipeId)
.orElseThrow(() -> new IllegalArgumentException("Invalid Equipe ID"));
licence.setEquipe(equipe);
}
licence = licenceRepository.save(licence);
// Auto-initialize dotations for all configured equipments of the active season
@@ -96,7 +96,8 @@ public class LicenceController {
@PathVariable Long licenceId,
@RequestParam Long categorieId,
@RequestParam String etat,
@RequestParam(required = false) String numeroLicence) {
@RequestParam(required = false) String numeroLicence,
@RequestParam(required = false) Long equipeId) {
Licence licence = licenceRepository.findById(licenceId)
.orElseThrow(() -> new IllegalArgumentException("Invalid Licence ID"));
@@ -108,6 +109,14 @@ public class LicenceController {
licence.setEtat(etat);
licence.setNumeroLicence(numeroLicence);
if (equipeId != null) {
Equipe equipe = equipeRepository.findById(equipeId)
.orElseThrow(() -> new IllegalArgumentException("Invalid Equipe ID"));
licence.setEquipe(equipe);
} else {
licence.setEquipe(null);
}
licenceRepository.save(licence);
return "redirect:/adherents/" + adherentId + "/edit";