package model import "time" type RecurringExpense struct { ID int `json:"id"` Name string `json:"name"` ExpectedAmount float64 `json:"expected_amount"` DayOfMonth int `json:"day_of_month"` CategoryID *int `json:"category_id"` Type string `json:"type"` // "income" | "expense" Active bool `json:"active"` CreatedAt time.Time `json:"created_at"` UpdatedAt time.Time `json:"updated_at"` } type RecurringInput struct { Name string `json:"name"` ExpectedAmount float64 `json:"expected_amount"` DayOfMonth int `json:"day_of_month"` CategoryID *int `json:"category_id"` Type string `json:"type"` // "income" | "expense" } // RecurringStatus reports whether a recurring item is covered/ignored/late for a month. type RecurringStatus struct { RecurringExpense Covered bool `json:"covered"` // has a matching transaction or was ignored Ignored bool `json:"ignored"` // user explicitly ignored this month (expense) Late bool `json:"late"` // user marked income as late this month Reason string `json:"reason,omitempty"` } // PendingIncome is a lightweight summary of an income recurring pending confirmation. type PendingIncome struct { ID int `json:"id"` Name string `json:"name"` ExpectedAmount float64 `json:"expected_amount"` DayOfMonth int `json:"day_of_month"` Late bool `json:"late"` }