models

package
v1.18.1 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jan 6, 2023 License: AGPL-3.0 Imports: 7 Imported by: 1

Documentation

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func Migrate added in v1.1.0

func Migrate(db *gorm.DB) error

Migrate migrates all models to the schema defined in the code.

Types

type Account

type Account struct {
	DefaultModel
	AccountCreate
	Budget            Budget          `json:"-"`
	Balance           decimal.Decimal `json:"balance" gorm:"-" example:"2735.17"`
	ReconciledBalance decimal.Decimal `json:"reconciledBalance" gorm:"-" example:"2539.57"`
}

Account represents an asset account, e.g. a bank account.

func (*Account) BeforeSave

func (a *Account) BeforeSave(tx *gorm.DB) (err error)

BeforeSave sets OnBudget to false when External is true.

func (Account) GetBalanceMonth added in v1.17.1

func (a Account) GetBalanceMonth(db *gorm.DB, month types.Month) (balance, available decimal.Decimal, err error)

GetBalanceMonth calculates the balance and available sums for a specific month.

The balance Decimal is the actual account balance, factoring in all transactions before the end of the month. The available Decimal is the sum that is available for budgeting at the end of the specified month.

func (Account) RecentEnvelopes added in v1.16.0

func (a Account) RecentEnvelopes(db *gorm.DB) (envelopes []Envelope, err error)

RecentEnvelopes returns the most common envelopes used in the last 10 transactions where the account is the destination account.

The list is sorted by decending frequency of the envelope being used.

func (Account) SumReconciled added in v1.18.0

func (a Account) SumReconciled(db *gorm.DB) (balance decimal.Decimal, err error)

Transactions returns all transactions for this account.

func (Account) Transactions

func (a Account) Transactions(db *gorm.DB) []Transaction

Transactions returns all transactions for this account.

func (Account) WithCalculations

func (a Account) WithCalculations(db *gorm.DB) (Account, error)

type AccountCreate

type AccountCreate struct {
	Name               string          `json:"name" example:"Cash" default:""`
	Note               string          `json:"note" example:"Money in my wallet" default:""`
	BudgetID           uuid.UUID       `json:"budgetId" example:"550dc009-cea6-4c12-b2a5-03446eb7b7cf"`
	OnBudget           bool            `json:"onBudget" example:"true" default:"false"` // Always false when external: true
	External           bool            `json:"external" example:"false" default:"false"`
	InitialBalance     decimal.Decimal `json:"initialBalance" example:"173.12" default:"0"`
	InitialBalanceDate *time.Time      `json:"initialBalanceDate" example:"2017-05-12T00:00:00Z"`
	Hidden             bool            `json:"hidden" example:"true" default:"false"`
}

type AggregatedTransaction added in v1.13.1

type AggregatedTransaction struct {
	Amount                     decimal.Decimal
	Date                       time.Time
	SourceAccountExternal      bool
	DestinationAccountExternal bool
}

type Allocation

type Allocation struct {
	DefaultModel
	AllocationCreate
	Envelope Envelope `json:"-"`
}

Allocation represents the allocation of money to an Envelope for a specific month.

type AllocationCreate

type AllocationCreate struct {
	Month  types.Month     `json:"month" gorm:"uniqueIndex:allocation_month_envelope" example:"2021-12-01T00:00:00.000000Z"` // Only year and month of this timestamp are used, everything else is ignored. This will always be set to 00:00 UTC on the first of the specified month
	Amount decimal.Decimal ``                                                                                                // The maximum value is "999999999999.99999999", swagger unfortunately rounds this.
	/* 132-byte string literal not displayed */
	EnvelopeID uuid.UUID `json:"envelopeId" gorm:"uniqueIndex:allocation_month_envelope" example:"a0909e84-e8f9-4cb6-82a5-025dff105ff2"`
}

type Budget

type Budget struct {
	DefaultModel
	BudgetCreate
	Balance decimal.Decimal `json:"balance" gorm:"-" example:"3423.42"`
}

