Extract package
This commit is contained in:
@ -6,6 +6,7 @@ package postgres
|
||||
import (
|
||||
"context"
|
||||
|
||||
"git.javil.eu/jacob1123/budgeteer/postgres/numeric"
|
||||
"github.com/google/uuid"
|
||||
)
|
||||
|
||||
@ -97,7 +98,7 @@ type GetAccountsWithBalanceRow struct {
|
||||
ID uuid.UUID
|
||||
Name string
|
||||
OnBudget bool
|
||||
Balance Numeric
|
||||
Balance numeric.Numeric
|
||||
}
|
||||
|
||||
func (q *Queries) GetAccountsWithBalance(ctx context.Context, budgetID uuid.UUID) ([]GetAccountsWithBalanceRow, error) {
|
||||
|
@ -7,6 +7,7 @@ import (
|
||||
"context"
|
||||
"time"
|
||||
|
||||
"git.javil.eu/jacob1123/budgeteer/postgres/numeric"
|
||||
"github.com/google/uuid"
|
||||
)
|
||||
|
||||
@ -21,7 +22,7 @@ RETURNING id, category_id, date, memo, amount
|
||||
|
||||
type CreateAssignmentParams struct {
|
||||
Date time.Time
|
||||
Amount Numeric
|
||||
Amount numeric.Numeric
|
||||
CategoryID uuid.UUID
|
||||
}
|
||||
|
||||
@ -65,7 +66,7 @@ type GetAllAssignmentsRow struct {
|
||||
Date time.Time
|
||||
Category string
|
||||
Group string
|
||||
Amount Numeric
|
||||
Amount numeric.Numeric
|
||||
}
|
||||
|
||||
func (q *Queries) GetAllAssignments(ctx context.Context, budgetID uuid.UUID) ([]GetAllAssignmentsRow, error) {
|
||||
|
@ -7,6 +7,7 @@ import (
|
||||
"context"
|
||||
"time"
|
||||
|
||||
"git.javil.eu/jacob1123/budgeteer/postgres/numeric"
|
||||
"github.com/google/uuid"
|
||||
)
|
||||
|
||||
@ -23,10 +24,10 @@ ORDER BY COALESCE(ass.date, tra.date), COALESCE(ass.category_id, tra.category_id
|
||||
type GetCumultativeBalancesRow struct {
|
||||
Date time.Time
|
||||
CategoryID uuid.UUID
|
||||
Assignments Numeric
|
||||
AssignmentsCum Numeric
|
||||
Transactions Numeric
|
||||
TransactionsCum Numeric
|
||||
Assignments numeric.Numeric
|
||||
AssignmentsCum numeric.Numeric
|
||||
Transactions numeric.Numeric
|
||||
TransactionsCum numeric.Numeric
|
||||
}
|
||||
|
||||
func (q *Queries) GetCumultativeBalances(ctx context.Context, budgetID uuid.UUID) ([]GetCumultativeBalancesRow, error) {
|
||||
|
@ -7,6 +7,7 @@ import (
|
||||
"fmt"
|
||||
"time"
|
||||
|
||||
"git.javil.eu/jacob1123/budgeteer/postgres/numeric"
|
||||
"github.com/google/uuid"
|
||||
)
|
||||
|
||||
@ -42,7 +43,7 @@ type Assignment struct {
|
||||
CategoryID uuid.UUID
|
||||
Date time.Time
|
||||
Memo sql.NullString
|
||||
Amount Numeric
|
||||
Amount numeric.Numeric
|
||||
}
|
||||
|
||||
type AssignmentsByMonth struct {
|
||||
@ -81,7 +82,7 @@ type Transaction struct {
|
||||
ID uuid.UUID
|
||||
Date time.Time
|
||||
Memo string
|
||||
Amount Numeric
|
||||
Amount numeric.Numeric
|
||||
AccountID uuid.UUID
|
||||
CategoryID uuid.NullUUID
|
||||
PayeeID uuid.NullUUID
|
||||
|
@ -1,8 +1,10 @@
|
||||
package postgres
|
||||
package numeric
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"math/big"
|
||||
"strings"
|
||||
"unicode/utf8"
|
||||
|
||||
"github.com/jackc/pgtype"
|
||||
)
|
||||
@ -11,7 +13,7 @@ type Numeric struct {
|
||||
pgtype.Numeric
|
||||
}
|
||||
|
||||
func NewZeroNumeric() Numeric {
|
||||
func Zero() Numeric {
|
||||
return Numeric{pgtype.Numeric{Exp: 0, Int: big.NewInt(0), Status: pgtype.Present, NaN: false}}
|
||||
}
|
||||
|
||||
@ -165,3 +167,27 @@ func (n Numeric) MarshalJSON() ([]byte, error) {
|
||||
bytesWithSeparator = append(bytesWithSeparator, bytes[split:]...)
|
||||
return bytesWithSeparator, nil
|
||||
}
|
||||
|
||||
func Parse(text string) (Numeric, error) {
|
||||
// Remove trailing currency
|
||||
text = trimLastChar(text)
|
||||
|
||||
// Unify decimal separator
|
||||
text = strings.Replace(text, ",", ".", 1)
|
||||
|
||||
num := Numeric{}
|
||||
err := num.Set(text)
|
||||
if err != nil {
|
||||
return num, fmt.Errorf("parse numeric %s: %w", text, err)
|
||||
}
|
||||
|
||||
return num, nil
|
||||
}
|
||||
|
||||
func trimLastChar(s string) string {
|
||||
r, size := utf8.DecodeLastRuneInString(s)
|
||||
if r == utf8.RuneError && (size == 0 || size == 1) {
|
||||
size = 0
|
||||
}
|
||||
return s[:len(s)-size]
|
||||
}
|
@ -7,6 +7,7 @@ import (
|
||||
"context"
|
||||
"time"
|
||||
|
||||
"git.javil.eu/jacob1123/budgeteer/postgres/numeric"
|
||||
"github.com/google/uuid"
|
||||
)
|
||||
|
||||
@ -20,7 +21,7 @@ RETURNING id, date, memo, amount, account_id, category_id, payee_id, group_id, s
|
||||
type CreateTransactionParams struct {
|
||||
Date time.Time
|
||||
Memo string
|
||||
Amount Numeric
|
||||
Amount numeric.Numeric
|
||||
AccountID uuid.UUID
|
||||
PayeeID uuid.NullUUID
|
||||
CategoryID uuid.NullUUID
|
||||
@ -95,7 +96,7 @@ type GetAllTransactionsForBudgetRow struct {
|
||||
ID uuid.UUID
|
||||
Date time.Time
|
||||
Memo string
|
||||
Amount Numeric
|
||||
Amount numeric.Numeric
|
||||
GroupID uuid.NullUUID
|
||||
Status TransactionStatus
|
||||
Account string
|
||||
@ -222,7 +223,7 @@ type GetTransactionsForAccountRow struct {
|
||||
ID uuid.UUID
|
||||
Date time.Time
|
||||
Memo string
|
||||
Amount Numeric
|
||||
Amount numeric.Numeric
|
||||
GroupID uuid.NullUUID
|
||||
Status TransactionStatus
|
||||
Account string
|
||||
@ -281,7 +282,7 @@ WHERE id = $7
|
||||
type UpdateTransactionParams struct {
|
||||
Date time.Time
|
||||
Memo string
|
||||
Amount Numeric
|
||||
Amount numeric.Numeric
|
||||
AccountID uuid.UUID
|
||||
PayeeID uuid.NullUUID
|
||||
CategoryID uuid.NullUUID
|
||||
|
@ -6,6 +6,7 @@ import (
|
||||
"fmt"
|
||||
"io"
|
||||
|
||||
"git.javil.eu/jacob1123/budgeteer/postgres/numeric"
|
||||
"github.com/google/uuid"
|
||||
)
|
||||
|
||||
@ -43,8 +44,8 @@ func (ynab *YNABExport) ExportAssignments(context context.Context, w io.Writer)
|
||||
assignment.Group,
|
||||
assignment.Category,
|
||||
assignment.Amount.String() + "€",
|
||||
NewZeroNumeric().String() + "€",
|
||||
NewZeroNumeric().String() + "€",
|
||||
numeric.Zero().String() + "€",
|
||||
numeric.Zero().String() + "€",
|
||||
}
|
||||
|
||||
err := csv.Write(row)
|
||||
@ -129,9 +130,9 @@ func GetTransactionRow(transaction GetAllTransactionsForBudgetRow) []string {
|
||||
row = append(row, transaction.Memo)
|
||||
|
||||
if transaction.Amount.IsPositive() {
|
||||
row = append(row, NewZeroNumeric().String()+"€", transaction.Amount.String()+"€")
|
||||
row = append(row, numeric.Zero().String()+"€", transaction.Amount.String()+"€")
|
||||
} else {
|
||||
row = append(row, transaction.Amount.String()[1:]+"€", NewZeroNumeric().String()+"€")
|
||||
row = append(row, transaction.Amount.String()[1:]+"€", numeric.Zero().String()+"€")
|
||||
}
|
||||
|
||||
return append(row, string(transaction.Status))
|
||||
|
@ -7,8 +7,8 @@ import (
|
||||
"io"
|
||||
"strings"
|
||||
"time"
|
||||
"unicode/utf8"
|
||||
|
||||
"git.javil.eu/jacob1123/budgeteer/postgres/numeric"
|
||||
"github.com/google/uuid"
|
||||
)
|
||||
|
||||
@ -242,7 +242,7 @@ func (ynab *YNABImport) ImportRegularTransaction(context context.Context, payeeN
|
||||
|
||||
func (ynab *YNABImport) ImportTransferTransaction(context context.Context, payeeName string,
|
||||
transaction CreateTransactionParams, openTransfers *[]Transfer,
|
||||
account *Account, amount Numeric) error {
|
||||
account *Account, amount numeric.Numeric) error {
|
||||
transferToAccountName := payeeName[11:]
|
||||
transferToAccount, err := ynab.GetAccount(context, transferToAccountName)
|
||||
if err != nil {
|
||||
@ -295,34 +295,10 @@ func (ynab *YNABImport) ImportTransferTransaction(context context.Context, payee
|
||||
return nil
|
||||
}
|
||||
|
||||
func trimLastChar(s string) string {
|
||||
r, size := utf8.DecodeLastRuneInString(s)
|
||||
if r == utf8.RuneError && (size == 0 || size == 1) {
|
||||
size = 0
|
||||
}
|
||||
return s[:len(s)-size]
|
||||
}
|
||||
|
||||
func ParseNumeric(text string) (Numeric, error) {
|
||||
// Remove trailing currency
|
||||
text = trimLastChar(text)
|
||||
|
||||
// Unify decimal separator
|
||||
text = strings.Replace(text, ",", ".", 1)
|
||||
|
||||
num := Numeric{}
|
||||
err := num.Set(text)
|
||||
func GetAmount(inflow string, outflow string) (numeric.Numeric, error) {
|
||||
in, err := numeric.Parse(inflow)
|
||||
if err != nil {
|
||||
return num, fmt.Errorf("parse numeric %s: %w", text, err)
|
||||
}
|
||||
|
||||
return num, nil
|
||||
}
|
||||
|
||||
func GetAmount(inflow string, outflow string) (Numeric, error) {
|
||||
in, err := ParseNumeric(inflow)
|
||||
if err != nil {
|
||||
return in, err
|
||||
return in, fmt.Errorf("parse inflow: %w", err)
|
||||
}
|
||||
|
||||
if !in.IsZero() {
|
||||
@ -330,9 +306,9 @@ func GetAmount(inflow string, outflow string) (Numeric, error) {
|
||||
}
|
||||
|
||||
// if inflow is zero, use outflow
|
||||
out, err := ParseNumeric("-" + outflow)
|
||||
out, err := numeric.Parse("-" + outflow)
|
||||
if err != nil {
|
||||
return out, err
|
||||
return out, fmt.Errorf("parse outflow: %w", err)
|
||||
}
|
||||
return out, nil
|
||||
}
|
||||
|
Reference in New Issue
Block a user