BondedBoeLineEditDto.java

package com.tradecloud.domain.document.invoice.bonded;

import lombok.Setter;

import java.io.Serializable;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.UUID;

public class BondedBoeLineEditDto implements Serializable {

    private final String rowKey = UUID.randomUUID().toString();

    @Setter
    private Long id;
    @Setter
    private Integer lineNumber;
    @Setter
    private Integer previousLineNumber;
    @Setter
    private String orderReference;
    @Setter
    private String itemReference;
    @Setter
    private String lrnNumber;
    @Setter
    private String mrnNumber;
    @Setter
    private String previousMrnNumber;
    @Setter
    private Date billOfEntryDate;
    @Setter
    private String cpcCode;
    @Setter
    private String itacPermit;
    @Setter
    private BigDecimal customsValue;
    @Setter
    private String customsValueCurrency;
    @Setter
    private BigDecimal statUnitQty;
    @Setter
    private String statUnitCode;
    @Setter
    private BigDecimal statUnit2Qty;
    @Setter
    private String statUnit2Code;
    @Setter
    private BigDecimal statUnit3Qty;
    @Setter
    private String statUnit3Code;
    @Setter
    private String dutyCountryOfOrigin;
    @Setter
    private String dutyTariffCode;
    @Setter
    private List<BondedBoeLineCostDto> costs = new ArrayList<>();

    // fixed cost columns (for UI convenience)
    @Setter
    private BigDecimal customsVatAmount;
    @Setter
    private BigDecimal customsDutyAmount;
    @Setter
    private BigDecimal documentationFeeAmount;

    public String getRowKey() {
        return rowKey;
    }

    public Long getId() {
        return id;
    }

    public Integer getLineNumber() {
        return lineNumber;
    }

    public Integer getPreviousLineNumber() {
        return previousLineNumber;
    }

    public String getOrderReference() {
        return orderReference;
    }

    public String getItemReference() {
        return itemReference;
    }

    public String getLrnNumber() {
        return lrnNumber;
    }

    public String getMrnNumber() {
        return mrnNumber;
    }

    public String getPreviousMrnNumber() {
        return previousMrnNumber;
    }

    public Date getBillOfEntryDate() {
        return billOfEntryDate;
    }

    public String getCpcCode() {
        return cpcCode;
    }

    public String getItacPermit() {
        return itacPermit;
    }

    public BigDecimal getCustomsValue() {
        return customsValue;
    }

    public String getCustomsValueCurrency() {
        return customsValueCurrency;
    }

    public BigDecimal getStatUnitQty() {
        return statUnitQty;
    }

    public String getStatUnitCode() {
        return statUnitCode;
    }

    public BigDecimal getStatUnit2Qty() {
        return statUnit2Qty;
    }

    public String getStatUnit2Code() {
        return statUnit2Code;
    }

    public BigDecimal getStatUnit3Qty() {
        return statUnit3Qty;
    }

    public String getStatUnit3Code() {
        return statUnit3Code;
    }

    public String getDutyCountryOfOrigin() {
        return dutyCountryOfOrigin;
    }

    public String getDutyTariffCode() {
        return dutyTariffCode;
    }

    public BigDecimal getCustomsVatAmount() {
        return customsVatAmount;
    }

    public BigDecimal getCustomsDutyAmount() {
        return customsDutyAmount;
    }

    public BigDecimal getDocumentationFeeAmount() {
        return documentationFeeAmount;
    }

    public List<BondedBoeLineCostDto> getCosts() {
        if (costs == null) {
            costs = new ArrayList<>();
        }
        return costs;
    }

    /**
     * Required by BondedServiceProviderInvoiceRepositoryImpl
     * Populates the fixed columns from the costs list.
     */
    public void populateFixedCostsFromCosts() {
        customsVatAmount = null;
        customsDutyAmount = null;
        documentationFeeAmount = null;

        if (costs == null || costs.isEmpty()) {
            return;
        }

        for (BondedBoeLineCostDto c : costs) {
            if (c == null) continue;

            String costLine = c.getCostLine();
            if (costLine == null) continue;

            BigDecimal amt = c.getInvoiceAmount();
            if (amt == null) continue;

            String norm = costLine.trim().toUpperCase();

            if ("DISBURSEMENTS.CUSTOMS VAT".equals(norm) || norm.endsWith("CUSTOMS VAT")) {
                customsVatAmount = safeAdd(customsVatAmount, amt);
            } else if ("DISBURSEMENTS.CUSTOMS DUTY".equals(norm) || norm.endsWith("CUSTOMS DUTY")) {
                customsDutyAmount = safeAdd(customsDutyAmount, amt);
            } else if ("CUSTOMSDOCUMENTATIONFEE".equals(norm)
                    || norm.contains("DOCUMENTATIONFEE")
                    || norm.contains("DOCUMENTATION FEE")) {
                documentationFeeAmount = safeAdd(documentationFeeAmount, amt);
            }
        }
    }

    private static BigDecimal safeAdd(BigDecimal a, BigDecimal b) {
        if (a == null) return b;
        if (b == null) return a;
        return a.add(b);
    }
}