This is an automated email from the ASF dual-hosted git repository.
arnold 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 ce4c1dd13 Fix Loan Transaction Chargeback outstanding
ce4c1dd13 is described below
commit ce4c1dd13746dd5f82eeaa838dc9fd83da8e0330
Author: Jose Alberto Hernandez <[email protected]>
AuthorDate: Sat Oct 22 18:15:39 2022 -0500
Fix Loan Transaction Chargeback outstanding
---
.../api/LoanTransactionsApiResourceSwagger.java | 16 +++++++
.../portfolio/loanaccount/domain/Loan.java | 12 +++---
.../LoanWritePlatformServiceJpaRepositoryImpl.java | 2 +-
.../LoanTransactionChargebackTest.java | 49 ++++++++++++++--------
4 files changed, 54 insertions(+), 25 deletions(-)
diff --git
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/api/LoanTransactionsApiResourceSwagger.java
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/api/LoanTransactionsApiResourceSwagger.java
index 0aa23eda2..2102a6bb7 100644
---
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/api/LoanTransactionsApiResourceSwagger.java
+++
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/api/LoanTransactionsApiResourceSwagger.java
@@ -164,6 +164,22 @@ final class LoanTransactionsApiResourceSwagger {
public String reversalExternalId;
@Schema(example = "[2012, 5, 18]")
public LocalDate reversedOnDate;
+ @Schema(example = "1000.00")
+ public Double netDisbursalAmount;
+ @Schema(example = "240.00")
+ public Double principalPortion;
+ @Schema(example = "23.90")
+ public Double feeChargesPortion;
+ @Schema(example = "12.80")
+ public Double penaltyChargesPortion;
+ @Schema(example = "33.00")
+ public Double overpaymentPortion;
+ @Schema(example = "55.50")
+ public Double unrecognizedIncomePortion;
+ @Schema(example = "100.00")
+ public Double outstandingLoanBalance;
+ @Schema(example = "[2012, 5, 18]")
+ public LocalDate possibleNextRepaymentDate;
public Set<GetLoanTransactionRelation> transactionRelations;
}
diff --git
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/Loan.java
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/Loan.java
index 38dec1461..21728bfc7 100644
---
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/Loan.java
+++
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/Loan.java
@@ -5656,7 +5656,11 @@ public class Loan extends
AbstractAuditableWithUTCDateTimeCustom {
} else if (loanTransaction.isChargeback()) {
Money transactionOutstanding =
loanTransaction.getAmount(getCurrency());
if
(!loanTransaction.getOverPaymentPortion(getCurrency()).isZero()) {
- transactionOutstanding =
transactionOutstanding.minus(loanTransaction.getOverPaymentPortion(getCurrency()));
+ transactionOutstanding =
loanTransaction.getAmount(getCurrency())
+
.minus(loanTransaction.getOverPaymentPortion(getCurrency()));
+ if (transactionOutstanding.isLessThanZero()) {
+ transactionOutstanding = Money.zero(getCurrency());
+ }
}
outstanding = outstanding.plus(transactionOutstanding);
loanTransaction.updateOutstandingLoanBalance(outstanding.getAmount());
@@ -6120,11 +6124,7 @@ public class Loan extends
AbstractAuditableWithUTCDateTimeCustom {
.determineProcessor(this.transactionProcessingStrategy);
final Money overpaidAmount = calculateTotalOverpayment(); // Before
Transaction
if (overpaidAmount.isGreaterThanZero()) {
- Money difference =
chargebackTransaction.getAmount(getCurrency()).minus(overpaidAmount);
- if (difference.isLessThanZero()) {
- difference = null;
- }
- chargebackTransaction.setOverPayments(difference);
+ chargebackTransaction.setOverPayments(overpaidAmount);
}
if (chargebackTransaction.isNotZero(loanCurrency())) {
diff --git
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanWritePlatformServiceJpaRepositoryImpl.java
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanWritePlatformServiceJpaRepositoryImpl.java
index dd709051e..a489e10b6 100644
---
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanWritePlatformServiceJpaRepositoryImpl.java
+++
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanWritePlatformServiceJpaRepositoryImpl.java
@@ -1286,7 +1286,7 @@ public class LoanWritePlatformServiceJpaRepositoryImpl
implements LoanWritePlatf
businessEventNotifierService.notifyPostBusinessEvent(new
LoanChargebackTransactionBusinessEvent(loanTransaction));
- return new
CommandProcessingResultBuilder().withCommandId(command.commandId()).withEntityId(transactionId)
+ return new
CommandProcessingResultBuilder().withCommandId(command.commandId()).withEntityId(newTransaction.getId())
.withOfficeId(loan.getOfficeId()).withClientId(loan.getClientId()).withGroupId(loan.getGroupId()).withLoanId(loanId)
.with(changes).build();
}
diff --git
a/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanTransactionChargebackTest.java
b/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanTransactionChargebackTest.java
index ba4dc1cb3..e7d5612bf 100644
---
a/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanTransactionChargebackTest.java
+++
b/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanTransactionChargebackTest.java
@@ -97,11 +97,12 @@ public class LoanTransactionChargebackTest {
assertNotNull(getLoansLoanIdResponse);
loanTransactionHelper.validateLoanStatus(getLoansLoanIdResponse,
"loanStatusType.closed.obligations.met");
- reviewLoanTransactionRelations(loanId, transactionId, 0);
+ reviewLoanTransactionRelations(loanId, transactionId, 0,
Double.valueOf("0.00"));
final Integer chargebackTransactionId =
applyChargebackTransaction(loanId, transactionId, "1000.00", 0, responseSpec);
- reviewLoanTransactionRelations(loanId, chargebackTransactionId, 1);
+ reviewLoanTransactionRelations(loanId, transactionId, 1,
Double.valueOf("0.00"));
+ reviewLoanTransactionRelations(loanId, chargebackTransactionId, 0,
Double.valueOf("1000.00"));
getLoansLoanIdResponse = loanTransactionHelper.getLoan(requestSpec,
responseSpec, loanId);
assertNotNull(getLoansLoanIdResponse);
@@ -138,10 +139,11 @@ public class LoanTransactionChargebackTest {
loanId);
assertNotNull(loanIdTransactionsResponse);
final Integer transactionId =
loanIdTransactionsResponse.getResourceId();
- reviewLoanTransactionRelations(loanId, transactionId, 0);
+ reviewLoanTransactionRelations(loanId, transactionId, 0,
Double.valueOf("666.67"));
final Integer chargebackTransactionId =
applyChargebackTransaction(loanId, transactionId, amount.toString(), 0,
responseSpec);
- reviewLoanTransactionRelations(loanId, transactionId, 1);
+ reviewLoanTransactionRelations(loanId, transactionId, 1,
Double.valueOf("666.67"));
+ reviewLoanTransactionRelations(loanId, chargebackTransactionId, 0,
Double.valueOf("1000.00"));
getLoansLoanIdResponse = loanTransactionHelper.getLoan(requestSpec,
responseSpec, loanId);
assertNotNull(getLoansLoanIdResponse);
@@ -203,11 +205,12 @@ public class LoanTransactionChargebackTest {
assertNotNull(getLoansLoanIdResponse);
loanTransactionHelper.validateLoanStatus(getLoansLoanIdResponse,
"loanStatusType.closed.obligations.met");
- reviewLoanTransactionRelations(loanId, transactionId, 0);
+ reviewLoanTransactionRelations(loanId, transactionId, 0,
Double.valueOf("0.00"));
Integer chargebackTransactionId = applyChargebackTransaction(loanId,
transactionId, "500.00", 0, responseSpec);
- reviewLoanTransactionRelations(loanId, transactionId, 1);
+ reviewLoanTransactionRelations(loanId, transactionId, 1,
Double.valueOf("0.00"));
+ reviewLoanTransactionRelations(loanId, chargebackTransactionId, 0,
Double.valueOf("500.00"));
getLoansLoanIdResponse = loanTransactionHelper.getLoan(requestSpec,
responseSpec, loanId);
assertNotNull(getLoansLoanIdResponse);
@@ -231,7 +234,8 @@ public class LoanTransactionChargebackTest {
chargebackTransactionId = applyChargebackTransaction(loanId,
transactionId, "300.00", 0, responseSpec);
- reviewLoanTransactionRelations(loanId, transactionId, 2);
+ reviewLoanTransactionRelations(loanId, transactionId, 2,
Double.valueOf("0.00"));
+ reviewLoanTransactionRelations(loanId, chargebackTransactionId, 0,
Double.valueOf("800.00"));
getLoansLoanIdResponse = loanTransactionHelper.getLoan(requestSpec,
responseSpec, loanId);
assertNotNull(getLoansLoanIdResponse);
@@ -274,11 +278,12 @@ public class LoanTransactionChargebackTest {
assertNotNull(getLoansLoanIdResponse);
loanTransactionHelper.validateLoanStatus(getLoansLoanIdResponse,
"loanStatusType.overpaid");
- reviewLoanTransactionRelations(loanId, transactionId, 0);
+ reviewLoanTransactionRelations(loanId, transactionId, 0,
Double.valueOf("0.00"));
final Integer chargebackTransactionId =
applyChargebackTransaction(loanId, transactionId, "200.00", 0, responseSpec);
- reviewLoanTransactionRelations(loanId, chargebackTransactionId, 1);
+ reviewLoanTransactionRelations(loanId, transactionId, 1,
Double.valueOf("0.00"));
+ reviewLoanTransactionRelations(loanId, chargebackTransactionId, 0,
Double.valueOf("100.00"));
getLoansLoanIdResponse = loanTransactionHelper.getLoan(requestSpec,
responseSpec, loanId);
assertNotNull(getLoansLoanIdResponse);
@@ -307,11 +312,12 @@ public class LoanTransactionChargebackTest {
assertNotNull(getLoansLoanIdResponse);
loanTransactionHelper.validateLoanStatus(getLoansLoanIdResponse,
"loanStatusType.overpaid");
- reviewLoanTransactionRelations(loanId, transactionId, 0);
+ reviewLoanTransactionRelations(loanId, transactionId, 0,
Double.valueOf("0.00"));
final Integer chargebackTransactionId =
applyChargebackTransaction(loanId, transactionId, "100.00", 0, responseSpec);
- reviewLoanTransactionRelations(loanId, chargebackTransactionId, 1);
+ reviewLoanTransactionRelations(loanId, transactionId, 1,
Double.valueOf("0.00"));
+ reviewLoanTransactionRelations(loanId, chargebackTransactionId, 0,
Double.valueOf("0.00"));
getLoansLoanIdResponse = loanTransactionHelper.getLoan(requestSpec,
responseSpec, loanId);
assertNotNull(getLoansLoanIdResponse);
@@ -340,11 +346,12 @@ public class LoanTransactionChargebackTest {
assertNotNull(getLoansLoanIdResponse);
loanTransactionHelper.validateLoanStatus(getLoansLoanIdResponse,
"loanStatusType.overpaid");
- reviewLoanTransactionRelations(loanId, transactionId, 0);
+ reviewLoanTransactionRelations(loanId, transactionId, 0,
Double.valueOf("0.00"));
final Integer chargebackTransactionId =
applyChargebackTransaction(loanId, transactionId, "50.00", 0, responseSpec);
- reviewLoanTransactionRelations(loanId, chargebackTransactionId, 1);
+ reviewLoanTransactionRelations(loanId, transactionId, 1,
Double.valueOf("0.00"));
+ reviewLoanTransactionRelations(loanId, chargebackTransactionId, 0,
Double.valueOf("0.00"));
getLoansLoanIdResponse = loanTransactionHelper.getLoan(requestSpec,
responseSpec, loanId);
assertNotNull(getLoansLoanIdResponse);
@@ -374,7 +381,7 @@ public class LoanTransactionChargebackTest {
loanTransactionHelper.validateLoanStatus(getLoansLoanIdResponse,
"loanStatusType.closed.obligations.met");
// First round, empty array
- reviewLoanTransactionRelations(loanId, transactionId, 0);
+ reviewLoanTransactionRelations(loanId, transactionId, 0,
Double.valueOf("0.00"));
applyChargebackTransaction(loanId, transactionId, "200.00", 0,
responseSpec);
@@ -384,7 +391,7 @@ public class LoanTransactionChargebackTest {
evaluateLoanSummaryAdjustments(getLoansLoanIdResponse,
Double.valueOf("200.00"));
// Second round, array size equal to 1
- reviewLoanTransactionRelations(loanId, transactionId, 1);
+ reviewLoanTransactionRelations(loanId, transactionId, 1,
Double.valueOf("0.00"));
applyChargebackTransaction(loanId, transactionId, "300.00", 1,
responseSpec);
@@ -394,7 +401,7 @@ public class LoanTransactionChargebackTest {
evaluateLoanSummaryAdjustments(getLoansLoanIdResponse,
Double.valueOf("500.00"));
// Third round, array size equal to 2
- reviewLoanTransactionRelations(loanId, transactionId, 2);
+ reviewLoanTransactionRelations(loanId, transactionId, 2,
Double.valueOf("0.00"));
applyChargebackTransaction(loanId, transactionId, "500.00", 0,
responseSpec);
@@ -465,13 +472,19 @@ public class LoanTransactionChargebackTest {
return postLoansTransactionCommandResponse.getResourceId();
}
- private void reviewLoanTransactionRelations(final Integer loanId, final
Integer transactionId, final Integer expectedSize) {
+ private void reviewLoanTransactionRelations(final Integer loanId, final
Integer transactionId, final Integer expectedSize,
+ final Double outstandingBalance) {
+ log.info("Loan Transaction Id: {} {}", loanId, transactionId);
+
GetLoansLoanIdTransactionsTransactionIdResponse
getLoansTransactionResponse = loanTransactionHelper.getLoanTransaction(loanId,
transactionId);
+ log.info("Loan with {} Chargeback Transactions and balance {}",
getLoansTransactionResponse.getTransactionRelations().size(),
+ getLoansTransactionResponse.getOutstandingLoanBalance());
assertNotNull(getLoansTransactionResponse);
assertNotNull(getLoansTransactionResponse.getTransactionRelations());
assertEquals(expectedSize,
getLoansTransactionResponse.getTransactionRelations().size());
- log.info("Loan with {} Chargeback Transactions",
getLoansTransactionResponse.getTransactionRelations().size());
+ // Outstanding amount
+ assertEquals(outstandingBalance,
getLoansTransactionResponse.getOutstandingLoanBalance());
}
private void evaluateLoanSummaryAdjustments(GetLoansLoanIdResponse
getLoansLoanIdResponse, Double amountExpected) {