RFQStyle.java

package com.tradecloud.domain.model.requestforquote;

import com.tradecloud.domain.place.FinalDestination;

import javax.persistence.*;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;

@Entity
@Table(name = "RFQStyle")
@Access(AccessType.FIELD)
public class RFQStyle extends StockLevelRow implements Comparable {
    private String productStyle;
    private BigDecimal quantity;

    @ManyToOne(fetch = FetchType.LAZY)
    private RequestForQuote requestForQuote;
    @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    @JoinTable(name = "RFQStyle_suppliedrqfProducts", joinColumns = {@JoinColumn(name = "RFQStyle_id")},
            inverseJoinColumns = {@JoinColumn(name = "suppliedrqfProduct_id")})
    private List<RFQProduct> suppliedRQFProducts = new ArrayList<>();

    @OneToMany(mappedBy = "rfqStyle", cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.LAZY)
    private  List<RFQRegion> rfqRegions=new ArrayList<>();

    public RFQStyle() {
    }

    public RFQStyle(String style, RequestForQuote forQuote) {
        this.productStyle = style;
        this.requestForQuote = forQuote;
    }

    public RFQStyle(String productStyle, BigDecimal quantity) {
        this.productStyle = productStyle;
        this.quantity = quantity;
    }

    @Override
    public FinalDestination getFinalDestination(){
        return null;
    }

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

    public String getStyle(){
        return productStyle;
    }

    public String getCode(){
        return null;
    }

    public String getDescription(){
        return null;
    }

    public String getProductStyle() {
        return productStyle;
    }

    public void setProductStyle(String productStyle) {
        this.productStyle = productStyle;
    }

    public BigDecimal getQuantity() {
        return quantity;
    }

    public void setQuantity(BigDecimal quantity) {
        this.quantity = quantity;
    }

    public RequestForQuote getRequestForQuote() {
        return requestForQuote;
    }

    public void setRequestForQuote(RequestForQuote requestForQuote) {
        this.requestForQuote = requestForQuote;
    }

    public List<RFQProduct> getSuppliedRQFProducts() {
        return suppliedRQFProducts;
    }

    public void setSuppliedRQFProducts(List<RFQProduct> suppliedRQFProducts) {
        this.suppliedRQFProducts = suppliedRQFProducts;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        if (!super.equals(o)) return false;
        RFQStyle rfqStyle = (RFQStyle) o;
        return Objects.equals(productStyle, rfqStyle.productStyle) && Objects.equals(requestForQuote, rfqStyle.requestForQuote);
    }

    @Override
    public int hashCode() {
        return Objects.hash(super.hashCode(), productStyle, requestForQuote);
    }

    public boolean isProductLevel() {
        return false;
    }

    @Override
    public boolean isStyleLevel() {
        return true;
    }

    @Override
    public int compareTo(Object o) {
        return 0;
    }

    public List<RFQProduct> getRfqProducts() {
        return rfqRegions.stream().flatMap(rfqRegion -> rfqRegion.getRfqProducts().stream()).collect(Collectors.toList());
    }

    public List<RFQRegion> getRfqRegions() {
        return rfqRegions;
    }

    public void setRfqRegions(List<RFQRegion> rfqRegions) {
        this.rfqRegions = rfqRegions;
    }

    public void addRfqRegion(RFQRegion rfqRegion) {
        rfqRegion.setRfqStyle(this);
        rfqRegions.add(rfqRegion);
    }
}