From a429e671336aadd78da94ccdae0a8614862c8bd7 Mon Sep 17 00:00:00 2001 From: Youssef Date: Fri, 29 May 2026 22:35:33 +0200 Subject: [PATCH] =?UTF-8?q?feat:=20impl=C3=A9mentation=20de=20la=20gestion?= =?UTF-8?q?=20des=20saisons=20(UI,=20service,=20refactoring=20sidebar)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/astalange/core/entity/Categorie.java | 7 ++ .../com/astalange/core/entity/Equipement.java | 7 ++ .../com/astalange/core/entity/Licence.java | 9 +- .../com/astalange/core/entity/Saison.java | 58 +++++++++++ .../core/repository/AdherentRepository.java | 3 + .../core/repository/CategorieRepository.java | 4 + .../core/repository/EquipementRepository.java | 4 + .../core/repository/SaisonRepository.java | 12 +++ .../astalange/core/service/SaisonService.java | 84 ++++++++++++++++ .../db/migration/V9__introduction_saison.sql | 43 ++++++++ .../web/controller/AdherentController.java | 26 ++++- .../controller/GlobalControllerAdvice.java | 14 +++ .../web/controller/LicenceController.java | 40 +++++++- .../web/controller/SaisonController.java | 61 ++++++++++++ .../resources/templates/adherents/form.html | 99 ++++++++++++------- .../resources/templates/adherents/list.html | 28 ++---- .../templates/fragments/sidebar.html | 29 ++++++ .../src/main/resources/templates/index.html | 21 +--- .../resources/templates/paiements/list.html | 15 +-- .../parametrage/categories_form.html | 15 +-- .../parametrage/categories_list.html | 15 +-- .../parametrage/equipements_form.html | 15 +-- .../parametrage/equipements_list.html | 15 +-- .../parametrage/modespaiement_form.html | 15 +-- .../parametrage/modespaiement_list.html | 15 +-- .../templates/parametrage/saison_form.html | 60 +++++++++++ .../templates/parametrage/saisons_list.html | 62 ++++++++++++ 27 files changed, 591 insertions(+), 185 deletions(-) create mode 100644 as-talange-core/src/main/java/com/astalange/core/entity/Saison.java create mode 100644 as-talange-core/src/main/java/com/astalange/core/repository/SaisonRepository.java create mode 100644 as-talange-core/src/main/java/com/astalange/core/service/SaisonService.java create mode 100644 as-talange-core/src/main/resources/db/migration/V9__introduction_saison.sql create mode 100644 as-talange-web/src/main/java/com/astalange/web/controller/GlobalControllerAdvice.java create mode 100644 as-talange-web/src/main/java/com/astalange/web/controller/SaisonController.java create mode 100644 as-talange-web/src/main/resources/templates/fragments/sidebar.html create mode 100644 as-talange-web/src/main/resources/templates/parametrage/saison_form.html create mode 100644 as-talange-web/src/main/resources/templates/parametrage/saisons_list.html diff --git a/as-talange-core/src/main/java/com/astalange/core/entity/Categorie.java b/as-talange-core/src/main/java/com/astalange/core/entity/Categorie.java index 54ea636..a93775b 100644 --- a/as-talange-core/src/main/java/com/astalange/core/entity/Categorie.java +++ b/as-talange-core/src/main/java/com/astalange/core/entity/Categorie.java @@ -26,6 +26,10 @@ public class Categorie { @Column(name = "tarif_exterieur", nullable = false, precision = 10, scale = 2) private BigDecimal tarifExterieur; + @ManyToOne(optional = false, fetch = FetchType.LAZY) + @JoinColumn(name = "saison_id", nullable = false) + private Saison saison; + // Getters and Setters public Long getId() { return id; } @@ -45,4 +49,7 @@ public class Categorie { public BigDecimal getTarifExterieur() { return tarifExterieur; } public void setTarifExterieur(BigDecimal tarifExterieur) { this.tarifExterieur = tarifExterieur; } + + public Saison getSaison() { return saison; } + public void setSaison(Saison saison) { this.saison = saison; } } diff --git a/as-talange-core/src/main/java/com/astalange/core/entity/Equipement.java b/as-talange-core/src/main/java/com/astalange/core/entity/Equipement.java index 359ce46..e1b8c83 100644 --- a/as-talange-core/src/main/java/com/astalange/core/entity/Equipement.java +++ b/as-talange-core/src/main/java/com/astalange/core/entity/Equipement.java @@ -23,6 +23,10 @@ public class Equipement { @Column(name = "prix_contribution", nullable = false, precision = 10, scale = 2) private BigDecimal prixContribution = BigDecimal.ZERO; + @ManyToOne(optional = false, fetch = FetchType.LAZY) + @JoinColumn(name = "saison_id", nullable = false) + private Saison saison; + // Getters and Setters public Long getId() { return id; } @@ -39,4 +43,7 @@ public class Equipement { public BigDecimal getPrixContribution() { return prixContribution; } public void setPrixContribution(BigDecimal prixContribution) { this.prixContribution = prixContribution; } + + public Saison getSaison() { return saison; } + public void setSaison(Saison saison) { this.saison = saison; } } diff --git a/as-talange-core/src/main/java/com/astalange/core/entity/Licence.java b/as-talange-core/src/main/java/com/astalange/core/entity/Licence.java index 70018b4..42f4f47 100644 --- a/as-talange-core/src/main/java/com/astalange/core/entity/Licence.java +++ b/as-talange-core/src/main/java/com/astalange/core/entity/Licence.java @@ -21,8 +21,9 @@ public class Licence { @JoinColumn(name = "categorie_id", nullable = false) private Categorie categorie; - @Column(nullable = false, length = 20) - private String saison; + @ManyToOne(optional = false, fetch = FetchType.LAZY) + @JoinColumn(name = "saison_id", nullable = false) + private Saison saison; @Column(nullable = false, length = 50) private String etat; @@ -89,8 +90,8 @@ public class Licence { public Categorie getCategorie() { return categorie; } public void setCategorie(Categorie categorie) { this.categorie = categorie; } - public String getSaison() { return saison; } - public void setSaison(String saison) { this.saison = saison; } + public Saison getSaison() { return saison; } + public void setSaison(Saison saison) { this.saison = saison; } public String getEtat() { return etat; } public void setEtat(String etat) { this.etat = etat; } diff --git a/as-talange-core/src/main/java/com/astalange/core/entity/Saison.java b/as-talange-core/src/main/java/com/astalange/core/entity/Saison.java new file mode 100644 index 0000000..a9d1b04 --- /dev/null +++ b/as-talange-core/src/main/java/com/astalange/core/entity/Saison.java @@ -0,0 +1,58 @@ +package com.astalange.core.entity; + +import jakarta.persistence.*; +import java.util.Objects; + +@Entity +@Table(name = "saison") +public class Saison { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Column(nullable = false) + private String nom; + + @Column(name = "est_active", nullable = false) + private Boolean estActive = false; + + // Getters and Setters + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getNom() { + return nom; + } + + public void setNom(String nom) { + this.nom = nom; + } + + public Boolean getEstActive() { + return estActive; + } + + public void setEstActive(Boolean estActive) { + this.estActive = estActive; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Saison saison = (Saison) o; + return Objects.equals(id, saison.id); + } + + @Override + public int hashCode() { + return Objects.hash(id); + } +} diff --git a/as-talange-core/src/main/java/com/astalange/core/repository/AdherentRepository.java b/as-talange-core/src/main/java/com/astalange/core/repository/AdherentRepository.java index 9469049..a7b53d7 100644 --- a/as-talange-core/src/main/java/com/astalange/core/repository/AdherentRepository.java +++ b/as-talange-core/src/main/java/com/astalange/core/repository/AdherentRepository.java @@ -9,4 +9,7 @@ import java.util.List; @Repository public interface AdherentRepository extends JpaRepository { List findTop5ByOrderByIdDesc(); + + @org.springframework.data.jpa.repository.Query("SELECT DISTINCT a FROM Adherent a LEFT JOIN a.licences l WHERE LOWER(a.nom) LIKE LOWER(CONCAT('%', :query, '%')) OR LOWER(a.prenom) LIKE LOWER(CONCAT('%', :query, '%')) OR LOWER(l.numeroLicence) LIKE LOWER(CONCAT('%', :query, '%'))") + List searchByQuery(@org.springframework.data.repository.query.Param("query") String query); } diff --git a/as-talange-core/src/main/java/com/astalange/core/repository/CategorieRepository.java b/as-talange-core/src/main/java/com/astalange/core/repository/CategorieRepository.java index 697cb18..101fa20 100644 --- a/as-talange-core/src/main/java/com/astalange/core/repository/CategorieRepository.java +++ b/as-talange-core/src/main/java/com/astalange/core/repository/CategorieRepository.java @@ -4,6 +4,10 @@ import com.astalange.core.entity.Categorie; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; +import com.astalange.core.entity.Saison; +import java.util.List; + @Repository public interface CategorieRepository extends JpaRepository { + List findBySaison(Saison saison); } diff --git a/as-talange-core/src/main/java/com/astalange/core/repository/EquipementRepository.java b/as-talange-core/src/main/java/com/astalange/core/repository/EquipementRepository.java index 06cfea3..be0bb53 100644 --- a/as-talange-core/src/main/java/com/astalange/core/repository/EquipementRepository.java +++ b/as-talange-core/src/main/java/com/astalange/core/repository/EquipementRepository.java @@ -4,6 +4,10 @@ import com.astalange.core.entity.Equipement; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; +import com.astalange.core.entity.Saison; +import java.util.List; + @Repository public interface EquipementRepository extends JpaRepository { + List findBySaison(Saison saison); } diff --git a/as-talange-core/src/main/java/com/astalange/core/repository/SaisonRepository.java b/as-talange-core/src/main/java/com/astalange/core/repository/SaisonRepository.java new file mode 100644 index 0000000..11c619e --- /dev/null +++ b/as-talange-core/src/main/java/com/astalange/core/repository/SaisonRepository.java @@ -0,0 +1,12 @@ +package com.astalange.core.repository; + +import com.astalange.core.entity.Saison; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import java.util.Optional; + +@Repository +public interface SaisonRepository extends JpaRepository { + Optional findByEstActiveTrue(); +} diff --git a/as-talange-core/src/main/java/com/astalange/core/service/SaisonService.java b/as-talange-core/src/main/java/com/astalange/core/service/SaisonService.java new file mode 100644 index 0000000..bf32ea7 --- /dev/null +++ b/as-talange-core/src/main/java/com/astalange/core/service/SaisonService.java @@ -0,0 +1,84 @@ +package com.astalange.core.service; + +import com.astalange.core.entity.Categorie; +import com.astalange.core.entity.Equipement; +import com.astalange.core.entity.Saison; +import com.astalange.core.repository.CategorieRepository; +import com.astalange.core.repository.EquipementRepository; +import com.astalange.core.repository.SaisonRepository; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; +import java.util.Optional; + +@Service +public class SaisonService { + + private final SaisonRepository saisonRepository; + private final CategorieRepository categorieRepository; + private final EquipementRepository equipementRepository; + + public SaisonService(SaisonRepository saisonRepository, CategorieRepository categorieRepository, EquipementRepository equipementRepository) { + this.saisonRepository = saisonRepository; + this.categorieRepository = categorieRepository; + this.equipementRepository = equipementRepository; + } + + @Transactional + public Saison creerNouvelleSaison(String nom, boolean importerParametragePrecedent) { + Optional ancienneSaisonOpt = saisonRepository.findByEstActiveTrue(); + + // Désactiver toutes les saisons actuelles (il ne devrait y en avoir qu'une mais on s'assure de tout nettoyer) + List toutesLesSaisons = saisonRepository.findAll(); + for (Saison s : toutesLesSaisons) { + s.setEstActive(false); + saisonRepository.save(s); + } + + // Création de la nouvelle saison + Saison nouvelleSaison = new Saison(); + nouvelleSaison.setNom(nom); + nouvelleSaison.setEstActive(true); + nouvelleSaison = saisonRepository.save(nouvelleSaison); + + if (importerParametragePrecedent && ancienneSaisonOpt.isPresent()) { + Saison ancienneSaison = ancienneSaisonOpt.get(); + dupliquerParametrages(ancienneSaison, nouvelleSaison); + } + + return nouvelleSaison; + } + + private void dupliquerParametrages(Saison ancienneSaison, Saison nouvelleSaison) { + // 1. Dupliquer les équipements + List anciensEquipements = equipementRepository.findBySaison(ancienneSaison); + for (Equipement ancien : anciensEquipements) { + Equipement nouvelEquipement = new Equipement(); + nouvelEquipement.setNom(ancien.getNom()); + nouvelEquipement.setDescription(ancien.getDescription()); + nouvelEquipement.setObligatoire(ancien.getObligatoire()); + nouvelEquipement.setPrixContribution(ancien.getPrixContribution()); + nouvelEquipement.setSaison(nouvelleSaison); + equipementRepository.save(nouvelEquipement); + } + + // 2. Dupliquer les catégories (avec incrémentation de l'année) + List anciennesCategories = categorieRepository.findBySaison(ancienneSaison); + for (Categorie ancienne : anciennesCategories) { + Categorie nouvelleCategorie = new Categorie(); + nouvelleCategorie.setNom(ancienne.getNom()); + // Incrémentation de +1 sur l'année de naissance pivot + if (ancienne.getAnneeMin() != null) { + nouvelleCategorie.setAnneeMin(ancienne.getAnneeMin() + 1); + } + if (ancienne.getAnneeMax() != null) { + nouvelleCategorie.setAnneeMax(ancienne.getAnneeMax() + 1); + } + nouvelleCategorie.setTarifBase(ancienne.getTarifBase()); + nouvelleCategorie.setTarifExterieur(ancienne.getTarifExterieur()); + nouvelleCategorie.setSaison(nouvelleSaison); + categorieRepository.save(nouvelleCategorie); + } + } +} diff --git a/as-talange-core/src/main/resources/db/migration/V9__introduction_saison.sql b/as-talange-core/src/main/resources/db/migration/V9__introduction_saison.sql new file mode 100644 index 0000000..4ce61b5 --- /dev/null +++ b/as-talange-core/src/main/resources/db/migration/V9__introduction_saison.sql @@ -0,0 +1,43 @@ +-- V9__introduction_saison.sql +-- 1. Création de la table saison +CREATE TABLE saison ( + id BIGSERIAL PRIMARY KEY, + nom VARCHAR(255) NOT NULL, + est_active BOOLEAN NOT NULL DEFAULT FALSE +); + +-- Création d'une saison par défaut pour les données existantes +INSERT INTO saison (nom, est_active) VALUES ('Saison Actuelle', TRUE); + +-- 2. Ajout de saison_id dans les tables de paramétrage +ALTER TABLE categorie ADD COLUMN saison_id BIGINT; +ALTER TABLE equipement ADD COLUMN saison_id BIGINT; +-- Il n'y a pas de table tarif, les tarifs sont dans categorie. + +-- Affecter la saison par défaut aux paramètres existants +UPDATE categorie SET saison_id = (SELECT id FROM saison LIMIT 1); +UPDATE equipement SET saison_id = (SELECT id FROM saison LIMIT 1); + +-- Rendre saison_id NOT NULL et ajouter les contraintes +ALTER TABLE categorie ALTER COLUMN saison_id SET NOT NULL; +ALTER TABLE categorie ADD CONSTRAINT fk_categorie_saison FOREIGN KEY (saison_id) REFERENCES saison(id); + +ALTER TABLE equipement ALTER COLUMN saison_id SET NOT NULL; +ALTER TABLE equipement ADD CONSTRAINT fk_equipement_saison FOREIGN KEY (saison_id) REFERENCES saison(id); + +-- 3. Ajout de saison_id sur licence +-- Licence a déjà une colonne saison (String). On va la remplacer par saison_id +ALTER TABLE licence RENAME COLUMN saison TO ancienne_saison; +ALTER TABLE licence ADD COLUMN saison_id BIGINT; +UPDATE licence SET saison_id = (SELECT id FROM saison LIMIT 1); +ALTER TABLE licence ALTER COLUMN saison_id SET NOT NULL; +ALTER TABLE licence ADD CONSTRAINT fk_licence_saison FOREIGN KEY (saison_id) REFERENCES saison(id); +ALTER TABLE licence DROP COLUMN ancienne_saison; + +-- 4. Migration de paiement et dotation pour pointer sur licence_id au lieu de adherent_id +-- Ajout des colonnes licence_id +-- (Paiement et Dotation avaient un adherent_id qui n'est pas dans l'entité actuelle mais peut-être en base ?) +-- D'après les entités, Paiement et Dotation ont DEJA licence_id et n'ont PAS adherent_id ! +-- Le plan proposait de modifier ça mais le code a DÉJÀ ces modifications. +-- Je vais juste vérifier s'il faut modifier la base de données. +-- Les entités Paiement.java et Dotation.java ont déjà `private Licence licence;` diff --git a/as-talange-web/src/main/java/com/astalange/web/controller/AdherentController.java b/as-talange-web/src/main/java/com/astalange/web/controller/AdherentController.java index 1489053..08deebd 100644 --- a/as-talange-web/src/main/java/com/astalange/web/controller/AdherentController.java +++ b/as-talange-web/src/main/java/com/astalange/web/controller/AdherentController.java @@ -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 adherents = adherentRepository.findAll(); + public String listAdherents(@org.springframework.web.bind.annotation.RequestParam(required = false) String query, Model model) { + List 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"; diff --git a/as-talange-web/src/main/java/com/astalange/web/controller/GlobalControllerAdvice.java b/as-talange-web/src/main/java/com/astalange/web/controller/GlobalControllerAdvice.java new file mode 100644 index 0000000..7e27972 --- /dev/null +++ b/as-talange-web/src/main/java/com/astalange/web/controller/GlobalControllerAdvice.java @@ -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(); + } +} diff --git a/as-talange-web/src/main/java/com/astalange/web/controller/LicenceController.java b/as-talange-web/src/main/java/com/astalange/web/controller/LicenceController.java index 4964f3a..6765819 100644 --- a/as-talange-web/src/main/java/com/astalange/web/controller/LicenceController.java +++ b/as-talange-web/src/main/java/com/astalange/web/controller/LicenceController.java @@ -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 equipements = equipementRepository.findAll(); + // Auto-initialize dotations for all configured equipments of the active season + List 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"; + } } diff --git a/as-talange-web/src/main/java/com/astalange/web/controller/SaisonController.java b/as-talange-web/src/main/java/com/astalange/web/controller/SaisonController.java new file mode 100644 index 0000000..dd8f6e1 --- /dev/null +++ b/as-talange-web/src/main/java/com/astalange/web/controller/SaisonController.java @@ -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 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 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"; + } +} diff --git a/as-talange-web/src/main/resources/templates/adherents/form.html b/as-talange-web/src/main/resources/templates/adherents/form.html index dcd9487..d49b40f 100644 --- a/as-talange-web/src/main/resources/templates/adherents/form.html +++ b/as-talange-web/src/main/resources/templates/adherents/form.html @@ -14,26 +14,7 @@ - +
@@ -191,7 +172,7 @@ th:data-tarif-exterieur="${lic.categorie.tarifExterieur}" th:data-equipements-contrib="${lic.getPrixTotal().subtract(adherent.residentTalange ? lic.categorie.tarifBase : lic.categorie.tarifExterieur)}" th:data-total-paye="${lic.getPrixTotal().subtract(lic.getResteAPayer())}"> - 2024-2025 + 2024-2025 U15 100.00 € (Catégorie) @@ -206,9 +187,20 @@ 30.00 € - - + + + @@ -323,26 +315,29 @@