Newer
Older
teacher-diary / src / main / java / ru / mcs / diary / student / Student.java
package ru.mcs.diary.student;

import jakarta.persistence.*;
import lombok.*;
import ru.mcs.diary.common.BaseEntity;
import ru.mcs.diary.grade.Grade;
import ru.mcs.diary.group.StudyGroup;
import ru.mcs.diary.teacher.Teacher;

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

@Entity
@Table(name = "students")
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class Student extends BaseEntity {

    @Column(name = "first_name", nullable = false, length = 100)
    private String firstName;

    @Column(name = "last_name", nullable = false, length = 100)
    private String lastName;

    @Column(length = 100)
    private String patronymic;

    @Column(length = 20)
    private String phone;

    @Column(name = "birth_date")
    private LocalDate birthDate;

    @Column(columnDefinition = "TEXT")
    private String notes;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "teacher_id", nullable = false)
    private Teacher teacher;

    @ManyToMany(mappedBy = "students")
    @Builder.Default
    private Set<StudyGroup> groups = new HashSet<>();

    @OneToMany(mappedBy = "student", cascade = CascadeType.ALL, orphanRemoval = true)
    @Builder.Default
    private List<StudentParent> studentParents = new ArrayList<>();

    @OneToMany(mappedBy = "student", cascade = CascadeType.ALL)
    @Builder.Default
    private List<Grade> grades = new ArrayList<>();

    public String getFullName() {
        if (patronymic != null && !patronymic.isBlank()) {
            return lastName + " " + firstName + " " + patronymic;
        }
        return lastName + " " + firstName;
    }

    public String getShortName() {
        String initials = firstName.substring(0, 1) + ".";
        if (patronymic != null && !patronymic.isBlank()) {
            initials += " " + patronymic.substring(0, 1) + ".";
        }
        return lastName + " " + initials;
    }
}