ShipmentSearch.java

package com.tradecloud.dto.shipment;


import com.tradecloud.domain.base.utils.DateRange;
import com.tradecloud.domain.base.utils.ObjectUtil;
import com.tradecloud.domain.dms.DocumentGroupState;
import com.tradecloud.domain.dms.DocumentType;
import com.tradecloud.domain.document.DocumentState;
import com.tradecloud.domain.dto.base.SearchBase;
import com.tradecloud.domain.event.ShipmentEventType;
import com.tradecloud.domain.model.organisationalunit.OrganisationalUnit;
import com.tradecloud.domain.model.shipment.RequiredType;
import com.tradecloud.domain.model.shipment.ShipmentState;
import com.tradecloud.domain.model.shipment.ShippingMode;
import com.tradecloud.domain.party.Employee;
import com.tradecloud.domain.party.ServiceProvider;
import com.tradecloud.domain.place.FinalDestination;
import com.tradecloud.domain.place.PlaceOfDischarge;
import com.tradecloud.domain.place.PlaceOfLoading;
import com.tradecloud.domain.sars.Status;
import com.tradecloud.domain.supplier.OrganisationalUnitSupplier;
import com.tradecloud.dto.api.order.DateCalculationType;
import lombok.Getter;
import lombok.Setter;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;

import java.io.Serializable;
import java.util.*;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;

@Getter
@Setter
@Component
@Scope("view")
public class ShipmentSearch extends SearchBase implements Serializable {

    private static final long serialVersionUID = 1L;
    private final DateRange signedOffDateRange = new DateRange();
    private String number;
    private String reference;
    private String billOfLadingReference;
    private String masterAirwayBillNumber;
    private ShipmentState state;
    private List<ShipmentState> applicableStates;
    private ShipmentEventType event;
    private ShippingMode mode;
    protected ShippingMode multiModalShippingMode;
    private Date warehouseDeliveryDateFrom;
    private Date warehouseDeliveryDateTo;
    private Date createdDateFrom;
    private Date createdDateTo;
    private Date billOfLadingDateFrom;
    private Date masterBillOfLadingDateFrom;
    private Date shipmentCreatedFrom;
    private Date billOfLadingDateTo;
    private Date estimateArrivalDateAtPODFrom;
    private Date estimateArrivalDateAtPODTo;
    private DateRange MasterAirwayBillIssueDate;
    private String masterBillOfLadingReference;
    private Employee Buyer;
    private OrganisationalUnit organisationalUnit;
    private String order;
    private List<OrganisationalUnit> organisationalUnitList;
    private RequiredType[] selectedRequiredTypes;

    private OrganisationalUnit[] selectedOrganisationalUnits;
    private DocumentState[] selectedCiStates;
    private ShipmentState[] selectedStates;

    private OrganisationalUnitSupplier supplier;

    // Both 'vesselName' and 'voyageNumber' pertain to SeaShipment as the entity class in a Criteria search.
    // See ShipmentRepositoryImpl search(ShipmentSearch search) method
    private String vesselName;
    private String voyageNumber;

    // Both 'airlineName' and 'flightNumber' pertain to AirShipment as the entity class in a Criteria search.
    // See ShipmentRepositoryImpl search(ShipmentSearch search) method
    private String airlineName;
    private String flightNumber;
    private ServiceProvider freightForwarder;

    private ServiceProvider clearingAgent;
    private ServiceProvider carrier;
    private FinalDestination containerFinalDestination;

    private PlaceOfDischarge placeOfDischarge;
    private PlaceOfLoading placeOfLoading;

    private ServiceProvider shippingLine;

    private String containerReference;

    private DocumentGroupState documentGroupState;

    private DateRange vesselBerthedDate = new DateRange();
    private DateRange scheduledDepartureDate = new DateRange();
    private DateRange actualDateOfDeparture = new DateRange();
    private DateRange actualArrivalDateAtPOD = new DateRange();

    private String itemReference;
    private String itemDescription;
    private String subShipmentReference;

    private String houseWayBillNumber;
    private DateRange houseWayBillDate;
    private DateRange masterAirwayBillIssueDate;
    private DateRange settlementDate;

