Merge pull request #4106 from kjozsa/feature/FINERACT-1981-enable-backdated-repayment-for-progressive-loans
FINERACT-1981: Progressive loan enable backdated transactions
This commit is contained in:
+3
-1
@@ -132,6 +132,7 @@ import org.apache.fineract.portfolio.loanaccount.loanschedule.domain.LoanApplica
|
||||
import org.apache.fineract.portfolio.loanaccount.loanschedule.domain.LoanScheduleGenerator;
|
||||
import org.apache.fineract.portfolio.loanaccount.loanschedule.domain.LoanScheduleModel;
|
||||
import org.apache.fineract.portfolio.loanaccount.loanschedule.domain.LoanScheduleModelPeriod;
|
||||
import org.apache.fineract.portfolio.loanaccount.loanschedule.domain.LoanScheduleType;
|
||||
import org.apache.fineract.portfolio.loanproduct.domain.AmortizationMethod;
|
||||
import org.apache.fineract.portfolio.loanproduct.domain.CreditAllocationTransactionType;
|
||||
import org.apache.fineract.portfolio.loanproduct.domain.InterestCalculationPeriodMethod;
|
||||
@@ -3816,7 +3817,8 @@ public class Loan extends AbstractAuditableWithUTCDateTimeCustom<Long> {
|
||||
}
|
||||
|
||||
private void validateActivityNotBeforeLastTransactionDate(final LoanEvent event, final LocalDate activityDate) {
|
||||
if (!(this.repaymentScheduleDetail().isInterestRecalculationEnabled() || this.loanProduct().isHoldGuaranteeFunds())) {
|
||||
if (!(this.repaymentScheduleDetail().isInterestRecalculationEnabled() || this.loanProduct().isHoldGuaranteeFunds())
|
||||
|| !this.getLoanRepaymentScheduleDetail().getLoanScheduleType().equals(LoanScheduleType.CUMULATIVE)) {
|
||||
return;
|
||||
}
|
||||
LocalDate lastTransactionDate = getLastUserTransactionDate();
|
||||
|
||||
+4
-1
@@ -125,6 +125,7 @@ import org.apache.fineract.portfolio.loanaccount.exception.LoanChargeRefundExcep
|
||||
import org.apache.fineract.portfolio.loanaccount.exception.LoanTransactionNotFoundException;
|
||||
import org.apache.fineract.portfolio.loanaccount.loanschedule.data.OverdueLoanScheduleData;
|
||||
import org.apache.fineract.portfolio.loanaccount.loanschedule.domain.DefaultScheduledDateGenerator;
|
||||
import org.apache.fineract.portfolio.loanaccount.loanschedule.domain.LoanScheduleType;
|
||||
import org.apache.fineract.portfolio.loanaccount.loanschedule.domain.ScheduledDateGenerator;
|
||||
import org.apache.fineract.portfolio.loanaccount.serialization.LoanChargeApiJsonValidator;
|
||||
import org.apache.fineract.portfolio.loanproduct.data.LoanOverdueDTO;
|
||||
@@ -998,7 +999,9 @@ public class LoanChargeWritePlatformServiceImpl implements LoanChargeWritePlatfo
|
||||
chargeDefinition.getName());
|
||||
} else if (loanCharge.getDueLocalDate() != null) {
|
||||
// TODO: Review, error message seems not valid if interest recalculation is not enabled.
|
||||
LocalDate validationDate = loan.repaymentScheduleDetail().isInterestRecalculationEnabled() ? loan.getLastUserTransactionDate()
|
||||
boolean isCumulative = loan.getLoanRepaymentScheduleDetail().getLoanScheduleType().equals(LoanScheduleType.CUMULATIVE);
|
||||
LocalDate validationDate = loan.repaymentScheduleDetail().isInterestRecalculationEnabled() && isCumulative
|
||||
? loan.getLastUserTransactionDate()
|
||||
: loan.getDisbursementDate();
|
||||
if (DateUtils.isBefore(loanCharge.getDueLocalDate(), validationDate)) {
|
||||
final String defaultUserMessage = "charge with date before last transaction date can not be added to loan.";
|
||||
|
||||
+108
@@ -0,0 +1,108 @@
|
||||
/**
|
||||
* 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 lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.fineract.client.models.GetLoansLoanIdResponse;
|
||||
import org.apache.fineract.client.models.PostLoanProductsResponse;
|
||||
import org.apache.fineract.client.models.PostLoansLoanIdTransactionsRequest;
|
||||
import org.apache.fineract.client.models.PostLoansResponse;
|
||||
import org.apache.fineract.integrationtests.common.ClientHelper;
|
||||
import org.apache.fineract.integrationtests.common.loans.LoanTestLifecycleExtension;
|
||||
import org.junit.jupiter.api.Assertions;
|
||||
import org.junit.jupiter.api.BeforeEach;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.junit.jupiter.api.extension.ExtendWith;
|
||||
|
||||
@Slf4j
|
||||
@ExtendWith({ LoanTestLifecycleExtension.class })
|
||||
public class LoanTransactionBackdatedProgressiveTest extends BaseLoanIntegrationTest {
|
||||
|
||||
private Long clientId;
|
||||
private Long loanId;
|
||||
|
||||
@BeforeEach
|
||||
public void beforeEach() {
|
||||
runAt("01 July 2024", () -> {
|
||||
clientId = clientHelper.createClient(ClientHelper.defaultClientCreationRequest()).getClientId();
|
||||
final PostLoanProductsResponse loanProductsResponse = loanProductHelper.createLoanProduct(create4IProgressive());
|
||||
PostLoansResponse postLoansResponse = loanTransactionHelper.applyLoan(
|
||||
applyPin4ProgressiveLoanRequest(clientId, loanProductsResponse.getResourceId(), "01 June 2024", 1000.0, 10.0, 4, null));
|
||||
loanId = postLoansResponse.getLoanId();
|
||||
loanTransactionHelper.approveLoan(loanId, approveLoanRequest(1000.0, "01 June 2024"));
|
||||
disburseLoan(loanId, BigDecimal.valueOf(250.0), "01 June 2024");
|
||||
addRepaymentForLoan(loanId, 100.0, "10 June 2024");
|
||||
});
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testProgressiveBackdatedDisbursement() {
|
||||
runAt("01 July 2024", () -> {
|
||||
disburseLoan(loanId, BigDecimal.valueOf(250.0), "5 June 2024");
|
||||
|
||||
GetLoansLoanIdResponse loanDetails = loanTransactionHelper.getLoanDetails(loanId);
|
||||
Assertions.assertEquals(loanDetails.getDisbursementDetails().size(), 2);
|
||||
});
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testProgressiveBackdatedRepayment() {
|
||||
runAt("01 July 2024", () -> {
|
||||
addRepaymentForLoan(loanId, 100.0, "5 June 2024");
|
||||
|
||||
GetLoansLoanIdResponse loanDetails = loanTransactionHelper.getLoanDetails(loanId);
|
||||
Assertions.assertTrue(loanDetails.getTransactions().size() >= 2);
|
||||
});
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testProgressiveBackdatedMerchantIssuedRefund() {
|
||||
runAt("01 July 2024", () -> {
|
||||
loanTransactionHelper.makeMerchantIssuedRefund(loanId, new PostLoansLoanIdTransactionsRequest().dateFormat(DATETIME_PATTERN)
|
||||
.transactionDate("5 June 2024").locale("en").transactionAmount(100.0));
|
||||
|
||||
GetLoansLoanIdResponse loanDetails = loanTransactionHelper.getLoanDetails(loanId);
|
||||
Assertions.assertTrue(loanDetails.getTransactions().size() >= 2);
|
||||
});
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testProgressiveBackdatedPayoutRefund() {
|
||||
runAt("01 July 2024", () -> {
|
||||
loanTransactionHelper.makePayoutRefund(loanId, new PostLoansLoanIdTransactionsRequest().dateFormat(DATETIME_PATTERN)
|
||||
.transactionDate("5 June 2024").locale("en").transactionAmount(100.0));
|
||||
|
||||
GetLoansLoanIdResponse loanDetails = loanTransactionHelper.getLoanDetails(loanId);
|
||||
Assertions.assertTrue(loanDetails.getTransactions().size() >= 2);
|
||||
});
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testProgressiveBackdatedGoodwillCredit() {
|
||||
runAt("01 July 2024", () -> {
|
||||
loanTransactionHelper.makeGoodwillCredit(loanId, new PostLoansLoanIdTransactionsRequest().dateFormat(DATETIME_PATTERN)
|
||||
.transactionDate("5 June 2024").locale("en").transactionAmount(100.0));
|
||||
|
||||
GetLoansLoanIdResponse loanDetails = loanTransactionHelper.getLoanDetails(loanId);
|
||||
Assertions.assertTrue(loanDetails.getTransactions().size() >= 2);
|
||||
});
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user