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 51108a9..699c869 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 @@ -33,6 +33,9 @@ public class Licence { @OneToMany(mappedBy = "licence", cascade = CascadeType.ALL, orphanRemoval = true) private List paiements = new ArrayList<>(); + @OneToMany(mappedBy = "licence", cascade = CascadeType.ALL, orphanRemoval = true) + private List dotations = new ArrayList<>(); + // Logic for Reste A Payer @Transient public BigDecimal getResteAPayer() { @@ -75,6 +78,9 @@ public class Licence { public List getPaiements() { return paiements; } public void setPaiements(List paiements) { this.paiements = paiements; } + + public List getDotations() { return dotations; } + public void setDotations(List dotations) { this.dotations = dotations; } public String getNumeroLicence() { return numeroLicence; } public void setNumeroLicence(String numeroLicence) { this.numeroLicence = numeroLicence; } @@ -88,4 +94,14 @@ public class Licence { paiements.remove(paiement); paiement.setLicence(null); } + + public void addDotation(Dotation dotation) { + dotations.add(dotation); + dotation.setLicence(this); + } + + public void removeDotation(Dotation dotation) { + dotations.remove(dotation); + dotation.setLicence(null); + } } diff --git a/as-talange-web/src/main/java/com/astalange/web/controller/DotationController.java b/as-talange-web/src/main/java/com/astalange/web/controller/DotationController.java new file mode 100644 index 0000000..b4d103f --- /dev/null +++ b/as-talange-web/src/main/java/com/astalange/web/controller/DotationController.java @@ -0,0 +1,38 @@ +package com.astalange.web.controller; + +import com.astalange.core.entity.Dotation; +import com.astalange.core.repository.DotationRepository; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestParam; + +@Controller +public class DotationController { + + private final DotationRepository dotationRepository; + + public DotationController(DotationRepository dotationRepository) { + this.dotationRepository = dotationRepository; + } + + @PostMapping("/dotations/{id}") + public String updateDotation( + @PathVariable Long id, + @RequestParam Long adherentId, + @RequestParam(required = false, defaultValue = "") String taille, + @RequestParam(required = false, defaultValue = "") String flocage, + @RequestParam(required = false) Boolean fourni) { + + Dotation dotation = dotationRepository.findById(id) + .orElseThrow(() -> new IllegalArgumentException("Invalid Dotation ID: " + id)); + + dotation.setTaille(taille); + dotation.setFlocage(flocage); + dotation.setFourni(fourni != null && fourni); + + dotationRepository.save(dotation); + + return "redirect:/adherents/" + adherentId + "/edit"; + } +} 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 new file mode 100644 index 0000000..6329b21 --- /dev/null +++ b/as-talange-web/src/main/java/com/astalange/web/controller/EquipementController.java @@ -0,0 +1,55 @@ +package com.astalange.web.controller; + +import com.astalange.core.entity.Equipement; +import com.astalange.core.repository.EquipementRepository; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.*; + +@Controller +@RequestMapping("/equipements") +public class EquipementController { + + private final EquipementRepository equipementRepository; + + public EquipementController(EquipementRepository equipementRepository) { + this.equipementRepository = equipementRepository; + } + + @GetMapping + public String listEquipements(Model model) { + model.addAttribute("equipements", equipementRepository.findAll()); + return "parametrage/equipements_list"; + } + + @GetMapping("/new") + public String showCreateForm(Model model) { + 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); + return "parametrage/equipements_form"; + } + + @PostMapping + public String saveEquipement(@ModelAttribute("equipement") Equipement equipement) { + if (equipement.getObligatoire() == null) { + equipement.setObligatoire(false); + } + equipementRepository.save(equipement); + return "redirect:/equipements"; + } + + @PostMapping("/{id}/delete") + public String deleteEquipement(@PathVariable Long id) { + Equipement equipement = equipementRepository.findById(id) + .orElseThrow(() -> new IllegalArgumentException("Invalid equipment ID: " + id)); + equipementRepository.delete(equipement); + return "redirect:/equipements"; + } +} 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 dd20734..c0f5389 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 @@ -3,25 +3,39 @@ 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.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 org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestParam; +import java.util.List; + @Controller public class LicenceController { private final AdherentRepository adherentRepository; private final CategorieRepository categorieRepository; private final LicenceRepository licenceRepository; + private final EquipementRepository equipementRepository; + private final DotationRepository dotationRepository; - public LicenceController(AdherentRepository adherentRepository, CategorieRepository categorieRepository, LicenceRepository licenceRepository) { + public LicenceController(AdherentRepository adherentRepository, + CategorieRepository categorieRepository, + LicenceRepository licenceRepository, + EquipementRepository equipementRepository, + DotationRepository dotationRepository) { this.adherentRepository = adherentRepository; this.categorieRepository = categorieRepository; this.licenceRepository = licenceRepository; + this.equipementRepository = equipementRepository; + this.dotationRepository = dotationRepository; } @PostMapping("/adherents/{id}/licences") @@ -29,7 +43,8 @@ public class LicenceController { @PathVariable Long id, @RequestParam Long categorieId, @RequestParam String saison, - @RequestParam String etat) { + @RequestParam String etat, + @RequestParam(required = false) String numeroLicence) { Adherent adherent = adherentRepository.findById(id) .orElseThrow(() -> new IllegalArgumentException("Invalid Adherent ID")); @@ -41,8 +56,21 @@ public class LicenceController { licence.setCategorie(categorie); licence.setSaison(saison); licence.setEtat(etat); + licence.setNumeroLicence(numeroLicence); - licenceRepository.save(licence); + licence = licenceRepository.save(licence); + + // Auto-initialize dotations for all configured equipments + List equipements = equipementRepository.findAll(); + for (Equipement eq : equipements) { + Dotation dotation = new Dotation(); + dotation.setLicence(licence); + dotation.setEquipement(eq); + dotation.setTaille(""); + dotation.setFlocage(""); + dotation.setFourni(false); + dotationRepository.save(dotation); + } return "redirect:/adherents/" + id + "/edit"; } diff --git a/as-talange-web/src/main/java/com/astalange/web/controller/PaiementsController.java b/as-talange-web/src/main/java/com/astalange/web/controller/PaiementsController.java new file mode 100644 index 0000000..5d63d56 --- /dev/null +++ b/as-talange-web/src/main/java/com/astalange/web/controller/PaiementsController.java @@ -0,0 +1,23 @@ +package com.astalange.web.controller; + +import com.astalange.core.repository.PaiementRepository; +import org.springframework.data.domain.Sort; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.GetMapping; + +@Controller +public class PaiementsController { + + private final PaiementRepository paiementRepository; + + public PaiementsController(PaiementRepository paiementRepository) { + this.paiementRepository = paiementRepository; + } + + @GetMapping("/paiements") + public String listPaiements(Model model) { + model.addAttribute("paiements", paiementRepository.findAll(Sort.by(Sort.Direction.DESC, "datePaiement", "id"))); + return "paiements/list"; + } +} 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 d80484b..12d5c49 100644 --- a/as-talange-web/src/main/resources/templates/adherents/form.html +++ b/as-talange-web/src/main/resources/templates/adherents/form.html @@ -21,10 +21,11 @@
Admin
@@ -180,7 +181,7 @@ - +
Historique des paiements
@@ -193,6 +194,51 @@
+ + +
Dotations Équipements
+
Aucune dotation pour cette licence.
+
+
+
+
+ Maillot + Obligatoire +
+
Description
+
+ + +
+ +
+
+ + +
+
+ + +
+
+
+ + +
+
+
+
+ + diff --git a/as-talange-web/src/main/resources/templates/adherents/list.html b/as-talange-web/src/main/resources/templates/adherents/list.html index aa226c4..08e2a2b 100644 --- a/as-talange-web/src/main/resources/templates/adherents/list.html +++ b/as-talange-web/src/main/resources/templates/adherents/list.html @@ -20,10 +20,11 @@
Admin
diff --git a/as-talange-web/src/main/resources/templates/index.html b/as-talange-web/src/main/resources/templates/index.html index 3f3aa9d..d0775fe 100644 --- a/as-talange-web/src/main/resources/templates/index.html +++ b/as-talange-web/src/main/resources/templates/index.html @@ -20,10 +20,11 @@
Admin
diff --git a/as-talange-web/src/main/resources/templates/paiements/list.html b/as-talange-web/src/main/resources/templates/paiements/list.html new file mode 100644 index 0000000..0881c8c --- /dev/null +++ b/as-talange-web/src/main/resources/templates/paiements/list.html @@ -0,0 +1,74 @@ + + + + + Paiements - AS Talange + + + + + + + + +
+
+

Historique des Paiements

+
+ +
+
+

Transactions Récentes

+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + +
DateAdhérentCatégorieSaisonMode de paiementMontant
Aucun paiement enregistré pour le moment.
15/05/2026 + Jean Dupont + U132024-2025 + Chèque + 50.00 €
+
+
+
+ + diff --git a/as-talange-web/src/main/resources/templates/parametrage/categories_form.html b/as-talange-web/src/main/resources/templates/parametrage/categories_form.html index 82a06ce..40a0da7 100644 --- a/as-talange-web/src/main/resources/templates/parametrage/categories_form.html +++ b/as-talange-web/src/main/resources/templates/parametrage/categories_form.html @@ -16,9 +16,11 @@ diff --git a/as-talange-web/src/main/resources/templates/parametrage/categories_list.html b/as-talange-web/src/main/resources/templates/parametrage/categories_list.html index a8935c1..14d5a75 100644 --- a/as-talange-web/src/main/resources/templates/parametrage/categories_list.html +++ b/as-talange-web/src/main/resources/templates/parametrage/categories_list.html @@ -16,9 +16,11 @@ 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 new file mode 100644 index 0000000..bdb5f1c --- /dev/null +++ b/as-talange-web/src/main/resources/templates/parametrage/equipements_form.html @@ -0,0 +1,63 @@ + + + + + Équipement - AS Talange + + + + + + + + +
+
+

Équipement

+
+ +
+
+
+ + +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ Annuler + +
+
+
+
+
+ + 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 new file mode 100644 index 0000000..78616a8 --- /dev/null +++ b/as-talange-web/src/main/resources/templates/parametrage/equipements_list.html @@ -0,0 +1,75 @@ + + + + + Paramétrage - Équipements + + + + + + + + +
+
+

Équipements du Club

+
+ +
+
+

Liste des Équipements

+ + + Nouvel Équipement + +
+ +
+ + + + + + + + + + + + + + + + + + + + +
Nom de l'équipementDescriptionObligatoireActions
Aucun équipement n'est paramétré.
MaillotMaillot de match officiel + Oui + + Modifier +
+ +
+
+
+
+
+ + diff --git a/as-talange-web/src/main/resources/templates/parametrage/modespaiement_form.html b/as-talange-web/src/main/resources/templates/parametrage/modespaiement_form.html index 814cf9e..6369418 100644 --- a/as-talange-web/src/main/resources/templates/parametrage/modespaiement_form.html +++ b/as-talange-web/src/main/resources/templates/parametrage/modespaiement_form.html @@ -16,9 +16,11 @@ diff --git a/as-talange-web/src/main/resources/templates/parametrage/modespaiement_list.html b/as-talange-web/src/main/resources/templates/parametrage/modespaiement_list.html index f3c0d03..08dc722 100644 --- a/as-talange-web/src/main/resources/templates/parametrage/modespaiement_list.html +++ b/as-talange-web/src/main/resources/templates/parametrage/modespaiement_list.html @@ -16,9 +16,11 @@