From 5d4c6a1b27a71773f083f254a2d642d504cc268b Mon Sep 17 00:00:00 2001 From: youngcw Date: Wed, 8 Jan 2025 11:09:19 -0700 Subject: [PATCH 01/12] start --- docs/experimental/goal-templates.md | 126 +++++++++++++++++++++++----- 1 file changed, 105 insertions(+), 21 deletions(-) diff --git a/docs/experimental/goal-templates.md b/docs/experimental/goal-templates.md index a21e0d3f8..130ed05e5 100644 --- a/docs/experimental/goal-templates.md +++ b/docs/experimental/goal-templates.md @@ -1,4 +1,4 @@ -# Budget Goal Templates +# Budget Templates :::warning This is an **experimental feature**. That means we’re still working on finishing it. There may be bugs, missing functionality or incomplete documentation, and we may decide to remove the feature in a future release. If you have any feedback, please [open an issue](https://github.com/actualbudget/actual/issues) or post a message in the Discord. @@ -7,17 +7,112 @@ This is an **experimental feature**. That means we’re still working on finishi All functionality described here may not be available in the latest stable release. Use the `edge` images for the latest implementation. ::: +Budget templates allow you to automate your budgeting step every month. +For example, a template like `#template 100` in a Food category will automatically budget $ 100 in your Food category when templates are run. +With budget templates there is no need to manually fill in each category each month. +With one click you can fill in your entire budget based on the templates you have added. Create a template by adding a note to a category and adding a line that begins with `#template` or `#goal`. ![](/img/goal-template/goal-template-1.png) -You are welcome to have other lines in your note, but the `#template`/`#goal` line must match the syntax. +You are welcome to have other lines in your note, but the `#template`/`#goal` line must match the template syntax. + +### Apply the Templates + +There are a few ways to apply your templates. + +#### Apply all templates + +In the budget month menu you will see the following options: + +![](/img/goal-template/goal-template-2.png) + +**Check templates** will test all `#template\#goal` lines for proper syntax. + +**Apply budget template** will run all templates in categories that currently have 0 budgeted. +This will leave any existing budget amounts intact. + +**Overwrite with budget template** will fill in all budget cells using the templates and ignore any already existing budget amounts. +This is the recommended method if you are using template priorities. + +#### Apply only specific templates + +You can also apply selections of templates if you want. + +**Single Category**: Use the option shown below from the budget field drop down to apply templates to just that category. +This will overwrite any existing budgeted amount. + +# ADD Picture here + +**Apply templates to a single category group**: Use the option shown below from the category group drop down to apply all templates to categories in a specific group. +This will overwrite any existing budgets in the categories in the group. + +# ADD Picture here + +### Goal Indicators +After having run the templates in a given month and category, the status of a respective category goal will be indicated as a text color of the category balance. +The image below shows an example of categories in the following states: normal (no goal set), empty (no goal set), goal met(green), goal not met(orange), and a negative balance(red). + +![](/img/goal-template/templates-colors.png) + +#### Goal Indicator Information +If you hover over the balance value in a templated category, a tooltip will appear with info on the status us that category with respect to its template. + +# ADD Picture here ## Available Templates -:::note -Currency symbols are not required for setting templates. If you do want to use a currency symbol, the only one supported is `$`. Any other symbol added to the `#template` line will cause it to be treated as standard text, and fail to apply the template to your budget. Other requirements and limitations can be seen below this list, in the [Notes](#notes) section. -::: +There are many types of templates you can use to tailor how categories get filled to match your personal budgeting needs. + +### Simple Type +The simple template type is the most basic type of template. +The base template will budget the amount you ask it to. +Simple! +This template also has a few variations making it likely the most used template out of the available options. + +Below is an example of how it works. +The template budgets just what you ask, no matter how much the respective category has in its balance. + + +|Syntax|Budgeted Amount| +|---|:---:| +|#template 50| $ 50 | + +There is also a useful variation of a simple template. +This varation will put a **limit** on how much the balance of a category can be that month. +Here are some examples of how this is used + + +|Syntax| Previous Balance | Budgeted Amount | New Balance | +|---|:---:| :---: |:---:| +|#template 50 up to 100| $ 80 | $ 20 | $ 100 | +|#template 50 up to 100| $ 20 | $ 50 | $ 70 | +Isn't that neat! +This is especially useful for budget categories that have month to month variation in spending such as groceries. +You can budget the same amount per month, but save up from one month to the next without having to worry about building up more funds than you need. + +The last variation of the simple template is sometimes referred to as a "refill". +With this style the template budgets whatever it takes to hit a "full" amount. +Here is how it works: + + +|Syntax| Previous Balance | Budgeted Amount | New Balance | +|---|:---:| :---: |:---:| +|#template up to 150| $ 10 | $ 140 | $ 150 | +|#template up to 150| $ -20 | $ 170 | $ 150 | +Cool, right! This is another way to gracefully handle categories that have month to month variation. +This will always give you the same amount available each month no matter what you spend the previous month and not ever build up more funds than you need. +This variation along with the previous variation, are probably the most used templates. +They are simple enough to use easily, but are robust enough to make budgeting much simpler. + + +## All Variations +There is more flexibility with the limit part of the template. +By default, the limit (the "up to" part of the template) is based per month. +You can modify the limit to be per week or per day if that matches your needs better. +You can also modify the limit to not ever remove funds over your limit. +This can be useful if you get refunds or reimbursements that you would like to have remain inside a category even if over your limit. +Below is examples of these different variations of simple templates. |Syntax|Description|Example Application| @@ -28,6 +123,11 @@ Currency symbols are not required for setting templates. If you do want to use |#template up to 150 hold|Budget up to 150 each month, but retain any funds over 150 |Variable expenses that may get refunds or reimbursements| |#template up to 5 per day |Budget up to 5 per day that month, and remove extra funds | Setting a daily coffee budget| |#template up to 100 per week starting 2024-10-07 |Budget 100 per week starting on Mondays, and remove extra funds| Setting a weekly grocery budget | + +# Old Table + +|Syntax|Description|Example Application| +|---|---|---| |#template 500 by 2025-03|Break down large, less-frequent expenses into manageable monthly expenses|Saving for a replacement car in a few years |#template 500 by 2025-03 repeat every 6 months|Break down large, less-frequent expenses into manageable monthly expenses|Biannual credit card fees |#template 500 by 2025-03 repeat every year|Break down large, less-frequent expenses into manageable monthly expenses|Annual insurance premium @@ -206,19 +306,3 @@ If you have some extra funds after templates are run and can budget that last 50 | `#template 50` `#goal 500` | 100 | 500(green) | -## Apply the Templates - -To apply the goal templates you create, enable the feature in the Settings experimental section. When the feature is on, three new options will appear in the monthly budget actions list. - -![](/img/goal-template/goal-template-2.png) - -**Check templates** will test all `#template` lines for proper syntax. - -**Apply budget template** will only fill empty cells using the templates. - -**Overwrite with budget template** will fill in all budget cells using the templates. - -### Goal Indicators -After having run the templates in a given month the status of a respective category goal will be indicated as a text color of the category balance. The image below shows an example of categories in the following states: normal (no goal set), zero (no goal set), goal met, goal not met, and a negative balance. - -![](/img/goal-template/templates-colors.png) From f4d5e7b87b40926b86967ad228205d6d2cd5a265 Mon Sep 17 00:00:00 2001 From: youngcw Date: Wed, 8 Jan 2025 11:33:59 -0700 Subject: [PATCH 02/12] add by --- docs/experimental/goal-templates.md | 56 +++++++++++++++++++++++++---- 1 file changed, 50 insertions(+), 6 deletions(-) diff --git a/docs/experimental/goal-templates.md b/docs/experimental/goal-templates.md index 130ed05e5..e2d817577 100644 --- a/docs/experimental/goal-templates.md +++ b/docs/experimental/goal-templates.md @@ -17,11 +17,11 @@ Create a template by adding a note to a category and adding a line that begins w You are welcome to have other lines in your note, but the `#template`/`#goal` line must match the template syntax. -### Apply the Templates +## Apply the Templates There are a few ways to apply your templates. -#### Apply all templates +### Apply all templates In the budget month menu you will see the following options: @@ -35,7 +35,7 @@ This will leave any existing budget amounts intact. **Overwrite with budget template** will fill in all budget cells using the templates and ignore any already existing budget amounts. This is the recommended method if you are using template priorities. -#### Apply only specific templates +### Apply only specific templates You can also apply selections of templates if you want. @@ -106,7 +106,7 @@ This variation along with the previous variation, are probably the most used tem They are simple enough to use easily, but are robust enough to make budgeting much simpler. -## All Variations +#### All Variations There is more flexibility with the limit part of the template. By default, the limit (the "up to" part of the template) is based per month. You can modify the limit to be per week or per day if that matches your needs better. @@ -124,14 +124,58 @@ Below is examples of these different variations of simple templates. |#template up to 5 per day |Budget up to 5 per day that month, and remove extra funds | Setting a daily coffee budget| |#template up to 100 per week starting 2024-10-07 |Budget 100 per week starting on Mondays, and remove extra funds| Setting a weekly grocery budget | -# Old Table +### By Type + +The **By** type of template is for saving up funds _by_ a certain month. +For example, it is January and you are trying to save for a new car by the end of the year. +If the new car will cost $ 10,000 and you plan to buy it in December, you will use something like the following: + + +|Syntax| Budgeted Amount | +|---|:---:| +|#template 10000 by 2025-12 | $ 833.33 | +Thats example is pretty basic. +The by template is smarter than just 10000/12. +Lets say the example is the same, but you already have $ 1,500 saved. +In that case you get this. + + +|Syntax| Previous Balance | Budgeted Amount | New Balance | +|---|:---:| :---: |:---:| +|#template 10000 by 2025-12 |$ 1,500 | $ 708.33 | $ 2,208.33 | + +Nice! +This even works if you add more funds later. +The template will always divide up the remaining amount you need by the remaining number of months. +If you need to pull funds away from your car savings to cover an emergency house repair, the template will budget more in the coming months to say on track. +If you have extra funds one month and add that to your car savings, the template will budget less in the coming months since you need less. + +#### Repeated savings +The By template can also repeat if your savings is cyclical, such as yearly taxes or insurance. +The repeat period can be both a number of months or number of years. +If you need to repeat based on a number of weeks, use the Week template. +In that case use the following variation: + +|Syntax| Budgeted Amount | Note | +|---|:---:| --- | +|#template 500 by 2025-03 repeat every year | $ 166.66 | Assuming starting in January 2025 | +|#template 500 by 2025-03 repeat every year | $ 41.66 | All months after March 2025 | + +#### Available variations +Below is a table of the varations + |Syntax|Description|Example Application| |---|---|---| -|#template 500 by 2025-03|Break down large, less-frequent expenses into manageable monthly expenses|Saving for a replacement car in a few years +|#template 500 by 2027-03|Break down large, less-frequent expenses into manageable monthly expenses|Saving for a replacement car in a few years |#template 500 by 2025-03 repeat every 6 months|Break down large, less-frequent expenses into manageable monthly expenses|Biannual credit card fees |#template 500 by 2025-03 repeat every year|Break down large, less-frequent expenses into manageable monthly expenses|Annual insurance premium |#template 500 by 2025-03 repeat every 2 years|Break down large, less-frequent expenses into manageable monthly expenses|Domain name renewal| + +## Old Table + +|Syntax|Description|Example Application| +|---|---|---| |#template 500 by 2024-12 spend from 2024-03|Budget 500 by December. Any spending between March and December is OK.|Christmas presents, overseas holiday, or any other expenses that I will be partially paying for before the target period ends.| |#template 500 by 2024-12 spend from 2024-03 repeat every year| | |#template 500 by 2024-12 spend from 2024-03 repeat every 2 years| | From f90887de0ff5dd7bb1879ed820e4247f7a89c5a9 Mon Sep 17 00:00:00 2001 From: youngcw Date: Wed, 8 Jan 2025 11:44:51 -0700 Subject: [PATCH 03/12] add by spend --- docs/experimental/goal-templates.md | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/docs/experimental/goal-templates.md b/docs/experimental/goal-templates.md index e2d817577..79524a803 100644 --- a/docs/experimental/goal-templates.md +++ b/docs/experimental/goal-templates.md @@ -161,8 +161,19 @@ In that case use the following variation: |#template 500 by 2025-03 repeat every year | $ 166.66 | Assuming starting in January 2025 | |#template 500 by 2025-03 repeat every year | $ 41.66 | All months after March 2025 | +#### By Spend +The By template can be extended to allow some of the funds to be spent along the way. +This is most commonly used for holiday savings where you will spend some of the money in the months leading up to the holiday. +An example of this is buying Christmas gifts in November and December. +The table below shows how this works. + +|Syntax| Budgeted Amount | Spent so far| New Balance| Note | +|---|:---:| :---: | --- | --- | +|#template 500 by 2025-12 spend from 2025-11| $ 41.66 | 0 | previous + $ 41.66| Assuming starting in January 2025, all months before December | +|#template 500 by 2025-12 spend from 2025-11| $ 41.66 | $ 100 | $ 400 | Assuming the beginning of December, but have not spent anything in December yet | + #### Available variations -Below is a table of the varations +Below is a table of the varations of the By template. |Syntax|Description|Example Application| @@ -171,14 +182,14 @@ Below is a table of the varations |#template 500 by 2025-03 repeat every 6 months|Break down large, less-frequent expenses into manageable monthly expenses|Biannual credit card fees |#template 500 by 2025-03 repeat every year|Break down large, less-frequent expenses into manageable monthly expenses|Annual insurance premium |#template 500 by 2025-03 repeat every 2 years|Break down large, less-frequent expenses into manageable monthly expenses|Domain name renewal| +|#template 500 by 2024-12 spend from 2024-03|Budget 500 by December. Any spending between March and December is OK.|Christmas presents, overseas holiday, or any other expenses that I will be partially paying for before the target period ends.| +|#template 500 by 2024-12 spend from 2024-03 repeat every year| | +|#template 500 by 2024-12 spend from 2024-03 repeat every 2 years| | ## Old Table |Syntax|Description|Example Application| |---|---|---| -|#template 500 by 2024-12 spend from 2024-03|Budget 500 by December. Any spending between March and December is OK.|Christmas presents, overseas holiday, or any other expenses that I will be partially paying for before the target period ends.| -|#template 500 by 2024-12 spend from 2024-03 repeat every year| | -|#template 500 by 2024-12 spend from 2024-03 repeat every 2 years| | |#template 10 repeat every week starting 2025-01-03|Budget 10 a week| |#template 10 repeat every week starting 2025-01-03 up to 80|Budget 10 a week, up to a maximum of 80| |#template 10 repeat every 2 weeks starting 2025-01-04|Budget 10 fortnightly| From 26f8361c13db76cdf30f3beae026c708c9989241 Mon Sep 17 00:00:00 2001 From: youngcw Date: Wed, 8 Jan 2025 12:01:04 -0700 Subject: [PATCH 04/12] add week --- docs/experimental/goal-templates.md | 37 ++++++++++++++++++++++++++--- 1 file changed, 34 insertions(+), 3 deletions(-) diff --git a/docs/experimental/goal-templates.md b/docs/experimental/goal-templates.md index 79524a803..d0ef0d47f 100644 --- a/docs/experimental/goal-templates.md +++ b/docs/experimental/goal-templates.md @@ -150,6 +150,8 @@ The template will always divide up the remaining amount you need by the remainin If you need to pull funds away from your car savings to cover an emergency house repair, the template will budget more in the coming months to say on track. If you have extra funds one month and add that to your car savings, the template will budget less in the coming months since you need less. +**Note**: The date must be in YYYY-MM format. + #### Repeated savings The By template can also repeat if your savings is cyclical, such as yearly taxes or insurance. The repeat period can be both a number of months or number of years. @@ -172,7 +174,7 @@ The table below shows how this works. |#template 500 by 2025-12 spend from 2025-11| $ 41.66 | 0 | previous + $ 41.66| Assuming starting in January 2025, all months before December | |#template 500 by 2025-12 spend from 2025-11| $ 41.66 | $ 100 | $ 400 | Assuming the beginning of December, but have not spent anything in December yet | -#### Available variations +#### Available Variations Below is a table of the varations of the By template. @@ -186,14 +188,43 @@ Below is a table of the varations of the By template. |#template 500 by 2024-12 spend from 2024-03 repeat every year| | |#template 500 by 2024-12 spend from 2024-03 repeat every 2 years| | -## Old Table +### Week Type +If you have bills that cycle weekly, or like to base your budget on weeks, this is the template for you! +This template is like the simple template but it uses weeks instead of months. +You set the start day, and every 7 days starting from that day, you will get the requested amount budgetd. +See the table below for examples. + + +|Syntax| Budgeted Amount | Note | +|---|:---:| :---: | +|#template 10 repeat every week starting 2025-01-06 | $ 40 | When budgeting in January 2025 | +|#template 10 repeat every week starting 2025-01-06 | $ 50 | When budgeting in March 2025 | + +As you can see, the template will budget based on the number of weeks that start on the desired day, starting on your start date. + +The Week tempalte also supports limits the same way the simple template does. +For example if you budget in January with limited template: + +|Syntax| Previous Balance | Budgeted Amount | New Balance | +|---|:---:| :---: |:---:| +|#template 10 repeat every week starting 2025-01-06 up to 55 | $ 20 | $ 35 | $ 55 | + +**Note**: The date must be in YYYY-MM-DD format. + +#### Available Variations +Below is a table of the varations of the Week template. |Syntax|Description|Example Application| |---|---|---| |#template 10 repeat every week starting 2025-01-03|Budget 10 a week| |#template 10 repeat every week starting 2025-01-03 up to 80|Budget 10 a week, up to a maximum of 80| |#template 10 repeat every 2 weeks starting 2025-01-04|Budget 10 fortnightly| -|#template 10 repeat every 9 weeks starting 2025-01-04 up to 30|Budget 10 every 9 weeks, up to a maximum of 30| +|#template 10 repeat every week starting 2025-01-04 up to 20 per week starting 2025-01-04 |Budget 10 every week, up to a maximum of 20 for each week| + +## Old Table + +|Syntax|Description|Example Application| +|---|---|---| |#template 15% of all income|Budget 15% of all income categories| Using a "pay yourself first" strategy| |#template 10% of Paycheck|Budget 10% of the "Paycheck" income category| Using a "pay yourself first" strategy, but have income categories you want to ignore| |#template 15% of previous all income|Budget 15% of all income categories using last month's income|Using a "pay yourself first" strategy in conjunction with a "month ahead" strategy | From 905978867ac0487985c65493bc67dfeeb6b97646 Mon Sep 17 00:00:00 2001 From: youngcw Date: Wed, 8 Jan 2025 13:05:06 -0700 Subject: [PATCH 05/12] last templates and rearrange --- docs/experimental/goal-templates.md | 268 +++++++++++++++++++--------- 1 file changed, 179 insertions(+), 89 deletions(-) diff --git a/docs/experimental/goal-templates.md b/docs/experimental/goal-templates.md index d0ef0d47f..7c6115c0a 100644 --- a/docs/experimental/goal-templates.md +++ b/docs/experimental/goal-templates.md @@ -11,40 +11,52 @@ Budget templates allow you to automate your budgeting step every month. For example, a template like `#template 100` in a Food category will automatically budget $ 100 in your Food category when templates are run. With budget templates there is no need to manually fill in each category each month. With one click you can fill in your entire budget based on the templates you have added. -Create a template by adding a note to a category and adding a line that begins with `#template` or `#goal`. -![](/img/goal-template/goal-template-1.png) +Here are a few examples of what you can do with templates, all with a single click! +* Budget $ 100 every month +* Budget $ 50 every other week +* Refill a category to $ 300 at the start of a month +* Add all leftover funds to a savings category +* Budget 10% of your income for savings or a tithe +* Budget the average you spend over the last 6 months +* Save up for a big purchase many months in the future, and dynamically figure out the budget needs +* And much more! + +## Using Templates -You are welcome to have other lines in your note, but the `#template`/`#goal` line must match the template syntax. +### How to add a template +Create a template by adding a note to a category and adding a line that contains `#template` or `#goal` with the appropriate syntax. +The example below shows the most basic template syntax `#template 72.99`. +This will budget $ 72.99 when templates are run without having to manually type in the amount. -## Apply the Templates +![](/img/goal-template/goal-template-1.png) -There are a few ways to apply your templates. +### How to apply the templates -### Apply all templates +#### Apply all templates In the budget month menu you will see the following options: ![](/img/goal-template/goal-template-2.png) -**Check templates** will test all `#template\#goal` lines for proper syntax. +* **Check templates** will test all `#template and #goal` lines for proper syntax. -**Apply budget template** will run all templates in categories that currently have 0 budgeted. +* **Apply budget template** will run all templates in categories that currently have 0 budgeted. This will leave any existing budget amounts intact. -**Overwrite with budget template** will fill in all budget cells using the templates and ignore any already existing budget amounts. +* **Overwrite with budget template** will fill in all budget cells using the templates and ignore any already existing budget amounts. This is the recommended method if you are using template priorities. -### Apply only specific templates +#### Apply only specific templates You can also apply selections of templates if you want. -**Single Category**: Use the option shown below from the budget field drop down to apply templates to just that category. +* **Single Category**: Use the option shown below from the budget field drop down to apply templates to just that category. This will overwrite any existing budgeted amount. # ADD Picture here -**Apply templates to a single category group**: Use the option shown below from the category group drop down to apply all templates to categories in a specific group. +* **Apply templates to a single category group**: Use the option shown below from the category group drop down to apply all templates to categories in a specific group. This will overwrite any existing budgets in the categories in the group. # ADD Picture here @@ -60,6 +72,60 @@ If you hover over the balance value in a templated category, a tooltip will appe # ADD Picture here +### Multiple Template Lines + +You can add multiple `#template` lines for a single category note. Each line will be added together. + +For example: + +**Streaming Services: 42.97** + + Netflix + #template 24.99 + Disney Plus + #template 9.99 + Amazon Prime + #template 7.99 + +**100 every month and an additional 10 every fortnight** + + #template 10 repeat every 2 weeks starting 2025-01-04 + #template 100 + +### Template Priorities + +Templates can be given a priority flag to change the order that the templates get applied to your budget. Set a priority by adding `-X` to the `#template` flag. EX `#template-4` will be priority level 4. Any template with a priority other than 0 will not apply more funds than are available. + +#### Notes + +- Lower priority values get run first. EX 0 is run first, then 1, then 2, etc. +- A `#template` with no priority flag defaults to priority 0 and is the same as a standard template. +- Negative priorities are not allowed and will result in the template being skipped. +- Template application order is based on the database order, not the view order. To guarantee a specific fill order use separate priorities for each category. +- If you have multiple `schedule` or `by` template lines in a single category, they will be forced to match the same priority level as the line run first. +- It is recommended to use the "overwrite with budget template" option when applying templates if you use priorities. + + - **Expected budgeted amount is 200** + **Expected maximum category balance is 200** + + #template 300 + #template-1 150 up to 200 + + - **Expected budgeted amount is 450** + **No maximum category balance exists** + + #template 150 up to 500 + #template-1 300 + + + +### Notes on all templates + +- Don't add a currency symbol to your template amounts. +- Number formats that use comma for the decimal separator are not supported (e.g., 123,45). You must use 123.45. +- Thousands separators are not supported (e.g., 1,234). You must use 1234. +- By default templates do not consider available funds when being applied. Use template priorities to not budget more than is available. + ## Available Templates There are many types of templates you can use to tailor how categories get filled to match your personal budgeting needs. @@ -105,6 +171,10 @@ This will always give you the same amount available each month no matter what yo This variation along with the previous variation, are probably the most used templates. They are simple enough to use easily, but are robust enough to make budgeting much simpler. +**Notes**: +- A single category with two templates that use `up to` is not supported. +- If any single template contains an `up to`, the whole category will be subject to that limit even if there are later templates and priorities. This excludes remainders which will run after the limit is applied. + #### All Variations There is more flexibility with the limit part of the template. @@ -209,20 +279,51 @@ For example if you budget in January with limited template: |---|:---:| :---: |:---:| |#template 10 repeat every week starting 2025-01-06 up to 55 | $ 20 | $ 35 | $ 55 | -**Note**: The date must be in YYYY-MM-DD format. +**Notes**: +- The date must be in YYYY-MM-DD format. +- A single category with two templates that use `up to` is not supported. +- If any single template contains an `up to`, the whole category will be subject to that limit even if there are later templates and priorities. This excludes remainders which will run after the limit is applied. #### Available Variations -Below is a table of the varations of the Week template. +Below is a table of the variations of the Week template. |Syntax|Description|Example Application| |---|---|---| |#template 10 repeat every week starting 2025-01-03|Budget 10 a week| |#template 10 repeat every week starting 2025-01-03 up to 80|Budget 10 a week, up to a maximum of 80| |#template 10 repeat every 2 weeks starting 2025-01-04|Budget 10 fortnightly| -|#template 10 repeat every week starting 2025-01-04 up to 20 per week starting 2025-01-04 |Budget 10 every week, up to a maximum of 20 for each week| +|#template 10 repeat every week starting 2025-01-04 up to 20 per week starting 2025-01-04 hold |Budget 10 every week, up to a maximum of 20 for each week and retain extra above that level| + +### Percent Type +The percent template allows you to assign a percent of your income or available funds to a certain category. +Below are the most basic examples. +All the examples assume the following amounts of income in the listed income categories or to budget amount: +* Paycheck - $ 1900 +* Dividends - $ 100 +* To Budget - $ 1500 -## Old Table +|Syntax| Budgeted Amount | Note | +|---|:---:| :---: | +|#template 10% of all income | $ 200 | Use the total of your income categories in the calculation | +|#template 10% of Paycheck | $ 190 | Budget 10% of your paycheck | +|#template 10% of available funds | $ 150 | Budget 10% of the current to budget funds | + +#### Previous Flag +The percent template can also be pointed to the previous month's income if you are using a month ahead budgeting strategy. +Below is an example of how to do that. + + +|Syntax| Budgeted Amount | Note | +|---|:---:| :---: | +|#template 10% of previous all income | $ 200 | Use the total of your income categories from the previous month | +|#template 10% of previous Paycheck | $ 190 | Budget 10% of last month's paycheck | + +The previous option is not available when using the percent of available funds template. + +#### Available Variations +Below is a table of the varations of the Percent template. + |Syntax|Description|Example Application| |---|---|---| |#template 15% of all income|Budget 15% of all income categories| Using a "pay yourself first" strategy| @@ -230,77 +331,65 @@ Below is a table of the varations of the Week template. |#template 15% of previous all income|Budget 15% of all income categories using last month's income|Using a "pay yourself first" strategy in conjunction with a "month ahead" strategy | |#template 10% of previous Paycheck|Budget 10% of last month's "Paycheck" income category| Using a "pay yourself first" strategy in conjunction with a "month ahead" strategy, but have income categories you want to ignore| |#template 12% of available funds|Budget 12% of your "To Budget" funds available at the current priority level| | -|#template schedule {SCHEDULE NAME}|Fund upcoming scheduled transactions over time|Monthly schedules, or larger non-monthly scheduled transactions| -|#template schedule full {SCHEDULE NAME}|Fund upcoming scheduled transaction only on needed month| Small schedules that are non-monthly| -|#template average 6 months | Budget the average amount spent over the last 6 months. Can set the number to any number > 0. Matches the existing option on the budget page but with flexible month ranges | -|#template copy from 12 months ago | Budget the same amount as was budgeted 12 months ago. Number of months is adjustable | Your power bill fluctuates throughout the year, but is about the same in equivalent months between years. | -|#template remainder | Add all remaining funds to this category| See the [Remainder Template](#remainder-template) Section for info | -|#goal 1000 | Set a long term goal instead of a monthly goal | See the [Goal Directive](#goal-directive) Section for info | - -### Notes - -- Currency symbol is optional, `#template $50` and `#template 50` are the same. -- As mentioned above, currently `$` is the only currency symbol supported. -- Number formats that use comma for the decimal separator are not supported (e.g., 123,45). You must use 123.45. -- Thousands separators are not supported (e.g., 1,234). You must use 1234. -- {SCHEDULE NAME} is defined in the **Schedules** editor. **Take great care to copy across these schedule names EXACTLY**, without braces. -- By default templates do not consider available funds when being applied. Use template priorities to not budget more than is available. -- The `hold` flag can be added to any goal that uses the `up to` key word. -- A single category with two templates that use `up to` is not supported. -- If any single template contains an `up to`, the whole category will be subject to that limit even if there are later templates and priorities. This excludes remainders which will run after the limit is applied. - -### Multiple Template Lines - -You can add multiple `#template` lines for a single category note. Each line will be added together. - -For examples: - -**Budget 200/month for 3 months and 400/month for the next 3 months** - #template 600 by 2024-06 repeat every 6 months +### Schedule Type +The Schedule template allows you to automatically budget based on the schedules you have added to Actual. +This includes sub-montly, month, extra-monthly schedules. +This is the most common template outside of the Simple template. +Below is an example of the syntax for a $ 100 per month schedule called "Internet", and a $ 2,400 per year schedule called "Taxes". - #template 1200 by 2024-09 repeat every 6 months - -**Streaming Services: 42.97** - - Netflix - #template 24.99 - Disney Plus - #template 9.99 - Amazon Prime - #template 7.99 - -**100 every month and an additional 10 every fortnight** + +|Syntax| Budgeted Amount | Note | +|---|:---:| :---: | +|#template schedule Internet | $ 100 | Budget for the "Internet" schedule | +|#template schedule Taxes | $200 | Build up funds for the schedule that is a year out | - #template 10 repeat every 2 weeks starting 2025-01-04 - #template 100 +The function of the schedule template is very similar to the By template, but you don't need to adjust both a schedule and a template individually. +You can adjust the schedule in the schedule editor and the template will stay up to date automatically. -## Template Priorities +**Note** The schedule name is defined in the **Schedules** editor. **Take great care to copy across these schedule names EXACTLY** or the template will not be able to find the schedule. -Templates can be given a priority flag to change the order that the templates get applied to your budget. Set a priority by adding `-X` to the `#template` flag. EX `#template-4` will be priority level 4. Any template with a priority other than 0 will not apply more funds than are available. +#### Full Flag +There is one additional option to the Schedule template, the "Full" flag. +The "Full" flag tells the template to not build up funds over time and budget the full schedule amount in the needed month. +This is useful for small schedules that you don't need to build up over time since the amount is small. +This can also help make stacking Schedule templates easier to track. +Below is an example of using the "Full" flag assuming a once per year schedule for $15 called "Simplefin" due in May. -### Notes + +|Syntax| Budgeted Amount | Note | +|---|:---:| :---: | +|#template schedule full Simplefin | $ 0 | Budget in all months except May | +|#template schedule full Simplefin | $ 15 | Budget in May | -- Lower priority values get run first. EX 0 is run first, then 1, then 2, etc. -- A `#template` with no priority flag defaults to priority 0 and is the same as a standard template. -- Negative priorities are not allowed and will result in the template being skipped. -- Template application order is based on the database order, not the view order. To guarantee a specific fill order use separate priorities for each category. -- If you have multiple `schedule` or `by` template lines in a single category, they will be forced to match the same priority level as the line run first. -- It is recommended to use the "overwrite with budget template" option when applying templates if you use priorities. +#### Available Variations +Below is a table of the varations of the Schedule template. + +|Syntax|Description|Example Application| +|---|---|---| +|#template schedule {SCHEDULE NAME}|Fund upcoming scheduled transactions over time|Monthly schedules, or larger non-monthly scheduled transactions| +|#template schedule full {SCHEDULE NAME}|Fund upcoming scheduled transaction only on needed month| Small schedules that are non-monthly| - - **Expected budgeted amount is 200** - **Expected maximum category balance is 200** +### Average Type +The Average template allows you to budget the average amount spend over a number of months. +This is the same function provided by the menu in the budget table but it can be used in a single category automatically where the menu option must be applied to the whole budget or a single category. +The table below shows how to use the Average template. + +|Syntax|Description|Example Application| +|---|---|---| +|#template average 6 months | Budget the average amount spent over the last 6 months. Can set the number to any number > 0. Matches the existing option on the budget page but with flexible month ranges | Try to budget only what you need to spend based on the last 6 months of spending data | - #template 300 - #template-1 150 up to 200 - - - **Expected budgeted amount is 450** - **No maximum category balance exists** +### Copy Type +The Copy template will copy the budget amount from some number of months prior. +This is useful if your spending is inconsistent per month, but cyclical over a period of months. +The table below shows how to use the Copy template. - #template 150 up to 500 - #template-1 300 + +|Syntax|Description|Example Application| +|---|---|---| +|#template copy from 12 months ago | Budget the same amount as was budgeted 12 months ago. Number of months is adjustable | Your power bill fluctuates throughout the year, but is about the same in equivalent months between years. | -## Remainder Template +### Remainder Type The remainder template is run differently to the other templates. Any remainder templates will be forced to run last in their own pass. This way the amount left to budget is whatever remains after all other templates have had a chance to run. Below are a few considerations when using the remainder template: @@ -308,9 +397,11 @@ The remainder template is run differently to the other templates. Any remainder - Remainder templates don't have a priority as they are always run last. - The remainder template supports weights to control the distribution of funds across multiple categories. See the examples on how this is done. - If no weight is provided, the weight will be defaulted to 1. -- The budgeted amount is calculated as `budgeted_amount=available_funds/sum_of_weights*category_weight`. +- The amount budget by the remainder template is calculated as: `budgeted_amount=available_funds/sum_of_weights * category_weight` +- Remainder templates don't set a goal with the goal indication on the category balance. +- Remainder templates don't affect a goal set by previous templates. -### Examples +#### Examples All of the examples below use the case of 100 leftover when the remainder pass is run. @@ -342,7 +433,8 @@ All of the examples below use the case of 100 leftover when the remainder pass i | Vacation Fund | #template remainder | 16.66 | | Investment Fund | #template remainder 2 | 33.34 | -## Goal Directive + +### Goal Directive This option is unique enough to warrant its own directive `#goal` instead of the standard `#template` option. The `#goal` option overrides how the goal indicator typically functions. @@ -351,18 +443,17 @@ When using the `#goal` option, the indication is based on the total balance. This shifts the indication to a long-term goal you are saving up to instead of just the current monthly portion. A few examples have been given to illustrate this difference. -### Notes -* The `#goal` templates are run the same way as the regular `#templates` but use the month options or the category budget options. -* If there is a `#goal` directive in a category, the indicator for that category will be based on the total balance compared to the amount set in the `#template` line. +#### Notes +* The `#goal` templates are run the same way as the regular `#templates`. +* If there is a `#goal` directive in a category, the goal indicator for that category will be based on the goal, not the templates. * The `#goal` directive will not budget any funds, and funds budgeted by hand will not get reset by running templates. -* A `#goal` line can be stacked with `#templates` to automatically budget the category (via the templates) but override how the category goal is indicated (the goal line). -* If `#templates` include a `#goal`, the budgeted amount will get overwritten when using the "overwrite with budget template" button. -* There is no priority on a `#goal` line. +* A `#goal` line can be stacked with `#templates` to automatically budget the category (via the templates) but override how the category goal is indicated (the goal tempalte). +* There is no priority on a `#goal`. -### Examples +#### Examples All examples assume that 400 was carried over from the previous month -#### 1. I'm saving for a large purchase, but I'm still determining how much I can allocate each month. +**1. I'm saving for a large purchase, but I'm still determining how much I can allocate each month.** In this case, a balance greater than or equal to 500 will set the balance green, marking a met goal. If you run the template, you get the following: @@ -376,7 +467,7 @@ If you were able to budget 100 this month, you would then hit your goal and get |:---|:--:|---:| | `#goal 500` | 100 | 500(green) | -#### 2. I'm saving for a purchase, but I will budget 50 a month until I reach my goal. +**2. I'm saving for a purchase, but I will budget 50 a month until I reach my goal.** In this example, a template is used to automatically budget 50 into the category when templates are run. The `#goal` line will override the goal indication from the `#template` line, and only go green when a balance of 500 is reached. If you run templates, you get the following: @@ -391,4 +482,3 @@ If you have some extra funds after templates are run and can budget that last 50 |:---|:---:|---:| | `#template 50` `#goal 500` | 100 | 500(green) | - From 17b99a34e6a890c975527316f1af975b7d14e451 Mon Sep 17 00:00:00 2001 From: youngcw Date: Wed, 8 Jan 2025 13:08:49 -0700 Subject: [PATCH 06/12] spelling --- docs/experimental/goal-templates.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/docs/experimental/goal-templates.md b/docs/experimental/goal-templates.md index 7c6115c0a..b4ac39166 100644 --- a/docs/experimental/goal-templates.md +++ b/docs/experimental/goal-templates.md @@ -145,7 +145,7 @@ The template budgets just what you ask, no matter how much the respective catego |#template 50| $ 50 | There is also a useful variation of a simple template. -This varation will put a **limit** on how much the balance of a category can be that month. +This variation will put a **limit** on how much the balance of a category can be that month. Here are some examples of how this is used @@ -245,7 +245,7 @@ The table below shows how this works. |#template 500 by 2025-12 spend from 2025-11| $ 41.66 | $ 100 | $ 400 | Assuming the beginning of December, but have not spent anything in December yet | #### Available Variations -Below is a table of the varations of the By template. +Below is a table of the variations of the By template. |Syntax|Description|Example Application| @@ -261,7 +261,7 @@ Below is a table of the varations of the By template. ### Week Type If you have bills that cycle weekly, or like to base your budget on weeks, this is the template for you! This template is like the simple template but it uses weeks instead of months. -You set the start day, and every 7 days starting from that day, you will get the requested amount budgetd. +You set the start day, and every 7 days starting from that day, you will get the requested amount budgeted. See the table below for examples. @@ -272,7 +272,7 @@ See the table below for examples. As you can see, the template will budget based on the number of weeks that start on the desired day, starting on your start date. -The Week tempalte also supports limits the same way the simple template does. +The Week template also supports limits the same way the simple template does. For example if you budget in January with limited template: |Syntax| Previous Balance | Budgeted Amount | New Balance | @@ -322,7 +322,7 @@ Below is an example of how to do that. The previous option is not available when using the percent of available funds template. #### Available Variations -Below is a table of the varations of the Percent template. +Below is a table of the variations of the Percent template. |Syntax|Description|Example Application| |---|---|---| @@ -334,7 +334,7 @@ Below is a table of the varations of the Percent template. ### Schedule Type The Schedule template allows you to automatically budget based on the schedules you have added to Actual. -This includes sub-montly, month, extra-monthly schedules. +This includes sub-monthly, month, extra-monthly schedules. This is the most common template outside of the Simple template. Below is an example of the syntax for a $ 100 per month schedule called "Internet", and a $ 2,400 per year schedule called "Taxes". @@ -363,7 +363,7 @@ Below is an example of using the "Full" flag assuming a once per year schedule f |#template schedule full Simplefin | $ 15 | Budget in May | #### Available Variations -Below is a table of the varations of the Schedule template. +Below is a table of the variations of the Schedule template. |Syntax|Description|Example Application| |---|---|---| @@ -447,7 +447,7 @@ A few examples have been given to illustrate this difference. * The `#goal` templates are run the same way as the regular `#templates`. * If there is a `#goal` directive in a category, the goal indicator for that category will be based on the goal, not the templates. * The `#goal` directive will not budget any funds, and funds budgeted by hand will not get reset by running templates. -* A `#goal` line can be stacked with `#templates` to automatically budget the category (via the templates) but override how the category goal is indicated (the goal tempalte). +* A `#goal` line can be stacked with `#templates` to automatically budget the category (via the templates) but override how the category goal is indicated (the goal template). * There is no priority on a `#goal`. #### Examples From 59fcc62586d17145fb82ab9fa775da639cc1c226 Mon Sep 17 00:00:00 2001 From: youngcw Date: Wed, 8 Jan 2025 13:13:26 -0700 Subject: [PATCH 07/12] typo --- docs/experimental/goal-templates.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/experimental/goal-templates.md b/docs/experimental/goal-templates.md index b4ac39166..5836f34d1 100644 --- a/docs/experimental/goal-templates.md +++ b/docs/experimental/goal-templates.md @@ -68,7 +68,7 @@ The image below shows an example of categories in the following states: normal ( ![](/img/goal-template/templates-colors.png) #### Goal Indicator Information -If you hover over the balance value in a templated category, a tooltip will appear with info on the status us that category with respect to its template. +If you hover over the balance value in a templated category, a tooltip will appear with info on the status of that category with respect to its template. # ADD Picture here From e65a59c2624a55adbe7da2635b6322f117edfd33 Mon Sep 17 00:00:00 2001 From: youngcw Date: Wed, 8 Jan 2025 13:23:20 -0700 Subject: [PATCH 08/12] apply comment --- docs/experimental/goal-templates.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/experimental/goal-templates.md b/docs/experimental/goal-templates.md index 5836f34d1..b08bb36f8 100644 --- a/docs/experimental/goal-templates.md +++ b/docs/experimental/goal-templates.md @@ -57,6 +57,7 @@ This will overwrite any existing budgeted amount. # ADD Picture here * **Apply templates to a single category group**: Use the option shown below from the category group drop down to apply all templates to categories in a specific group. +It will apply to the month furthest to the left in your budget view if viewing multiple months. This will overwrite any existing budgets in the categories in the group. # ADD Picture here From 4cc46032e9a509b875ae6b77baab9222958993e1 Mon Sep 17 00:00:00 2001 From: youngcw Date: Fri, 10 Jan 2025 10:27:14 -0700 Subject: [PATCH 09/12] add new images --- docs/experimental/goal-templates.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/docs/experimental/goal-templates.md b/docs/experimental/goal-templates.md index b08bb36f8..2ef42de9c 100644 --- a/docs/experimental/goal-templates.md +++ b/docs/experimental/goal-templates.md @@ -29,7 +29,7 @@ Create a template by adding a note to a category and adding a line that contains The example below shows the most basic template syntax `#template 72.99`. This will budget $ 72.99 when templates are run without having to manually type in the amount. -![](/img/goal-template/goal-template-1.png) +![How to add a template](/img/goal-template/goal-template-1.png) ### How to apply the templates @@ -37,7 +37,7 @@ This will budget $ 72.99 when templates are run without having to manually type In the budget month menu you will see the following options: -![](/img/goal-template/goal-template-2.png) +![Apply options on month level](/img/goal-template/goal-template-2.png) * **Check templates** will test all `#template and #goal` lines for proper syntax. @@ -51,27 +51,27 @@ This is the recommended method if you are using template priorities. You can also apply selections of templates if you want. -* **Single Category**: Use the option shown below from the budget field drop down to apply templates to just that category. +* **Single Category**: Use the "Apply budget template" option shown below from the budget field drop down to apply templates to just that category. This will overwrite any existing budgeted amount. -# ADD Picture here +![Apply templates to single category](/img/goal-template/apply-template-category.png) -* **Apply templates to a single category group**: Use the option shown below from the category group drop down to apply all templates to categories in a specific group. +* **Apply templates to a single category group**: Use the "Apply budget templates" option shown below from the category group drop down to apply all templates to categories in a specific group. It will apply to the month furthest to the left in your budget view if viewing multiple months. This will overwrite any existing budgets in the categories in the group. -# ADD Picture here +![Apply templates to a group of categories](/img/goal-template/apply-template-group.png) ### Goal Indicators After having run the templates in a given month and category, the status of a respective category goal will be indicated as a text color of the category balance. The image below shows an example of categories in the following states: normal (no goal set), empty (no goal set), goal met(green), goal not met(orange), and a negative balance(red). -![](/img/goal-template/templates-colors.png) +![Goal indicator colors example](/img/goal-template/templates-colors.png) #### Goal Indicator Information If you hover over the balance value in a templated category, a tooltip will appear with info on the status of that category with respect to its template. -# ADD Picture here +![Goal indicator information tooltip](/img/goal-template/goal-indicator.png) ### Multiple Template Lines From 6242968e4c4bf5a29ebdf80f317f76aa24f44c92 Mon Sep 17 00:00:00 2001 From: youngcw Date: Fri, 10 Jan 2025 10:29:53 -0700 Subject: [PATCH 10/12] commit the new images --- .../goal-template/apply-template-category.png | Bin 0 -> 18448 bytes .../img/goal-template/apply-template-group.png | Bin 0 -> 10979 bytes static/img/goal-template/goal-indicator.png | Bin 0 -> 10250 bytes 3 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 static/img/goal-template/apply-template-category.png create mode 100644 static/img/goal-template/apply-template-group.png create mode 100644 static/img/goal-template/goal-indicator.png diff --git a/static/img/goal-template/apply-template-category.png b/static/img/goal-template/apply-template-category.png new file mode 100644 index 0000000000000000000000000000000000000000..567f71284b9305eed60fbfd0104e8025f81228a2 GIT binary patch literal 18448 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%0At!wfncXjX?~ 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%0AZqcPYj=z*u=>v|UiK-Pod5My5x) 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 Te|7jaRX|Q!Nvd4pga3a4eo*?b literal 0 HcmV?d00001 diff --git a/static/img/goal-template/goal-indicator.png b/static/img/goal-template/goal-indicator.png new file mode 100644 index 0000000000000000000000000000000000000000..cc7912e971d13727fa5fe7a41e7420a6e431905f GIT binary patch literal 10250 zcmZX4byO5@*!F-(2nfOwf`CYaNOvQh($d}1-G~T+boU~SG)Q;D!b<1Tjl|L{{qFDk z=R5Ct=giD=&di*9=FD@)bzS!p@kvD%_XXJt00401<)qY+;~4UY!9+!#U+<1|BZp^h zlJc6En3%A2)wTbwx=Vj{*Ko3O_cC?01gssM94uMg%v~)l9o=l4+~LnUMFHR~ATK4M z>78|y?IW&qKt2fO;^H|PNlMVBmDXcalq>)d3@3;P>9#iA+@$c)fSobJH&oygVL^3CNrSFI zpC{_*qFnJp^%?`^ul_?L*np?c;iaInMceXcHMNN;hB0pn!QbWO77ikUbaXrdH-f1V>ERHD@%Flan_#H>gDX4L*HFTsc6n;2NB@oUrA_ACdoUE2nt=ge2g^ zY`2qO9eI~w-fPz1cE2%0*wdn_$HQ%H!4QR!wwDyjs!tte+nm`e?H&G)f)0@PFTPKX ziG#aMnw-wPPv7ZLW+E-v!Y(*5TpB=dNYc`5m_ zkr8U)vFuN`m-;q)y?vntzjmxzpI}ThG|RPBxrD#+ChJwH+WQa%ackp;S#OY2ZU3aJ z{437h&Mx)6D+dQfuupb;z6=Ni3JaH|?PDM#Cx6^+)|W5E25f9?fB*LMqr5y@m|}cR z=I|3%gf#wncwj(=fPi3v%~-@6Uxr#kyVA1;Y=Z&Z+&uTXe})rv`}*~31x3Zow3ptQ zNpJA+)2>bvlP~v3 z{Lw0UidDhI{QS$<&G|(|x2>>AoX|b_2$hrT#Cu+8Rn=>FLWVPbN3^&c=Bmtz?8lPm z+=sW*GUI{xb~H9(nDwvzP=zjHF5*c#pdDcp{%Je&YW$j8C$6R)_pt2n7Qr$M8U5l& zoX0@-e;)qD8*=sS6S>5lgzXcv8pz>E0gJ3~-_%ZWD$I^X^U|vuerG35)DW?Vne9Pa z?Nq15J(poeBQ^WAyK^aJD5i0-Bj~9nAXC=gKOqFwVR-VnMv+p_WYFU%rLCzVePWG< z){G-w4{B&-X0BR7U?5dMkNLtUmTL};>ZIC?-_Y(k$rXlN#`%9_$CSIYG}=#$MtgUC z(Gog;h?1S4Zri$RH}i7vlIo>1f&ilWqgf3l9$&M4wvK=$O3#A;$CMTvX#bM0Opsfk zvR#BKwX~G*wp`xS{!ij&Qqn8G$Bp>n-Q$lKu`;4QVTO>=(aGsaIiG7m0Xkj*x|BG* zO!bl6sxz^{c>ZgMOQ@7@yXTnw+_JP5kt3etTIwTii|dx|kLVogPE>ed-;s~|p#4Tx zZ01X49x~2exQ(YS2Vemr8NCn^ggT!L2H{cs0oT!tK6Qup75%|~kR}v+rK>45>Dcr6 zs-QStO_c`h=SKx1B0Bn=r}Qp9B;+H55-A42!Qmnx(Cq1Hev>3Ko^crPCipF_B1Hf| zTDnZ4C?!|W|BcnMpRP|@YM54iytPSyo~Byyoy8gbha3J+P2;o9Hu$Em0= zeo~x*xFMP4KLmA?*eoL$wl>B-=UJg$Dll6Rr>=4gJ+;E6s_(W9|7Yj(z@4ocvG%1T z%9OMHDUz6itu3!-N>Qhy^hFPZ0e~t?Jzu_vjPF-qr)uNK^n~HTIHF z+Ws}pJ;95;!6mQ~ed4giEGH>~FC=eouni2QDB;<*3enWj8I0G|*8aetPZdVXz@V?E z7nW>kVZlEzV0WH^TdYD=QBh{d9wcyAEZJ-Wp+j}F+rOCc`U|hkR!NLQ1wF46(*XxO z;Rx2IN93I=%eop!s(}#q9uybKs_p)1aW@q)-A$y|7cP3Ptl2LCbB}1_!eT>JZwYI5 zqrxD;+rvQCZ-0$UraF1Lc|p&glgTFh`7<3m`u_e;Qxn?iVejad-1OJ>viZ+2u5hTV z9(bAh$4jWj1Tp2YpdCNNMJ#7r0-{iwlF@+^$KJ1_2|ZjBuda5lzO%XIS3BK*%j=SL ze2M-Hn;Am9%&(=b;ZSH^ZL&7R>`MXIOo9T6Sz)g{4}!Yqa9V83$!)!OZ#h&~XWhF` z-CdI&AENmaZvS0lVPeXtfkyDj3FmY=@jRL6cRc1Q4SBeyfnX*2pOKNX69-ND;(O)a zv%Fu?D-#_w22lW8$*HJanWJo9&-s$(GzYEx8}=43B=EI#GcxOY7j)KN_unkrDkw8u zeKbmOpxTuF_`XJ?STQ{N7VmlRVXc`o)4uFTgW0}po}@C*pHqV#Xyf{=X*j1}458=N zfuHS~cw$GuWf(3OO}xC3(F!)n-@A+b^MyJR&m-5~FM0XqdBy|2l=G}iOfCbvsNW?y zxDN+c=wog(W}2)5(qfdC7DW)JG1V}jy4Q+1aac-idi!cY`WtJuGApUlK=V99WWpq~ zx-0Gg7r>||=BPL__EJ9DSY(tK$O#Ax;<(!X{(6LnuJBl0&sKH_$q3x~VY5Dx6Dj#iCVxi*rkc z)?sLVP3RpJx`fP!1IB?V+!^s}Rbf(+QbV*@%+e~6FWMX_*fHqmd)4Mu(KPA1oKCYE z==V(6(`|4Q)ief6%72xO)1J6{`tUF}(MQ9YNYLlW)Yy0^JS56KqXqHc(ATwuo$p^zugjp?ZSbM?7RccA3qG?TkXJX*RMUO~Fx&n61d>LnFm`p= zi$ZvK(b^PE&%~G@F4q>jAH*8^PiQ2$C;)w^b;1pQ# z8~7lxB2o&Z4pnlMyKl(+BAhf?i{Y%Hy;58nc-!|EXK5wolRiVJc@CJyAPr3GT@qdQ zR`k3@*hvRV5RWl&!NmW$uto2$LK%PZu|j5KsWwqQtUG>vu)Bh`yP=s0>^pm9OQ|XZ ztFfUx{;Fq;bX^fW5ppoQRv4FGTQJ<1;~#ZKTopvy{YaZT+A=|1Yu1Fs`qpC|fApcm z=X;S&jM9kO)p=m=-=Qq7o3@C_ARF9D(V?pHOdNX`7HUT-Aqymu489-?N4e(MK3>j^ zARKf{x;)aqZE$E^p{G++R8;kHHK?^fN$IwV3eeW(ZQZ8pvN2tnpPsI(m|FgCR@riipB%t^+5D}aiz9tBO{Z#kNtl~w`pKE$ z`V2PML}lCx84@7Fxm|YHPs_cGHAL}S`T!xC8lh2dtE~L%0FyytZjf}V*W4RB(XD`g z7)lPb1R;5}?{^~zt%+GZi3v#veV1na;EO#F*Q+GAsg%V_ims{84uiF1f+9}gV+T=e z4WfRdf80@bs+|5rp4Y@5z;95xswrDoHDQ~7wro>h!v2vNX01;WUj>mYU1Q+pi=|=q zn8yu#bl}cttEk`s#`iA@3bv4Syw%g`Ti7Gq1(CS1LEv}i!s_*9Dtff!U3oAat6nN` z%0PE^BM0E@xHvf>_@LKlftr)(phU0mjt5iF4&MbtcI!NvHnC(`SQtxmjxb0pITV?|UYe|l;sAd;eA_q>|IU8RB1Cf!?-`j6gPil* znk@cxV#s5b%3;>hb@DtSI94$&)&GVXE<*6bMx6z zI9Nfq6G|EWA^(L`z|>gEM9Z)u@$?fO%$62yn3+}2?OM{^HzTK(Io$pt;-we`MUIB{ zq<$%EKAo#^Ry~VPYN}-QekVJ2QMR=#W?9T9OeI zc}Y5=ZF`V%H#di7@R`urbmZXx3MrviB+s2~udWqlVxa)ui53H0v;i7RCZ*{_p6ts* zqa9TdYm<>>%=a5P%DkjfGIF95>yJ+6fXRBa#w)OT%T$tka*K~BR!{Vpl-Q&35RZ?` zFwu^=!f$44BhiekZ0fF#P3pCmAk~eg&^*QnBiUW{5y)+NQW6ee!Ktg?I#|2?Ge<^r z@O*k^CR^BJ*0Nu{V}?61Gh!ljGw;Ko^s-WvqvJ}%Z4q#?buI*WpY3Nerkj;n_XTv;j6&3Ju3;~92K&v1~YT9wb+a(T?K>jQG53Qub4q<0T>1&ln--M77jyR1}p(d6Km zmkfz=e7lv)?5;hfOg~ALb_(al(B{1~`BVOq8}b!LHP-dV`~_cg@lcEx$2uZk9da`w zjCc52*xMv9@DW)==Nq9dfe)TKmX>bk)D=9Xccz=vS2=%lmG4R{8n&@KfB;G*{zB-=qhU|uXLAjzJ zpnijEd1m4FzPK~!?RTa9DcQN9A(P^8m}%9feTQRQLc*Un4yR*cr z*9Z;r>irU@)KC(cV0%fefsrJ0e$%Jwn#icEQs1$;*T&Tjdi0lEL?%&3!djZTU$d=} zxYhX^lC^x*0(F&>xwYOLRB?~O(im5T4w3?>6I_JF$``Ws)1N)R!`R~iak-Pms*^4BtXNj9+_22?0 zvh#;7qzMQeb);q%`f<_7`Cm^mnQ{ z(@M@xIB?jq9`NMf{tUS5w!jm~i4me;i?BT<&Zi?Qj8@_w=jaa|% z)d~5(VawbawOpdRyX6!U2<;os0E{^Nf`XRG->Dr1j9S5kp^P(Lx13tKdfs}R$_5aL zT$;X<^cD*#)%HL4hkfN2L9z>*`y->}4Y4loOMjpF6I@iV&q009GS#vj>TSat*B!9!Wue)n`VWsHzw`l%P<}R1MOpOt{b|%*7C6 zH7Y3n$4wF2eAAXrHGhfH(?){)XwCW${H(i6fhoDH>jJCvCbPI7KdC|jS%STC4-J`D z(uuVagXh)C+=4F)&df%)rnxghLYmS@Bb3mAHnDy|)k6~CEiJ+QKY5?NW8Qw92Z3y+ zZex_iB!+v0<))XyIF@Y-`eV~;{E*HcGJ_XyPAGKUtR1oWQsR?01NROSQ(buKJz7L~ zNXD}GE&c0A?()qD4VT-^Li`s9?_i@hImx&H4tk>0JJSiQUxDGuI2U@QN6}NF4)X^A z9DJQ8YYja2I5{1WRb~158GNFh^RwLZYKmQks0|*(5Q{uuo|YWRKt!^}EYxYYzL(rt zt2~z2et6kH99v0|7@y!z1g>@5jX!J)N&c&$|Jc0}YSj1A7Z2=u)kW+!waPAb#_$IP z$mvihDJi!ztluWCwfL4-vZkeYC0B4uQJ=wCKjP+@I&48ahdE_7rjg1TcJTxcVyV`E z#edXH0y&0DnG|ziF=ajprQhynCWPECN~_c{z);1Nl`95ct!8$wYt8V`qx%}c=6-u= zIQm8#bJe25pihXyl=43y04-c>wdH9#bNr`YJKGKk5lL#&V7qc*+;HVjYyJiOXFzuM zyvO|YS@tJTmoMUNEUx0VWuY2~LeTcKjcJp3EQ@h;5dDYWUEmZY{2DwpqnXrL?n)^H z!2t%w+$ea*8877BWwc|KZO(NQ9r(Q8Ku3qUcn;mHR-Z~VCrak~D(+O3tI2kDsr2-9 zc1`SSJfNtMs>VulgC-)^(Q6q;iFldDN})Nn8q&$2I|*>Fb=9-rAUUavcDJ+INnv}Z z4~AQouCA^bnPsJS!GE5|8n@*L42OyImsI`zd#MPlS*vtxCMYXft3rNYT?lP-9ChuF zGq9n&rQNVxY>Z+I0#~se|FgAk_Q`S7j$WQ=eSNi0biw#SsGX2ZU?zr0-gjU7M`F8{ z|6XBc@l}&gPT;8^79ji*{8RM?KLEZ23r|%8c`US10r+SxwT+w{pjy6BC|g#C|Id*& zrd8wTlrCP#+hU^IG@eY%yc`z^I!IGPdx#^90Lc%O3OKDS2PM|Y}3S~D)! zY<*}q1GH^ITW-niTWqUbY)hDeK|`z}f+kau&5Do9-}3f6=cJ$Br#HJd^oAGnA?M@y z^a?X3@hH4aaft1`nwpvN#L;C3dlB zZb}sL>%Pf@PlimQE^Qvi^LHF0G}k^(P-QMMupLD zScF@XYL$OQr&v}(EutXQ+fhPIUiaIeDB9dgW z^xPe3SMy6=PJs*?9iERE^SWK^C%)Jkup`zO_V!pBj> ztvpwtxhF%Z<$Ss`6Z@O*!_5X02+W#Z-^{&?#e92V%yqJyL^N!n-BM&X2Nt+Fq)XM& ze1vxrzGB-*BC>5+)C0OqoF4?d#V} zA~GIm@1L6LuyQ|Gd=Bs)ol=_QdL3LC0Zmk=uHkbFJKDeBvI+TDpSFjO<+Md*T3Kru z_c!|T-K@K{L?+}Fgf=A=^yS+Ra%;ApG0V%fFf$=TnrgLO;z!$ST>)fT)Kq(=O_NNt zP?gh6mX@AGE0l3alD!N+tZZW@-|5;*Sqzih$4i{w_* zS8OXvwe?+ut8D>6Ja2KNC+6f!MRib%VEWXUoFm;<{lsG-c?9U+_WfvV242kSe{E-5 zQo#3Y;u;=!cQLH^bf@|W1Recb2kv~_FSC;Baai0m)R!HDvMv4dA!|+U?smjWXVg>I z?l?aY5H?hhyk8!ynkUWuUf&qETG~*l@FLdf4I672sgQNW*O{oq)O*$A1^#Y3Qovo~ z*!6tt*t~;p21CW!b)m)KNb+#j_9-P`z~5tVf(%GIO(K1?M!w<0i-8JyeRu<+XyQ? zXDSUV-@tq}HXNcQt{Up*($X)u_=rGgkeH&3NKY>hk)NgC4v9bG?895U(eGyH>gYYx zlI9xSIl+JC#j66JeM^7I%NY3&#|xQfzQ`Z376)qO?BZaKA$X6qZZ^m`@3qR#Ql<>F zS<}LBQ+{C)76hRRGt|JSzGxZ6K;#0!GWk58lb?uIwW+qlfF8;X`g@r3lRAWj8QiG? zfj}E;NY9Xx@x+>duX*uQe<2slQS+UX-kDl*dn*62ps^Cq#|;z z$=SQ)B=e+4_>m5eJqMrV1(%CDha^uyG9}g}K?FpZ{LXD|iW#S{W{R`4BBw$dljw)? zrGF8HyF|oe2Kz;#&XQoYso1PCFw}}Y%`vCA9?D>ko3mHz6QspsjsH^Yn+#V2Q^9&~ zX1h{@X)kfvgy*YR8l5WJ2~qFQ{+S_dqsaIp=)E@}8JiD0i5h1?>K6NAwbrT)P}LW` zficGh;e}&{o0a8qiddb#chf6wbI%^`b$_b)#Tt84W+JwBBIc+`&R+bSYw>dd4UOea zL_zb@xy*XX=?-DLuO9hr7HXwgw41D~9zl6%IKmyuipt;V8O()Thqm*Nn{TA&XVOAJ zEXB!oMV=21I|eNQREp)LrOPc(NtOMY(C({55~tB2JAAY6c_j;d(#346+vWSQyRcX= znZZ|Ir`4dq>(hgr=n=~Tx=UYM2cvy|2>d0$p1!wG_Vww(>3c?G!aL=wT$tTc+>g8j zPGOq=_d|G~8v05~2DY|Lz|hc86uDDAOn(=e$tO9t{O{C(HA?s{y5MOjkO*uhYFo44 zw%sq;Wm|3cYjmAa|8=nQ!|4vr&r*5& zaSK z+0Ri|OV5a!jU^g3zGd+V#L80jp0zA4G2RSZUpx${4zE4siepU#Wz|$rv+6gX1D`IU!k{zA+UIYoKoPMn%jHzov1NiwT}liuTyLFZ@V{QYB4fRMK+D09|-GX?@HWbrBx zp(KY)uCBF0A`PN3n1PQQ6NQSRR#vQwdc;4S%vDWeo$j(8pQ-Nta8krM$L?^(_f!96 z?tCplOZ*BANFdm77knn&Ev_m=O;=G=M64J@nK`dh9FF-tudwLd2bE|=-`K(@MEV^K zOC#7(wT(LvJ=*Gvy`Y}IzT&&FKpJGWUlLYLPS&xq*lud^Q?9Ll8;`%)At)#^{j_{! zXrPyJb~IP@3F=DzIWod?B4LKbPuWF)plmWn|1`$^c5 zxn~KYfmkNzLFVuAYL>BPo;`;LVyh78E*Q(7Gr!(axQwwfPBvz(H(5*>47#{c=#now z7##^Wb#`pKlT4ldeR0N##K)-Oo<_gGPY)NPUjorlCt(F)EZp zyeP@aAtO_L{r#^9u=Jxy+L-Z>Y8=`T*8lH({qJs?oWOIsdDRbBt<@KEC6v~LCHT6=5?;3LESI53xL`q10AZey*weU` z!`p<6tBT!E7}U&mfn+CVJ=`j zImb&*O|~))e>gHZbqHTJ6qwwtbeTIUO(zKC;Sw6N?I+I28hwvJZi1~rn6IAdw9+`c ze6W=hw7_-tUvLp3Wy!6bhN~F8BN?wt$CQuCqW+IB0VGXmd5kFVbXclbJB*y6$ipGHn=$@T%!|XV$)rA^gHK!IAM3)T!OuC{BYgek$4$< zt2VoRN6Y`LTnmO|3ftDtfK@IXaQzJcV8s8o7NCxT_@T_ojt`lhdxU1yKg0URUY$A| zVI)R$s3^2wGb)@|Ve1R41|ZHv9=i)e**nt^AYn}_Bu8j01+Ru0DPf-f3{1>=V5tn< zJ+{AQ^TFkuy%yS_bbov+Mh=oLZv8SdHG6w|rm`k5cFq@4g9`f)SXtNCSg)@vEa0-= zFqYiP7&$vTK_a+-$9>#8Mj$%r_h0=?hPX{B2e+YPjKnk6wz7X0ndv)wG2}BRw+xJhw7M;%kx5Y|pd` zh9Sdp&%`x6jW?|mv-NWei$dT@vxbI+Gh+N02v;E>>wHPrE@R{o%0eFP)SC%q>xl0C zuW}UC==iyv$X*lxxxW@Kk?8GPFZfw7=JzNMI^dIDcjRqC0w^^Je-KWG9jQ?L#8gPz z-``(?tXDM`XOWP}vll>@m+{@n1^v}I&6N?-D-M&->h^yZobYTibj+;mUW_(8BBcEF z6KyW~FO>@l%J22W(^T+0fboMFk$aynGTJJZT9=i*9p2JY^ieB+uDy}qTgwAFAhMG8 z4)lK6WvK*ur;?PSrKzpe>XS2|M{9D;!-Q26>P1ynW{+4Pz1*MClJAC|Yf@zAWa~Sh zToAQoJAlMw`x>$G>ZNu9)`@w03!DTt6@7Px+sRS7Jh$Rp^21){RGaJ-NcW=8z;BOh z0!tfGGA7b=!?d}OWLoFA=Y{iPor@3O_J@aZE7H$U?!75&IGOix2RcBmGulp0X1o6< z1dJQ|S+~MmS`) zknXPWfoZcLk2FMj&#wCA^z-FVK!;WIw@>MEV>%@{-ls1~;Ab z4ACD=*edf~8$3J*G+$~qUwRuC(IKAh7J6TwE`+83-qOH>!9+NK{Bj$Je zrq%su5jr$vZ9SHQ=|@^pJm=SY3q4vf3F#!I6xly7NmW93+lCY(mnwvXJ!EC?8g%qT zipnY83A;{XdU$BLxSS5hBz6Qo7%g{XZsFh0oP5$(P_TPKkwG{d0fd{^rR6u`NTD&d zmnO)h@JvD zM~|@Z{cvBz6n-eJYNCj1UmcOY(s=ip_bVJA&T)Ao3LKx3!u-LsJ%B(W4yl~Kem(2I zf4rRIQD0Ae4Hpg|Zm^p<<0*S$egEF>K!)&M8q?F2)|Voirc~9qozDdev41en=iA9E z>Pt%8;XUkcX-UVy@w=j;z9mdgY4kwbiKE*XBYX%UAH%&8Q|~o$a~=p^DMSr!zQHF* zcSoF@o}ER8h8AFx+-DW3c7Jhq_cd&D<`L`6ZE4vVPPB$=ta`yKXSBh=YgOOD;pP^2B(G$-^1X^ zgT^P&^JX+jWXr1CZqtDFx%df5MFT|8*1rE6a+0{E(V^PpbKY@rdb{5rU`~+)p$6>( zer9|4Y*#ck@8)OgFj=B7CE{*P(@ogP2?ho5k0XP{W_a9zx7aLkMOOvFLZ2j4voX*U zb=9;ojn$t6?+Vb{Uylv*-iIYUB;@9RB=FzU6F(`xi*GW{57P--uE2Ny!bq!W5K5Fg z@{21c0{85N8dar0LB|+c{tiBdW~3k&(8U0 z-lh)=iYD;~#RGXO<$s)1V7;Z12u7pWWvVuz2o)j>e;uwd7t^r&|vO|J4Xn9 z#l$+<`eBjhhkW0;5`d?k9Z~vG%Wq&Y=Owte1N>Pid3bfNyz^IPuo_M literal 0 HcmV?d00001 From 9a0ed2ca8f8a1466af3a268843c19e7aa18d42bb Mon Sep 17 00:00:00 2001 From: youngcw Date: Sun, 12 Jan 2025 15:09:54 -0700 Subject: [PATCH 11/12] Update docs/experimental/goal-templates.md Co-authored-by: Matt Fiddaman --- docs/experimental/goal-templates.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/experimental/goal-templates.md b/docs/experimental/goal-templates.md index 2ef42de9c..f3d7928de 100644 --- a/docs/experimental/goal-templates.md +++ b/docs/experimental/goal-templates.md @@ -125,7 +125,7 @@ Templates can be given a priority flag to change the order that the templates ge - Don't add a currency symbol to your template amounts. - Number formats that use comma for the decimal separator are not supported (e.g., 123,45). You must use 123.45. - Thousands separators are not supported (e.g., 1,234). You must use 1234. -- By default templates do not consider available funds when being applied. Use template priorities to not budget more than is available. +- By default, templates do not consider available funds when being applied. Use template priorities to ensure only the amount available to budget is assigned. ## Available Templates From 9bc5b83330b7f4c1b430097abc306e88ad03ca72 Mon Sep 17 00:00:00 2001 From: youngcw Date: Sun, 12 Jan 2025 15:10:21 -0700 Subject: [PATCH 12/12] Update docs/experimental/goal-templates.md Co-authored-by: Matt Fiddaman --- docs/experimental/goal-templates.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/experimental/goal-templates.md b/docs/experimental/goal-templates.md index f3d7928de..92f807b3d 100644 --- a/docs/experimental/goal-templates.md +++ b/docs/experimental/goal-templates.md @@ -437,7 +437,7 @@ All of the examples below use the case of 100 leftover when the remainder pass i ### Goal Directive -This option is unique enough to warrant its own directive `#goal` instead of the standard `#template` option. +This option is unique enough to warrant its own directive, `#goal`, instead of the standard `#template` option. The `#goal` option overrides how the goal indicator typically functions. In the standard `#templates`, the goal indication colors are based on the current month's budgeted value. When using the `#goal` option, the indication is based on the total balance.