TransporterContainer.java

package com.tradecloud.domain.transporter;

import com.tradecloud.common.base.PersistenceBase;
import com.tradecloud.domain.container.ShipmentContainer;
import com.tradecloud.domain.model.organisationalunit.OrganisationalUnit;
import com.tradecloud.domain.model.organisationalunit.OrganisationalUnitTier;
import com.tradecloud.domain.party.ServiceProvider;
import org.apache.commons.lang3.builder.ToStringBuilder;

import javax.persistence.*;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
import java.util.Objects;

@Entity
@Table(name = "transporter_container")
@Access(AccessType.FIELD)
public class TransporterContainer extends PersistenceBase implements Serializable {

    private static final long serialVersionUID = 1L;

    public static final String SHIPMENT_REFERENCE = "Shipment Reference";
    public static final String CONTAINER_REFERENCE = "Container Reference";

    @ManyToOne
    @NotNull(message = "Transporter is required")
    private ServiceProvider transporter;

    @ManyToOne
    @NotNull(message = "shipmentContainer is required")
    private ShipmentContainer shipmentContainer;

    private boolean documentUploaded;
    private boolean invoiced;
    private boolean datesSubmitted;
    @Embedded
    private InvoiceSplit invoiceSplit;

    @ManyToOne
    @JoinColumn(name = "transportercosting_id")
    private TransporterCosting transporterCosting;


    public TransporterContainer() {
    }

    public TransporterContainer(ShipmentContainer container) {
        this.shipmentContainer = container;
        invoiceSplit = new InvoiceSplit();
    }

    public ServiceProvider getTransporter() {
        return transporter;
    }

    public void setTransporter(ServiceProvider transporter) {
        this.transporter = transporter;
    }

    public ShipmentContainer getShipmentContainer() {
        return shipmentContainer;
    }

    public void setShipmentContainer(ShipmentContainer shipmentContainer) {
        this.shipmentContainer = shipmentContainer;
    }

    public boolean isDocumentUploaded() {
        return documentUploaded;
    }

    public void setDocumentUploaded(boolean documentUploaded) {
        this.documentUploaded = documentUploaded;
    }

    public boolean isInvoiced() {
        return invoiced;
    }

    public void setInvoiced(boolean invoiced) {
        this.invoiced = invoiced;
    }

    public boolean isDatesSubmitted() {
        return datesSubmitted;
    }

    public void setDatesSubmitted(boolean datesSubmitted) {
        this.datesSubmitted = datesSubmitted;
    }

    public InvoiceSplit getInvoiceSplit() {
        return invoiceSplit;
    }

    public void setInvoiceSplit(InvoiceSplit invoiceSplit) {
        this.invoiceSplit = invoiceSplit;
    }

    public TransporterCosting getTransporterCosting() {
        return transporterCosting;
    }

    public void setTransporterCosting(TransporterCosting transporterCosting) {
        this.transporterCosting = transporterCosting;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (!(o instanceof TransporterContainer that)) return false;
        return Objects.equals(getShipmentContainer().getId(), that.getShipmentContainer().getId());
    }

    @Override
    public int hashCode() {
        return Objects.hash(getShipmentContainer().getId());
    }

    @Override
    public String toString() {
        return new ToStringBuilder(this)
                .append("id", id)
                .toString();
    }

    public OrganisationalUnit getBusinessOrHoldingComOrgUnit() {
        return findRelevantOrganisationalUnit(this.shipmentContainer.getShipment().getOrganisationalUnit());
    }

    private OrganisationalUnit findRelevantOrganisationalUnit(OrganisationalUnit organisationalUnit) {
        if (isBusinessOrHoldingUnit(organisationalUnit) || organisationalUnit.getParent() == null) {
            return organisationalUnit;
        }
        return findRelevantOrganisationalUnit(organisationalUnit.getParent());
    }

    private boolean isBusinessOrHoldingUnit(OrganisationalUnit organisationalUnit) {
        OrganisationalUnitTier tier = organisationalUnit.getTier();
        return tier != null && (tier.getCode().equals("BUSINESS_UNIT") || tier.getCode().equals("HoldingCompany"));
    }

}