You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@fineract.apache.org by "Adam Saghy (Jira)" <ji...@apache.org> on 2026/10/11 21:29:00 UTC
[jira] [Assigned] (FINERACT-2914) Execute Standing Instruction job fails or skips months when the recurrence day is 29-31
[ https://issues.apache.org/jira/browse/FINERACT-2914?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Adam Saghy reassigned FINERACT-2914:
------------------------------------
Assignee: Abhishek Chaudhary
> Execute Standing Instruction job fails or skips months when the recurrence day is 29-31
> ---------------------------------------------------------------------------------------
>
> Key: FINERACT-2914
> URL: https://issues.apache.org/jira/browse/FINERACT-2914
> Project: Apache Fineract
> Issue Type: Bug
> Components: Job Scheduler, Savings
> Affects Versions: 1.15.0
> Reporter: Abhishek Chaudhary
> Assignee: Abhishek Chaudhary
> Priority: Major
> Fix For: 1.16.0
>
>
> {{ExecuteStandingInstructionsTasklet}} works out the first due date of a monthly or yearly standing instruction with {{validFrom.withDayOfMonth(recurrenceOnDay)}}. The API accepts any {{recurrenceOnMonthDay}} (it is only checked for not null), so this goes wrong in two ways.
> # *The job fails for all instructions.* If {{validFrom}} falls in a month shorter than the recurrence day, {{withDayOfMonth}} throws {{DateTimeException}} (for example {{Invalid date 'APRIL 31'}} for day 31 starting in April, or {{Invalid date 'FEBRUARY 30'}}). The exception is not caught, so the job fails and the remaining instructions are not processed. {{validFrom}} does not change, so the job fails on every run while the instruction is active.
> # *Shorter months are skipped silently.* The due check compares {{start.plusMonths(MONTHS.between(start, today))}} with today. {{MONTHS.between}} truncates, so a monthly instruction on the 31st never matches on Feb 28/29, Apr 30, Jun 30, Sep 30 or Nov 30. It runs only 7 times a year. A yearly instruction on 29 February runs only in leap years. No error is logged.
> *Expected:* when the month is shorter than the recurrence day, the instruction runs on the last day of that month, the way savings charges do ({{SavingsAccountCharge}} clamps {{feeOnDay}} to the month length). One instruction must not stop the job for the others.
--
This message was sent by Atlassian Jira
(v8.20.10#820010)