Compare commits

..

16 Commits

Author SHA1 Message Date
fc50313907 Fix app bar for small screens
Some checks failed
continuous-integration/drone/pr Build is failing
continuous-integration/drone/push Build is passing
2022-03-02 22:49:43 +00:00
4824e75049 Improve sidebar and show next to appbar instead of below
Some checks failed
continuous-integration/drone/pr Build is failing
continuous-integration/drone/push Build is passing
2022-03-02 22:37:43 +00:00
00a391d08c Fix const 2022-03-02 22:18:47 +00:00
744ff5207c Move CSS to _index.css 2022-03-02 22:17:01 +00:00
1094ce670e Extract const for default expiration 2022-03-02 22:16:32 +00:00
1ad533a306 Hide .task, build and dist folders 2022-03-02 22:16:20 +00:00
970cdf896c Hide files generated by sqlc 2022-03-02 22:10:17 +00:00
f72e7b8cec Split jwt into two files 2022-03-02 22:06:58 +00:00
d87716977a Remove example config 2022-03-02 22:01:10 +00:00
0ca52d4fe4 Move production Dockerfile to docker directory 2022-03-02 22:01:03 +00:00
e0285922bd Move compose files to docker directory 2022-03-02 22:00:47 +00:00
4eaa1ccbd1 Rename development Dockerfile and build script 2022-03-02 22:00:15 +00:00
ccea4dfaa4 Remove woodpecker config 2022-03-02 21:59:08 +00:00
c6cb36c260 Remove Earthfile 2022-03-02 21:56:53 +00:00
646df25d5b go mod tidy 2022-03-02 21:56:23 +00:00
0e83e31fda Remove earthignore 2022-03-02 21:56:06 +00:00
10 changed files with 27 additions and 99 deletions

View File

