CostLineCostingCell.java

package com.tradecloud.domain.document.invoice;

import com.fasterxml.jackson.annotation.JsonIgnore;
import com.tradecloud.common.base.HibernateUtils;
import com.tradecloud.common.base.PersistenceBase;
import com.tradecloud.domain.common.Currency;
import com.tradecloud.domain.costing.CostCalculationLevel;
import com.tradecloud.domain.costing.CostLine;
import com.tradecloud.domain.costing.VatType;
import org.apache.commons.lang.builder.EqualsBuilder;
import org.apache.commons.lang.builder.HashCodeBuilder;
import org.apache.commons.lang.builder.ToStringBuilder;
import org.apache.log4j.Logger;
import org.hibernate.annotations.ForeignKey;
import org.springframework.stereotype.Component;

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

/**
 *
 */
@Entity
@Component(value = "costlinecostingcell")
@Table(name = "costlinecostingcell")
@Access(AccessType.FIELD)
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "CostLineCostingCell")
public class CostLineCostingCell extends PersistenceBase implements Comparable<CostLineCostingCell>, CostingCell {

    private static final long serialVersionUID = 1L;

    @NotNull
    @ManyToOne(optional = false)
    @ForeignKey(name = "fk_costline")
    @JsonIgnore
    private CostLine costLine;

    @NotNull
    @Basic(optional = false)
    private BigDecimal transactionAmount = BigDecimal.ZERO;

    @ManyToOne
    @ForeignKey(name = "fk_transactioncurrency")
    @XmlElement(name = "TransactionCurrency")
    private Currency transactionCurrency;

    private BigDecimal spotRate;

    private BigDecimal forwardRate;

    private BigDecimal percentage;

    @Transient
    private BigDecimal calculationPercentage;

    @XmlAttribute
    private Date settlementDate;

    private boolean overridden;

    private boolean allChildrenOverridden;

    private boolean percentageOverridden;

    private boolean forwardRateOverridden;

    private boolean spotRateOverridden;

    /*
    We use this value to 'clear' an override. On clear, we set to this value.
     */
    private BigDecimal initialCostedValue;

    private BigDecimal initialPercentage;

    private BigDecimal initialSpotRate;

    private BigDecimal initialForwardRate;

    private BigDecimal costApplicationBasisAmount;

    private BigDecimal rateFeedSpotRate;

    private BigDecimal rateFeedForwardRate;

    @Enumerated(value = EnumType.STRING)
    @Column
    @XmlAttribute
    private CostCalculationLevel costCalculationLevel;

    private BigDecimal vat;
    //not calculated , will show on invoice costing header
    private BigDecimal integratedVat;

    private transient BigDecimal varianceAgainstEstimateCosting = BigDecimal.ZERO;

    private transient BigDecimal varianceAgainstEstimate = BigDecimal.ZERO;

    private transient BigDecimal estimateAmount = BigDecimal.ZERO;

    private transient BigDecimal estimateCostingAmount = BigDecimal.ZERO;

    private transient BigDecimal costingAmount = BigDecimal.ZERO;

    private boolean useIntegratedRate;
    private boolean dutiable;
    @Enumerated(value = EnumType.STRING)
    //only applies to orders
    private VatType vatType;
    private boolean overriddenVatType;

    private boolean primaryCosting;


    public CostLineCostingCell() {
    }

    public CostLine getCostLine() {
        return costLine;
    }

    public void setCostLine(CostLine costLine) {
        this.costLine = costLine;
    }

    @Override
    public BigDecimal getTransactionAmount() {
        return transactionAmount;
    }

    @Override
    public void setTransactionAmount(BigDecimal transactionAmount) {
        if (transactionAmount == null) {
            Logger.getLogger(CostLineCostingCell.class).debug("transactionAmount is null so set it to BigDecimal.ZERO");
            transactionAmount = BigDecimal.ZERO;
        }
        this.transactionAmount = transactionAmount;
    }

    public BigDecimal getSpotRate() {
        return spotRate;
    }

