PlannedSettlementOrder.java

package com.tradecloud.domain.settlement;

import com.tradecloud.domain.document.PaymentState;
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.OptimisticLockType;

import javax.persistence.*;
import javax.validation.constraints.NotNull;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlRootElement;
import java.math.BigDecimal;
import java.util.Date;

/**
 * An entity that shows a breakdown value for an order on a planned settlement.  This entity doesn't have any lifecyle outside its parent
 * PlannedSettlement.
 *
 * This entity has several fields in common with a PlannedSettlement.   There might be a case to scrap it and simply use a composition of
 * PlannedSettlements inside the parent PlannedSettlement.  That would involve refactoring to extract the common stuff first though.
 */
@Entity
@org.hibernate.annotations.Entity(optimisticLock = OptimisticLockType.NONE)
@Table(name = "plannedsettlementorder")
@Access(AccessType.FIELD)
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "PlannedSettlementOrder")
public class PlannedSettlementOrder extends PlannedSettlementDetail {

    private static final long serialVersionUID = 1L;

    /**
     * The bidirectional link back to the parent {@link PlannedSettlement}.
     */
    @ManyToOne(optional = false)
    private PlannedSettlement plannedSettlement;

    @NotNull
    @XmlAttribute(required = true)
    private String reference;

    @NotNull
    private Date addedToConsignmentDate; //required for @OrderBy

    @NotNull
    @XmlAttribute(required = true)
    private BigDecimal originalOrderAmount;

    private String estimateNumber;

    public PlannedSettlement getPlannedSettlement() {
        return plannedSettlement;
    }

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

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

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

    public BigDecimal getOriginalOrderAmount() {
        return originalOrderAmount;
    }

    public void setOriginalOrderAmount(BigDecimal originalOrderAmount) {
        this.originalOrderAmount = originalOrderAmount;
    }

    public Date getAddedToConsignmentDate() {
        return addedToConsignmentDate;
    }

    public void setAddedToConsignmentDate(Date addedToConsignmentDate) {
        this.addedToConsignmentDate = addedToConsignmentDate;
    }

    public String getEstimateNumber() {
        return estimateNumber;
    }

    public void setEstimateNumber(String estimateNumber) {
        this.estimateNumber = estimateNumber;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj == null) {
            return false;
        }
        if (!(obj instanceof PlannedSettlementOrder)) {
            return false;
        }
        PlannedSettlementOrder other = (PlannedSettlementOrder) obj;
        return new EqualsBuilder().appendSuper(super.equals(obj)).append(plannedSettlement, other.plannedSettlement)
                .append(reference, other.reference).append(originalOrderAmount, other.originalOrderAmount).isEquals();
    }

    @Override
    public PaymentState getPaymentState() {
        return plannedSettlement.getPaymentState();
    }

    @Override
    public int hashCode() {
        return new HashCodeBuilder().appendSuper(super.hashCode()).append(plannedSettlement).append(reference).append(originalOrderAmount)
                .toHashCode();
    }

    @Override
    public String toString() {
        return new ToStringBuilder(this).append(super.toString()).append(reference).append(originalOrderAmount).toString();
    }
}