Payment.java

package com.tradecloud.domain.settlement;

import com.tradecloud.common.base.PersistenceBase;
import com.tradecloud.domain.common.Currency;
import com.tradecloud.domain.document.invoice.CommercialInvoice;
import com.tradecloud.domain.document.invoice.CostsInvoice;
import com.tradecloud.domain.document.invoice.ServiceProviderInvoice;
import com.tradecloud.domain.model.payment.PaymentMethod;
import com.tradecloud.domain.treasury.TreasuryBank;
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.xml.bind.annotation.*;
import java.math.BigDecimal;
import java.util.Date;

@Entity
@Table(name = "payment")
@Access(AccessType.FIELD)
@NamedQueries({
        @NamedQuery(name = "payment.findByPlannedSettlement",
                query = "from Payment payment where payment.plannedSettlement=:plannedSettlement order by created"),
        @NamedQuery(name = "payment.findAllByOrders",
                query = "from Payment as payment, Order as ord where payment.plannedSettlement in elements(ord.plannedSettlements) and "
                        + "ord.id in (:orderIds) order by payment.paymentDate")})
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "Payment")
public class Payment extends PersistenceBase {

    private static final long serialVersionUID = 1L;
    @ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    @XmlElement(name = "ServiceProviderInvoice")
    private ServiceProviderInvoice indirectCostsInvoice;

    @ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    @XmlElement(name = "CommercialInvoice")
    private CommercialInvoice commercialInvoice;

    @ManyToOne
    @ForeignKey(name = "fk_plannedsettlement")
    @XmlElement(name = "PlannedSettlement")
    private PlannedSettlement plannedSettlement;

    @XmlAttribute
    private String reference;
    @XmlAttribute
    private Date dateCreated;
    @XmlAttribute
    private Date paymentDate;
    @ManyToOne
    @ForeignKey(name = "fk_currency")
    @XmlElement
    private Currency currency;
    @XmlAttribute
    private BigDecimal spotROE;
    @XmlAttribute
    private Date spotDate;
    @XmlAttribute
    private BigDecimal amount;
    @XmlAttribute
    private BigDecimal bankCharges; // in costing currency
    @XmlAttribute
    private BigDecimal discount;
    @XmlAttribute
    private String comments;
    @ManyToOne
    @XmlElement
    @ForeignKey(name = "fk_paymentmethod")
    private PaymentMethod paymentMethod;
    @XmlAttribute
    private boolean authorised;
    @ManyToOne(fetch = FetchType.LAZY)
    @ForeignKey(name = "fk_linkedPayment")
    @XmlElement(name = "linkedPayment")
    private Payment linkedPayment;
    private Long reallocationSourceId;
    private Long reallocationDestinationId;
    private String erpPaymentId;
    private transient CostsInvoice creditNote;
    @Enumerated(EnumType.STRING)
    private Type type = Type.PAYMENT;

    @XmlType(name = "Type", namespace = "http://www.tradecloud.com/schema/accounting")
    public enum Type {
        PAYMENT, REALLOCATION, REVERSAL, REALLOCATION_REVERSAL;
    }

    @ManyToOne
    @JoinColumn(name = "nominatedBank_code")
    private TreasuryBank nominatedBank;

    private String username;

    public Payment() {
    }

    public ServiceProviderInvoice getIndirectCostsInvoice() {
        return indirectCostsInvoice;
    }

    public void setIndirectCostsInvoice(ServiceProviderInvoice indirectCostsInvoice) {
        this.indirectCostsInvoice = indirectCostsInvoice;
    }

    public CommercialInvoice getCommercialInvoice() {
        return commercialInvoice;
    }

    public void setCommercialInvoice(CommercialInvoice commercialInvoice) {
        this.commercialInvoice = commercialInvoice;
    }

    public PlannedSettlement getPlannedSettlement() {
        return plannedSettlement;
    }

    public void setPlannedSettlement(PlannedSettlement plannedSettlement) {
        this.plannedSettlement = plannedSettlement;
    }

    public String getReference() {
        return reference;
    }

    public void setReference(String reference) {
        this.reference = reference;
    }

    public Date getDateCreated() {
        return dateCreated;
    }

    public void setDateCreated(Date dateCreated) {
        this.dateCreated = dateCreated;
    }

    public Date getPaymentDate() {
        return paymentDate;
    }

    public void setPaymentDate(Date paymentDate) {
        this.paymentDate = paymentDate;
    }

    public Currency getCurrency() {
        return currency;
    }

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

    public BigDecimal getSpotROE() {
        return spotROE;
    }

    public void setSpotROE(BigDecimal spotROE) {
        this.spotROE = spotROE;
    }

    public Date getSpotDate() {
        return spotDate;
    }

    public void setSpotDate(Date spotDate) {
        this.spotDate = spotDate;
    }

    public BigDecimal getAmount() {
        return amount;
    }

    public void setAmount(BigDecimal amount) {
        this.amount = amount;
    }

    public BigDecimal getBankCharges() {
        return bankCharges;
    }

    public void setBankCharges(BigDecimal bankCharges) {
        this.bankCharges = bankCharges;
    }

    public BigDecimal getDiscount() {
        return discount;
    }

    public void setDiscount(BigDecimal discount) {
        this.discount = discount;
    }

    public String getComments() {
        return comments;
    }

    public void setComments(String comments) {
        this.comments = comments;
    }

    public PaymentMethod getPaymentMethod() {
        return paymentMethod;
    }

    public void setPaymentMethod(PaymentMethod paymentMethod) {
        this.paymentMethod = paymentMethod;
    }

    public boolean isAuthorised() {
        return authorised;
    }

    public void setAuthorised(boolean authorised) {
        this.authorised = authorised;
    }

    public Payment getLinkedPayment() {
        return linkedPayment;
    }

    public void setLinkedPayment(Payment linkedPayment) {
        this.linkedPayment = linkedPayment;
    }

    public CostsInvoice getCreditNote() {
        return creditNote;
    }

    public void setCreditNote(CostsInvoice creditNote) {
        this.creditNote = creditNote;
    }

    public TreasuryBank getNominatedBank() {
        return nominatedBank;
    }

    public void setNominatedBank(TreasuryBank nominatedBank) {
        this.nominatedBank = nominatedBank;
    }

    @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }
        if (this == obj) {
            return true;
        }
        if (!(obj instanceof Payment)) {
            return false;
        }
        Payment other = (Payment) obj;
        return new EqualsBuilder().append(created, other.created).append(amount, other.amount).append(paymentDate, other.paymentDate)
                .append(plannedSettlement, other.plannedSettlement).isEquals();
    }

    @Override
    public int hashCode() {
        return new HashCodeBuilder().append(created).append(amount).append(paymentDate).append(plannedSettlement).toHashCode();
    }

    @Override
    public String toString() {
        return new ToStringBuilder(this).append(amount).append(paymentDate).append(plannedSettlement).append(nominatedBank).toString();
    }

    public Long getReallocationSourceId() {
        return reallocationSourceId;
    }

    public void setReallocationSourceId(Long reallocationSourceId) {
        this.reallocationSourceId = reallocationSourceId;
    }

    public Long getReallocationDestinationId() {
        return reallocationDestinationId;
    }

    public void setReallocationDestinationId(Long reallocationDestinationId) {
        this.reallocationDestinationId = reallocationDestinationId;
    }

    public String getErpPaymentId() {
        return erpPaymentId;
    }

    public void setErpPaymentId(String erpPaymentId) {
        this.erpPaymentId = erpPaymentId;
    }

    public Type getType() {
        return type;
    }

    public void setType(Type type) {
        this.type = type;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }
}