SeaShipment.java

package com.tradecloud.domain.shipment;

import com.tradecloud.common.base.HibernateUtils;
import com.tradecloud.domain.item.WeightUnitOfMeasure;
import com.tradecloud.domain.model.shipment.ShippingMode;
import com.tradecloud.domain.party.ServiceProvider;
import com.tradecloud.domain.place.City;
import org.apache.commons.lang.builder.EqualsBuilder;
import org.apache.commons.lang.builder.HashCodeBuilder;
import org.hibernate.annotations.ForeignKey;
import org.hibernate.annotations.NamedQueries;
import org.hibernate.annotations.NamedQuery;
import org.springframework.stereotype.Component;

import javax.persistence.*;
import javax.validation.constraints.Size;
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;
import java.util.Set;

@Entity
@DiscriminatorValue("SEA_SHIPMENT")
@Table(name = "seashipment")
@Access(AccessType.FIELD)
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "SeaShipment")
@Component
@NamedQueries({
        @NamedQuery(name = "findByMWBReferenceNotDeleted",
                query = "SELECT shipment FROM Shipment shipment WHERE shipment.masterBillOfLadingReference = " +
                        ":reference AND shipment.state NOT IN ('DELETED')"),
        @NamedQuery(name = "findByWBReferenceNotDeleted",
                query = "SELECT shipment FROM Shipment shipment WHERE shipment.billOfLadingReference = " +
                        ":reference AND shipment.state NOT IN ('DELETED')")})
public class SeaShipment extends Shipment implements Comparable<SeaShipment>, SeaShipmentInterface {

    private static final long serialVersionUID = 1L;

    /**
     * The name of the database sequence used for generating part of the sea
     * shipment number.
     */
    public static final String NUMBER_SEQUENCE = "seashipmentnumber_sequence";

    @XmlAttribute
    @Size(max = 255)
    private String billOfLadingReference;

    @XmlAttribute
    @Temporal(TemporalType.TIMESTAMP)
    private Date billOfLadingDate;

    @XmlAttribute
    private BigDecimal billOfLadingSpotRate;

    @XmlAttribute
    @Size(max = 255)
    private String voyageNumber;

    @XmlAttribute
    @Size(max = 255)
    private String vesselCode;

    @XmlAttribute
    @Size(max = 255)
    private String vesselCallSign;

    @XmlAttribute
    @Temporal(TemporalType.TIMESTAMP)
    private Date stackFromDate;

    @XmlAttribute
    @Temporal(TemporalType.TIMESTAMP)
    private Date stackToDate;

    @ManyToOne(fetch = FetchType.LAZY)
    @ForeignKey(name = "fk_carrier")
    private ServiceProvider carrier;

    @ManyToOne(fetch = FetchType.LAZY)
    private ServiceProvider cargoCarrier;

    private BigDecimal chargeableWeight;

    @ManyToOne(fetch = FetchType.EAGER)
    private WeightUnitOfMeasure chargeableWeightUOM;


    @ManyToOne(fetch = FetchType.LAZY)
    @ForeignKey(name = "fk_transhipmentCarrier")
    private ServiceProvider transhipmentCarrier;

    @XmlAttribute
    @Size(max = 255)
    private String shippingVessel;

    // TODO. Use one from shippingInfo
    @XmlAttribute
    @Enumerated(EnumType.STRING)
    private ShippingMode shippingMode = ShippingMode.SEA;

    private String masterBillOfLadingReference;
    private Date masterBillOfLadingDate;
    @ManyToOne
    protected City billPlaceOfIssue;

    private Date berthingDateTime;
    @Size(max = 4)
    private String vesselAgent;

    public SeaShipment() {
        super();
    }

    public SeaShipment(String number, String reference) {
        super(number, reference);
    }

    public SeaShipment(String number, String reference, String billOfLadingReference, Date billOfLadingDate, BigDecimal billOfLadingSpotRate,
                       String voyageNumber, String vesselCode, Date stackFromDate, Date stackToDate, ServiceProvider shippingLine,
                       String shippingVessel,
                       ShippingMode shippingMode) {
        super(number, reference);
        this.billOfLadingReference = billOfLadingReference;
        this.billOfLadingDate = billOfLadingDate;
        this.billOfLadingSpotRate = billOfLadingSpotRate;
        this.voyageNumber = voyageNumber;
        this.vesselCode = vesselCode;
        this.stackFromDate = stackFromDate;
        this.stackToDate = stackToDate;
        this.carrier = shippingLine;
        this.shippingVessel = shippingVessel;
        this.shippingMode = shippingMode;
    }

    public SeaShipment(String number, String reference, String billOfLadingReference, Date billOfLadingDate, BigDecimal billOfLadingSpotRate,
                       String voyageNumber, String vesselCode, Date stackFromDate, Date stackToDate, ServiceProvider shippingLine,
                       String shippingVessel,
                       ShippingMode shippingMode, Set<Transhipment> transhipments) {
        super(number, reference, transhipments);
        this.billOfLadingReference = billOfLadingReference;
        this.billOfLadingDate = billOfLadingDate;
        this.billOfLadingSpotRate = billOfLadingSpotRate;
        this.voyageNumber = voyageNumber;
        this.vesselCode = vesselCode;
        this.stackFromDate = stackFromDate;
        this.stackToDate = stackToDate;
        this.carrier = shippingLine;
        this.shippingVessel = shippingVessel;
        this.shippingMode = shippingMode;
    }

