Bug Report and Analysis: Loan Repayment Schedule Shift in GnuCash
Genieliu
genie_liu at outlook.com
Thu Jan 23 03:01:56 EST 2025
Dear GnuCash Community,
I am a newcomer to GnuCash and have been exploring its features. While
using the loan repayment tool to generate scheduled transactions, I
encountered an issue with the loan review functionality, where the
repayment schedule appears to be misaligned. This problem has been
previously discussed on Reddit
(https://www.reddit.com/r/GnuCash/comments/umzb91/mortgage_amortization/)
and a bug report has been filed on Bugzilla
(https://bugs.gnucash.org/show_bug.cgi?id=797824).
After investigating the issue, I believe I have identified the root
cause. As I am unfamiliar with the contribution process for GNU
projects, I thought this would be the appropriate channel to share my
findings.
Steps to Reproduce the Issue:
1. Navigate to Actions -> Scheduled Transactions -> Mortgage & Loan
Repayments.
2. Loan Details: Amount 1000, Start Date is 02/01/2025, Length: 6 Months
Remaining: 6
3. Loan Repayment: Monthly Start Date is 02/01/2025, Every 1 Month on
the 1st, weekends: no change
4. Loan Review: when selecting the current year, we got the schedules
starting from 01/31/2025, 02/01/2025 ... 06/01/2025. While if we choose
whole loan, the 01/31/2025 is missing and the last repayment is still
06/01/2025
The expected repayment schedule should be 02/01/2025, 03/01/2025 ...
07/01/2025. It seems the first repayment is incorrectly set to one day
before the start date, causing the entire schedule to shift.
I think the issue originates in the loan_rev_recalc_schedule function
within the assistant-loan.cpp file,
https://github.com/Gnucash/gnucash/blob/f6c73b15fb6896b91bbbf1845cee41d7077ee5b3/gnucash/gnome/assistant-loan.cpp#L2062
In this function, curDate is initialized as the start date minus one
day, then we got the nextDate.
Subsequently, the for loop uses curDate as the first repayment date,
resulting in the first repayment being scheduled one day prior to the
intended start date. This misalignment propagates through the entire
repayment schedule, shifting the final repayment date as well.
curDate = start;
g_date_subtract_days( &curDate, 1 );
recurrenceListNextInstance(ldd->ld.repayment_schedule, &curDate, &nextDate);
I hope my analysis helps in confirming the root cause of this issue. I
would be more than happy to submit a pull request to address the
problem. Please let me know if additional details or further
clarification are required to proceed.
Jianshi Liu
Senior Engineer - Machine Learning
Email: genie_liu at outlook.com
-------------- next part --------------
A non-text attachment was scrubbed...
Name: OpenPGP_0xA1A4CA548458C2A8.asc
Type: application/pgp-keys
Size: 3143 bytes
Desc: OpenPGP public key
URL: <http://lists.gnucash.org/pipermail/gnucash-devel/attachments/20250123/998c8850/attachment.bin>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: OpenPGP_signature.asc
Type: application/pgp-signature
Size: 840 bytes
Desc: OpenPGP digital signature
URL: <http://lists.gnucash.org/pipermail/gnucash-devel/attachments/20250123/998c8850/attachment.sig>
More information about the gnucash-devel
mailing list