    private List<DocumentState> commercialInvoicingStates;
    private List<DocumentState> serviceProviderInvoicingStates;

    private Date signedOffDateFrom;
    private Date signedOffDateTo;
    private String SARSReferenceNumber;
    private boolean canAffectCustomsDeclaration;
    private boolean hasClearingInstructions;
    private boolean hasCustomsDeclaration;
    private boolean hasCommercialInvoices;
    private TimeUnit timeUnit;
    private DateCalculationType dateCalculationType;
    private OrganisationalUnit[] organisationalUnits;
    private ShippingMode shippingMode;
    private Status[] selectedClearingStatus = new Status[]{};
    private DocumentType documentType;
    private DateRange grvDateRange = new DateRange();

    private boolean noConsignmentLinked = false;

    private String shippingReference;

    private DateRange shippedOnBoardDate = new DateRange();

    private boolean orderActualCostingReceipt;

    public void setOrganisationalUnit2(OrganisationalUnit organisationalUnit) {
        setOrganisationalUnit(organisationalUnit);
    }

    @Override
    public String getTableName() {
        return "shipment";
    }

    /**
     * @return the freightForwarder
     */
    public ServiceProvider getFreightForwarder() {
        return freightForwarder;
    }

    /**
     * @param freightForwarder the freightForwarder to set
     */
    public void setFreightForwarder(ServiceProvider freightForwarder) {
        this.freightForwarder = freightForwarder;
    }

    public ServiceProvider getShippingLine() {
        return shippingLine;
    }

    public void setShippingLine(ServiceProvider shippingLine) {
        this.shippingLine = shippingLine;
    }

    public PlaceOfLoading getPlaceOfLoading() {
        return placeOfLoading;
    }

    public void setPlaceOfLoading(PlaceOfLoading placeOfLoading) {
        this.placeOfLoading = placeOfLoading;
    }

    public String getContainerReference() {
        return containerReference;
    }

    public void setContainerReference(String containerReference) {
        this.containerReference = containerReference;
    }

    public DateRange getSignedOffDateRange() {
        return signedOffDateRange;
    }

    public String getMasterBillOfLadingReference() {
        return masterBillOfLadingReference;
    }

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

    public String getOrder() {
        return order;
    }

    public void setOrder(String order) {
        this.order = order;
    }

    public List<ShipmentState> getApplicableStates() {
        return applicableStates;
    }

    public void setApplicableStates(List<ShipmentState> applicableStates) {
        this.applicableStates = applicableStates;
    }

    public OrganisationalUnit getOrganisationalUnit() {
        return organisationalUnit;
    }

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

    public OrganisationalUnitSupplier getSupplier() {
        return supplier;
    }

    public void setSupplier(OrganisationalUnitSupplier supplier) {
        this.supplier = supplier;
    }

    public DocumentGroupState getDocumentGroupState() {
        return documentGroupState;
    }

    public void setDocumentGroupState(DocumentGroupState documentGroupState) {
        this.documentGroupState = documentGroupState;
    }

    public Date getBillOfLadingDateFrom() {
        return billOfLadingDateFrom;
    }

    public void setBillOfLadingDateFrom(Date billOfLadingDateFrom) {
        this.billOfLadingDateFrom = billOfLadingDateFrom;
    }

    public Date getMasterBillOfLadingDateFrom() {
        return masterBillOfLadingDateFrom;
    }

    public void setMasterBillOfLadingDateFrom(Date masterBillOfLadingDateFrom) {
        this.masterBillOfLadingDateFrom = masterBillOfLadingDateFrom;
    }

    public Date getShipmentCreatedFrom() {
        return shipmentCreatedFrom;
    }

    public void setShipmentCreatedFrom(Date shipmentCreatedFrom) {
        this.shipmentCreatedFrom = shipmentCreatedFrom;
    }

    public Date getBillOfLadingDateTo() {
        return billOfLadingDateTo;
    }

    public void setBillOfLadingDateTo(Date billOfLadingDateTo) {
        this.billOfLadingDateTo = billOfLadingDateTo;
    }

