private LoanAccountData readLoan()

in fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/importhandler/loan/LoanImportHandler.java [142:375]


    private LoanAccountData readLoan(final Workbook workbook, final Row row, final List<String> statuses, final String locale,
            final String dateFormat) {
        ExternalId externalId = ExternalIdFactory.produce(ImportHandlerUtils.readAsString(LoanConstants.EXTERNAL_ID_COL, row));
        String status = ImportHandlerUtils.readAsString(LoanConstants.STATUS_COL, row);
        String productName = ImportHandlerUtils.readAsString(LoanConstants.PRODUCT_COL, row);
        Long productId = ImportHandlerUtils.getIdByName(workbook.getSheet(TemplatePopulateImportConstants.PRODUCT_SHEET_NAME), productName);
        String loanOfficerName = ImportHandlerUtils.readAsString(LoanConstants.LOAN_OFFICER_NAME_COL, row);
        Long loanOfficerId = ImportHandlerUtils.getIdByName(workbook.getSheet(TemplatePopulateImportConstants.STAFF_SHEET_NAME),
                loanOfficerName);
        LocalDate submittedOnDate = ImportHandlerUtils.readAsDate(LoanConstants.SUBMITTED_ON_DATE_COL, row);
        String fundName = ImportHandlerUtils.readAsString(LoanConstants.FUND_NAME_COL, row);
        Long fundId;
        if (fundName == null) {
            fundId = null;
        } else {
            fundId = ImportHandlerUtils.getIdByName(workbook.getSheet(TemplatePopulateImportConstants.EXTRAS_SHEET_NAME), fundName);
        }

        BigDecimal principal = null;
        if (ImportHandlerUtils.readAsDouble(LoanConstants.PRINCIPAL_COL, row) != null) {
            principal = BigDecimal.valueOf(ImportHandlerUtils.readAsDouble(LoanConstants.PRINCIPAL_COL, row));
        }
        Integer numberOfRepayments = ImportHandlerUtils.readAsInt(LoanConstants.NO_OF_REPAYMENTS_COL, row);
        Integer repaidEvery = ImportHandlerUtils.readAsInt(LoanConstants.REPAID_EVERY_COL, row);
        String repaidEveryFrequency = ImportHandlerUtils.readAsString(LoanConstants.REPAID_EVERY_FREQUENCY_COL, row);
        String repaidEveryFrequencyId = EMPTY_STR;
        EnumOptionData repaidEveryFrequencyEnums = null;
        if (repaidEveryFrequency != null) {
            if (repaidEveryFrequency.equalsIgnoreCase("Days")) {
                repaidEveryFrequencyId = "0";
            } else if (repaidEveryFrequency.equalsIgnoreCase("Weeks")) {
                repaidEveryFrequencyId = "1";
            } else if (repaidEveryFrequency.equalsIgnoreCase("Months")) {
                repaidEveryFrequencyId = "2";
            } else if (repaidEveryFrequency.equalsIgnoreCase("Semi Month")) {
                repaidEveryFrequencyId = "5";
            }
            repaidEveryFrequencyEnums = new EnumOptionData(null, null, repaidEveryFrequencyId);
        }
        Integer loanTerm = ImportHandlerUtils.readAsInt(LoanConstants.LOAN_TERM_COL, row);
        String loanTermFrequencyType = ImportHandlerUtils.readAsString(LoanConstants.LOAN_TERM_FREQUENCY_COL, row);
        EnumOptionData loanTermFrequencyEnum = null;
        if (loanTermFrequencyType != null) {
            String loanTermFrequencyId = EMPTY_STR;
            if (loanTermFrequencyType.equalsIgnoreCase("Days")) {
                loanTermFrequencyId = "0";
            } else if (loanTermFrequencyType.equalsIgnoreCase("Weeks")) {
                loanTermFrequencyId = "1";
            } else if (loanTermFrequencyType.equalsIgnoreCase("Months")) {
                loanTermFrequencyId = "2";
            }
            loanTermFrequencyEnum = new EnumOptionData(null, null, loanTermFrequencyId);
        }
        BigDecimal nominalInterestRate = null;
        if (ImportHandlerUtils.readAsDouble(LoanConstants.NOMINAL_INTEREST_RATE_COL, row) != null) {
            nominalInterestRate = BigDecimal.valueOf(ImportHandlerUtils.readAsDouble(LoanConstants.NOMINAL_INTEREST_RATE_COL, row));
        }
        String amortization = ImportHandlerUtils.readAsString(LoanConstants.AMORTIZATION_COL, row);
        String amortizationId = EMPTY_STR;
        EnumOptionData amortizationEnumOption = null;
        if (amortization != null) {
            if (amortization.equalsIgnoreCase("Equal principal payments")) {
                amortizationId = "0";
            } else if (amortization.equalsIgnoreCase("Equal installments")) {
                amortizationId = "1";
            }
            amortizationEnumOption = new EnumOptionData(null, null, amortizationId);
        }
        String interestMethod = ImportHandlerUtils.readAsString(LoanConstants.INTEREST_METHOD_COL, row);
        String interestMethodId = EMPTY_STR;
        EnumOptionData interestMethodEnum = null;
        if (interestMethod != null) {
            if (interestMethod.equalsIgnoreCase("Flat")) {
                interestMethodId = "1";
            } else if (interestMethod.equalsIgnoreCase("Declining Balance")) {
                interestMethodId = "0";
            }
            interestMethodEnum = new EnumOptionData(null, null, interestMethodId);
        }
        String interestCalculationPeriod = ImportHandlerUtils.readAsString(LoanConstants.INTEREST_CALCULATION_PERIOD_COL, row);
        String interestCalculationPeriodId = EMPTY_STR;
        EnumOptionData interestCalculationPeriodEnum = null;
        if (interestCalculationPeriod != null) {
            if (interestCalculationPeriod.equalsIgnoreCase("Daily")) {
                interestCalculationPeriodId = "0";
            } else if (interestCalculationPeriod.equalsIgnoreCase("Same as repayment period")) {
                interestCalculationPeriodId = "1";
            }
            interestCalculationPeriodEnum = new EnumOptionData(null, null, interestCalculationPeriodId);

        }
        BigDecimal arrearsTolerance = null;
        if (ImportHandlerUtils.readAsDouble(LoanConstants.ARREARS_TOLERANCE_COL, row) != null) {
            arrearsTolerance = BigDecimal.valueOf(ImportHandlerUtils.readAsDouble(LoanConstants.ARREARS_TOLERANCE_COL, row));
        }

        String loanRepaymentScheduleTransactionProcessorStrategy = ImportHandlerUtils.readAsString(LoanConstants.REPAYMENT_STRATEGY_COL,
                row);
        LoanRepaymentScheduleTransactionProcessor loanRepaymentScheduleTransactionProcessor = loanRepaymentScheduleTransactionProcessorFactory
                .determineProcessor(loanRepaymentScheduleTransactionProcessorStrategy);

        String repaymentStrategyCode = "mifos-standard-strategy";

        if (loanRepaymentScheduleTransactionProcessor != null) {
            repaymentStrategyCode = loanRepaymentScheduleTransactionProcessor.getCode();
        }
        Integer graceOnPrincipalPayment = ImportHandlerUtils.readAsInt(LoanConstants.GRACE_ON_PRINCIPAL_PAYMENT_COL, row);
        Integer graceOnInterestPayment = ImportHandlerUtils.readAsInt(LoanConstants.GRACE_ON_INTEREST_PAYMENT_COL, row);
        Integer graceOnInterestCharged = ImportHandlerUtils.readAsInt(LoanConstants.GRACE_ON_INTEREST_CHARGED_COL, row);
        LocalDate interestChargedFromDate = ImportHandlerUtils.readAsDate(LoanConstants.INTEREST_CHARGED_FROM_COL, row);
        LocalDate firstRepaymentOnDate = ImportHandlerUtils.readAsDate(LoanConstants.FIRST_REPAYMENT_COL, row);
        String loanType = null;
        EnumOptionData loanTypeEnumOption = null;
        if (ImportHandlerUtils.readAsString(LoanConstants.LOAN_TYPE_COL, row) != null) {
            loanType = ImportHandlerUtils.readAsString(LoanConstants.LOAN_TYPE_COL, row).toLowerCase(Locale.ENGLISH);

            loanTypeEnumOption = new EnumOptionData(null, null, loanType);
        }

        String clientOrGroupName = ImportHandlerUtils.readAsString(LoanConstants.CLIENT_NAME_COL, row);

        List<LoanChargeData> charges = new ArrayList<>();

        String chargeOneName = ImportHandlerUtils.readAsString(LoanConstants.CHARGE_NAME_1, row);
        String chargeTwoName = ImportHandlerUtils.readAsString(LoanConstants.CHARGE_NAME_2, row);

        Long chargeOneId = null;
        if (chargeOneName != null) {
            chargeOneId = ImportHandlerUtils.getIdByName(workbook.getSheet(TemplatePopulateImportConstants.CHARGE_SHEET_NAME),
                    chargeOneName);
        }
        Long chargeTwoId = null;
        if (chargeTwoName != null) {
            chargeTwoId = ImportHandlerUtils.getIdByName(workbook.getSheet(TemplatePopulateImportConstants.CHARGE_SHEET_NAME),
                    chargeTwoName);
        }

        Long collateralId = ImportHandlerUtils.readAsLong(LoanConstants.LOAN_COLLATERAL_ID, row);

        Long groupId = ImportHandlerUtils.readAsLong(LoanConstants.GROUP_ID, row);

        String linkAccountId = ImportHandlerUtils.readAsString(LoanConstants.LINK_ACCOUNT_ID, row);

        if (chargeOneId != null) {
            if (ImportHandlerUtils.readAsDouble(LoanConstants.CHARGE_AMOUNT_1, row) != null) {
                EnumOptionData chargeOneTimeTypeEnum = ImportHandlerUtils
                        .getChargeTimeTypeEmun(workbook.getSheet(TemplatePopulateImportConstants.CHARGE_SHEET_NAME), chargeOneName);
                EnumOptionData chargeOneAmountTypeEnum = ImportHandlerUtils
                        .getChargeAmountTypeEnum(ImportHandlerUtils.readAsString(LoanConstants.CHARGE_AMOUNT_TYPE_1, row));

                BigDecimal chargeAmount;
                BigDecimal amountOrPercentage = BigDecimal.valueOf(ImportHandlerUtils.readAsDouble(LoanConstants.CHARGE_AMOUNT_1, row));
                if (chargeOneAmountTypeEnum.getValue().equalsIgnoreCase("1")) {
                    chargeAmount = amountOrPercentage;
                } else {
                    chargeAmount = LoanCharge.percentageOf(principal, amountOrPercentage);
                }

                charges.add(new LoanChargeData(chargeOneId, ImportHandlerUtils.readAsDate(LoanConstants.CHARGE_DUE_DATE_1, row),
                        chargeAmount, chargeOneAmountTypeEnum, chargeOneTimeTypeEnum));
            } else {
                charges.add(new LoanChargeData(chargeOneId, ImportHandlerUtils.readAsDate(LoanConstants.CHARGE_DUE_DATE_1, row), null));
            }
        }

        if (chargeTwoId != null) {
            if (ImportHandlerUtils.readAsDouble(LoanConstants.CHARGE_AMOUNT_2, row) != null) {
                EnumOptionData chargeTwoTimeTypeEnum = ImportHandlerUtils
                        .getChargeTimeTypeEmun(workbook.getSheet(TemplatePopulateImportConstants.CHARGE_SHEET_NAME), chargeTwoName);
                EnumOptionData chargeTwoAmountTypeEnum = ImportHandlerUtils
                        .getChargeAmountTypeEnum(ImportHandlerUtils.readAsString(LoanConstants.CHARGE_AMOUNT_TYPE_2, row));

                BigDecimal chargeAmount;
                BigDecimal amountOrPercentage = BigDecimal.valueOf(ImportHandlerUtils.readAsDouble(LoanConstants.CHARGE_AMOUNT_2, row));
                if (chargeTwoTimeTypeEnum.getValue().equalsIgnoreCase("1")) {
                    chargeAmount = amountOrPercentage;
                } else {
                    chargeAmount = LoanCharge.percentageOf(principal, amountOrPercentage);
                }

                charges.add(new LoanChargeData(chargeTwoId, ImportHandlerUtils.readAsDate(LoanConstants.CHARGE_DUE_DATE_2, row),
                        chargeAmount, chargeTwoAmountTypeEnum, chargeTwoTimeTypeEnum));
            } else {
                charges.add(new LoanChargeData(chargeTwoId, ImportHandlerUtils.readAsDate(LoanConstants.CHARGE_DUE_DATE_2, row), null));
            }
        }

        List<LoanCollateralManagementData> loanCollateralManagementData = new ArrayList<>();

        if (collateralId != null) {
            if (ImportHandlerUtils.readAsDouble(LoanConstants.LOAN_COLLATERAL_QUANTITY, row) != null) {
                loanCollateralManagementData.add(new LoanCollateralManagementData(collateralId,
                        BigDecimal.valueOf(ImportHandlerUtils.readAsDouble(LoanConstants.LOAN_COLLATERAL_QUANTITY, row)), null, null,
                        null));
            } else {
                throw new InvalidAmountOfCollateralQuantity(null);
            }
        }

        statuses.add(status);

        if (loanType != null) {
            if (loanType.equals("individual")) {
                Long clientId = ImportHandlerUtils.getIdByName(workbook.getSheet(TemplatePopulateImportConstants.CLIENT_SHEET_NAME),
                        clientOrGroupName);
                return LoanAccountData.importInstanceIndividual(loanTypeEnumOption, clientId, productId, loanOfficerId, submittedOnDate,
                        fundId, principal, numberOfRepayments, repaidEvery, repaidEveryFrequencyEnums, loanTerm, loanTermFrequencyEnum,
                        nominalInterestRate, submittedOnDate, amortizationEnumOption, interestMethodEnum, interestCalculationPeriodEnum,
                        arrearsTolerance, repaymentStrategyCode, graceOnPrincipalPayment, graceOnInterestPayment, graceOnInterestCharged,
                        interestChargedFromDate, firstRepaymentOnDate, row.getRowNum(), externalId, null, charges, linkAccountId, locale,
                        dateFormat, loanCollateralManagementData, null, null);
            } else if (loanType.equals("jlg")) {
                Long clientId = ImportHandlerUtils.getIdByName(workbook.getSheet(TemplatePopulateImportConstants.CLIENT_SHEET_NAME),
                        clientOrGroupName);
                return LoanAccountData.importInstanceIndividual(loanTypeEnumOption, clientId, productId, loanOfficerId, submittedOnDate,
                        fundId, principal, numberOfRepayments, repaidEvery, repaidEveryFrequencyEnums, loanTerm, loanTermFrequencyEnum,
                        nominalInterestRate, submittedOnDate, amortizationEnumOption, interestMethodEnum, interestCalculationPeriodEnum,
                        arrearsTolerance, repaymentStrategyCode, graceOnPrincipalPayment, graceOnInterestPayment, graceOnInterestCharged,
                        interestChargedFromDate, firstRepaymentOnDate, row.getRowNum(), externalId, groupId, charges, linkAccountId, locale,
                        dateFormat, null, null, null);
            } else {
                Long groupIdforGroupLoan = ImportHandlerUtils
                        .getIdByName(workbook.getSheet(TemplatePopulateImportConstants.GROUP_SHEET_NAME), clientOrGroupName);
                return LoanAccountData.importInstanceGroup(loanTypeEnumOption, groupIdforGroupLoan, productId, loanOfficerId,
                        submittedOnDate, fundId, principal, numberOfRepayments, repaidEvery, repaidEveryFrequencyEnums, loanTerm,
                        loanTermFrequencyEnum, nominalInterestRate, submittedOnDate, amortizationEnumOption, interestMethodEnum,
                        interestCalculationPeriodEnum, arrearsTolerance, repaymentStrategyCode, graceOnPrincipalPayment,
                        graceOnInterestPayment, graceOnInterestCharged, interestChargedFromDate, firstRepaymentOnDate, row.getRowNum(),
                        externalId, linkAccountId, locale, dateFormat, null);
            }
        }

        return null;
    }