    public void setSpotRate(BigDecimal spotRate) {
        this.spotRate = spotRate;
    }

    public BigDecimal getForwardRate() {
        return forwardRate;
    }

    public void setForwardRate(BigDecimal forwardRate) {
        this.forwardRate = forwardRate;
    }

    @Override
    public String getCode() {
        return costLine.getCostLineTemplate().getCode();
    }

    @Override
    public Currency getTransactionCurrency() {
        return transactionCurrency;
    }

    @Override
    public void setTransactionCurrency(Currency transactionCurrency) {
        this.transactionCurrency = transactionCurrency;
    }

    public Date getSettlementDate() {
        return settlementDate;
    }

    public void setSettlementDate(Date settlementDate) {
        this.settlementDate = settlementDate;
    }

    public boolean isOverridden() {
        return overridden;
    }

    public void setOverridden(boolean overridden) {
        this.overridden = overridden;
    }

    @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }
        if (this == obj) {
            return true;
        }
        if (!HibernateUtils.proxyClassEquals(this, obj)) {
            return false;
        }
        CostLineCostingCell obj1 = (CostLineCostingCell) obj;
        return new EqualsBuilder().append(getCostLine(), obj1.getCostLine()).append(getTransactionAmount(), obj1.getTransactionAmount()).append
                (getTransactionCurrency(), obj1.getTransactionCurrency()).isEquals();
    }

    @Override
    public int hashCode() {
        return new HashCodeBuilder().append(getCostLine()).append(getTransactionAmount()).append(getTransactionCurrency()).toHashCode();
    }

    @Override
    public int compareTo(CostLineCostingCell clcc) {
        return costLine.getCostLineTemplate().getName().compareTo(clcc.getCostLine().getCostLineTemplate().getName());
    }

    @Override
    public String toString() {
        return new ToStringBuilder(this).append(costLine).append(transactionAmount).append(transactionCurrency).append(spotRate).append
                (forwardRate).toString();
    }

    public boolean isAllChildrenOverridden() {
        return allChildrenOverridden;
    }

    public void setAllChildrenOverridden(boolean allChildrenOverridden) {
        this.allChildrenOverridden = allChildrenOverridden;
    }

    public BigDecimal getPercentage() {
        return percentage;
    }

    public void setPercentage(BigDecimal percentage) {
        this.percentage = percentage;
    }

    public boolean isPercentageOverridden() {
        return percentageOverridden;
    }

    public void setPercentageOverridden(boolean percentageOverridden) {
        this.percentageOverridden = percentageOverridden;
    }

    public boolean isForwardRateOverridden() {
        return forwardRateOverridden;
    }

    public void setForwardRateOverridden(boolean forwardRateOverridden) {
        this.forwardRateOverridden = forwardRateOverridden;
    }

    public boolean isSpotRateOverridden() {
        return spotRateOverridden;
    }

    public void setSpotRateOverridden(boolean spotRateOverridden) {
        this.spotRateOverridden = spotRateOverridden;
    }

    public BigDecimal getInitialCostedValue() {
        return initialCostedValue;
    }

    public void setInitialCostedValue(BigDecimal initialCostedValue) {
        this.initialCostedValue = initialCostedValue;
    }

    public BigDecimal getInitialPercentage() {
        return initialPercentage;
    }

    public void setInitialPercentage(BigDecimal initialPercentage) {
        this.initialPercentage = initialPercentage;
    }

    public BigDecimal getCostApplicationBasisAmount() {
        if (costApplicationBasisAmount == null) {
            setCostApplicationBasisAmount(BigDecimal.ZERO);
        }
        return costApplicationBasisAmount;
    }

    public void setCostApplicationBasisAmount(BigDecimal costApplicationBasisAmount) {
        this.costApplicationBasisAmount = costApplicationBasisAmount;
    }

    public BigDecimal getCalculationPercentage() {
        return calculationPercentage;
    }

    public void setCalculationPercentage(BigDecimal calculationPercentage) {
        this.calculationPercentage = calculationPercentage;
    }

    public CostCalculationLevel getCostCalculationLevel() {
        return costCalculationLevel;
    }

    public void setCostCalculationLevel(CostCalculationLevel costCalculationLevel) {
        this.costCalculationLevel = costCalculationLevel;
    }

    public BigDecimal getInitialSpotRate() {
        return initialSpotRate;
    }

    public void setInitialSpotRate(BigDecimal initialSpotRate) {
        this.initialSpotRate = initialSpotRate;
    }

    public BigDecimal getInitialForwardRate() {
        return initialForwardRate;
    }

    public void setInitialForwardRate(BigDecimal initialForwardRate) {
        this.initialForwardRate = initialForwardRate;
    }

    public BigDecimal getRateFeedSpotRate() {
        return rateFeedSpotRate;
    }

    public void setRateFeedSpotRate(BigDecimal rateFeedSpotRate) {
        this.rateFeedSpotRate = rateFeedSpotRate;
    }

    public BigDecimal getRateFeedForwardRate() {
        return rateFeedForwardRate;
    }

    public void setRateFeedForwardRate(BigDecimal rateFeedForwardRate) {
        this.rateFeedForwardRate = rateFeedForwardRate;
    }

    public BigDecimal getVat() {
        return vat;
    }

    public void setVat(BigDecimal vat) {
        this.vat = vat;
    }

    @Override
    public boolean showVat() {
        return costLine.showVat();
    }

    @Override
    public BigDecimal getIntegratedVat() {
        return integratedVat;
    }

    @Override
    public void setIntegratedVat(BigDecimal integratedVat) {
        this.integratedVat = integratedVat;
    }

    @Override
    public BigDecimal getVarianceAgainstEstimateCosting() {
        return varianceAgainstEstimateCosting;
    }

    @Override
    public void setVarianceAgainstEstimateCosting(BigDecimal varianceAgainstEstimateCosting) {
        this.varianceAgainstEstimateCosting = varianceAgainstEstimateCosting;
    }

    @Override
    public BigDecimal getVarianceAgainstEstimate() {
        return varianceAgainstEstimate;
    }

    @Override
    public void setVarianceAgainstEstimate(BigDecimal varianceAgainstEstimate) {
        this.varianceAgainstEstimate = varianceAgainstEstimate;
    }

    @Override
    public BigDecimal getEstimateAmount() {
        return estimateAmount;
    }

    @Override
    public void setEstimateAmount(BigDecimal estimateAmount) {
        this.estimateAmount = estimateAmount;
    }

    @Override
    public BigDecimal getEstimateCostingAmount() {
        return estimateCostingAmount;
    }

    @Override
    public void setEstimateCostingAmount(BigDecimal estimateCostingAmount) {
        this.estimateCostingAmount = estimateCostingAmount;
    }

    @Override
    public BigDecimal getCostingAmount() {
        return costingAmount;
    }

    @Override
    public void setCostingAmount(BigDecimal costingAmount) {
        this.costingAmount = costingAmount;
    }

    @Override
    public boolean isUseIntegratedRate() {
        return useIntegratedRate;
    }

    @Override
    public void setUseIntegratedRate(boolean useIntegratedRate) {
        this.useIntegratedRate = useIntegratedRate;
    }

    @Override
    public boolean isDutiable() {
        return dutiable;
    }

    @Override
    public void setDutiable(boolean dutiable) {
        this.dutiable = dutiable;
    }

    @Override
    public VatType getVatType() {
        return vatType;
    }

    @Override
    public void setVatType(VatType vatType) {
        this.vatType = vatType;
    }

    @Override
    public boolean isOverriddenVatType() {
        return overriddenVatType;
    }

    @Override
    public void setOverriddenVatType(boolean overriddenVatType) {
        this.overriddenVatType = overriddenVatType;
    }

    public boolean isPrimaryCosting() {
        return primaryCosting;
    }

    public void setPrimaryCosting(boolean primaryCosting) {
        this.primaryCosting = primaryCosting;
    }
}