    public Date getEstimateArrivalDateAtPODFrom() {
        return estimateArrivalDateAtPODFrom;
    }

    public void setEstimateArrivalDateAtPODFrom(Date estimateArrivalDateAtPODFrom) {
        this.estimateArrivalDateAtPODFrom = estimateArrivalDateAtPODFrom;
    }

    public Date getEstimateArrivalDateAtPODTo() {
        return estimateArrivalDateAtPODTo;
    }

    public void setEstimateArrivalDateAtPODTo(Date estimateArrivalDateAtPODTo) {
        this.estimateArrivalDateAtPODTo = estimateArrivalDateAtPODTo;
    }

    public List<OrganisationalUnit> getOrganisationalUnitList() {
        return organisationalUnitList;
    }

    public void setOrganisationalUnitList(List<OrganisationalUnit> organisationalUnitList) {
        this.organisationalUnitList = organisationalUnitList;
    }

    public ServiceProvider getClearingAgent() {
        return clearingAgent;
    }

    public void setClearingAgent(ServiceProvider clearingAgent) {
        this.clearingAgent = clearingAgent;
    }

    public ServiceProvider getCarrier() {
        return carrier;
    }

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

    public FinalDestination getContainerFinalDestination() {
        return containerFinalDestination;
    }

    public void setContainerFinalDestination(FinalDestination containerFinalDestination) {
        this.containerFinalDestination = containerFinalDestination;
    }

    public DateRange getVesselBerthedDate() {
        return vesselBerthedDate;
    }

    public void setVesselBerthedDate(DateRange vesselBerthedDate) {
        this.vesselBerthedDate = vesselBerthedDate;
    }

    public DateRange getScheduledDepartureDate() {
        return scheduledDepartureDate;
    }

    public void setScheduledDepartureDate(DateRange scheduledDepartureDate) {
        this.scheduledDepartureDate = scheduledDepartureDate;
    }

    public DateRange getActualDateOfDeparture() {
        return actualDateOfDeparture;
    }

    public void setActualDateOfDeparture(DateRange actualDateOfDeparture) {
        this.actualDateOfDeparture = actualDateOfDeparture;
    }

    public DateRange getActualArrivalDateAtPOD() {
        return actualArrivalDateAtPOD;
    }

    public void setActualArrivalDateAtPOD(DateRange actualArrivalDateAtPOD) {
        this.actualArrivalDateAtPOD = actualArrivalDateAtPOD;
    }

    public String getItemReference() {
        return itemReference;
    }

    public void setItemReference(String itemReference) {
        this.itemReference = itemReference;
    }

    public String getItemDescription() {
        return itemDescription;
    }

    public void setItemDescription(String itemDescription) {
        this.itemDescription = itemDescription;
    }

    public String getSubShipmentReference() {
        return subShipmentReference;
    }

    public void setSubShipmentReference(String subShipmentReference) {
        this.subShipmentReference = subShipmentReference;
    }

    public String getHouseWayBillNumber() {
        return houseWayBillNumber;
    }

    public void setHouseWayBillNumber(String houseWayBillNumber) {
        this.houseWayBillNumber = houseWayBillNumber;
    }

    public DateRange getHouseWayBillDate() {
        return houseWayBillDate;
    }

    public void setHouseWayBillDate(DateRange houseWayBillDate) {
        this.houseWayBillDate = houseWayBillDate;
    }

    public DateRange getMasterAirwayBillIssueDate() {
        return MasterAirwayBillIssueDate;
    }

    public void setMasterAirwayBillIssueDate(DateRange masterAirwayBillIssueDate) {
        this.MasterAirwayBillIssueDate = masterAirwayBillIssueDate;
    }

    public DateRange getSettlementDate() {
        return settlementDate;
    }

    public void setSettlementDate(DateRange settlementDate) {
        this.settlementDate = settlementDate;
    }

    @Override
    public boolean noSelectedOrgUnit() {
        return ObjectUtil.allNull(organisationalUnit, organisationalUnitList);
    }

    public List<DocumentState> getCommercialInvoicingStates() {
        return commercialInvoicingStates;
    }

