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 }