[Bug]: Wrong amount budgeted for category with multiple schedule goal templates #768

Closed
opened 2026-02-28 19:18:23 -06:00 by GiteaMirror · 16 comments
Owner

Originally created by @pyfisch on GitHub (Nov 27, 2023).

Verified issue does not already exist?

  • I have searched and found no existing issue

What happened?

I create 3 monthly schedules which total 327.11.
image

Then I add them as goal templates to the category "Bills":

#template schedule Rent
#template schedule Electricity
#template schedule Mobile

Finally I apply the budget template for December and expect that 327.11 is budgeted. However triple that (981.33) is budgeted.

image

It appears that if X schedule goal templates are added to a category the budgeted amount for each schedule is added X times to the category.

Sample database to reproduce the bug: schedules-goals.zip

cc @shall0pass you've done a lot of work in this area

What error did you receive?

No response

Where are you hosting Actual?

Docker

What browsers are you seeing the problem on?

Firefox

Operating System

None

Originally created by @pyfisch on GitHub (Nov 27, 2023). ### Verified issue does not already exist? - [X] I have searched and found no existing issue ### What happened? I create 3 monthly schedules which total 327.11. ![image](https://github.com/actualbudget/actual/assets/2781017/f815c2ff-8d76-42f5-ad5d-8903ffaeb3c9) Then I add them as goal templates to the category "Bills": ``` #template schedule Rent #template schedule Electricity #template schedule Mobile ``` Finally I apply the budget template for December and expect that 327.11 is budgeted. However triple that (981.33) is budgeted. ![image](https://github.com/actualbudget/actual/assets/2781017/b63ccac5-6dd9-4f9f-adf2-318eb63db20a) It appears that if X schedule goal templates are added to a category the budgeted amount for each schedule is added X times to the category. Sample database to reproduce the bug: [schedules-goals.zip](https://github.com/actualbudget/actual/files/13480319/schedules-goals.zip) cc @shall0pass you've done a lot of work in this area ### What error did you receive? _No response_ ### Where are you hosting Actual? Docker ### What browsers are you seeing the problem on? Firefox ### Operating System None
GiteaMirror added the buggoal templates labels 2026-02-28 19:18:24 -06:00
Author
Owner

@Kidglove57 commented on GitHub (Nov 27, 2023):

I can confirm this bug from my own budget:

  1. If I use multiple standard templates in one category then everything calculates correctly
    BUT
  2. If I use multiple templates in one category that reference Schedules I see the same error as the OP
@Kidglove57 commented on GitHub (Nov 27, 2023): I can confirm this bug from my own budget: 1) If I use multiple standard templates in one category then everything calculates correctly BUT 2) If I use multiple templates in one category that reference Schedules I see the same error as the OP
Author
Owner

@shall0pass commented on GitHub (Nov 27, 2023):

I'll call that a WHOOPS on my behalf. Please check the linked PR #1984 to verify it's fixed. Sorry about that.

@shall0pass commented on GitHub (Nov 27, 2023): I'll call that a WHOOPS on my behalf. Please check the linked PR #1984 to verify it's fixed. Sorry about that.
Author
Owner

@Kidglove57 commented on GitHub (Dec 1, 2023):

@shall0pass This fix was working for me at the end of November but the new month has thrown up a problem (for me at least). This has come to light because my categories are now full (less any transactions on the 1st).
So in the example given above:
#template schedule Rent (say 1000)
#template schedule Electricity (say 100)
#template schedule Mobile (say 50)

So total budget for Dec 1150 less paid 1000 = 150 still available in December.
This is what is happening in January:

  1. Say I have paid the Rent for December but nothing else
  2. I now try and fill the category for January using the above Goal Templates
  3. BUT only 1000 is going into the category for January ie topping it up to 1150 but not treating January as a discrete month with a fill of its own of 1150
@Kidglove57 commented on GitHub (Dec 1, 2023): @shall0pass This fix was working for me at the end of November but the new month has thrown up a problem (for me at least). This has come to light because my categories are now full (less any transactions on the 1st). So in the example given above: #template schedule Rent (say 1000) #template schedule Electricity (say 100) #template schedule Mobile (say 50) So total budget for Dec 1150 less paid 1000 = 150 still available in December. This is what is happening in January: 1) Say I have paid the Rent for December but nothing else 2) I now try and fill the category for January using the above Goal Templates 3) BUT only 1000 is going into the category for January ie topping it up to 1150 but not treating January as a discrete month with a fill of its own of 1150
Author
Owner

@shall0pass commented on GitHub (Dec 1, 2023):

