From 12719e3049eae27bf0f2b2f4de94966430bd27a8 Mon Sep 17 00:00:00 2001
From: lelemm <lelemm@gmail.com>
Date: Wed, 12 Jun 2024 11:50:39 -0300
Subject: [PATCH] FIX: For Report Budget, the income categories are negative
 when using 'Set budgets to 3 month average' (#2862)

* FIX: For Report Budget, the income categories are negative when using 'Set budgets to 3 month average'. This fix solves this issue

* added 2862.md

* Ajustments for category menu not closing properly and fix to negative values for income category copy budget

* fix lint

* changed variable name without changing references after lint ajust

* retrigger checks

* smaller 2862.md
---
 .../budget/report/ReportComponents.tsx        |  3 +++
 .../loot-core/src/server/budget/actions.ts    | 23 +++++++++++++++----
 upcoming-release-notes/2862.md                |  6 +++++
 3 files changed, 28 insertions(+), 4 deletions(-)
 create mode 100644 upcoming-release-notes/2862.md

diff --git a/packages/desktop-client/src/components/budget/report/ReportComponents.tsx b/packages/desktop-client/src/components/budget/report/ReportComponents.tsx
index a9f1d8c6f..eabfebb1e 100644
--- a/packages/desktop-client/src/components/budget/report/ReportComponents.tsx
+++ b/packages/desktop-client/src/components/budget/report/ReportComponents.tsx
@@ -228,6 +228,7 @@ export const CategoryMonth = memo(function CategoryMonth({
                   onBudgetAction?.(month, 'copy-single-last', {
                     category: category.id,
                   });
+                  setMenuOpen(false);
                 }}
                 onSetMonthsAverage={numberOfMonths => {
                   if (
@@ -241,11 +242,13 @@ export const CategoryMonth = memo(function CategoryMonth({
                   onBudgetAction?.(month, `set-single-${numberOfMonths}-avg`, {
                     category: category.id,
                   });
+                  setMenuOpen(false);
                 }}
                 onApplyBudgetTemplate={() => {
                   onBudgetAction?.(month, 'apply-single-category-template', {
                     category: category.id,
                   });
+                  setMenuOpen(false);
                 }}
               />
             </Popover>
diff --git a/packages/loot-core/src/server/budget/actions.ts b/packages/loot-core/src/server/budget/actions.ts
index 2b02a4527..ce388edd4 100644
--- a/packages/loot-core/src/server/budget/actions.ts
+++ b/packages/loot-core/src/server/budget/actions.ts
@@ -258,8 +258,13 @@ export async function set3MonthAvg({
         'sum-amount-' + cat.id,
       );
 
-      const avg = Math.round((spent1 + spent2 + spent3) / 3);
-      setBudget({ category: cat.id, month, amount: -avg });
+      let avg = Math.round((spent1 + spent2 + spent3) / 3);
+
+      if (cat.is_income === 0) {
+        avg *= -1;
+      }
+
+      setBudget({ category: cat.id, month, amount: avg });
     }
   });
 }
@@ -273,6 +278,11 @@ export async function setNMonthAvg({
   N: number;
   category: string;
 }): Promise<void> {
+  const categoryFromDb = await db.first(
+    'SELECT is_income FROM v_categories WHERE id = ?',
+    [category],
+  );
+
   let prevMonth = monthUtils.prevMonth(month);
   let sumAmount = 0;
   for (let l = 0; l < N; l++) {
@@ -283,8 +293,13 @@ export async function setNMonthAvg({
     prevMonth = monthUtils.prevMonth(prevMonth);
   }
   await batchMessages(async () => {
-    const avg = Math.round(sumAmount / N);
-    setBudget({ category, month, amount: -avg });
+    let avg = Math.round(sumAmount / N);
+
+    if (categoryFromDb.is_income === 0) {
+      avg *= -1;
+    }
+
+    setBudget({ category, month, amount: avg });
   });
 }
 
diff --git a/upcoming-release-notes/2862.md b/upcoming-release-notes/2862.md
new file mode 100644
index 000000000..b46539fce
--- /dev/null
+++ b/upcoming-release-notes/2862.md
@@ -0,0 +1,6 @@
+---
+category: Bugfix
+authors: [lelemm]
+---
+
+For Report Budget, income categories were incorrectly showing as negative when using 'Set budgets to 3 month average'.
-- 
GitLab