Lead.java

package cz.vsb.crm.model;

import jakarta.persistence.CascadeType;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.FetchType;
import jakarta.persistence.Index;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.ManyToOne;
import jakarta.persistence.OneToMany;
import jakarta.persistence.Table;
import jakarta.validation.constraints.NotNull;
import lombok.Getter;
import lombok.Setter;

import java.math.BigDecimal;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.List;

@Getter
@Setter
@Entity
@Table(name = "leads", indexes = {
        @Index(name = "idx_lead_account", columnList = "account_id"),
        @Index(name = "idx_lead_assigned", columnList = "assigned_to"),
        @Index(name = "idx_lead_status", columnList = "status"),
        @Index(name = "idx_lead_created_date", columnList = "created_date")
})
public class Lead extends BaseEntity {

    @NotNull
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "account_id", nullable = false)
    private Account account;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "assigned_to")
    private User assignedTo;

    private String source = "Website";

    private String status = "New";

    @Column(name = "lead_value")
    private BigDecimal value;

    @Column(name = "created_date")
    private LocalDate createdDate;

    @OneToMany(mappedBy = "lead", cascade = CascadeType.ALL, orphanRemoval = true)
    private List<LeadProduct> leadProducts = new ArrayList<>();

    @OneToMany(mappedBy = "lead")
    private List<Order> orders = new ArrayList<>();

    public Lead() {
        this.createdDate = LocalDate.now();
    }
}