You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@fineract.apache.org by "Ralph Hopman (Jira)" <ji...@apache.org> on 2026/04/02 21:14:00 UTC

[jira] [Resolved] (FINERACT-2566) Refresh loan summary after account-transfer disbursement charge collection

     [ https://issues.apache.org/jira/browse/FINERACT-2566?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Ralph Hopman resolved FINERACT-2566.
------------------------------------
    Resolution: Fixed

> Refresh loan summary after account-transfer disbursement charge collection
> --------------------------------------------------------------------------
>
>                 Key: FINERACT-2566
>                 URL: https://issues.apache.org/jira/browse/FINERACT-2566
>             Project: Apache Fineract
>          Issue Type: Bug
>          Components: Charges, Loan
>            Reporter: Ralph Hopman
>            Assignee: Ralph Hopman
>            Priority: Minor
>
> When a loan is disbursed and one or more loan charges have their payment mode set to *Account Transfer* ({{{}ACCOUNT_TRANSFER{}}}), the system collects each charge by calling {{transferFunds()}} on the linked savings account. This creates a {{REPAYMENT_AT_DISBURSEMENT}} loan transaction and marks the charge as paid.
> However, {{transferFunds()}} does *not* recompute the {{LoanSummary}} derived fields. As a result, fields such as {{{}feeChargesPaid{}}}, {{{}feeChargesOutstanding{}}}, and {{totalOutstanding}} remain stale, reflecting the values computed during the {{saveAndFlush}} that preceded the charge loop.
> This causes the loan balance to appear higher than what the client actually owes after disbursement.
> h2. Steps to Reproduce
>  # Create a loan product with a disbursement charge configured with payment mode {*}Account Transfer{*}.
>  # Link a savings account to the loan.
>  # Approve and disburse the loan.
>  # Observe that {{LoanSummary.totalOutstanding}} and {{feeChargesOutstanding}} do not reflect the charge collection.
> h2. Root Cause
> In {{{}LoanWritePlatformServiceJpaRepositoryImpl#disburseLoan(){}}}, after the loop that calls {{accountTransfersWritePlatformService.transferFunds()}} for each entry in {{{}disBuLoanCharges{}}}, there is no subsequent call to {{loanBalanceService.updateLoanSummaryDerivedFields(loan)}} or a flush. The summary is therefore out of sync for the remainder of the disbursement flow and is persisted in a stale state.
> h2. Proposed Fix
> After the {{disBuLoanCharges}} transfer loop, when the map is non-empty, call:
> {code:java}
> if (!disBuLoanCharges.isEmpty()) {
>     loanBalanceService.updateLoanSummaryDerivedFields(loan);
>     saveAndFlushLoanWithDataIntegrityViolationChecks(loan);
> }
> {code}
> h2. Acceptance Criteria
>  * When a loan with an {{ACCOUNT_TRANSFER}} disbursement charge is disbursed, {{LoanSummary}} derived fields ({{{}feeChargesPaid{}}}, {{{}feeChargesOutstanding{}}}, {{{}totalOutstanding{}}}) must reflect the collected charge amounts.
>  * When a loan has *no* {{ACCOUNT_TRANSFER}} disbursement charges, the existing behaviour is unchanged (no extra summary refresh is performed).
>  * Unit tests cover both branches:
>  ** A loan with an {{ACCOUNT_TRANSFER}} disbursement charge triggers exactly two calls to {{{}updateLoanSummaryDerivedFields{}}}.
>  ** A loan with only {{REGULAR}} disbursement charges (or none) triggers exactly one call.



--
This message was sent by Atlassian Jira
(v8.20.10#820010)