Budget represents a budget

A budget is the highest level of organization in Envelope Zero, all other resources reference it directly or transitively.

func (Budget) Allocated added in v1.18.0

func (b Budget) Allocated(db *gorm.DB, month types.Month) (allocated decimal.Decimal, err error)

Allocated calculates the sum that has been budgeted for a specific month.

func (Budget) Income added in v0.42.0

func (b Budget) Income(db *gorm.DB, month types.Month) (income decimal.Decimal, err error)

Income returns the income for a budget in a given month.

func (Budget) Month added in v1.17.1

func (b Budget) Month(db *gorm.DB, month types.Month, baseURL string) (Month, error)

Month calculates the month overview for this month

FIXME: The baseURL parameterwill get removed with the integration of allocations into MonthConfigs.

func (Budget) WithCalculations added in v0.39.0

func (b Budget) WithCalculations(db *gorm.DB) (Budget, error)

WithCalculations computes all the calculated values.

type BudgetCreate

type BudgetCreate struct {
	Name     string `json:"name" example:"Morre's Budget" default:""`
	Note     string `json:"note" example:"My personal expenses" default:""`
	Currency string `json:"currency" example:"€" default:""`
}

type BudgetMonth

type BudgetMonth struct {
	ID        uuid.UUID       `json:"id" example:"1e777d24-3f5b-4c43-8000-04f65f895578"` // The ID of the Budget
	Name      string          `json:"name" example:"Groceries"`                          // The name of the Budget
	Month     types.Month     `json:"month" example:"2006-05-01T00:00:00.000000Z"`
	Budgeted  decimal.Decimal `json:"budgeted" example:"2100"`
	Income    decimal.Decimal `json:"income" example:"2317.34"`
	Available decimal.Decimal `json:"available" example:"217.34"`
	Envelopes []EnvelopeMonth `json:"envelopes"`
}

type Category

type Category struct {
	DefaultModel
	CategoryCreate
	Budget Budget `json:"-"`
}

Category represents a category of envelopes.

type CategoryCreate

type CategoryCreate struct {
	Name     string    `json:"name" gorm:"uniqueIndex:category_budget_name" example:"Saving" default:""`
	BudgetID uuid.UUID `json:"budgetId" gorm:"uniqueIndex:category_budget_name" example:"52d967d3-33f4-4b04-9ba7-772e5ab9d0ce"`
	Note     string    `json:"note" example:"All envelopes for long-term saving" default:""`
	Hidden   bool      `json:"hidden" example:"true" default:"false"`
}

type CategoryEnvelopes added in v1.1.0

type CategoryEnvelopes struct {
	ID         uuid.UUID       `json:"id" example:"dafd9a74-6aeb-46b9-9f5a-cfca624fea85"` // ID of the category
	Name       string          `json:"name" example:"Rainy Day Funds" default:""`         // Name of the category
	Envelopes  []EnvelopeMonth `json:"envelopes"`                                         // Slice of all envelopes
	Balance    decimal.Decimal `json:"balance" example:"-10.13"`                          // Sum of the balances of the envelopes
	Allocation decimal.Decimal `json:"allocation" example:"90"`                           // Sum of allocations for the envelopes
	Spent      decimal.Decimal `json:"spent" example:"100.13"`                            // Sum spent for all envelopes
}

type DefaultModel added in v1.9.0

type DefaultModel struct {
	ID uuid.UUID `json:"id" example:"65392deb-5e92-4268-b114-297faad6cdce"`
	Timestamps
}

DefaultModel is the base model for most models in Envelope Zero. As EnvelopeMonth uses the Envelope ID and the Month as primary key, we the timestamps are managed in the Timestamps struct.

func (*DefaultModel) AfterFind added in v1.9.0

func (m *DefaultModel) AfterFind(tx *gorm.DB) (err error)

