Supplier.java

package com.tradecloud.domain.supplier;

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.tradecloud.common.externalreference.ExternalReference;
import com.tradecloud.domain.common.Currency;
import com.tradecloud.domain.dms.DocumentManagementHardCoding;
import com.tradecloud.domain.model.Customs;
import com.tradecloud.domain.model.DMSLinked;
import com.tradecloud.domain.model.payment.ActualPaymentBasis;
import com.tradecloud.domain.model.payment.PaymentMethod;
import com.tradecloud.domain.model.payment.PaymentTerm;
import com.tradecloud.domain.party.base.Address;
import com.tradecloud.domain.party.base.Contact;

import javax.persistence.*;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlID;
import javax.xml.bind.annotation.XmlRootElement;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import static javax.persistence.CascadeType.DETACH;
import static javax.persistence.CascadeType.PERSIST;

@Entity
@Table(name = "supplier")
@Access(AccessType.FIELD)
@XmlAccessorType(XmlAccessType.PROPERTY)
@XmlRootElement(name = "Supplier")
@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})
public class Supplier extends AbstractSupplier implements Comparable<Supplier>, DMSLinked, Customs {

    private static final long serialVersionUID = 1L;

    public Supplier() {
        super();
    }

    private String estimatedPaymentBasisPlaceHolder;
    @OneToMany(
            cascade = {PERSIST, DETACH},
            orphanRemoval = false
    )
    @JoinTable(
            name = "supplier_currencies",
            joinColumns = @JoinColumn(name = "supplier_id"),
            inverseJoinColumns = @JoinColumn(name = "currencies_code")
    )
    private Set<Currency> allowedCurrencies = new HashSet<>();

    private String valueDeterminationNumber;
    private String customsCode;

    public Set<Currency> getAllowedCurrencies() {
        return allowedCurrencies;
    }

    public void setAllowedCurrencies(Set<Currency> allowedCurrencies) {

        if (allowedCurrencies != null) {
            this.getAllowedCurrencies().clear();
            this.getAllowedCurrencies().addAll(allowedCurrencies);
        }
    }

    @Transient
    private List<String> orgUnits = new ArrayList<>();

    public Supplier(String name, String reference) {
        super(name);
        setExternalReference(reference);
    }

    public Supplier(PaymentTerm paymentTerm, PaymentMethod paymentMethod, ActualPaymentBasis actualPaymentBasis) {
        super();
        setPaymentTerm(paymentTerm);
        setPaymentMethod(paymentMethod);
        setActualPaymentBasis(actualPaymentBasis);
    }

    /**
     * Creates a supplier from an Integrated Supplier.
     */
    public Supplier(IntegratedSupplier integratedSupplier) {
        setCompanyRegistrationNumber(integratedSupplier.getCompanyRegistrationNumber());
        setExternalReference(integratedSupplier.getExternalReference());
        setSalesTaxRegistrationNumber(integratedSupplier.getSalesTaxRegistrationNumber());
        setVatRegistrationNumber(integratedSupplier.getVatRegistrationNumber());
        setWarehouseCode(integratedSupplier.getWarehouseCode());
        if (integratedSupplier.getPhysicalAddress() != null) {
            setPhysicalAddress(new Address(integratedSupplier.getPhysicalAddress()));
        }
        setPaymentMethod(integratedSupplier.getPaymentMethod());
        setPaymentTerm(integratedSupplier.getPaymentTerm());
        setSplitPayment(integratedSupplier.getSplitPayment());
        setEstimatedPaymentBasis(integratedSupplier.getEstimatedPaymentBasis());
        setEstimatedPaymentBasis2(integratedSupplier.getEstimatedPaymentBasis2());
        setPaymentBasisPercentage(integratedSupplier.getPaymentBasisPercentage());
        setPaymentBasis2Percentage(integratedSupplier.getPaymentBasis2Percentage());
        setPaymentTermDays(integratedSupplier.getPaymentTermDays());
        setActualPaymentBasis(integratedSupplier.getActualPaymentBasis());
        setCurrency(integratedSupplier.getCurrency());
        setIncoterm(integratedSupplier.getIncoterm());
        setUnitPricePerItem(integratedSupplier.getUnitPricePerItem());
        setFreightForwarder(integratedSupplier.getFreightForwarder());
        setClearingAgent(integratedSupplier.getClearingAgent());
        setTransporter(integratedSupplier.getTransporter());
        setAllowPartShipment(integratedSupplier.getAllowPartShipment());
        setAllowTransShipment(integratedSupplier.getAllowTransShipment());
        setLcToleranceAbove(integratedSupplier.getLcToleranceAbove());
        setLcToleranceBelow(integratedSupplier.getLcToleranceBelow());
        setName(integratedSupplier.getName());
        setPlaceOfExpiry(integratedSupplier.getPlaceOfExpiry());
        if (integratedSupplier.getPostalAddress() != null) {
            setPostalAddress(new Address(integratedSupplier.getPostalAddress()));
        }
        if (!integratedSupplier.getContacts().isEmpty()) {
            if (integratedSupplier.getContacts().get(0) != null) {
                getContacts().add(new Contact(integratedSupplier.getContacts().get(0)));
            }
        }
        setPresentationDays(integratedSupplier.getPresentationDays());
        setAdvisingBank(integratedSupplier.getAdvisingBank());
        setNominatedBank(integratedSupplier.getNominatedBank());
        setIntegrated(Boolean.TRUE); // Will always be true
        setActive(integratedSupplier.getActive());
        setState(integratedSupplier.getState());
        setType(integratedSupplier.getType());
        setPlaceOfLoading(integratedSupplier.getPlaceOfLoading());
        setEarlySettlementDisc(integratedSupplier.getEarlySettlementDisc());

        for (ExternalReference er : integratedSupplier.getExternalReferences()) {
            addExternalReference(new ExternalReference(er.getIntegratedSystem(), er.getReferenceValue()));
        }
    }

    @Override
    public int compareTo(Supplier supplier) {
        if (getName() != null) {
            if (getName().compareTo(supplier.getName()) != 0) {
                return getName().compareTo(supplier.getName());
            }
        }
        return 0;
    }

    @XmlID
    @Override
    public String getName() {
        return super.getName();
    }

    public List<String> getOrgUnits() {
        return orgUnits;
    }

    public void setOrgunits(List<String> orgUnits) {
        this.orgUnits = orgUnits;
    }

    public String getSupplierNameAndRef() {
        return getName() + " - " + getExternalReference();
    }

    public String getEstimatedPaymentBasisPlaceHolder() {
        return estimatedPaymentBasisPlaceHolder;
    }

    public void setEstimatedPaymentBasisPlaceHolder(String estimatedPaymentBasisPlaceHolder) {
        this.estimatedPaymentBasisPlaceHolder = estimatedPaymentBasisPlaceHolder;
    }

    public String getValueDeterminationNumber() {
        return valueDeterminationNumber;
    }

    public void setValueDeterminationNumber(String valueDeterminationNumber) {
        this.valueDeterminationNumber = valueDeterminationNumber;
    }

    @Override
    public String getCustomsCode() {
        return customsCode;
    }

    @Override
    public void setCustomsCode(String customsCode) {
        this.customsCode = customsCode;
    }

    @Override
    public String getDocumentGroupName() {
        return DocumentManagementHardCoding.SUPPLIER.name();
    }

    @Override
    public String getDMSKey() {
        return new StringBuilder().append(getId()).toString();
    }

    @Override
    public String getReference() {
        return externalReference;
    }
}