Merge pull request 'Split account balances in working, cleared and reconciled' (#25) from account-balances into master
All checks were successful
continuous-integration/drone/push Build is passing

Reviewed-on: #25
This commit is contained in:
Jan Bader 2022-02-27 19:33:44 +01:00
commit 511081298e
5 changed files with 38 additions and 20 deletions

View File

@ -86,11 +86,12 @@ func (q *Queries) GetAccounts(ctx context.Context, budgetID uuid.UUID) ([]Accoun
} }
const getAccountsWithBalance = `-- name: GetAccountsWithBalance :many const getAccountsWithBalance = `-- name: GetAccountsWithBalance :many
SELECT accounts.id, accounts.name, accounts.on_budget, SUM(transactions.amount)::decimal(12,2) as balance SELECT accounts.id, accounts.name, accounts.on_budget,
(SELECT SUM(transactions.amount) FROM transactions WHERE transactions.account_id = accounts.id AND transactions.date < NOW())::decimal(12,2) as working_balance,
(SELECT SUM(transactions.amount) FROM transactions WHERE transactions.account_id = accounts.id AND transactions.date < NOW() AND transactions.status IN ('Cleared', 'Reconciled'))::decimal(12,2) as cleared_balance,
(SELECT SUM(transactions.amount) FROM transactions WHERE transactions.account_id = accounts.id AND transactions.date < NOW() AND transactions.status = 'Reconciled')::decimal(12,2) as reconciled_balance
FROM accounts FROM accounts
LEFT JOIN transactions ON transactions.account_id = accounts.id AND transactions.date < NOW()
WHERE accounts.budget_id = $1 WHERE accounts.budget_id = $1
GROUP BY accounts.id, accounts.name
ORDER BY accounts.name ORDER BY accounts.name
` `
@ -98,7 +99,9 @@ type GetAccountsWithBalanceRow struct {
ID uuid.UUID ID uuid.UUID
Name string Name string
OnBudget bool OnBudget bool
Balance numeric.Numeric WorkingBalance numeric.Numeric
ClearedBalance numeric.Numeric
ReconciledBalance numeric.Numeric
} }
func (q *Queries) GetAccountsWithBalance(ctx context.Context, budgetID uuid.UUID) ([]GetAccountsWithBalanceRow, error) { func (q *Queries) GetAccountsWithBalance(ctx context.Context, budgetID uuid.UUID) ([]GetAccountsWithBalanceRow, error) {
@ -114,7 +117,9 @@ func (q *Queries) GetAccountsWithBalance(ctx context.Context, budgetID uuid.UUID
&i.ID, &i.ID,
&i.Name, &i.Name,
&i.OnBudget, &i.OnBudget,
&i.Balance, &i.WorkingBalance,
&i.ClearedBalance,
&i.ReconciledBalance,
); err != nil { ); err != nil {
return nil, err return nil, err
} }

View File

@ -14,11 +14,12 @@ WHERE accounts.budget_id = $1
ORDER BY accounts.name; ORDER BY accounts.name;
-- name: GetAccountsWithBalance :many -- name: GetAccountsWithBalance :many
SELECT accounts.id, accounts.name, accounts.on_budget, SUM(transactions.amount)::decimal(12,2) as balance SELECT accounts.id, accounts.name, accounts.on_budget,
(SELECT SUM(transactions.amount) FROM transactions WHERE transactions.account_id = accounts.id AND transactions.date < NOW())::decimal(12,2) as working_balance,
(SELECT SUM(transactions.amount) FROM transactions WHERE transactions.account_id = accounts.id AND transactions.date < NOW() AND transactions.status IN ('Cleared', 'Reconciled'))::decimal(12,2) as cleared_balance,
(SELECT SUM(transactions.amount) FROM transactions WHERE transactions.account_id = accounts.id AND transactions.date < NOW() AND transactions.status = 'Reconciled')::decimal(12,2) as reconciled_balance
FROM accounts FROM accounts
LEFT JOIN transactions ON transactions.account_id = accounts.id AND transactions.date < NOW()
WHERE accounts.budget_id = $1 WHERE accounts.budget_id = $1
GROUP BY accounts.id, accounts.name
ORDER BY accounts.name; ORDER BY accounts.name;
-- name: SearchAccounts :many -- name: SearchAccounts :many

View File

@ -19,12 +19,22 @@ const TransactionsList = computed(() => accountStore.TransactionsList);
<template> <template>
<h1 class="inline">{{ CurrentAccount?.Name }}</h1> <h1 class="inline">{{ CurrentAccount?.Name }}</h1>
<EditAccount /> <EditAccount /> <br />
<p> <span>
Current Balance: Current Balance:
<Currency :value="CurrentAccount?.Balance" /> <Currency :value="CurrentAccount?.WorkingBalance" />
</p> </span>
<span>
Cleared Balance:
<Currency :value="CurrentAccount?.ClearedBalance" />
</span>
<span>
Reconciled Balance:
<Currency :value="CurrentAccount?.ReconciledBalance" />
</span>
<table> <table>
<tr class="font-bold"> <tr class="font-bold">
<td style="width: 90px;">Date</td> <td style="width: 90px;">Date</td>

View File

@ -36,7 +36,7 @@ const OffBudgetAccountsBalance = computed(() => accountStore.OffBudgetAccountsBa
</div> </div>
<div v-for="account in OnBudgetAccounts" class="flex flex-row justify-between"> <div v-for="account in OnBudgetAccounts" class="flex flex-row justify-between">
<router-link :to="'/budget/'+CurrentBudgetID+'/account/'+account.ID">{{account.Name}}</router-link> <router-link :to="'/budget/'+CurrentBudgetID+'/account/'+account.ID">{{account.Name}}</router-link>
<Currency :class="ExpandMenu?'md:inline':'md:hidden'" :value="account.Balance" /> <Currency :class="ExpandMenu?'md:inline':'md:hidden'" :value="account.ClearedBalance" />
</div> </div>
</li> </li>
<li class="bg-red-200 rounded-lg m-1 p-1 px-3"> <li class="bg-red-200 rounded-lg m-1 p-1 px-3">
@ -46,7 +46,7 @@ const OffBudgetAccountsBalance = computed(() => accountStore.OffBudgetAccountsBa
</div> </div>
<div v-for="account in OffBudgetAccounts" class="flex flex-row justify-between"> <div v-for="account in OffBudgetAccounts" class="flex flex-row justify-between">
<router-link :to="'/budget/'+CurrentBudgetID+'/account/'+account.ID">{{account.Name}}</router-link> <router-link :to="'/budget/'+CurrentBudgetID+'/account/'+account.ID">{{account.Name}}</router-link>
<Currency :class="ExpandMenu?'md:inline':'md:hidden'" :value="account.Balance" /> <Currency :class="ExpandMenu?'md:inline':'md:hidden'" :value="account.ClearedBalance" />
</div> </div>
</li> </li>
<li class="bg-red-200 rounded-lg m-1 p-1 px-3"> <li class="bg-red-200 rounded-lg m-1 p-1 px-3">

View File

@ -31,7 +31,9 @@ export interface Account {
ID: string ID: string
Name: string Name: string
OnBudget: boolean OnBudget: boolean
Balance: number ClearedBalance: number
WorkingBalance: number
ReconciledBalance: number
Transactions: string[] Transactions: string[]
} }
@ -95,13 +97,13 @@ export const useAccountStore = defineStore("budget/account", {
return [...state.Accounts.values()].filter(x => x.OnBudget); return [...state.Accounts.values()].filter(x => x.OnBudget);
}, },
OnBudgetAccountsBalance(state): number { OnBudgetAccountsBalance(state): number {
return this.OnBudgetAccounts.reduce((prev, curr) => prev + Number(curr.Balance), 0); return this.OnBudgetAccounts.reduce((prev, curr) => prev + Number(curr.ClearedBalance), 0);
}, },
OffBudgetAccounts(state) { OffBudgetAccounts(state) {
return [...state.Accounts.values()].filter(x => !x.OnBudget); return [...state.Accounts.values()].filter(x => !x.OnBudget);
}, },
OffBudgetAccountsBalance(state): number { OffBudgetAccountsBalance(state): number {
return this.OffBudgetAccounts.reduce((prev, curr) => prev + Number(curr.Balance), 0); return this.OffBudgetAccounts.reduce((prev, curr) => prev + Number(curr.ClearedBalance), 0);
}, },
TransactionsList(state) : Transaction[] { TransactionsList(state) : Transaction[] {
return this.CurrentAccount!.Transactions.map(x => { return this.CurrentAccount!.Transactions.map(x => {