Import and display Status
All checks were successful
continuous-integration/drone/push Build is passing

This commit is contained in:
Jan Bader 2022-01-16 15:42:56 +00:00
parent 7fba9e7e4c
commit 663f247080
6 changed files with 66 additions and 12 deletions

View File

@ -4,11 +4,32 @@ package postgres
import ( import (
"database/sql" "database/sql"
"fmt"
"time" "time"
"github.com/google/uuid" "github.com/google/uuid"
) )
type TransactionStatus string
const (
TransactionStatusReconciled TransactionStatus = "Reconciled"
TransactionStatusCleared TransactionStatus = "Cleared"
TransactionStatusUncleared TransactionStatus = "Uncleared"
)
func (e *TransactionStatus) Scan(src interface{}) error {
switch s := src.(type) {
case []byte:
*e = TransactionStatus(s)
case string:
*e = TransactionStatus(s)
default:
return fmt.Errorf("unsupported scan type for TransactionStatus: %T", src)
}
return nil
}
type Account struct { type Account struct {
ID uuid.UUID ID uuid.UUID
BudgetID uuid.UUID BudgetID uuid.UUID
@ -65,6 +86,7 @@ type Transaction struct {
CategoryID uuid.NullUUID CategoryID uuid.NullUUID
PayeeID uuid.NullUUID PayeeID uuid.NullUUID
GroupID uuid.NullUUID GroupID uuid.NullUUID
Status TransactionStatus
} }
type TransactionsByMonth struct { type TransactionsByMonth struct {

View File

@ -4,8 +4,8 @@ WHERE id = $1;
-- name: CreateTransaction :one -- name: CreateTransaction :one
INSERT INTO transactions INSERT INTO transactions
(date, memo, amount, account_id, payee_id, category_id, group_id) (date, memo, amount, account_id, payee_id, category_id, group_id, status)
VALUES ($1, $2, $3, $4, $5, $6, $7) VALUES ($1, $2, $3, $4, $5, $6, $7, $8)
RETURNING *; RETURNING *;
-- name: UpdateTransaction :exec -- name: UpdateTransaction :exec
@ -23,7 +23,7 @@ DELETE FROM transactions
WHERE id = $1; WHERE id = $1;
-- name: GetTransactionsForBudget :many -- name: GetTransactionsForBudget :many
SELECT transactions.id, transactions.date, transactions.memo, transactions.amount, transactions.group_id, SELECT transactions.id, transactions.date, transactions.memo, transactions.amount, transactions.group_id, transactions.status,
accounts.name as account, COALESCE(payees.name, '') as payee, COALESCE(category_groups.name, '') as category_group, COALESCE(categories.name, '') as category accounts.name as account, COALESCE(payees.name, '') as payee, COALESCE(category_groups.name, '') as category_group, COALESCE(categories.name, '') as category
FROM transactions FROM transactions
INNER JOIN accounts ON accounts.id = transactions.account_id INNER JOIN accounts ON accounts.id = transactions.account_id
@ -35,7 +35,7 @@ ORDER BY transactions.date DESC
LIMIT 200; LIMIT 200;
-- name: GetTransactionsForAccount :many -- name: GetTransactionsForAccount :many
SELECT transactions.id, transactions.date, transactions.memo, transactions.amount, transactions.group_id, SELECT transactions.id, transactions.date, transactions.memo, transactions.amount, transactions.group_id, transactions.status,
accounts.name as account, COALESCE(payees.name, '') as payee, COALESCE(category_groups.name, '') as category_group, COALESCE(categories.name, '') as category accounts.name as account, COALESCE(payees.name, '') as payee, COALESCE(category_groups.name, '') as category_group, COALESCE(categories.name, '') as category
FROM transactions FROM transactions
INNER JOIN accounts ON accounts.id = transactions.account_id INNER JOIN accounts ON accounts.id = transactions.account_id

View File

@ -0,0 +1,12 @@
-- +goose Up
CREATE TYPE transaction_status AS ENUM (
'Reconciled',
'Cleared',
'Uncleared'
);
ALTER TABLE transactions ADD COLUMN status transaction_status NOT NULL DEFAULT 'Uncleared';
-- +goose Down
ALTER TABLE transactions DROP COLUMN status;
DROP TYPE transaction_status;

View File

@ -12,9 +12,9 @@ import (
const createTransaction = `-- name: CreateTransaction :one const createTransaction = `-- name: CreateTransaction :one
INSERT INTO transactions INSERT INTO transactions
(date, memo, amount, account_id, payee_id, category_id, group_id) (date, memo, amount, account_id, payee_id, category_id, group_id, status)
VALUES ($1, $2, $3, $4, $5, $6, $7) VALUES ($1, $2, $3, $4, $5, $6, $7, $8)
RETURNING id, date, memo, amount, account_id, category_id, payee_id, group_id RETURNING id, date, memo, amount, account_id, category_id, payee_id, group_id, status
` `
type CreateTransactionParams struct { type CreateTransactionParams struct {
@ -25,6 +25,7 @@ type CreateTransactionParams struct {
PayeeID uuid.NullUUID PayeeID uuid.NullUUID
CategoryID uuid.NullUUID CategoryID uuid.NullUUID
GroupID uuid.NullUUID GroupID uuid.NullUUID
Status TransactionStatus
} }
func (q *Queries) CreateTransaction(ctx context.Context, arg CreateTransactionParams) (Transaction, error) { func (q *Queries) CreateTransaction(ctx context.Context, arg CreateTransactionParams) (Transaction, error) {
@ -36,6 +37,7 @@ func (q *Queries) CreateTransaction(ctx context.Context, arg CreateTransactionPa
arg.PayeeID, arg.PayeeID,
arg.CategoryID, arg.CategoryID,
arg.GroupID, arg.GroupID,
arg.Status,
) )
var i Transaction var i Transaction
err := row.Scan( err := row.Scan(
@ -47,6 +49,7 @@ func (q *Queries) CreateTransaction(ctx context.Context, arg CreateTransactionPa
&i.CategoryID, &i.CategoryID,
&i.PayeeID, &i.PayeeID,
&i.GroupID, &i.GroupID,
&i.Status,
) )
return i, err return i, err
} }
@ -77,7 +80,7 @@ func (q *Queries) DeleteTransaction(ctx context.Context, id uuid.UUID) error {
} }
const getTransaction = `-- name: GetTransaction :one const getTransaction = `-- name: GetTransaction :one
SELECT id, date, memo, amount, account_id, category_id, payee_id, group_id FROM transactions SELECT id, date, memo, amount, account_id, category_id, payee_id, group_id, status FROM transactions
WHERE id = $1 WHERE id = $1
` `
@ -93,6 +96,7 @@ func (q *Queries) GetTransaction(ctx context.Context, id uuid.UUID) (Transaction
&i.CategoryID, &i.CategoryID,
&i.PayeeID, &i.PayeeID,
&i.GroupID, &i.GroupID,
&i.Status,
) )
return i, err return i, err
} }
@ -132,7 +136,7 @@ func (q *Queries) GetTransactionsByMonthAndCategory(ctx context.Context, budgetI
} }
const getTransactionsForAccount = `-- name: GetTransactionsForAccount :many const getTransactionsForAccount = `-- name: GetTransactionsForAccount :many
SELECT transactions.id, transactions.date, transactions.memo, transactions.amount, transactions.group_id, SELECT transactions.id, transactions.date, transactions.memo, transactions.amount, transactions.group_id, transactions.status,
accounts.name as account, COALESCE(payees.name, '') as payee, COALESCE(category_groups.name, '') as category_group, COALESCE(categories.name, '') as category accounts.name as account, COALESCE(payees.name, '') as payee, COALESCE(category_groups.name, '') as category_group, COALESCE(categories.name, '') as category
FROM transactions FROM transactions
INNER JOIN accounts ON accounts.id = transactions.account_id INNER JOIN accounts ON accounts.id = transactions.account_id
@ -150,6 +154,7 @@ type GetTransactionsForAccountRow struct {
Memo string Memo string
Amount Numeric Amount Numeric
GroupID uuid.NullUUID GroupID uuid.NullUUID
Status TransactionStatus
Account string Account string
Payee string Payee string
CategoryGroup string CategoryGroup string
@ -171,6 +176,7 @@ func (q *Queries) GetTransactionsForAccount(ctx context.Context, accountID uuid.
&i.Memo, &i.Memo,
&i.Amount, &i.Amount,
&i.GroupID, &i.GroupID,
&i.Status,
&i.Account, &i.Account,
&i.Payee, &i.Payee,
&i.CategoryGroup, &i.CategoryGroup,
@ -190,7 +196,7 @@ func (q *Queries) GetTransactionsForAccount(ctx context.Context, accountID uuid.
} }
const getTransactionsForBudget = `-- name: GetTransactionsForBudget :many const getTransactionsForBudget = `-- name: GetTransactionsForBudget :many
SELECT transactions.id, transactions.date, transactions.memo, transactions.amount, transactions.group_id, SELECT transactions.id, transactions.date, transactions.memo, transactions.amount, transactions.group_id, transactions.status,
accounts.name as account, COALESCE(payees.name, '') as payee, COALESCE(category_groups.name, '') as category_group, COALESCE(categories.name, '') as category accounts.name as account, COALESCE(payees.name, '') as payee, COALESCE(category_groups.name, '') as category_group, COALESCE(categories.name, '') as category
FROM transactions FROM transactions
INNER JOIN accounts ON accounts.id = transactions.account_id INNER JOIN accounts ON accounts.id = transactions.account_id
@ -208,6 +214,7 @@ type GetTransactionsForBudgetRow struct {
Memo string Memo string
Amount Numeric Amount Numeric
GroupID uuid.NullUUID GroupID uuid.NullUUID
Status TransactionStatus
Account string Account string
Payee string Payee string
CategoryGroup string CategoryGroup string
@ -229,6 +236,7 @@ func (q *Queries) GetTransactionsForBudget(ctx context.Context, budgetID uuid.UU
&i.Memo, &i.Memo,
&i.Amount, &i.Amount,
&i.GroupID, &i.GroupID,
&i.Status,
&i.Account, &i.Account,
&i.Payee, &i.Payee,
&i.CategoryGroup, &i.CategoryGroup,

View File

@ -165,12 +165,23 @@ func (ynab *YNABImport) ImportTransactions(r io.Reader) error {
return fmt.Errorf("could not parse amount from (%s/%s): %w", inflow, outflow, err) return fmt.Errorf("could not parse amount from (%s/%s): %w", inflow, outflow, err)
} }
statusEnum := TransactionStatusUncleared
status := record[10]
switch status {
case "Cleared":
statusEnum = TransactionStatusCleared
case "Reconciled":
statusEnum = TransactionStatusReconciled
case "Uncleared":
}
transaction := CreateTransactionParams{ transaction := CreateTransactionParams{
Date: date, Date: date,
Memo: memo, Memo: memo,
AccountID: account.ID, AccountID: account.ID,
CategoryID: category, CategoryID: category,
Amount: amount, Amount: amount,
Status: statusEnum,
} }
payeeName := record[3] payeeName := record[3]
@ -237,8 +248,6 @@ func (ynab *YNABImport) ImportTransactions(r io.Reader) error {
} }
} }
//status := record[10]
count++ count++
} }

View File

@ -33,6 +33,9 @@
<a href="/budget/{{$.Budget.ID}}/transaction/{{.ID}}">{{.Memo}}</a> <a href="/budget/{{$.Budget.ID}}/transaction/{{.ID}}">{{.Memo}}</a>
</td> </td>
{{template "amount-cell" .Amount}} {{template "amount-cell" .Amount}}
<td>
{{.Status}}
</td>
</tr> </tr>
{{end}} {{end}}
</table> </table>