    public void setCommercialInvoicingStates(List<DocumentState> commercialInvoicingStates) {
        this.commercialInvoicingStates = commercialInvoicingStates;
    }

    public List<DocumentState> getServiceProviderInvoicingStates() {
        return serviceProviderInvoicingStates;
    }

    public void setServiceProviderInvoicingStates(List<DocumentState> serviceProviderInvoicingStates) {
        this.serviceProviderInvoicingStates = serviceProviderInvoicingStates;
    }

    public Date getSignedOffDateFrom() {
        return signedOffDateFrom;
    }

    public void setSignedOffDateFrom(Date signedOffDateFrom) {
        this.signedOffDateFrom = signedOffDateFrom;
    }

    public Date getSignedOffDateTo() {
        return signedOffDateTo;
    }

    public void setSignedOffDateTo(Date signedOffDateTo) {
        this.signedOffDateTo = signedOffDateTo;
    }

    public String getSARSReferenceNumber() {
        return SARSReferenceNumber;
    }

    public void setSARSReferenceNumber(String SARSReferenceNumber) {
        this.SARSReferenceNumber = SARSReferenceNumber;
    }

    public boolean isCanAffectCustomsDeclaration() {
        return canAffectCustomsDeclaration;
    }

    public void setCanAffectCustomsDeclaration(boolean canAffectCustomsDeclaration) {
        this.canAffectCustomsDeclaration = canAffectCustomsDeclaration;
    }

    public TimeUnit getTimeUnit() {
        return timeUnit;
    }

    public void setTimeUnit(TimeUnit timeUnit) {
        this.timeUnit = timeUnit;
    }

    public DateCalculationType getDateCalculationType() {
        return dateCalculationType;
    }

    public void setDateCalculationType(DateCalculationType dateCalculationType) {
        this.dateCalculationType = dateCalculationType;
    }

    public OrganisationalUnit[] getOrganisationalUnits() {
        return organisationalUnits;
    }

    public void setOrganisationalUnits(OrganisationalUnit[] organisationalUnits) {
        this.organisationalUnits = organisationalUnits;
    }

    public ShippingMode getShippingMode() {
        return shippingMode;
    }

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

    public ShipmentState[] getSelectedStates() {
        return selectedStates;
    }

    public void setSelectedStates(ShipmentState[] selectedStates) {
        this.selectedStates = selectedStates;
    }

    public boolean isHasClearingInstructions() {
        return hasClearingInstructions;
    }

    public void setHasClearingInstructions(boolean hasClearingInstructions) {
        this.hasClearingInstructions = hasClearingInstructions;
    }

    public boolean isHasCustomsDeclaration() {
        return hasCustomsDeclaration;
    }

    public void setHasCustomsDeclaration(boolean hasCustomsDeclaration) {
        this.hasCustomsDeclaration = hasCustomsDeclaration;
    }

    public boolean isHasCommercialInvoices() {
        return hasCommercialInvoices;
    }

    public void setHasCommercialInvoices(boolean hasCommercialInvoices) {
        this.hasCommercialInvoices = hasCommercialInvoices;
    }

    public Status[] getSelectedClearingStatus() {
        return selectedClearingStatus;
    }

    public void setSelectedClearingStatus(Status[] selectedClearingStatus) {
        this.selectedClearingStatus = selectedClearingStatus;
    }

    public RequiredType[] getSelectedRequiredTypes() {
        return selectedRequiredTypes;
    }

    public void setSelectedRequiredTypes(RequiredType[] selectedRequiredTypes) {
        this.selectedRequiredTypes = selectedRequiredTypes;
    }

    public OrganisationalUnit[] getSelectedOrganisationalUnits() {
        return selectedOrganisationalUnits;
    }

    public void setSelectedOrganisationalUnits(OrganisationalUnit[] selectedOrganisationalUnits) {
        this.selectedOrganisationalUnits = selectedOrganisationalUnits;
    }

    public DocumentState[] getSelectedCiStates() {
        return selectedCiStates;
    }

    public void setSelectedCiStates(DocumentState[] selectedCiStates) {
        this.selectedCiStates = selectedCiStates;
    }

    public DocumentType getDocumentType() {
        return documentType;
    }

