Abhishek Chaudhary created FINERACT-2705:
--------------------------------------------

             Summary: Post Interest For Savings job aborts all interest 
postings when one transaction's GL account is unresolved
                 Key: FINERACT-2705
                 URL: https://issues.apache.org/jira/browse/FINERACT-2705
             Project: Apache Fineract
          Issue Type: Bug
          Components: Accounting, Savings
    Affects Versions: 1.13.0
            Reporter: Abhishek Chaudhary


The scheduled job *Post Interest For Saving* writes all journal entries for a 
posting cycle in a single JDBC batch inside one transaction.

{{SavingsSchedularInterestPoster.batchUpdateJournalEntries}} decides whether to 
write journal entries using the *product-level* {{SAVINGS_CONTROL}} and 
{{INTEREST_ON_SAVINGS}} mappings, but the inserted rows use the 
*transaction-level* accounts chosen by 
{{SavingsAccountWritePlatformServiceJpaRepositoryImpl.selectAccountId}}, which 
resolves accrual-only mappings ({{INTEREST_PAYABLE}}, {{INTEREST_RECEIVABLE}} - 
introduced in FINERACT-2312). For a cash-based product these mappings do not 
exist, so the resolved account id is {{0}} and the batch INSERT fails with:

{code}
ERROR: insert or update on table "acc_gl_journal_entry" violates foreign key 
constraint "FK_acc_gl_journal_entry_acc_gl_account"
Detail: Key (account_id)=(0) is not present in table "acc_gl_account".
{code}

Because the whole batch shares one transaction, a *single* account with an 
unresolved GL mapping rolls back interest posting for *every* savings account 
in the tenant.

This was observed deterministically in [PR 
#6124|https://github.com/apache/fineract/pull/6124] CI on all three databases 
(MySQL, MariaDB, PostgreSQL), where test sharding co-located a cash-based 
accounting test ({{AccountTransferTest}}) with {{SavingsInterestPostingTest}}. 
PR #6124 fixes the cash-based fallback in {{selectAccountId}} for regular 
interest posting; this ticket makes the job itself resilient:

* validate the transaction-level GL accounts before enqueueing journal entries
* skip (with a WARN log) transactions whose accounts are unresolved - e.g. 
overdraft interest on cash-based products - instead of failing the whole batch 
for all accounts

Unit tests included. PR follows.




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

Reply via email to