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 be7c419b2 FINERACT-1971 - fix undo last disbursal with auto down
payment enabled and repayment between the two disbursements
be7c419b2 is described below
commit be7c419b244a82cd44b0df0b8e4e577d658cf659
Author: Peter Bagrij <[email protected]>
AuthorDate: Mon Oct 2 16:52:54 2023 +0200
FINERACT-1971
- fix undo last disbursal with auto down payment enabled and repayment
between the two disbursements
---
.../portfolio/loanaccount/domain/Loan.java | 10 +-
...oanDisbursalWithDownPaymentIntegrationTest.java | 175 ++++++++++++++++++---
2 files changed, 157 insertions(+), 28 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 58f6d5143..bb5227f31 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
@@ -6485,11 +6485,10 @@ public class Loan extends
AbstractAuditableWithUTCDateTimeCustom {
Money downPaymentMoney = Money.of(getCurrency(),
MathUtil.percentageOf(lastDisbursalTransaction.getAmount(),
disbursedAmountPercentageForDownPayment, 19));
- // find the matching down-payment transaction based on date,
amount and it also must have downpayment
- // installment linked
+ // find the latest matching down-payment transaction based on
date, amount and transaction type
Optional<LoanTransaction> downPaymentTransaction =
this.loanTransactions.stream()
.filter(tr ->
tr.getTransactionDate().equals(lastDisbursalTransaction.getTransactionDate())
- && hasAnInstallmentWithDownPayment(tr,
downPaymentMoney.getAmount()))
+ && tr.getTypeOf().isDownPayment() &&
tr.getAmount().compareTo(downPaymentMoney.getAmount()) == 0)
.max(Comparator.comparing(LoanTransaction::getId));
// reverse the down-payment transaction
@@ -6497,11 +6496,6 @@ public class Loan extends
AbstractAuditableWithUTCDateTimeCustom {
}
}
- private boolean hasAnInstallmentWithDownPayment(LoanTransaction tr,
BigDecimal amount) {
- return tr.getAmount().compareTo(amount) == 0 &&
tr.getLoanTransactionToRepaymentScheduleMappings().stream()
- .anyMatch(mapping ->
mapping.getLoanRepaymentScheduleInstallment().isDownPayment());
- }
-
private void updateLoanToLastDisbursalState(LoanDisbursementDetails
disbursementDetail) {
for (final LoanCharge charge : getActiveCharges()) {
if (charge.isOverdueInstallmentCharge()) {
diff --git
a/integration-tests/src/test/java/org/apache/fineract/integrationtests/UndoLoanDisbursalWithDownPaymentIntegrationTest.java
b/integration-tests/src/test/java/org/apache/fineract/integrationtests/UndoLoanDisbursalWithDownPaymentIntegrationTest.java
index a0ab4bf1c..8e67f7395 100644
---
a/integration-tests/src/test/java/org/apache/fineract/integrationtests/UndoLoanDisbursalWithDownPaymentIntegrationTest.java
+++
b/integration-tests/src/test/java/org/apache/fineract/integrationtests/UndoLoanDisbursalWithDownPaymentIntegrationTest.java
@@ -40,7 +40,7 @@ public class UndoLoanDisbursalWithDownPaymentIntegrationTest
extends BaseLoanInt
private final ClientHelper clientHelper = new
ClientHelper(this.responseSpec, this.requestSpec);
@Test
- public void
testUndoDisbursalForLoanWithSingleDisbursalAutoDowpaymentEnabledAndNoManualTransactions()
{
+ public void
testUndoDisbursalForLoanWithSingleDisbursalAutoDownPaymentEnabledAndNoManualTransactions()
{
runAt("01 January 2023", () -> {
// Create Client
Long clientId =
clientHelper.createClient(ClientHelper.defaultClientCreationRequest()).getClientId();
@@ -110,7 +110,7 @@ public class
UndoLoanDisbursalWithDownPaymentIntegrationTest extends BaseLoanInt
}
@Test
- public void
testUndoDisbursalForLoanWithSingleDisbursalAutoDowPaymentEnabledAndHasManualTransactions()
{
+ public void
testUndoDisbursalForLoanWithSingleDisbursalAutoDownPaymentEnabledAndHasManualTransactions()
{
runAt("01 January 2023", () -> {
// Create Client
Long clientId =
clientHelper.createClient(ClientHelper.defaultClientCreationRequest()).getClientId();
@@ -193,7 +193,7 @@ public class
UndoLoanDisbursalWithDownPaymentIntegrationTest extends BaseLoanInt
}
@Test
- public void
testUndoDisbursalForLoanWithSingleDisbursalAutoDowPaymentDisabledAndNoManualTransactions()
{
+ public void
testUndoDisbursalForLoanWithSingleDisbursalAutoDownPaymentDisabledAndNoManualTransactions()
{
runAt("01 January 2023", () -> {
// Create Client
Long clientId =
clientHelper.createClient(ClientHelper.defaultClientCreationRequest()).getClientId();
@@ -262,7 +262,7 @@ public class
UndoLoanDisbursalWithDownPaymentIntegrationTest extends BaseLoanInt
}
@Test
- public void
testUndoDisbursalForLoanWithSingleDisbursalAutoDowPaymentDisabledAndHasManualTransactions()
{
+ public void
testUndoDisbursalForLoanWithSingleDisbursalAutoDownPaymentDisabledAndHasManualTransactions()
{
runAt("01 January 2023", () -> {
// Create Client
Long clientId =
clientHelper.createClient(ClientHelper.defaultClientCreationRequest()).getClientId();
@@ -352,7 +352,7 @@ public class
UndoLoanDisbursalWithDownPaymentIntegrationTest extends BaseLoanInt
}
@Test
- public void
testUndoLastDisbursalForLoanWithSingleDisbursalAutoDowPaymentEnabledAndNoManualTransactions()
{
+ public void
testUndoLastDisbursalForLoanWithSingleDisbursalAutoDownPaymentEnabledAndNoManualTransactions()
{
runAt("01 January 2023", () -> {
// Create Client
Long clientId =
clientHelper.createClient(ClientHelper.defaultClientCreationRequest()).getClientId();
@@ -400,7 +400,7 @@ public class
UndoLoanDisbursalWithDownPaymentIntegrationTest extends BaseLoanInt
}
@Test
- public void
testUndoLastDisbursalForLoanWithMultiDisbursalAutoDowPaymentEnabledAndNoManualTransactions()
{
+ public void
testUndoLastDisbursalForLoanWithMultiDisbursalAutoDownPaymentEnabledAndNoManualTransactions()
{
runAt("01 January 2023", () -> {
// Create Client
Long clientId =
clientHelper.createClient(ClientHelper.defaultClientCreationRequest()).getClientId();
@@ -447,7 +447,7 @@ public class
UndoLoanDisbursalWithDownPaymentIntegrationTest extends BaseLoanInt
}
@Test
- public void
testUndoDisbursalForLoanWithMultiDisbursalAutoDowPaymentEnabledAndNoManualTransactions()
{
+ public void
testUndoDisbursalForLoanWithMultiDisbursalAutoDownPaymentEnabledAndNoManualTransactions()
{
runAt("01 January 2023", () -> {
// Create Client
Long clientId =
clientHelper.createClient(ClientHelper.defaultClientCreationRequest()).getClientId();
@@ -519,7 +519,7 @@ public class
UndoLoanDisbursalWithDownPaymentIntegrationTest extends BaseLoanInt
}
@Test
- public void
testUndoDisbursalForLoanWithMultiDisbursalAutoDowPaymentEnabledAndHasManualTransactions()
{
+ public void
testUndoDisbursalForLoanWithMultiDisbursalAutoDownPaymentEnabledAndHasManualTransactions()
{
runAt("01 January 2023", () -> {
// Create Client
Long clientId =
clientHelper.createClient(ClientHelper.defaultClientCreationRequest()).getClientId();
@@ -603,7 +603,7 @@ public class
UndoLoanDisbursalWithDownPaymentIntegrationTest extends BaseLoanInt
}
@Test
- public void
testUndoDisbursalForLoanWithMultiDisbursalAutoDowPaymentDisabledAndNoManualTransactions()
{
+ public void
testUndoDisbursalForLoanWithMultiDisbursalAutoDownPaymentDisabledAndNoManualTransactions()
{
runAt("01 January 2023", () -> {
// Create Client
Long clientId =
clientHelper.createClient(ClientHelper.defaultClientCreationRequest()).getClientId();
@@ -672,7 +672,7 @@ public class
UndoLoanDisbursalWithDownPaymentIntegrationTest extends BaseLoanInt
}
@Test
- public void
testUndoDisbursalForLoanWithMultiDisbursalAutoDowPaymentDisabledAndHasManualTransactions()
{
+ public void
testUndoDisbursalForLoanWithMultiDisbursalAutoDownPaymentDisabledAndHasManualTransactions()
{
runAt("01 January 2023", () -> {
// Create Client
Long clientId =
clientHelper.createClient(ClientHelper.defaultClientCreationRequest()).getClientId();
@@ -684,7 +684,8 @@ public class
UndoLoanDisbursalWithDownPaymentIntegrationTest extends BaseLoanInt
Long loanId = applyAndApproveLoan(clientId, loanProductId, "01
January 2023", 1000.0);
// Verify Repayment Schedule
- verifyRepaymentSchedule(loanId, installment(1000.0, null, "01
January 2023"), //
+ verifyRepaymentSchedule(loanId, //
+ installment(1000.0, null, "01 January 2023"), //
installment(250.0, false, "01 January 2023"), //
installment(750.0, false, "31 January 2023"));//
@@ -758,7 +759,7 @@ public class
UndoLoanDisbursalWithDownPaymentIntegrationTest extends BaseLoanInt
}
@Test
- public void
testUndoLastDisbursalForLoanWithMultiDisbursalWith2DisburseAutoDowPaymentEnabledAndNoManualTransactions()
{
+ public void
testUndoLastDisbursalForLoanWithMultiDisbursalWith2DisburseAutoDownPaymentEnabledAndNoManualTransactions()
{
runAt("01 January 2023", () -> {
// Create Client
Long clientId =
clientHelper.createClient(ClientHelper.defaultClientCreationRequest()).getClientId();
@@ -780,7 +781,8 @@ public class
UndoLoanDisbursalWithDownPaymentIntegrationTest extends BaseLoanInt
disburseLoan(loanId, BigDecimal.valueOf(1000.00), "01 January
2023");
// verify transactions
- verifyTransactions(loanId, transaction(250.0, "Down Payment", "01
January 2023"), //
+ verifyTransactions(loanId, //
+ transaction(250.0, "Down Payment", "01 January 2023"), //
transaction(1000.0, "Disbursement", "01 January 2023") //
);
@@ -871,7 +873,140 @@ public class
UndoLoanDisbursalWithDownPaymentIntegrationTest extends BaseLoanInt
}
@Test
- public void
testUndoLastDisbursalForLoanWithMultiDisbursalWith2DisburseAutoDowPaymentDisabledAndNoManualTransactions()
{
+ public void
testUndoLastDisbursalForLoanWithMultiDisbursalWith2DisburseAutoDownPaymentEnabledAndNoManualTransactionsWithExtraRepayment()
{
+ runAt("01 January 2023", () -> {
+ // Create Client
+ Long clientId =
clientHelper.createClient(ClientHelper.defaultClientCreationRequest()).getClientId();
+
+ // Create Loan Product
+ Long loanProductId = createLoanProductWith25PctDownPayment(true,
true);
+
+ // Apply and Approve Loan
+ Long loanId = applyAndApproveLoan(clientId, loanProductId, "01
January 2023", 1500.0);
+
+ // Verify Repayment Schedule
+ verifyRepaymentSchedule(loanId, //
+ installment(1500.0, null, "01 January 2023"), //
+ installment(375.0, false, "01 January 2023"), //
+ installment(1125.0, false, "31 January 2023") //
+ );
+
+ // 1st Disburse Loan
+ disburseLoan(loanId, BigDecimal.valueOf(1000.00), "01 January
2023");
+
+ // verify transactions
+ verifyTransactions(loanId, //
+ transaction(250.0, "Down Payment", "01 January 2023"), //
+ transaction(1000.0, "Disbursement", "01 January 2023") //
+ );
+
+ // verify journal entries
+ verifyJournalEntries(loanId, journalEntry(250.0,
loansReceivableAccount, "CREDIT"), //
+ journalEntry(250.0, suspenseClearingAccount, "DEBIT"), //
+ journalEntry(1000.0, loansReceivableAccount, "DEBIT"), //
+ journalEntry(1000.0, suspenseClearingAccount, "CREDIT") //
+ );
+
+ // Verify Repayment Schedule
+ verifyRepaymentSchedule(loanId, installment(1000.0, null, "01
January 2023"), //
+ installment(250.0, true, "01 January 2023"), //
+ installment(750.0, false, "31 January 2023") //
+ );
+
+ businessDateHelper.updateBusinessDate(new
BusinessDateRequest().type(BUSINESS_DATE.getName()).date("10 January 2023")
+ .dateFormat(DATETIME_PATTERN).locale("en"));
+
+ addRepaymentForLoan(loanId, 300.0, "10 January 2023");
+
+ verifyTransactions(loanId, //
+ transaction(1000.0, "Disbursement", "01 January 2023"), //
+ transaction(250.0, "Down Payment", "01 January 2023"), //
+ transaction(300.0, "Repayment", "10 January 2023") //
+ );
+
+ businessDateHelper.updateBusinessDate(new
BusinessDateRequest().type(BUSINESS_DATE.getName()).date("15 January 2023")
+ .dateFormat(DATETIME_PATTERN).locale("en"));
+
+ // 2nd Disburse Loan
+ disburseLoan(loanId, BigDecimal.valueOf(400.0), "15 January 2023");
+
+ // verify transactions
+ verifyTransactions(loanId, //
+ transaction(250.0, "Down Payment", "01 January 2023"), //
+ transaction(1000.0, "Disbursement", "01 January 2023"), //
+ transaction(300.0, "Repayment", "10 January 2023"), //
+ transaction(100.0, "Down Payment", "15 January 2023"), //
+ transaction(400.0, "Disbursement", "15 January 2023") //
+ );
+
+ // verify journal entries
+ verifyJournalEntries(loanId, //
+ journalEntry(250.0, loansReceivableAccount, "CREDIT"), //
+ journalEntry(250.0, suspenseClearingAccount, "DEBIT"), //
+ journalEntry(1000.0, loansReceivableAccount, "DEBIT"), //
+ journalEntry(1000.0, suspenseClearingAccount, "CREDIT"), //
+ journalEntry(300.0, loansReceivableAccount, "CREDIT"), //
+ journalEntry(300.0, suspenseClearingAccount, "DEBIT"), //
+ journalEntry(100.0, loansReceivableAccount, "CREDIT"), //
+ journalEntry(100.0, suspenseClearingAccount, "DEBIT"), //
+ journalEntry(400.0, loansReceivableAccount, "DEBIT"), //
+ journalEntry(400.0, suspenseClearingAccount, "CREDIT") //
+ );
+
+ // Verify Repayment Schedule
+ verifyRepaymentSchedule(loanId, //
+ installment(1000.0, null, "01 January 2023"), //
+ installment(250.0, true, "01 January 2023"), //
+ installment(400.0, null, "15 January 2023"), //
+ installment(100.0, true, "15 January 2023"), //
+ installment(1050.0, false, "31 January 2023") //
+ );
+
+ // undoLastDisbursal
+ loanTransactionHelper.undoLastDisbursal(loanId.intValue());
+
+ // verify transactions
+ verifyTransactions(loanId, //
+ transaction(250.0, "Down Payment", "01 January 2023"), //
+ transaction(1000.0, "Disbursement", "01 January 2023"), //
+ transaction(300.0, "Repayment", "10 January 2023") //
+ );
+
+ // verify journal entries
+ verifyJournalEntries(loanId,
+ // first disbursement + down-payment
+ journalEntry(250.0, loansReceivableAccount, "CREDIT"), //
+ journalEntry(250.0, suspenseClearingAccount, "DEBIT"), //
+ journalEntry(1000.0, loansReceivableAccount, "DEBIT"), //
+ journalEntry(1000.0, suspenseClearingAccount, "CREDIT"), //
+
+ // repayment
+ journalEntry(300.0, loansReceivableAccount, "CREDIT"), //
+ journalEntry(300.0, suspenseClearingAccount, "DEBIT"), //
+
+ // second disbursement + down-payment
+ journalEntry(100.0, loansReceivableAccount, "CREDIT"), //
+ journalEntry(100.0, suspenseClearingAccount, "DEBIT"), //
+ journalEntry(400.0, loansReceivableAccount, "DEBIT"), //
+ journalEntry(400.0, suspenseClearingAccount, "CREDIT"), //
+
+ // compensation of second disbursement + down-payment
+ journalEntry(100.0, loansReceivableAccount, "DEBIT"), //
+ journalEntry(100.0, suspenseClearingAccount, "CREDIT"), //
+ journalEntry(400.0, loansReceivableAccount, "CREDIT"), //
+ journalEntry(400.0, suspenseClearingAccount, "DEBIT") //
+ );
+
+ verifyRepaymentSchedule(loanId, //
+ installment(1000.0, null, "01 January 2023"), //
+ installment(250.0, true, "01 January 2023"), //
+ installment(750.0, false, "31 January 2023") //
+ );
+ });
+ }
+
+ @Test
+ public void
testUndoLastDisbursalForLoanWithMultiDisbursalWith2DisburseAutoDownPaymentDisabledAndNoManualTransactions()
{
runAt("01 January 2023", () -> {
// Create Client
Long clientId =
clientHelper.createClient(ClientHelper.defaultClientCreationRequest()).getClientId();
@@ -993,7 +1128,7 @@ public class
UndoLoanDisbursalWithDownPaymentIntegrationTest extends BaseLoanInt
}
@Test
- public void
testUndoLastDisbursalForLoanWithMultiDisbursalWith2DisburseAutoDowPaymentEnabledAndHasManualTransactions()
{
+ public void
testUndoLastDisbursalForLoanWithMultiDisbursalWith2DisburseAutoDownPaymentEnabledAndHasManualTransactions()
{
runAt("01 January 2023", () -> {
// Create Client
Long clientId =
clientHelper.createClient(ClientHelper.defaultClientCreationRequest()).getClientId();
@@ -1082,7 +1217,7 @@ public class
UndoLoanDisbursalWithDownPaymentIntegrationTest extends BaseLoanInt
}
@Test
- public void
testUndoLastDisbursalForLoanWithMultiDisbursalWith2DisburseAutoDowPaymentDisabledAndHasManualTransactions()
{
+ public void
testUndoLastDisbursalForLoanWithMultiDisbursalWith2DisburseAutoDownPaymentDisabledAndHasManualTransactions()
{
runAt("01 January 2023", () -> {
// Create Client
Long clientId =
clientHelper.createClient(ClientHelper.defaultClientCreationRequest()).getClientId();
@@ -1177,7 +1312,7 @@ public class
UndoLoanDisbursalWithDownPaymentIntegrationTest extends BaseLoanInt
}
@Test
- public void
testUndoDisbursalForLoanWithMultiDisbursalWith2DisburseAutoDowPaymentEnabledAndNoManualTransactions()
{
+ public void
testUndoDisbursalForLoanWithMultiDisbursalWith2DisburseAutoDownPaymentEnabledAndNoManualTransactions()
{
runAt("01 January 2023", () -> {
// Create Client
Long clientId =
clientHelper.createClient(ClientHelper.defaultClientCreationRequest()).getClientId();
@@ -1296,7 +1431,7 @@ public class
UndoLoanDisbursalWithDownPaymentIntegrationTest extends BaseLoanInt
}
@Test
- public void
testUndoDisbursalForLoanWithMultiDisbursalWith2DisburseAutoDowPaymentDisabledAndNoManualTransactions()
{
+ public void
testUndoDisbursalForLoanWithMultiDisbursalWith2DisburseAutoDownPaymentDisabledAndNoManualTransactions()
{
runAt("01 January 2023", () -> {
// Create Client
Long clientId =
clientHelper.createClient(ClientHelper.defaultClientCreationRequest()).getClientId();
@@ -1421,7 +1556,7 @@ public class
UndoLoanDisbursalWithDownPaymentIntegrationTest extends BaseLoanInt
}
@Test
- public void
testUndoDisbursalForLoanWithMultiDisbursalWith2DisburseAutoDowPaymentEnabledAndHasManualTransactions()
{
+ public void
testUndoDisbursalForLoanWithMultiDisbursalWith2DisburseAutoDownPaymentEnabledAndHasManualTransactions()
{
runAt("01 January 2023", () -> {
// Create Client
Long clientId =
clientHelper.createClient(ClientHelper.defaultClientCreationRequest()).getClientId();
@@ -1554,7 +1689,7 @@ public class
UndoLoanDisbursalWithDownPaymentIntegrationTest extends BaseLoanInt
}
@Test
- public void
testUndoDisbursalForLoanWithMultiDisbursalWith2DisburseAutoDowPaymentDisabledAndHasManualTransactions()
{
+ public void
testUndoDisbursalForLoanWithMultiDisbursalWith2DisburseAutoDownPaymentDisabledAndHasManualTransactions()
{
runAt("01 January 2023", () -> {
// Create Client
Long clientId =
clientHelper.createClient(ClientHelper.defaultClientCreationRequest()).getClientId();