From a3e12df2e2f9a7d98e57ce71e11bfdb6814e5490 Mon Sep 17 00:00:00 2001 From: Jan Bader Date: Mon, 28 Feb 2022 13:09:15 +0000 Subject: [PATCH] Extract transactions store --- web/src/stores/budget-account.ts | 79 +--------------------- web/src/stores/transactions.ts | 109 +++++++++++++++++++++++++++++++ 2 files changed, 112 insertions(+), 76 deletions(-) create mode 100644 web/src/stores/transactions.ts diff --git a/web/src/stores/budget-account.ts b/web/src/stores/budget-account.ts index 9a3f8f1..bb4d73e 100644 --- a/web/src/stores/budget-account.ts +++ b/web/src/stores/budget-account.ts @@ -2,31 +2,14 @@ import { defineStore } from "pinia" import { GET, POST } from "../api"; import { useBudgetsStore } from "./budget"; import { useSessionStore } from "./session"; +import { useTransactionsStore } from "./transactions"; interface State { Accounts: Map CurrentAccountID: string | null Categories: Map Months: Map>> - Transactions: Map Assignments: [] - Reconciling: boolean -} - -export interface Transaction { - ID: string - Date: Date - TransferAccount: string - CategoryGroup: string - Category: string - CategoryID: string | undefined - Memo: string - Status: string - GroupID: string - Payee: string - PayeeID: string | undefined - Amount: number - Reconciled: boolean } export interface Account { @@ -55,9 +38,7 @@ export const useAccountStore = defineStore("budget/account", { CurrentAccountID: null, Months: new Map>>(), Categories: new Map(), - Transactions: new Map(), Assignments: [], - Reconciling: false, }), getters: { AccountsList(state) { @@ -121,11 +102,6 @@ export const useAccountStore = defineStore("budget/account", { OffBudgetAccountsBalance(state): number { return this.OffBudgetAccounts.reduce((prev, curr) => prev + Number(curr.ClearedBalance), 0); }, - TransactionsList(state): Transaction[] { - return this.CurrentAccount!.Transactions.map(x => { - return this.Transactions.get(x)! - }); - }, }, actions: { async SetCurrentAccount(budgetid: string, accountid: string) { @@ -137,21 +113,11 @@ export const useAccountStore = defineStore("budget/account", { useSessionStore().setTitle(account.Name); await this.FetchAccount(account); }, - AddTransactions(transactions: Array) { - const transactionIds = [] as Array; - this.$patch(() => { - for (const transaction of transactions) { - transaction.Date = new Date(transaction.Date); - this.Transactions.set(transaction.ID, transaction); - transactionIds.push(transaction.ID); - } - }); - return transactionIds; - }, async FetchAccount(account: Account) { const result = await GET("/account/" + account.ID + "/transactions"); const response = await result.json(); - const transactions = this.AddTransactions(response.Transactions); + const transactionsStore = useTransactionsStore() + const transactions = transactionsStore.AddTransactions(response.Transactions); account.Transactions = transactions; }, async FetchMonthBudget(budgetid: string, year: number, month: number) { @@ -178,48 +144,9 @@ export const useAccountStore = defineStore("budget/account", { state.Months.set(year, yearMap); }); }, - SetReconciledForAllTransactions(value: boolean) { - for (const transaction of this.TransactionsList) { - if (transaction.Status == "Reconciled") - continue; - - transaction.Reconciled = value; - } - }, - async SubmitReconcilation(reconciliationTransactionAmount: number) { - const account = this.CurrentAccount!; - const reconciledTransactions = this.TransactionsList.filter(x => x.Reconciled); - for (const transaction of reconciledTransactions) { - account.ReconciledBalance += transaction.Amount; - transaction.Status = "Reconciled"; - transaction.Reconciled = false; - } - const result = await POST("/account/" + this.CurrentAccountID + "/reconcile", JSON.stringify({ - transactionIDs: reconciledTransactions.map(x => x.ID), - reconciliationTransactionAmount: reconciliationTransactionAmount.toString(), - })); - const response = await result.json(); - const recTrans = response.ReconciliationTransaction; - if (recTrans) { - this.AddTransactions([recTrans]); - account.Transactions.unshift(recTrans.ID); - } - console.log("Reconcile: " + response.message); - }, logout() { this.$reset() }, - async saveTransaction(payload: string) { - const result = await POST("/transaction/new", payload); - const response = await result.json() as Transaction; - this.AddTransactions([response]); - this.CurrentAccount?.Transactions.unshift(response.ID); - }, - async editTransaction(transactionid: string, payload: string) { - const result = await POST("/transaction/" + transactionid, payload); - const response = await result.json() as Transaction; - this.AddTransactions([response]); - } } }) diff --git a/web/src/stores/transactions.ts b/web/src/stores/transactions.ts new file mode 100644 index 0000000..8346e98 --- /dev/null +++ b/web/src/stores/transactions.ts @@ -0,0 +1,109 @@ + +import { defineStore } from "pinia" +import { GET, POST } from "../api"; +import { useBudgetsStore } from "./budget"; +import { useAccountStore } from "./budget-account"; +import { useSessionStore } from "./session"; + +interface State { + Transactions: Map + Reconciling: boolean +} + +export interface Transaction { + ID: string + Date: Date + TransferAccount: string + CategoryGroup: string + Category: string + CategoryID: string | undefined + Memo: string + Status: string + GroupID: string + Payee: string + PayeeID: string | undefined + Amount: number + Reconciled: boolean +} + +export const useTransactionsStore = defineStore("budget/transactions", { + state: (): State => ({ + Transactions: new Map(), + Reconciling: false, + }), + getters: { + ReconcilingBalance(state): number { + const accountsStore = useAccountStore() + let reconciledBalance = accountsStore.CurrentAccount!.ReconciledBalance; + for (const transaction of this.TransactionsList) { + if (transaction.Reconciled) + reconciledBalance += transaction.Amount; + } + return reconciledBalance; + }, + TransactionsList(state): Transaction[] { + const accountsStore = useAccountStore() + return accountsStore.CurrentAccount!.Transactions.map(x => { + return this.Transactions.get(x)! + }); + }, + }, + actions: { + AddTransactions(transactions: Array) { + const transactionIds = [] as Array; + this.$patch(() => { + for (const transaction of transactions) { + transaction.Date = new Date(transaction.Date); + this.Transactions.set(transaction.ID, transaction); + transactionIds.push(transaction.ID); + } + }); + return transactionIds; + }, + SetReconciledForAllTransactions(value: boolean) { + for (const transaction of this.TransactionsList) { + if (transaction.Status == "Reconciled") + continue; + + transaction.Reconciled = value; + } + }, + async SubmitReconcilation(reconciliationTransactionAmount: number) { + const accountsStore = useAccountStore() + const account = accountsStore.CurrentAccount!; + const reconciledTransactions = this.TransactionsList.filter(x => x.Reconciled); + for (const transaction of reconciledTransactions) { + account.ReconciledBalance += transaction.Amount; + transaction.Status = "Reconciled"; + transaction.Reconciled = false; + } + const result = await POST("/account/" + accountsStore.CurrentAccountID + "/reconcile", JSON.stringify({ + transactionIDs: reconciledTransactions.map(x => x.ID), + reconciliationTransactionAmount: reconciliationTransactionAmount.toString(), + })); + const response = await result.json(); + const recTrans = response.ReconciliationTransaction; + if (recTrans) { + this.AddTransactions([recTrans]); + account.Transactions.unshift(recTrans.ID); + } + console.log("Reconcile: " + response.message); + }, + logout() { + this.$reset() + }, + async saveTransaction(payload: string) { + const accountsStore = useAccountStore() + const result = await POST("/transaction/new", payload); + const response = await result.json() as Transaction; + this.AddTransactions([response]); + accountsStore.CurrentAccount?.Transactions.unshift(response.ID); + }, + async editTransaction(transactionid: string, payload: string) { + const result = await POST("/transaction/" + transactionid, payload); + const response = await result.json() as Transaction; + this.AddTransactions([response]); + } + } + +})