Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

FINERACT-2081: Accrual not created for closed or overpaid loans #4299

Open
wants to merge 1 commit into
base: develop
Choose a base branch
from

Conversation

kulminsky
Copy link
Contributor

Description

Accrual not created for closed or overpaid loans

Ignore if these details are present on the associated Apache Fineract JIRA ticket.

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.

@kulminsky kulminsky force-pushed the FINERACT-2081/Accrual_not_created_for_closed_or_overpaid_loans branch from 4fdd72e to fb0bb6d Compare February 6, 2025 15:02
@@ -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);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

processIncomeAndAccrualTransactionOnLoanClosure should calculate and add the accrual, no?

@@ -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();
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

i wonder whether the charge submitted on date should be the accrual transaction date here, no?

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();
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can you please elaborate on this? I am not fully understand the idea here...


@Test
public void testAccrualCreatedOnLoanClosure() {
runAt(chargeDate, () ->
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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

@kulminsky kulminsky force-pushed the FINERACT-2081/Accrual_not_created_for_closed_or_overpaid_loans branch from fb0bb6d to d2a64a4 Compare February 7, 2025 10:21
@kulminsky kulminsky marked this pull request as ready for review February 7, 2025 10:21
@kulminsky kulminsky force-pushed the FINERACT-2081/Accrual_not_created_for_closed_or_overpaid_loans branch from d2a64a4 to 2f01e13 Compare February 7, 2025 10:22
@kulminsky kulminsky force-pushed the FINERACT-2081/Accrual_not_created_for_closed_or_overpaid_loans branch from 2f01e13 to 05a885b Compare February 7, 2025 13:54
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants