package dev.lions.unionflow.server.entity; import jakarta.persistence.*; import jakarta.validation.constraints.*; import java.math.BigDecimal; import java.time.LocalDate; import lombok.*; /** * Paramètres de cotisation configurés par le manager de chaque organisation. * *

* Le manager peut définir : *

* *

* Table : {@code parametres_cotisation_organisation} */ @Entity @Table(name = "parametres_cotisation_organisation", indexes = { @Index(name = "idx_param_cot_org", columnList = "organisation_id", unique = true) }) @Data @NoArgsConstructor @AllArgsConstructor @Builder @EqualsAndHashCode(callSuper = true) public class ParametresCotisationOrganisation extends BaseEntity { @NotNull @OneToOne(fetch = FetchType.LAZY) @JoinColumn(name = "organisation_id", nullable = false, unique = true) private Organisation organisation; @Builder.Default @DecimalMin("0.00") @Digits(integer = 10, fraction = 2) @Column(name = "montant_cotisation_mensuelle", precision = 12, scale = 2) private BigDecimal montantCotisationMensuelle = BigDecimal.ZERO; @Builder.Default @DecimalMin("0.00") @Digits(integer = 10, fraction = 2) @Column(name = "montant_cotisation_annuelle", precision = 12, scale = 2) private BigDecimal montantCotisationAnnuelle = BigDecimal.ZERO; @Column(name = "devise", nullable = false, length = 3) private String devise; /** * Date de référence pour le calcul des membres «à jour». * Toutes les échéances depuis cette date doivent être payées. * Configurable par le manager. */ @Column(name = "date_debut_calcul_ajour") private LocalDate dateDebutCalculAjour; /** * Nombre de jours de retard avant passage automatique du statut membre → * INACTIF. * Défaut : 30 jours. */ @Builder.Default @Min(1) @Column(name = "delai_retard_avant_inactif_jours", nullable = false) private Integer delaiRetardAvantInactifJours = 30; @Builder.Default @Column(name = "cotisation_obligatoire", nullable = false) private Boolean cotisationObligatoire = true; /** * Active la génération automatique mensuelle des cotisations pour cette organisation. * Quand {@code true}, un job planifié crée automatiquement une cotisation par membre actif * le 1er de chaque mois, en utilisant les barèmes par rôle ou le montant par défaut. */ @Builder.Default @Column(name = "generation_automatique_activee", nullable = false) private Boolean generationAutomatiqueActivee = false; // ── Méthodes métier ──────────────────────────────────────────────────────── /** * Vérifie si la date de référence pour les impayés est définie. * Sans cette date, aucun calcul d'ancienneté des impayés n'est possible. */ public boolean isCalculAjourActive() { return dateDebutCalculAjour != null; } }