FINERACT-1981: COB/Inline COB fails while creating accruals for a overpaid account
This commit is contained in:
committed by
Adam Saghy
parent
f63df474f6
commit
7bd1f510a3
+1
@@ -1276,6 +1276,7 @@ public abstract class BaseLoanIntegrationTest {
|
|||||||
public static final Long MONTHS_L = 2L;
|
public static final Long MONTHS_L = 2L;
|
||||||
public static final String MONTHS_STRING = "MONTHS";
|
public static final String MONTHS_STRING = "MONTHS";
|
||||||
public static final Integer DAYS = 0;
|
public static final Integer DAYS = 0;
|
||||||
|
public static final Long DAYS_L = 0L;
|
||||||
public static final String DAYS_STRING = "DAYS";
|
public static final String DAYS_STRING = "DAYS";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+426
@@ -0,0 +1,426 @@
|
|||||||
|
/**
|
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
* or more contributor license agreements. See the NOTICE file
|
||||||
|
* distributed with this work for additional information
|
||||||
|
* regarding copyright ownership. The ASF licenses this file
|
||||||
|
* to you under the Apache License, Version 2.0 (the
|
||||||
|
* "License"); you may not use this file except in compliance
|
||||||
|
* with the License. You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing,
|
||||||
|
* software distributed under the License is distributed on an
|
||||||
|
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
* KIND, either express or implied. See the License for the
|
||||||
|
* specific language governing permissions and limitations
|
||||||
|
* under the License.
|
||||||
|
*/
|
||||||
|
package org.apache.fineract.integrationtests;
|
||||||
|
|
||||||
|
import java.math.BigDecimal;
|
||||||
|
import java.time.LocalDate;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.concurrent.atomic.AtomicReference;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.apache.fineract.client.models.GetLoansLoanIdResponse;
|
||||||
|
import org.apache.fineract.client.models.PostClientsResponse;
|
||||||
|
import org.apache.fineract.client.models.PostLoanProductsResponse;
|
||||||
|
import org.apache.fineract.integrationtests.common.ClientHelper;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
@Slf4j
|
||||||
|
public class LoanCOBCreateAccrualsTest extends BaseLoanIntegrationTest {
|
||||||
|
|
||||||
|
private PostClientsResponse client;
|
||||||
|
private PostLoanProductsResponse loanProduct;
|
||||||
|
|
||||||
|
private void setup() {
|
||||||
|
if (loanProduct == null) {
|
||||||
|
loanProduct = loanProductHelper.createLoanProduct(create4IProgressive() //
|
||||||
|
.recalculationRestFrequencyType(RecalculationRestFrequencyType.DAILY) //
|
||||||
|
.isInterestRecalculationEnabled(false).minPrincipal(1.0d).maxPrincipal(100000.0d).minInterestRatePerPeriod(0.0d)
|
||||||
|
.maxInterestRatePerPeriod(108.0d)
|
||||||
|
.paymentAllocation(List.of(createDefaultPaymentAllocation(FuturePaymentAllocationRule.LAST_INSTALLMENT)))
|
||||||
|
.repaymentFrequencyType(RepaymentFrequencyType.DAYS_L).repaymentEvery(30).minNumberOfRepayments(1)
|
||||||
|
.maxNumberOfRepayments(12).numberOfRepayments(1).currencyCode("USD"));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (client == null) {
|
||||||
|
ClientHelper clientHelper = new ClientHelper(requestSpec, responseSpec);
|
||||||
|
client = clientHelper.createClient(ClientHelper.defaultClientCreationRequest());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Update business date to 10/20/2024
|
||||||
|
// Create and disburse loan - €100 - 10/20/2024
|
||||||
|
// Update business date to 10/21/2024 and run COB
|
||||||
|
// Update business date to 10/22/2024
|
||||||
|
// Create a repayment - €102 - 10/22/2024
|
||||||
|
// Update business date to 10/23/2024 and run COB
|
||||||
|
// Create a charge (Penalty - NSF) with amount less than the overpaid part - 10/23/2024
|
||||||
|
// Update business date to 10/24/2024 and run COB
|
||||||
|
@Test
|
||||||
|
public void chargeAmountLessThanOverpaidAmount() {
|
||||||
|
AtomicReference<Long> loanIdRef = new AtomicReference<>();
|
||||||
|
setup();
|
||||||
|
runAt("20 October 2024", () -> {
|
||||||
|
Long loanId = applyAndApproveProgressiveLoan(client.getClientId(), loanProduct.getResourceId(), "20 October 2024", 100.0, 0.0,
|
||||||
|
1, null);
|
||||||
|
|
||||||
|
loanIdRef.set(loanId);
|
||||||
|
|
||||||
|
disburseLoan(loanId, BigDecimal.valueOf(100), "20 October 2024");
|
||||||
|
|
||||||
|
GetLoansLoanIdResponse loanDetails = loanTransactionHelper.getLoanDetails(loanId);
|
||||||
|
validateFullyUnpaidRepaymentPeriod(loanDetails, 1, "20 November 2024", 100, 0, 0, 0);
|
||||||
|
|
||||||
|
verifyTransactions(loanId, transaction(100.0d, "Disbursement", "20 October 2024"));
|
||||||
|
});
|
||||||
|
runAt("21 October 2024", () -> {
|
||||||
|
Long loanId = loanIdRef.get();
|
||||||
|
|
||||||
|
executeInlineCOB(loanIdRef.get());
|
||||||
|
|
||||||
|
GetLoansLoanIdResponse loanDetails = loanTransactionHelper.getLoanDetails(loanId);
|
||||||
|
validateFullyUnpaidRepaymentPeriod(loanDetails, 1, "20 November 2024", 100, 0, 0, 0);
|
||||||
|
|
||||||
|
verifyTransactions(loanId, transaction(100.0d, "Disbursement", "20 October 2024"));
|
||||||
|
});
|
||||||
|
runAt("22 October 2024", () -> {
|
||||||
|
Long loanId = loanIdRef.get();
|
||||||
|
|
||||||
|
executeInlineCOB(loanId);
|
||||||
|
|
||||||
|
GetLoansLoanIdResponse loanDetails = loanTransactionHelper.getLoanDetails(loanId);
|
||||||
|
validateFullyUnpaidRepaymentPeriod(loanDetails, 1, "20 November 2024", 100, 0, 0, 0);
|
||||||
|
|
||||||
|
verifyTransactions(loanId, transaction(100.0d, "Disbursement", "20 October 2024"));
|
||||||
|
|
||||||
|
loanTransactionHelper.makeLoanRepayment("22 October 2024", 102.0F, loanId.intValue());
|
||||||
|
|
||||||
|
loanDetails = loanTransactionHelper.getLoanDetails(loanId);
|
||||||
|
validateFullyPaidRepaymentPeriod(loanDetails, 1, "20 November 2024", 100, 0, 0, 0, 0, 100);
|
||||||
|
|
||||||
|
verifyTransactions(loanId, //
|
||||||
|
transaction(100.0d, "Disbursement", "20 October 2024", 100.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, false), //
|
||||||
|
transaction(102.0d, "Repayment", "22 October 2024", 0, 100.0, 0, 0, 0, 0, 2.0, false));
|
||||||
|
|
||||||
|
});
|
||||||
|
runAt("23 October 2024", () -> {
|
||||||
|
Long loanId = loanIdRef.get();
|
||||||
|
|
||||||
|
executeInlineCOB(loanId);
|
||||||
|
|
||||||
|
GetLoansLoanIdResponse loanDetails = loanTransactionHelper.getLoanDetails(loanId);
|
||||||
|
validateFullyPaidRepaymentPeriod(loanDetails, 1, "20 November 2024", 100, 0, 0, 0, 0, 100);
|
||||||
|
|
||||||
|
verifyTransactions(loanId, //
|
||||||
|
transaction(100.0d, "Disbursement", "20 October 2024", 100.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, false), //
|
||||||
|
transaction(102.0d, "Repayment", "22 October 2024", 0, 100.0, 0, 0, 0, 0, 2.0, false));
|
||||||
|
|
||||||
|
addCharge(loanId, true, 1.5d, "23 October 2024");
|
||||||
|
|
||||||
|
loanDetails = loanTransactionHelper.getLoanDetails(loanId);
|
||||||
|
validateRepaymentPeriod(loanDetails, 1, LocalDate.of(2024, 11, 20), 100.0, 100.0, 0, 0, 0, 0, 1.5, 1.5, 0, 0, 0, 0, 101.5, 0);
|
||||||
|
|
||||||
|
verifyTransactions(loanId, //
|
||||||
|
transaction(100.0d, "Disbursement", "20 October 2024", 100.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, false), //
|
||||||
|
transaction(1.5d, "Accrual", "23 October 2024", 0, 0.0, 0.0, 0.0, 1.5, 0.0, 0.0, false), //
|
||||||
|
transaction(102.0d, "Repayment", "22 October 2024", 0, 100.0, 0, 0, 1.5, 0, 0.5, false));
|
||||||
|
|
||||||
|
});
|
||||||
|
runAt("24 October 2024", () -> {
|
||||||
|
Long loanId = loanIdRef.get();
|
||||||
|
|
||||||
|
executeInlineCOB(loanId);
|
||||||
|
|
||||||
|
GetLoansLoanIdResponse loanDetails = loanTransactionHelper.getLoanDetails(loanId);
|
||||||
|
validateRepaymentPeriod(loanDetails, 1, LocalDate.of(2024, 11, 20), 100.0, 100.0, 0, 0, 0, 0, 1.5, 1.5, 0, 0, 0, 0, 101.5, 0);
|
||||||
|
|
||||||
|
verifyTransactions(loanId, //
|
||||||
|
transaction(100.0d, "Disbursement", "20 October 2024", 100.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, false), //
|
||||||
|
transaction(1.5d, "Accrual", "23 October 2024", 0, 0.0, 0.0, 0.0, 1.5, 0.0, 0.0, false), //
|
||||||
|
transaction(102.0d, "Repayment", "22 October 2024", 0, 100.0, 0, 0, 1.5, 0, 0.5, false));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// Update business date to 10/20/2024
|
||||||
|
// Create and disburse loan - €100 - 10/20/2024
|
||||||
|
// Update business date to 10/21/2024 and run COB
|
||||||
|
// Update business date to 10/22/2024
|
||||||
|
// Create a repayment - €102 - 10/22/2024
|
||||||
|
// Update business date to 10/23/2024 and run COB
|
||||||
|
// Create a charge (Penalty - NSF) with amount equals to the overpaid part - 10/23/2024
|
||||||
|
// Update business date to 10/24/2024 and run COB
|
||||||
|
@Test
|
||||||
|
public void chargeAmountEqualsToOverpaidAmount() {
|
||||||
|
AtomicReference<Long> loanIdRef = new AtomicReference<>();
|
||||||
|
setup();
|
||||||
|
runAt("20 October 2024", () -> {
|
||||||
|
Long loanId = applyAndApproveProgressiveLoan(client.getClientId(), loanProduct.getResourceId(), "20 October 2024", 100.0, 0.0,
|
||||||
|
1, null);
|
||||||
|
|
||||||
|
loanIdRef.set(loanId);
|
||||||
|
|
||||||
|
disburseLoan(loanId, BigDecimal.valueOf(100), "20 October 2024");
|
||||||
|
|
||||||
|
GetLoansLoanIdResponse loanDetails = loanTransactionHelper.getLoanDetails(loanId);
|
||||||
|
validateFullyUnpaidRepaymentPeriod(loanDetails, 1, "20 November 2024", 100, 0, 0, 0);
|
||||||
|
|
||||||
|
verifyTransactions(loanId, transaction(100.0d, "Disbursement", "20 October 2024"));
|
||||||
|
});
|
||||||
|
runAt("21 October 2024", () -> {
|
||||||
|
Long loanId = loanIdRef.get();
|
||||||
|
|
||||||
|
executeInlineCOB(loanIdRef.get());
|
||||||
|
|
||||||
|
GetLoansLoanIdResponse loanDetails = loanTransactionHelper.getLoanDetails(loanId);
|
||||||
|
validateFullyUnpaidRepaymentPeriod(loanDetails, 1, "20 November 2024", 100, 0, 0, 0);
|
||||||
|
|
||||||
|
verifyTransactions(loanId, transaction(100.0d, "Disbursement", "20 October 2024"));
|
||||||
|
});
|
||||||
|
runAt("22 October 2024", () -> {
|
||||||
|
Long loanId = loanIdRef.get();
|
||||||
|
|
||||||
|
executeInlineCOB(loanId);
|
||||||
|
|
||||||
|
GetLoansLoanIdResponse loanDetails = loanTransactionHelper.getLoanDetails(loanId);
|
||||||
|
validateFullyUnpaidRepaymentPeriod(loanDetails, 1, "20 November 2024", 100, 0, 0, 0);
|
||||||
|
|
||||||
|
verifyTransactions(loanId, transaction(100.0d, "Disbursement", "20 October 2024"));
|
||||||
|
|
||||||
|
loanTransactionHelper.makeLoanRepayment("22 October 2024", 102.0F, loanId.intValue());
|
||||||
|
|
||||||
|
loanDetails = loanTransactionHelper.getLoanDetails(loanId);
|
||||||
|
validateFullyPaidRepaymentPeriod(loanDetails, 1, "20 November 2024", 100, 0, 0, 0, 0, 100);
|
||||||
|
|
||||||
|
verifyTransactions(loanId, //
|
||||||
|
transaction(100.0d, "Disbursement", "20 October 2024", 100.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, false), //
|
||||||
|
transaction(102.0d, "Repayment", "22 October 2024", 0, 100.0, 0, 0, 0, 0, 2.0, false));
|
||||||
|
|
||||||
|
});
|
||||||
|
runAt("23 October 2024", () -> {
|
||||||
|
Long loanId = loanIdRef.get();
|
||||||
|
|
||||||
|
executeInlineCOB(loanId);
|
||||||
|
|
||||||
|
GetLoansLoanIdResponse loanDetails = loanTransactionHelper.getLoanDetails(loanId);
|
||||||
|
validateFullyPaidRepaymentPeriod(loanDetails, 1, "20 November 2024", 100, 0, 0, 0, 0, 100);
|
||||||
|
|
||||||
|
verifyTransactions(loanId, //
|
||||||
|
transaction(100.0d, "Disbursement", "20 October 2024", 100.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, false), //
|
||||||
|
transaction(102.0d, "Repayment", "22 October 2024", 0, 100.0, 0, 0, 0, 0, 2.0, false));
|
||||||
|
|
||||||
|
addCharge(loanId, true, 2.0d, "23 October 2024");
|
||||||
|
|
||||||
|
loanDetails = loanTransactionHelper.getLoanDetails(loanId);
|
||||||
|
validateRepaymentPeriod(loanDetails, 1, LocalDate.of(2024, 11, 20), 100.0, 100.0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 102, 0);
|
||||||
|
|
||||||
|
verifyTransactions(loanId, //
|
||||||
|
transaction(100.0d, "Disbursement", "20 October 2024", 100.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, false), //
|
||||||
|
transaction(2.0d, "Accrual", "23 October 2024", 0, 0.0, 0.0, 0.0, 2.0, 0.0, 0.0, false), //
|
||||||
|
transaction(102.0d, "Repayment", "22 October 2024", 0, 100.0, 0, 0, 2, 0, 0, false));
|
||||||
|
|
||||||
|
});
|
||||||
|
runAt("24 October 2024", () -> {
|
||||||
|
Long loanId = loanIdRef.get();
|
||||||
|
|
||||||
|
executeInlineCOB(loanId);
|
||||||
|
|
||||||
|
GetLoansLoanIdResponse loanDetails = loanTransactionHelper.getLoanDetails(loanId);
|
||||||
|
validateRepaymentPeriod(loanDetails, 1, LocalDate.of(2024, 11, 20), 100.0, 100.0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 102, 0);
|
||||||
|
|
||||||
|
verifyTransactions(loanId, //
|
||||||
|
transaction(100.0d, "Disbursement", "20 October 2024", 100.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, false), //
|
||||||
|
transaction(2.0d, "Accrual", "23 October 2024", 0, 0.0, 0.0, 0.0, 2.0, 0.0, 0.0, false), //
|
||||||
|
transaction(102.0d, "Repayment", "22 October 2024", 0, 100.0, 0, 0, 2, 0, 0, false));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// Update business date to 10/20/2024
|
||||||
|
// Create and disburse loan - €100 - 10/20/2024
|
||||||
|
// Update business date to 10/21/2024 and run COB
|
||||||
|
// Update business date to 10/22/2024
|
||||||
|
// Create a repayment - €102 - 10/22/2024
|
||||||
|
// Update business date to 10/23/2024 and run COB
|
||||||
|
// Create a charge (Penalty - NSF) with amount greater to the overpaid part - 10/23/2024
|
||||||
|
// Update business date to 10/24/2024 and run COB
|
||||||
|
@Test
|
||||||
|
public void chargeAmountIsGreaterThanOverpaidAmount() {
|
||||||
|
AtomicReference<Long> loanIdRef = new AtomicReference<>();
|
||||||
|
setup();
|
||||||
|
runAt("20 October 2024", () -> {
|
||||||
|
Long loanId = applyAndApproveProgressiveLoan(client.getClientId(), loanProduct.getResourceId(), "20 October 2024", 100.0, 0.0,
|
||||||
|
1, null);
|
||||||
|
|
||||||
|
loanIdRef.set(loanId);
|
||||||
|
|
||||||
|
disburseLoan(loanId, BigDecimal.valueOf(100), "20 October 2024");
|
||||||
|
|
||||||
|
GetLoansLoanIdResponse loanDetails = loanTransactionHelper.getLoanDetails(loanId);
|
||||||
|
validateFullyUnpaidRepaymentPeriod(loanDetails, 1, "20 November 2024", 100, 0, 0, 0);
|
||||||
|
|
||||||
|
verifyTransactions(loanId, transaction(100.0d, "Disbursement", "20 October 2024"));
|
||||||
|
});
|
||||||
|
runAt("21 October 2024", () -> {
|
||||||
|
Long loanId = loanIdRef.get();
|
||||||
|
|
||||||
|
executeInlineCOB(loanIdRef.get());
|
||||||
|
|
||||||
|
GetLoansLoanIdResponse loanDetails = loanTransactionHelper.getLoanDetails(loanId);
|
||||||
|
validateFullyUnpaidRepaymentPeriod(loanDetails, 1, "20 November 2024", 100, 0, 0, 0);
|
||||||
|
|
||||||
|
verifyTransactions(loanId, transaction(100.0d, "Disbursement", "20 October 2024"));
|
||||||
|
});
|
||||||
|
runAt("22 October 2024", () -> {
|
||||||
|
Long loanId = loanIdRef.get();
|
||||||
|
|
||||||
|
executeInlineCOB(loanId);
|
||||||
|
|
||||||
|
GetLoansLoanIdResponse loanDetails = loanTransactionHelper.getLoanDetails(loanId);
|
||||||
|
validateFullyUnpaidRepaymentPeriod(loanDetails, 1, "20 November 2024", 100, 0, 0, 0);
|
||||||
|
|
||||||
|
verifyTransactions(loanId, transaction(100.0d, "Disbursement", "20 October 2024"));
|
||||||
|
|
||||||
|
loanTransactionHelper.makeLoanRepayment("22 October 2024", 102.0F, loanId.intValue());
|
||||||
|
|
||||||
|
loanDetails = loanTransactionHelper.getLoanDetails(loanId);
|
||||||
|
validateFullyPaidRepaymentPeriod(loanDetails, 1, "20 November 2024", 100, 0, 0, 0, 0, 100);
|
||||||
|
|
||||||
|
verifyTransactions(loanId, //
|
||||||
|
transaction(100.0d, "Disbursement", "20 October 2024", 100.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, false), //
|
||||||
|
transaction(102.0d, "Repayment", "22 October 2024", 0, 100.0, 0, 0, 0, 0, 2.0, false));
|
||||||
|
|
||||||
|
});
|
||||||
|
runAt("23 October 2024", () -> {
|
||||||
|
Long loanId = loanIdRef.get();
|
||||||
|
|
||||||
|
executeInlineCOB(loanId);
|
||||||
|
|
||||||
|
GetLoansLoanIdResponse loanDetails = loanTransactionHelper.getLoanDetails(loanId);
|
||||||
|
validateFullyPaidRepaymentPeriod(loanDetails, 1, "20 November 2024", 100, 0, 0, 0, 0, 100);
|
||||||
|
|
||||||
|
verifyTransactions(loanId, //
|
||||||
|
transaction(100.0d, "Disbursement", "20 October 2024", 100.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, false), //
|
||||||
|
transaction(102.0d, "Repayment", "22 October 2024", 0, 100.0, 0, 0, 0, 0, 2.0, false));
|
||||||
|
|
||||||
|
addCharge(loanId, true, 5.0d, "23 October 2024");
|
||||||
|
|
||||||
|
loanDetails = loanTransactionHelper.getLoanDetails(loanId);
|
||||||
|
validateRepaymentPeriod(loanDetails, 1, LocalDate.of(2024, 11, 20), 100.0, 100.0, 0, 0, 0, 0, 5, 2, 3, 0, 0, 0, 102, 0);
|
||||||
|
|
||||||
|
verifyTransactions(loanId, //
|
||||||
|
transaction(100.0d, "Disbursement", "20 October 2024", 100.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, false), //
|
||||||
|
transaction(102.0d, "Repayment", "22 October 2024", 0, 100.0, 0, 0, 2, 0, 0, false));
|
||||||
|
|
||||||
|
});
|
||||||
|
runAt("24 October 2024", () -> {
|
||||||
|
Long loanId = loanIdRef.get();
|
||||||
|
|
||||||
|
executeInlineCOB(loanId);
|
||||||
|
|
||||||
|
GetLoansLoanIdResponse loanDetails = loanTransactionHelper.getLoanDetails(loanId);
|
||||||
|
validateRepaymentPeriod(loanDetails, 1, LocalDate.of(2024, 11, 20), 100.0, 100.0, 0, 0, 0, 0, 5, 2, 3, 0, 0, 0, 102, 0);
|
||||||
|
|
||||||
|
verifyTransactions(loanId, //
|
||||||
|
transaction(100.0d, "Disbursement", "20 October 2024", 100.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, false), //
|
||||||
|
transaction(5.0d, "Accrual", "23 October 2024", 0, 0.0, 0.0, 0.0, 5.0, 0.0, 0.0, false), //
|
||||||
|
transaction(102.0d, "Repayment", "22 October 2024", 0, 100.0, 0, 0, 2, 0, 0, false));
|
||||||
|
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// Update business date to 10/20/2024
|
||||||
|
// Create and disburse loan - €100 - 10/20/2024
|
||||||
|
// Update business date to 10/21/2024 and run COB
|
||||||
|
// Update business date to 10/22/2024
|
||||||
|
// Create a repayment - €100 - 10/22/2024
|
||||||
|
// Update business date to 10/23/2024 and run COB
|
||||||
|
// Create a charge (Penalty - NSF) - 10/23/2024
|
||||||
|
// Update business date to 10/24/2024 and run COB
|
||||||
|
@Test
|
||||||
|
public void chargeForObligationMetLoan() {
|
||||||
|
AtomicReference<Long> loanIdRef = new AtomicReference<>();
|
||||||
|
setup();
|
||||||
|
runAt("20 October 2024", () -> {
|
||||||
|
Long loanId = applyAndApproveProgressiveLoan(client.getClientId(), loanProduct.getResourceId(), "20 October 2024", 100.0, 0.0,
|
||||||
|
1, null);
|
||||||
|
|
||||||
|
loanIdRef.set(loanId);
|
||||||
|
|
||||||
|
disburseLoan(loanId, BigDecimal.valueOf(100), "20 October 2024");
|
||||||
|
|
||||||
|
GetLoansLoanIdResponse loanDetails = loanTransactionHelper.getLoanDetails(loanId);
|
||||||
|
validateFullyUnpaidRepaymentPeriod(loanDetails, 1, "20 November 2024", 100, 0, 0, 0);
|
||||||
|
|
||||||
|
verifyTransactions(loanId, transaction(100.0d, "Disbursement", "20 October 2024"));
|
||||||
|
});
|
||||||
|
runAt("21 October 2024", () -> {
|
||||||
|
Long loanId = loanIdRef.get();
|
||||||
|
|
||||||
|
executeInlineCOB(loanIdRef.get());
|
||||||
|
|
||||||
|
GetLoansLoanIdResponse loanDetails = loanTransactionHelper.getLoanDetails(loanId);
|
||||||
|
validateFullyUnpaidRepaymentPeriod(loanDetails, 1, "20 November 2024", 100, 0, 0, 0);
|
||||||
|
|
||||||
|
verifyTransactions(loanId, transaction(100.0d, "Disbursement", "20 October 2024"));
|
||||||
|
});
|
||||||
|
runAt("22 October 2024", () -> {
|
||||||
|
Long loanId = loanIdRef.get();
|
||||||
|
|
||||||
|
executeInlineCOB(loanId);
|
||||||
|
|
||||||
|
GetLoansLoanIdResponse loanDetails = loanTransactionHelper.getLoanDetails(loanId);
|
||||||
|
validateFullyUnpaidRepaymentPeriod(loanDetails, 1, "20 November 2024", 100, 0, 0, 0);
|
||||||
|
|
||||||
|
verifyTransactions(loanId, transaction(100.0d, "Disbursement", "20 October 2024"));
|
||||||
|
|
||||||
|
loanTransactionHelper.makeLoanRepayment("22 October 2024", 100.0F, loanId.intValue());
|
||||||
|
|
||||||
|
loanDetails = loanTransactionHelper.getLoanDetails(loanId);
|
||||||
|
validateFullyPaidRepaymentPeriod(loanDetails, 1, "20 November 2024", 100, 0, 0, 0, 0, 100);
|
||||||
|
|
||||||
|
verifyTransactions(loanId, //
|
||||||
|
transaction(100.0d, "Disbursement", "20 October 2024", 100.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, false), //
|
||||||
|
transaction(100.0d, "Repayment", "22 October 2024", 0, 100.0, 0, 0, 0, 0, 0.0, false));
|
||||||
|
|
||||||
|
});
|
||||||
|
runAt("23 October 2024", () -> {
|
||||||
|
Long loanId = loanIdRef.get();
|
||||||
|
|
||||||
|
executeInlineCOB(loanId);
|
||||||
|
|
||||||
|
GetLoansLoanIdResponse loanDetails = loanTransactionHelper.getLoanDetails(loanId);
|
||||||
|
validateFullyPaidRepaymentPeriod(loanDetails, 1, "20 November 2024", 100, 0, 0, 0, 0, 100);
|
||||||
|
|
||||||
|
verifyTransactions(loanId, //
|
||||||
|
transaction(100.0d, "Disbursement", "20 October 2024", 100.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, false), //
|
||||||
|
transaction(100.0d, "Repayment", "22 October 2024", 0, 100.0, 0, 0, 0, 0, 0.0, false));
|
||||||
|
|
||||||
|
addCharge(loanId, true, 5.0d, "23 October 2024");
|
||||||
|
|
||||||
|
loanDetails = loanTransactionHelper.getLoanDetails(loanId);
|
||||||
|
validateRepaymentPeriod(loanDetails, 1, LocalDate.of(2024, 11, 20), 100.0, 100.0, 0, 0, 0, 0, 5, 0, 5, 0, 0, 0, 100, 0);
|
||||||
|
|
||||||
|
verifyTransactions(loanId, //
|
||||||
|
transaction(100.0d, "Disbursement", "20 October 2024", 100.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, false), //
|
||||||
|
transaction(100.0d, "Repayment", "22 October 2024", 0, 100.0, 0, 0, 0, 0, 0, false));
|
||||||
|
|
||||||
|
});
|
||||||
|
runAt("24 October 2024", () -> {
|
||||||
|
Long loanId = loanIdRef.get();
|
||||||
|
|
||||||
|
executeInlineCOB(loanId);
|
||||||
|
|
||||||
|
GetLoansLoanIdResponse loanDetails = loanTransactionHelper.getLoanDetails(loanId);
|
||||||
|
validateRepaymentPeriod(loanDetails, 1, LocalDate.of(2024, 11, 20), 100.0, 100.0, 0, 0, 0, 0, 5, 0, 5, 0, 0, 0, 100, 0);
|
||||||
|
|
||||||
|
verifyTransactions(loanId, //
|
||||||
|
transaction(100.0d, "Disbursement", "20 October 2024", 100.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, false), //
|
||||||
|
transaction(5.0d, "Accrual", "23 October 2024", 0, 0.0, 0.0, 0.0, 5.0, 0.0, 0.0, false), //
|
||||||
|
transaction(100.0d, "Repayment", "22 October 2024", 0, 100.0, 0, 0, 0, 0, 0, false));
|
||||||
|
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user