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