    public void setDocumentType(DocumentType documentType) {
        this.documentType = documentType;
    }

    public DateRange getGrvDateRange() {
        return grvDateRange;
    }

    public void setGrvDateRange(DateRange grvDateRange) {
        this.grvDateRange = grvDateRange;
    }

    public boolean isNoConsignmentLinked() {
        return noConsignmentLinked;
    }

    public void setNoConsignmentLinked(boolean noConsignmentLinked) {
        this.noConsignmentLinked = noConsignmentLinked;
    }

    public String getShippingReference() {
        return shippingReference;
    }

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

    @Override
    public Collection<OrganisationalUnit> getOrganisationalUnits2() {
        return organisationalUnitList;
    }

    @Override
    public void setOrganisationalUnits2(List<OrganisationalUnit> organisationalUnits) {
        this.organisationalUnitList = organisationalUnits;
    }

    @Override
    public String toString() {
        StringJoiner sj = new StringJoiner(", ", "ShipmentSearch{", "}");

        addIfNotNull(sj, "signedOffDateRange", signedOffDateRange);
        addIfNotBlank(sj, "number", number);
        addIfNotBlank(sj, "reference", reference);
        addIfNotBlank(sj, "billOfLadingReference", billOfLadingReference);
        addIfNotBlank(sj, "masterAirwayBillNumber", masterAirwayBillNumber);
        addIfNotNull(sj, "state", state);
        addIfNotNull(sj, "applicableStates", applicableStates);
        addIfNotNull(sj, "event", event);
        addIfNotNull(sj, "mode", mode);
        addIfNotNull(sj, "multiModalShippingMode", multiModalShippingMode);

        addIfNotNull(sj, "warehouseDeliveryDateFrom", warehouseDeliveryDateFrom);
        addIfNotNull(sj, "warehouseDeliveryDateTo", warehouseDeliveryDateTo);
        addIfNotNull(sj, "createdDateFrom", createdDateFrom);
        addIfNotNull(sj, "createdDateTo", createdDateTo);

        addIfNotNull(sj, "buyer", Buyer != null ? Buyer.getFullName() : null);
        addIfNotNull(sj, "supplier", supplier != null ? supplier.getName() : null);
        addIfNotNull(sj, "freightForwarder", freightForwarder != null ? freightForwarder.getName() : null);
        addIfNotNull(sj, "carrier", carrier != null ? carrier.getName() : null);
        addIfNotEmpty(sj, "selectedRequiredTypes", selectedRequiredTypes);
        addIfNotEmpty(sj, "selectedCiStates", selectedCiStates);
        addIfNotEmpty(sj, "selectedStates", selectedStates);

        addIfNotNull(sj, "vesselName", vesselName);
        addIfNotNull(sj, "voyageNumber", voyageNumber);
        addIfNotNull(sj, "flightNumber", flightNumber);

        addIfNotNull(sj, "documentGroupState", documentGroupState);
        addIfNotNull(sj, "settlementDate", settlementDate);

        addIfNotNull(sj, "canAffectCustomsDeclaration", canAffectCustomsDeclaration);
        addIfNotNull(sj, "hasClearingInstructions", hasClearingInstructions);
        addIfNotNull(sj, "hasCustomsDeclaration", hasCustomsDeclaration);

        if (organisationalUnitList != null && !organisationalUnitList.isEmpty()) {
            sj.add("organisationalUnitList=" +
                    organisationalUnitList.stream()
                            .map(OrganisationalUnit::getName)
                            .collect(Collectors.joining(" : ")));
        }

        if (organisationalUnits != null && organisationalUnits.length > 0) {
            sj.add("organisationalUnits=" +
                    Arrays.stream(organisationalUnits)
                            .map(OrganisationalUnit::getName)
                            .collect(Collectors.joining(" : ")));
        }

        return sj.toString();
    }

    public boolean isOrderActualCostingReceipt() {
        return orderActualCostingReceipt;
    }

    public void setOrderActualCostingReceipt(boolean orderActualCostingReceipt) {
        this.orderActualCostingReceipt = orderActualCostingReceipt;
    }

}