PackingListItem.java

package com.tradecloud.domain.container;

import com.tradecloud.common.base.PersistenceBase;
import com.tradecloud.domain.common.Currency;
import com.tradecloud.domain.item.AdditionalItem;
import com.tradecloud.domain.item.AdditionalLineItemType;
import lombok.Getter;
import lombok.Setter;
import org.apache.commons.lang.builder.EqualsBuilder;
import org.apache.commons.lang.builder.HashCodeBuilder;
import org.hibernate.annotations.ForeignKey;

import javax.persistence.*;
import javax.validation.constraints.NotNull;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlRootElement;
import java.math.BigDecimal;
import java.util.Date;

@Entity
@Getter
@Setter
@Table(name = "packinglistitem")
@NamedQueries({@NamedQuery(name = "packingListItem.findByOrderReferenceAndItemReferenceAndOrganisation",
        query = """
                from PackingListItem pli
                where pli.packingListOrder.orderReference = :orderReference
                and pli.reference = :itemReference
                and organisationalUnit=:organisationalUnit
                and (
                  pli.lineNumber = :lineNumber
                  or pli.lineNumber is null
                     )
                """)})
@Access(AccessType.FIELD)
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "PackingListLineItem")
public class PackingListItem extends PersistenceBase implements AdditionalItem, Comparable<PackingListItem> {

    private static final long serialVersionUID = 1L;

    /**
     * The bidirectional link back to the parent {@link PackingListOrder}.
     */
    @ManyToOne(optional = false)
    @ForeignKey(name = "fk_packinglistorder")
    private PackingListOrder packingListOrder;

    @NotNull
    @XmlAttribute(required = true)
    private String reference;
    @NotNull
    @XmlAttribute(required = true)
    private String supplierItemReference;
    @NotNull
    @XmlAttribute(required = true)
    private String description;
    @XmlAttribute
    private BigDecimal originalUnitQuantity;
    @XmlAttribute
    private BigDecimal unitQuantity;

    private BigDecimal unitPrice;

    private BigDecimal supplyCost;
    @XmlAttribute
    private BigDecimal numPackages;
    @XmlAttribute
    private BigDecimal unitsPerPackage;
    @XmlAttribute
    private BigDecimal unitVolume;
    private BigDecimal initialUnitVolume;
    @XmlAttribute
    private BigDecimal totalVolume = BigDecimal.ZERO;
    @XmlAttribute
    private BigDecimal unitWeight;
    private BigDecimal initialUnitWeight;
    @XmlAttribute
    private BigDecimal totalWeight = BigDecimal.ZERO;
    @Basic(optional = false)
    private String tariffHeading;
    @Basic(optional = false)
    private String barcode;
    private Integer lineNumber;
    /**
     * If this is true we know the original line item was added at actual level, otherwise it was an estimate level line item.
     */
    @Basic(optional = false)
    private boolean additional;

    @ManyToOne
    @NotNull(message = "Currency is a required field")
    protected Currency currency;

    @XmlAttribute
    @Temporal(TemporalType.TIMESTAMP)
    private Date addedToOrderDate;
    @NotNull(message = "organisationalUnit is a required field")
    private String organisationalUnit;
    private boolean overriddenVolume;
    private boolean overriddenWeight;
    private boolean overrideTotalVolume;
    private boolean overrideTotalWeight;

    public PackingListOrder getPackingListOrder() {
        return packingListOrder;
    }

    public void setPackingListOrder(PackingListOrder packingListOrder) {
        this.packingListOrder = packingListOrder;
    }

    public String getReference() {
        return reference;
    }

    public void setReference(String reference) {
        this.reference = reference;
    }

    public String getSupplierItemReference() {
        return supplierItemReference;
    }

