ProductSearch.java

package com.tradecloud.dto.product;

import com.tradecloud.domain.base.utils.ObjectUtil;
import com.tradecloud.domain.common.Currency;
import com.tradecloud.domain.common.ProductProperty;
import com.tradecloud.domain.dto.base.SearchBase;
import com.tradecloud.domain.item.*;
import com.tradecloud.domain.model.ordermanagement.OrderType;
import com.tradecloud.domain.model.ordermanagement.ProductSearchOrderByType;
import com.tradecloud.domain.model.ordermanagement.ProductState;
import com.tradecloud.domain.model.organisationalunit.OrganisationalUnit;
import com.tradecloud.domain.place.Country;
import com.tradecloud.domain.search.OrgUnitFilter;
import com.tradecloud.domain.supplier.OrganisationalUnitSupplier;
import com.tradecloud.domain.supplier.Supplier;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;

import java.io.Serializable;
import java.util.*;

@Component
@Scope("view")
public class ProductSearch extends SearchBase implements Serializable, OrgUnitFilter {

    private static final long serialVersionUID = 1L;
    public static String BOTH_IMPORT_AND_EXPORT ="ImportAndExport";
    public static String IMPORT ="Import";
    public static String EXPORT ="Export";
    private ProductCategory productCategory;
    private ProductSubCategory productSubCategory;
    private String code;
    private String description;
    private String supplierReference;
    private String tariffStatus;
    private ProductState state;
    private boolean isTariffed;
    private Currency currency;
    private List<Currency> currencyList;
    private OrganisationalUnitSupplier supplier;
    private List<OrganisationalUnitSupplier> suppliers;
    private OrganisationalUnit organisationalUnit;
    private List<OrganisationalUnit> organisationalUnits;
    private Country countryOfOrigin;
    private List<Country> countryOfOriginList;
    private Date fromDate;
    private Date toDate;
    private String schedule1Part1;
    private String schedule1Part2A;
    private String schedule1Part2B;
    private String schedule2Part1;
    private String schedule2Part2;
    private String schedule1Part3E;
    private String schedule1Part7;
    private Supplier elcSupplier;
    private List<Long> productIdList;
    private String productFlag;
    private String styleReference;
    private String complete = "";
    private boolean isStyleUser;
    private boolean liteSearch;
    private boolean unique;
    private List<Product.Type> types;
    private String notes;
    private String schedule3Part1;
    private String schedule4Part1;
    private boolean exactMatch;
    private List<ProductProperty> productPropertyList;
    private String sadc;
    private HomologationStatus homologationStatus;
    private List<HomologationStatus> homologationStatuses;
    private List<HomologationStatus> exludeHomologationStatuses;

    public String getStyleReference() {
        return styleReference;
    }

    public void setStyleReference(String styleReference) {
        this.styleReference = styleReference;
    }

    private String styleDescription;

    public String getStyleDescription() {
        return styleDescription;
    }

    public void setStyleDescription(String styleDescription) {
        this.styleDescription = styleDescription;
    }

    public String getProductFlag() {
        return productFlag;
    }

    public void setProductFlag(String productFlag) {
        this.productFlag = productFlag;
    }

    public ProductCategory getProductCategory() {
        return productCategory;
    }

    public void setProductCategory(ProductCategory productCategory) {
        this.productCategory = productCategory;
    }

    public ProductSubCategory getProductSubCategory() {
        return productSubCategory;
    }

    public void setProductSubCategory(ProductSubCategory productSubCategory) {
        this.productSubCategory = productSubCategory;
    }

    public String getNotes() {
        return notes;
    }

    public void setNotes(String notes) {
        this.notes = notes;
    }

    // Need to set a default search by
    // Use SearchMetaParams instead
    @Deprecated
    private ProductSearchOrderByType orderBy = ProductSearchOrderByType.CODE;

    public ProductSearch() {
    }

