124 lines
3.5 KiB
Java
124 lines
3.5 KiB
Java
package dev.lions.unionflow.server.entity;
|
|
|
|
import jakarta.persistence.*;
|
|
import jakarta.validation.constraints.NotNull;
|
|
import java.time.LocalDateTime;
|
|
import lombok.AllArgsConstructor;
|
|
import lombok.Builder;
|
|
import lombok.Data;
|
|
import lombok.EqualsAndHashCode;
|
|
import lombok.NoArgsConstructor;
|
|
|
|
/**
|
|
* Entité Notification pour la gestion des notifications
|
|
*
|
|
* @author UnionFlow Team
|
|
* @version 3.0
|
|
* @since 2025-01-29
|
|
*/
|
|
@Entity
|
|
@Table(name = "notifications", indexes = {
|
|
@Index(name = "idx_notification_type", columnList = "type_notification"),
|
|
@Index(name = "idx_notification_statut", columnList = "statut"),
|
|
@Index(name = "idx_notification_priorite", columnList = "priorite"),
|
|
@Index(name = "idx_notification_membre", columnList = "membre_id"),
|
|
@Index(name = "idx_notification_organisation", columnList = "organisation_id"),
|
|
@Index(name = "idx_notification_date_envoi", columnList = "date_envoi")
|
|
})
|
|
@Data
|
|
@NoArgsConstructor
|
|
@AllArgsConstructor
|
|
@Builder
|
|
@EqualsAndHashCode(callSuper = true)
|
|
public class Notification extends BaseEntity {
|
|
|
|
/** Type de notification */
|
|
@NotNull
|
|
@Column(name = "type_notification", nullable = false, length = 30)
|
|
private String typeNotification;
|
|
|
|
/** Priorité */
|
|
@Builder.Default
|
|
@Column(name = "priorite", length = 20)
|
|
private String priorite = "NORMALE";
|
|
|
|
/** Statut */
|
|
@Builder.Default
|
|
@Column(name = "statut", length = 30)
|
|
private String statut = "EN_ATTENTE";
|
|
|
|
/** Sujet */
|
|
@Column(name = "sujet", length = 500)
|
|
private String sujet;
|
|
|
|
/** Corps du message */
|
|
@Column(name = "corps", columnDefinition = "TEXT")
|
|
private String corps;
|
|
|
|
/** Date d'envoi prévue */
|
|
@Column(name = "date_envoi_prevue")
|
|
private LocalDateTime dateEnvoiPrevue;
|
|
|
|
/** Date d'envoi réelle */
|
|
@Column(name = "date_envoi")
|
|
private LocalDateTime dateEnvoi;
|
|
|
|
/** Date de lecture */
|
|
@Column(name = "date_lecture")
|
|
private LocalDateTime dateLecture;
|
|
|
|
/** Nombre de tentatives d'envoi */
|
|
@Builder.Default
|
|
@Column(name = "nombre_tentatives", nullable = false)
|
|
private Integer nombreTentatives = 0;
|
|
|
|
/** Message d'erreur (si échec) */
|
|
@Column(name = "message_erreur", length = 1000)
|
|
private String messageErreur;
|
|
|
|
/** Données additionnelles (JSON) */
|
|
@Column(name = "donnees_additionnelles", columnDefinition = "TEXT")
|
|
private String donneesAdditionnelles;
|
|
|
|
// Relations
|
|
@ManyToOne(fetch = FetchType.LAZY)
|
|
@JoinColumn(name = "membre_id")
|
|
private Membre membre;
|
|
|
|
@ManyToOne(fetch = FetchType.LAZY)
|
|
@JoinColumn(name = "organisation_id")
|
|
private Organisation organisation;
|
|
|
|
@ManyToOne(fetch = FetchType.LAZY)
|
|
@JoinColumn(name = "template_id")
|
|
private TemplateNotification template;
|
|
|
|
/** Méthode métier pour vérifier si la notification est envoyée */
|
|
public boolean isEnvoyee() {
|
|
return statut != null && dev.lions.unionflow.server.api.enums.notification.StatutNotification.ENVOYEE.name().equals(statut);
|
|
}
|
|
|
|
/** Méthode métier pour vérifier si la notification est lue */
|
|
public boolean isLue() {
|
|
return statut != null && dev.lions.unionflow.server.api.enums.notification.StatutNotification.LUE.name().equals(statut);
|
|
}
|
|
|
|
/** Callback JPA avant la persistance */
|
|
@PrePersist
|
|
protected void onCreate() {
|
|
super.onCreate();
|
|
if (priorite == null) {
|
|
priorite = "NORMALE";
|
|
}
|
|
if (statut == null) {
|
|
statut = "EN_ATTENTE";
|
|
}
|
|
if (nombreTentatives == null) {
|
|
nombreTentatives = 0;
|
|
}
|
|
if (dateEnvoiPrevue == null) {
|
|
dateEnvoiPrevue = LocalDateTime.now();
|
|
}
|
|
}
|
|
}
|