FINERACT-2202: Bulk import fix

This commit is contained in:
danielales2541
2025-04-22 10:55:45 +02:00
committed by Adam Saghy
parent 1b9cb5c6d5
commit d15243fb31
9 changed files with 41 additions and 40 deletions
@@ -62,7 +62,7 @@ public class ClientPersonImportHandler implements ImportHandler {
public Count process(final Workbook workbook, final String locale, final String dateFormat) {
List<ClientData> clients = readExcelFile(workbook, locale, dateFormat);
return importEntity(workbook, clients, dateFormat);
return importEntity(workbook, clients, dateFormat, locale);
}
public List<ClientData> readExcelFile(final Workbook workbook, final String locale, final String dateFormat) {
@@ -183,13 +183,13 @@ public class ClientPersonImportHandler implements ImportHandler {
}
public Count importEntity(final Workbook workbook, final List<ClientData> clients, final String dateFormat) {
public Count importEntity(final Workbook workbook, final List<ClientData> clients, final String dateFormat, String locale) {
Sheet clientSheet = workbook.getSheet(TemplatePopulateImportConstants.CLIENT_PERSON_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 (ClientData client : clients) {
try {
String payload = gsonBuilder.create().toJson(client);
@@ -124,7 +124,6 @@ public class LoanImportHandler implements ImportHandler {
if (ImportHandlerUtils.readAsLong(LoanConstants.LINK_ACCOUNT_ID, row) != null) {
linkAccountId = Objects.requireNonNull(ImportHandlerUtils.readAsLong(LoanConstants.LINK_ACCOUNT_ID, row)).toString();
}
if (disbursedDate != null) {
return DisbursementData.importInstance(disbursedDate, linkAccountId, row.getRowNum(), locale, dateFormat);
}
@@ -238,7 +237,6 @@ public class LoanImportHandler implements ImportHandler {
String loanRepaymentScheduleTransactionProcessorStrategy = ImportHandlerUtils.readAsString(LoanConstants.REPAYMENT_STRATEGY_COL,
row);
LoanRepaymentScheduleTransactionProcessor loanRepaymentScheduleTransactionProcessor = loanRepaymentScheduleTransactionProcessorFactory
.determineProcessor(loanRepaymentScheduleTransactionProcessorStrategy);
@@ -366,7 +364,7 @@ public class LoanImportHandler implements ImportHandler {
.getIdByName(workbook.getSheet(TemplatePopulateImportConstants.GROUP_SHEET_NAME), clientOrGroupName);
return LoanAccountData.importInstanceGroup(loanTypeEnumOption, groupIdforGroupLoan, productId, loanOfficerId,
submittedOnDate, fundId, principal, numberOfRepayments, repaidEvery, repaidEveryFrequencyEnums, loanTerm,
loanTermFrequencyEnum, nominalInterestRate, amortizationEnumOption, interestMethodEnum,
loanTermFrequencyEnum, nominalInterestRate, submittedOnDate, amortizationEnumOption, interestMethodEnum,
interestCalculationPeriodEnum, arrearsTolerance, repaymentStrategyCode, graceOnPrincipalPayment,
graceOnInterestPayment, graceOnInterestCharged, interestChargedFromDate, firstRepaymentOnDate, row.getRowNum(),
externalId, linkAccountId, locale, dateFormat, null);
@@ -349,7 +349,7 @@ public class SavingsImportHandler implements ImportHandler {
final String dateFormat) {
if (activationDates.get(i) != null) {
GsonBuilder gsonBuilder = GoogleGsonSerializerHelper.createGsonBuilder();
gsonBuilder.registerTypeAdapter(LocalDate.class, new DateSerializer(dateFormat));
gsonBuilder.registerTypeAdapter(LocalDate.class, new DateSerializer(dateFormat, activationDates.get(i).getLocale()));
String payload = gsonBuilder.create().toJson(activationDates.get(i));
final CommandWrapper commandRequest = new CommandWrapperBuilder() //
.savingsAccountActivation(savingsId)//
@@ -364,7 +364,7 @@ public class SavingsImportHandler implements ImportHandler {
final String dateFormat) {
if (approvalDates.get(i) != null) {
GsonBuilder gsonBuilder = GoogleGsonSerializerHelper.createGsonBuilder();
gsonBuilder.registerTypeAdapter(LocalDate.class, new DateSerializer(dateFormat));
gsonBuilder.registerTypeAdapter(LocalDate.class, new DateSerializer(dateFormat, approvalDates.get(i).getLocale()));
String payload = gsonBuilder.create().toJson(approvalDates.get(i));
final CommandWrapper commandRequest = new CommandWrapperBuilder() //
.approveSavingsAccountApplication(savingsId)//
@@ -377,7 +377,7 @@ public class SavingsImportHandler implements ImportHandler {
private CommandProcessingResult importSavings(final List<SavingsAccountData> savings, final int i, final String dateFormat) {
GsonBuilder gsonBuilder = GoogleGsonSerializerHelper.createGsonBuilder();
gsonBuilder.registerTypeAdapter(LocalDate.class, new DateSerializer(dateFormat));
gsonBuilder.registerTypeAdapter(LocalDate.class, new DateSerializer(dateFormat, savings.get(i).getLocale()));
gsonBuilder.registerTypeAdapter(EnumOptionData.class, new EnumOptionDataIdSerializer());
JsonObject savingsJsonob = gsonBuilder.create().toJsonTree(savings.get(i)).getAsJsonObject();
savingsJsonob.remove("isDormancyTrackingActive");
@@ -115,6 +115,7 @@ public abstract class AbstractWorkbookPopulator implements WorkbookPopulator {
dateCellStyle.setDataFormat(df);
int rowIndex = 0;
DateTimeFormatter outputFormat = new DateTimeFormatterBuilder().appendPattern(dateFormat).toFormatter();
DateTimeFormatter formatter = DateTimeFormatter.ofPattern(dateFormat);
try {
if (clients != null) {
for (ClientData client : clients) {
@@ -125,7 +126,7 @@ public abstract class AbstractWorkbookPopulator implements WorkbookPopulator {
writeString(nameCol, row, client.getDisplayName().replaceAll("[ )(] ", "_") + "(" + client.getId() + ")");
if (client.getActivationDate() != null) {
writeDate(activationDateCol, row, outputFormat.format(client.getActivationDate()), dateCellStyle, dateFormat);
writeDate(activationDateCol, row, client.getActivationDate().format(formatter), dateCellStyle, dateFormat);
}
if (containsClientExtId) {
if (!client.getExternalId().isEmpty()) {
@@ -166,10 +166,10 @@ public class LoanWorkbookPopulator extends AbstractWorkbookPopulator {
.createFormulaListConstraint("INDIRECT(CONCATENATE(\"Staff_\",$A1))");
DataValidationConstraint submittedDateConstraint = validationHelper.createDateConstraint(
DataValidationConstraint.OperatorType.BETWEEN,
"=IF(INDIRECT(CONCATENATE(\"START_DATE_\",$E1))>VLOOKUP($C1,$AR$2:$AT$"
+ (clientSheetPopulator.getClientsSize() + groupSheetPopulator.getGroupsSize() + 1)
+ ",3,FALSE),INDIRECT(CONCATENATE(\"START_DATE_\",$E1)),VLOOKUP($C1,$AR$2:$AT$"
+ (clientSheetPopulator.getClientsSize() + groupSheetPopulator.getGroupsSize() + 1) + ",3,FALSE))",
"=IF(" + "DATEVALUE(INDIRECT(\"START_DATE_\" & $E1)) > DATEVALUE(VLOOKUP($C1, $AR$2:$AT$"
+ (clientSheetPopulator.getClientsSize() + groupSheetPopulator.getGroupsSize() + 1) + ", 3, FALSE)), "
+ "DATEVALUE(INDIRECT(\"START_DATE_\" & $E1)), " + "DATEVALUE(VLOOKUP($C1, $AR$2:$AT$"
+ (clientSheetPopulator.getClientsSize() + groupSheetPopulator.getGroupsSize() + 1) + ", 3, FALSE)))",
"=TODAY()", dateFormat);
DataValidationConstraint approvalDateConstraint = validationHelper
.createDateConstraint(DataValidationConstraint.OperatorType.BETWEEN, "=$G1", "=TODAY()", dateFormat);
@@ -112,8 +112,8 @@ public class SavingsTransactionsWorkbookPopulator extends AbstractWorkbookPopula
.createExplicitListConstraint(new String[] { "Withdrawal", "Deposit" });
DataValidationConstraint paymentTypeConstraint = validationHelper.createFormulaListConstraint("PaymentTypes");
DataValidationConstraint transactionDateConstraint = validationHelper.createDateConstraint(
DataValidationConstraint.OperatorType.BETWEEN, "=VLOOKUP($C1,$Q$2:$T$" + (savingsAccounts.size() + 1) + ",4,FALSE)",
"=TODAY()", dateFormat);
DataValidationConstraint.OperatorType.BETWEEN,
"=DATEVALUE(VLOOKUP($C1,$Q$2:$T$" + (savingsAccounts.size() + 1) + ",4,FALSE))", "=TODAY()", dateFormat);
DataValidation officeValidation = validationHelper.createValidation(officeNameConstraint, officeNameRange);
DataValidation clientValidation = validationHelper.createValidation(clientNameConstraint, clientNameRange);
@@ -208,11 +208,13 @@ public class SavingsTransactionsWorkbookPopulator extends AbstractWorkbookPopula
if (savingsAccount.getMinRequiredOpeningBalance() != null) {
writeBigDecimal(TransactionConstants.LOOKUP_OPENING_BALANCE_COL, row, savingsAccount.getMinRequiredOpeningBalance());
}
writeDate(TransactionConstants.LOOKUP_SAVINGS_ACTIVATION_DATE_COL, row,
"" + savingsAccount.getTimeline().getActivatedOnDate().getDayOfMonth() + "/"
+ savingsAccount.getTimeline().getActivatedOnDate().getMonthValue() + "/"
+ savingsAccount.getTimeline().getActivatedOnDate().getYear(),
dateCellStyle, dateFormat);
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);
}
}
}
@@ -131,7 +131,7 @@ public class SavingsWorkbookPopulator extends AbstractWorkbookPopulator {
writeString(SavingsConstants.INTEREST_CALCULATION_COL, rowHeader, "Interest Calculated*");
writeString(SavingsConstants.INTEREST_CALCULATION_DAYS_IN_YEAR_COL, rowHeader, "# Days in Year*");
writeString(SavingsConstants.MIN_OPENING_BALANCE_COL, rowHeader, "Min Opening Balance");
writeString(SavingsConstants.LOCKIN_PERIOD_COL, rowHeader, "Locked In For");
writeString(SavingsConstants.LOCKIN_PERIOD_COL, rowHeader, "Locked In For*");
writeString(SavingsConstants.APPLY_WITHDRAWAL_FEE_FOR_TRANSFERS, rowHeader, "Apply Withdrawal Fee For Transfers");
writeString(SavingsConstants.LOOKUP_CLIENT_NAME_COL, rowHeader, "Client Name");
@@ -234,8 +234,8 @@ public class SavingsWorkbookPopulator extends AbstractWorkbookPopulator {
DataValidationConstraint fieldOfficerNameConstraint = validationHelper
.createFormulaListConstraint("INDIRECT(CONCATENATE(\"Staff_\",$A1))");
DataValidationConstraint submittedDateConstraint = validationHelper.createDateConstraint(
DataValidationConstraint.OperatorType.BETWEEN,
"=VLOOKUP($C1,$AF$2:$AG$" + (clientSheetPopulator.getClientsSize() + groupSheetPopulator.getGroupsSize() + 1) + ",2,FALSE)",
DataValidationConstraint.OperatorType.BETWEEN, "=DATEVALUE(VLOOKUP($C1,$AF$2:$AG$"
+ (clientSheetPopulator.getClientsSize() + groupSheetPopulator.getGroupsSize() + 1) + ",2,FALSE))",
"=TODAY()", dateFormat);
DataValidationConstraint approvalDateConstraint = validationHelper
.createDateConstraint(DataValidationConstraint.OperatorType.BETWEEN, "=$F1", "=TODAY()", dateFormat);
@@ -310,24 +310,25 @@ public class LoanAccountData {
public static LoanAccountData importInstanceGroup(EnumOptionData loanTypeEnumOption, Long groupIdforGroupLoan, Long productId,
Long loanOfficerId, LocalDate submittedOnDate, Long fundId, BigDecimal principal, Integer numberOfRepayments,
Integer repaidEvery, EnumOptionData repaidEveryFrequencyEnums, Integer loanTermFrequency,
EnumOptionData loanTermFrequencyTypeEnum, BigDecimal nominalInterestRate, EnumOptionData amortizationEnumOption,
EnumOptionData interestMethodEnum, EnumOptionData interestCalculationPeriodEnum, BigDecimal arrearsTolerance,
String transactionProcessingStrategyCode, Integer graceOnPrincipalPayment, Integer graceOnInterestPayment,
Integer graceOnInterestCharged, LocalDate interestChargedFromDate, LocalDate repaymentsStartingFromDate, Integer rowIndex,
ExternalId externalId, String linkAccountId, String locale, String dateFormat, Integer fixedLength) {
EnumOptionData loanTermFrequencyTypeEnum, BigDecimal nominalInterestRate, LocalDate expectedDisbursementDate,
EnumOptionData amortizationEnumOption, EnumOptionData interestMethodEnum, EnumOptionData interestCalculationPeriodEnum,
BigDecimal arrearsTolerance, String transactionProcessingStrategyCode, Integer graceOnPrincipalPayment,
Integer graceOnInterestPayment, Integer graceOnInterestCharged, LocalDate interestChargedFromDate,
LocalDate repaymentsStartingFromDate, Integer rowIndex, ExternalId externalId, String linkAccountId, String locale,
String dateFormat, Integer fixedLength) {
return new LoanAccountData().setLoanType(loanTypeEnumOption).setGroupId(groupIdforGroupLoan).setProductId(productId)
.setLoanOfficerId(loanOfficerId).setSubmittedOnDate(submittedOnDate).setFundId(fundId).setPrincipal(principal)
.setNumberOfRepayments(numberOfRepayments).setRepaymentEvery(repaidEvery)
.setRepaymentFrequencyType(repaidEveryFrequencyEnums).setLoanTermFrequency(loanTermFrequency)
.setLoanTermFrequencyType(loanTermFrequencyTypeEnum).setInterestRatePerPeriod(nominalInterestRate)
.setAmortizationTypeOptions(List.of(amortizationEnumOption)).setInterestType(interestMethodEnum)
.setInterestCalculationPeriodType(interestCalculationPeriodEnum).setInArrearsTolerance(arrearsTolerance)
.setTransactionProcessingStrategyCode(transactionProcessingStrategyCode).setGraceOnPrincipalPayment(graceOnPrincipalPayment)
.setGraceOnInterestPayment(graceOnInterestPayment).setGraceOnInterestCharged(graceOnInterestCharged)
.setInterestChargedFromDate(interestChargedFromDate).setRepaymentsStartingFromDate(repaymentsStartingFromDate)
.setRowIndex(rowIndex).setExternalId(externalId).setLinkAccountId(linkAccountId).setLocale(locale).setDateFormat(dateFormat)
.setFixedLength(fixedLength);
.setAmortizationType(amortizationEnumOption).setInterestType(interestMethodEnum)
.setExpectedDisbursementDate(expectedDisbursementDate).setInterestCalculationPeriodType(interestCalculationPeriodEnum)
.setInArrearsTolerance(arrearsTolerance).setTransactionProcessingStrategyCode(transactionProcessingStrategyCode)
.setGraceOnPrincipalPayment(graceOnPrincipalPayment).setGraceOnInterestPayment(graceOnInterestPayment)
.setGraceOnInterestCharged(graceOnInterestCharged).setInterestChargedFromDate(interestChargedFromDate)
.setRepaymentsStartingFromDate(repaymentsStartingFromDate).setRowIndex(rowIndex).setExternalId(externalId)
.setLinkAccountId(linkAccountId).setLocale(locale).setDateFormat(dateFormat).setFixedLength(fixedLength);
}
public LoanAccountData withClientData(final ClientData clientData) {
@@ -164,7 +164,7 @@ public class SavingsAccountReadPlatformServiceImpl implements SavingsAccountRead
sqlBuilder.append(" join m_office o on o.id = c.office_id");
sqlBuilder.append(" where o.hierarchy like ?");
final Object[] objectArray = new Object[2];
final Object[] objectArray = new Object[3];
objectArray[0] = hierarchySearchString;
int arrayPos = 1;
if (searchParameters != null) {
@@ -181,9 +181,8 @@ public class SavingsAccountReadPlatformServiceImpl implements SavingsAccountRead
arrayPos = arrayPos + 1;
}
if (searchParameters.getOfficeId() != null) {
sqlBuilder.append("and c.office_id =?");
objectArray[arrayPos] = searchParameters.getOfficeId();
arrayPos = arrayPos + 1;
sqlBuilder.append(" and c.office_id = ?");
objectArray[arrayPos++] = searchParameters.getOfficeId();
}
if (searchParameters.hasOrderBy()) {
sqlBuilder.append(" order by ").append(searchParameters.getOrderBy());