From 45756169618eaa8e20c02fce072666b77af404ce Mon Sep 17 00:00:00 2001
From: youngcw <calebyoung94@gmail.com>
Date: Fri, 12 Jul 2024 07:05:05 -0700
Subject: [PATCH] [Goals]: don't reset goals when using "apply template"
 (#3011)

* fix apply budget

* un change

* note

* lint
---
 .../src/server/budget/goaltemplates.ts        | 26 +++++++++++--------
 upcoming-release-notes/3011.md                |  6 +++++
 2 files changed, 21 insertions(+), 11 deletions(-)
 create mode 100644 upcoming-release-notes/3011.md

diff --git a/packages/loot-core/src/server/budget/goaltemplates.ts b/packages/loot-core/src/server/budget/goaltemplates.ts
index aed1be666..65fa4685e 100644
--- a/packages/loot-core/src/server/budget/goaltemplates.ts
+++ b/packages/loot-core/src/server/budget/goaltemplates.ts
@@ -19,14 +19,12 @@ import { goalsWeek } from './goals/goalsWeek';
 export async function applyTemplate({ month }) {
   await storeTemplates();
   const category_templates = await getTemplates(null);
-  await resetCategoryTargets({ month, category: null });
   return processTemplate(month, false, category_templates);
 }
 
 export async function overwriteTemplate({ month }) {
   await storeTemplates();
   const category_templates = await getTemplates(null);
-  await resetCategoryTargets({ month, category: null });
   return processTemplate(month, true, category_templates);
 }
 
@@ -36,8 +34,7 @@ export async function applySingleCategoryTemplate({ month, category }) {
   ]);
   await storeTemplates();
   const category_templates = await getTemplates(categories[0]);
-  await resetCategoryTargets({ month, category: categories });
-  return processTemplate(month, true, category_templates);
+  return processTemplate(month, true, category_templates, categories[0]);
 }
 
 export function runCheckTemplates() {
@@ -91,21 +88,21 @@ async function setCategoryTargets({ month, idealTemplate }) {
   });
 }
 
-async function resetCategoryTargets({ month, category }) {
-  let categories;
+async function resetCategoryTargets(month, category) {
+  let categories = [];
   if (category === null) {
     categories = await getCategories();
   } else {
     categories = category;
   }
   await batchMessages(async () => {
-    categories.forEach(element => {
+    for (let i = 0; i < categories.length; i++) {
       setGoal({
-        category: element.id,
+        category: categories[i].id,
         goal: null,
         month,
       });
-    });
+    }
   });
 }
 
@@ -155,6 +152,7 @@ async function processTemplate(
   month,
   force,
   category_templates,
+  category?,
 ): Promise<Notification> {
   let num_applied = 0;
   let errors = [];
@@ -162,8 +160,13 @@ async function processTemplate(
   const setToZero = [];
   let priority_list = [];
 
-  const categories = await getCategories();
+  let categories = [];
   const categories_remove = [];
+  if (category) {
+    categories[0] = category;
+  } else {
+    categories = await getCategories();
+  }
 
   //clears templated categories
   for (let c = 0; c < categories.length; c++) {
@@ -205,11 +208,12 @@ async function processTemplate(
     categories.splice(categories_remove[i], 1);
   }
 
-  // zero out the categories that need it
+  // zero out budget and goal from categories that need it
   await setGoalBudget({
     month,
     templateBudget: setToZero.filter(f => f.isTemplate === true),
   });
+  await resetCategoryTargets(month, categories);
 
   // sort and filter down to just the requested priorities
   priority_list = priority_list
diff --git a/upcoming-release-notes/3011.md b/upcoming-release-notes/3011.md
new file mode 100644
index 000000000..101af143f
--- /dev/null
+++ b/upcoming-release-notes/3011.md
@@ -0,0 +1,6 @@
+---
+category: Bugfix
+authors: [youngcw]
+---
+
+Fix apply template resetting the goals on already set categories
-- 
GitLab