Homologation.java

package com.tradecloud.domain.item;

import com.tradecloud.common.base.PersistenceBase;
import com.tradecloud.domain.event.Event;
import com.tradecloud.domain.state.Stateful;
import org.hibernate.annotations.Fetch;
import org.hibernate.annotations.FetchMode;

import javax.persistence.*;
import java.io.Serializable;
import java.util.Date;
import java.util.LinkedList;
import java.util.List;

@Entity
@Table(name = "Homologation")
@Access(AccessType.FIELD)
public class Homologation extends PersistenceBase implements Serializable, Stateful<HomologationStatus, HomologationEvent> {

    public static final String CONDITIONAL_APPROVAL_CERT = "Conditional Approval Cert";
    public static final String FINAL_LOA_CERT = "Final LOA Cert";
    public static final String ECE_DOCUMENT = "ECE Document";


    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, orphanRemoval = true)
    @Fetch(value = FetchMode.SELECT)
    @OrderBy("createDateTime")
    private List<HomologationEvent> events = new LinkedList<>();

    @Enumerated(EnumType.STRING)
    private HomologationStatus status;

    private Date applicationSubmittedDate;

    private String applicationReference;

    private Date conditionalReleaseDate;

    private Date inspectionDate;

    private String inspectionRecordNumber;

    private boolean notRequired;

    public HomologationStatus getStatus() {
        return status;
    }

    public void setStatus(HomologationStatus status) {
        this.status = status;
    }

    public Date getApplicationSubmittedDate() {
        return applicationSubmittedDate;
    }

    public void setApplicationSubmittedDate(Date applicationSubmittedDate) {
        this.applicationSubmittedDate = applicationSubmittedDate;
    }

    public String getApplicationReference() {
        return applicationReference;
    }

    public void setApplicationReference(String applicationReference) {
        this.applicationReference = applicationReference;
    }

    public Date getConditionalReleaseDate() {
        return conditionalReleaseDate;
    }

    public void setConditionalReleaseDate(Date conditionalReleaseDate) {
        this.conditionalReleaseDate = conditionalReleaseDate;
    }

    public Date getInspectionDate() {
        return inspectionDate;
    }

    public void setInspectionDate(Date inspectionDate) {
        this.inspectionDate = inspectionDate;
    }

    public String getInspectionRecordNumber() {
        return inspectionRecordNumber;
    }

    public void setInspectionRecordNumber(String inspectionRecordNumber) {
        this.inspectionRecordNumber = inspectionRecordNumber;
    }

    public boolean isNotRequired() {
        return notRequired;
    }

    public void setNotRequired(boolean notRequired) {
        this.notRequired = notRequired;
    }

    @Override
    public HomologationEvent getLastEvent() {
        return Event.getLastEvent(events);
    }

    @Override
    public List<HomologationEvent> getEvents() {
        return events;
    }

    @Override
    public boolean inNonEditableState() {
        return false;
    }

    public void setEvents(List<HomologationEvent> events) {
        this.events = events;
    }

    @Override
    public String toString() {
        return "Homologation{" +
                "status=" + status +
                ", applicationReference='" + applicationReference + '\'' +
                '}';
    }

    @Override
    public HomologationStatus getState() {
        return status;
    }

    @Override
    public void setState(HomologationStatus state) {
        this.status = state;
    }
}