    public ProductSearch(Product product) {
        this.code = product.getCode();
        this.description = product.getDescription();
        this.supplierReference = product.getSupplierReference();
        this.fromDate = product.getCreated();
        this.currency = product.getCurrency();
        this.supplier = product.getSupplier();
        this.organisationalUnit = product.getOrganisationalUnit();
        this.countryOfOrigin = product.getCountryOfOrigin();
        this.productCategory = product.getProductCategory();
        this.productSubCategory = product.getProductSubCategory();
        product.getSchedule1Part1A().getTariffHeading().getTariffHeading();
    }

    public static ProductSearch uniqueSearch(AbstractItem product) {
        ProductSearch ps = new ProductSearch();
        ps.code = product.getCode() != null ? product.getCode().trim() : null;
        ps.supplier = product.getSupplier();
        ps.organisationalUnit = product.getOrganisationalUnit();
        ps.countryOfOrigin = product.getCountryOfOrigin();
        return ps;
    }

    /**
     * FDH 200, an import product is unique using code, supplier and org unit. COO is not relevant.
     *
     * @param product
     * @return
     */
    public static ProductSearch uniqueExportSearch(AbstractItem product) {
        ProductSearch ps = getProductSearch(product);
        ps.organisationalUnit = product.getOrganisationalUnit();
        return ps;
    }

    public static ProductSearch getProductSearch(ItemInterface product) {
        ProductSearch ps = new ProductSearch();
        ps.code = product.getCode() != null ? product.getCode().trim() : null;
        ps.supplier = product.getSupplier();
        ps.productFlag = "Export";
        return ps;
    }

    public static ProductSearch uniqueSearch(AbstractItem product, OrderType orderType) {
        ProductSearch ps = new ProductSearch();
        ps.code = product.getCode() != null ? product.getCode().trim() : null;
        ps.supplier = product.getSupplier();
        ps.organisationalUnit = product.getOrganisationalUnit();
        ps.countryOfOrigin = product.getCountryOfOrigin();
        if (OrderType.SALES_ORDER.equals(orderType)) {
            ps.setProductFlag("Export");
        } else {
            ps.setProductFlag("Import");
        }
        return ps;
    }

    public static ProductSearch uniqueSearch(Product product) {
        ProductSearch ps = new ProductSearch();
        ps.code = product.getCode() != null ? product.getCode().trim() : null;
        ps.supplier = product.getSupplier();
        ps.organisationalUnit = product.getOrganisationalUnit();
        ps.countryOfOrigin = product.getCountryOfOrigin();
        ps.setTypes(Arrays.asList(product.getType()));
        if (product.isExportProduct()) {
            ps.setProductFlag("Export");
        } else {
            ps.setProductFlag("Import");
        }
        ps.setUnique(true);
        return ps;
    }

    public static ProductSearch uniqueSearchSupplierReference(AbstractItem product) {
        ProductSearch ps = new ProductSearch();
        // ps.code = product.getSupplierReference();
        ps.supplierReference = product.getSupplierReference();
        ps.supplier = product.getSupplier();
        ps.organisationalUnit = product.getOrganisationalUnit();
        ps.countryOfOrigin = product.getCountryOfOrigin();
        return ps;
    }