@ -15,7 +15,7 @@ const createAccount = `-- name: CreateAccount :one
INSERT INTO accounts
(name, budget_id)
VALUES ($1, $2)
RETURNING id, budget_id, name, on_budget, is_open
RETURNING id, budget_id, name, on_budget
`
type CreateAccountParams struct {
@ -31,13 +31,12 @@ func (q *Queries) CreateAccount(ctx context.Context, arg CreateAccountParams) (A
&i.BudgetID,
&i.Name,
&i.OnBudget,
&i.IsOpen,
)
return i, err
}
const getAccount = `-- name: GetAccount :one
SELECT accounts.id, accounts.budget_id, accounts.name, accounts.on_budget, accounts.is_open FROM accounts
SELECT accounts.id, accounts.budget_id, accounts.name, accounts.on_budget FROM accounts
WHERE accounts.id = $1
`
@ -49,15 +48,13 @@ func (q *Queries) GetAccount(ctx context.Context, id uuid.UUID) (Account, error)
&i.BudgetID,
&i.Name,
&i.OnBudget,
&i.IsOpen,
)
return i, err
}
const getAccounts = `-- name: GetAccounts :many
SELECT accounts.id, accounts.budget_id, accounts.name, accounts.on_budget, accounts.is_open FROM accounts
SELECT accounts.id, accounts.budget_id, accounts.name, accounts.on_budget FROM accounts
WHERE accounts.budget_id = $1
AND accounts.is_open = TRUE
ORDER BY accounts.name
`
@ -75,7 +72,6 @@ func (q *Queries) GetAccounts(ctx context.Context, budgetID uuid.UUID) ([]Accoun
&i.BudgetID,
&i.Name,
&i.OnBudget,
&i.IsOpen,
); err != nil {
return nil, err
}
@ -91,14 +87,13 @@ func (q *Queries) GetAccounts(ctx context.Context, budgetID uuid.UUID) ([]Accoun
}
const getAccountsWithBalance = `-- name: GetAccountsWithBalance :many
SELECT accounts.id, accounts.name, accounts.on_budget, accounts.is_open,
SELECT accounts.id, accounts.name, accounts.on_budget,
(SELECT MAX(transactions.date) FROM transactions WHERE transactions.account_id = accounts.id AND transactions.status = 'Reconciled')::date as last_reconciled,
(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
WHERE accounts.budget_id = $1
AND accounts.is_open = TRUE
ORDER BY accounts.name
`
@ -106,7 +101,6 @@ type GetAccountsWithBalanceRow struct {
ID uuid.UUID
Name string
OnBudget bool
IsOpen bool
LastReconciled time.Time
WorkingBalance numeric.Numeric
ClearedBalance numeric.Numeric
@ -126,7 +120,6 @@ func (q *Queries) GetAccountsWithBalance(ctx context.Context, budgetID uuid.UUID
&i.ID,
&i.Name,
&i.OnBudget,
&i.IsOpen,
&i.LastReconciled,
&i.WorkingBalance,
&i.ClearedBalance,
@ -148,7 +141,6 @@ func (q *Queries) GetAccountsWithBalance(ctx context.Context, budgetID uuid.UUID
const searchAccounts = `-- name: SearchAccounts :many
SELECT accounts.id, accounts.budget_id, accounts.name, 'account' as type FROM accounts
WHERE accounts.budget_id = $1
AND accounts.is_open = TRUE
AND accounts.name LIKE $2
ORDER BY accounts.name
`
@ -196,33 +188,25 @@ func (q *Queries) SearchAccounts(ctx context.Context, arg SearchAccountsParams)
const updateAccount = `-- name: UpdateAccount :one
UPDATE accounts
SET name = $1,
on_budget = $2,
is_open = $3
WHERE accounts.id = $4
RETURNING id, budget_id, name, on_budget, is_open
on_budget = $2
WHERE accounts.id = $3
RETURNING id, budget_id, name, on_budget
`
type UpdateAccountParams struct {
Name string
OnBudget bool
IsOpen bool
ID uuid.UUID
}
func (q *Queries) UpdateAccount(ctx context.Context, arg UpdateAccountParams) (Account, error) {
row := q.db.QueryRowContext(ctx, updateAccount,
arg.Name,
arg.OnBudget,
arg.IsOpen,
arg.ID,
)
row := q.db.QueryRowContext(ctx, updateAccount, arg.Name, arg.OnBudget, arg.ID)
var i Account
err := row.Scan(
&i.ID,
&i.BudgetID,
&i.Name,
&i.OnBudget,
&i.IsOpen,
)
return i, err
}

View File

@ -36,7 +36,6 @@ type Account struct {
BudgetID uuid.UUID
Name string
OnBudget bool
IsOpen bool
}
type Assignment struct {

View File

@ -11,31 +11,27 @@ WHERE accounts.id = $1;
-- name: GetAccounts :many
SELECT accounts.* FROM accounts
WHERE accounts.budget_id = $1
AND accounts.is_open = TRUE
ORDER BY accounts.name;
-- name: GetAccountsWithBalance :many
SELECT accounts.id, accounts.name, accounts.on_budget, accounts.is_open,
SELECT accounts.id, accounts.name, accounts.on_budget,
(SELECT MAX(transactions.date) FROM transactions WHERE transactions.account_id = accounts.id AND transactions.status = 'Reconciled')::date as last_reconciled,
(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
WHERE accounts.budget_id = $1
AND accounts.is_open = TRUE
ORDER BY accounts.name;
-- name: SearchAccounts :many
SELECT accounts.id, accounts.budget_id, accounts.name, 'account' as type FROM accounts
WHERE accounts.budget_id = @budget_id
AND accounts.is_open = TRUE
AND accounts.name LIKE @search
ORDER BY accounts.name;
-- name: UpdateAccount :one
UPDATE accounts
SET name = $1,
on_budget = $2,
is_open = $3
WHERE accounts.id = $4
on_budget = $2
WHERE accounts.id = $3
RETURNING *;

View File

@ -1,5 +0,0 @@
-- +goose Up
ALTER TABLE accounts ADD COLUMN is_open BOOLEAN NOT NULL DEFAULT TRUE;
-- +goose Down
ALTER TABLE accounts DROP COLUMN is_open;

View File

@ -39,7 +39,6 @@ type TransactionsResponse struct {
type EditAccountRequest struct {
Name string `json:"name"`
OnBudget bool `json:"onBudget"`
IsOpen bool `json:"isOpen"`
}
func (h *Handler) editAccount(c *gin.Context) {
@ -60,7 +59,6 @@ func (h *Handler) editAccount(c *gin.Context) {
updateParams := postgres.UpdateAccountParams{
Name: request.Name,
OnBudget: request.OnBudget,
IsOpen: request.IsOpen,
ID: accountUUID,
}
account, err := h.Service.UpdateAccount(c.Request.Context(), updateParams)

View File

@ -7,7 +7,7 @@ const props = defineProps<{
}>();
const emit = defineEmits<{
(e: 'submit', event : {cancel:boolean}): boolean,
(e: 'submit'): void,
(e: 'open'): void,
}>();
@ -20,12 +20,8 @@ function openDialog() {
visible.value = true;
};
function submitDialog() {
const e = {cancel: false};
emit("submit", e);
if(e.cancel)
return;
visible.value = false;
emit("submit");
}
</script>
@ -42,9 +38,9 @@ function submitDialog() {
v-if="visible"
class="fixed inset-0 bg-gray-600 bg-opacity-50 overflow-y-auto h-full w-full"
>
<div class="relative top-20 mx-auto p-5 w-96 shadow-lg rounded-md bg-white dark:bg-black">
<div class="relative top-20 mx-auto p-5 border w-96 shadow-lg rounded-md bg-white">
<div class="mt-3 text-center">
<h3 class="mt-3 text-lg leading-6 font-medium text-gray-900 dark:text-gray-100">{{ buttonText }}</h3>
<h3 class="mt-3 text-lg leading-6 font-medium text-gray-900">{{ buttonText }}</h3>
<slot></slot>
<div class="grid grid-cols-2 gap-6">
<button

View File

@ -3,50 +3,29 @@ import { computed, ref } from 'vue';
import Modal from '../components/Modal.vue';
import { useAccountStore } from '../stores/budget-account';
import Input from '../components/Input.vue';
import Checkbox from '../components/Checkbox.vue';
import { useRouter } from 'vue-router';
import { useBudgetsStore } from '../stores/budget';
const router = useRouter();
const accountStore = useAccountStore();
const CurrentAccount = computed(() => accountStore.CurrentAccount);
const accountName = ref("");
const accountOnBudget = ref(true);
const accountOpen = ref(true);
const error = ref("");
function editAccount(e : {cancel:boolean}) : boolean {
if(CurrentAccount.value?.ClearedBalance != 0 && !accountOpen.value){
e.cancel = true;
error.value = "Cannot close account with balance";
return false;
}
error.value = "";
accountStore.EditAccount(CurrentAccount.value?.ID ?? "", accountName.value, accountOnBudget.value, accountOpen.value);
// account closed, move to Budget
if(!accountOpen.value){
const currentBudgetID = useBudgetsStore().CurrentBudgetID;
router.replace('/budget/'+currentBudgetID+'/budgeting');
}
return true;
function editAccount(e : any) {
accountStore.EditAccount(CurrentAccount.value?.ID ?? "", accountName.value, accountOnBudget.value);
}
function openEditAccount(e : any) {
accountName.value = CurrentAccount.value?.Name ?? "";
accountOnBudget.value = CurrentAccount.value?.OnBudget ?? true;
accountOpen.value = CurrentAccount.value?.IsOpen ?? true;
}
</script>
<template>
<Modal button-text="Edit Account" @open="openEditAccount" @submit="editAccount">
<template v-slot:placeholder><span class="ml-2"></span></template>
<template v-slot:placeholder></template>
<div class="mt-2 px-7 py-3">
<Input
class="border-2 dark:border-gray-700"
class="border-2"
type="text"
v-model="accountName"
placeholder="Account name"
@ -54,23 +33,13 @@ function openEditAccount(e : any) {
/>
</div>
<div class="mt-2 px-7 py-3">
<Checkbox
<Input
class="border-2"
type="checkbox"
v-model="accountOnBudget"
required
/>
<label>On Budget</label>
</div>
<div class="mt-2 px-7 py-3">
<Checkbox
class="border-2"
v-model="accountOpen"
required
/>
<label>Open</label>
</div>
<div v-if="error != ''" class="dark:text-red-300 text-red-700">
{{ error }}
</div>
</Modal>
</template>

View File

@ -43,12 +43,10 @@ function createReconcilationTransaction() {
<template>
<div class="grid grid-cols-[1fr_auto]">
<div>
<h1 class="inline">
{{ accounts.CurrentAccount?.Name }}
</h1>
<h1 class="inline">
{{ accounts.CurrentAccount?.Name }}
<EditAccount />
</div>
</h1>
<div class="text-right flex flex-wrap flex-col md:flex-row justify-end gap-2 max-w-sm">
<span class="rounded-lg p-1 whitespace-nowrap flex-1">

View File

@ -60,14 +60,12 @@ function getAccountName(account : Account) {
<Currency :class="ExpandMenu?'md:inline':'md:hidden'" :value="account.ClearedBalance" />
</div>
</li>
<!--
<li class="bg-slate-100 dark:bg-slate-800 my-2 p-2 px-3">
<div class="flex flex-row justify-between font-bold">
<span>Closed Accounts</span>
</div>
+ Add Account
</li>
-->
<!--<li>
<router-link :to="'/budget/'+CurrentBudgetID+'/accounts'">Edit accounts</router-link>
</li>-->
@ -76,4 +74,4 @@ function getAccountName(account : Account) {
</li>
<!--<li><router-link to="/admin">Admin</router-link></li>-->
</div>
</template>
</template>

View File

@ -16,7 +16,6 @@ export interface Account {
ID: string
Name: string
OnBudget: boolean
IsOpen: boolean
ClearedBalance: number
WorkingBalance: number
ReconciledBalance: number
@ -124,14 +123,10 @@ export const useAccountStore = defineStore("budget/account", {
return;
this.addCategoriesForMonth(year, month, response.Categories);
},
async EditAccount(accountid: string, name: string, onBudget: boolean, isOpen: boolean) {
const result = await POST("/account/" + accountid, JSON.stringify({ name: name, onBudget: onBudget, isOpen: isOpen }));
async EditAccount(accountid: string, name: string, onBudget: boolean) {
const result = await POST("/account/" + accountid, JSON.stringify({ name: name, onBudget: onBudget }));
const response = await result.json();
useBudgetsStore().MergeBudgetingData(response);
if(!isOpen) {
this.Accounts.delete(accountid);
}
},
addCategoriesForMonth(year: number, month: number, categories: Category[]): void {
this.$patch((state) => {