Bank.java

package com.tradecloud.domain.party;

import com.tradecloud.domain.BankTransactionLimit;
import com.tradecloud.domain.party.base.Company;
import org.apache.commons.lang.builder.EqualsBuilder;
import org.apache.commons.lang.builder.HashCodeBuilder;

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

@Entity
@Access(AccessType.FIELD)
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "Bank")
@Table(name = "bank", uniqueConstraints = {@UniqueConstraint(columnNames = {"name"})})
public class Bank extends Company implements Comparable<Bank> {

    private static final long serialVersionUID = 1L;

    /*
     * TODO - Code should be non-null and we should be using the international bank identification codes AFAIK
     */
    private String code; // Not really used... EACH bank does have an international bank reference that is unique around the world. Probs a bit
    // overkill for our stage and i'm not sure we'd ever need it. They seem to only care about a name for display purposes
    private String swiftCode;
    private String branchCode;
    private BankDetailsSimple bankDetails;
    private String customsCode;

    @Transient
    @XmlTransient
    private Set<BankTransactionLimit> buyLimits = new HashSet<BankTransactionLimit>();

    @Transient
    @XmlTransient
    private Set<BankTransactionLimit> sellLimits = new HashSet<BankTransactionLimit>();

    @Embedded
    private LetterOfCreditDetails lcDetails = new LetterOfCreditDetails();

    private boolean letterOfCreditProvider;

    public Bank(String name) {
        super(name);
    }

    public Bank() {
    }

    public String getSwiftCode() {
        return swiftCode;
    }

    public void setSwiftCode(String swiftCode) {
        this.swiftCode = swiftCode;
    }

    public String getBranchCode() {
        return branchCode;
    }

    public void setBranchCode(String branchCode) {
        this.branchCode = branchCode;
    }

    public Set<BankTransactionLimit> getBuyLimits() {
        return buyLimits;
    }

    public void setBuyLimits(Set<BankTransactionLimit> buyLimits) {
        this.buyLimits = buyLimits;
    }

    public Set<BankTransactionLimit> getSellLimits() {
        return sellLimits;
    }

    public void setSellLimits(Set<BankTransactionLimit> sellLimits) {
        this.sellLimits = sellLimits;
    }

    public BankDetailsSimple getBankDetails() {
        return bankDetails;
    }

    public void setBankDetails(BankDetailsSimple bankDetails) {
        this.bankDetails = bankDetails;
    }

    public String getCode() {
        return code;
    }

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

    public LetterOfCreditDetails getLcDetails() {
        return lcDetails;
    }

    public void setLcDetails(LetterOfCreditDetails lcDetails) {
        this.lcDetails = lcDetails;
    }

    @Override
    public int compareTo(Bank otherBank) {
        return getName().compareTo(otherBank.getName());
    }

    @Override
    public int hashCode() {
        return new HashCodeBuilder().appendSuper(super.hashCode()).append(code).append(swiftCode).append(branchCode).toHashCode();
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (!(obj instanceof Bank)) {
            return false;
        }
        Bank other = (Bank) obj;
        return new EqualsBuilder().appendSuper(super.equals(other)).append(code, other.code).append(swiftCode, other.swiftCode)
                .append(branchCode, other.branchCode).isEquals();
    }

    public boolean isLetterOfCreditProvider() {
        return letterOfCreditProvider;
    }

    public void setLetterOfCreditProvider(boolean letterOfCreditProvider) {
        this.letterOfCreditProvider = letterOfCreditProvider;
    }

    public String getCustomsCode() {
        return customsCode;
    }

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