Yeah. It's currently written in a way that if there are leftover funds in a category and the total balance is less than the total is needed for the month, it just tops it off. Anything over the minimum it'll be treated as a discrete month. This was done so that it's possible to add extra funds to the category in one month as savings for the next month. Schedules with multiple month frequencies for example are treated as sinking funds and if those are included in the same category as other monthly schedules everything becomes fuzzy if you want to add a little extra to meet your goal faster. The ability to have multi month or multi year schedules was the primary reason to include previous balances in the calculation. It would be much cleaner to just schedule the base payment regardless, but then there could be months where the goal isn't met unless manual intervention is taken (i.e. starting a 6 month schedule 2 months before the first payment is due). Of course, in that example, once you're past the first payment the monthly amount would be correct.

I have a POC using a method shared with me on Discord, maybe it's time to put it up as a WIP and you can try it and comment on it. It uses a method to calculate shortfalls based on annual needs rather than monthly needs. I still see some oddities, but the method is a little harder for me to sort out bugs.

No one has reported it yet, but there are quirks if you have two schedules that are on different cadences with vastly different amounts with the current method too.

@shall0pass commented on GitHub (Dec 1, 2023): Yeah. It's currently written in a way that if there are leftover funds in a category and the total balance is less than the total is needed for the month, it just tops it off. Anything over the minimum it'll be treated as a discrete month. This was done so that it's possible to add extra funds to the category in one month as savings for the next month. Schedules with multiple month frequencies for example are treated as sinking funds and if those are included in the same category as other monthly schedules everything becomes fuzzy if you want to add a little extra to meet your goal faster. The ability to have multi month or multi year schedules was the primary reason to include previous balances in the calculation. It would be much cleaner to just schedule the base payment regardless, but then there could be months where the goal isn't met unless manual intervention is taken (i.e. starting a 6 month schedule 2 months before the first payment is due). Of course, in that example, once you're past the first payment the monthly amount would be correct. I have a POC using a method shared with me on Discord, maybe it's time to put it up as a WIP and you can try it and comment on it. It uses a method to calculate shortfalls based on annual needs rather than monthly needs. I still see some oddities, but the method is a little harder for me to sort out bugs. No one has reported it yet, but there are quirks if you have two schedules that are on different cadences with vastly different amounts with the current method too.
Author
Owner

@shall0pass commented on GitHub (Dec 1, 2023):

@Kidglove57 Here is the WIP method I mentioned above.

https://github.com/actualbudget/actual/pull/2001

@shall0pass commented on GitHub (Dec 1, 2023): @Kidglove57 Here is the WIP method I mentioned above. https://github.com/actualbudget/actual/pull/2001
Author
Owner

@Kidglove57 commented on GitHub (Dec 1, 2023):

Thanks for explaining @shall0pass. I think what’s bothering me is that this is then out of line with how a single line template behaves. Say; “#template 100” which will fund 100 regardless of any brought forward amount.

I am using the multiple schedule template in a monthly subs category and in a household bills category. Where the scheduled payments are the same each month. The solution is of course for me to hold off funding the next month until the turn of the month. Not a big deal but I just found it confusing compared to my single line template. The multi line schedule template now seemed to behave more like an “up to” template.

I’ll certainly take a look at the other link you mentioned. Thanks for your hard work on this!

@Kidglove57 commented on GitHub (Dec 1, 2023): Thanks for explaining @shall0pass. I think what’s bothering me is that this is then out of line with how a single line template behaves. Say; “#template 100” which will fund 100 regardless of any brought forward amount. I am using the multiple schedule template in a monthly subs category and in a household bills category. Where the scheduled payments are the same each month. The solution is of course for me to hold off funding the next month until the turn of the month. Not a big deal but I just found it confusing compared to my single line template. The multi line schedule template now seemed to behave more like an “up to” template. I’ll certainly take a look at the other link you mentioned. Thanks for your hard work on this!
Author
Owner

@youngcw commented on GitHub (Dec 1, 2023):

@Kidglove57 the Schedule template is best compared to the "by repeat" template.

@shall0pass Here is a crazy idea. What if the schedule template processing converted the schedule into a "by" template and then ran that instead of having custom processing? Do "by" templates handle what Paul is seeing better?

@youngcw commented on GitHub (Dec 1, 2023): @Kidglove57 the Schedule template is best compared to the "by repeat" template. @shall0pass Here is a crazy idea. What if the schedule template processing converted the schedule into a "by" template and then ran that instead of having custom processing? Do "by" templates handle what Paul is seeing better?
Author
Owner

@Kidglove57 commented on GitHub (Dec 1, 2023):

the Schedule template is best compared to the "by repeat" template.

Yes, I can see that now. It was just that I was only using the multiple line schedule template for fixed monthly bills where the “by repeat” is not relevant. Previously I had just kept a manual calculation and funded to that. Or am I mistaken?

I had not got around yet to trying it for multiple line annual schedules. That sounds like an experiment worth trying - for annual software subs for example. I can quite see that the two are very different use cases.

