This is an automated email from the ASF dual-hosted git repository.
adamsaghy 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 1f00bb6d3 FINERACT-1971: Fix Delinquency bucket error upon Loan
product editing
1f00bb6d3 is described below
commit 1f00bb6d33284c5bc6d974ecbf7eb00938d400fe
Author: Jose Alberto Hernandez <[email protected]>
AuthorDate: Fri Jan 26 14:56:01 2024 -0600
FINERACT-1971: Fix Delinquency bucket error upon Loan product editing
---
.../portfolio/loanproduct/domain/LoanProduct.java | 2 +-
.../service/LoanProductReadPlatformServiceImpl.java | 2 +-
...anProductWritePlatformServiceJpaRepositoryImpl.java | 18 ++++++++++++------
.../DelinquencyBucketsIntegrationTest.java | 8 ++++++++
.../common/loans/LoanTransactionHelper.java | 7 +++++++
5 files changed, 29 insertions(+), 8 deletions(-)
diff --git
a/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/LoanProduct.java
b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/LoanProduct.java
index 8bf064ae5..6db51d8e5 100644
---
a/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/LoanProduct.java
+++
b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/LoanProduct.java
@@ -209,7 +209,7 @@ public class LoanProduct extends AbstractPersistableCustom {
private Integer overAppliedNumber;
@ManyToOne(fetch = FetchType.LAZY)
- @JoinColumn(name = "delinquency_bucket_id")
+ @JoinColumn(name = "delinquency_bucket_id", nullable = true)
private DelinquencyBucket delinquencyBucket;
@Column(name = "enable_installment_level_delinquency", nullable = false)
diff --git
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/service/LoanProductReadPlatformServiceImpl.java
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/service/LoanProductReadPlatformServiceImpl.java
index a672db512..91b10f463 100644
---
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/service/LoanProductReadPlatformServiceImpl.java
+++
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/service/LoanProductReadPlatformServiceImpl.java
@@ -501,7 +501,7 @@ public class LoanProductReadPlatformServiceImpl implements
LoanProductReadPlatfo
final boolean isRatesEnabled = false;
// Delinquency Buckets
- final Long delinquencyBucketId = rs.getLong("delinquencyBucketId");
+ final Long delinquencyBucketId = JdbcSupport.getLong(rs,
"delinquencyBucketId");
final String delinquencyBucketName =
rs.getString("delinquencyBucketName");
final DelinquencyBucketData delinquencyBucket = new
DelinquencyBucketData(delinquencyBucketId, delinquencyBucketName,
new ArrayList<>());
diff --git
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/service/LoanProductWritePlatformServiceJpaRepositoryImpl.java
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/service/LoanProductWritePlatformServiceJpaRepositoryImpl.java
index 6f94cbda3..f06014aa2 100644
---
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/service/LoanProductWritePlatformServiceJpaRepositoryImpl.java
+++
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/service/LoanProductWritePlatformServiceJpaRepositoryImpl.java
@@ -127,9 +127,8 @@ public class
LoanProductWritePlatformServiceJpaRepositoryImpl implements LoanPro
loanRepaymentScheduleTransactionProcessorFactory.determineProcessor(loanTransactionProcessingStrategyCode).getName());
if (command.parameterExists("delinquencyBucketId")) {
- DelinquencyBucket delinquencyBucket =
this.delinquencyBucketRepository
-
.getReferenceById(command.longValueOfParameterNamed("delinquencyBucketId"));
- loanProduct.setDelinquencyBucket(delinquencyBucket);
+ loanProduct
+
.setDelinquencyBucket(findDelinquencyBucketIdIfProvided(command.longValueOfParameterNamed("delinquencyBucketId")));
}
this.loanProductRepository.saveAndFlush(loanProduct);
@@ -168,6 +167,15 @@ public class
LoanProductWritePlatformServiceJpaRepositoryImpl implements LoanPro
return fund;
}
+ private DelinquencyBucket findDelinquencyBucketIdIfProvided(final Long
delinquencyBucketId) {
+ DelinquencyBucket delinquencyBucket = null;
+ if (delinquencyBucketId != null) {
+ delinquencyBucket =
delinquencyBucketRepository.findById(delinquencyBucketId)
+ .orElseThrow(() -> new
FundNotFoundException(delinquencyBucketId));
+ }
+ return delinquencyBucket;
+ }
+
@Transactional
@Override
public CommandProcessingResult updateLoanProduct(final Long loanProductId,
final JsonCommand command) {
@@ -201,9 +209,7 @@ public class
LoanProductWritePlatformServiceJpaRepositoryImpl implements LoanPro
}
if (changes.containsKey("delinquencyBucketId")) {
- final Long delinquencyBucketId = (Long)
changes.get("delinquencyBucketId");
- final DelinquencyBucket delinquencyBucket =
this.delinquencyBucketRepository.getReferenceById(delinquencyBucketId);
- product.setDelinquencyBucket(delinquencyBucket);
+
product.setDelinquencyBucket(findDelinquencyBucketIdIfProvided((Long)
changes.get("delinquencyBucketId")));
}
if (changes.containsKey("transactionProcessingStrategyCode")) {
diff --git
a/integration-tests/src/test/java/org/apache/fineract/integrationtests/DelinquencyBucketsIntegrationTest.java
b/integration-tests/src/test/java/org/apache/fineract/integrationtests/DelinquencyBucketsIntegrationTest.java
index 80b8e9669..9b3953a6d 100644
---
a/integration-tests/src/test/java/org/apache/fineract/integrationtests/DelinquencyBucketsIntegrationTest.java
+++
b/integration-tests/src/test/java/org/apache/fineract/integrationtests/DelinquencyBucketsIntegrationTest.java
@@ -285,12 +285,20 @@ public class DelinquencyBucketsIntegrationTest {
// Loan product creation without Delinquency bucket
GetLoanProductsProductIdResponse getLoanProductResponse =
createLoanProduct(loanTransactionHelper, null, null);
assertNotNull(getLoanProductResponse);
+ assertNull(getLoanProductResponse.getDelinquencyBucket().getId());
// Loan product creation with Delinquency bucket
getLoanProductResponse = createLoanProduct(loanTransactionHelper,
Math.toIntExact(delinquencyBucket.getId()), null);
assertNotNull(getLoanProductResponse);
log.info("Loan Product Bucket Name: {}",
getLoanProductResponse.getDelinquencyBucket().getName());
assertEquals(getLoanProductResponse.getDelinquencyBucket().getName(),
delinquencyBucket.getName());
+
+ // Update Loan product to remove the Delinquency bucket
+ final Long loanProductId = getLoanProductResponse.getId();
+ loanTransactionHelper.updateLoanProduct(loanProductId,
"{delinquencyBucketId: null}");
+ getLoanProductResponse =
loanTransactionHelper.getLoanProduct(loanProductId.intValue());
+ assertNotNull(getLoanProductResponse);
+ assertNull(getLoanProductResponse.getDelinquencyBucket().getId());
}
@Test
diff --git
a/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/loans/LoanTransactionHelper.java
b/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/loans/LoanTransactionHelper.java
index c00dcac23..3d3de0628 100644
---
a/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/loans/LoanTransactionHelper.java
+++
b/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/loans/LoanTransactionHelper.java
@@ -100,6 +100,7 @@ import org.apache.poi.ss.usermodel.Workbook;
public class LoanTransactionHelper extends IntegrationTest {
public static final String DATE_TIME_FORMAT = "dd MMMM yyyy HH:mm";
+ private static final String LOAN_PRODUCTS_URL =
"/fineract-provider/api/v1/loanproducts";
private static final String CREATE_LOAN_PRODUCT_URL =
"/fineract-provider/api/v1/loanproducts?" + Utils.TENANT_IDENTIFIER;
private static final String APPLY_LOAN_URL =
"/fineract-provider/api/v1/loans?" + Utils.TENANT_IDENTIFIER;
private static final String LOAN_ACCOUNT_URL =
"/fineract-provider/api/v1/loans";
@@ -1975,4 +1976,10 @@ public class LoanTransactionHelper extends
IntegrationTest {
final String ADD_CHARGES_URL = LOAN_ACCOUNT_URL + "/" + loanId +
"/charges?" + Utils.TENANT_IDENTIFIER;
return Utils.performServerPost(requestSpec, responseSpec,
ADD_CHARGES_URL, request, jsonAttributeToGetBack);
}
+
+ public Object updateLoanProduct(final Long loanProductId, final String
request) {
+ final String UPDATE_LOAN_PRODUCT_URL = LOAN_PRODUCTS_URL + "/" +
loanProductId + "?" + Utils.TENANT_IDENTIFIER;
+ return Utils.performServerPut(requestSpec, responseSpec,
UPDATE_LOAN_PRODUCT_URL, request, null);
+ }
+
}