PackingListOrder.java

package com.tradecloud.domain.container;

import com.tradecloud.common.base.PersistenceBase;
import org.apache.commons.lang.builder.EqualsBuilder;
import org.apache.commons.lang.builder.HashCodeBuilder;
import org.hibernate.annotations.Fetch;
import org.hibernate.annotations.FetchMode;
import org.hibernate.annotations.ForeignKey;
import org.hibernate.annotations.Formula;

import javax.persistence.*;
import javax.validation.constraints.NotNull;
import javax.xml.bind.annotation.*;
import java.math.BigDecimal;
import java.util.LinkedHashSet;
import java.util.Set;

@Entity
@Table(name = "packinglistorder")
@Access(AccessType.FIELD)
@NamedQueries({
        @NamedQuery(name = "packingListOrder.findByIdWithItems", query = "from PackingListOrder plo left join fetch plo.items where plo.id=:id"),
        @NamedQuery(name = "packingListOrder.findOrdersByReference", query = "from PackingListOrder plo where plo.orderReference = :orderReference"),
        @NamedQuery(name = "packingListOrder.findOrdersByPackingListContainer", query = "from PackingListOrder plo " +
                "where packingListContainer.id = :packingListContainerId"),
        @NamedQuery(name = "packingListOrder.findByOrderAndPackingListContainer",
                query = "from PackingListOrder where packingListContainer.id = :packingListContainerId and orderReference = "
                        + "(select orderReference from Order where id = :orderId)")})
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "PackingListOrder")
public class PackingListOrder extends PersistenceBase {

    private static final long serialVersionUID = 1L;

    private BigDecimal noOfCartons;

    /**
     * This is the reference from {@code Order}.  We add it at this level for convenience so a full load of the order is not required.
     */
    @NotNull
    @XmlAttribute(required = true)
    private String orderReference;

    @XmlAttribute
    private String shippingReference;

    /**
     * The bidirectional link back to the parent {@link PackingListContainer}.
     */
    @ManyToOne(optional = false)
    @XmlIDREF
    @ForeignKey(name = "fk_packinglistcontainer")
    private PackingListContainer packingListContainer;

    @XmlElementWrapper(name = "PackingListItems")
    @XmlElement(name = "PackingListItem")
    @ForeignKey(name = "fk_packinglistorder")
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "packingListOrder", orphanRemoval = true, fetch = FetchType.LAZY)
    @Fetch(FetchMode.SUBSELECT)
    @OrderBy("addedToOrderDate")
    private Set<PackingListItem> items = new LinkedHashSet<PackingListItem>();

    @Basic
    @Column(precision = 27, scale = 20)
    private BigDecimal orderProportion;
    //order id
    private Long originalOrderId;
    private boolean overriddenVolume;
    private boolean overriddenWeight;

    @Basic(fetch = FetchType.LAZY)
    @Formula(value = "(SELECT sum(i.sellPriceExclusiveAmount*pli.unitquantity) " +
            "FROM lineitem i left join orders o on o.id = i.order_id join consignment c on (c.id=o.consignment_id)  " +
            "join shipment s on (s.id=c.shipment_id) join packinglist p on (p.shipmentid=s.id) " +
            "join packinglistcontainer plc on (plc.packinglist_id=p.id) join packinglistorder plo on(plo.packinglistcontainer_id=plc.id) " +
            "join packinglistitem pli on (pli.packinglistorder_id=plo.id) join organisationalunit u on (u.id=i.organisationalunit_id)  " +
            "WHERE plo.id=id and plo.originalorderid=o.id and i.code=pli.reference and u.code=pli.organisationalunit)")
    private BigDecimal retailValueOfOrder;

    public void addItem(PackingListItem item) {
        item.setPackingListOrder(this);
        items.add(item);
    }

    public PackingListOrder() {
    }

    public String getOrderReference() {
        return orderReference;
    }

    public void setOrderReference(String orderReference) {
        this.orderReference = orderReference;
    }

    public PackingListContainer getPackingListContainer() {
        return packingListContainer;
    }

    public void setPackingListContainer(PackingListContainer packingListContainer) {
        this.packingListContainer = packingListContainer;
    }

    public Set<PackingListItem> getItems() {
        return items;
    }

    public void setItems(Set<PackingListItem> items) {
        this.items = items;
    }

    public BigDecimal getOrderProportion() {
        return orderProportion;
    }

    public void setOrderProportion(BigDecimal orderProportion) {
        this.orderProportion = orderProportion;
    }

    @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }
        if (this == obj) {
            return true;
        }
        if (!(obj instanceof PackingListOrder)) {
            return false;
        }
        PackingListOrder other = (PackingListOrder) obj;
        return new EqualsBuilder().append(packingListContainer, other.packingListContainer).append(orderReference, other.orderReference).isEquals();
    }

    @Override
    public int hashCode() {
        return new HashCodeBuilder().append(packingListContainer).append(orderReference).toHashCode();
    }

    public Long getOriginalOrderId() {
        return originalOrderId;
    }

    public void setOriginalOrderId(Long originalOrderId) {
        this.originalOrderId = originalOrderId;
    }

    public Long getKey() {
        if (getId() == null) {
            return originalOrderId + PackingListOrder.class.hashCode();
        }
        return this.getId() + PackingListOrder.class.hashCode();
    }

    public String getShippingReference() {
        return shippingReference;
    }

    public void setShippingReference(String shippingReference) {
        this.shippingReference = shippingReference;
    }

    public BigDecimal getNoOfCartons() {
        return noOfCartons;
    }

    public void setNoOfCartons(BigDecimal noOfCartons) {
        this.noOfCartons = noOfCartons;
    }

    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 getRetailValueOfOrder() {
        return retailValueOfOrder;
    }
}