@Kidglove57 commented on GitHub (Dec 1, 2023): > the Schedule template is best compared to the "by repeat" template. Yes, I can see that now. It was just that I was only using the multiple line schedule template for fixed monthly bills where the “by repeat” is not relevant. Previously I had just kept a manual calculation and funded to that. Or am I mistaken? I had not got around yet to trying it for multiple line annual schedules. That sounds like an experiment worth trying - for annual software subs for example. I can quite see that the two are very different use cases.
Author
Owner

@shall0pass commented on GitHub (Dec 1, 2023):

@youngcw Converting the schedules to 'by repeat' could also be difficult. Some schedules can have multiple days per month per schedule.

@Kidglove57 Maybe an option is to use the 'full' keyword for monthly schedules. 'full' forces the whole schedule to be budgeting in the month of the schedule, so for monthly schedules it might be a more desired output. If that works better, it could be applied on all monthly schedules that don't need a '$/number of months' calculation.

@shall0pass commented on GitHub (Dec 1, 2023): @youngcw Converting the schedules to 'by repeat' could also be difficult. Some schedules can have multiple days per month per schedule. @Kidglove57 Maybe an option is to use the 'full' keyword for monthly schedules. 'full' forces the whole schedule to be budgeting in the month of the schedule, so for monthly schedules it might be a more desired output. If that works better, it could be applied on all monthly schedules that don't need a '$/number of months' calculation.
Author
Owner

@Kidglove57 commented on GitHub (Dec 1, 2023):

@shall0pass thanks for the tip, I’m out this evening but I will certainly try that tomorrow. So that would be multiple lines for my monthly bills in the format:
#template schedule full {SCHEDULE NAME} ?

@Kidglove57 commented on GitHub (Dec 1, 2023): @shall0pass thanks for the tip, I’m out this evening but I will certainly try that tomorrow. So that would be multiple lines for my monthly bills in the format: #template schedule full {SCHEDULE NAME} ?
Author
Owner

@Kidglove57 commented on GitHub (Dec 1, 2023):

@shall0pass
#template schedule full {SCHEDULE NAME} ?

I found a few moments before I went out.
#template schedule full {SCHEDULE NAME}
Works perfectly for my multiple line monthly scheduled bills!

Thank you so much

@Kidglove57 commented on GitHub (Dec 1, 2023): @shall0pass #template schedule full {SCHEDULE NAME} ? I found a few moments before I went out. #template schedule full {SCHEDULE NAME} Works perfectly for my multiple line monthly scheduled bills! Thank you so much
Author
Owner

@shall0pass commented on GitHub (Dec 1, 2023):

What are your thoughts on making that the default behavior for schedules with an 'every 1 month' cadence?

@shall0pass commented on GitHub (Dec 1, 2023): What are your thoughts on making that the default behavior for schedules with an 'every 1 month' cadence?
Author
Owner

@youngcw commented on GitHub (Dec 1, 2023):

What are your thoughts on making that the default behavior for schedules with an 'every 1 month' cadence?

For exactly 1 month cadence that probably would make sense. Its not that different, but probably would match what people expect more often than not.

@youngcw commented on GitHub (Dec 1, 2023): > What are your thoughts on making that the default behavior for schedules with an 'every 1 month' cadence? For exactly 1 month cadence that probably would make sense. Its not that different, but probably would match what people expect more often than not.
Author
Owner

@Kidglove57 commented on GitHub (Dec 1, 2023):

What are your thoughts on making that the default behavior for schedules with an 'every 1 month' cadence?

I’m also fine with this so long as we can document it fully for the casual user. Thank you!

@Kidglove57 commented on GitHub (Dec 1, 2023): > What are your thoughts on making that the default behavior for schedules with an 'every 1 month' cadence? I’m also fine with this so long as we can document it fully for the casual user. Thank you!
Author
Owner

@shall0pass commented on GitHub (Dec 1, 2023):

I'll put something together so it can be tested. Unless someone beats me to it :)

@shall0pass commented on GitHub (Dec 1, 2023): I'll put something together so it can be tested. Unless someone beats me to it :)
Author
Owner

@Kidglove57 commented on GitHub (Dec 2, 2023):

@Kidglove57 Here is the WIP method I mentioned above.

#2001

I gave this a try with my live budget. It worked on one category but gave some odd results on two others (over provisions). Whereas using the "full" prefix worked in all the situations that I have tried.

@Kidglove57 commented on GitHub (Dec 2, 2023): > @Kidglove57 Here is the WIP method I mentioned above. > > #2001 I gave this a try with my live budget. It worked on one category but gave some odd results on two others (over provisions). Whereas using the "full" prefix worked in all the situations that I have tried.
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: github-starred/actual#768