    @Override
    public String getBillOfLadingReference() {
        return billOfLadingReference;
    }

    public void setBillOfLadingReference(String billOfLadingReference) {
        this.billOfLadingReference = billOfLadingReference;
    }

    @Override
    public Date getBillOfLadingDate() {
        return billOfLadingDate;
    }

    public void setBillOfLadingDate(Date billOfLadingDate) {
        this.billOfLadingDate = billOfLadingDate;
    }

    @Override
    public BigDecimal getBillOfLadingSpotRate() {
        return billOfLadingSpotRate;
    }

    public void setBillOfLadingSpotRate(BigDecimal billOfLadingSpotRate) {
        this.billOfLadingSpotRate = billOfLadingSpotRate;
    }

    @Override
    public String getVoyageNumber() {
        return voyageNumber;
    }

    public void setVoyageNumber(String voyageNumber) {
        this.voyageNumber = voyageNumber;
    }

    @Override
    public ServiceProvider getCarrier() {
        return carrier;
    }

    public void setCarrier(ServiceProvider carrier) {
        this.carrier = carrier;
    }

    @Override
    public String getShippingVessel() {
        return shippingVessel;
    }

    public void setShippingVessel(String shippingVessel) {
        this.shippingVessel = shippingVessel;
    }

    @Override
    public Date getStackFromDate() {
        return stackFromDate;
    }

    public void setStackFromDate(Date stackFromDate) {
        this.stackFromDate = stackFromDate;
    }

    public Date getStackToDate() {
        return stackToDate;
    }

    public void setStackToDate(Date stackToDate) {
        this.stackToDate = stackToDate;
    }

    @Override
    public String getVesselCode() {
        return vesselCode;
    }

    public void setVesselCode(String vesselCode) {
        this.vesselCode = vesselCode;
    }

    @Override
    public ShippingMode getShippingMode() {
        return shippingMode;
    }

    public void setShippingMode(ShippingMode shippingMode) {
        this.shippingMode = shippingMode;
    }

    @Override
    public int hashCode() {
        return new HashCodeBuilder()
                .appendSuper(super.hashCode())
                .append(shippingMode)
                .toHashCode();
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        // Do not use class.equals. This can return false for proxy objects
        if (!HibernateUtils.proxyClassEquals(this, obj)) {
            return false;
        }
        SeaShipment other = (SeaShipment) HibernateUtils.initializeAndUnproxy(obj);
        return new EqualsBuilder()
                .appendSuper(super.equals(other))
                .append(shippingMode, other.getShippingMode())
                .isEquals();
    }

    @Override
    public int compareTo(SeaShipment other) {
        return getNumber().compareTo(other.getNumber());
    }

    @Override
    public ServiceProvider getCargoCarrier() {
        return cargoCarrier;
    }

    public void setCargoCarrier(ServiceProvider cargoCarrier) {
        this.cargoCarrier = cargoCarrier;
    }

    @Override
    public ServiceProvider getTranshipmentCarrier() {
        return transhipmentCarrier;
    }

    public void setTranshipmentCarrier(ServiceProvider transhipmentCarrier) {
        this.transhipmentCarrier = transhipmentCarrier;
    }

    @Override
    public String getMasterBillOfLadingReference() {
        return masterBillOfLadingReference;
    }

    public void setMasterBillOfLadingReference(String masterBillOfLadingReference) {
        this.masterBillOfLadingReference = masterBillOfLadingReference;
    }

    @Override
    public SeaShipment initialize() {
        HibernateUtils.initializeAndUnproxy(getCarrier());
        return (SeaShipment) super.initialize();
    }

    public Date getMasterBillOfLadingDate() {
        return masterBillOfLadingDate;
    }

    public void setMasterBillOfLadingDate(Date masterBillOfLadingDate) {
        this.masterBillOfLadingDate = masterBillOfLadingDate;
    }

    public City getBillPlaceOfIssue() {
        return billPlaceOfIssue;
    }

    public void setBillPlaceOfIssue(City billPlaceOfIssue) {
        this.billPlaceOfIssue = billPlaceOfIssue;
    }

    public String getVesselCallSign() {
        return vesselCallSign;
    }

    public void setVesselCallSign(String vesselCallSign) {
        this.vesselCallSign = vesselCallSign;
    }

    public Date getBerthingDateTime() {
        return berthingDateTime;
    }

    public void setBerthingDateTime(Date berthingDateTime) {
        this.berthingDateTime = berthingDateTime;
    }

    public String getVesselAgent() {
        return vesselAgent;
    }

    public void setVesselAgent(String vesselAgent) {
        this.vesselAgent = vesselAgent;
    }

    @Override
    public ShippingMode getMultiModalShippingMode() {
        return getShippingInfo().getMultiModalShippingMode();
    }

    public WeightUnitOfMeasure getChargeableWeightUOM() {
        return chargeableWeightUOM;
    }

    public void setChargeableWeightUOM(WeightUnitOfMeasure chargeableWeightUOM) {
        this.chargeableWeightUOM = chargeableWeightUOM;
    }

    public BigDecimal getChargeableWeight() {
        return chargeableWeight;
    }

    public void setChargeableWeight(BigDecimal chargeableWeight) {
        this.chargeableWeight = chargeableWeight;
    }
}