From e5a23406ca5e79c6efa3c1810567a932de11530f Mon Sep 17 00:00:00 2001 From: Oleksii Novikov Date: Wed, 23 Apr 2025 12:32:23 +0300 Subject: [PATCH] FINERACT-2080: Extract accountNumberRequiresAutoGeneration from loan entity --- .../portfolio/loanaccount/domain/Loan.java | 10 -- ...WritePlatformServiceJpaRepositoryImpl.java | 1 - .../service/LoanAssemblerImpl.java | 128 +++++++++--------- 3 files changed, 66 insertions(+), 73 deletions(-) diff --git a/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/Loan.java b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/Loan.java index fe77571ca..b7c31293e 100644 --- a/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/Loan.java +++ b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/Loan.java @@ -35,7 +35,6 @@ import jakarta.persistence.OneToMany; import jakarta.persistence.OneToOne; import jakarta.persistence.OrderBy; import jakarta.persistence.Table; -import jakarta.persistence.Transient; import jakarta.persistence.UniqueConstraint; import jakarta.persistence.Version; import jakarta.validation.constraints.NotNull; @@ -322,9 +321,6 @@ public class Loan extends AbstractAuditableWithUTCDateTimeCustom { @Embedded private LoanSummary summary; - @Transient - private boolean accountNumberRequiresAutoGeneration; - @Setter() @Column(name = "principal_amount_proposed", scale = 6, precision = 19, nullable = false) private BigDecimal proposedPrincipal; @@ -506,7 +502,6 @@ public class Loan extends AbstractAuditableWithUTCDateTimeCustom { if (StringUtils.isBlank(accountNo)) { this.accountNumber = new RandomPasswordGenerator(19).generate(); - this.accountNumberRequiresAutoGeneration = true; } else { this.accountNumber = accountNo; } @@ -841,11 +836,6 @@ public class Loan extends AbstractAuditableWithUTCDateTimeCustom { this.loanProduct = loanProduct; } - public void updateAccountNo(final String newAccountNo) { - this.accountNumber = newAccountNo; - this.accountNumberRequiresAutoGeneration = false; - } - public void updateFund(final Fund fund) { this.fund = fund; } diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanApplicationWritePlatformServiceJpaRepositoryImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanApplicationWritePlatformServiceJpaRepositoryImpl.java index e902b10fe..cbd6c829c 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanApplicationWritePlatformServiceJpaRepositoryImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanApplicationWritePlatformServiceJpaRepositoryImpl.java @@ -131,7 +131,6 @@ public class LoanApplicationWritePlatformServiceJpaRepositoryImpl implements Loa @Transactional @Override public CommandProcessingResult submitApplication(final JsonCommand command) { - try { // Validations (prior assembling) this.loanApplicationValidator.validateForCreate(command); diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanAssemblerImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanAssemblerImpl.java index 73ad304f5..6ef88ae97 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanAssemblerImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanAssemblerImpl.java @@ -292,76 +292,80 @@ public class LoanAssemblerImpl implements LoanAssembler { // TODO: Review... it might be better somewhere else and rethink due to the account number generation logic is // intertwined with GLIM logic @Override - public void accountNumberGeneration(JsonCommand command, Loan loan) { - if (loan.isAccountNumberRequiresAutoGeneration()) { - JsonElement element = command.parsedJson(); - final AccountNumberFormat accountNumberFormat = this.accountNumberFormatRepository.findByAccountType(EntityAccountType.LOAN); - // TODO: It is really weird to set GLIM info only if account number was not provided - // if application is of GLIM type - if (loan.getLoanType().isGLIMAccount()) { - Group group = loan.getGroup(); - String accountNumber = ""; - BigDecimal applicationId = BigDecimal.ZERO; - Boolean isLastChildApplication = false; - // GLIM specific parameters - final Locale locale = this.fromApiJsonHelper.extractLocaleParameter(element.getAsJsonObject()); - BigDecimal applicationIdFromParam = this.fromApiJsonHelper.extractBigDecimalNamed("applicationId", element, locale); - BigDecimal totalLoan = this.fromApiJsonHelper.extractBigDecimalNamed("totalLoan", element, locale); - if (applicationIdFromParam != null) { - applicationId = applicationIdFromParam; - } + public void accountNumberGeneration(final JsonCommand command, final Loan loan) { + final JsonElement element = command.parsedJson(); - Boolean isLastChildApplicationFromParam = this.fromApiJsonHelper.extractBooleanNamed("lastApplication", element); - if (isLastChildApplicationFromParam != null) { - isLastChildApplication = isLastChildApplicationFromParam; - } + final String accountNo = this.fromApiJsonHelper.extractStringNamed("accountNo", element); + final boolean isAccountNumberRequiresAutoGeneration = StringUtils.isBlank(accountNo); + if (!isAccountNumberRequiresAutoGeneration) { + return; + } - if (this.fromApiJsonHelper.extractBooleanNamed("isParentAccount", element) != null) { - // empty table check - // TODO: This count here is weird... and seems parent-empty and parent not empty looks the same - if (glimRepository.count() != 0) { - // **************Parent-Not an empty - // table******************** - createAndSetGLIMAccount(totalLoan, loan, accountNumberFormat, group, applicationId); - } else { - // ************** Parent-empty - // table******************** - createAndSetGLIMAccount(totalLoan, loan, accountNumberFormat, group, applicationId); - } - } else { - // TODO: This count here is weird... - if (glimRepository.count() != 0) { - // Child-Not an empty table - GroupLoanIndividualMonitoringAccount glimAccount = glimRepository.findOneByIsAcceptingChildAndApplicationId(true, - applicationId); - accountNumber = glimAccount.getAccountNumber() + (glimAccount.getChildAccountsCount() + 1); - loan.updateAccountNo(accountNumber); - this.glimAccountInfoWritePlatformService.incrementChildAccountCount(glimAccount); - loan.setGlim(glimAccount); - } else { - // **************Child-empty - // table******************** - // if the glim info is empty set the current account - // as parent - createAndSetGLIMAccount(totalLoan, loan, accountNumberFormat, group, applicationId); - } - // reset in cases of last child application of glim - if (isLastChildApplication) { - this.glimAccountInfoWritePlatformService - .resetIsAcceptingChild(glimRepository.findOneByIsAcceptingChildAndApplicationId(true, applicationId)); - } - } - } else { // for applications other than GLIM - loan.updateAccountNo(this.accountNumberGenerator.generate(loan, accountNumberFormat)); + final AccountNumberFormat accountNumberFormat = this.accountNumberFormatRepository.findByAccountType(EntityAccountType.LOAN); + // TODO: It is really weird to set GLIM info only if account number was not provided + // if application is of GLIM type + if (loan.getLoanType().isGLIMAccount()) { + Group group = loan.getGroup(); + String accountNumber; + BigDecimal applicationId = BigDecimal.ZERO; + // GLIM specific parameters + final Locale locale = this.fromApiJsonHelper.extractLocaleParameter(element.getAsJsonObject()); + BigDecimal applicationIdFromParam = this.fromApiJsonHelper.extractBigDecimalNamed("applicationId", element, locale); + BigDecimal totalLoan = this.fromApiJsonHelper.extractBigDecimalNamed("totalLoan", element, locale); + if (applicationIdFromParam != null) { + applicationId = applicationIdFromParam; } + + Boolean isLastChildApplicationFromParam = this.fromApiJsonHelper.extractBooleanNamed("lastApplication", element); + boolean isLastChildApplication = false; + if (isLastChildApplicationFromParam != null) { + isLastChildApplication = isLastChildApplicationFromParam; + } + + if (this.fromApiJsonHelper.extractBooleanNamed("isParentAccount", element) != null) { + // empty table check + // TODO: This count here is weird... and seems parent-empty and parent not empty looks the same + if (glimRepository.count() != 0) { + // **************Parent-Not an empty + // table******************** + createAndSetGLIMAccount(totalLoan, loan, accountNumberFormat, group, applicationId); + } else { + // ************** Parent-empty + // table******************** + createAndSetGLIMAccount(totalLoan, loan, accountNumberFormat, group, applicationId); + } + } else { + // TODO: This count here is weird... + if (glimRepository.count() != 0) { + // Child-Not an empty table + GroupLoanIndividualMonitoringAccount glimAccount = glimRepository.findOneByIsAcceptingChildAndApplicationId(true, + applicationId); + accountNumber = glimAccount.getAccountNumber() + (glimAccount.getChildAccountsCount() + 1); + loan.setAccountNumber(accountNumber); + this.glimAccountInfoWritePlatformService.incrementChildAccountCount(glimAccount); + loan.setGlim(glimAccount); + } else { + // **************Child-empty + // table******************** + // if the glim info is empty set the current account + // as parent + createAndSetGLIMAccount(totalLoan, loan, accountNumberFormat, group, applicationId); + } + // reset in cases of last child application of glim + if (isLastChildApplication) { + this.glimAccountInfoWritePlatformService + .resetIsAcceptingChild(glimRepository.findOneByIsAcceptingChildAndApplicationId(true, applicationId)); + } + } + } else { // for applications other than GLIM + loan.setAccountNumber(this.accountNumberGenerator.generate(loan, accountNumberFormat)); } } private void createAndSetGLIMAccount(BigDecimal totalLoan, Loan loan, AccountNumberFormat accountNumberFormat, Group group, BigDecimal applicationId) { - String accountNumber; - accountNumber = this.accountNumberGenerator.generate(loan, accountNumberFormat); - loan.updateAccountNo(accountNumber + "1"); + final String accountNumber = this.accountNumberGenerator.generate(loan, accountNumberFormat); + loan.setAccountNumber(accountNumber + "1"); GroupLoanIndividualMonitoringAccount glimAccount = glimAccountInfoWritePlatformService.createGLIMAccount(accountNumber, group, totalLoan, 1L, true, LoanStatus.SUBMITTED_AND_PENDING_APPROVAL.getValue(), applicationId); loan.setGlim(glimAccount);