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;
}