Start implementing ynab import
This commit is contained in:
parent
63c1b4fbab
commit
7b6914e5f2
109
http/ynab-import.go
Normal file
109
http/ynab-import.go
Normal 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
49
postgres/payees.sql.go
Normal 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
|
||||
}
|
9
postgres/queries/payees.sql
Normal file
9
postgres/queries/payees.sql
Normal 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;
|
Loading…
x
Reference in New Issue
Block a user