AfterFind updates the timestamps to use UTC as timezone, not +0000. Yes, this is different.

We already store them in UTC, but somehow reading them from the database returns them as +0000.

func (*DefaultModel) BeforeCreate added in v1.9.0

func (m *DefaultModel) BeforeCreate(tx *gorm.DB) (err error)

BeforeCreate is set to generate a UUID for the resource.

type Envelope

type Envelope struct {
	DefaultModel
	EnvelopeCreate
	Category Category `json:"-"`
}

Envelope represents an envelope in your budget.

func (Envelope) Balance added in v0.47.1

func (e Envelope) Balance(db *gorm.DB, month types.Month) (decimal.Decimal, error)

Balance calculates the balance of an Envelope in a specific month.

func (Envelope) Month

func (e Envelope) Month(db *gorm.DB, month types.Month) (EnvelopeMonth, uuid.UUID, error)

Month calculates the month specific values for an envelope and returns an EnvelopeMonth and allocation ID for them.

func (Envelope) Spent

func (e Envelope) Spent(db *gorm.DB, month types.Month) decimal.Decimal

Spent returns the amount spent for the month the time.Time instance is in.

type EnvelopeCreate

type EnvelopeCreate struct {
	Name       string    `json:"name" gorm:"uniqueIndex:envelope_category_name" example:"Groceries" default:""`
	CategoryID uuid.UUID `json:"categoryId" gorm:"uniqueIndex:envelope_category_name" example:"878c831f-af99-4a71-b3ca-80deb7d793c1"`
	Note       string    `json:"note" example:"For stuff bought at supermarkets and drugstores" default:""`
	Hidden     bool      `json:"hidden" example:"true" default:"false"`
}

type EnvelopeMonth

type EnvelopeMonth struct {
	ID         uuid.UUID          `json:"id" example:"10b9705d-3356-459e-9d5a-28d42a6c4547"`               // The ID of the Envelope
	Name       string             `json:"name" example:"Groceries"`                                        // The name of the Envelope
	Month      types.Month        `json:"month" example:"1969-06-01T00:00:00.000000Z" hidden:"deprecated"` // This is always set to 00:00 UTC on the first of the month. **This field is deprecated and will be removed in v2**
	Spent      decimal.Decimal    `json:"spent" example:"73.12"`
	Balance    decimal.Decimal    `json:"balance" example:"12.32"`
	Allocation decimal.Decimal    `json:"allocation" example:"85.44"`
	Links      EnvelopeMonthLinks `json:"links"`
}

EnvelopeMonth contains data about an Envelope for a specific month.

type EnvelopeMonthAllocation added in v1.13.1

type EnvelopeMonthAllocation struct {
	Month      time.Time
	Allocation decimal.Decimal
}

type EnvelopeMonthConfig added in v1.13.1

type EnvelopeMonthConfig struct {
	Month         time.Time
	OverspendMode OverspendMode
}
type EnvelopeMonthLinks struct {
	Allocation string `json:"allocation" example:"https://example.com/api/v1/allocations/772d6956-ecba-485b-8a27-46a506c5a2a3"` // This is an empty string when no allocation exists
}

type Month added in v1.1.0

type Month struct {
	ID         uuid.UUID           `json:"id" example:"1e777d24-3f5b-4c43-8000-04f65f895578"` // The ID of the Budget
	Name       string              `json:"name" example:"Zero budget"`                        // The name of the Budget
	Month      types.Month         `json:"month" example:"2006-05-01T00:00:00.000000Z"`       // The month
	Budgeted   decimal.Decimal     `json:"budgeted" example:"2100"`                           // The sum of all allocations for the month. **Deprecated, please use the `allocation` field**
	Income     decimal.Decimal     `json:"income" example:"2317.34"`                          // The total income for the month (sum of all incoming transactions without an Envelope)
	Available  decimal.Decimal     `json:"available" example:"217.34"`                        // The amount available to budget
	Balance    decimal.Decimal     `json:"balance" example:"5231.37"`                         // The sum of all envelope balances
	Spent      decimal.Decimal     `json:"spent" example:"133.70"`                            // The amount of money spent in this month
	Allocation decimal.Decimal     `json:"allocation" example:"1200.50"`                      // The sum of all allocations for this month
	Categories []CategoryEnvelopes `json:"categories"`                                        // A list of envelope month calculations grouped by category
}

