Schedule1Part1A.java

package com.tradecloud.domain.duties;

import com.tradecloud.domain.costing.clean.CostLineNames;
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.Fetch;
import org.hibernate.annotations.FetchMode;

import javax.persistence.*;
import javax.xml.bind.annotation.*;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;

/**
 * Entity representing Schedule 1 Part 1 A - Ordinary duties.
 */
@Entity
@Table(name = "schedule1part1a")
@Access(AccessType.FIELD)
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "Schedule1Part1A")
public class Schedule1Part1A extends TypedDutySchedule implements Serializable, Cloneable {

    private static final long serialVersionUID = 1L;

    @Transient
    public final int PART1_MAX_LENGTH = 4;

    /**
     * The method that will be used to calculate the "Other Duty" values.
     */
    @Enumerated(value = EnumType.STRING)
    @XmlAttribute
    private DutyCalculationMethod calculationMethod = DutyCalculationMethod.SINGLE;

    /**
     * The applicable trade agreement.
     */
    @Enumerated(value = EnumType.STRING)
    @XmlAttribute
    private TradeAgreement tradeAgreement = TradeAgreement.GENERAL;

    private String dutyDescription;
    private boolean tradeAgreementOverridden;

    @Embedded
    @AttributeOverrides({@AttributeOverride(name = "value", column = @Column(name = "supplementaryQtyValue1")),
            @AttributeOverride(name = "unit", column = @Column(name = "supplementaryQtyUnit1"))})
    @XmlElement(name = "supplementaryQty1")
    private SupplementaryQuantity supplementaryQty1;
    @Embedded
    @AttributeOverrides({@AttributeOverride(name = "value", column = @Column(name = "supplementaryQtyValue2")),
            @AttributeOverride(name = "unit", column = @Column(name = "supplementaryQtyUnit2"))})
    @XmlElement(name = "supplementaryQty2")
    private SupplementaryQuantity supplementaryQty2;
    @Embedded
    @AttributeOverrides({@AttributeOverride(name = "value", column = @Column(name = "supplementaryQtyValue3")),
            @AttributeOverride(name = "unit", column = @Column(name = "supplementaryQtyUnit3"))})
    @XmlElement(name = "supplementaryQty3")
    private SupplementaryQuantity supplementaryQty3;

    @ElementCollection(targetClass = RulesOfOrigin.class, fetch = FetchType.EAGER)
    @JoinTable(name = "schedule1part1a_rulesoforigin", joinColumns = @JoinColumn(name = "schedule1part1a_id"))
    @Enumerated(EnumType.STRING)
    @Column(name = "rulesoforigin")
    @Fetch(value = FetchMode.SELECT)
    private List<RulesOfOrigin> rulesOfOrigin;
    private String rulesOfOriginAuthNumber;

    @XmlAttribute
    private boolean vatExemption;

    public Schedule1Part1A() {
        super();
        if (getDutyRate() == null) {
            dutyRate = new TypedDutyRate();
        }
        dutyRate.setType(DutyType.ORDINARY);
        dutyRate.setPercentage(BigDecimal.ZERO);
    }

    public Schedule1Part1A(Schedule1Part1A schedule1Part1A) {
        super(schedule1Part1A);
        calculationMethod = schedule1Part1A.getCalculationMethod();
        tradeAgreement = schedule1Part1A.getTradeAgreement();
        dutyDescription = schedule1Part1A.getDutyDescription();
        supplementaryQty1 = schedule1Part1A.getSupplementaryQty1();
        supplementaryQty2 = schedule1Part1A.getSupplementaryQty2();
        supplementaryQty3 = schedule1Part1A.getSupplementaryQty3();
        rulesOfOrigin = schedule1Part1A.getRulesOfOrigin();
    }

    public DutyCalculationMethod getCalculationMethod() {
        return calculationMethod;
    }

    public void setCalculationMethod(DutyCalculationMethod calculationMethod) {
        this.calculationMethod = calculationMethod;
    }

    public SupplementaryQuantity getSupplementaryQty1() {
        if (supplementaryQty1 == null) {
            supplementaryQty1 = new SupplementaryQuantity();
        }
        return supplementaryQty1;
    }