    public static ProductSearch uniqueSearchSupplierReferenceExport(AbstractItem product) {
        ProductSearch ps = new ProductSearch();
        // ps.code = product.getSupplierReference();
        ps.supplierReference = product.getSupplierReference();
        ps.supplier = product.getSupplier();
        ps.organisationalUnit = product.getOrganisationalUnit();
        return ps;
    }

    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }

    public String getDescription() {
        return description;
    }

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

    public String getSupplierReference() {
        return supplierReference;
    }

    public void setSupplierReference(String supplierReference) {
        this.supplierReference = supplierReference;
    }

    public Currency getCurrency() {
        return currency;
    }

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

    public OrganisationalUnitSupplier getSupplier() {
        return supplier;
    }

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

    public OrganisationalUnit getOrganisationalUnit() {
        return organisationalUnit;
    }

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

    public List<OrganisationalUnit> getOrganisationalUnits() {
        return organisationalUnits;
    }

    public void setOrganisationalUnits(List<OrganisationalUnit> organisationalUnits) {
        this.organisationalUnits = organisationalUnits;
    }

    public Country getCountryOfOrigin() {
        return countryOfOrigin;
    }

    public void setCountryOfOrigin(Country countryOfOrigin) {
        this.countryOfOrigin = countryOfOrigin;
    }

    @Override
    public String toString() {
        StringBuilder sb = new StringBuilder();
        sb.append("code=").append(code).append(",description=").append(description).append(",supplierReference=").append(supplierReference)
                .append(",currency=").append(currency).append(",supplier=").append(supplier != null ? supplier.getName() : null)
                .append(",organisationalUnit=").append(organisationalUnit != null ? organisationalUnit.getCode() : null).append(",countryOfOrigin=")
                .append(countryOfOrigin != null ? countryOfOrigin.getCode() : null);
        if (organisationalUnits != null) {
            sb.append(",organisationalUnits=");
            for (OrganisationalUnit organisationalUnit : organisationalUnits) {
                sb.append(organisationalUnit.getName());
            }
        }
        return sb.toString();
    }

    public Date getFromDate() {
        return fromDate;
    }

    public void setFromDate(Date fromDate) {
        this.fromDate = fromDate;
    }

    public Date getToDate() {
        return toDate;
    }

    public void setToDate(Date toDate) {
        this.toDate = toDate;
    }

    public ProductSearchOrderByType getOrderBy() {
        return orderBy;
    }

    public void setOrderBy(ProductSearchOrderByType orderBy) {
        this.orderBy = orderBy;
    }

    public boolean isTariffed() {
        return isTariffed;
    }

    public void setTariffed(boolean tariffed) {
        isTariffed = tariffed;
    }

    public ProductState getState() {
        return state;
    }

    public void setState(ProductState tariffStatus) {
        this.state = tariffStatus;
    }

    public String getTariffStatus() {
        return tariffStatus;
    }

    public void setTariffStatus(String tariffStatus) {
        this.tariffStatus = tariffStatus;
    }

    public String getSchedule2Part2() {
        return schedule2Part2;
    }

    public void setSchedule2Part2(String schedule2Part2) {
        this.schedule2Part2 = schedule2Part2;
    }

    public String getSchedule1Part1() {
        return schedule1Part1;
    }

    public void setSchedule1Part1(String schedule1Part1) {
        this.schedule1Part1 = schedule1Part1;
    }

    public String getSchedule1Part2A() {
        return schedule1Part2A;
    }

    public void setSchedule1Part2A(String schedule1Part2A) {
        this.schedule1Part2A = schedule1Part2A;
    }

    public String getSchedule1Part2B() {
        return schedule1Part2B;
    }

    public void setSchedule1Part2B(String schedule1Part2B) {
        this.schedule1Part2B = schedule1Part2B;
    }

    public String getSchedule2Part1() {
        return schedule2Part1;
    }

    public void setSchedule2Part1(String schedule2Part1) {
        this.schedule2Part1 = schedule2Part1;
    }

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

    public Supplier getElcSupplier() {
        return elcSupplier;
    }

    public void setElcSupplier(Supplier elcSupplier) {
        this.elcSupplier = elcSupplier;
    }

    public void addProduct(Long productId) {
        if (null == productIdList) {
            productIdList = new ArrayList<Long>();
        }
        productIdList.add(productId);
    }

    public List<Long> getProductIdList() {
        return productIdList;
    }

    public void setProductIdList(List<Long> productIdList) {
        this.productIdList = productIdList;
    }

    public String getComplete() {
        return complete;
    }

    public void setComplete(String complete) {
        this.complete = complete;
    }

    public boolean isStyleUser() {
        return isStyleUser;
    }

    public void setStyleUser(boolean styleUser) {
        isStyleUser = styleUser;
    }

    public String getSchedule1Part3E() {
        return schedule1Part3E;
    }

    public void setSchedule1Part3E(String schedule1Part3E) {
        this.schedule1Part3E = schedule1Part3E;
    }

    public String getSchedule1Part7() {
        return schedule1Part7;
    }

    public void setSchedule1Part7(String schedule1Part7) {
        this.schedule1Part7 = schedule1Part7;
    }

    public boolean isLiteSearch() {
        return liteSearch;
    }

    public void setLiteSearch(boolean liteSearch) {
        this.liteSearch = liteSearch;
    }

    public boolean isUnique() {
        return unique;
    }

    public void setUnique(boolean unique) {
        this.unique = unique;
    }

    public List<Currency> getCurrencyList() {
        return currencyList;
    }

    public void setCurrencyList(List<Currency> currencyList) {
        this.currencyList = currencyList;
    }

    public List<OrganisationalUnitSupplier> getSuppliers() {
        return suppliers;
    }

    public void setSuppliers(List<OrganisationalUnitSupplier> suppliers) {
        this.suppliers = suppliers;
    }

    public List<Country> getCountryOfOriginList() {
        return countryOfOriginList;
    }

    public void setCountryOfOriginList(List<Country> countryOfOriginList) {
        this.countryOfOriginList = countryOfOriginList;
    }

    public List<Product.Type> getTypes() {
        if (types == null) {
            types = new ArrayList<>();
        }
        return types;
    }

    public void setTypes(List<Product.Type> types) {
        this.types = types;
    }

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

    public String getSchedule3Part1() {
        return schedule3Part1;
    }

    public void setSchedule3Part1(String schedule3Part1) {
        this.schedule3Part1 = schedule3Part1;
    }

    public String getSchedule4Part1() {
        return schedule4Part1;
    }

    public void setSchedule4Part1(String schedule4Part1) {
        this.schedule4Part1 = schedule4Part1;
    }

    public boolean isExactMatch() {
        return exactMatch;
    }

    public void setExactMatch(boolean exactMatch) {
        this.exactMatch = exactMatch;
    }

    public List<ProductProperty> getProductPropertyList() {
        return productPropertyList;
    }

    public void setProductPropertyList(List<ProductProperty> productPropertyList) {
        this.productPropertyList = productPropertyList;
    }

    public String getSadc() {
        return sadc;
    }

    public void setSadc(String sadc) {
        this.sadc = sadc;
    }

    public void setOrganisationalUnits2(List<OrganisationalUnit> organisationalUnits) {
       setOrganisationalUnits(organisationalUnits);
    }

    public Collection<OrganisationalUnit> getOrganisationalUnits2() {
       return getOrganisationalUnits();
    }

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

    public HomologationStatus getHomologationStatus() {
        return homologationStatus;
    }

    public void setHomologationStatus(HomologationStatus homologationStatus) {
        this.homologationStatus = homologationStatus;
    }

    public List<HomologationStatus> getHomologationStatuses() {
        return homologationStatuses;
    }

    public void setHomologationStatuses(List<HomologationStatus> homologationStatuses) {
        this.homologationStatuses = homologationStatuses;
    }

    public List<HomologationStatus> getExludeHomologationStatuses() {
        return exludeHomologationStatuses;
    }

    public void setExludeHomologationStatuses(List<HomologationStatus> exludeHomologationStatuses) {
        this.exludeHomologationStatuses = exludeHomologationStatuses;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (!(o instanceof ProductSearch that)) return false;
        return Objects.equals(getCode(), that.getCode()) && Objects.equals(getOrganisationalUnit(), that.getOrganisationalUnit())
                && Objects.equals(getCountryOfOrigin(), that.getCountryOfOrigin())
                && Objects.equals(getProductFlag(), that.getProductFlag())
                && Objects.equals(getSupplier(), that.getSupplier());
    }

    @Override
    public int hashCode() {
        return Objects.hash(getCode(), getOrganisationalUnit(), getCountryOfOrigin(), getProductFlag(),getSupplier());
    }
}