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
+8 -1
View File
@@ -76,6 +76,13 @@ const maxEvolution = computed(() => {
<div class="savings-pct">{{ store.data.savings_pct.toFixed(1) }}%</div>
<div class="savings-target">Meta: 40%</div>
</div>
<div class="card patrimony-card" v-if="store.data.total_patrimony > 0 || store.data.total_patrimony < 0">
<div class="card-label">Patrimônio</div>
<div class="card-value" :class="store.data.total_patrimony >= 0 ? 'income' : 'expense'">
{{ fmt(store.data.total_patrimony) }}
</div>
<div class="savings-target">todas as contas</div>
</div>
</div>
<!-- Bottom section: two columns on wide, stacked on mobile -->
@@ -171,7 +178,7 @@ h2 { font-size: 0.95rem; font-weight: 600; margin: 0 0 0.75rem; color: #374151;
}
/* Summary */
.summary-grid { display: grid; grid-template-columns: repeat(4, 1fr); gap: 0.75rem; margin-bottom: 1rem; }
.summary-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(140px, 1fr)); gap: 0.75rem; margin-bottom: 1rem; }
@media (max-width: 600px) { .summary-grid { grid-template-columns: 1fr 1fr; } }
.card { background: #fff; border: 1px solid #e5e7eb; border-radius: 10px; padding: 1rem; }