Abhinav Kumar Jha created FINERACT-2957:
-------------------------------------------
Summary: Post Interest For Savings job posts interest again for
days already covered by a manual interest posting
Key: FINERACT-2957
URL: https://issues.apache.org/jira/browse/FINERACT-2957
Project: Apache Fineract
Issue Type: Bug
Components: Savings
Affects Versions: 1.15.0
Environment: Apache Fineract develop, PostgreSQL 18
Reporter: Abhinav Kumar Jha
Assignee: Abhinav Kumar Jha
h3. Summary
When a savings account has a manual interest posting ("post interest as on"),
the *Post Interest For Savings* job ignores it and posts interest for the whole
posting period. The days before the manual posting are credited twice.
- Happens with {{savings-interest-posting-current-period-end}} *disabled (the
default)* and *enabled*
- Present since release *1.6.0* (February 2022), and still on the current
develop branch
- Separate from FINERACT-752 (fixed in #6665), which fixed a similar duplicate
in the savings account recalculation path. The job uses a different code path.
h3. Steps to reproduce
_Fresh tenant database on PostgreSQL 18, business date enabled_
# Savings product: 11% nominal, monthly compounding, monthly posting, daily
balance, 365 days
# Business date *01 March 2019*: activate an account and deposit *20013*
# Business date *25 March 2019*: post interest as on 25 March 2019
# Business date *01 April 2019*: run the *Post Interest For Savings* job
h3. Actual vs expected
||Configuration||Manual posting||Job posting (actual)||Job posting
(expected)||Overpaid||
|disabled|25 Mar 2019: 144.75|01 Apr 2019: *186.97*|42.22|*144.75*|
|enabled|24 Mar 2019: 144.75|31 Mar 2019: *186.97*|42.22|*144.75*|
- *186.97* is the interest for all of March: 20013 x 11% x 31 / 365
- *42.22* is the interest for 25 to 31 March only: 20013 x 11% x 7 / 365. This
is also what a savings transaction posts for the same account state.
h3. Cause
The job loads accounts through {{SavingAccountMapperForInterestPosting}} in
{{SavingsAccountReadPlatformServiceImpl}}:
# The query selects {{tr.is_manual as manualTransaction}}, but the mapper never
reads that column.
# It passes a hard-coded {{postInterestAsOn = false}} to
{{SavingsAccountTransactionData.create(...)}}, and {{createData(...)}} always
sets {{isManualTransaction}} to false.
# So {{SavingsAccountInterestPostingServiceImpl.getManualPostingDates}} always
returns an empty list, and the job never splits the period at the manual
posting date.
{code:java}
// SavingsAccountReadPlatformServiceImpl, SavingAccountMapperForInterestPosting
final boolean postInterestAsOn = false;
{code}
This line was introduced by FINERACT-1495 (interest posting performance
improvement, PR #2027, February 2022).
h3. Proposed fix
- Read the {{manualTransaction}} column in the mapper and carry it into
{{SavingsAccountTransactionData}}, so the job splits the posting period the
same way the savings account does.
- With the flag loaded, apply the same period end date handling as FINERACT-752
when {{savings-interest-posting-current-period-end}} is enabled.
- Add an integration test that runs the job after a manual posting with both
configuration values.
h3. Related work
- PR #6614 (FINERACT-2908) also changes
{{SavingAccountMapperForInterestPosting}}
- PR #6532 (FINERACT-2869) changes {{SavingsAccountInterestPostingServiceImpl}}
I will coordinate with both.
--
This message was sent by Atlassian Jira
(v8.20.10#820010)