From 77e550f0284514b1486837499ecddf6a4731d160 Mon Sep 17 00:00:00 2001
From: youngcw <calebyoung94@gmail.com>
Date: Mon, 18 Dec 2023 07:58:49 -0700
Subject: [PATCH] [Goals]: fully skip budgeted categories when only applying
 (#2099)

* remove budgeted categories from list when only applying

* cleanup

* speed up the category removal

* note
---
 .../src/server/budget/goaltemplates.ts        | 62 +++++++------------
 upcoming-release-notes/2099.md                |  6 ++
 2 files changed, 28 insertions(+), 40 deletions(-)
 create mode 100644 upcoming-release-notes/2099.md

diff --git a/packages/loot-core/src/server/budget/goaltemplates.ts b/packages/loot-core/src/server/budget/goaltemplates.ts
index 31ea0406b..45d8fcb4d 100644
--- a/packages/loot-core/src/server/budget/goaltemplates.ts
+++ b/packages/loot-core/src/server/budget/goaltemplates.ts
@@ -151,12 +151,12 @@ async function processTemplate(
 ): Promise<Notification> {
   let num_applied = 0;
   let errors = [];
-  let originalCategoryBalance = [];
   const idealTemplate = [];
   const setToZero = [];
   let priority_list = [];
 
   const categories = await getCategories();
+  const categories_remove = [];
 
   //clears templated categories
   for (let c = 0; c < categories.length; c++) {
@@ -176,20 +176,29 @@ async function processTemplate(
       }
     }
     if (budgeted) {
-      originalCategoryBalance.push({
-        category: category.id,
-        amount: budgeted,
-        isIncome: category.is_income,
-        isTemplate: template ? true : false,
-      });
-      setToZero.push({
-        category: category.id,
-        amount: 0,
-        isIncome: category.is_income,
-        isTemplate: template ? true : false,
-      });
+      if (!force) {
+        // save index of category to remove
+        categories_remove.push(c);
+      } else {
+        // if we are overwritting add this category to list to zero
+        setToZero.push({
+          category: category.id,
+          amount: 0,
+          isIncome: category.is_income,
+          isTemplate: template ? true : false,
+        });
+      }
     }
   }
+
+  // remove the categories we are skipping
+  // Go backwards through the list so the indexes don't change
+  // on the categories we need
+  for (let i = categories_remove.length - 1; i >= 0; i--) {
+    categories.splice(categories_remove[i], 1);
+  }
+
+  // zero out the categories that need it
   await setGoalBudget({
     month,
     templateBudget: setToZero.filter(f => f.isTemplate === true),
@@ -339,33 +348,6 @@ async function processTemplate(
     await setGoalBudget({ month, templateBudget });
   }
   await setCategoryTargets({ month, idealTemplate });
-  if (!force) {
-    //if overwrite is not preferred, set cell to original value;
-    originalCategoryBalance = originalCategoryBalance.filter(
-      c => c.isIncome === 0 && c.isTemplate,
-    );
-    for (let l = 0; l < originalCategoryBalance.length; l++) {
-      await setBudget({
-        category: originalCategoryBalance[l].category,
-        month,
-        amount: originalCategoryBalance[l].amount,
-      });
-      //if overwrite is not preferred, remove template errors for category
-      let j = errors.length;
-      for (let k = 0; k < j; k++) {
-        if (
-          errors[k].includes(
-            categories.filter(
-              c => c.id === originalCategoryBalance[l].category,
-            )[0].name,
-          )
-        ) {
-          errors.splice(k, 1);
-          j--;
-        }
-      }
-    }
-  }
   if (num_applied === 0) {
     if (errors.length) {
       return {
diff --git a/upcoming-release-notes/2099.md b/upcoming-release-notes/2099.md
new file mode 100644
index 000000000..6482c922b
--- /dev/null
+++ b/upcoming-release-notes/2099.md
@@ -0,0 +1,6 @@
+---
+category: Bugfix
+authors: [youngcw]
+---
+
+[Goals]: Fix over budget condition with using apply instead of overwrite
-- 
GitLab