@mx-cartographer/experiences 9.4.1 → 9.4.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (59) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/dist/budgets/BubbleBudgetsWidget.es.js +29 -29
  3. package/dist/budgets/BubbleBudgetsWidget.es.js.map +1 -1
  4. package/dist/budgets/components/AddBudgets.es.js +16 -13
  5. package/dist/budgets/components/AddBudgets.es.js.map +1 -1
  6. package/dist/budgets/components/BudgetDetailsDrawer.es.js +129 -91
  7. package/dist/budgets/components/BudgetDetailsDrawer.es.js.map +1 -1
  8. package/dist/budgets/components/BudgetDetailsDrawerV2.es.js +16 -13
  9. package/dist/budgets/components/BudgetDetailsDrawerV2.es.js.map +1 -1
  10. package/dist/budgets/components/addbudget/RecalculateBudgets.es.js +14 -11
  11. package/dist/budgets/components/addbudget/RecalculateBudgets.es.js.map +1 -1
  12. package/dist/budgets/components/budgetdetails/AddSubBudget.es.js +58 -55
  13. package/dist/budgets/components/budgetdetails/AddSubBudget.es.js.map +1 -1
  14. package/dist/budgets/components/budgetdetails/BudgetDetails.es.js +8 -5
  15. package/dist/budgets/components/budgetdetails/BudgetDetails.es.js.map +1 -1
  16. package/dist/budgets/components/budgetdetails/SubBudgetAmounts.d.ts +9 -0
  17. package/dist/budgets/components/budgetdetails/SubBudgetAmounts.es.js +69 -0
  18. package/dist/budgets/components/budgetdetails/SubBudgetAmounts.es.js.map +1 -0
  19. package/dist/budgets/components/budgetdetails/SubBudgetList.es.js +68 -55
  20. package/dist/budgets/components/budgetdetails/SubBudgetList.es.js.map +1 -1
  21. package/dist/budgets/components/budgetlist/BudgetRow.es.js +15 -26
  22. package/dist/budgets/components/budgetlist/BudgetRow.es.js.map +1 -1
  23. package/dist/budgets/components/budgetlist/SubBudgetRow.es.js +12 -55
  24. package/dist/budgets/components/budgetlist/SubBudgetRow.es.js.map +1 -1
  25. package/dist/budgets/components/shared/BudgetAmount.es.js +14 -15
  26. package/dist/budgets/components/shared/BudgetAmount.es.js.map +1 -1
  27. package/dist/budgets/components/shared/BudgetDonut.d.ts +8 -0
  28. package/dist/budgets/components/shared/BudgetDonut.es.js +25 -0
  29. package/dist/budgets/components/shared/BudgetDonut.es.js.map +1 -0
  30. package/dist/budgets/components/shared/SubBudgetCategory.d.ts +7 -0
  31. package/dist/budgets/components/shared/SubBudgetCategory.es.js +45 -0
  32. package/dist/budgets/components/shared/SubBudgetCategory.es.js.map +1 -0
  33. package/dist/core/constants/repeatingTransactions.d.ts +6 -0
  34. package/dist/core/constants/repeatingTransactions.es.js +18 -3
  35. package/dist/core/constants/repeatingTransactions.es.js.map +1 -1
  36. package/dist/core/stores/BudgetsStore.d.ts +13 -4
  37. package/dist/core/stores/BudgetsStore.es.js +40 -38
  38. package/dist/core/stores/BudgetsStore.es.js.map +1 -1
  39. package/dist/core/types/RepeatingTransaction.d.ts +2 -0
  40. package/dist/core/types/RepeatingTransaction.es.js.map +1 -1
  41. package/dist/core/types/Transaction.d.ts +1 -0
  42. package/dist/core/types/Transaction.es.js.map +1 -1
  43. package/dist/core/types/localization/BudgetsCopy.d.ts +3 -0
  44. package/dist/core/utils/BudgetUtil.d.ts +1 -0
  45. package/dist/core/utils/BudgetUtil.es.js +55 -51
  46. package/dist/core/utils/BudgetUtil.es.js.map +1 -1
  47. package/dist/core/utils/RecurringTransactionsUtil.d.ts +1 -0
  48. package/dist/core/utils/RecurringTransactionsUtil.es.js +145 -143
  49. package/dist/core/utils/RecurringTransactionsUtil.es.js.map +1 -1
  50. package/dist/core/utils/TransactionUtils.d.ts +1 -0
  51. package/dist/recurringtransactions/components/shared/recurringsettings/AddRecurringTransaction.es.js +16 -14
  52. package/dist/recurringtransactions/components/shared/recurringsettings/AddRecurringTransaction.es.js.map +1 -1
  53. package/dist/recurringtransactions/components/shared/recurringsettings/SelectTransaction.es.js +19 -17
  54. package/dist/recurringtransactions/components/shared/recurringsettings/SelectTransaction.es.js.map +1 -1
  55. package/dist/transactions/components/shared/TransactionList.es.js +16 -12
  56. package/dist/transactions/components/shared/TransactionList.es.js.map +1 -1
  57. package/dist/transactions/components/shared/transactiondetails/actions/AddMerchantBudgetAction.es.js +85 -82
  58. package/dist/transactions/components/shared/transactiondetails/actions/AddMerchantBudgetAction.es.js.map +1 -1
  59. package/package.json +1 -1
