diff --git a/as-talange-core/src/main/java/com/astalange/core/entity/Dotation.java b/as-talange-core/src/main/java/com/astalange/core/entity/Dotation.java index 2312861..cba993b 100644 --- a/as-talange-core/src/main/java/com/astalange/core/entity/Dotation.java +++ b/as-talange-core/src/main/java/com/astalange/core/entity/Dotation.java @@ -27,6 +27,12 @@ public class Dotation { @Column(nullable = false) private Boolean fourni = false; + @Column(length = 10) + private String numero; + + @Column(nullable = false) + private Boolean choisi = false; + // Getters and Setters public Long getId() { return id; } @@ -46,4 +52,10 @@ public class Dotation { public Boolean getFourni() { return fourni; } public void setFourni(Boolean fourni) { this.fourni = fourni; } + + public String getNumero() { return numero; } + public void setNumero(String numero) { this.numero = numero; } + + public Boolean getChoisi() { return choisi; } + public void setChoisi(Boolean choisi) { this.choisi = choisi; } } diff --git a/as-talange-core/src/main/java/com/astalange/core/entity/Educateur.java b/as-talange-core/src/main/java/com/astalange/core/entity/Educateur.java new file mode 100644 index 0000000..f9300aa --- /dev/null +++ b/as-talange-core/src/main/java/com/astalange/core/entity/Educateur.java @@ -0,0 +1,48 @@ +package com.astalange.core.entity; + +import jakarta.persistence.*; + +@Entity +@Table(name = "educateur") +public class Educateur { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Column(nullable = false, length = 100) + private String nom; + + @Column(nullable = false, length = 100) + private String prenom; + + @Column(length = 100) + private String email; + + @Column(length = 20) + private String telephone; + + @ManyToOne + @JoinColumn(name = "categorie_id") + private Categorie categorie; + + // 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 String getPrenom() { return prenom; } + public void setPrenom(String prenom) { this.prenom = prenom; } + + public String getEmail() { return email; } + public void setEmail(String email) { this.email = email; } + + public String getTelephone() { return telephone; } + public void setTelephone(String telephone) { this.telephone = telephone; } + + public Categorie getCategorie() { return categorie; } + public void setCategorie(Categorie categorie) { this.categorie = categorie; } +} 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 e9d03be..359ce46 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 @@ -1,6 +1,7 @@ package com.astalange.core.entity; import jakarta.persistence.*; +import java.math.BigDecimal; @Entity @Table(name = "equipement") @@ -19,6 +20,9 @@ public class Equipement { @Column(nullable = false) private Boolean obligatoire = false; + @Column(name = "prix_contribution", nullable = false, precision = 10, scale = 2) + private BigDecimal prixContribution = BigDecimal.ZERO; + // Getters and Setters public Long getId() { return id; } @@ -32,4 +36,7 @@ public class Equipement { public Boolean getObligatoire() { return obligatoire; } public void setObligatoire(Boolean obligatoire) { this.obligatoire = obligatoire; } + + public BigDecimal getPrixContribution() { return prixContribution; } + public void setPrixContribution(BigDecimal prixContribution) { this.prixContribution = prixContribution; } } 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 699c869..70018b4 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 @@ -36,9 +36,9 @@ public class Licence { @OneToMany(mappedBy = "licence", cascade = CascadeType.ALL, orphanRemoval = true) private List dotations = new ArrayList<>(); - // Logic for Reste A Payer + // Logic for Global Total Price @Transient - public BigDecimal getResteAPayer() { + public BigDecimal getPrixTotal() { if (categorie == null) return BigDecimal.ZERO; BigDecimal prixTotal = (adherent != null && adherent.isResidentTalange()) @@ -47,6 +47,25 @@ public class Licence { if (prixTotal == null) prixTotal = BigDecimal.ZERO; + if (dotations != null) { + for (Dotation dot : dotations) { + if (dot.getChoisi() && dot.getEquipement() != null) { + BigDecimal price = dot.getEquipement().getPrixContribution(); + if (price != null) { + prixTotal = prixTotal.add(price); + } + } + } + } + + return prixTotal; + } + + // Logic for Reste A Payer + @Transient + public BigDecimal getResteAPayer() { + BigDecimal prixTotal = getPrixTotal(); + if (paiements == null || paiements.isEmpty()) { return prixTotal; } diff --git a/as-talange-core/src/main/resources/db/migration/V6__add_dotation_numero_and_educateur.sql b/as-talange-core/src/main/resources/db/migration/V6__add_dotation_numero_and_educateur.sql new file mode 100644 index 0000000..2dc4da8 --- /dev/null +++ b/as-talange-core/src/main/resources/db/migration/V6__add_dotation_numero_and_educateur.sql @@ -0,0 +1,11 @@ +ALTER TABLE dotation ADD COLUMN IF NOT EXISTS numero VARCHAR(10); + +CREATE TABLE IF NOT EXISTS educateur ( + id BIGSERIAL PRIMARY KEY, + nom VARCHAR(100) NOT NULL, + prenom VARCHAR(100) NOT NULL, + email VARCHAR(100), + telephone VARCHAR(20), + categorie_id BIGINT, + CONSTRAINT fk_educateur_categorie FOREIGN KEY (categorie_id) REFERENCES categorie(id) ON DELETE SET NULL +); diff --git a/as-talange-core/src/main/resources/db/migration/V7__add_equipement_price_and_dotation_choisi.sql b/as-talange-core/src/main/resources/db/migration/V7__add_equipement_price_and_dotation_choisi.sql new file mode 100644 index 0000000..649f323 --- /dev/null +++ b/as-talange-core/src/main/resources/db/migration/V7__add_equipement_price_and_dotation_choisi.sql @@ -0,0 +1,14 @@ +-- Ajouter la colonne prix_contribution à la table equipement (avec valeur par défaut 0) +ALTER TABLE equipement ADD COLUMN IF NOT EXISTS prix_contribution DECIMAL(10,2) NOT NULL DEFAULT 0.00; + +-- Ajouter la colonne choisi à la table dotation (avec valeur par défaut false) +ALTER TABLE dotation ADD COLUMN IF NOT EXISTS choisi BOOLEAN NOT NULL DEFAULT FALSE; + +-- Mettre choisi à true pour tous les équipements obligatoires existants +UPDATE dotation d +SET choisi = TRUE +FROM equipement e +WHERE d.equipement_id = e.id AND e.obligatoire = TRUE; + +-- Mettre à jour le prix de contribution du Survêtement à 30.00 € à titre d'exemple +UPDATE equipement SET prix_contribution = 30.00 WHERE nom = 'Survêtement'; 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 index b4d103f..e3742e6 100644 --- 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 @@ -3,10 +3,14 @@ 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.transaction.annotation.Transactional; 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; +import jakarta.servlet.http.HttpServletRequest; + @Controller public class DotationController { @@ -22,17 +26,61 @@ public class DotationController { @RequestParam Long adherentId, @RequestParam(required = false, defaultValue = "") String taille, @RequestParam(required = false, defaultValue = "") String flocage, - @RequestParam(required = false) Boolean fourni) { + @RequestParam(required = false, defaultValue = "") String numero, + @RequestParam(required = false) Boolean fourni, + @RequestParam(required = false) Boolean choisi) { Dotation dotation = dotationRepository.findById(id) .orElseThrow(() -> new IllegalArgumentException("Invalid Dotation ID: " + id)); dotation.setTaille(taille); dotation.setFlocage(flocage); + dotation.setNumero(numero); dotation.setFourni(fourni != null && fourni); + + if (dotation.getEquipement().getObligatoire()) { + dotation.setChoisi(true); + } else { + dotation.setChoisi(choisi != null && choisi); + } dotationRepository.save(dotation); return "redirect:/adherents/" + adherentId + "/edit"; } + + @Transactional + @PostMapping("/dotations/bulk") + public String bulkUpdateDotations( + @RequestParam Long adherentId, + @RequestParam("dotationIds") List dotationIds, + HttpServletRequest request) { + + for (Long id : dotationIds) { + Dotation dotation = dotationRepository.findById(id) + .orElseThrow(() -> new IllegalArgumentException("Invalid Dotation ID: " + id)); + + String taille = request.getParameter("taille_" + id); + String numero = request.getParameter("numero_" + id); + String flocage = request.getParameter("flocage_" + id); + String choisiParam = request.getParameter("choisi_" + id); + String fourniParam = request.getParameter("fourni_" + id); + + if (taille != null) dotation.setTaille(taille); + if (numero != null) dotation.setNumero(numero); + if (flocage != null) dotation.setFlocage(flocage); + + if (dotation.getEquipement().getObligatoire()) { + dotation.setChoisi(true); + } else { + dotation.setChoisi(choisiParam != null); + } + + dotation.setFourni(fourniParam != null); + + dotationRepository.save(dotation); + } + + return "redirect:/adherents/" + adherentId + "/edit"; + } } diff --git a/as-talange-web/src/main/java/com/astalange/web/controller/HomeController.java b/as-talange-web/src/main/java/com/astalange/web/controller/HomeController.java index 0223e85..7ba7ac9 100644 --- a/as-talange-web/src/main/java/com/astalange/web/controller/HomeController.java +++ b/as-talange-web/src/main/java/com/astalange/web/controller/HomeController.java @@ -41,12 +41,7 @@ public class HomeController { List allLicences = licenceRepository.findAll(); BigDecimal totalAttendu = allLicences.stream() - .map(lic -> { - if (lic.getCategorie() == null) return BigDecimal.ZERO; - return (lic.getAdherent() != null && lic.getAdherent().isResidentTalange()) - ? lic.getCategorie().getTarifBase() - : lic.getCategorie().getTarifExterieur(); - }) + .map(com.astalange.core.entity.Licence::getPrixTotal) .reduce(BigDecimal.ZERO, BigDecimal::add); BigDecimal resteARecouvrer = totalAttendu.subtract(totalEncaisse); 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 c0a5d96..4964f3a 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 @@ -73,8 +73,10 @@ public class LicenceController { dotation.setLicence(licence); dotation.setEquipement(eq); dotation.setTaille(""); - dotation.setFlocage(""); + dotation.setFlocage(adherent.getNom().toUpperCase() + " " + adherent.getPrenom()); + dotation.setNumero(""); dotation.setFourni(false); + dotation.setChoisi(eq.getObligatoire()); dotationRepository.save(dotation); } 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 2ed1cb0..07d37e5 100644 --- a/as-talange-web/src/main/resources/templates/adherents/form.html +++ b/as-talange-web/src/main/resources/templates/adherents/form.html @@ -156,32 +156,39 @@ Catégorie N° Licence État + Tarif Global Reste à Payer Actions - Aucune licence enregistrée. + Aucune licence enregistrée. 2024-2025 - U15 + + U15 + 100.00 € (Catégorie) + - Brouillon - 100.00 € + 130.00 € + 30.00 € - +
Historique des paiements
@@ -195,48 +202,74 @@ - -
Dotations Équipements
-
Aucune dotation pour cette licence.
-
-
-
-
- Maillot - Obligatoire + +
+ + +
+
Dotations Équipements
+ +
+ +
Aucune dotation pour cette licence.
+ +
+
+ + +
+
+ Maillot + Obligatoire +
+
Description
-
Description
-
- - - - -
-
- - + + +
+ +
+ +
+ +
+
+ + +
+
+ + +
-
+
+ +
-
- - -
- +
-
+ @@ -257,7 +290,7 @@
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 index bdb5f1c..beef97a 100644 --- a/as-talange-web/src/main/resources/templates/parametrage/equipements_form.html +++ b/as-talange-web/src/main/resources/templates/parametrage/equipements_form.html @@ -44,6 +44,12 @@
+
+ + +

Si l'équipement est facultatif, ce montant sera ajouté au tarif global de la licence s'il est commandé.

+
+