RFQProduct.java

package com.tradecloud.domain.model.requestforquote;

import com.tradecloud.domain.item.Product;
import com.tradecloud.domain.place.FinalDestination;
import com.tradecloud.domain.place.NamedPlace;

import javax.persistence.*;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlIDREF;
import java.math.BigDecimal;
import java.util.Objects;
import java.util.Optional;

@Entity
@Table(name = "rfqproduct")
public class RFQProduct extends StockLevelRow {

    @ManyToOne(fetch = FetchType.LAZY)
    @XmlIDREF
    private Product product;

    @XmlAttribute
    @Column
    private BigDecimal quantitySupplied = BigDecimal.ZERO;

    @XmlAttribute
    @Column
    private BigDecimal price = BigDecimal.ZERO;

    @XmlAttribute
    @Column
    private BigDecimal costAndAntiDumping = BigDecimal.ZERO;

    @XmlAttribute
    @Column
    private BigDecimal antiDumpingPercent = BigDecimal.ZERO;

    @ManyToOne(fetch = FetchType.LAZY)
    private SupplierStyle supplierStyle;

    @XmlAttribute
    @Column
    private BigDecimal awardedQuantity = BigDecimal.ZERO;

    private boolean awardedOverridden;

    private boolean antiDumpingPercentOverridden;

    @ManyToOne
    private NamedPlace factory;

    @Column
    private BigDecimal quantityRequested = null;

    @ManyToOne
    private FinalDestination finalDestination;

    private boolean approved;

    @ManyToOne
    private RFQRegion rfqRegion;

    private boolean originalQuantitySelected;

    private boolean branchQuantitySelected;

    public RFQProduct() {
    }

    public RFQProduct(Product product, SupplierStyle supplierStyle, NamedPlace factory) {
        this.product = product;
        this.supplierStyle = supplierStyle;
        this.factory = factory;
    }

    public Product getProduct() {
        return product;
    }

    public void setProduct(Product product) {
        this.product = product;
    }

    public BigDecimal getQuantitySupplied() {
        return quantitySupplied;
    }

    public void setQuantitySupplied(BigDecimal quantitySupplied) {
        this.quantitySupplied = quantitySupplied;
    }

    public BigDecimal getPrice() {
        return price;
    }

    public void setPrice(BigDecimal price) {
        this.price = price;
    }

    public SupplierStyle getSupplierStyle() {
        return supplierStyle;
    }

    public void setSupplierStyle(SupplierStyle supplierStyle) {
        this.supplierStyle = supplierStyle;
    }

    public BigDecimal getAwardedQuantity() {
        return awardedQuantity;
    }

    public void setAwardedQuantity(BigDecimal awardedQuantity) {
        this.awardedQuantity = awardedQuantity;
    }

    public int getPosition() {
        return getSupplierStyle().getRfqOrganisationalUnitSupplier().getPosition();
    }

    public BigDecimal getReamingQuantitySupplied() {
        return quantitySupplied.subtract(Optional.ofNullable(getAwardedQuantity()).orElse(BigDecimal.ZERO));
    }

    public BigDecimal getQuantityRequested() {
        return quantityRequested;
    }

    public void setQuantityRequested(BigDecimal quantityRequested) {
        this.quantityRequested = quantityRequested;
    }

    @Override
    public boolean equals(Object object) {
        if (this == object) return true;
        if (object == null || getClass() != object.getClass()) return false;
        if (!super.equals(object)) return false;
        RFQProduct that = (RFQProduct) object;
        return Objects.equals(product.getId(), that.product.getId()) && Objects.equals(finalDestination, that.finalDestination);
    }

    @Override
    public int hashCode() {
        return Objects.hash(super.hashCode(), product.getId(), finalDestination);
    }

    public boolean isProductLevel() {
        return true;
    }

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

    public boolean isAwardedOverridden() {
        return awardedOverridden;
    }

    public void setAwardedOverridden(boolean awardedOverridden) {
        this.awardedOverridden = awardedOverridden;
    }

    public boolean isAntiDumpingPercentOverridden() {
        return antiDumpingPercentOverridden;
    }

    public void setAntiDumpingPercentOverridden(boolean antiDumpingPercentOverridden) {
        this.antiDumpingPercentOverridden = antiDumpingPercentOverridden;
    }

    public NamedPlace getFactory() {
        return factory;
    }

    public void setFactory(NamedPlace factory) {
        this.factory = factory;
    }

    public BigDecimal getCostAndAntiDumping() {
        return costAndAntiDumping;
    }

    public void setCostAndAntiDumping(BigDecimal costAndAntiDumping) {
        this.costAndAntiDumping = costAndAntiDumping;
    }

    public BigDecimal getAntiDumpingPercent() {
        return antiDumpingPercent;
    }

    public void setAntiDumpingPercent(BigDecimal antiDumpingPercent) {
        this.antiDumpingPercent = antiDumpingPercent;
    }

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

    public void setFinalDestination(FinalDestination finalDestination) {
        this.finalDestination = finalDestination;
    }

    public boolean isApproved() {
        return approved;
    }

    public void setApproved(boolean approved) {
        this.approved = approved;
    }

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

    @Override
    public String getCode(){
        return getProduct().getCode();
    }

    @Override
    public String getDescription(){
        return getProduct().getDescription();
    }

    @Override
    public String getBrand(){
        return Optional.ofNullable(getProduct().getBrand()).map(brand -> brand.getName()).orElse(null);
    }

    public RFQRegion getRfqRegion() {
        return rfqRegion;
    }

    public void setRfqRegion(RFQRegion rfqRegion) {
        this.rfqRegion = rfqRegion;
    }

    public boolean isOriginalQuantitySelected() {
        return originalQuantitySelected;
    }

    public void setOriginalQuantitySelected(boolean originalQuantitySelected) {
        this.originalQuantitySelected = originalQuantitySelected;
    }

    public boolean isBranchQuantitySelected() {
        return branchQuantitySelected;
    }

    public void setBranchQuantitySelected(boolean branchQuantitySelected) {
        this.branchQuantitySelected = branchQuantitySelected;
    }

    @Override
    public String getStyle() {
        return finalDestination.getName();
    }
    }