[ 
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)

Reply via email to