Account.java

package cz.vsb.crm.model;

import jakarta.persistence.CascadeType;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.Index;
import jakarta.persistence.OneToMany;
import jakarta.persistence.Table;
import jakarta.validation.constraints.Email;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Pattern;
import jakarta.validation.constraints.Size;
import lombok.Getter;
import lombok.Setter;

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

@Getter
@Setter
@Entity
@Table(name = "accounts", indexes = {
        @Index(name = "idx_account_deactivated", columnList = "deactivated_at")
})
public class Account extends BaseEntity implements SoftDeletable {

    @NotBlank
    @Size(max = 255)
    @Column(name = "company_name", nullable = false)
    private String companyName;

    @Size(max = 255)
    private String industry;

    @Size(max = 2000)
    private String address;

    @Size(max = 50)
    @Pattern(regexp = "^$|^[+]?[0-9\\s\\-()]{6,20}$", message = "must be a valid phone number")
    private String phone;

    @Email
    @Size(max = 255)
    private String email;

    @Size(max = 100)
    private String type;

    @Size(max = 255)
    @Column(name = "contact_name")
    private String contactName;

    @Email
    @Size(max = 255)
    @Column(name = "contact_email")
    private String contactEmail;

    @Size(max = 50)
    @Pattern(regexp = "^$|^[+]?[0-9\\s\\-()]{6,20}$", message = "must be a valid phone number")
    @Column(name = "contact_phone")
    private String contactPhone;

    @Size(max = 255)
    @Column(name = "contact_position")
    private String contactPosition;

    @Column(name = "deactivated_at")
    private LocalDate deactivatedAt;

    @OneToMany(mappedBy = "account", cascade = CascadeType.PERSIST)
    private List<Lead> leads = new ArrayList<>();

    @OneToMany(mappedBy = "account", cascade = CascadeType.PERSIST)
    private List<Order> orders = new ArrayList<>();
}