Documentation ¶
Index ¶
- Variables
- func Migrate(db *gorm.DB) (err error)
- type Account
- func (a *Account) AfterFind(tx *gorm.DB) (err error)
- func (a *Account) AfterSave(tx *gorm.DB) (err error)
- func (a *Account) BeforeSave(_ *gorm.DB) (err error)
- func (a *Account) BeforeUpdate(tx *gorm.DB) (err error)
- func (a Account) GetBalanceMonth(db *gorm.DB, month types.Month) (balance, available decimal.Decimal, err error)
- func (a Account) RecentEnvelopes(db *gorm.DB) (envelopes []Envelope, err error)
- func (a Account) Self() string
- func (a Account) SumReconciled(db *gorm.DB) (balance decimal.Decimal, err error)
- func (a Account) Transactions(db *gorm.DB) []Transaction
- func (a Account) WithCalculations(db *gorm.DB) (Account, error)
- type AccountCreate
- type AggregatedTransaction
- type Allocation
- type AllocationCreate
- type Budget
- func (b *Budget) AfterFind(tx *gorm.DB) (err error)
- func (b *Budget) AfterSave(tx *gorm.DB) (err error)
- func (b Budget) Allocated(db *gorm.DB, month types.Month) (allocated decimal.Decimal, err error)
- func (b Budget) Income(db *gorm.DB, month types.Month) (income decimal.Decimal, err error)
- func (b Budget) Month(db *gorm.DB, month types.Month) (Month, error)
- func (b Budget) Self() string
- type BudgetCreate
- type BudgetMonth
- type Category
- type CategoryCreate
- type CategoryEnvelopes
- type DefaultModel
- type Envelope
- func (e *Envelope) AfterFind(tx *gorm.DB) (err error)
- func (e *Envelope) AfterSave(tx *gorm.DB) (err error)
- func (e Envelope) Balance(db *gorm.DB, month types.Month) (decimal.Decimal, error)
- func (e *Envelope) BeforeUpdate(tx *gorm.DB) (err error)
- func (e Envelope) Month(db *gorm.DB, month types.Month) (EnvelopeMonth, uuid.UUID, error)
- func (e Envelope) Self() string
- func (e Envelope) Spent(db *gorm.DB, month types.Month) decimal.Decimal
- type EnvelopeCreate
- type EnvelopeMonth
- type EnvelopeMonthAllocation
- type EnvelopeMonthConfig
- type EnvelopeMonthLinks
- type Model
- type Month
- type MonthConfig
- type MonthConfigCreate
- type OverspendMode
- type RenameRule
- type RenameRuleCreate
- type Timestamps
- type Transaction
- type TransactionCreate
Constants ¶
This section is empty.
Variables ¶
var ErrAllocationZero = errors.New("allocation amounts must be non-zero. Instead of setting to zero, delete the Allocation")
Functions ¶
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"` Links struct { Self string `json:"self" example:"https://example.com/api/v1/accounts/af892e10-7e0a-4fb8-b1bc-4b6d88401ed2"` Transactions string `json:"transactions" example:"https://example.com/api/v1/transactions?account=af892e10-7e0a-4fb8-b1bc-4b6d88401ed2"` } `json:"links" gorm:"-"` }
Account represents an asset account, e.g. a bank account.
func (*Account) AfterSave ¶
AfterSave also sets the links so that we do not need to query the resource directly after creating or updating it.
func (*Account) BeforeSave ¶
BeforeSave sets OnBudget to false when External is true.
func (*Account) BeforeUpdate ¶ added in v3.0.1
BeforeUpdate verifies the state of the account before committing an update to the database.
func (Account) GetBalanceMonth ¶
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 ¶
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 ¶
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.
type AccountCreate ¶
type AccountCreate struct { Name string `json:"name" example:"Cash" default:"" gorm:"uniqueIndex:account_name_budget_id"` Note string `json:"note" example:"Money in my wallet" default:""` BudgetID uuid.UUID `json:"budgetId" example:"550dc009-cea6-4c12-b2a5-03446eb7b7cf" gorm:"uniqueIndex:account_name_budget_id"` 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"` ImportHash string `json:"importHash" example:"867e3a26dc0baf73f4bff506f31a97f6c32088917e9e5cf1a5ed6f3f84a6fa70" default:""` // The SHA256 hash of a unique combination of values to use in duplicate detection }
type AggregatedTransaction ¶
type Allocation ¶
type Allocation struct { DefaultModel AllocationCreate Envelope Envelope `json:"-"` Links struct { Self string `json:"self" example:"https://example.com/api/v1/allocations/902cd93c-3724-4e46-8540-d014131282fc"` } `json:"links" gorm:"-"` }
Allocation represents the allocation of money to an Envelope for a specific month.
func (*Allocation) AfterSave ¶
func (a *Allocation) AfterSave(tx *gorm.DB) (err error)
AfterSave also sets the links so that we do not need to query the resource directly after creating or updating it.
func (*Allocation) BeforeSave ¶
func (a *Allocation) BeforeSave(_ *gorm.DB) (err error)
BeforeSave verifies that the amount is non-zero. To remove an allocation, it has to be deleted instead of set to 0.
func (Allocation) Self ¶
func (a Allocation) Self() string
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"` // DEPRECATED. Will be removed in API v2, see https://github.com/envelope-zero/backend/issues/526. Links struct { Self string `json:"self" example:"https://example.com/api/v1/budgets/550dc009-cea6-4c12-b2a5-03446eb7b7cf"` Accounts string `json:"accounts" example:"https://example.com/api/v1/accounts?budget=550dc009-cea6-4c12-b2a5-03446eb7b7cf"` Categories string `json:"categories" example:"https://example.com/api/v1/categories?budget=550dc009-cea6-4c12-b2a5-03446eb7b7cf"` Envelopes string `json:"envelopes" example:"https://example.com/api/v1/envelopes?budget=550dc009-cea6-4c12-b2a5-03446eb7b7cf"` Transactions string `json:"transactions" example:"https://example.com/api/v1/transactions?budget=550dc009-cea6-4c12-b2a5-03446eb7b7cf"` Month string `json:"month" example:"https://example.com/api/v1/budgets/550dc009-cea6-4c12-b2a5-03446eb7b7cf/YYYY-MM"` // This uses 'YYYY-MM' for clients to replace with the actual year and month. GroupedMonth string `json:"groupedMonth" example:"https://example.com/api/v1/months?budget=550dc009-cea6-4c12-b2a5-03446eb7b7cf&month=YYYY-MM"` // This uses 'YYYY-MM' for clients to replace with the actual year and month. MonthAllocations string `json:"monthAllocations" example:"https://example.com/api/v1/months?budget=550dc009-cea6-4c12-b2a5-03446eb7b7cf&month=YYYY-MM"` // This uses 'YYYY-MM' for clients to replace with the actual year and month. } `json:"links" gorm:"-"` }
Budget represents a budget
A budget is the highest level of organization in Envelope Zero, all other resources reference it directly or transitively.
type BudgetCreate ¶
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"` }
func (BudgetMonth) Self ¶
func (b BudgetMonth) Self() string
type Category ¶
type Category struct { DefaultModel CategoryCreate Budget Budget `json:"-"` // The budget the category belongs to Links struct { Self string `json:"self" example:"https://example.com/api/v1/categories/3b1ea324-d438-4419-882a-2fc91d71772f"` Envelopes string `json:"envelopes" example:"https://example.com/api/v1/envelopes?category=3b1ea324-d438-4419-882a-2fc91d71772f"` } `json:"links" gorm:"-"` }
Category represents a category of envelopes.
type CategoryCreate ¶
type CategoryCreate struct { Name string `json:"name" gorm:"uniqueIndex:category_budget_name" example:"Saving" default:""` // Name of the category BudgetID uuid.UUID `json:"budgetId" gorm:"uniqueIndex:category_budget_name" example:"52d967d3-33f4-4b04-9ba7-772e5ab9d0ce"` // ID of the budget the category belongs to Note string `json:"note" example:"All envelopes for long-term saving" default:""` // Notes about the category Hidden bool `json:"hidden" example:"true" default:"false"` // Is the category hidden? }
type CategoryEnvelopes ¶
type CategoryEnvelopes struct { 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 ¶
type DefaultModel struct { ID uuid.UUID `json:"id" example:"65392deb-5e92-4268-b114-297faad6cdce"` // UUID for the resource 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 ¶
func (m *DefaultModel) AfterFind(_ *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 ¶
func (m *DefaultModel) BeforeCreate(_ *gorm.DB) (err error)
BeforeCreate is set to generate a UUID for the resource.
type Envelope ¶
type Envelope struct { DefaultModel EnvelopeCreate Category Category `json:"-"` Links struct { Self string `json:"self" example:"https://example.com/api/v1/envelopes/45b6b5b9-f746-4ae9-b77b-7688b91f8166"` // URL of the envelope Allocations string `json:"allocations" example:"https://example.com/api/v1/allocations?envelope=45b6b5b9-f746-4ae9-b77b-7688b91f8166"` // URL for the envelope's allocations Month string `json:"month" example:"https://example.com/api/v1/envelopes/45b6b5b9-f746-4ae9-b77b-7688b91f8166/YYYY-MM"` // URL to query for month information. This will always end in 'YYYY-MM' for clients to use replace with actual numbers. Transactions string `json:"transactions" example:"https://example.com/api/v1/transactions?envelope=45b6b5b9-f746-4ae9-b77b-7688b91f8166"` // URL for the envelope's transactions } `json:"links" gorm:"-"` // Links to related resources }
Envelope represents an envelope in your budget.
func (*Envelope) AfterSave ¶
AfterSave also sets the links so that we do not need to query the resource directly after creating or updating it.
func (*Envelope) BeforeUpdate ¶
BeforeUpdate verifies the state of the envelope before committing an update to the database.
type EnvelopeCreate ¶
type EnvelopeCreate struct { Name string `json:"name" gorm:"uniqueIndex:envelope_category_name" example:"Groceries" default:""` // Name of the envelope CategoryID uuid.UUID `json:"categoryId" gorm:"uniqueIndex:envelope_category_name" example:"878c831f-af99-4a71-b3ca-80deb7d793c1"` // ID of the category the envelope belongs to Note string `json:"note" example:"For stuff bought at supermarkets and drugstores" default:""` // Notes about the envelope Hidden bool `json:"hidden" example:"true" default:"false"` // Is the envelope hidden? }
type EnvelopeMonth ¶
type EnvelopeMonth struct { 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"` // The amount spent over the whole month Balance decimal.Decimal `json:"balance" example:"12.32"` // The balance at the end of the monht Allocation decimal.Decimal `json:"allocation" example:"85.44"` // The amount of money allocated Links EnvelopeMonthLinks `json:"links"` // Linked resources }
EnvelopeMonth contains data about an Envelope for a specific month.
type EnvelopeMonthAllocation ¶
type EnvelopeMonthConfig ¶
type EnvelopeMonthConfig struct { Month time.Time OverspendMode OverspendMode }
type EnvelopeMonthLinks ¶
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 ¶
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 ¶
type MonthConfig struct { Timestamps MonthConfigCreate 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. Links struct { Self string `json:"self" example:"https://example.com/api/v1/month-configs/61027ebb-ab75-4a49-9e23-a104ddd9ba6b/2017-10"` // URL for the month config Envelope string `json:"envelope" example:"https://example.com/api/v1/envelopes/61027ebb-ab75-4a49-9e23-a104ddd9ba6b"` // URL of the envelope this config belongs to } `json:"links" gorm:"-"` }
type MonthConfigCreate ¶
type MonthConfigCreate struct { OverspendMode OverspendMode `json:"overspendMode" example:"AFFECT_ENVELOPE" default:"AFFECT_AVAILABLE"` Note string `json:"note" example:"Added 200€ here because we replaced Tim's expensive vase" default:""` // A note for the month config }
type OverspendMode ¶
type OverspendMode string
swagger:enum OverspendMode
const ( AffectAvailable OverspendMode = "AFFECT_AVAILABLE" AffectEnvelope OverspendMode = "AFFECT_ENVELOPE" )
type RenameRule ¶
type RenameRule struct { DefaultModel RenameRuleCreate Links struct { Self string `json:"self" example:"https://example.com/api/v2/rename-rules/95685c82-53c6-455d-b235-f49960b73b21"` } `json:"links" gorm:"-"` }
func (RenameRule) Self ¶
func (r RenameRule) Self() string
type RenameRuleCreate ¶
type RenameRuleCreate struct { Priority uint `json:"priority" example:"3"` // The priority of the rename rule Match string `json:"match" example:"Bank*"` // The matching applied to the opposite account. This is a glob pattern. Multiple globs are allowed. Globbing is case sensitive. AccountID uuid.UUID `json:"accountId" example:"f9e873c2-fb96-4367-bfb6-7ecd9bf4a6b5"` // The account to map matching transactions to }
type Timestamps ¶
type Timestamps struct { CreatedAt time.Time `json:"createdAt" example:"2022-04-02T19:28:44.491514Z"` // Time the resource was created UpdatedAt time.Time `json:"updatedAt" example:"2022-04-17T20:14:01.048145Z"` // Last time the resource was updated DeletedAt *gorm.DeletedAt `json:"deletedAt" gorm:"index" example:"2022-04-22T21:01:05.058161Z" swaggertype:"primitive,string"` // Time the resource was marked as deleted }
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:"-"` Links struct { Self string `json:"self" example:"https://example.com/api/v1/transactions/d430d7c3-d14c-4712-9336-ee56965a6673"` // URL of the transaction resource } `json:"links" gorm:"-"` // Links for the transaction }
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) AfterSave ¶
func (t *Transaction) AfterSave(tx *gorm.DB) (err error)
AfterSave also sets the links so that we do not need to query the resource directly after creating or updating it.
func (*Transaction) BeforeSave ¶
func (t *Transaction) BeforeSave(tx *gorm.DB) (err error)
BeforeSave
- sets the timezone for the Date for UTC
- ensures that ReconciledSource and ReconciledDestination are set to valid values
func (Transaction) Self ¶
func (t Transaction) Self() string
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"` // DEPRECATED. Do not use, this field does not work as intended. See https://github.com/envelope-zero/backend/issues/528. Use reconciledSource and reconciledDestination instead. ReconciledSource bool `json:"reconciledSource" example:"true" default:"false"` ReconciledDestination bool `json:"reconciledDestination" example:"true" default:"false"` AvailableFrom types.Month `json:"availableFrom" example:"2021-11-17T00:00:00Z"` // The date from which on the transaction amount is available for budgeting. Only used for income transactions. Defaults to the transaction date. ImportHash string `json:"importHash" example:"867e3a26dc0baf73f4bff506f31a97f6c32088917e9e5cf1a5ed6f3f84a6fa70" default:""` // The SHA256 hash of a unique combination of values to use in duplicate detection }