@@ -5,7 +5,10 @@ import { Budget, Category, DateRange, DetailedBudget, DetailedCategory, Merchant
5
5
  export declare class BudgetsStore {
6
6
  api: BudgetsApi;
7
7
  globalStore: GlobalStore;
8
- alert: string;
8
+ alert: {
9
+ msg: string;
10
+ severity: 'success' | 'error';
11
+ } | null;
9
12
  dateRange: DateRange;
10
13
  budgets: Budget[];
11
14
  selectedBudget: DetailedBudget | undefined;
@@ -20,9 +23,15 @@ export declare class BudgetsStore {
20
23
  get unbudgetedCategories(): DetailedCategory[];
21
24
  get totalBudgeted(): number;
22
25
  addBudget: (category: Category, amount: number, parentGuid?: string | null) => Promise<void>;
23
- deleteBudget: (guid: string) => Promise<void>;
26
+ deleteBudget: (guid: string) => Promise<boolean>;
24
27
  loadBudgets: () => Promise<void>;
25
- setAlert: (alert: string) => string;
28
+ setAlert: (alert: {
29
+ msg: string;
30
+ severity: "success" | "error";
31
+ } | null) => {
32
+ msg: string;
33
+ severity: "success" | "error";
34
+ } | null;
26
35
  setBudgets: (budgets: Budget[]) => void;
27
36
  setDateRange: (dateRange: DateRange) => DateRange;
28
37
  setSelectedBudget: (budget: DetailedBudget | undefined) => DetailedBudget | undefined;
@@ -36,7 +45,7 @@ export declare class BudgetsStore {
36
45
  data: Budget[];
37
46
  isSuccess: boolean;
38
47
  }>;
39
- updateBudget: (budget: Budget) => Promise<void>;
48
+ updateBudget: (budget: Budget) => Promise<boolean>;
40
49
  getMerchantBudgetByMerchantGuid: (merchantGuid: string) => MerchantBudget | undefined;
41
50
  setMerchantBudgets: (merchantBudgets: MerchantBudget[]) => void;
42
51
  addMerchantBudget: (merchantGuid: string, amount: number) => Promise<{
@@ -1,18 +1,18 @@
1
- import { CategoryGuids as i } from "../constants/Category.es.js";
2
- import { BudgetsApi as o } from "../api/BudgetsApi.es.js";
3
- import { upsertByGuid as u } from "../utils/upsertByGuid.es.js";
4
- import { augmentBudgets as g, findBudget as h, findSubBudget as l } from "../utils/BudgetUtil.es.js";
1
+ import { CategoryGuids as o } from "../constants/Category.es.js";
2
+ import { BudgetsApi as g } from "../api/BudgetsApi.es.js";
3
+ import { upsertByGuid as n } from "../utils/upsertByGuid.es.js";
4
+ import { augmentBudgets as c, findBudget as h, findSubBudget as p } from "../utils/BudgetUtil.es.js";
5
5
  import { endOfMonth as B } from "date-fns/endOfMonth";
6
- import { startOfMonth as p } from "date-fns/startOfMonth";
7
- import { startOfToday as n } from "date-fns/startOfToday";
8
- import { makeAutoObservable as b, reaction as S, runInAction as d } from "mobx";
9
- var _ = class {
10
- api = new o("/", "");
6
+ import { startOfMonth as f } from "date-fns/startOfMonth";
7
+ import { startOfToday as l } from "date-fns/startOfToday";
8
+ import { makeAutoObservable as S, reaction as b, runInAction as i } from "mobx";
9
+ var A = class {
10
+ api = new g("/", "");
11
11
  globalStore;
12
- alert = "";
12
+ alert = null;
13
13
  dateRange = {
14
- start: p(n()),
15
- end: B(n())
14
+ start: f(l()),
15
+ end: B(l())
16
16
  };
17
17
  budgets = [];
18
18
  selectedBudget;
@@ -21,23 +21,23 @@ var _ = class {
21
21
  theme = {};
22
22
  merchantBudgets = [];
23
23
  constructor(t) {
24
- this.globalStore = t, this.api = new o(t.endpoint, t.sessionToken, t.onError), b(this);
24
+ this.globalStore = t, this.api = new g(t.endpoint, t.sessionToken, t.onError), S(this);
25
25
  }
26
26
  loadBudgetData = async () => {
27
- this.globalStore.recurringTransactionsStore.isDataLoaded || await this.globalStore.recurringTransactionsStore.loadRepeatingTransactionData(), await this.loadBudgets(), S(() => this.detailedBudgets, (t) => {
27
+ this.globalStore.recurringTransactionsStore.isDataLoaded || await this.globalStore.recurringTransactionsStore.loadRepeatingTransactionData(), await this.loadBudgets(), b(() => this.detailedBudgets, (t) => {
28
28
  if (t) {
29
29
  const e = this.selectedBudget;
30
30
  e && (this.selectedBudget = h(t, e.guid));
31
31
  const r = this.selectedSubBudget;
32
- r && r.parent_guid && (this.selectedSubBudget = l(t, r.guid, r.parent_guid));
32
+ r && r.parent_guid && (this.selectedSubBudget = p(t, r.guid, r.parent_guid));
33
33
  }
34
34
  });
35
35
  };
36
36
  get detailedBudgets() {
37
- return g(this.budgets.filter((t) => t.category_guid !== i.INCOME && t.category_guid !== i.TRANSFER && t.category_guid !== i.INVESTMENTS), this.globalStore.categoryStore.detailedCategories, this.globalStore.copyStore.copy.budgets, this.theme).sort((t, e) => t.percentage > e.percentage ? -1 : t.percentage < e.percentage ? 1 : 0);
37
+ return c(this.budgets.filter((t) => t.category_guid !== o.INCOME && t.category_guid !== o.TRANSFER && t.category_guid !== o.INVESTMENTS), this.globalStore.categoryStore.detailedCategories, this.globalStore.copyStore.copy.budgets, this.theme).sort((t, e) => t.percentage > e.percentage ? -1 : t.percentage < e.percentage ? 1 : 0);
38
38
  }
39
39
  get incomeBudget() {
40
- return g(this.budgets.filter((t) => !t.parent_guid), this.globalStore.categoryStore.detailedCategories, this.globalStore.copyStore.copy.budgets, this.theme).reduce((t, e) => e.category_guid !== i.INCOME ? t : !t || e.percentage > t.percentage ? e : t, void 0)?.amount;
40
+ return c(this.budgets.filter((t) => !t.parent_guid), this.globalStore.categoryStore.detailedCategories, this.globalStore.copyStore.copy.budgets, this.theme).reduce((t, e) => e.category_guid !== o.INCOME ? t : !t || e.percentage > t.percentage ? e : t, void 0)?.amount;
41
41
  }
42
42
  get unbudgetedCategories() {
43
43
  return this.globalStore.categoryStore.spendCategories.filter((t) => !this.detailedBudgets.find((e) => e.category_guid === t.guid));
@@ -48,22 +48,24 @@ var _ = class {
48
48
  addBudget = async (t, e, r = null) => {
49
49
  try {
50
50
  const s = await this.api.addBudget(t, e, r);
51
- d(() => {
52
- this.budgets = u(this.budgets, s);
51
+ i(() => {
52
+ this.budgets = n(this.budgets, s);
53
53
  });
54
54
  } catch (s) {
55
55
  console.error("Error adding budget:", s), this.globalStore.captureException(s, { store: "BudgetsStore" });
56
56
  }
57
57
  };
58
58
  deleteBudget = async (t) => {
59
- try {
60
- await this.api.deleteBudget(t), d(() => {
61
- const e = this.budgets.findIndex((r) => r.guid === t);
62
- e >= 0 && this.budgets.splice(e, 1);
63
- });
64
- } catch (e) {
65
- console.error("Error deleting budget:", e), this.globalStore.captureException(e, { store: "BudgetsStore" });
66
- }
59
+ const e = [t, ...this.budgets.filter((a) => a.parent_guid === t).map((a) => a.guid)], r = await Promise.allSettled(e.map((a) => this.api.deleteBudget(a))), s = new Set(e.filter((a, u) => r[u].status === "fulfilled"));
60
+ i(() => {
61
+ this.budgets = this.budgets.filter((a) => !s.has(a.guid));
62
+ });
63
+ let d = !1;
64
+ for (const [a, u] of r.entries()) u.status === "rejected" && (d = !0, console.error("Error deleting budget:", u.reason), this.globalStore.captureException(u.reason, {
65
+ store: "BudgetsStore",
66
+ guid: e[a]
67
+ }));
68
+ return !d;
67
69
  };
68
70
  loadBudgets = async () => {
69
71
  try {
@@ -84,7 +86,7 @@ var _ = class {
84
86
  recalculateBudgets = async (t) => {
85
87
  try {
86
88
  for (const r of t) {
87
- const s = this.budgets.find((a) => a.category_guid === r.guid);
89
+ const s = this.budgets.find((d) => d.category_guid === r.guid);
88
90
  s ? await this.api.updateBudget({
89
91
  ...s,
90
92
  amount: r.totalAverageAmount
@@ -106,12 +108,12 @@ var _ = class {
106
108
  updateBudget = async (t) => {
107
109
  try {
108
110
  const e = await this.api.updateBudget(t);
109
- d(() => {
111
+ return i(() => {
110
112
  const r = this.budgets.findIndex((s) => s.guid === t.guid);
111
113
  r >= 0 && (this.budgets[r] = e);
112
- });
114
+ }), !0;
113
115
  } catch (e) {
114
- console.error("Error updating budget:", e), this.globalStore.captureException(e, { store: "BudgetsStore" });
116
+ return console.error("Error updating budget:", e), this.globalStore.captureException(e, { store: "BudgetsStore" }), !1;
115
117
  }
116
118
  };
117
119
  getMerchantBudgetByMerchantGuid = (t) => this.merchantBudgets.find((e) => e?.merchant_guid === t);
@@ -121,8 +123,8 @@ var _ = class {
121
123
  addMerchantBudget = async (t, e) => {
122
124
  try {
123
125
  const r = await this.api.addMerchantBudget(t, e);
124
- return d(() => {
125
- this.merchantBudgets = u(this.merchantBudgets, r);
126
+ return i(() => {
127
+ this.merchantBudgets = n(this.merchantBudgets, r);
126
128
  }), { isSuccess: !0 };
127
129
  } catch (r) {
128
130
  return console.error("Error adding merchant budget:", r), this.globalStore.captureException(r, { store: "BudgetsStore" }), { isSuccess: !1 };
@@ -131,9 +133,9 @@ var _ = class {
131
133
  updateMerchantBudget = async (t) => {
132
134
  try {
133
135
  const { guid: e, amount: r } = t, s = await this.api.updateMerchantBudget(e, r);
134
- return d(() => {
135
- const a = this.merchantBudgets.findIndex((c) => c.guid === t.guid);
136
- a >= 0 && (this.merchantBudgets[a] = s);
136
+ return i(() => {
137
+ const d = this.merchantBudgets.findIndex((a) => a.guid === t.guid);
138
+ d >= 0 && (this.merchantBudgets[d] = s);
137
139
  }), { isSuccess: !0 };
138
140
  } catch (e) {
139
141
  return console.error("Error updating merchant budget:", e), this.globalStore.captureException(e, { store: "BudgetsStore" }), { isSuccess: !1 };
@@ -141,7 +143,7 @@ var _ = class {
141
143
  };
142
144
  deleteMerchantBudget = async (t) => {
143
145
  try {
144
- return await this.api.deleteMerchantBudget(t), d(() => {
146
+ return await this.api.deleteMerchantBudget(t), i(() => {
145
147
  this.merchantBudgets = this.merchantBudgets.filter((e) => e.guid !== t);
146
148
  }), { isSuccess: !0 };
147
149
  } catch (e) {
@@ -150,7 +152,7 @@ var _ = class {
150
152
  };
151
153
  };
152
154
  export {
153
- _ as BudgetsStore
155
+ A as BudgetsStore
154
156
  };
155
157
 
156
158
  //# sourceMappingURL=BudgetsStore.es.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"BudgetsStore.es.js","names":[],"sources":["../../../src/core/stores/BudgetsStore.ts"],"sourcesContent":["import { makeAutoObservable, reaction, runInAction } from 'mobx'\n\nimport { endOfMonth } from 'date-fns/endOfMonth'\nimport { startOfMonth } from 'date-fns/startOfMonth'\nimport { startOfToday } from 'date-fns/startOfToday'\n\nimport { Theme } from '@mui/system'\n\nimport { BudgetsApi } from '../api'\nimport { upsertByGuid } from '../utils/upsertByGuid'\nimport { CategoryGuids } from '../constants'\nimport { augmentBudgets, findBudget, findSubBudget } from '../utils/BudgetUtil'\n\nimport { GlobalStore } from './GlobalStore'\n\nimport type {\n Budget,\n Category,\n DateRange,\n DetailedBudget,\n DetailedCategory,\n MerchantBudget,\n} from '../types'\n\nexport class BudgetsStore {\n api: BudgetsApi = new BudgetsApi('/', '')\n\n globalStore: GlobalStore\n\n alert: string = ''\n dateRange: DateRange = { start: startOfMonth(startOfToday()), end: endOfMonth(startOfToday()) }\n budgets: Budget[] = []\n selectedBudget: DetailedBudget | undefined\n selectedSubBudget: DetailedBudget | undefined\n isDataLoaded = false\n theme = {} as Theme\n merchantBudgets: MerchantBudget[] = []\n\n constructor(globalStore: GlobalStore) {\n this.globalStore = globalStore\n this.api = new BudgetsApi(globalStore.endpoint, globalStore.sessionToken, globalStore.onError)\n\n makeAutoObservable(this)\n }\n\n loadBudgetData = async () => {\n if (!this.globalStore.recurringTransactionsStore.isDataLoaded) {\n await this.globalStore.recurringTransactionsStore.loadRepeatingTransactionData()\n }\n await this.loadBudgets()\n\n /** Reaction to update the selected budget/sub-budget if detailedBudgets is updated **/\n reaction(\n () => this.detailedBudgets,\n (detailedBudgets) => {\n if (detailedBudgets) {\n const budget = this.selectedBudget\n if (budget) {\n this.selectedBudget = findBudget(detailedBudgets, budget.guid)\n }\n\n const subBudget = this.selectedSubBudget\n if (subBudget && subBudget.parent_guid) {\n this.selectedSubBudget = findSubBudget(\n detailedBudgets,\n subBudget.guid,\n subBudget.parent_guid,\n )\n }\n }\n },\n )\n }\n\n get detailedBudgets(): DetailedBudget[] {\n return augmentBudgets(\n this.budgets.filter(\n (budget: Budget) =>\n budget.category_guid !== CategoryGuids.INCOME &&\n budget.category_guid !== CategoryGuids.TRANSFER &&\n budget.category_guid !== CategoryGuids.INVESTMENTS,\n ),\n this.globalStore.categoryStore.detailedCategories,\n this.globalStore.copyStore.copy.budgets,\n this.theme,\n ).sort((a, b) => {\n if (a.percentage > b.percentage) return -1\n if (a.percentage < b.percentage) return 1\n return 0\n })\n }\n\n // TODO: Replace this with income from recurring transactions. Income budgets are deprecated.\n get incomeBudget(): number | undefined {\n const filteredBudgets = augmentBudgets(\n this.budgets.filter((budget: Budget) => !budget.parent_guid),\n this.globalStore.categoryStore.detailedCategories,\n this.globalStore.copyStore.copy.budgets,\n this.theme,\n )\n\n const incomeBudget = filteredBudgets.reduce(\n (acc, curr) => {\n if (curr.category_guid !== CategoryGuids.INCOME) return acc\n if (!acc || curr.percentage > acc.percentage) return curr\n return acc\n },\n undefined as DetailedBudget | undefined,\n )\n\n return incomeBudget?.amount\n }\n\n get unbudgetedCategories(): DetailedCategory[] {\n return this.globalStore.categoryStore.spendCategories.filter(\n (category) => !this.detailedBudgets.find((budget) => budget.category_guid === category.guid),\n )\n }\n\n get totalBudgeted(): number {\n return this.detailedBudgets.reduce((total, budget) => total + budget.amount, 0)\n }\n\n addBudget = async (category: Category, amount: number, parentGuid: string | null = null) => {\n try {\n const budget = await this.api.addBudget(category, amount, parentGuid)\n runInAction(() => {\n this.budgets = upsertByGuid(this.budgets, budget)\n })\n } catch (error) {\n console.error('Error adding budget:', error)\n this.globalStore.captureException(error, { store: 'BudgetsStore' })\n }\n }\n\n deleteBudget = async (guid: string) => {\n try {\n await this.api.deleteBudget(guid)\n\n runInAction(() => {\n const index = this.budgets.findIndex((budget) => budget.guid === guid)\n if (index >= 0) {\n this.budgets.splice(index, 1)\n }\n })\n } catch (error) {\n console.error('Error deleting budget:', error)\n this.globalStore.captureException(error, { store: 'BudgetsStore' })\n }\n }\n\n loadBudgets = async () => {\n try {\n const budgets = await this.api.getBudgets()\n this.setBudgets(budgets)\n } catch (error) {\n console.error('Error occurred while loading budgets:', error)\n this.globalStore.captureException(error, { store: 'BudgetsStore' })\n throw error\n }\n }\n\n setAlert = (alert: string) => (this.alert = alert)\n\n setBudgets = (budgets: Budget[]) => {\n this.budgets = budgets\n this.isDataLoaded = true\n }\n\n setDateRange = (dateRange: DateRange) => (this.dateRange = dateRange)\n\n setSelectedBudget = (budget: DetailedBudget | undefined) => (this.selectedBudget = budget)\n\n setSelectedSubBudget = (budget: DetailedBudget | undefined) => (this.selectedSubBudget = budget)\n\n setTheme = (theme: Theme) => (this.theme = theme)\n\n /**\n * Recalculate budget by using the average amount from top-level categories\n * @param categories Detailed categories\n */\n recalculateBudgets = async (categories: DetailedCategory[]) => {\n try {\n for (const category of categories) {\n const budget = this.budgets.find((budget) => budget.category_guid === category.guid)\n if (budget) {\n await this.api.updateBudget({\n ...budget,\n amount: category.totalAverageAmount,\n })\n } else {\n await this.api.addBudget(category, category.totalAverageAmount)\n }\n }\n const budgetsToDelete = this.budgets.filter(\n (budget) => !categories.find((c) => c.guid === budget.category_guid),\n )\n\n for (const budgetToDelete of budgetsToDelete) {\n await this.api.deleteBudget(budgetToDelete.guid)\n }\n\n await this.loadBudgets()\n\n return { data: this.budgets, isSuccess: true }\n } catch (error) {\n console.error('Error recalculating budgets:', error)\n this.globalStore.captureException(error, { store: 'BudgetsStore' })\n return { data: [], isSuccess: false }\n }\n }\n\n updateBudget = async (budget: Budget) => {\n try {\n const updatedBudget = await this.api.updateBudget(budget)\n\n runInAction(() => {\n const index = this.budgets.findIndex((b) => b.guid === budget.guid)\n if (index >= 0) {\n this.budgets[index] = updatedBudget\n }\n })\n } catch (error) {\n console.error('Error updating budget:', error)\n this.globalStore.captureException(error, { store: 'BudgetsStore' })\n }\n }\n\n getMerchantBudgetByMerchantGuid = (merchantGuid: string): MerchantBudget | undefined => {\n return this.merchantBudgets.find(\n (eachMerchantBudget) => eachMerchantBudget?.merchant_guid === merchantGuid,\n )\n }\n\n setMerchantBudgets = (merchantBudgets: MerchantBudget[]) => {\n this.merchantBudgets = merchantBudgets\n }\n\n addMerchantBudget = async (merchantGuid: string, amount: number) => {\n try {\n const newMerchantBudget = await this.api.addMerchantBudget(merchantGuid, amount)\n\n runInAction(() => {\n this.merchantBudgets = upsertByGuid(this.merchantBudgets, newMerchantBudget)\n })\n return { isSuccess: true }\n } catch (error) {\n console.error('Error adding merchant budget:', error)\n this.globalStore.captureException(error, { store: 'BudgetsStore' })\n return { isSuccess: false }\n }\n }\n\n updateMerchantBudget = async (merchantBudget: MerchantBudget) => {\n try {\n const { guid: merchantBudgetGuid, amount } = merchantBudget\n const updatedMerchantBudget = await this.api.updateMerchantBudget(merchantBudgetGuid, amount)\n\n runInAction(() => {\n const index = this.merchantBudgets.findIndex((b) => b.guid === merchantBudget.guid)\n if (index >= 0) {\n this.merchantBudgets[index] = updatedMerchantBudget\n }\n })\n return { isSuccess: true }\n } catch (error) {\n console.error('Error updating merchant budget:', error)\n this.globalStore.captureException(error, { store: 'BudgetsStore' })\n return { isSuccess: false }\n }\n }\n\n deleteMerchantBudget = async (merchantBudgetGuid: string) => {\n try {\n await this.api.deleteMerchantBudget(merchantBudgetGuid)\n\n runInAction(() => {\n this.merchantBudgets = this.merchantBudgets.filter((b) => b.guid !== merchantBudgetGuid)\n })\n return { isSuccess: true }\n } catch (error) {\n console.error('Error deleting merchant budget:', error)\n this.globalStore.captureException(error, { store: 'BudgetsStore' })\n return { isSuccess: false }\n }\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"BudgetsStore.es.js","names":[],"sources":["../../../src/core/stores/BudgetsStore.ts"],"sourcesContent":["import { makeAutoObservable, reaction, runInAction } from 'mobx'\n\nimport { endOfMonth } from 'date-fns/endOfMonth'\nimport { startOfMonth } from 'date-fns/startOfMonth'\nimport { startOfToday } from 'date-fns/startOfToday'\n\nimport { Theme } from '@mui/system'\n\nimport { BudgetsApi } from '../api'\nimport { upsertByGuid } from '../utils/upsertByGuid'\nimport { CategoryGuids } from '../constants'\nimport { augmentBudgets, findBudget, findSubBudget } from '../utils/BudgetUtil'\n\nimport { GlobalStore } from './GlobalStore'\n\nimport type {\n Budget,\n Category,\n DateRange,\n DetailedBudget,\n DetailedCategory,\n MerchantBudget,\n} from '../types'\n\nexport class BudgetsStore {\n api: BudgetsApi = new BudgetsApi('/', '')\n\n globalStore: GlobalStore\n\n alert: { msg: string; severity: 'success' | 'error' } | null = null\n dateRange: DateRange = { start: startOfMonth(startOfToday()), end: endOfMonth(startOfToday()) }\n budgets: Budget[] = []\n selectedBudget: DetailedBudget | undefined\n selectedSubBudget: DetailedBudget | undefined\n isDataLoaded = false\n theme = {} as Theme\n merchantBudgets: MerchantBudget[] = []\n\n constructor(globalStore: GlobalStore) {\n this.globalStore = globalStore\n this.api = new BudgetsApi(globalStore.endpoint, globalStore.sessionToken, globalStore.onError)\n\n makeAutoObservable(this)\n }\n\n loadBudgetData = async () => {\n if (!this.globalStore.recurringTransactionsStore.isDataLoaded) {\n await this.globalStore.recurringTransactionsStore.loadRepeatingTransactionData()\n }\n await this.loadBudgets()\n\n /** Reaction to update the selected budget/sub-budget if detailedBudgets is updated **/\n reaction(\n () => this.detailedBudgets,\n (detailedBudgets) => {\n if (detailedBudgets) {\n const budget = this.selectedBudget\n if (budget) {\n this.selectedBudget = findBudget(detailedBudgets, budget.guid)\n }\n\n const subBudget = this.selectedSubBudget\n if (subBudget && subBudget.parent_guid) {\n this.selectedSubBudget = findSubBudget(\n detailedBudgets,\n subBudget.guid,\n subBudget.parent_guid,\n )\n }\n }\n },\n )\n }\n\n get detailedBudgets(): DetailedBudget[] {\n return augmentBudgets(\n this.budgets.filter(\n (budget: Budget) =>\n budget.category_guid !== CategoryGuids.INCOME &&\n budget.category_guid !== CategoryGuids.TRANSFER &&\n budget.category_guid !== CategoryGuids.INVESTMENTS,\n ),\n this.globalStore.categoryStore.detailedCategories,\n this.globalStore.copyStore.copy.budgets,\n this.theme,\n ).sort((a, b) => {\n if (a.percentage > b.percentage) return -1\n if (a.percentage < b.percentage) return 1\n return 0\n })\n }\n\n // TODO: Replace this with income from recurring transactions. Income budgets are deprecated.\n get incomeBudget(): number | undefined {\n const filteredBudgets = augmentBudgets(\n this.budgets.filter((budget: Budget) => !budget.parent_guid),\n this.globalStore.categoryStore.detailedCategories,\n this.globalStore.copyStore.copy.budgets,\n this.theme,\n )\n\n const incomeBudget = filteredBudgets.reduce(\n (acc, curr) => {\n if (curr.category_guid !== CategoryGuids.INCOME) return acc\n if (!acc || curr.percentage > acc.percentage) return curr\n return acc\n },\n undefined as DetailedBudget | undefined,\n )\n\n return incomeBudget?.amount\n }\n\n get unbudgetedCategories(): DetailedCategory[] {\n return this.globalStore.categoryStore.spendCategories.filter(\n (category) => !this.detailedBudgets.find((budget) => budget.category_guid === category.guid),\n )\n }\n\n get totalBudgeted(): number {\n return this.detailedBudgets.reduce((total, budget) => total + budget.amount, 0)\n }\n\n addBudget = async (category: Category, amount: number, parentGuid: string | null = null) => {\n try {\n const budget = await this.api.addBudget(category, amount, parentGuid)\n runInAction(() => {\n this.budgets = upsertByGuid(this.budgets, budget)\n })\n } catch (error) {\n console.error('Error adding budget:', error)\n this.globalStore.captureException(error, { store: 'BudgetsStore' })\n }\n }\n\n deleteBudget = async (guid: string): Promise<boolean> => {\n const guids = [guid, ...this.budgets.filter((b) => b.parent_guid === guid).map((b) => b.guid)]\n const results = await Promise.allSettled(guids.map((g) => this.api.deleteBudget(g)))\n const deleted = new Set(guids.filter((_, i) => results[i].status === 'fulfilled'))\n runInAction(() => {\n this.budgets = this.budgets.filter((b) => !deleted.has(b.guid))\n })\n let failed = false\n for (const [i, r] of results.entries()) {\n if (r.status === 'rejected') {\n failed = true\n console.error('Error deleting budget:', r.reason)\n this.globalStore.captureException(r.reason, { store: 'BudgetsStore', guid: guids[i] })\n }\n }\n return !failed\n }\n\n loadBudgets = async () => {\n try {\n const budgets = await this.api.getBudgets()\n this.setBudgets(budgets)\n } catch (error) {\n console.error('Error occurred while loading budgets:', error)\n this.globalStore.captureException(error, { store: 'BudgetsStore' })\n throw error\n }\n }\n\n setAlert = (alert: { msg: string; severity: 'success' | 'error' } | null) => (this.alert = alert)\n\n setBudgets = (budgets: Budget[]) => {\n this.budgets = budgets\n this.isDataLoaded = true\n }\n\n setDateRange = (dateRange: DateRange) => (this.dateRange = dateRange)\n\n setSelectedBudget = (budget: DetailedBudget | undefined) => (this.selectedBudget = budget)\n\n setSelectedSubBudget = (budget: DetailedBudget | undefined) => (this.selectedSubBudget = budget)\n\n setTheme = (theme: Theme) => (this.theme = theme)\n\n /**\n * Recalculate budget by using the average amount from top-level categories\n * @param categories Detailed categories\n */\n recalculateBudgets = async (categories: DetailedCategory[]) => {\n try {\n for (const category of categories) {\n const budget = this.budgets.find((budget) => budget.category_guid === category.guid)\n if (budget) {\n await this.api.updateBudget({\n ...budget,\n amount: category.totalAverageAmount,\n })\n } else {\n await this.api.addBudget(category, category.totalAverageAmount)\n }\n }\n const budgetsToDelete = this.budgets.filter(\n (budget) => !categories.find((c) => c.guid === budget.category_guid),\n )\n\n for (const budgetToDelete of budgetsToDelete) {\n await this.api.deleteBudget(budgetToDelete.guid)\n }\n\n await this.loadBudgets()\n\n return { data: this.budgets, isSuccess: true }\n } catch (error) {\n console.error('Error recalculating budgets:', error)\n this.globalStore.captureException(error, { store: 'BudgetsStore' })\n return { data: [], isSuccess: false }\n }\n }\n\n updateBudget = async (budget: Budget): Promise<boolean> => {\n try {\n const updatedBudget = await this.api.updateBudget(budget)\n\n runInAction(() => {\n const index = this.budgets.findIndex((b) => b.guid === budget.guid)\n if (index >= 0) {\n this.budgets[index] = updatedBudget\n }\n })\n return true\n } catch (error) {\n console.error('Error updating budget:', error)\n this.globalStore.captureException(error, { store: 'BudgetsStore' })\n return false\n }\n }\n\n getMerchantBudgetByMerchantGuid = (merchantGuid: string): MerchantBudget | undefined => {\n return this.merchantBudgets.find(\n (eachMerchantBudget) => eachMerchantBudget?.merchant_guid === merchantGuid,\n )\n }\n\n setMerchantBudgets = (merchantBudgets: MerchantBudget[]) => {\n this.merchantBudgets = merchantBudgets\n }\n\n addMerchantBudget = async (merchantGuid: string, amount: number) => {\n try {\n const newMerchantBudget = await this.api.addMerchantBudget(merchantGuid, amount)\n\n runInAction(() => {\n this.merchantBudgets = upsertByGuid(this.merchantBudgets, newMerchantBudget)\n })\n return { isSuccess: true }\n } catch (error) {\n console.error('Error adding merchant budget:', error)\n this.globalStore.captureException(error, { store: 'BudgetsStore' })\n return { isSuccess: false }\n }\n }\n\n updateMerchantBudget = async (merchantBudget: MerchantBudget) => {\n try {\n const { guid: merchantBudgetGuid, amount } = merchantBudget\n const updatedMerchantBudget = await this.api.updateMerchantBudget(merchantBudgetGuid, amount)\n\n runInAction(() => {\n const index = this.merchantBudgets.findIndex((b) => b.guid === merchantBudget.guid)\n if (index >= 0) {\n this.merchantBudgets[index] = updatedMerchantBudget\n }\n })\n return { isSuccess: true }\n } catch (error) {\n console.error('Error updating merchant budget:', error)\n this.globalStore.captureException(error, { store: 'BudgetsStore' })\n return { isSuccess: false }\n }\n }\n\n deleteMerchantBudget = async (merchantBudgetGuid: string) => {\n try {\n await this.api.deleteMerchantBudget(merchantBudgetGuid)\n\n runInAction(() => {\n this.merchantBudgets = this.merchantBudgets.filter((b) => b.guid !== merchantBudgetGuid)\n })\n return { isSuccess: true }\n } catch (error) {\n console.error('Error deleting merchant budget:', error)\n this.globalStore.captureException(error, { store: 'BudgetsStore' })\n return { isSuccess: false }\n }\n }\n}\n"],"mappings":"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"}
@@ -30,7 +30,9 @@ export declare enum RepeatingType {
30
30
  export interface RepeatingTransaction {
31
31
  guid: string;
32
32
  account_guid: string;
33
+ category_guid?: string | null;
33
34
  created_by: number;
35
+ main_class_guid?: string | null;
34
36
  member_guid: string;
35
37
  merchant_guid?: string | null;
36
38
  user_guid: string;
@@ -1 +1 @@
1
- {"version":3,"file":"RepeatingTransaction.es.js","names":[],"sources":["../../../src/core/types/RepeatingTransaction.ts"],"sourcesContent":["import { Account } from './Account'\nimport { Transaction, TransactionType } from './Transaction'\n\nexport enum Frequency {\n Unknown = 0,\n EveryWeek = 1,\n EveryOtherWeek = 2,\n EveryMonth = 3,\n EveryOtherMonth = 4,\n EveryQuarter = 5,\n EveryOtherQuarter = 6,\n EveryYear = 7,\n TwiceAMonth = 8,\n}\n\nexport enum RecurrenceStatus {\n Paid = 0,\n Missed = 1,\n Upcoming = 2,\n}\n\nexport enum RecurrenceType {\n Expense = 0,\n Income = 1,\n}\n\nexport enum RepeatingType {\n Unknown = 0,\n Subscription = 1,\n Bill = 2,\n Income = 3,\n Transfer = 4,\n}\n\nexport interface RepeatingTransaction {\n // API fields\n guid: string\n account_guid: string\n created_by: number\n member_guid: string\n merchant_guid?: string | null\n user_guid: string\n description: string\n amount: number\n predicted_occurs_on: string\n transaction_type: TransactionType\n recurrence_type: Frequency\n recurrence_day: number\n repeating_transaction_type: RepeatingType\n second_recurrence_day?: number\n\n // UI fields\n account?: Account\n transactions: Transaction[]\n}\n\nexport interface Recurrence {\n accountGuid: string\n amount: number\n categoryGuid: string\n expectedDate: Date\n frequency: Frequency\n institutionGuid: string\n institutionName: string\n merchantGuid?: string | null\n name: string\n occurredOnDate?: Date\n recurrenceDay: number\n repeatingTransactionGuid: string\n secondRecurrenceDay?: number\n status: RecurrenceStatus\n type: RecurrenceType\n transaction?: Transaction\n}\n"],"mappings":"AAGA,IAAY,IAAL,0BAAA,GAAA;AACL,SAAA,EAAA,EAAA,UAAA,CAAA,IAAA,WACA,EAAA,EAAA,YAAA,CAAA,IAAA,aACA,EAAA,EAAA,iBAAA,CAAA,IAAA,kBACA,EAAA,EAAA,aAAA,CAAA,IAAA,cACA,EAAA,EAAA,kBAAA,CAAA,IAAA,mBACA,EAAA,EAAA,eAAA,CAAA,IAAA,gBACA,EAAA,EAAA,oBAAA,CAAA,IAAA,qBACA,EAAA,EAAA,YAAA,CAAA,IAAA,aACA,EAAA,EAAA,cAAA,CAAA,IAAA;AACF,GAAA,CAAA,CAAA,GAEY,IAAL,0BAAA,GAAA;AACL,SAAA,EAAA,EAAA,OAAA,CAAA,IAAA,QACA,EAAA,EAAA,SAAA,CAAA,IAAA,UACA,EAAA,EAAA,WAAA,CAAA,IAAA;AACF,GAAA,CAAA,CAAA,GAEY,IAAL,0BAAA,GAAA;AACL,SAAA,EAAA,EAAA,UAAA,CAAA,IAAA,WACA,EAAA,EAAA,SAAA,CAAA,IAAA;AACF,GAAA,CAAA,CAAA,GAEY,IAAL,0BAAA,GAAA;AACL,SAAA,EAAA,EAAA,UAAA,CAAA,IAAA,WACA,EAAA,EAAA,eAAA,CAAA,IAAA,gBACA,EAAA,EAAA,OAAA,CAAA,IAAA,QACA,EAAA,EAAA,SAAA,CAAA,IAAA,UACA,EAAA,EAAA,WAAA,CAAA,IAAA;AACF,GAAA,CAAA,CAAA"}
1
+ {"version":3,"file":"RepeatingTransaction.es.js","names":[],"sources":["../../../src/core/types/RepeatingTransaction.ts"],"sourcesContent":["import { Account } from './Account'\nimport { Transaction, TransactionType } from './Transaction'\n\nexport enum Frequency {\n Unknown = 0,\n EveryWeek = 1,\n EveryOtherWeek = 2,\n EveryMonth = 3,\n EveryOtherMonth = 4,\n EveryQuarter = 5,\n EveryOtherQuarter = 6,\n EveryYear = 7,\n TwiceAMonth = 8,\n}\n\nexport enum RecurrenceStatus {\n Paid = 0,\n Missed = 1,\n Upcoming = 2,\n}\n\nexport enum RecurrenceType {\n Expense = 0,\n Income = 1,\n}\n\nexport enum RepeatingType {\n Unknown = 0,\n Subscription = 1,\n Bill = 2,\n Income = 3,\n Transfer = 4,\n}\n\nexport interface RepeatingTransaction {\n // API fields\n guid: string\n account_guid: string\n category_guid?: string | null\n created_by: number\n main_class_guid?: string | null\n member_guid: string\n merchant_guid?: string | null\n user_guid: string\n description: string\n amount: number\n predicted_occurs_on: string\n transaction_type: TransactionType\n recurrence_type: Frequency\n recurrence_day: number\n repeating_transaction_type: RepeatingType\n second_recurrence_day?: number\n\n // UI fields\n account?: Account\n transactions: Transaction[]\n}\n\nexport interface Recurrence {\n accountGuid: string\n amount: number\n categoryGuid: string\n expectedDate: Date\n frequency: Frequency\n institutionGuid: string\n institutionName: string\n merchantGuid?: string | null\n name: string\n occurredOnDate?: Date\n recurrenceDay: number\n repeatingTransactionGuid: string\n secondRecurrenceDay?: number\n status: RecurrenceStatus\n type: RecurrenceType\n transaction?: Transaction\n}\n"],"mappings":"AAGA,IAAY,IAAL,0BAAA,GAAA;AACL,SAAA,EAAA,EAAA,UAAA,CAAA,IAAA,WACA,EAAA,EAAA,YAAA,CAAA,IAAA,aACA,EAAA,EAAA,iBAAA,CAAA,IAAA,kBACA,EAAA,EAAA,aAAA,CAAA,IAAA,cACA,EAAA,EAAA,kBAAA,CAAA,IAAA,mBACA,EAAA,EAAA,eAAA,CAAA,IAAA,gBACA,EAAA,EAAA,oBAAA,CAAA,IAAA,qBACA,EAAA,EAAA,YAAA,CAAA,IAAA,aACA,EAAA,EAAA,cAAA,CAAA,IAAA;AACF,GAAA,CAAA,CAAA,GAEY,IAAL,0BAAA,GAAA;AACL,SAAA,EAAA,EAAA,OAAA,CAAA,IAAA,QACA,EAAA,EAAA,SAAA,CAAA,IAAA,UACA,EAAA,EAAA,WAAA,CAAA,IAAA;AACF,GAAA,CAAA,CAAA,GAEY,IAAL,0BAAA,GAAA;AACL,SAAA,EAAA,EAAA,UAAA,CAAA,IAAA,WACA,EAAA,EAAA,SAAA,CAAA,IAAA;AACF,GAAA,CAAA,CAAA,GAEY,IAAL,0BAAA,GAAA;AACL,SAAA,EAAA,EAAA,UAAA,CAAA,IAAA,WACA,EAAA,EAAA,eAAA,CAAA,IAAA,gBACA,EAAA,EAAA,OAAA,CAAA,IAAA,QACA,EAAA,EAAA,SAAA,CAAA,IAAA,UACA,EAAA,EAAA,WAAA,CAAA,IAAA;AACF,GAAA,CAAA,CAAA"}
@@ -30,6 +30,7 @@ export interface Transaction {
30
30
  is_void: boolean;
31
31
  localized_description?: string | null;
32
32
  localized_memo?: string | null;
33
+ main_class_guid?: string | null;
33
34
  memo?: string | null;
34
35
  metadata?: string | null;
35
36
  merchant_guid?: string | null;
@@ -1 +1 @@
1
- {"version":3,"file":"Transaction.es.js","names":[],"sources":["../../../src/core/types/Transaction.ts"],"sourcesContent":["export interface Transaction {\n guid: string\n account_guid: string\n amount: number\n attachment_guid?: string | null\n category_guid?: string\n check_number?: string | null\n currency_code: string | null\n date: number\n description: string\n duplicate: boolean\n external_guid?: string | null\n feed_attachment_guid?: string | null\n feed_description: string\n feed_localized_description?: string | null\n feed_posted_date?: number | null\n feed_status: TransactionStatus | null\n feed_transaction_date: number | null\n flags?: number | null\n has_been_split: boolean\n has_been_viewed: boolean\n is_cleared: boolean\n is_flagged: boolean\n is_hidden: boolean\n is_international?: boolean | null\n is_manual: boolean\n is_personal: boolean\n is_reimbursable: boolean\n is_subscription: boolean\n is_void: boolean\n localized_description?: string | null\n localized_memo?: string | null\n memo?: string | null\n metadata?: string | null\n merchant_guid?: string | null\n parent_guid?: string | null\n posted_date?: number | null\n reference?: string | null\n revision: number\n repeating_transaction_guid?: string | null\n scheduled_payment_guid?: string | null\n top_level_category_guid?: string\n transaction_type: TransactionType\n user_date?: number | null\n user_guid: string\n user_transaction_rule_guid?: string | null\n is_duplicate: boolean\n tags: string[]\n feed_transacted_at: number | null\n\n // Detailed Transaction fields\n account?: string\n accountIsClosed?: boolean\n accountIsHidden?: boolean\n category?: string\n isIncome?: boolean\n isPending?: boolean\n number?: string\n payee?: string\n}\n\nexport enum TransactionType {\n CREDIT = 1,\n DEBIT = 2,\n}\n\nexport enum TransactionStatus {\n POSTED = 1,\n PENDING = 2,\n}\n\nexport interface Tag {\n guid: string\n is_default_tag: boolean\n name: string\n user_guid: string\n}\n\nexport interface Tagging {\n guid: string\n user_guid: string\n tag_guid: string\n transaction_guid: string\n}\n\nexport interface TransactionRule {\n guid: string\n user_guid: string\n category_guid: string | null\n match_description: string\n description: string | null\n}\n"],"mappings":"AA6DA,IAAY,IAAL,0BAAA,GAAA;AACL,SAAA,EAAA,EAAA,SAAA,CAAA,IAAA,UACA,EAAA,EAAA,QAAA,CAAA,IAAA;AACF,GAAA,CAAA,CAAA,GAEY,IAAL,0BAAA,GAAA;AACL,SAAA,EAAA,EAAA,SAAA,CAAA,IAAA,UACA,EAAA,EAAA,UAAA,CAAA,IAAA;AACF,GAAA,CAAA,CAAA"}
1
+ {"version":3,"file":"Transaction.es.js","names":[],"sources":["../../../src/core/types/Transaction.ts"],"sourcesContent":["export interface Transaction {\n guid: string\n account_guid: string\n amount: number\n attachment_guid?: string | null\n category_guid?: string\n check_number?: string | null\n currency_code: string | null\n date: number\n description: string\n duplicate: boolean\n external_guid?: string | null\n feed_attachment_guid?: string | null\n feed_description: string\n feed_localized_description?: string | null\n feed_posted_date?: number | null\n feed_status: TransactionStatus | null\n feed_transaction_date: number | null\n flags?: number | null\n has_been_split: boolean\n has_been_viewed: boolean\n is_cleared: boolean\n is_flagged: boolean\n is_hidden: boolean\n is_international?: boolean | null\n is_manual: boolean\n is_personal: boolean\n is_reimbursable: boolean\n is_subscription: boolean\n is_void: boolean\n localized_description?: string | null\n localized_memo?: string | null\n main_class_guid?: string | null\n memo?: string | null\n metadata?: string | null\n merchant_guid?: string | null\n parent_guid?: string | null\n posted_date?: number | null\n reference?: string | null\n revision: number\n repeating_transaction_guid?: string | null\n scheduled_payment_guid?: string | null\n top_level_category_guid?: string\n transaction_type: TransactionType\n user_date?: number | null\n user_guid: string\n user_transaction_rule_guid?: string | null\n is_duplicate: boolean\n tags: string[]\n feed_transacted_at: number | null\n\n // Detailed Transaction fields\n account?: string\n accountIsClosed?: boolean\n accountIsHidden?: boolean\n category?: string\n isIncome?: boolean\n isPending?: boolean\n number?: string\n payee?: string\n}\n\nexport enum TransactionType {\n CREDIT = 1,\n DEBIT = 2,\n}\n\nexport enum TransactionStatus {\n POSTED = 1,\n PENDING = 2,\n}\n\nexport interface Tag {\n guid: string\n is_default_tag: boolean\n name: string\n user_guid: string\n}\n\nexport interface Tagging {\n guid: string\n user_guid: string\n tag_guid: string\n transaction_guid: string\n}\n\nexport interface TransactionRule {\n guid: string\n user_guid: string\n category_guid: string | null\n match_description: string\n description: string | null\n}\n"],"mappings":"AA8DA,IAAY,IAAL,0BAAA,GAAA;AACL,SAAA,EAAA,EAAA,SAAA,CAAA,IAAA,UACA,EAAA,EAAA,QAAA,CAAA,IAAA;AACF,GAAA,CAAA,CAAA,GAEY,IAAL,0BAAA,GAAA;AACL,SAAA,EAAA,EAAA,SAAA,CAAA,IAAA,UACA,EAAA,EAAA,UAAA,CAAA,IAAA;AACF,GAAA,CAAA,CAAA"}
@@ -40,6 +40,7 @@ export interface BudgetsCopy {
40
40
  details_delete_button: string;
41
41
  details_edit_button: string;
42
42
  details_edit_title: string;
43
+ details_edit_title_subbudget: string;
43
44
  details_subbudgets_tab: string;
44
45
  details_title: string;
45
46
  details_transaction_drawer: string;
@@ -58,6 +59,7 @@ export interface BudgetsCopy {
58
59
  income_description: string;
59
60
  income_title: string;
60
61
  left_in_budgets: string;
62
+ monthly_total: string;
61
63
  overspent_in_budgets: string;
62
64
  overview_title: string;
63
65
  percent_spent: string;
@@ -79,6 +81,7 @@ export interface BudgetsCopy {
79
81
  status_on_track: string;
80
82
  success_alert_delete_merchant_budget: string;
81
83
  success_alert_edit_merchant_budget: string;
84
+ your_budget_summary: string;
82
85
  zero_state_budget_list_text: string;
83
86
  zero_state_description: string;
84
87
  zero_state_generate_budgets_header: string;
@@ -1,5 +1,6 @@
1
1
  import { Theme } from '@mui/system';
2
2
  import { Budget, BudgetColors, BudgetsCopy, DetailedCategory, DetailedBudget } from '../types';
3
+ export declare const isInvalidAmount: (val: string | undefined) => boolean;
3
4
  export declare const getBudgetPercentage: (budgetAmount: number, totalAmount: number) => number;
4
5
  export declare const getBudgetColors: (percentage: number, theme: Theme) => BudgetColors;
5
6
  export declare const getBudgetDifference: (budgets: DetailedBudget[]) => number;
@@ -1,71 +1,75 @@
1
- import { buildDynamicCopy as d } from "./Localization.es.js";
2
- import { findDetailedCategory as _, findDetailedSubCategory as y } from "./CategoryUtil.es.js";
3
- import { formatCurrency as f } from "./NumberFormatting.es.js";
4
- var l = (r, t) => !r && !t ? 0 : !r && t ? 101 : t / r * 100, p = (r, t) => {
5
- const e = {
1
+ import { buildDynamicCopy as f } from "./Localization.es.js";
2
+ import { findDetailedCategory as B, findDetailedSubCategory as y } from "./CategoryUtil.es.js";
3
+ import { formatCurrency as p } from "./NumberFormatting.es.js";
4
+ var x = (e) => e === void 0 || e === "" || Number(e) < 0 || isNaN(Number(e)), l = (e, t) => !e && !t ? 0 : !e && t ? 101 : t / e * 100, m = (e, t) => {
5
+ const r = {
6
6
  background: t.palette.success.main,
7
- description: r <= 100 ? t.palette.text.secondary : t.palette.error.main,
7
+ description: e <= 100 ? t.palette.text.secondary : t.palette.error.main,
8
8
  text: t.palette.common.white,
9
9
  mercury: t.palette.success.lighter
10
10
  };
11
- return r > 100 ? (e.background = t.palette.error.main, e.mercury = t.palette.error.lighter) : r > 80 && (e.background = t.palette.warning.main, e.text = t.palette.grey[900], e.mercury = t.palette.warning.lighter), e;
12
- }, x = (r) => r.map((t) => {
13
- const e = t.transaction_total;
14
- return t.amount - e;
15
- }).reduce((t, e) => t + e, 0), w = (r, t, e, n) => {
16
- const a = [];
17
- for (const o of r) {
18
- const i = _(t, o.category_guid);
19
- if (!i) continue;
20
- const u = i.totalAmount, s = l(o.amount, u), c = o.amount - u;
21
- a.push({
22
- ...o,
23
- budgetColors: p(s, n),
24
- category: i,
25
- description: d(c < 0 ? e.budget_remaining_over : e.budget_remaining_left, f(Math.abs(c), "0,0")),
26
- percentage: s,
11
+ return e > 100 ? (r.background = t.palette.error.main, r.mercury = t.palette.error.lighter) : e > 80 && (r.background = t.palette.warning.main, r.text = t.palette.grey[900], r.mercury = t.palette.warning.lighter), r;
12
+ }, M = (e) => e.map((t) => {
13
+ const r = t.transaction_total;
14
+ return t.amount - r;
15
+ }).reduce((t, r) => t + r, 0), D = (e, t, r, i) => {
16
+ const o = [], d = /* @__PURE__ */ new Map();
17
+ for (const n of e) n.parent_guid && d.set(n.parent_guid, (d.get(n.parent_guid) ?? 0) + n.amount);
18
+ for (const n of e) {
19
+ const a = B(t, n.category_guid);
20
+ if (!a) continue;
21
+ const s = d.get(n.guid) ?? n.amount, u = a.totalAmount, g = l(s, u), c = s - u;
22
+ o.push({
23
+ ...n,
24
+ amount: s,
25
+ budgetColors: m(g, i),
26
+ category: a,
27
+ description: f(c < 0 ? r.budget_remaining_over : r.budget_remaining_left, p(Math.abs(c), "0,0")),
28
+ percentage: g,
27
29
  subBudgets: [],
28
30
  transaction_total: u
29
31
  });
30
32
  }
31
- for (const o of r) {
32
- const i = y(t, o.category_guid);
33
- if (!i) continue;
34
- const u = i.currentAmount, s = a.find((b) => b.category_guid === i.parent_guid);
33
+ for (const n of e) {
34
+ if (!n.parent_guid) continue;
35
+ const a = y(t, n.category_guid);
36
+ if (!a) continue;
37
+ const s = o.find((_) => _.guid === n.parent_guid);
35
38
  if (!s) continue;
36
- const c = o.amount - u, g = l(o.amount, u);
37
- s && s.subBudgets.push({
38
- ...o,
39
- budgetColors: p(g, n),
40
- category: i,
41
- description: d(c < 0 ? e.budget_remaining_over : e.budget_remaining_left, f(Math.abs(c), "0,0")),
42
- percentage: g,
39
+ const u = a.currentAmount, g = n.amount - u, c = l(n.amount, u);
40
+ s.subBudgets.push({
41
+ ...n,
42
+ budgetColors: m(c, i),
43
+ category: a,
44
+ description: f(g < 0 ? r.budget_remaining_over : r.budget_remaining_left, p(Math.abs(g), "0,0")),
45
+ percentage: c,
43
46
  subBudgets: [],
44
47
  transaction_total: u
45
48
  });
46
49
  }
47
- return a;
48
- }, m = (r, t) => r.find((e) => e.guid === t), D = (r, t, e) => {
49
- const n = m(r, e);
50
- if (n)
51
- return m(n.subBudgets, t);
52
- }, M = (r, t) => {
53
- const e = Math.max(0, t - r), n = t > 0 ? Math.min(100, r / t * 100) : 0;
54
- let a = "success";
55
- return n >= 100 ? a = "error" : n >= 50 && (a = "warning"), {
56
- remainingAmount: e,
57
- spentPercentage: n,
58
- iconColor: a
50
+ return o;
51
+ }, b = (e, t) => e.find((r) => r.guid === t), N = (e, t, r) => {
52
+ const i = b(e, r);
53
+ if (i)
54
+ return b(i.subBudgets, t);
55
+ }, k = (e, t) => {
56
+ const r = Math.max(0, t - e), i = t > 0 ? Math.min(100, e / t * 100) : 0;
57
+ let o = "success";
58
+ return i >= 100 ? o = "error" : i >= 50 && (o = "warning"), {
59
+ remainingAmount: r,
60
+ spentPercentage: i,
61
+ iconColor: o
59
62
  };
60
63
  };
61
64
  export {
62
- w as augmentBudgets,
63
- m as findBudget,
64
- D as findSubBudget,
65
- p as getBudgetColors,
66
- x as getBudgetDifference,
65
+ D as augmentBudgets,
66
+ b as findBudget,
67
+ N as findSubBudget,
68
+ m as getBudgetColors,
69
+ M as getBudgetDifference,
67
70
  l as getBudgetPercentage,
68
- M as getRemainingAmountSpentPercentage
71
+ k as getRemainingAmountSpentPercentage,
72
+ x as isInvalidAmount
69
73
  };
70
74
 
71
75
  //# sourceMappingURL=BudgetUtil.es.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"BudgetUtil.es.js","names":[],"sources":["../../../src/core/utils/BudgetUtil.ts"],"sourcesContent":["import type { Theme } from '@mui/system'\n\nimport type { Budget, BudgetColors, BudgetsCopy, DetailedCategory, DetailedBudget } from '../types'\n\nimport { findDetailedCategory, findDetailedSubCategory } from './CategoryUtil'\nimport { formatCurrency } from './NumberFormatting'\nimport { buildDynamicCopy } from './Localization'\n\nexport const getBudgetPercentage = (budgetAmount: number, totalAmount: number) => {\n // No budget amount and nothing spent results in zero percent and green bubble\n if (!budgetAmount && !totalAmount) {\n return 0\n }\n\n // No budget amount and money spent results in 101 percent and red bubble\n if (!budgetAmount && totalAmount) {\n return 101\n }\n\n // Budget amount and money spent results in calculating percentage for color\n return (totalAmount / budgetAmount) * 100\n}\n\nexport const getBudgetColors = (percentage: number, theme: Theme) => {\n const budgetColors: BudgetColors = {\n background: theme.palette.success.main,\n description: percentage <= 100 ? theme.palette.text.secondary : theme.palette.error.main,\n text: theme.palette.common.white,\n mercury: theme.palette.success.lighter,\n }\n\n if (percentage > 100) {\n budgetColors.background = theme.palette.error.main\n budgetColors.mercury = theme.palette.error.lighter\n } else if (percentage > 80) {\n budgetColors.background = theme.palette.warning.main\n budgetColors.text = theme.palette.grey['900']\n budgetColors.mercury = theme.palette.warning.lighter\n }\n\n return budgetColors\n}\n\nexport const getBudgetDifference = (budgets: DetailedBudget[]) => {\n const differences = budgets.map((budget) => {\n const currentAmount = budget.transaction_total\n const totalAmount = budget.amount\n return totalAmount - currentAmount\n })\n\n return differences.reduce((total, difference) => total + difference, 0)\n}\n\nexport const augmentBudgets = (\n budgets: Budget[],\n categories: DetailedCategory[],\n copy: BudgetsCopy,\n theme: Theme,\n): DetailedBudget[] => {\n const detailedBudgets = [] as DetailedBudget[]\n\n // Top-level Categories\n for (const budget of budgets) {\n const category = findDetailedCategory(categories, budget.category_guid)\n if (!category) continue\n\n const spent = category.totalAmount\n\n const percentage = getBudgetPercentage(budget.amount, spent)\n const difference = budget.amount - spent\n\n detailedBudgets.push({\n ...budget,\n budgetColors: getBudgetColors(percentage, theme),\n category,\n description: buildDynamicCopy(\n difference < 0 ? copy.budget_remaining_over : copy.budget_remaining_left,\n formatCurrency(Math.abs(difference), '0,0'),\n ) as string,\n percentage,\n subBudgets: [],\n transaction_total: spent,\n })\n }\n\n // Sub categories\n for (const budget of budgets) {\n const category = findDetailedSubCategory(categories, budget.category_guid)\n if (!category) continue\n\n const spent = category.currentAmount\n\n const parentBudget = detailedBudgets.find((b) => b.category_guid === category.parent_guid)\n if (!parentBudget) continue\n\n const difference = budget.amount - spent\n const percentage = getBudgetPercentage(budget.amount, spent)\n\n if (parentBudget) {\n parentBudget.subBudgets.push({\n ...budget,\n budgetColors: getBudgetColors(percentage, theme),\n category,\n description: buildDynamicCopy(\n difference < 0 ? copy.budget_remaining_over : copy.budget_remaining_left,\n formatCurrency(Math.abs(difference), '0,0'),\n ) as string,\n percentage,\n subBudgets: [],\n transaction_total: spent,\n })\n }\n }\n\n return detailedBudgets\n}\n\nexport const findBudget = (budgets: DetailedBudget[], guid: string): DetailedBudget | undefined => {\n return budgets.find((budget) => budget.guid === guid)\n}\n\nexport const findSubBudget = (\n budgets: DetailedBudget[],\n guid: string,\n parentGuid: string,\n): DetailedBudget | undefined => {\n const parent = findBudget(budgets, parentGuid)\n if (!parent) return undefined\n\n return findBudget(parent.subBudgets, guid)\n}\n\nexport const getRemainingAmountSpentPercentage = (totalTransaction: number, amount: number) => {\n const remainingAmount = Math.max(0, amount - totalTransaction)\n const spentPercentage = amount > 0 ? Math.min(100, (totalTransaction / amount) * 100) : 0\n\n let iconColor = 'success'\n if (spentPercentage >= 100) iconColor = 'error'\n else if (spentPercentage >= 50) iconColor = 'warning'\n\n return {\n remainingAmount,\n spentPercentage,\n iconColor,\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"BudgetUtil.es.js","names":[],"sources":["../../../src/core/utils/BudgetUtil.ts"],"sourcesContent":["import type { Theme } from '@mui/system'\n\nimport type { Budget, BudgetColors, BudgetsCopy, DetailedCategory, DetailedBudget } from '../types'\n\nimport { findDetailedCategory, findDetailedSubCategory } from './CategoryUtil'\nimport { formatCurrency } from './NumberFormatting'\nimport { buildDynamicCopy } from './Localization'\n\nexport const isInvalidAmount = (val: string | undefined) =>\n val === undefined || val === '' || Number(val) < 0 || isNaN(Number(val))\n\nexport const getBudgetPercentage = (budgetAmount: number, totalAmount: number) => {\n // No budget amount and nothing spent results in zero percent and green bubble\n if (!budgetAmount && !totalAmount) {\n return 0\n }\n\n // No budget amount and money spent results in 101 percent and red bubble\n if (!budgetAmount && totalAmount) {\n return 101\n }\n\n // Budget amount and money spent results in calculating percentage for color\n return (totalAmount / budgetAmount) * 100\n}\n\nexport const getBudgetColors = (percentage: number, theme: Theme) => {\n const budgetColors: BudgetColors = {\n background: theme.palette.success.main,\n description: percentage <= 100 ? theme.palette.text.secondary : theme.palette.error.main,\n text: theme.palette.common.white,\n mercury: theme.palette.success.lighter,\n }\n\n if (percentage > 100) {\n budgetColors.background = theme.palette.error.main\n budgetColors.mercury = theme.palette.error.lighter\n } else if (percentage > 80) {\n budgetColors.background = theme.palette.warning.main\n budgetColors.text = theme.palette.grey['900']\n budgetColors.mercury = theme.palette.warning.lighter\n }\n\n return budgetColors\n}\n\nexport const getBudgetDifference = (budgets: DetailedBudget[]) => {\n const differences = budgets.map((budget) => {\n const currentAmount = budget.transaction_total\n const totalAmount = budget.amount\n return totalAmount - currentAmount\n })\n\n return differences.reduce((total, difference) => total + difference, 0)\n}\n\nexport const augmentBudgets = (\n budgets: Budget[],\n categories: DetailedCategory[],\n copy: BudgetsCopy,\n theme: Theme,\n): DetailedBudget[] => {\n const detailedBudgets = [] as DetailedBudget[]\n\n const childTotals = new Map<string, number>()\n for (const b of budgets) {\n if (b.parent_guid) {\n childTotals.set(b.parent_guid, (childTotals.get(b.parent_guid) ?? 0) + b.amount)\n }\n }\n\n // Top-level Categories\n for (const budget of budgets) {\n const category = findDetailedCategory(categories, budget.category_guid)\n if (!category) continue\n\n const amount = childTotals.get(budget.guid) ?? budget.amount\n const spent = category.totalAmount\n const percentage = getBudgetPercentage(amount, spent)\n const difference = amount - spent\n\n detailedBudgets.push({\n ...budget,\n amount,\n budgetColors: getBudgetColors(percentage, theme),\n category,\n description: buildDynamicCopy(\n difference < 0 ? copy.budget_remaining_over : copy.budget_remaining_left,\n formatCurrency(Math.abs(difference), '0,0'),\n ) as string,\n percentage,\n subBudgets: [],\n transaction_total: spent,\n })\n }\n\n // Sub categories\n for (const budget of budgets) {\n if (!budget.parent_guid) continue\n\n const category = findDetailedSubCategory(categories, budget.category_guid)\n if (!category) continue\n\n const parentBudget = detailedBudgets.find((b) => b.guid === budget.parent_guid)\n if (!parentBudget) continue\n\n const spent = category.currentAmount\n const difference = budget.amount - spent\n const percentage = getBudgetPercentage(budget.amount, spent)\n\n parentBudget.subBudgets.push({\n ...budget,\n budgetColors: getBudgetColors(percentage, theme),\n category,\n description: buildDynamicCopy(\n difference < 0 ? copy.budget_remaining_over : copy.budget_remaining_left,\n formatCurrency(Math.abs(difference), '0,0'),\n ) as string,\n percentage,\n subBudgets: [],\n transaction_total: spent,\n })\n }\n\n return detailedBudgets\n}\n\nexport const findBudget = (budgets: DetailedBudget[], guid: string): DetailedBudget | undefined => {\n return budgets.find((budget) => budget.guid === guid)\n}\n\nexport const findSubBudget = (\n budgets: DetailedBudget[],\n guid: string,\n parentGuid: string,\n): DetailedBudget | undefined => {\n const parent = findBudget(budgets, parentGuid)\n if (!parent) return undefined\n\n return findBudget(parent.subBudgets, guid)\n}\n\nexport const getRemainingAmountSpentPercentage = (totalTransaction: number, amount: number) => {\n const remainingAmount = Math.max(0, amount - totalTransaction)\n const spentPercentage = amount > 0 ? Math.min(100, (totalTransaction / amount) * 100) : 0\n\n let iconColor = 'success'\n if (spentPercentage >= 100) iconColor = 'error'\n else if (spentPercentage >= 50) iconColor = 'warning'\n\n return {\n remainingAmount,\n spentPercentage,\n iconColor,\n }\n}\n"],"mappings":"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"}
@@ -11,3 +11,4 @@ export declare const groupRecurrencesByDate: (recurrences: Recurrence[]) => Grou
11
11
  export declare const getFrequencyLabel: (copy: RecurringCopy, repeatingTransaction: RepeatingTransaction, showOrdinal: boolean) => string;
12
12
  export declare const getNextPaymentDate: (frequency: Frequency, date: Date, recurrenceDay?: number, secondRecurrenceDay?: number) => Date;
13
13
  export declare const getNextUpcomingDate: (recurringTransaction: RepeatingTransaction, recurrences: Recurrence[]) => Date;
14
+ export declare const isEligibleRepeatingTransaction: (transaction: Transaction) => boolean;