CreditorBillingRule.java

package com.tradecloud.domain.creditorbilling.rule;

import com.tradecloud.domain.ValueLookupBase;
import com.tradecloud.domain.common.Incoterm;
import com.tradecloud.domain.container.ContainerType;
import com.tradecloud.domain.costing.CostLine;
import com.tradecloud.domain.creditorbilling.transaction.CreditorBillingTransactionType;
import com.tradecloud.domain.model.shipment.ShippingMode;
import com.tradecloud.domain.party.ServiceProvider;
import com.tradecloud.domain.party.ServiceProviderType;
import org.apache.commons.lang.builder.EqualsBuilder;
import org.apache.commons.lang.builder.HashCodeBuilder;
import org.apache.commons.lang.builder.ToStringBuilder;
import org.hibernate.annotations.ForeignKey;

import javax.persistence.*;
import javax.validation.constraints.NotNull;
import java.util.ArrayList;
import java.util.List;

/**
 * @author jon
 */
@Entity
@Table(uniqueConstraints = {
        @UniqueConstraint(columnNames = {"creditorBillingRuleType", "carrier_id", "shippingMode", "incoterm_code",
                "freightForwarder_id", "containerType_code", "effectiveDate"})})
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@Access(AccessType.FIELD)
public class CreditorBillingRule extends ValueLookupBase {

    @NotNull
    @Enumerated(EnumType.STRING)
    private CreditorBillingTransactionType creditorBillingRuleType;

    @ManyToOne
    @ForeignKey(name = "fk_carrier")
    private ServiceProvider carrier;

    @NotNull(message = "Freight forwarder is required")
    @ManyToOne
    @ForeignKey(name = "fk_freightforwarder")
    private ServiceProvider freightForwarder;

    @NotNull(message = "Incoterm is required")
    @ManyToOne
    @ForeignKey(name = "fk_incoterm")
    private Incoterm incoterm;

    @ManyToOne
    @ForeignKey(name = "fk_containertype")
    private ContainerType containerType;

    @NotNull(message = "Shipping mode is required")
    @Enumerated(EnumType.STRING)
    private ShippingMode shippingMode;

    @ManyToMany
    @ForeignKey(name = "fk_creditorbillingrule_id", inverseName = "costlines_id")
    private List<CostLine> costLines = new ArrayList<CostLine>();

    @NotNull
    @Enumerated(EnumType.STRING)
    @Column(name = "counterpartyrole")
    protected ServiceProviderType counterPartyRole;

    public ServiceProvider getCarrier() {
        return carrier;
    }

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

    public ServiceProvider getFreightForwarder() {
        return freightForwarder;
    }

    public void setFreightForwarder(ServiceProvider freightForwarder) {
        this.freightForwarder = freightForwarder;
    }

    public Incoterm getIncoterm() {
        return incoterm;
    }

    public void setIncoterm(Incoterm incoterm) {
        this.incoterm = incoterm;
    }

    public ContainerType getContainerType() {
        return containerType;
    }

    public void setContainerType(ContainerType containerType) {
        this.containerType = containerType;
    }

    public ShippingMode getShippingMode() {
        return shippingMode;
    }

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

    public List<CostLine> getCostLines() {
        return costLines;
    }

    public void setCostLines(List<CostLine> costLines) {
        this.costLines = costLines;
    }

    public CreditorBillingTransactionType getCreditorBillingRuleType() {
        return creditorBillingRuleType;
    }

    public void setCreditorBillingRuleType(CreditorBillingTransactionType creditorBillingRuleType) {
        this.creditorBillingRuleType = creditorBillingRuleType;
    }

    public ServiceProviderType getCounterPartyRole() {
        return counterPartyRole;
    }

    public void setCounterPartyRole(ServiceProviderType counterPartyRole) {
        this.counterPartyRole = counterPartyRole;
    }

    @Override
    public int hashCode() {
        return new HashCodeBuilder().append(creditorBillingRuleType).append(carrier).append(freightForwarder).
                append(shippingMode).append(incoterm).append(containerType).toHashCode();
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (!(obj instanceof CreditorBillingRule)) {
            return false;
        }
        CreditorBillingRule other = (CreditorBillingRule) obj;
        return new EqualsBuilder().append(creditorBillingRuleType, other.creditorBillingRuleType).append(carrier, other.carrier).
                append(shippingMode, other.shippingMode).append(incoterm, other.incoterm).append(containerType, other.containerType)
                .append(freightForwarder, other.freightForwarder).isEquals();
    }

    @Override
    public String toString() {
        return new ToStringBuilder(this).append(creditorBillingRuleType).append(containerType).append(carrier).append(freightForwarder)
                .append(shippingMode).append(incoterm).toString();
    }
}