From 7b6914e5f2086652cf7ca003cbfa067902ab04ef Mon Sep 17 00:00:00 2001 From: Jan Bader Date: Thu, 2 Dec 2021 15:28:52 +0000 Subject: [PATCH] Start implementing ynab import --- http/ynab-import.go | 109 ++++++++++++++++++++++++++++++++++++ postgres/payees.sql.go | 49 ++++++++++++++++ postgres/queries/payees.sql | 9 +++ 3 files changed, 167 insertions(+) create mode 100644 http/ynab-import.go create mode 100644 postgres/payees.sql.go create mode 100644 postgres/queries/payees.sql diff --git a/http/ynab-import.go b/http/ynab-import.go new file mode 100644 index 0000000..c368826 --- /dev/null +++ b/http/ynab-import.go @@ -0,0 +1,109 @@ +package http + +import ( + "context" + "encoding/csv" + "io" + "time" + + "git.javil.eu/jacob1123/budgeteer/postgres" + "github.com/google/uuid" +) + +type YNABImport struct { + Context context.Context + accounts []postgres.Account + payees []postgres.Payee + queries *postgres.Queries +} + +func NewYNABImport(q *postgres.Queries) (*YNABImport, error) { + accounts, err := q.GetAccounts(context.Background(), uuid.UUID{}) + if err != nil { + return nil, err + } + + payees, err := q.GetPayees(context.Background(), uuid.UUID{}) + if err != nil { + return nil, err + } + + return &YNABImport{ + Context: context.Background(), + accounts: accounts, + payees: payees, + queries: q, + }, nil + +} + +func (ynab *YNABImport) Import(q *postgres.Queries, r io.Reader) error { + csv := csv.NewReader(r) + csv.Comma = '\t' + + csvData, err := csv.ReadAll() + if err != nil { + return err + } + + for _, record := range csvData { + accountName := record[0] + account, err := ynab.GetAccount(accountName) + if err != nil { + return err + } + + //flag := record[1] + + dateString := record[2] + date, err := time.Parse("02.01.2006", dateString) + if err != nil { + return err + } + + payee := record[3] + category := record[4] //also in 5 + 6 split by group/category + memo := record[7] + outflow := record[8] + inflow := record[9] + cleared := record[10] + + transaction := postgres.Transaction{ + Date: date, + Memo: memo, + AccountID: account.ID, + } + } +} + +func (ynab *YNABImport) GetAccount(name string) (*postgres.Account, error) { + for _, acc := range ynab.accounts { + if acc.Name == name { + return &acc, nil + } + } + + account, err := ynab.queries.CreateAccount(ynab.Context, name) + if err != nil { + return nil, err + } + + ynab.accounts = append(ynab.accounts, account) + return &account, nil +} + +func (ynab *YNABImport) GetPayee(name string) (*postgres.Payee, error) { + for _, pay := range ynab.payees { + if pay.Name == name { + return &pay, nil + } + } + + payee, err := ynab.queries.CreatePayee(ynab.Context, name) + if err != nil { + return nil, err + } + + ynab.payees = append(ynab.payees, payee) + return &payee, nil +} diff --git a/postgres/payees.sql.go b/postgres/payees.sql.go new file mode 100644 index 0000000..383a15e --- /dev/null +++ b/postgres/payees.sql.go @@ -0,0 +1,49 @@ +// Code generated by sqlc. DO NOT EDIT. +// source: payees.sql + +package postgres + +import ( + "context" + + "github.com/google/uuid" +) + +const createPayee = `-- name: CreatePayee :one +INSERT INTO payees +(name) +VALUES ($1) +RETURNING id, budget_id, name +` + +func (q *Queries) CreatePayee(ctx context.Context, name string) (Payee, error) { + row := q.db.QueryRow(ctx, createPayee, name) + var i Payee + err := row.Scan(&i.ID, &i.BudgetID, &i.Name) + return i, err +} + +const getPayees = `-- name: GetPayees :many +SELECT payees.id, payees.budget_id, payees.name FROM payees +WHERE payees.budget_id = $1 +` + +func (q *Queries) GetPayees(ctx context.Context, budgetID uuid.UUID) ([]Payee, error) { + rows, err := q.db.Query(ctx, getPayees, budgetID) + if err != nil { + return nil, err + } + defer rows.Close() + var items []Payee + for rows.Next() { + var i Payee + if err := rows.Scan(&i.ID, &i.BudgetID, &i.Name); err != nil { + return nil, err + } + items = append(items, i) + } + if err := rows.Err(); err != nil { + return nil, err + } + return items, nil +} diff --git a/postgres/queries/payees.sql b/postgres/queries/payees.sql new file mode 100644 index 0000000..9d25d69 --- /dev/null +++ b/postgres/queries/payees.sql @@ -0,0 +1,9 @@ +-- name: CreatePayee :one +INSERT INTO payees +(name) +VALUES ($1) +RETURNING *; + +-- name: GetPayees :many +SELECT payees.* FROM payees +WHERE payees.budget_id = $1; \ No newline at end of file