Hi all,
I tested FINERACT-790 (double journal entry on undo disbursal, then
re-disburse to savings) on current develop and the issue no longer occurs.
I think the ticket can be closed if others agree.
JIRA: https://issues.apache.org/jira/browse/FINERACT-790
<https://issues.apache.org/jira/browse/FINERACT-790?utm_source=chatgpt.com>
Tested on: commit 583575d2aa7e1c692d7bebfaa9af67177df1f573,
1.16.0-SNAPSHOT, Windows, fresh DB, cash-based accounting (accountingRule
2) on both loan and savings products, loan linked to a savings account.
Steps: disburseToSavings (10,000) -> undoDisbursal -> disburseToSavings
again, then GET /journalentries (unfiltered).
Result: the second disbursal added only its own 4 entries (ids 11-14, new
transaction ids L5 and S2). Nothing was added to the reversed first
disbursal (L3, S1).
Snapshot A (after undo, 8 rows). glAccountId 1 = asset, 2 = liability:
{
"totalFilteredRecords": 8,
"pageItems": [
{
"id": 3,
"officeId": 1,
"officeName": "Head Office",
"glAccountName": "Test Asset",
"glAccountId": 1,
"glAccountCode": "A100",
"glAccountType": {
"id": 1,
"code": "accountType.asset",
"value": "ASSET"
},
"transactionDate": [
2026,
10,
1
],
"entryType": {
"id": 2,
"code": "journalEntrytType.debit",
"value": "DEBIT"
},
"amount": 10000.000000,
"currency": {
"code": "USD",
"name": "US Dollar",
"decimalPlaces": 2,
"displaySymbol": "$",
"nameCode": "currency.USD",
"displayLabel": "US Dollar ($)"
},
"transactionId": "L3",
"manualEntry": false,
"entityType": {
"id": 1,
"code": "productType.loan",
"value": "LOAN"
},
"entityId": 1,
"createdByUserId": 1,
"createdDate": [
2026,
10,
4
],
"createdByUserName": "mifos",
"reversed": false,
"submittedOnDate": [
2026,
10,
4
]
},
{
"id": 4,
"officeId": 1,
"officeName": "Head Office",
"glAccountName": "Test Liability",
"glAccountId": 2,
"glAccountCode": "L100",
"glAccountType": {
"id": 2,
"code": "accountType.liability",
"value": "LIABILITY"
},
"transactionDate": [
2026,
10,
1
],
"entryType": {
"id": 1,
"code": "journalEntryType.credit",
"value": "CREDIT"
},
"amount": 10000.000000,
"currency": {
"code": "USD",
"name": "US Dollar",
"decimalPlaces": 2,
"displaySymbol": "$",
"nameCode": "currency.USD",
"displayLabel": "US Dollar ($)"
},
"transactionId": "L3",
"manualEntry": false,
"entityType": {
"id": 1,
"code": "productType.loan",
"value": "LOAN"
},
"entityId": 1,
"createdByUserId": 1,
"createdDate": [
2026,
10,
4
],
"createdByUserName": "mifos",
"reversed": false,
"submittedOnDate": [
2026,
10,
4
]
},
{
"id": 5,
"officeId": 1,
"officeName": "Head Office",
"glAccountName": "Test Liability",
"glAccountId": 2,
"glAccountCode": "L100",
"glAccountType": {
"id": 2,
"code": "accountType.liability",
"value": "LIABILITY"
},
"transactionDate": [
2026,
10,
1
],
"entryType": {
"id": 2,
"code": "journalEntrytType.debit",
"value": "DEBIT"
},
"amount": 10000.000000,
"currency": {
"code": "USD",
"name": "US Dollar",
"decimalPlaces": 2,
"displaySymbol": "$",
"nameCode": "currency.USD",
"displayLabel": "US Dollar ($)"
},
"transactionId": "S1",
"manualEntry": false,
"entityType": {
"id": 2,
"code": "productType.saving",
"value": "SAVING"
},
"entityId": 1,
"createdByUserId": 1,
"createdDate": [
2026,
10,
4
],
"createdByUserName": "mifos",
"reversed": false,
"submittedOnDate": [
2026,
10,
4
]
},
{
"id": 6,
"officeId": 1,
"officeName": "Head Office",
"glAccountName": "Test Liability",
"glAccountId": 2,
"glAccountCode": "L100",
"glAccountType": {
"id": 2,
"code": "accountType.liability",
"value": "LIABILITY"
},
"transactionDate": [
2026,
10,
1
],
"entryType": {
"id": 1,
"code": "journalEntryType.credit",
"value": "CREDIT"
},
"amount": 10000.000000,
"currency": {
"code": "USD",
"name": "US Dollar",
"decimalPlaces": 2,
"displaySymbol": "$",
"nameCode": "currency.USD",
"displayLabel": "US Dollar ($)"
},
"transactionId": "S1",
"manualEntry": false,
"entityType": {
"id": 2,
"code": "productType.saving",
"value": "SAVING"
},
"entityId": 1,
"createdByUserId": 1,
"createdDate": [
2026,
10,
4
],
"createdByUserName": "mifos",
"reversed": false,
"submittedOnDate": [
2026,
10,
4
]
},
{
"id": 7,
"officeId": 1,
"officeName": "Head Office",
"glAccountName": "Test Asset",
"glAccountId": 1,
"glAccountCode": "A100",
"glAccountType": {
"id": 1,
"code": "accountType.asset",
"value": "ASSET"
},
"transactionDate": [
2026,
10,
1
],
"entryType": {
"id": 1,
"code": "journalEntryType.credit",
"value": "CREDIT"
},
"amount": 10000.000000,
"currency": {
"code": "USD",
"name": "US Dollar",
"decimalPlaces": 2,
"displaySymbol": "$",
"nameCode": "currency.USD",
"displayLabel": "US Dollar ($)"
},
"transactionId": "L3",
"manualEntry": false,
"entityType": {
"id": 1,
"code": "productType.loan",
"value": "LOAN"
},
"entityId": 1,
"createdByUserId": 1,
"createdDate": [
2026,
10,
4
],
"createdByUserName": "mifos",
"reversed": false,
"submittedOnDate": [
2026,
10,
4
]
},
{
"id": 8,
"officeId": 1,
"officeName": "Head Office",
"glAccountName": "Test Liability",
"glAccountId": 2,
"glAccountCode": "L100",
"glAccountType": {
"id": 2,
"code": "accountType.liability",
"value": "LIABILITY"
},
"transactionDate": [
2026,
10,
1
],
"entryType": {
"id": 2,
"code": "journalEntrytType.debit",
"value": "DEBIT"
},
"amount": 10000.000000,
"currency": {
"code": "USD",
"name": "US Dollar",
"decimalPlaces": 2,
"displaySymbol": "$",
"nameCode": "currency.USD",
"displayLabel": "US Dollar ($)"
},
"transactionId": "L3",
"manualEntry": false,
"entityType": {
"id": 1,
"code": "productType.loan",
"value": "LOAN"
},
"entityId": 1,
"createdByUserId": 1,
"createdDate": [
2026,
10,
4
],
"createdByUserName": "mifos",
"reversed": false,
"submittedOnDate": [
2026,
10,
4
]
},
{
"id": 9,
"officeId": 1,
"officeName": "Head Office",
"glAccountName": "Test Liability",
"glAccountId": 2,
"glAccountCode": "L100",
"glAccountType": {
"id": 2,
"code": "accountType.liability",
"value": "LIABILITY"
},
"transactionDate": [
2026,
10,
1
],
"entryType": {
"id": 2,
"code": "journalEntrytType.debit",
"value": "DEBIT"
},
"amount": 10000.000000,
"currency": {
"code": "USD",
"name": "US Dollar",
"decimalPlaces": 2,
"displaySymbol": "$",
"nameCode": "currency.USD",
"displayLabel": "US Dollar ($)"
},
"transactionId": "S1",
"manualEntry": false,
"entityType": {
"id": 2,
"code": "productType.saving",
"value": "SAVING"
},
"entityId": 1,
"createdByUserId": 1,
"createdDate": [
2026,
10,
4
],
"createdByUserName": "mifos",
"reversed": false,
"submittedOnDate": [
2026,
10,
4
]
},
{
"id": 10,
"officeId": 1,
"officeName": "Head Office",
"glAccountName": "Test Liability",
"glAccountId": 2,
"glAccountCode": "L100",
"glAccountType": {
"id": 2,
"code": "accountType.liability",
"value": "LIABILITY"
},
"transactionDate": [
2026,
10,
1
],
"entryType": {
"id": 1,
"code": "journalEntryType.credit",
"value": "CREDIT"
},
"amount": 10000.000000,
"currency": {
"code": "USD",
"name": "US Dollar",
"decimalPlaces": 2,
"displaySymbol": "$",
"nameCode": "currency.USD",
"displayLabel": "US Dollar ($)"
},
"transactionId": "S1",
"manualEntry": false,
"entityType": {
"id": 2,
"code": "productType.saving",
"value": "SAVING"
},
"entityId": 1,
"createdByUserId": 1,
"createdDate": [
2026,
10,
4
],
"createdByUserName": "mifos",
"reversed": false,
"submittedOnDate": [
2026,
10,
4
]
}
]
}
Snapshot B (after second disbursal, 12 rows):
{
"totalFilteredRecords": 12,
"pageItems": [
{
"id": 3,
"officeId": 1,
"officeName": "Head Office",
"glAccountName": "Test Asset",
"glAccountId": 1,
"glAccountCode": "A100",
"glAccountType": {
"id": 1,
"code": "accountType.asset",
"value": "ASSET"
},
"transactionDate": [
2026,
10,
1
],
"entryType": {
"id": 2,
"code": "journalEntrytType.debit",
"value": "DEBIT"
},
"amount": 10000.000000,
"currency": {
"code": "USD",
"name": "US Dollar",
"decimalPlaces": 2,
"displaySymbol": "$",
"nameCode": "currency.USD",
"displayLabel": "US Dollar ($)"
},
"transactionId": "L3",
"manualEntry": false,
"entityType": {
"id": 1,
"code": "productType.loan",
"value": "LOAN"
},
"entityId": 1,
"createdByUserId": 1,
"createdDate": [
2026,
10,
4
],
"createdByUserName": "mifos",
"reversed": false,
"submittedOnDate": [
2026,
10,
4
]
},
{
"id": 4,
"officeId": 1,
"officeName": "Head Office",
"glAccountName": "Test Liability",
"glAccountId": 2,
"glAccountCode": "L100",
"glAccountType": {
"id": 2,
"code": "accountType.liability",
"value": "LIABILITY"
},
"transactionDate": [
2026,
10,
1
],
"entryType": {
"id": 1,
"code": "journalEntryType.credit",
"value": "CREDIT"
},
"amount": 10000.000000,
"currency": {
"code": "USD",
"name": "US Dollar",
"decimalPlaces": 2,
"displaySymbol": "$",
"nameCode": "currency.USD",
"displayLabel": "US Dollar ($)"
},
"transactionId": "L3",
"manualEntry": false,
"entityType": {
"id": 1,
"code": "productType.loan",
"value": "LOAN"
},
"entityId": 1,
"createdByUserId": 1,
"createdDate": [
2026,
10,
4
],
"createdByUserName": "mifos",
"reversed": false,
"submittedOnDate": [
2026,
10,
4
]
},
{
"id": 5,
"officeId": 1,
"officeName": "Head Office",
"glAccountName": "Test Liability",
"glAccountId": 2,
"glAccountCode": "L100",
"glAccountType": {
"id": 2,
"code": "accountType.liability",
"value": "LIABILITY"
},
"transactionDate": [
2026,
10,
1
],
"entryType": {
"id": 2,
"code": "journalEntrytType.debit",
"value": "DEBIT"
},
"amount": 10000.000000,
"currency": {
"code": "USD",
"name": "US Dollar",
"decimalPlaces": 2,
"displaySymbol": "$",
"nameCode": "currency.USD",
"displayLabel": "US Dollar ($)"
},
"transactionId": "S1",
"manualEntry": false,
"entityType": {
"id": 2,
"code": "productType.saving",
"value": "SAVING"
},
"entityId": 1,
"createdByUserId": 1,
"createdDate": [
2026,
10,
4
],
"createdByUserName": "mifos",
"reversed": false,
"submittedOnDate": [
2026,
10,
4
]
},
{
"id": 6,
"officeId": 1,
"officeName": "Head Office",
"glAccountName": "Test Liability",
"glAccountId": 2,
"glAccountCode": "L100",
"glAccountType": {
"id": 2,
"code": "accountType.liability",
"value": "LIABILITY"
},
"transactionDate": [
2026,
10,
1
],
"entryType": {
"id": 1,
"code": "journalEntryType.credit",
"value": "CREDIT"
},
"amount": 10000.000000,
"currency": {
"code": "USD",
"name": "US Dollar",
"decimalPlaces": 2,
"displaySymbol": "$",
"nameCode": "currency.USD",
"displayLabel": "US Dollar ($)"
},
"transactionId": "S1",
"manualEntry": false,
"entityType": {
"id": 2,
"code": "productType.saving",
"value": "SAVING"
},
"entityId": 1,
"createdByUserId": 1,
"createdDate": [
2026,
10,
4
],
"createdByUserName": "mifos",
"reversed": false,
"submittedOnDate": [
2026,
10,
4
]
},
{
"id": 7,
"officeId": 1,
"officeName": "Head Office",
"glAccountName": "Test Asset",
"glAccountId": 1,
"glAccountCode": "A100",
"glAccountType": {
"id": 1,
"code": "accountType.asset",
"value": "ASSET"
},
"transactionDate": [
2026,
10,
1
],
"entryType": {
"id": 1,
"code": "journalEntryType.credit",
"value": "CREDIT"
},
"amount": 10000.000000,
"currency": {
"code": "USD",
"name": "US Dollar",
"decimalPlaces": 2,
"displaySymbol": "$",
"nameCode": "currency.USD",
"displayLabel": "US Dollar ($)"
},
"transactionId": "L3",
"manualEntry": false,
"entityType": {
"id": 1,
"code": "productType.loan",
"value": "LOAN"
},
"entityId": 1,
"createdByUserId": 1,
"createdDate": [
2026,
10,
4
],
"createdByUserName": "mifos",
"reversed": false,
"submittedOnDate": [
2026,
10,
4
]
},
{
"id": 8,
"officeId": 1,
"officeName": "Head Office",
"glAccountName": "Test Liability",
"glAccountId": 2,
"glAccountCode": "L100",
"glAccountType": {
"id": 2,
"code": "accountType.liability",
"value": "LIABILITY"
},
"transactionDate": [
2026,
10,
1
],
"entryType": {
"id": 2,
"code": "journalEntrytType.debit",
"value": "DEBIT"
},
"amount": 10000.000000,
"currency": {
"code": "USD",
"name": "US Dollar",
"decimalPlaces": 2,
"displaySymbol": "$",
"nameCode": "currency.USD",
"displayLabel": "US Dollar ($)"
},
"transactionId": "L3",
"manualEntry": false,
"entityType": {
"id": 1,
"code": "productType.loan",
"value": "LOAN"
},
"entityId": 1,
"createdByUserId": 1,
"createdDate": [
2026,
10,
4
],
"createdByUserName": "mifos",
"reversed": false,
"submittedOnDate": [
2026,
10,
4
]
},
{
"id": 9,
"officeId": 1,
"officeName": "Head Office",
"glAccountName": "Test Liability",
"glAccountId": 2,
"glAccountCode": "L100",
"glAccountType": {
"id": 2,
"code": "accountType.liability",
"value": "LIABILITY"
},
"transactionDate": [
2026,
10,
1
],
"entryType": {
"id": 2,
"code": "journalEntrytType.debit",
"value": "DEBIT"
},
"amount": 10000.000000,
"currency": {
"code": "USD",
"name": "US Dollar",
"decimalPlaces": 2,
"displaySymbol": "$",
"nameCode": "currency.USD",
"displayLabel": "US Dollar ($)"
},
"transactionId": "S1",
"manualEntry": false,
"entityType": {
"id": 2,
"code": "productType.saving",
"value": "SAVING"
},
"entityId": 1,
"createdByUserId": 1,
"createdDate": [
2026,
10,
4
],
"createdByUserName": "mifos",
"reversed": false,
"submittedOnDate": [
2026,
10,
4
]
},
{
"id": 10,
"officeId": 1,
"officeName": "Head Office",
"glAccountName": "Test Liability",
"glAccountId": 2,
"glAccountCode": "L100",
"glAccountType": {
"id": 2,
"code": "accountType.liability",
"value": "LIABILITY"
},
"transactionDate": [
2026,
10,
1
],
"entryType": {
"id": 1,
"code": "journalEntryType.credit",
"value": "CREDIT"
},
"amount": 10000.000000,
"currency": {
"code": "USD",
"name": "US Dollar",
"decimalPlaces": 2,
"displaySymbol": "$",
"nameCode": "currency.USD",
"displayLabel": "US Dollar ($)"
},
"transactionId": "S1",
"manualEntry": false,
"entityType": {
"id": 2,
"code": "productType.saving",
"value": "SAVING"
},
"entityId": 1,
"createdByUserId": 1,
"createdDate": [
2026,
10,
4
],
"createdByUserName": "mifos",
"reversed": false,
"submittedOnDate": [
2026,
10,
4
]
},
{
"id": 11,
"officeId": 1,
"officeName": "Head Office",
"glAccountName": "Test Asset",
"glAccountId": 1,
"glAccountCode": "A100",
"glAccountType": {
"id": 1,
"code": "accountType.asset",
"value": "ASSET"
},
"transactionDate": [
2026,
10,
1
],
"entryType": {
"id": 2,
"code": "journalEntrytType.debit",
"value": "DEBIT"
},
"amount": 10000.000000,
"currency": {
"code": "USD",
"name": "US Dollar",
"decimalPlaces": 2,
"displaySymbol": "$",
"nameCode": "currency.USD",
"displayLabel": "US Dollar ($)"
},
"transactionId": "L5",
"manualEntry": false,
"entityType": {
"id": 1,
"code": "productType.loan",
"value": "LOAN"
},
"entityId": 1,
"createdByUserId": 1,
"createdDate": [
2026,
10,
4
],
"createdByUserName": "mifos",
"reversed": false,
"submittedOnDate": [
2026,
10,
4
]
},
{
"id": 12,
"officeId": 1,
"officeName": "Head Office",
"glAccountName": "Test Liability",
"glAccountId": 2,
"glAccountCode": "L100",
"glAccountType": {
"id": 2,
"code": "accountType.liability",
"value": "LIABILITY"
},
"transactionDate": [
2026,
10,
1
],
"entryType": {
"id": 1,
"code": "journalEntryType.credit",
"value": "CREDIT"
},
"amount": 10000.000000,
"currency": {
"code": "USD",
"name": "US Dollar",
"decimalPlaces": 2,
"displaySymbol": "$",
"nameCode": "currency.USD",
"displayLabel": "US Dollar ($)"
},
"transactionId": "L5",
"manualEntry": false,
"entityType": {
"id": 1,
"code": "productType.loan",
"value": "LOAN"
},
"entityId": 1,
"createdByUserId": 1,
"createdDate": [
2026,
10,
4
],
"createdByUserName": "mifos",
"reversed": false,
"submittedOnDate": [
2026,
10,
4
]
},
{
"id": 13,
"officeId": 1,
"officeName": "Head Office",
"glAccountName": "Test Liability",
"glAccountId": 2,
"glAccountCode": "L100",
"glAccountType": {
"id": 2,
"code": "accountType.liability",
"value": "LIABILITY"
},
"transactionDate": [
2026,
10,
1
],
"entryType": {
"id": 2,
"code": "journalEntrytType.debit",
"value": "DEBIT"
},
"amount": 10000.000000,
"currency": {
"code": "USD",
"name": "US Dollar",
"decimalPlaces": 2,
"displaySymbol": "$",
"nameCode": "currency.USD",
"displayLabel": "US Dollar ($)"
},
"transactionId": "S2",
"manualEntry": false,
"entityType": {
"id": 2,
"code": "productType.saving",
"value": "SAVING"
},
"entityId": 1,
"createdByUserId": 1,
"createdDate": [
2026,
10,
4
],
"createdByUserName": "mifos",
"reversed": false,
"submittedOnDate": [
2026,
10,
4
]
},
{
"id": 14,
"officeId": 1,
"officeName": "Head Office",
"glAccountName": "Test Liability",
"glAccountId": 2,
"glAccountCode": "L100",
"glAccountType": {
"id": 2,
"code": "accountType.liability",
"value": "LIABILITY"
},
"transactionDate": [
2026,
10,
1
],
"entryType": {
"id": 1,
"code": "journalEntryType.credit",
"value": "CREDIT"
},
"amount": 10000.000000,
"currency": {
"code": "USD",
"name": "US Dollar",
"decimalPlaces": 2,
"displaySymbol": "$",
"nameCode": "currency.USD",
"displayLabel": "US Dollar ($)"
},
"transactionId": "S2",
"manualEntry": false,
"entityType": {
"id": 2,
"code": "productType.saving",
"value": "SAVING"
},
"entityId": 1,
"createdByUserId": 1,
"createdDate": [
2026,
10,
4
],
"createdByUserName": "mifos",
"reversed": false,
"submittedOnDate": [
2026,
10,
4
]
}
]
}
Not covered:
- Accrual-based accounting (only cash-based tested)
- Multi-tranche loans, charges, other dates
- The savings reversal rows (S1, ids 9-10) use the same liability account
as the originals, so their direction can't be distinguished from the rows;
I checked row counts and transaction ids instead
If anyone has a configuration where it still happens, please share it and
I'll retest.
Thanks,
Shwetan Londhe
On Thu, Oct 1, 2026 at 8:43 AM shwetan londhe <[email protected]>
wrote:
> Hi Adam,
>
> Thanks for the response and for the guidance.
>
> Apologies for the delay- I was occupied with some work over the past few
> days. I’ll look into reproducing the issue on the current develop branch
> and trace the relevant code path.
>
> I’ll post an update once I have some findings, including whether the issue
> is still reproducible.
>
> Thanks again,
> Shwetan
>
> On Tue, Sep 29, 2026 at 4:52 PM Ádám Sághy <[email protected]> wrote:
>
>> Hi
>>
>> Thank you for your interest in this story.
>>
>> I am afraid we don’t have more information about the issue.
>>
>> Can you please give it a try to reproduce, but if it is not reproducible,
>> we might just close it.
>>
>> Regards,
>> Adam S
>>
>> On Sep 27, 2026, at 3:32 PM, shwetan londhe <[email protected]>
>> wrote:
>>
>> Hi everyone,
>>
>> I'm Shwetan, a new contributor to Apache Fineract and new to open-source
>> contribution. I recently started my professional career in Java backend
>> engineering at a fintech company, and I'm also interested in growing my
>> skills in DevOps. I've been getting familiar with the Fineract project and
>> its contribution process.
>>
>> I'm currently looking into FINERACT-790 - Double journal entry on
>> reversal then post of disburse to savings.
>>
>> Since the issue was originally reported quite some time ago, I'm not yet
>> sure whether the reported behavior is still reproducible on the current
>> develop branch. I plan to review the current context and related
>> changes, reproduce the scenario if possible, and trace the current code
>> path before proposing any fix.
>>
>> Please let me know if anyone is already working on this issue or if there
>> is any recent context I should be aware of.
>>
>> Looking forward to contributing and learning from the community.
>>
>> Thanks,
>> Shwetan
>>
>> GitHub: https://github.com/Shwetanlondhe24
>> ASF JIRA: shwetanlondhe24
>>
>>
>>