LetterOfCreditFieldCopyHelper.java

package com.tradecloud.domain.letterofcredit;

import com.tradecloud.domain.configuration.LetterOfCreditClientConfig;
import com.tradecloud.domain.model.ordermanagement.PurchaseOrder;
import com.tradecloud.domain.shipment.ShippingInformation;

import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.Collection;
import java.util.List;

/**
 * @author jon
 */
public class LetterOfCreditFieldCopyHelper {

    public static void copyFromTemplate(LetterOfCredit letterOfCredit, LetterOfCreditTemplate letterOfCreditTemplate,
                                        List<PurchaseOrder> purchaseOrders) {
        letterOfCredit.setIssuingBank(letterOfCreditTemplate.getOwningEntity());
        letterOfCredit.setTransferable(letterOfCreditTemplate.isTransferable());
        letterOfCredit.setConfirm(letterOfCreditTemplate.isConfirm());
        letterOfCredit.setIrrevocable(letterOfCreditTemplate.isIrrevocable());
        letterOfCredit.setBankChargesDescription(letterOfCreditTemplate.getCharges());
        letterOfCredit.setNotifyBy(letterOfCreditTemplate.getNotifyBy());
        letterOfCredit.getTenor().setDraftsRequired(letterOfCreditTemplate.isDraftsRequired());
        letterOfCredit.getTenor().setDrawnOn(letterOfCreditTemplate.getDrawnOn());
        if (letterOfCreditTemplate.getBankCharges() != null) {
            letterOfCredit.setBankCharges(letterOfCreditTemplate.getBankCharges());
        }
        if (letterOfCreditTemplate.getDocuments() != null) {
            letterOfCredit.setDocuments(letterOfCreditTemplate.getDocuments());
        }
        if (letterOfCreditTemplate.getConditions() != null) {
            letterOfCredit.setConditions(letterOfCreditTemplate.getConditions());
        }
        if (letterOfCredit.getPurchaseOrders() != null && purchaseOrders.size() > 0) {
            substituteConditionsMetaTag(letterOfCreditTemplate, letterOfCredit, purchaseOrders);
            substituteDocumentMetaTags(letterOfCreditTemplate, letterOfCredit, purchaseOrders);
        }

    }

    public static void copyFromOrder(LetterOfCredit letterOfCredit, PurchaseOrder purchaseOrder) {
        letterOfCredit.setBeneficiary(purchaseOrder.getSupplier());

        LetterOfCreditShippingInfo lcShippingInfo = letterOfCredit.getShippingInfo();
        ShippingInformation poShippingInfo = purchaseOrder.getShippingInformation();

        lcShippingInfo.setIncoterm(poShippingInfo.getIncoterm());
        lcShippingInfo.setFreightForwarder(poShippingInfo.getFreightForwarder());
        lcShippingInfo.setNamedPlace(poShippingInfo.getNamedPlace());
        lcShippingInfo.setPlaceOfDischarge(poShippingInfo.getPlaceOfDischarge());
        lcShippingInfo.setPlaceOfLoading(poShippingInfo.getPlaceOfLoading());
        lcShippingInfo.setAllowPartShipment(purchaseOrder.getAllowPartShipment());
        lcShippingInfo.setAllowTransShipment(purchaseOrder.getAllowTransShipment());

        LetterOfCreditTenor tenor = letterOfCredit.getTenor();

        tenor.setDays(purchaseOrder.getPaymentTerm());
        tenor.setTenor(purchaseOrder.getPaymentMethod());
        tenor.setToleranceAbove(purchaseOrder.getLcToleranceAbove());
        tenor.setToleranceBelow(purchaseOrder.getLcToleranceBelow());

        // TODO. Remove this once the rules about if the tolerances on order can be null, or what.
        if (tenor.getToleranceAbove() == null) {
            tenor.setToleranceAbove(BigDecimal.ZERO);
        }
        if (tenor.getToleranceBelow() == null) {
            tenor.setToleranceBelow(BigDecimal.ZERO);
        }
    }

    public static void copyFromOrders(LetterOfCredit letterOfCredit, Collection<PurchaseOrder> purchaseOrders) {
        letterOfCredit.getTenor().setAmount(LetterOfCreditUtils.calculateAmount(purchaseOrders));

        LetterOfCreditShippingInfo lcShippingInfo = letterOfCredit.getShippingInfo();

        lcShippingInfo.setEarliestShipmentDate(LetterOfCreditUtils.calculateEarliestShipmentDate(purchaseOrders));
        lcShippingInfo.setLatestShipmentDate(LetterOfCreditUtils.calculateLatestShipmentDate(purchaseOrders));
    }

