Start implementing ynab import

This commit is contained in:
Jan Bader 2021-12-02 15:28:52 +00:00
parent 63c1b4fbab
commit 7b6914e5f2
3 changed files with 167 additions and 0 deletions

109
http/ynab-import.go Normal file
View File

@ -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
}

49
postgres/payees.sql.go Normal file
View File

@ -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
}

View File

@ -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;