You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@fineract.apache.org by "kulminsky (via GitHub)" <gi...@apache.org> on 2025/02/03 14:51:55 UTC
[PR] FINERACT-2081: Accrual not created for closed or overpaid loans [fineract]
kulminsky opened a new pull request, #4299:
URL: https://github.com/apache/fineract/pull/4299
## Description
Accrual not created for closed or overpaid loans
Ignore if these details are present on the associated [Apache Fineract JIRA ticket](https://github.com/apache/fineract/pull/1284).
## Checklist
Please make sure these boxes are checked before submitting your pull request - thanks!
- [ ] Write the commit message as per https://github.com/apache/fineract/#pull-requests
- [ ] Acknowledge that we will not review PRs that are not passing the build _("green")_ - it is your responsibility to get a proposed PR to pass the build, not primarily the project's maintainers.
- [ ] Create/update unit or integration tests for verifying the changes made.
- [ ] Follow coding conventions at https://cwiki.apache.org/confluence/display/FINERACT/Coding+Conventions.
- [ ] Add required Swagger annotation and update API documentation at fineract-provider/src/main/resources/static/legacy-docs/apiLive.htm with details of any API changes
- [ ] Submission is not a "code dump". (Large changes can be made "in repository" via a branch. Ask on the developer mailing list for guidance, if required.)
FYI our guidelines for code reviews are at https://cwiki.apache.org/confluence/display/FINERACT/Code+Review+Guide.
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: commits-unsubscribe@fineract.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
Re: [PR] FINERACT-2081: Accrual not created for closed or overpaid loans [fineract]
Posted by "adamsaghy (via GitHub)" <gi...@apache.org>.
adamsaghy commented on code in PR #4299:
URL: https://github.com/apache/fineract/pull/4299#discussion_r1946168806
##########
fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanAccrualsProcessingServiceImpl.java:
##########
@@ -246,7 +246,13 @@ public void processIncomePostingAndAccruals(@NotNull Loan loan) {
@Override
public void processAccrualsOnLoanClosure(@NotNull Loan loan) {
// check and process accruals for loan WITHOUT interest recalculation details and compounding posted as income
- addAccruals(loan, loan.getLastLoanRepaymentScheduleInstallment().getDueDate(), false, true, false);
+ LocalDate accrualDate = getFinalAccrualTransactionDate(loan);
Review Comment:
`processIncomeAndAccrualTransactionOnLoanClosure` should calculate and add the accrual, no?
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: commits-unsubscribe@fineract.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
Re: [PR] FINERACT-2081: Accrual not created for closed or overpaid loans [fineract]
Posted by "adamsaghy (via GitHub)" <gi...@apache.org>.
adamsaghy commented on code in PR #4299:
URL: https://github.com/apache/fineract/pull/4299#discussion_r1946169989
##########
fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanAccrualsProcessingServiceImpl.java:
##########
@@ -1196,10 +1202,13 @@ private void reverseAccrual(LoanTransaction transaction, boolean addEvent) {
}
private LocalDate getFinalAccrualTransactionDate(Loan loan) {
+ if (configurationDomainService.getAccrualDateConfigForCharge().equals(ACCRUAL_ON_CHARGE_SUBMITTED_ON_DATE)) {
+ return loan.getLastLoanRepaymentScheduleInstallment().getDueDate();
Review Comment:
i wonder whether the charge submitted on date should be the accrual transaction date here, no?
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: commits-unsubscribe@fineract.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
Re: [PR] FINERACT-2081: Accrual not created for closed or overpaid loans [fineract]
Posted by "adamsaghy (via GitHub)" <gi...@apache.org>.
adamsaghy commented on code in PR #4299:
URL: https://github.com/apache/fineract/pull/4299#discussion_r1946174484
##########
integration-tests/src/test/java/org/apache/fineract/integrationtests/AccrualsOnLoanClosureTest.java:
##########
@@ -0,0 +1,176 @@
+/**
+ * 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 static org.apache.fineract.infrastructure.configuration.api.GlobalConfigurationConstants.CHARGE_ACCRUAL_DATE;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+
+import io.restassured.builder.RequestSpecBuilder;
+import io.restassured.builder.ResponseSpecBuilder;
+import io.restassured.http.ContentType;
+import io.restassured.specification.RequestSpecification;
+import io.restassured.specification.ResponseSpecification;
+import java.math.BigDecimal;
+import java.time.LocalDate;
+import java.time.format.DateTimeFormatter;
+import java.time.format.DateTimeFormatterBuilder;
+import java.util.List;
+import java.util.Locale;
+import java.util.Objects;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.fineract.client.models.GetLoansLoanIdResponse;
+import org.apache.fineract.client.models.GetLoansLoanIdTransactions;
+import org.apache.fineract.client.models.PostClientsResponse;
+import org.apache.fineract.client.models.PostLoanProductsResponse;
+import org.apache.fineract.client.models.PostLoansLoanIdChargesRequest;
+import org.apache.fineract.client.models.PostLoansLoanIdTransactionsRequest;
+import org.apache.fineract.client.models.PutGlobalConfigurationsRequest;
+import org.apache.fineract.integrationtests.common.ClientHelper;
+import org.apache.fineract.integrationtests.common.Utils;
+import org.apache.fineract.integrationtests.common.charges.ChargesHelper;
+import org.apache.fineract.integrationtests.common.loans.LoanTransactionHelper;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
+@Slf4j
+public class AccrualsOnLoanClosureTest extends BaseLoanIntegrationTest {
+
+ private DateTimeFormatter dateFormatter = new DateTimeFormatterBuilder().appendPattern("dd MMMM yyyy").toFormatter();
+
+ private static final String disbursementDate = "22 April 2024";
+ private static final String chargeDate = "24 April 2024";
+ private static final String repaymentDate = "25 April 2024";
+ private static final Double disbursementAmount = 800.0;
+ private static final Double repaymentAmount = 820.0;
+ private static final Double chargeAmount = 20.0;
+ private static final Integer expectedNumberOfAccruals = 1;
+
+ private ResponseSpecification responseSpec;
+ private RequestSpecification requestSpec;
+ private ClientHelper clientHelper;
+ private LoanTransactionHelper loanTransactionHelper;
+ private static Long loanId;
+ private static Integer penalty;
+ private static String penaltyCharge1AddedDate;
+
+ @BeforeEach
+ public void setup() {
+ Utils.initializeRESTAssured();
+ this.requestSpec = new RequestSpecBuilder().setContentType(ContentType.JSON).build();
+ this.requestSpec.header("Authorization", "Basic " + Utils.loginIntoServerAndGetBase64EncodedAuthenticationKey());
+ this.responseSpec = new ResponseSpecBuilder().expectStatusCode(200).build();
+ this.loanTransactionHelper = new LoanTransactionHelper(this.requestSpec, this.responseSpec);
+ this.clientHelper = new ClientHelper(this.requestSpec, this.responseSpec);
+
+ PostClientsResponse client = clientHelper.createClient(ClientHelper.defaultClientCreationRequest());
+ PostLoanProductsResponse loanProduct = loanProductHelper
+ .createLoanProduct(createOnePeriod30DaysLongNoInterestPeriodicAccrualProduct());
+
+ loanId = applyAndApproveLoan(client.getClientId(), loanProduct.getResourceId(), disbursementDate, disbursementAmount);
+ Assertions.assertNotNull(loanId);
+ disburseLoan(loanId, BigDecimal.valueOf(disbursementAmount), disbursementDate);
+
+ penalty = ChargesHelper.createCharges(requestSpec, responseSpec,
+ ChargesHelper.getLoanSpecifiedDueDateJSON(ChargesHelper.CHARGE_CALCULATION_TYPE_FLAT, "20", true));
+
+ LocalDate targetDate = LocalDate.of(2024, 4, 24);
+ penaltyCharge1AddedDate = dateFormatter.format(targetDate);
+ }
+
+ @Test
+ public void testAccrualCreatedOnLoanClosure() {
+ runAt(chargeDate, () ->
Review Comment:
You might wanna include all the steps that to be executed on the wanted business date. This way some actions are executed on a particular business date and some are executed as with current, calendar date.
Example:
```
runAt(repaymentDate, () ->
loanTransactionHelper.makeLoanRepayment(loanId, new PostLoansLoanIdTransactionsRequest().dateFormat("dd MMMM yyyy")
.transactionDate(repaymentDate).locale("en").transactionAmount(repaymentAmount)));
```
This is executed on the provided "repaymentDate", but `GetLoansLoanIdResponse loanDetails = loanTransactionHelper.getLoanDetails(loanId);` is not....
Example:
```
runAt(repaymentDate, () -> {
loanTransactionHelper.makeLoanRepayment(loanId, new PostLoansLoanIdTransactionsRequest().dateFormat("dd MMMM yyyy")
.transactionDate(repaymentDate).locale("en").transactionAmount(repaymentAmount));
logLoanTransactions(loanId);
GetLoansLoanIdResponse loanDetails = loanTransactionHelper.getLoanDetails(loanId);
logInstallmentsOfLoanDetails(loanDetails);
List<GetLoansLoanIdTransactions> accrualTransactions = loanDetails.getTransactions().stream()
.filter(transaction -> transaction.getType().getCode().equals("loanTransactionType.accrual")).toList();
assertFalse(accrualTransactions.isEmpty(), "Expected accrual transaction on loan closure");
assertEquals(expectedNumberOfAccruals, accrualTransactions.size(), "Incorrect number of accruals");
});
```
Above all the steps are executed on the same provided current date
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: commits-unsubscribe@fineract.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
Re: [PR] FINERACT-2081: Accrual not created for closed or overpaid loans [fineract]
Posted by "adamsaghy (via GitHub)" <gi...@apache.org>.
adamsaghy merged PR #4299:
URL: https://github.com/apache/fineract/pull/4299
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: commits-unsubscribe@fineract.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
Re: [PR] FINERACT-2081: Accrual not created for closed or overpaid loans [fineract]
Posted by "adamsaghy (via GitHub)" <gi...@apache.org>.
adamsaghy commented on code in PR #4299:
URL: https://github.com/apache/fineract/pull/4299#discussion_r1946170861
##########
fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanAccrualsProcessingServiceImpl.java:
##########
@@ -1196,10 +1202,13 @@ private void reverseAccrual(LoanTransaction transaction, boolean addEvent) {
}
private LocalDate getFinalAccrualTransactionDate(Loan loan) {
+ if (configurationDomainService.getAccrualDateConfigForCharge().equals(ACCRUAL_ON_CHARGE_SUBMITTED_ON_DATE)) {
+ return loan.getLastLoanRepaymentScheduleInstallment().getDueDate();
+ }
return switch (loan.getStatus()) {
case CLOSED_OBLIGATIONS_MET -> loan.getClosedOnDate();
case OVERPAID -> loan.getOverpaidOnDate();
- default -> throw new IllegalStateException("Unexpected value: " + loan.getStatus());
+ default -> loan.getLastLoanRepaymentScheduleInstallment().getDueDate();
Review Comment:
Can you please elaborate on this? I am not fully understand the idea here...
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: commits-unsubscribe@fineract.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org