diff --git a/postgres/numeric/numeric.go b/postgres/numeric/numeric.go index 753feff..8d0cc5e 100644 --- a/postgres/numeric/numeric.go +++ b/postgres/numeric/numeric.go @@ -129,7 +129,11 @@ func (n Numeric) String() string { exp = -exp for length <= exp { - bytes = append(bytes, byte('0')) + if n.Int.Int64() < 0 { + bytes = append([]byte{bytes[0], byte('0')}, bytes[1:]...) + } else { + bytes = append([]byte{byte('0')}, bytes...) + } length++ } @@ -166,7 +170,11 @@ func (n Numeric) MarshalJSON() ([]byte, error) { exp = -exp for length <= exp { - bytes = append(bytes, byte('0')) + if n.Int.Int64() < 0 { + bytes = append([]byte{bytes[0], byte('0')}, bytes[1:]...) + } else { + bytes = append([]byte{byte('0')}, bytes...) + } length++ } diff --git a/postgres/numeric/numeric_test.go b/postgres/numeric/numeric_test.go index b7ef5e9..061ff9b 100644 --- a/postgres/numeric/numeric_test.go +++ b/postgres/numeric/numeric_test.go @@ -17,6 +17,23 @@ func TestMarshalJSON(t *testing.T) { {numeric.Zero(), `0`}, {numeric.MustParse("1.23"), "1.23"}, {numeric.MustParse("1,24"), "1.24"}, + {numeric.MustParse("1"), "1"}, + {numeric.MustParse("10"), "10"}, + {numeric.MustParse("100"), "100"}, + {numeric.MustParse("1000"), "1000"}, + {numeric.MustParse("0.1"), "0.1"}, + {numeric.MustParse("0.01"), "0.01"}, + {numeric.MustParse("0.001"), "0.001"}, + {numeric.MustParse("0.0001"), "0.0001"}, + {numeric.MustParse("-1"), "-1"}, + {numeric.MustParse("-10"), "-10"}, + {numeric.MustParse("-100"), "-100"}, + {numeric.MustParse("-1000"), "-1000"}, + {numeric.MustParse("-0.1"), "-0.1"}, + {numeric.MustParse("-0.01"), "-0.01"}, + {numeric.MustParse("-0.001"), "-0.001"}, + {numeric.MustParse("-0.0001"), "-0.0001"}, + {numeric.MustParse("123456789.12345"), "123456789.12345"}, {numeric.MustParse("123456789.12345"), "123456789.12345"}, {numeric.MustParse("-1.23"), "-1.23"}, {numeric.MustParse("-1,24"), "-1.24"}, @@ -53,6 +70,19 @@ func TestParse(t *testing.T) { {numeric.FromInt64WithExp(1, 0), `1`}, {numeric.FromInt64WithExp(1, 1), `10`}, {numeric.FromInt64WithExp(1, 2), `100`}, + {numeric.FromInt64WithExp(1, 3), `1000`}, + {numeric.FromInt64WithExp(1, -1), `0.1`}, + {numeric.FromInt64WithExp(1, -2), `0.01`}, + {numeric.FromInt64WithExp(1, -3), `0.001`}, + {numeric.FromInt64WithExp(1, -4), `0.0001`}, + {numeric.FromInt64WithExp(-1, 0), `-1`}, + {numeric.FromInt64WithExp(-1, 1), `-10`}, + {numeric.FromInt64WithExp(-1, 2), `-100`}, + {numeric.FromInt64WithExp(-1, 3), `-1000`}, + {numeric.FromInt64WithExp(-1, -1), `-0.1`}, + {numeric.FromInt64WithExp(-1, -2), `-0.01`}, + {numeric.FromInt64WithExp(-1, -3), `-0.001`}, + {numeric.FromInt64WithExp(-1, -4), `-0.0001`}, {numeric.FromInt64WithExp(123, -2), "1.23"}, {numeric.FromInt64WithExp(124, -2), "1,24"}, {numeric.FromInt64WithExp(12345678912345, -5), "123456789.12345"}, diff --git a/postgres/queries/transactions.sql b/postgres/queries/transactions.sql index 291b357..8ad3504 100644 --- a/postgres/queries/transactions.sql +++ b/postgres/queries/transactions.sql @@ -23,8 +23,19 @@ DELETE FROM transactions WHERE id = $1; -- name: GetAllTransactionsForBudget :many -SELECT transactions.id, transactions.date, transactions.memo, transactions.amount, transactions.group_id, transactions.status, - accounts.name as account, COALESCE(payees.name, '') as payee, COALESCE(category_groups.name, '') as category_group, COALESCE(categories.name, '') as category +SELECT transactions.id, transactions.date, transactions.memo, + transactions.amount, transactions.group_id, transactions.status, + accounts.name as account, + COALESCE(payees.name, '') as payee, + COALESCE(category_groups.name, '') as category_group, + COALESCE(categories.name, '') as category, + COALESCE(( + SELECT CONCAT(otherAccounts.name) + FROM transactions otherTransactions + LEFT JOIN accounts otherAccounts ON otherAccounts.id = otherTransactions.account_id + WHERE otherTransactions.group_id = transactions.group_id + AND otherTransactions.id != transactions.id + ), '')::text as transfer_account FROM transactions INNER JOIN accounts ON accounts.id = transactions.account_id LEFT JOIN payees ON payees.id = transactions.payee_id @@ -40,13 +51,13 @@ SELECT transactions.id, transactions.date, transactions.memo, COALESCE(payees.name, '') as payee, COALESCE(category_groups.name, '') as category_group, COALESCE(categories.name, '') as category, - ( + COALESCE(( SELECT CONCAT(otherAccounts.name) FROM transactions otherTransactions LEFT JOIN accounts otherAccounts ON otherAccounts.id = otherTransactions.account_id WHERE otherTransactions.group_id = transactions.group_id AND otherTransactions.id != transactions.id - ) as transfer_account + ), '')::text as transfer_account FROM transactions INNER JOIN accounts ON accounts.id = transactions.account_id LEFT JOIN payees ON payees.id = transactions.payee_id diff --git a/postgres/transactions.sql.go b/postgres/transactions.sql.go index 0b57967..e9bf8f8 100644 --- a/postgres/transactions.sql.go +++ b/postgres/transactions.sql.go @@ -81,8 +81,19 @@ func (q *Queries) DeleteTransaction(ctx context.Context, id uuid.UUID) error { } const getAllTransactionsForBudget = `-- name: GetAllTransactionsForBudget :many -SELECT transactions.id, transactions.date, transactions.memo, transactions.amount, transactions.group_id, transactions.status, - accounts.name as account, COALESCE(payees.name, '') as payee, COALESCE(category_groups.name, '') as category_group, COALESCE(categories.name, '') as category +SELECT transactions.id, transactions.date, transactions.memo, + transactions.amount, transactions.group_id, transactions.status, + accounts.name as account, + COALESCE(payees.name, '') as payee, + COALESCE(category_groups.name, '') as category_group, + COALESCE(categories.name, '') as category, + COALESCE(( + SELECT CONCAT(otherAccounts.name) + FROM transactions otherTransactions + LEFT JOIN accounts otherAccounts ON otherAccounts.id = otherTransactions.account_id + WHERE otherTransactions.group_id = transactions.group_id + AND otherTransactions.id != transactions.id + ), '')::text as transfer_account FROM transactions INNER JOIN accounts ON accounts.id = transactions.account_id LEFT JOIN payees ON payees.id = transactions.payee_id @@ -93,16 +104,17 @@ ORDER BY transactions.date DESC ` type GetAllTransactionsForBudgetRow struct { - ID uuid.UUID - Date time.Time - Memo string - Amount numeric.Numeric - GroupID uuid.NullUUID - Status TransactionStatus - Account string - Payee string - CategoryGroup string - Category string + ID uuid.UUID + Date time.Time + Memo string + Amount numeric.Numeric + GroupID uuid.NullUUID + Status TransactionStatus + Account string + Payee string + CategoryGroup string + Category string + TransferAccount string } func (q *Queries) GetAllTransactionsForBudget(ctx context.Context, budgetID uuid.UUID) ([]GetAllTransactionsForBudgetRow, error) { @@ -125,6 +137,7 @@ func (q *Queries) GetAllTransactionsForBudget(ctx context.Context, budgetID uuid &i.Payee, &i.CategoryGroup, &i.Category, + &i.TransferAccount, ); err != nil { return nil, err } @@ -202,13 +215,13 @@ SELECT transactions.id, transactions.date, transactions.memo, COALESCE(payees.name, '') as payee, COALESCE(category_groups.name, '') as category_group, COALESCE(categories.name, '') as category, - ( + COALESCE(( SELECT CONCAT(otherAccounts.name) FROM transactions otherTransactions LEFT JOIN accounts otherAccounts ON otherAccounts.id = otherTransactions.account_id WHERE otherTransactions.group_id = transactions.group_id AND otherTransactions.id != transactions.id - ) as transfer_account + ), '')::text as transfer_account FROM transactions INNER JOIN accounts ON accounts.id = transactions.account_id LEFT JOIN payees ON payees.id = transactions.payee_id @@ -230,7 +243,7 @@ type GetTransactionsForAccountRow struct { Payee string CategoryGroup string Category string - TransferAccount interface{} + TransferAccount string } func (q *Queries) GetTransactionsForAccount(ctx context.Context, accountID uuid.UUID) ([]GetTransactionsForAccountRow, error) { diff --git a/postgres/ynab-export.go b/postgres/ynab-export.go index eefc9dd..35d822b 100644 --- a/postgres/ynab-export.go +++ b/postgres/ynab-export.go @@ -115,12 +115,17 @@ func GetTransactionRow(transaction GetAllTransactionsForBudgetRow) []string { transaction.Account, "", // Flag transaction.Date.Format("02.01.2006"), - transaction.Payee, + } + + if transaction.TransferAccount != "" { + row = append(row, "Transfer : "+transaction.TransferAccount) + } else { + row = append(row, transaction.Payee) } if transaction.CategoryGroup != "" && transaction.Category != "" { row = append(row, - transaction.CategoryGroup+" : "+transaction.Category, + transaction.CategoryGroup+": "+transaction.Category, transaction.CategoryGroup, transaction.Category) } else {