diff --git a/types/account.go b/types/account.go new file mode 100644 index 0000000..f0376ec --- /dev/null +++ b/types/account.go @@ -0,0 +1,27 @@ +package types + +import ( + "time" + + "github.com/google/uuid" +) + +// The Account holds money +type Account struct { + Id uuid.UUID + UserId uuid.UUID `db:"user_id"` + + // Custom Name of the account, e.g. "Bank", "Cash", "Credit Card" + Name string + + CurrentBalance int64 `db:"current_balance"` + LastTransaction *time.Time `db:"last_transaction"` + // The current precalculated value of: + // Account.Balance - [PiggyBank.Balance...] + OinkBalance int64 `db:"oink_balance"` + + CreatedAt time.Time `db:"created_at"` + CreatedBy uuid.UUID `db:"created_by"` + UpdatedAt *time.Time `db:"updated_at"` + UpdatedBy *uuid.UUID `db:"updated_by"` +} diff --git a/types/money.go b/types/money.go deleted file mode 100644 index 090bff9..0000000 --- a/types/money.go +++ /dev/null @@ -1,91 +0,0 @@ -package types - -import ( - "time" - - "github.com/google/uuid" -) - -// At the center of the application is the transaction. -// -// Every piece of data should be calculated based on transactions. This means potential calculation errors can be fixed later in time. -// -// If it becomes necessary to precalculate snapshots for performance reasons, this can be done in the future. But the transaction should always be the source of truth. -type Transaction struct { - Id uuid.UUID - UserId uuid.UUID - - AccountId uuid.UUID - // nil indicates that the transaction is not yet associated with a piggy bank - PiggyBankId *uuid.UUID - - // The internal transaction is amove between e.g. an account and a piggy bank to execute a savings plan - Internal bool - - // The value of the transacion. Negative for outgoing and positive for incoming - Value int64 - Timestamp time.Time - - Note string - - CreatedAt time.Time - // either "" or "system-" - CreatedBy uuid.UUID - UpdatedAt time.Time - UpdatedBy uuid.UUID -} - -// The Account holds money -type Account struct { - Id uuid.UUID - UserId uuid.UUID `db:"user_id"` - - // Custom Name of the account, e.g. "Bank", "Cash", "Credit Card" - Name string - - CurrentBalance int64 `db:"current_balance"` - LastTransaction *time.Time `db:"last_transaction"` - // The current precalculated value of: - // Account.Balance - [PiggyBank.Balance...] - OinkBalance int64 `db:"oink_balance"` - - CreatedAt time.Time `db:"created_at"` - CreatedBy uuid.UUID `db:"created_by"` - UpdatedAt *time.Time `db:"updated_at"` - UpdatedBy *uuid.UUID `db:"updated_by"` -} - -// The PiggyBank is a fictional account. The money it "holds" is actually in the Account -type PiggyBank struct { - Id uuid.UUID - UserId uuid.UUID - - AccountId uuid.UUID - Name string - - CurrentBalance int64 - - CreatedAt time.Time - CreatedBy uuid.UUID - UpdatedAt *time.Time - UpdatedBy *uuid.UUID -} - -// The SavingsPlan is applied every interval to the PiggyBank/Account as a transaction -type SavingsPlan struct { - Id uuid.UUID - UserId uuid.UUID - - PiggyBankId uuid.UUID - - MonthlySaving int64 - - ValidFrom time.Time - /// nil means it is valid indefinitely - ValidTo *time.Time - - CreatedAt time.Time - CreatedBy uuid.UUID - UpdatedAt *time.Time - UpdatedBy *uuid.UUID -} diff --git a/types/savings_plan.go b/types/savings_plan.go new file mode 100644 index 0000000..d4d5e09 --- /dev/null +++ b/types/savings_plan.go @@ -0,0 +1,26 @@ +package types + +import ( + "time" + + "github.com/google/uuid" +) + +// The SavingsPlan is applied every interval to the TreasureChest/Account as a transaction +type SavingsPlan struct { + Id uuid.UUID + UserId uuid.UUID `db:"user_id"` + + TreasureChestId uuid.UUID `db:"treasure_chest_id"` + + MonthlySaving int64 `db:"monthly_saving"` + + ValidFrom time.Time `db:"valid_from"` + /// nil means it is valid indefinitely + ValidTo *time.Time `db:"valid_to"` + + CreatedAt time.Time `db:"created_at"` + CreatedBy uuid.UUID `db:"created_by"` + UpdatedAt *time.Time `db:"updated_at"` + UpdatedBy *uuid.UUID `db:"updated_by"` +} diff --git a/types/transaction.go b/types/transaction.go new file mode 100644 index 0000000..1f22c0f --- /dev/null +++ b/types/transaction.go @@ -0,0 +1,37 @@ +package types + +import ( + "time" + + "github.com/google/uuid" +) + +// At the center of the application is the transaction. +// +// Every piece of data should be calculated based on transactions. +// This means potential calculation errors can be fixed later in time. +// +// If it becomes necessary to precalculate snapshots for performance reasons, this can be done in the future. +// But the transaction should always be the source of truth. +type Transaction struct { + Id uuid.UUID + UserId uuid.UUID `db:"user_id"` + + AccountId uuid.UUID `db:"account_id"` + // nil indicates that the transaction is not yet associated with a piggy bank + TreasureChestId *uuid.UUID `db:"treasure_chest_id"` + + // The internal transaction is amove between e.g. an account and a piggy bank to execute a savings plan + Internal bool + + // The value of the transacion. Negative for outgoing and positive for incoming + Value int64 + Timestamp time.Time + + Note string + + CreatedAt time.Time `db:"created_at"` + CreatedBy uuid.UUID `db:"created_by"` + UpdatedAt *time.Time `db:"updated_at"` + UpdatedBy *uuid.UUID `db:"updated_by"` +} diff --git a/types/treasure.go b/types/treasure.go new file mode 100644 index 0000000..32f491f --- /dev/null +++ b/types/treasure.go @@ -0,0 +1,24 @@ +package types + +import ( + "time" + + "github.com/google/uuid" +) + +// The TreasureChest is a fictional account. +// The money it "holds" is actually in the linked Account +type TreasureChest struct { + Id uuid.UUID + UserId uuid.UUID `db:"user_id"` + + AccountId uuid.UUID `db:"account_id"` + Name string + + CurrentBalance int64 `db:"current_balance"` + + CreatedAt time.Time `db:"created_at"` + CreatedBy uuid.UUID `db:"created_by"` + UpdatedAt *time.Time `db:"updated_at"` + UpdatedBy *uuid.UUID `db:"updated_by"` +}