package dev.lions.unionflow.server.entity; import dev.lions.unionflow.server.api.enums.ayantdroit.LienParente; import dev.lions.unionflow.server.api.enums.ayantdroit.StatutAyantDroit; import jakarta.persistence.*; import jakarta.validation.constraints.*; import java.time.LocalDate; import java.math.BigDecimal; import lombok.*; /** * Ayant droit d'un membre dans une mutuelle de santé. * *

* Permet la gestion des bénéficiaires (conjoint, enfants, parents) pour * les conventions avec les centres de santé partenaires et les plafonds * annuels. * *

* Table : {@code ayants_droit} */ @Entity @Table(name = "ayants_droit", indexes = { @Index(name = "idx_ad_membre_org", columnList = "membre_organisation_id"), @Index(name = "idx_ad_couverture", columnList = "date_debut_couverture, date_fin_couverture") }) @Data @NoArgsConstructor @AllArgsConstructor @Builder @EqualsAndHashCode(callSuper = true) public class AyantDroit extends BaseEntity { @NotNull @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "membre_organisation_id", nullable = false) private MembreOrganisation membreOrganisation; @NotBlank @Column(name = "prenom", nullable = false, length = 100) private String prenom; @NotBlank @Column(name = "nom", nullable = false, length = 100) private String nom; @Column(name = "date_naissance") private LocalDate dateNaissance; @Enumerated(EnumType.STRING) @NotNull @Column(name = "lien_parente", nullable = false, length = 20) private LienParente lienParente; /** Numéro attribué pour les conventions santé avec les centres partenaires */ @Column(name = "numero_beneficiaire", length = 50) private String numeroBeneficiaire; @Column(name = "date_debut_couverture") private LocalDate dateDebutCouverture; /** NULL = couverture ouverte */ @Column(name = "date_fin_couverture") private LocalDate dateFinCouverture; @Column(name = "sexe", length = 20) private String sexe; @Column(name = "piece_identite", length = 100) private String pieceIdentite; @Column(name = "pourcentage_couverture", precision = 5, scale = 2) private BigDecimal pourcentageCouvertureSante; @NotNull @Enumerated(EnumType.STRING) @Column(name = "statut", nullable = false, length = 50) @Builder.Default private StatutAyantDroit statut = StatutAyantDroit.EN_ATTENTE; // ── Méthodes métier ──────────────────────────────────────────────────────── public boolean isCouvertAujourdhui() { LocalDate today = LocalDate.now(); if (dateDebutCouverture != null && today.isBefore(dateDebutCouverture)) return false; if (dateFinCouverture != null && today.isAfter(dateFinCouverture)) return false; return Boolean.TRUE.equals(getActif()); } public String getNomComplet() { return prenom + " " + nom; } }