    public void setSupplementaryQty1(SupplementaryQuantity supplementaryQty1) {
        this.supplementaryQty1 = supplementaryQty1;
    }

    public SupplementaryQuantity getSupplementaryQty2() {
        if (supplementaryQty2 == null) {
            supplementaryQty2 = new SupplementaryQuantity();
        }
        return supplementaryQty2;
    }

    public void setSupplementaryQty2(SupplementaryQuantity supplementaryQty2) {
        this.supplementaryQty2 = supplementaryQty2;
    }

    public SupplementaryQuantity getSupplementaryQty3() {
        if (supplementaryQty3 == null) {
            supplementaryQty3 = new SupplementaryQuantity();
        }
        return supplementaryQty3;
    }

    public void setSupplementaryQty3(SupplementaryQuantity supplementaryQty3) {
        this.supplementaryQty3 = supplementaryQty3;
    }

    public TradeAgreement getTradeAgreement() {
        return tradeAgreement;
    }

    public void setTradeAgreement(TradeAgreement tradeAgreement) {
        this.tradeAgreement = tradeAgreement;
    }

    @Override
    public Schedule1Part1A clone() {
        Schedule1Part1A clone = (Schedule1Part1A) super.clone();
        clone.setCalculationMethod(calculationMethod);
        clone.setTradeAgreement(tradeAgreement);
        clone.setTradeAgreementOverridden(tradeAgreementOverridden);
        clone.setDutyDescription(dutyDescription);
        clone.setTariffHeading(getTariffHeading() != null ? getTariffHeading().clone() : null);
        clone.setValid(isValid());
        clone.setDutyRate(dutyRate != null ? dutyRate.clone() : null);
        clone.setSupplementaryQty1(supplementaryQty1);
        clone.setSupplementaryQty2(supplementaryQty2);
        clone.setSupplementaryQty3(supplementaryQty3);
        if (rulesOfOrigin != null && !rulesOfOrigin.isEmpty()) {
            clone.setRulesOfOrigin(new ArrayList<>(rulesOfOrigin));
        } else {
            clone.setRulesOfOrigin(new ArrayList<>());
        }
        return clone;
    }

    @Override
    public String toString() {
        return new ToStringBuilder(this).append("calculationMethod", calculationMethod).append("tradeAgreement", tradeAgreement).toString();
    }

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

    @Override
    public int hashCode() {
        return new HashCodeBuilder().appendSuper(super.hashCode()).append(calculationMethod).append(tradeAgreement).toHashCode();
    }

    @Override
    public String getCostlineCode() {
        return CostLineNames.CUSTOMS_CUSTOMS_DUTY;
    }

    @Override
    protected int getPart1MaxLength() {
        return PART1_MAX_LENGTH;
    }

    @Override
    protected boolean getDoCheckProof() {
        return false;
    }

    @Override
    protected boolean getDoCheckPercentage() {
        return true;
    }

    @Override
    protected boolean getDoCheckValue() {
        return true;
    }

    public String getDutyDescription() {
        return dutyDescription;
    }

    public void setDutyDescription(String dutyDescription) {
        this.dutyDescription = dutyDescription;
    }

    public boolean isTradeAgreementOverridden() {
        return tradeAgreementOverridden;
    }

    public void setTradeAgreementOverridden(boolean tradeAgreementOverridden) {
        this.tradeAgreementOverridden = tradeAgreementOverridden;
    }

    public List<RulesOfOrigin> getRulesOfOrigin() {
        return rulesOfOrigin;
    }

    public void setRulesOfOrigin(List<RulesOfOrigin> rulesOfOrigin) {
        this.rulesOfOrigin = rulesOfOrigin;
    }

    public boolean isVatExemption() {
        return vatExemption;
    }

    public void setVatExemption(boolean vatExemption) {
        this.vatExemption = vatExemption;
    }

    public String getRulesOfOriginAuthNumber() {
        return rulesOfOriginAuthNumber;
    }

    public void setRulesOfOriginAuthNumber(String rulesOfOriginAuthNumber) {
        this.rulesOfOriginAuthNumber = rulesOfOriginAuthNumber;
    }

    @Override
    public String getType() {
        return "S1P1";
    }
}