ServiceProviderInvoice.java

package com.tradecloud.domain.document.invoice;

import com.tradecloud.domain.base.utils.MathUtils;
import com.tradecloud.domain.common.Currency;
import com.tradecloud.domain.costing.ALCRateDefault;
import com.tradecloud.domain.costing.CostGroup;
import com.tradecloud.domain.document.ServiceProviderCreditNote;
import com.tradecloud.domain.model.payment.PaymentTerm;

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.math.BigDecimal;
import java.util.Date;
import java.util.LinkedList;
import java.util.List;

/**
 * The service provider invoice.
 * Used for capturing all the indirect costs from the various service providers
 * e.g. freight, customs and clearing fees.
 */
@Entity
@Table(name = "serviceproviderinvoice")
@NamedQueries({
        @NamedQuery(name = "serviceProviderInvoice.byReference",
                query = "from ServiceProviderInvoice spi where spi.reference = :reference and spi.state != 'DELETED'"),
        @NamedQuery(name = "serviceProviderInvoice.byReferenceAndServiceProvider",
                query = "from ServiceProviderInvoice spi where spi.reference = :reference and spi.serviceProvider = :serviceProvider" +
                        " and spi.state != 'DELETED'")})
@Access(AccessType.FIELD)
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "ServiceProviderInvoice")
public class ServiceProviderInvoice extends BaseServiceProviderInvoice {

    private static final long serialVersionUID = 1L;

    @OneToMany(cascade = CascadeType.ALL, mappedBy = "serviceProviderInvoice", fetch = FetchType.EAGER)
    private List<ServiceProviderCreditNote> serviceProviderCreditNotes = new LinkedList<>();

    private String splitInvoiceReference;
    @ManyToOne
    private Currency splitInvoiceCurrency;
    @Transient
    @XmlTransient
    private ALCRateDefault alcRateDefault;

    private BigDecimal netLocalVatable;

    private BigDecimal netLocalNonVatable;

    @ElementCollection
    @CollectionTable(name = "mrnNumbers", joinColumns = @JoinColumn(name = "id"))
    @Column(name = "number")
    private List<String> mrnNumbers;

    @ElementCollection
    @CollectionTable(name = "lrnNumbers", joinColumns = @JoinColumn(name = "id"))
    @Column(name = "number")
    private List<String> lrnNumbers;

    private String paymentReference;

    private String clientAccount;

    @Enumerated(value = EnumType.STRING)
    private InvoiceType invoiceType = InvoiceType.OTHER;

    private boolean generated;
    @ManyToOne(fetch = FetchType.LAZY)
    private PaymentTerm paymentTerm;

    private boolean includeCustomsCostGroup = true;
    @ElementCollection
    @CollectionTable(name = "billOfEntryDates", joinColumns = @JoinColumn(name = "id"))
    @Column(name = "date")
    private List<Date> billOfEntryDates;
    @ElementCollection
    @CollectionTable(name = "cpcCodes", joinColumns = @JoinColumn(name = "id"))
    @Column(name = "code")
    private List<String> cpcCodes;

    @Enumerated(value = EnumType.STRING)
    private ClearingLevel clearingLevel;

    public enum ClearingLevel {
        ITEM, STYLE;
    }

    public List<ServiceProviderCreditNote> getServiceProviderCreditNotes() {
        return serviceProviderCreditNotes;
    }

    public void setServiceProviderCreditNotes(List<ServiceProviderCreditNote> serviceProviderCreditNotes) {
        this.serviceProviderCreditNotes = serviceProviderCreditNotes;
    }

    public String getSplitInvoiceReference() {
        return splitInvoiceReference;
    }

    public void setSplitInvoiceReference(String splitInvoiceReference) {
        this.splitInvoiceReference = splitInvoiceReference;
    }

    public Currency getSplitInvoiceCurrency() {
        return splitInvoiceCurrency;
    }

    public void setSplitInvoiceCurrency(Currency splitInvoiceCurrency) {
        this.splitInvoiceCurrency = splitInvoiceCurrency;
    }

    public ALCRateDefault getAlcRateDefault() {
        return alcRateDefault;
    }

    public void setAlcRateDefault(ALCRateDefault alcRateDefault) {
        this.alcRateDefault = alcRateDefault;
    }

    public BigDecimal getNetLocalVatable() {
        return netLocalVatable;
    }

    public void setNetLocalVatable(BigDecimal netLocalVatable) {
        this.netLocalVatable = netLocalVatable;
    }

    public BigDecimal getNetLocalNonVatable() {
        return netLocalNonVatable;
    }

    public void setNetLocalNonVatable(BigDecimal netLocalNonVatable) {
        this.netLocalNonVatable = netLocalNonVatable;
    }

    @Transient
    public String getType() {
        return "SPI";
    }

    public List<String> getMrnNumbers() {
        return mrnNumbers;
    }

    public void setMrnNumbers(List<String> mrnNumbers) {
        this.mrnNumbers = mrnNumbers;
    }

    public List<String> getLrnNumbers() {
        return lrnNumbers;
    }

    public void setLrnNumbers(List<String> lrnNumbers) {
        this.lrnNumbers = lrnNumbers;
    }

    public boolean isCustomsInvoice() {
        List<CostLineCostingCell> costLineCostingCells = getCostLineCosting().getCostLineCostingCells();
        for (CostLineCostingCell costingCell : costLineCostingCells) {
            if (costingCell.getCostLine().getCostLineTemplate().getCostGroup() == CostGroup.CUSTOMS &&
                    MathUtils.isNonZero(costingCell.getTransactionAmount())) {
                return true;
            }
        }

        return false;
    }

    public String getPaymentReference() {
        return paymentReference;
    }

    public void setPaymentReference(String paymentReference) {
        this.paymentReference = paymentReference;
    }

    public String getClientAccount() {
        return clientAccount;
    }

    public void setClientAccount(String clientAccount) {
        this.clientAccount = clientAccount;
    }

    public InvoiceType getInvoiceType() {
        return invoiceType;
    }

    public void setInvoiceType(InvoiceType invoiceType) {
        this.invoiceType = invoiceType;
    }

    public boolean isGenerated() {
        return generated;
    }

    public void setGenerated(boolean generated) {
        this.generated = generated;
    }

    public PaymentTerm getPaymentTerm() {
        return paymentTerm;
    }

    public void setPaymentTerm(PaymentTerm paymentTerm) {
        this.paymentTerm = paymentTerm;
    }

    public boolean isIncludeCustomsCostGroup() {
        return includeCustomsCostGroup;
    }

    public void setIncludeCustomsCostGroup(boolean includeCustomsCostGroup) {
        this.includeCustomsCostGroup = includeCustomsCostGroup;
    }

    public void setBillOfEntryDates(List<Date> billOfEntryDates) {
        this.billOfEntryDates = billOfEntryDates;
    }

    public List<Date> getBillOfEntryDates() {
        return billOfEntryDates;
    }

    public void setCpcCodes(List<String> cpcCodes) {
        this.cpcCodes = cpcCodes;
    }

    public List<String> getCpcCodes() {
        return cpcCodes;
    }

    public ClearingLevel getClearingLevel() {
        return clearingLevel;
    }

    public void setClearingLevel(ClearingLevel clearingLevel) {
        this.clearingLevel = clearingLevel;
    }
}