This is an automated email from the ASF dual-hosted git repository.

victorromero pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/fineract.git


The following commit(s) were added to refs/heads/develop by this push:
     new fa405f09fd FINERACT-2202: Bulk import fix (#4709)
fa405f09fd is described below

commit fa405f09fdaf4929beab2409d153b9ec62bcb2e4
Author: Edder-Sanjuan <[email protected]>
AuthorDate: Fri May 30 18:47:09 2025 -0600

    FINERACT-2202: Bulk import fix (#4709)
    
    Co-authored-by: Edder Lugo <[email protected]>
---
 .../loanrepayment/LoanRepaymentImportHandler.java         |  7 ++++---
 .../FixedDepositTransactionWorkbookPopulator.java         |  2 +-
 .../fixeddeposits/FixedDepositWorkbookPopulator.java      |  2 ++
 .../RecurringDepositTransactionWorkbookPopulator.java     |  2 +-
 .../savings/SavingsTransactionsWorkbookPopulator.java     | 15 +++++++--------
 .../AddressCommandFromApiJsonDeserializer.java            |  1 +
 .../portfolio/client/data/ClientDataValidator.java        |  2 +-
 .../serialization/LoanTransactionValidatorImpl.java       |  2 +-
 .../savings/data/SavingsAccountDataValidator.java         |  4 ++--
 .../fineract/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 59bdc8296a..72f90c4c7b 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<LoanTransactionData> loanRepayments = readExcelFile(workbook, 
locale, dateFormat);
-        return importEntity(workbook, loanRepayments, dateFormat);
+        return importEntity(workbook, loanRepayments, dateFormat, locale);
     }
 
     private List<LoanTransactionData> 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<LoanTransactionData> loanRepayments, final String dateFormat) {
+    private Count importEntity(final Workbook workbook, final 
List<LoanTransactionData> 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 b656567a79..32946749f2 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 325a91d196..10d81e85cd 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 a35c963bc5..659b2603be 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 8210d8b5e7..e1366e37fa 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 0a00c7cae5..f332cf7bfa 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 0aa7f47457..ac9922704c 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<ApiParameterError> 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 5123174ad1..3e6911a8b9 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<String> 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<Map<String, Object>>() 
{}.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 d9b662c095..9f44d494ad 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 59bba2100a..5db6e32dc1 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<Long>
                     .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);
         }
     }

Reply via email to