    public void setSupplierItemReference(String supplierItemReference) {
        this.supplierItemReference = supplierItemReference;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    public BigDecimal getOriginalUnitQuantity() {
        return originalUnitQuantity;
    }

    public void setOriginalUnitQuantity(BigDecimal originalUnitQuantity) {
        this.originalUnitQuantity = originalUnitQuantity;
    }

    public BigDecimal getUnitQuantity() {
        return unitQuantity;
    }

    public void setUnitQuantity(BigDecimal unitQuantity) {
        this.unitQuantity = unitQuantity;
    }

    public BigDecimal getNumPackages() {
        return numPackages;
    }

    public void setNumPackages(BigDecimal numPackages) {
        this.numPackages = numPackages;
    }

    public BigDecimal getUnitsPerPackage() {
        return unitsPerPackage;
    }

    public void setUnitsPerPackage(BigDecimal unitsPerPackage) {
        this.unitsPerPackage = unitsPerPackage;
    }

    public BigDecimal getUnitVolume() {
        return unitVolume;
    }

    public void setUnitVolume(BigDecimal unitVolume) {
        this.unitVolume = unitVolume;
    }

    public BigDecimal getTotalVolume() {
        return totalVolume;
    }

    public void setTotalVolume(BigDecimal totalVolume) {
        this.totalVolume = totalVolume;
    }

    public BigDecimal getUnitWeight() {
        return unitWeight;
    }

    public void setUnitWeight(BigDecimal unitWeight) {
        this.unitWeight = unitWeight;
    }

    public BigDecimal getTotalWeight() {
        return totalWeight;
    }

    public void setTotalWeight(BigDecimal totalWeight) {
        this.totalWeight = totalWeight;
    }

    public boolean isAdditional() {
        return additional;
    }

    public void setAdditional(boolean additional) {
        this.additional = additional;
    }

    public String getTariffHeading() {
        return tariffHeading;
    }

    public void setTariffHeading(String tariffHeading) {
        this.tariffHeading = tariffHeading;
    }

    public String getBarcode() {
        return barcode;
    }

    public void setBarcode(String barcode) {
        this.barcode = barcode;
    }

    @Override
    public boolean isSample() {
        return additional && AdditionalLineItemType.SAMPLE.getName().equals(reference);
    }

    @Override
    public boolean isSparePart() {
        return additional && AdditionalLineItemType.SPARE_PART.getName().equals(reference);
    }

    public BigDecimal getUnitPrice() {
        return unitPrice;
    }

    public void setUnitPrice(BigDecimal unitPrice) {
        this.unitPrice = unitPrice;
    }

    public BigDecimal getSupplyCost() {
        return supplyCost;
    }

    public void setSupplyCost(BigDecimal supplyCost) {
        this.supplyCost = supplyCost;
    }

    public Currency getCurrency() {
        return currency;
    }

    public void setCurrency(Currency currency) {
        this.currency = currency;
    }

    public Date getAddedToOrderDate() {
        return addedToOrderDate;
    }

    public void setAddedToOrderDate(Date addedToOrderDate) {
        this.addedToOrderDate = addedToOrderDate;
    }

    @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }
        if (this == null) {
            return true;
        }
        if (!(obj instanceof PackingListItem)) {
            return false;
        }
        PackingListItem other = (PackingListItem) obj;
        return new EqualsBuilder().append(packingListOrder, other.packingListOrder).append(reference, other.reference)
                .append(organisationalUnit, other.organisationalUnit).append(lineNumber, other.lineNumber)
                .isEquals();
    }

    @Override
    public int hashCode() {
        return new HashCodeBuilder().append(packingListOrder).append(reference).append(organisationalUnit).toHashCode();
    }

    @Override
    public String toString() {
        return "PackingListItem{" +
                "packingListOrder=" + packingListOrder +
                ", reference='" + reference + '\'' +
                ", supplierItemReference='" + supplierItemReference + '\'' +
                ", description='" + description + '\'' +
                ", originalUnitQuantity=" + originalUnitQuantity +
                ", unitQuantity=" + unitQuantity +
                ", unitPrice=" + unitPrice +
                ", supplyCost=" + supplyCost +
                ", numPackages=" + numPackages +
                ", unitsPerPackage=" + unitsPerPackage +
                ", unitVolume=" + unitVolume +
                ", totalVolume=" + totalVolume +
                ", unitWeight=" + unitWeight +
                ", totalWeight=" + totalWeight +
                ", tariffHeading='" + tariffHeading + '\'' +
                ", barcode='" + barcode + '\'' +
                ", additional=" + additional +
                ", currency=" + currency +
                ", organisationalUnit=" + organisationalUnit +
                '}';
    }

    @Override
    public int compareTo(PackingListItem o) {
        return this.getReference().compareTo(o.getReference()) + (this.getOrganisationalUnit() != null ?
                this.getOrganisationalUnit().compareTo(o.getOrganisationalUnit()) : 0);
    }

    public String getOrganisationalUnit() {
        return organisationalUnit;
    }

    public void setOrganisationalUnit(String organisationalUnit) {
        this.organisationalUnit = organisationalUnit;
    }

    public boolean isOverriddenVolume() {
        return overriddenVolume;
    }

    public void setOverriddenVolume(boolean overriddenVolume) {
        this.overriddenVolume = overriddenVolume;
    }

    public boolean isOverriddenWeight() {
        return overriddenWeight;
    }

    public void setOverriddenWeight(boolean overriddenWeight) {
        this.overriddenWeight = overriddenWeight;
    }

    public BigDecimal getInitialUnitVolume() {
        return initialUnitVolume;
    }

    public void setInitialUnitVolume(BigDecimal initialUnitVolume) {
        this.initialUnitVolume = initialUnitVolume;
    }

    public BigDecimal getInitialUnitWeight() {
        return initialUnitWeight;
    }

    public void setInitialUnitWeight(BigDecimal initialUnitWeight) {
        this.initialUnitWeight = initialUnitWeight;
    }

    public boolean isOverrideTotalVolume() {
        return overrideTotalVolume;
    }

    public void setOverrideTotalVolume(boolean overrideTotalVolume) {
        this.overrideTotalVolume = overrideTotalVolume;
    }

    public boolean isOverrideTotalWeight() {
        return overrideTotalWeight;
    }

    public void setOverrideTotalWeight(boolean overrideTotalWeight) {
        this.overrideTotalWeight = overrideTotalWeight;
    }

    public boolean equals(String reference, Integer lineNumber) {
        return this.reference.equalsIgnoreCase(reference) &&
                (this.lineNumber != null ? this.lineNumber.equals(lineNumber) : true);
    }
}