155 lines
4.6 KiB
Java
155 lines
4.6 KiB
Java
package dev.lions.unionflow.server.entity;
|
|
|
|
import dev.lions.unionflow.server.api.enums.adresse.TypeAdresse;
|
|
import jakarta.persistence.*;
|
|
import jakarta.validation.constraints.*;
|
|
import java.math.BigDecimal;
|
|
import java.util.UUID;
|
|
import lombok.AllArgsConstructor;
|
|
import lombok.Builder;
|
|
import lombok.Data;
|
|
import lombok.EqualsAndHashCode;
|
|
import lombok.NoArgsConstructor;
|
|
|
|
/**
|
|
* Entité Adresse pour la gestion des adresses des organisations, membres et événements
|
|
*
|
|
* @author UnionFlow Team
|
|
* @version 3.0
|
|
* @since 2025-01-29
|
|
*/
|
|
@Entity
|
|
@Table(
|
|
name = "adresses",
|
|
indexes = {
|
|
@Index(name = "idx_adresse_ville", columnList = "ville"),
|
|
@Index(name = "idx_adresse_pays", columnList = "pays"),
|
|
@Index(name = "idx_adresse_type", columnList = "type_adresse"),
|
|
@Index(name = "idx_adresse_organisation", columnList = "organisation_id"),
|
|
@Index(name = "idx_adresse_membre", columnList = "membre_id"),
|
|
@Index(name = "idx_adresse_evenement", columnList = "evenement_id")
|
|
})
|
|
@Data
|
|
@NoArgsConstructor
|
|
@AllArgsConstructor
|
|
@Builder
|
|
@EqualsAndHashCode(callSuper = true)
|
|
public class Adresse extends BaseEntity {
|
|
|
|
/** Type d'adresse */
|
|
@Enumerated(EnumType.STRING)
|
|
@Column(name = "type_adresse", nullable = false, length = 50)
|
|
private TypeAdresse typeAdresse;
|
|
|
|
/** Adresse complète */
|
|
@Column(name = "adresse", length = 500)
|
|
private String adresse;
|
|
|
|
/** Complément d'adresse */
|
|
@Column(name = "complement_adresse", length = 200)
|
|
private String complementAdresse;
|
|
|
|
/** Code postal */
|
|
@Column(name = "code_postal", length = 20)
|
|
private String codePostal;
|
|
|
|
/** Ville */
|
|
@Column(name = "ville", length = 100)
|
|
private String ville;
|
|
|
|
/** Région */
|
|
@Column(name = "region", length = 100)
|
|
private String region;
|
|
|
|
/** Pays */
|
|
@Column(name = "pays", length = 100)
|
|
private String pays;
|
|
|
|
/** Coordonnées géographiques - Latitude */
|
|
@DecimalMin(value = "-90.0", message = "La latitude doit être comprise entre -90 et 90")
|
|
@DecimalMax(value = "90.0", message = "La latitude doit être comprise entre -90 et 90")
|
|
@Digits(integer = 3, fraction = 6)
|
|
@Column(name = "latitude", precision = 9, scale = 6)
|
|
private BigDecimal latitude;
|
|
|
|
/** Coordonnées géographiques - Longitude */
|
|
@DecimalMin(value = "-180.0", message = "La longitude doit être comprise entre -180 et 180")
|
|
@DecimalMax(value = "180.0", message = "La longitude doit être comprise entre -180 et 180")
|
|
@Digits(integer = 3, fraction = 6)
|
|
@Column(name = "longitude", precision = 9, scale = 6)
|
|
private BigDecimal longitude;
|
|
|
|
/** Adresse principale (une seule par entité) */
|
|
@Builder.Default
|
|
@Column(name = "principale", nullable = false)
|
|
private Boolean principale = false;
|
|
|
|
/** Libellé personnalisé */
|
|
@Column(name = "libelle", length = 100)
|
|
private String libelle;
|
|
|
|
/** Notes et commentaires */
|
|
@Column(name = "notes", length = 500)
|
|
private String notes;
|
|
|
|
// Relations
|
|
@ManyToOne(fetch = FetchType.LAZY)
|
|
@JoinColumn(name = "organisation_id")
|
|
private Organisation organisation;
|
|
|
|
@ManyToOne(fetch = FetchType.LAZY)
|
|
@JoinColumn(name = "membre_id")
|
|
private Membre membre;
|
|
|
|
@ManyToOne(fetch = FetchType.LAZY)
|
|
@JoinColumn(name = "evenement_id")
|
|
private Evenement evenement;
|
|
|
|
/** Méthode métier pour obtenir l'adresse complète formatée */
|
|
public String getAdresseComplete() {
|
|
StringBuilder sb = new StringBuilder();
|
|
if (adresse != null && !adresse.isEmpty()) {
|
|
sb.append(adresse);
|
|
}
|
|
if (complementAdresse != null && !complementAdresse.isEmpty()) {
|
|
if (sb.length() > 0) sb.append(", ");
|
|
sb.append(complementAdresse);
|
|
}
|
|
if (codePostal != null && !codePostal.isEmpty()) {
|
|
if (sb.length() > 0) sb.append(", ");
|
|
sb.append(codePostal);
|
|
}
|
|
if (ville != null && !ville.isEmpty()) {
|
|
if (sb.length() > 0) sb.append(" ");
|
|
sb.append(ville);
|
|
}
|
|
if (region != null && !region.isEmpty()) {
|
|
if (sb.length() > 0) sb.append(", ");
|
|
sb.append(region);
|
|
}
|
|
if (pays != null && !pays.isEmpty()) {
|
|
if (sb.length() > 0) sb.append(", ");
|
|
sb.append(pays);
|
|
}
|
|
return sb.toString();
|
|
}
|
|
|
|
/** Méthode métier pour vérifier si l'adresse a des coordonnées GPS */
|
|
public boolean hasCoordinates() {
|
|
return latitude != null && longitude != null;
|
|
}
|
|
|
|
/** Callback JPA avant la persistance */
|
|
@PrePersist
|
|
protected void onCreate() {
|
|
super.onCreate(); // Appelle le onCreate de BaseEntity
|
|
if (typeAdresse == null) {
|
|
typeAdresse = dev.lions.unionflow.server.api.enums.adresse.TypeAdresse.AUTRE;
|
|
}
|
|
if (principale == null) {
|
|
principale = false;
|
|
}
|
|
}
|
|
}
|
|
|