    /**
     * Do initialisation related to client config settings.
     *
     * @param lc             The letter of credit
     * @param purchaseOrders The purchase orders. They are separate because they might not have been added to the lc yet
     * @param lcClientConfig The client config.
     */
    public static void initFromClientConfig(LetterOfCredit lc, Collection<PurchaseOrder> purchaseOrders, LetterOfCreditClientConfig lcClientConfig) {
        lc.setShippingMark(LetterOfCreditUtils.generateShippingMarks(purchaseOrders, lcClientConfig.getShippingMarksDescription()));
        //lc.setGoodsDescription(LetterOfCreditUtils.generateGoodsDescription(purchaseOrders, lcClientConfig.getGoodsDescription()));
        lc.setPresentationPeriod(LetterOfCreditUtils.generatePresentationPeriod(
                lc, lcClientConfig.getDefaultPresentationPeriod()));
        lc.setExpiryDate(LetterOfCreditUtils.calculateExpiryDate(
                lc.getShippingInfo().getLatestShipmentDate(), lc.getPresentationPeriod()));
        lc.setValidityPeriod(LetterOfCreditUtils.generateValidityPeriod(lc));
    }

    private static void substituteDocumentMetaTags(LetterOfCreditTemplate letterOfCreditTemplate, LetterOfCredit letterOfCredit,
                                                   List<PurchaseOrder> purchaseOrders) {
        //PurchaseOrder purchaseOrder = letterOfCredit.getPurchaseOrders().get(0);
        PurchaseOrder purchaseOrder = purchaseOrders.get(0);
        String document = letterOfCreditTemplate.getDocuments();

        if (document != null && purchaseOrder != null) {
            String earliestShipDate = substituteEarliestShipmentDate(document, purchaseOrder);
            String lsp = substituteLogisticsServiceProvider(earliestShipDate, purchaseOrder);
            String proforma = substituteProformaInvoice(lsp, purchaseOrder);
            String shippingMark = substituteShippingMark(proforma, purchaseOrder);

            letterOfCredit.setDocuments(shippingMark);
        } else {
            letterOfCredit.setDocuments(null);
        }
    }

    private static void substituteConditionsMetaTag(LetterOfCreditTemplate letterOfCreditTemplate, LetterOfCredit letterOfCredit,
                                                    List<PurchaseOrder> purchaseOrders) {

        //PurchaseOrder purchaseOrder = letterOfCredit.getPurchaseOrders().get(0);
        PurchaseOrder purchaseOrder = purchaseOrders.get(0);
        String condition = letterOfCreditTemplate.getConditions();

        if (condition != null && purchaseOrder != null) {

            String earliestShipDate = substituteEarliestShipmentDate(condition, purchaseOrder);
            String proforma = substituteProformaInvoice(earliestShipDate, purchaseOrder);
            //       substituteSpecialCondition(condition, purchaseOrder);
            String shippingMark = substituteShippingMark(proforma, purchaseOrder);

            letterOfCredit.setConditions(shippingMark);
        } else {
            letterOfCredit.setConditions(null);
        }
    }

    private static String substituteEarliestShipmentDate(String string, PurchaseOrder purchaseOrder) {

        if (purchaseOrder.getOrderDates() != null && purchaseOrder.getOrderDates().getEarliestShipmentDate() != null) {
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
            return string.replace(ConditionsMetaTag.EARLIEST_SHIPMENT_DATE.toString(), sdf.format
                    (purchaseOrder.getOrderDates().getEarliestShipmentDate()));
        }

        return " [ESD not specified on order] ";
    }

    private static String substituteProformaInvoice(String string, PurchaseOrder purchaseOrder) {
        if (purchaseOrder.getProFormaReference() != null) {
            return string.replace(ConditionsMetaTag.PROFORMA_INVOICE.toString(), purchaseOrder.getProFormaReference());
        }

        return " [ProForma not specified on order] ";
    }

    private static void substituteSpecialCondition(String string, PurchaseOrder purchaseOrder) {
        string.replace(ConditionsMetaTag.SPECIAL_CONDITION.toString(), "Special condition");
    }

    private static String substituteShippingMark(String string, PurchaseOrder purchaseOrder) {
        if (purchaseOrder.getShippingInformation() != null) {
            return string.replace(ConditionsMetaTag.SHIPPING_MARK.toString(), purchaseOrder.getShippingInformation().getShippingReference());
        }

        return " [ShippingMark not specified on order] ";
    }

    private static String substituteLogisticsServiceProvider(String string, PurchaseOrder purchaseOrder) {
        if (purchaseOrder.getShippingInformation() != null && purchaseOrder.getShippingInformation().getFreightForwarder() != null) {
            return string.replace(DocumentsMetaTag.LOGISTICS_SERVICE_PROVIDER.toString(), purchaseOrder.
                    getShippingInformation().getFreightForwarder().getName());
        }

        return " [LSP not specified on order] ";
    }
}