diff --git a/as-talange-core/src/main/java/com/astalange/core/entity/Adherent.java b/as-talange-core/src/main/java/com/astalange/core/entity/Adherent.java index 1900279..88dd446 100644 --- a/as-talange-core/src/main/java/com/astalange/core/entity/Adherent.java +++ b/as-talange-core/src/main/java/com/astalange/core/entity/Adherent.java @@ -23,15 +23,18 @@ public class Adherent { @org.springframework.format.annotation.DateTimeFormat(iso = org.springframework.format.annotation.DateTimeFormat.ISO.DATE) private LocalDate dateNaissance; - @Column(length = 20) - private String telephone; + @Column(name = "lieu_naissance_ville", nullable = false, length = 100) + private String lieuNaissanceVille; - @Column(length = 100) + @Column(name = "lieu_naissance_pays", nullable = false, length = 100) + private String lieuNaissancePays; + + @Column(nullable = false, length = 100) + private String nationalite; + + @Column(nullable = false, length = 100) private String email; - @Column(columnDefinition = "TEXT") - private String adresse; - @Column(name = "representant_legal", length = 150) private String representantLegal; @@ -63,15 +66,18 @@ public class Adherent { public LocalDate getDateNaissance() { return dateNaissance; } public void setDateNaissance(LocalDate dateNaissance) { this.dateNaissance = dateNaissance; } - public String getTelephone() { return telephone; } - public void setTelephone(String telephone) { this.telephone = telephone; } + public String getLieuNaissanceVille() { return lieuNaissanceVille; } + public void setLieuNaissanceVille(String lieuNaissanceVille) { this.lieuNaissanceVille = lieuNaissanceVille; } + + public String getLieuNaissancePays() { return lieuNaissancePays; } + public void setLieuNaissancePays(String lieuNaissancePays) { this.lieuNaissancePays = lieuNaissancePays; } + + public String getNationalite() { return nationalite; } + public void setNationalite(String nationalite) { this.nationalite = nationalite; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } - public String getAdresse() { return adresse; } - public void setAdresse(String adresse) { this.adresse = adresse; } - public String getRepresentantLegal() { return representantLegal; } public void setRepresentantLegal(String representantLegal) { this.representantLegal = representantLegal; } 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 896b707..5832694 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 @@ -6,14 +6,16 @@ import java.util.ArrayList; import java.util.List; @Entity -@Table(name = "categorie") +@Table(name = "categorie", uniqueConstraints = { + @UniqueConstraint(columnNames = {"nom", "saison_id"}) +}) public class Categorie { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; - @Column(nullable = false, unique = true, length = 20) + @Column(nullable = false, length = 20) private String nom; @Column(name = "annee_min") 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 69cd95d..5d21da8 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 @@ -35,6 +35,12 @@ public class Licence { @Column(name = "numero_licence", length = 50) private String numeroLicence; + @Column(name = "type_demande", length = 50) + private String typeDemande; + + @Column(name = "type_licence", length = 50) + private String typeLicence; + @OneToMany(mappedBy = "licence", cascade = CascadeType.ALL, orphanRemoval = true) private List paiements = new ArrayList<>(); @@ -113,14 +119,20 @@ public class Licence { public String getEtat() { return etat; } public void setEtat(String etat) { this.etat = etat; } + public String getNumeroLicence() { return numeroLicence; } + public void setNumeroLicence(String numeroLicence) { this.numeroLicence = numeroLicence; } + + public String getTypeDemande() { return typeDemande; } + public void setTypeDemande(String typeDemande) { this.typeDemande = typeDemande; } + + public String getTypeLicence() { return typeLicence; } + public void setTypeLicence(String typeLicence) { this.typeLicence = typeLicence; } + 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; } public void addPaiement(Paiement paiement) { paiements.add(paiement); diff --git a/as-talange-core/src/main/java/com/astalange/core/entity/PreInscription.java b/as-talange-core/src/main/java/com/astalange/core/entity/PreInscription.java index 2ab91e6..6805be0 100644 --- a/as-talange-core/src/main/java/com/astalange/core/entity/PreInscription.java +++ b/as-talange-core/src/main/java/com/astalange/core/entity/PreInscription.java @@ -21,15 +21,18 @@ public class PreInscription { @Column(name = "date_naissance", nullable = false) private LocalDate dateNaissance; - @Column(length = 20) - private String telephone; + @Column(name = "lieu_naissance_ville", nullable = false, length = 100) + private String lieuNaissanceVille; - @Column(length = 150) + @Column(name = "lieu_naissance_pays", nullable = false, length = 100) + private String lieuNaissancePays; + + @Column(nullable = false, length = 100) + private String nationalite; + + @Column(nullable = false, length = 150) private String email; - @Column(columnDefinition = "TEXT") - private String adresse; - @Column(name = "representant_legal", length = 150) private String representantLegal; @@ -56,15 +59,18 @@ public class PreInscription { public LocalDate getDateNaissance() { return dateNaissance; } public void setDateNaissance(LocalDate dateNaissance) { this.dateNaissance = dateNaissance; } - public String getTelephone() { return telephone; } - public void setTelephone(String telephone) { this.telephone = telephone; } + public String getLieuNaissanceVille() { return lieuNaissanceVille; } + public void setLieuNaissanceVille(String lieuNaissanceVille) { this.lieuNaissanceVille = lieuNaissanceVille; } + + public String getLieuNaissancePays() { return lieuNaissancePays; } + public void setLieuNaissancePays(String lieuNaissancePays) { this.lieuNaissancePays = lieuNaissancePays; } + + public String getNationalite() { return nationalite; } + public void setNationalite(String nationalite) { this.nationalite = nationalite; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } - public String getAdresse() { return adresse; } - public void setAdresse(String adresse) { this.adresse = adresse; } - public String getRepresentantLegal() { return representantLegal; } public void setRepresentantLegal(String representantLegal) { this.representantLegal = representantLegal; } diff --git a/as-talange-core/src/main/java/com/astalange/core/service/PreInscriptionService.java b/as-talange-core/src/main/java/com/astalange/core/service/PreInscriptionService.java index 458308d..6b1cda1 100644 --- a/as-talange-core/src/main/java/com/astalange/core/service/PreInscriptionService.java +++ b/as-talange-core/src/main/java/com/astalange/core/service/PreInscriptionService.java @@ -38,9 +38,10 @@ public class PreInscriptionService { adherent.setNom(pre.getNom().toUpperCase()); adherent.setPrenom(pre.getPrenom()); adherent.setDateNaissance(pre.getDateNaissance()); - adherent.setTelephone(pre.getTelephone()); + adherent.setLieuNaissanceVille(pre.getLieuNaissanceVille()); + adherent.setLieuNaissancePays(pre.getLieuNaissancePays()); + adherent.setNationalite(pre.getNationalite()); adherent.setEmail(pre.getEmail()); - adherent.setAdresse(pre.getAdresse()); adherent.setRepresentantLegal(pre.getRepresentantLegal()); // Par défaut adherent.setSexe("MASCULIN"); diff --git a/as-talange-core/src/main/resources/db/migration/V18__fix_categorie_unique_constraint.sql b/as-talange-core/src/main/resources/db/migration/V18__fix_categorie_unique_constraint.sql new file mode 100644 index 0000000..9cfb927 --- /dev/null +++ b/as-talange-core/src/main/resources/db/migration/V18__fix_categorie_unique_constraint.sql @@ -0,0 +1,5 @@ +-- Drop the global unique constraint on 'nom' +ALTER TABLE categorie DROP CONSTRAINT IF EXISTS categorie_nom_key; + +-- Add a composite unique constraint for 'nom' and 'saison_id' +ALTER TABLE categorie ADD CONSTRAINT categorie_nom_saison_id_key UNIQUE (nom, saison_id); diff --git a/as-talange-core/src/main/resources/db/migration/V19__add_lieu_naissance_et_nationalite.sql b/as-talange-core/src/main/resources/db/migration/V19__add_lieu_naissance_et_nationalite.sql new file mode 100644 index 0000000..2331f50 --- /dev/null +++ b/as-talange-core/src/main/resources/db/migration/V19__add_lieu_naissance_et_nationalite.sql @@ -0,0 +1,11 @@ +-- adherent modifications +ALTER TABLE adherent DROP COLUMN IF EXISTS adresse; +ALTER TABLE adherent ADD COLUMN lieu_naissance_ville VARCHAR(100); +ALTER TABLE adherent ADD COLUMN lieu_naissance_pays VARCHAR(100); +ALTER TABLE adherent ADD COLUMN nationalite VARCHAR(100); + +-- pre_inscription modifications +ALTER TABLE pre_inscription DROP COLUMN IF EXISTS adresse; +ALTER TABLE pre_inscription ADD COLUMN lieu_naissance_ville VARCHAR(100); +ALTER TABLE pre_inscription ADD COLUMN lieu_naissance_pays VARCHAR(100); +ALTER TABLE pre_inscription ADD COLUMN nationalite VARCHAR(100); diff --git a/as-talange-core/src/main/resources/db/migration/V20__add_licence_types.sql b/as-talange-core/src/main/resources/db/migration/V20__add_licence_types.sql new file mode 100644 index 0000000..c71d5a1 --- /dev/null +++ b/as-talange-core/src/main/resources/db/migration/V20__add_licence_types.sql @@ -0,0 +1,2 @@ +ALTER TABLE licence ADD COLUMN type_demande VARCHAR(50); +ALTER TABLE licence ADD COLUMN type_licence VARCHAR(50); diff --git a/as-talange-core/src/main/resources/db/migration/V21__make_naissance_fields_required.sql b/as-talange-core/src/main/resources/db/migration/V21__make_naissance_fields_required.sql new file mode 100644 index 0000000..c2f6219 --- /dev/null +++ b/as-talange-core/src/main/resources/db/migration/V21__make_naissance_fields_required.sql @@ -0,0 +1,18 @@ +-- Default values for existing records in adherent +UPDATE adherent SET lieu_naissance_ville = 'Non renseigné' WHERE lieu_naissance_ville IS NULL; +UPDATE adherent SET lieu_naissance_pays = 'France' WHERE lieu_naissance_pays IS NULL; +UPDATE adherent SET nationalite = 'Française' WHERE nationalite IS NULL; + +-- Default values for existing records in pre_inscription +UPDATE pre_inscription SET lieu_naissance_ville = 'Non renseigné' WHERE lieu_naissance_ville IS NULL; +UPDATE pre_inscription SET lieu_naissance_pays = 'France' WHERE lieu_naissance_pays IS NULL; +UPDATE pre_inscription SET nationalite = 'Française' WHERE nationalite IS NULL; + +-- Now make them NOT NULL +ALTER TABLE adherent ALTER COLUMN lieu_naissance_ville SET NOT NULL; +ALTER TABLE adherent ALTER COLUMN lieu_naissance_pays SET NOT NULL; +ALTER TABLE adherent ALTER COLUMN nationalite SET NOT NULL; + +ALTER TABLE pre_inscription ALTER COLUMN lieu_naissance_ville SET NOT NULL; +ALTER TABLE pre_inscription ALTER COLUMN lieu_naissance_pays SET NOT NULL; +ALTER TABLE pre_inscription ALTER COLUMN nationalite SET NOT NULL; diff --git a/as-talange-core/src/main/resources/db/migration/V22__remove_telephone_require_email.sql b/as-talange-core/src/main/resources/db/migration/V22__remove_telephone_require_email.sql new file mode 100644 index 0000000..0f7182d --- /dev/null +++ b/as-talange-core/src/main/resources/db/migration/V22__remove_telephone_require_email.sql @@ -0,0 +1,11 @@ +-- Provide fallback email if null +UPDATE adherent SET email = 'nonrenseigne@example.com' WHERE email IS NULL OR email = ''; +UPDATE pre_inscription SET email = 'nonrenseigne@example.com' WHERE email IS NULL OR email = ''; + +-- Make email NOT NULL +ALTER TABLE adherent ALTER COLUMN email SET NOT NULL; +ALTER TABLE pre_inscription ALTER COLUMN email SET NOT NULL; + +-- Remove telephone +ALTER TABLE adherent DROP COLUMN IF EXISTS telephone; +ALTER TABLE pre_inscription DROP COLUMN IF EXISTS telephone; 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 4672cdc..6c21d84 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 @@ -45,7 +45,6 @@ public class AdherentController { @org.springframework.web.bind.annotation.RequestParam(required = false) String categorie, @org.springframework.web.bind.annotation.RequestParam(required = false) String licence, @org.springframework.web.bind.annotation.RequestParam(required = false) String email, - @org.springframework.web.bind.annotation.RequestParam(required = false) String telephone, @org.springframework.web.bind.annotation.RequestParam(required = false) String paiement, @org.springframework.web.bind.annotation.RequestParam(defaultValue = "0") int page, @org.springframework.web.bind.annotation.RequestParam(defaultValue = "20") int size, @@ -97,11 +96,6 @@ public class AdherentController { adherents = adherents.stream().filter(a -> a.getEmail() != null && a.getEmail().toLowerCase().contains(e)).collect(java.util.stream.Collectors.toList()); model.addAttribute("emailFilter", email.trim()); } - if (telephone != null && !telephone.trim().isEmpty()) { - String t = telephone.trim().toLowerCase(); - adherents = adherents.stream().filter(a -> a.getTelephone() != null && a.getTelephone().toLowerCase().contains(t)).collect(java.util.stream.Collectors.toList()); - model.addAttribute("telephoneFilter", telephone.trim()); - } if (paiement != null && !paiement.trim().isEmpty()) { adherents = adherents.stream().filter(a -> { String statut = a.getStatutPaiement(); @@ -201,9 +195,10 @@ public class AdherentController { existing.setNom(adherent.getNom()); existing.setPrenom(adherent.getPrenom()); existing.setDateNaissance(adherent.getDateNaissance()); - existing.setTelephone(adherent.getTelephone()); + existing.setLieuNaissanceVille(adherent.getLieuNaissanceVille()); + existing.setLieuNaissancePays(adherent.getLieuNaissancePays()); + existing.setNationalite(adherent.getNationalite()); existing.setEmail(adherent.getEmail()); - existing.setAdresse(adherent.getAdresse()); existing.setRepresentantLegal(adherent.getRepresentantLegal()); existing.setResidentTalange(adherent.isResidentTalange()); existing.setSexe(adherent.getSexe()); 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 9680f2f..fa1f215 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 @@ -44,6 +44,8 @@ public class LicenceController { @RequestParam Long categorieId, @RequestParam String etat, @RequestParam(required = false) String numeroLicence, + @RequestParam(required = false) String typeDemande, + @RequestParam(required = false) String typeLicence, @RequestParam(required = false) Long equipeId) { Adherent adherent = adherentRepository.findById(id) @@ -66,6 +68,8 @@ public class LicenceController { licence.setSaison(saisonActive); licence.setEtat(etat); licence.setNumeroLicence(numeroLicence); + licence.setTypeDemande(typeDemande); + licence.setTypeLicence(typeLicence); if (equipeId != null) { Equipe equipe = equipeRepository.findById(equipeId) @@ -101,6 +105,8 @@ public class LicenceController { @RequestParam Long categorieId, @RequestParam String etat, @RequestParam(required = false) String numeroLicence, + @RequestParam(required = false) String typeDemande, + @RequestParam(required = false) String typeLicence, @RequestParam(required = false) Long equipeId) { Licence licence = licenceRepository.findById(licenceId) @@ -112,6 +118,8 @@ public class LicenceController { licence.setCategorie(categorie); licence.setEtat(etat); licence.setNumeroLicence(numeroLicence); + licence.setTypeDemande(typeDemande); + licence.setTypeLicence(typeLicence); if (equipeId != null) { Equipe equipe = equipeRepository.findById(equipeId) 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 2a13e7b..d951954 100644 --- a/as-talange-web/src/main/resources/templates/adherents/form.html +++ b/as-talange-web/src/main/resources/templates/adherents/form.html @@ -64,16 +64,38 @@

- +
- - Ville de naissance * + -

+ th:classappend="${#fields.hasErrors('lieuNaissanceVille')} ? 'border-red-500' : ''"> +

+
+ +
+ + +

+
+ + +
+ + +

+
+
+ + +
- -
- - -

-
+
Annuler @@ -150,11 +157,13 @@
- +
+
+ @@ -164,7 +173,7 @@ - + U15100.00 € (Catégorie) + -
Saison CatégorieDemande / Type N° Licence État Tarif Global
Aucune licence enregistrée.Aucune licence enregistrée.
+
Nouvelle
+
Libre
+
- Modifier
+
Historique des paiements
@@ -344,8 +359,8 @@ -
-
+
+ @@ -382,6 +397,27 @@ +
+ + +
+
+ + +
@@ -468,7 +504,7 @@