feat(#21): contas bancárias e patrimônio consolidado

CRUD de contas (corrente/poupança/investimento/cartão) com saldo calculado
automaticamente. account_id nullable em transactions. Widget patrimônio no
dashboard. Tela /contas. Seletor de conta nas transações manuais.

Co-Authored-By: Claude Sonnet 4.6 <[email protected]>
This commit is contained in:
2026-05-26 21:34:56 -03:00
co-authored by Claude Sonnet 4.6
parent fbcb1d76aa
commit 9a964423fd
21 changed files with 667 additions and 24 deletions
+16 -5
View File
@@ -13,13 +13,18 @@ type DashboardRepo interface {
RecentTransactions(ctx context.Context, month string) ([]model.RecentTransaction, error)
}
type DashboardService struct {
repo DashboardRepo
recurrSvc *RecurringService
type PatrimonySource interface {
TotalPatrimony(ctx context.Context) (float64, error)
}
func NewDashboardService(repo DashboardRepo, recurrSvc *RecurringService) *DashboardService {
return &DashboardService{repo: repo, recurrSvc: recurrSvc}
type DashboardService struct {
repo DashboardRepo
recurrSvc *RecurringService
patrimony PatrimonySource
}
func NewDashboardService(repo DashboardRepo, recurrSvc *RecurringService, patrimony PatrimonySource) *DashboardService {
return &DashboardService{repo: repo, recurrSvc: recurrSvc, patrimony: patrimony}
}
func (s *DashboardService) Get(ctx context.Context, month string) (*model.DashboardData, error) {
@@ -69,11 +74,17 @@ func (s *DashboardService) Get(ctx context.Context, month string) (*model.Dashbo
recent = []model.RecentTransaction{}
}
patrimony, err := s.patrimony.TotalPatrimony(ctx)
if err != nil {
return nil, err
}
return &model.DashboardData{
Month: month,
TotalIncome: income,
TotalExpenses: expenses,
SavingsPct: savingsPct,
TotalPatrimony: patrimony,
ByCategory: byCategory,
MonthlyEvolution: evolution,
RecentTransactions: recent,