From fa405f09fdaf4929beab2409d153b9ec62bcb2e4 Mon Sep 17 00:00:00 2001 From: Edder-Sanjuan <110139628+Edder-Sanjuan@users.noreply.github.com> Date: Fri, 30 May 2025 18:47:09 -0600 Subject: [PATCH] FINERACT-2202: Bulk import fix (#4709) Co-authored-by: Edder Lugo --- .../loanrepayment/LoanRepaymentImportHandler.java | 7 ++++--- .../FixedDepositTransactionWorkbookPopulator.java | 2 +- .../FixedDepositWorkbookPopulator.java | 2 ++ ...urringDepositTransactionWorkbookPopulator.java | 2 +- .../SavingsTransactionsWorkbookPopulator.java | 15 +++++++-------- .../AddressCommandFromApiJsonDeserializer.java | 1 + .../client/data/ClientDataValidator.java | 2 +- .../LoanTransactionValidatorImpl.java | 2 +- .../savings/data/SavingsAccountDataValidator.java | 4 ++-- .../portfolio/savings/domain/SavingsAccount.java | 4 ++-- 10 files changed, 22 insertions(+), 19 deletions(-) diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/importhandler/loanrepayment/LoanRepaymentImportHandler.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/importhandler/loanrepayment/LoanRepaymentImportHandler.java index 59bdc8296..72f90c4c7 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/importhandler/loanrepayment/LoanRepaymentImportHandler.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/importhandler/loanrepayment/LoanRepaymentImportHandler.java @@ -68,7 +68,7 @@ public class LoanRepaymentImportHandler implements ImportHandler { public Count process(final Workbook workbook, final String locale, final String dateFormat) { List loanRepayments = readExcelFile(workbook, locale, dateFormat); - return importEntity(workbook, loanRepayments, dateFormat); + return importEntity(workbook, loanRepayments, dateFormat, locale); } private List readExcelFile(final Workbook workbook, final String locale, final String dateFormat) { @@ -110,13 +110,14 @@ public class LoanRepaymentImportHandler implements ImportHandler { receiptNumber, bankNumber, loanAccountId, EMPTY_STR, row.getRowNum(), locale, dateFormat); } - private Count importEntity(final Workbook workbook, final List loanRepayments, final String dateFormat) { + private Count importEntity(final Workbook workbook, final List loanRepayments, final String dateFormat, + final String locale) { Sheet loanRepaymentSheet = workbook.getSheet(TemplatePopulateImportConstants.LOAN_REPAYMENT_SHEET_NAME); int successCount = 0; int errorCount = 0; String errorMessage; GsonBuilder gsonBuilder = GoogleGsonSerializerHelper.createGsonBuilder(); - gsonBuilder.registerTypeAdapter(LocalDate.class, new DateSerializer(dateFormat)); + gsonBuilder.registerTypeAdapter(LocalDate.class, new DateSerializer(dateFormat, locale)); for (LoanTransactionData loanRepayment : loanRepayments) { try { diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/populator/fixeddeposits/FixedDepositTransactionWorkbookPopulator.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/populator/fixeddeposits/FixedDepositTransactionWorkbookPopulator.java index b656567a7..32946749f 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/populator/fixeddeposits/FixedDepositTransactionWorkbookPopulator.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/populator/fixeddeposits/FixedDepositTransactionWorkbookPopulator.java @@ -139,7 +139,7 @@ public class FixedDepositTransactionWorkbookPopulator extends AbstractWorkbookPo DataValidationConstraint paymentTypeConstraint = validationHelper.createFormulaListConstraint("PaymentTypes"); DataValidationConstraint transactionDateConstraint = validationHelper.createDateConstraint( DataValidationConstraint.OperatorType.BETWEEN, - "=DATEVALUE(VLOOKUP($C1,$R$2:$T$" + (savingsAccounts.size() + 1) + ",4,FALSE))", "=TODAY()", dateFormat); + "=DATEVALUE(VLOOKUP($C1,$R$2:$U$" + (savingsAccounts.size() + 1) + ",4,FALSE))", "=TODAY()", dateFormat); DataValidation officeValidation = validationHelper.createValidation(officeNameConstraint, officeNameRange); DataValidation clientValidation = validationHelper.createValidation(clientNameConstraint, clientNameRange); diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/populator/fixeddeposits/FixedDepositWorkbookPopulator.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/populator/fixeddeposits/FixedDepositWorkbookPopulator.java index 325a91d19..10d81e85c 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/populator/fixeddeposits/FixedDepositWorkbookPopulator.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/populator/fixeddeposits/FixedDepositWorkbookPopulator.java @@ -340,8 +340,10 @@ public class FixedDepositWorkbookPopulator extends AbstractWorkbookPopulator { writeString(FixedDepositConstants.INTEREST_CALCULATION_COL, rowHeader, "Interest Calculated*"); writeString(FixedDepositConstants.INTEREST_CALCULATION_DAYS_IN_YEAR_COL, rowHeader, "# Days in Year*"); writeString(FixedDepositConstants.LOCKIN_PERIOD_COL, rowHeader, "Locked In For"); + writeString(FixedDepositConstants.LOCKIN_PERIOD_FREQUENCY_COL, rowHeader, "Locked Period frecuency"); writeString(FixedDepositConstants.DEPOSIT_AMOUNT_COL, rowHeader, "Deposit Amount"); writeString(FixedDepositConstants.DEPOSIT_PERIOD_COL, rowHeader, "Deposit Period*"); + writeString(FixedDepositConstants.DEPOSIT_PERIOD_FREQUENCY_COL, rowHeader, "Deposit period frecuency"); writeString(FixedDepositConstants.EXTERNAL_ID_COL, rowHeader, "External Id"); writeString(FixedDepositConstants.CHARGE_ID_1, rowHeader, "Charge Id"); diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/populator/recurringdeposit/RecurringDepositTransactionWorkbookPopulator.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/populator/recurringdeposit/RecurringDepositTransactionWorkbookPopulator.java index a35c963bc..659b2603b 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/populator/recurringdeposit/RecurringDepositTransactionWorkbookPopulator.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/populator/recurringdeposit/RecurringDepositTransactionWorkbookPopulator.java @@ -140,7 +140,7 @@ public class RecurringDepositTransactionWorkbookPopulator extends AbstractWorkbo DataValidationConstraint paymentTypeConstraint = validationHelper.createFormulaListConstraint("PaymentTypes"); DataValidationConstraint transactionDateConstraint = validationHelper.createDateConstraint( DataValidationConstraint.OperatorType.BETWEEN, - "=DATEVALUE(VLOOKUP($C1,$R$2:$T$" + (savingsAccounts.size() + 1) + ",4,FALSE))", "=TODAY()", dateFormat); + "=DATEVALUE(VLOOKUP($C1,$R$2:$U$" + (savingsAccounts.size() + 1) + ",4,FALSE))", "=TODAY()", dateFormat); DataValidation officeValidation = validationHelper.createValidation(officeNameConstraint, officeNameRange); DataValidation clientValidation = validationHelper.createValidation(clientNameConstraint, clientNameRange); diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/populator/savings/SavingsTransactionsWorkbookPopulator.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/populator/savings/SavingsTransactionsWorkbookPopulator.java index 8210d8b5e..e1366e37f 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/populator/savings/SavingsTransactionsWorkbookPopulator.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/populator/savings/SavingsTransactionsWorkbookPopulator.java @@ -139,7 +139,7 @@ public class SavingsTransactionsWorkbookPopulator extends AbstractWorkbookPopula DataValidationConstraint paymentTypeConstraint = validationHelper.createFormulaListConstraint("PaymentTypes"); DataValidationConstraint transactionDateConstraint = validationHelper.createDateConstraint( DataValidationConstraint.OperatorType.BETWEEN, - "=DATEVALUE(VLOOKUP($C1,$R$2:$T$" + (savingsAccounts.size() + 1) + ",4,FALSE))", "=TODAY()", dateFormat); + "=DATEVALUE(VLOOKUP($C1,$R$2:$U$" + (savingsAccounts.size() + 1) + ",4,FALSE))", "=TODAY()", dateFormat); DataValidation officeValidation = validationHelper.createValidation(officeNameConstraint, officeNameRange); DataValidation clientValidation = validationHelper.createValidation(clientNameConstraint, clientNameRange); @@ -234,13 +234,12 @@ public class SavingsTransactionsWorkbookPopulator extends AbstractWorkbookPopula if (savingsAccount.getMinRequiredOpeningBalance() != null) { writeBigDecimal(TransactionConstants.LOOKUP_OPENING_BALANCE_COL, row, savingsAccount.getMinRequiredOpeningBalance()); } - if (savingsAccount.getActivatedOnDate() != null) { - writeDate(TransactionConstants.LOOKUP_SAVINGS_ACTIVATION_DATE_COL, row, - "" + savingsAccount.getTimeline().getActivatedOnDate().getDayOfMonth() + "/" - + savingsAccount.getTimeline().getActivatedOnDate().getMonthValue() + "/" - + savingsAccount.getTimeline().getActivatedOnDate().getYear(), - dateCellStyle, dateFormat); - } + writeDate(TransactionConstants.LOOKUP_SAVINGS_ACTIVATION_DATE_COL, row, + "" + savingsAccount.getTimeline().getActivatedOnDate().getDayOfMonth() + "/" + + savingsAccount.getTimeline().getActivatedOnDate().getMonthValue() + "/" + + savingsAccount.getTimeline().getActivatedOnDate().getYear(), + dateCellStyle, dateFormat); + } } diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/address/serialization/AddressCommandFromApiJsonDeserializer.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/address/serialization/AddressCommandFromApiJsonDeserializer.java index 0a00c7cae..f332cf7bf 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/address/serialization/AddressCommandFromApiJsonDeserializer.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/address/serialization/AddressCommandFromApiJsonDeserializer.java @@ -71,6 +71,7 @@ public class AddressCommandFromApiJsonDeserializer { supportedParameters.add("locale"); supportedParameters.add("dateFormat"); + supportedParameters.add("street"); supportedParameters.add(fromNewClient ? "addressTypeId" : "addressId"); this.fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, json, supportedParameters); diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/data/ClientDataValidator.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/data/ClientDataValidator.java index 0aa7f4745..ac9922704 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/data/ClientDataValidator.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/data/ClientDataValidator.java @@ -227,7 +227,7 @@ public final class ClientDataValidator { if (this.configurationReadPlatformService.retrieveGlobalConfiguration(GlobalConfigurationConstants.ENABLE_ADDRESS).isEnabled()) { final JsonArray address = this.fromApiJsonHelper.extractJsonArrayNamed(ClientApiConstants.address, element); - baseDataValidator.reset().parameter(ClientApiConstants.address).value(address).notNull().jsonArrayNotEmpty(); + baseDataValidator.reset().parameter(ClientApiConstants.address).value(address).ignoreIfNull().jsonArrayNotEmpty(); } List dataValidationErrorsForClientNonPerson = getDataValidationErrorsForCreateOnClientNonPerson( diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/serialization/LoanTransactionValidatorImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/serialization/LoanTransactionValidatorImpl.java index 5123174ad..3e6911a8b 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/serialization/LoanTransactionValidatorImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/serialization/LoanTransactionValidatorImpl.java @@ -947,7 +947,7 @@ public final class LoanTransactionValidatorImpl implements LoanTransactionValida final Set transactionParameters = new HashSet<>( Arrays.asList("transactionDate", "transactionAmount", "externalId", "note", "locale", "dateFormat", "paymentTypeId", - "accountNumber", "checkNumber", "routingCode", "receiptNumber", "bankNumber", "loanId")); + "accountNumber", "checkNumber", "routingCode", "receiptNumber", "bankNumber", "loanId", "numberOfRepayments")); final Type typeOfMap = new TypeToken>() {}.getType(); this.fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, json, transactionParameters); diff --git a/fineract-savings/src/main/java/org/apache/fineract/portfolio/savings/data/SavingsAccountDataValidator.java b/fineract-savings/src/main/java/org/apache/fineract/portfolio/savings/data/SavingsAccountDataValidator.java index d9b662c09..9f44d494a 100644 --- a/fineract-savings/src/main/java/org/apache/fineract/portfolio/savings/data/SavingsAccountDataValidator.java +++ b/fineract-savings/src/main/java/org/apache/fineract/portfolio/savings/data/SavingsAccountDataValidator.java @@ -185,8 +185,8 @@ public class SavingsAccountDataValidator { if (lockinPeriodFrequency != null) { final Integer lockinPeriodFrequencyType = this.fromApiJsonHelper - .extractIntegerSansLocaleNamed(lockinPeriodFrequencyTypeParamName, element); - baseDataValidator.reset().parameter(lockinPeriodFrequencyTypeParamName).value(lockinPeriodFrequencyType).ignoreIfNull() + .extractIntegerSansLocaleNamed(lockinPeriodFrequencyParamName, element); + baseDataValidator.reset().parameter(lockinPeriodFrequencyParamName).value(lockinPeriodFrequencyType).notNull() .inMinMaxRange(0, 3); } } diff --git a/fineract-savings/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccount.java b/fineract-savings/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccount.java index 59bba2100..5db6e32dc 100644 --- a/fineract-savings/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccount.java +++ b/fineract-savings/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccount.java @@ -1851,13 +1851,13 @@ public class SavingsAccount extends AbstractAuditableWithUTCDateTimeCustom .inMinMaxRange(0, 3); if (this.lockinPeriodFrequencyType != null) { - baseDataValidator.reset().parameter(lockinPeriodFrequencyParamName).value(this.lockinPeriodFrequency).notNull() + baseDataValidator.reset().parameter(lockinPeriodFrequencyParamName).value(this.lockinPeriodFrequency).ignoreIfNull() .integerZeroOrGreater(); } } else { baseDataValidator.reset().parameter(lockinPeriodFrequencyParamName).value(this.lockinPeriodFrequencyType) .integerZeroOrGreater(); - baseDataValidator.reset().parameter(lockinPeriodFrequencyTypeParamName).value(this.lockinPeriodFrequencyType).notNull() + baseDataValidator.reset().parameter(lockinPeriodFrequencyTypeParamName).value(this.lockinPeriodFrequencyType).ignoreIfNull() .inMinMaxRange(0, 3); } }