type MonthConfig added in v1.9.0

type MonthConfig struct {
	Timestamps             // To include the gorm timestamps
	EnvelopeID uuid.UUID   `json:"envelopeId" gorm:"primaryKey" example:"10b9705d-3356-459e-9d5a-28d42a6c4547"`
	Month      types.Month `json:"month" gorm:"primaryKey" example:"1969-06-01T00:00:00.000000Z"` // This is always set to 00:00 UTC on the first of the month.
	MonthConfigCreate
}

type MonthConfigCreate added in v1.9.0

type MonthConfigCreate struct {
	OverspendMode OverspendMode `json:"overspendMode" example:"AFFECT_ENVELOPE" default:"AFFECT_AVAILABLE"`
}

type OverspendMode added in v1.9.0

type OverspendMode string

swagger:enum OverspendMode

const (
	AffectAvailable OverspendMode = "AFFECT_AVAILABLE"
	AffectEnvelope  OverspendMode = "AFFECT_ENVELOPE"
)

type Timestamps added in v1.9.0

type Timestamps struct {
	CreatedAt time.Time       `json:"createdAt" example:"2022-04-02T19:28:44.491514Z"`
	UpdatedAt time.Time       `json:"updatedAt" example:"2022-04-17T20:14:01.048145Z"`
	DeletedAt *gorm.DeletedAt `json:"deletedAt" gorm:"index" example:"2022-04-22T21:01:05.058161Z" swaggertype:"primitive,string"`
}

Timestamps only contains the timestamps that gorm sets automatically to enable other primary keys than ID.

type Transaction

type Transaction struct {
	DefaultModel
	TransactionCreate
	Budget             Budget   `json:"-"`
	SourceAccount      Account  `json:"-"`
	DestinationAccount Account  `json:"-"`
	Envelope           Envelope `json:"-"`
}

Transaction represents a transaction between two accounts.

func (*Transaction) AfterFind

func (t *Transaction) AfterFind(tx *gorm.DB) (err error)

AfterFind updates the timestamps to use UTC as timezone, not +0000. Yes, this is different.

We already store them in UTC, but somehow reading them from the database returns them as +0000.

func (*Transaction) BeforeSave

func (t *Transaction) BeforeSave(tx *gorm.DB) (err error)

BeforeSave sets the timezone for the Date for UTC.

type TransactionCreate

type TransactionCreate struct {
	Date   time.Time       `json:"date" example:"1815-12-10T18:43:00.271152Z"`
	Amount decimal.Decimal `` // The maximum value is "999999999999.99999999", swagger unfortunately rounds this.
	/* 132-byte string literal not displayed */
	Note                 string      `json:"note" example:"Lunch" default:""`
	BudgetID             uuid.UUID   `json:"budgetId" example:"55eecbd8-7c46-4b06-ada9-f287802fb05e"`
	SourceAccountID      uuid.UUID   `` /* 155-byte string literal not displayed */
	DestinationAccountID uuid.UUID   `json:"destinationAccountId" example:"8e16b456-a719-48ce-9fec-e115cfa7cbcc"`
	EnvelopeID           *uuid.UUID  `json:"envelopeId" example:"2649c965-7999-4873-ae16-89d5d5fa972e"`
	Reconciled           bool        `json:"reconciled" example:"true" default:"false"`
	AvailableFrom        types.Month `json:"availableFrom" example:"2021-11-17:00:00:00Z"` // The date from which on the transaction amount is available for budgeting. Only used for income transactions. Defaults to the transaction date.
}

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL