diff --git a/packages/loot-core/src/server/budget/goaltemplates.js b/packages/loot-core/src/server/budget/goaltemplates.js index 67ecd5c3f124f9c04bc3575374aea2775f2f7c17..c09253588c7629df83a3b062c2bf74a729ed7fde 100644 --- a/packages/loot-core/src/server/budget/goaltemplates.js +++ b/packages/loot-core/src/server/budget/goaltemplates.js @@ -207,6 +207,9 @@ async function applyCategoryTemplate(category, template_lines, month, force) { let spent = await getSheetValue(sheetName, `sum-amount-${category.id}`); let balance = await getSheetValue(sheetName, `leftover-${category.id}`); let last_month_balance = balance - spent - budgeted; + let totalTarget = 0; + let totalMonths = 0; + let skipMonths = 0; for (let l = 0; l < template_lines.length; l++) { let template = template_lines[l]; switch (template.type) { @@ -230,8 +233,8 @@ async function applyCategoryTemplate(category, template_lines, month, force) { } case 'by': { // by has 'amount' and 'month' params - let target_month = new Date(`${template.month}-01`); - let target = amountToInteger(template.amount); + let N = template_lines.length; + let target_month = new Date(`${template_lines[l].month}-01`); let num_months = differenceInCalendarMonths( target_month, current_month, @@ -242,11 +245,24 @@ async function applyCategoryTemplate(category, template_lines, month, force) { : (template.repeat || 1) * 12; while (num_months < 0 && repeat) { target_month = addMonths(target_month, repeat); - num_months = differenceInCalendarMonths(target_month, current_month); + num_months = differenceInCalendarMonths( + template_lines[l], + current_month, + ); } - let diff = target - last_month_balance; - if (diff >= 0 && num_months > -1) { - to_budget += Math.round(diff / (num_months + 1)); + if (num_months < 0) { + skipMonths++; + } else { + totalTarget += amountToInteger(template_lines[l].amount); + totalMonths += num_months + 1; + } + + let diff = totalTarget - last_month_balance; + if (diff >= 0 && totalMonths > 0 && l === N - 1) { + to_budget += Math.round( + ((totalTarget - last_month_balance) / totalMonths) * + (N - skipMonths), + ); } break; } diff --git a/upcoming-release-notes/879.md b/upcoming-release-notes/879.md new file mode 100644 index 0000000000000000000000000000000000000000..1fd38d297bad379a0d8f1d6017d591e5b057ff7e --- /dev/null +++ b/upcoming-release-notes/879.md @@ -0,0 +1,6 @@ +--- +category: Enhancements +authors: [shall0pass] +--- + +Goal templates: Changed how compounding 'by' matches are filled. Now uses an average across templates.