@page "/relatorios" @using FinControl.Web.Services Relatórios - FinControl

Relatórios Financeiros

Filtros
Receita Total (Período)

R$ @totalReceita.ToString("F2")

@transacoesReceita.Count transações
Despesa Total (Período)

R$ @totalDespesa.ToString("F2")

@transacoesDespesa.Count transações
Gastos por Mês
@foreach (var mes in dadosMensais) {
@mes.MesNome R$ @mes.Total.ToString("F2")
@(mes.Percentual > 10 ? mes.Percentual.ToString("F0") + "%" : "")
}
Evolução do Saldo
Jan Fev Mar Abr Mai Jun Jul Ago Set
Transações Detalhadas
@if (transacoesDetalhadas.Any()) {
@foreach (var tx in transacoesDetalhadas.Take(20)) { }
Data Descrição Categoria Conta Valor
@tx.Data.ToString("dd/MM/yyyy") @tx.Descricao @tx.Categoria @tx.Conta @(tx.Tipo == "Receita" ? "+" : "-") R$ @tx.Valor.ToString("F2")
} else {

Nenhuma transação encontrada para os filtros selecionados

}
@code { private List contas = new(); private List transacoesDetalhadas = new(); private List dadosMensais = new(); private string periodoSelecionado = "mes"; private string contaSelecionada = ""; private string tipoSelecionado = ""; private decimal totalReceita = 0; private decimal totalDespesa = 0; private List transacoesReceita = new(); private List transacoesDespesa = new(); private readonly Guid defaultUserId = new Guid("de7e0c0e-6e1f-4b0e-8b5f-0e0e0e0e0e0e"); @inject FinControlApiService ApiService protected override async Task OnInitializedAsync() { await CarregarDados(); await AtualizarGraficos(); } private async Task CarregarDados() { contas = await ApiService.GetAccountsByUserAsync(defaultUserId); } private async Task AtualizarGraficos() { // Simular dados de transações var todasTransacoes = new List { new Transacao { Data = DateTime.Now.AddDays(-25), Descricao = "Salário", Valor = 5000, Tipo = "Receita", Categoria = "Salário", Conta = "Conta Corrente" }, new Transacao { Data = DateTime.Now.AddDays(-20), Descricao = "Supermercado", Valor = 450, Tipo = "Despesa", Categoria = "Alimentação", Conta = "Conta Corrente" }, new Transacao { Data = DateTime.Now.AddDays(-15), Descricao = "Combustível", Valor = 200, Tipo = "Despesa", Categoria = "Transporte", Conta = "Conta Corrente" }, new Transacao { Data = DateTime.Now.AddDays(-10), Descricao = "Freelance", Valor = 800, Tipo = "Receita", Categoria = "Outro", Conta = "Conta Corrente" }, new Transacao { Data = DateTime.Now.AddDays(-8), Descricao = "Netflix", Valor = 50, Tipo = "Despesa", Categoria = "Lazer", Conta = "Conta Corrente" }, new Transacao { Data = DateTime.Now.AddDays(-5), Descricao = "Farmácia", Valor = 120, Tipo = "Despesa", Categoria = "Saúde", Conta = "Conta Corrente" }, new Transacao { Data = DateTime.Now.AddDays(-2), Descricao = "Restaurante", Valor = 85, Tipo = "Despesa", Categoria = "Alimentação", Conta = "Conta Corrente" } }; transacoesReceita = todasTransacoes.Where(t => t.Tipo == "Receita").ToList(); transacoesDespesa = todasTransacoes.Where(t => t.Tipo == "Despesa").ToList(); totalReceita = transacoesReceita.Sum(t => t.Valor); totalDespesa = transacoesDespesa.Sum(t => t.Valor); transacoesDetalhadas = todasTransacoes .OrderByDescending(t => t.Data) .Select(t => new TransacaoDetalhada { Data = t.Data, Descricao = t.Descricao, Categoria = t.Categoria, Conta = t.Conta, Valor = t.Valor, Tipo = t.Tipo }) .ToList(); // Dados mensais simulados dadosMensais = new List { new DadosMensais { MesNome = "Janeiro", Total = 1200, Percentual = 40 }, new DadosMensais { MesNome = "Fevereiro", Total = 950, Percentual = 32 }, new DadosMensais { MesNome = "Março", Total = 1450, Percentual = 48 }, new DadosMensais { MesNome = "Abril", Total = 820, Percentual = 27 }, new DadosMensais { MesNome = "Maio", Total = 2100, Percentual = 70 }, new DadosMensais { MesNome = "Junho", Total = 1680, Percentual = 56 } }; // Normalizar percentuais var max = dadosMensais.Max(d => d.Total); foreach (var mes in dadosMensais) { mes.Percentual = (mes.Total / max) * 100; } } private void ExportarDados() { var csv = "Data,Descrição,Categoria,Conta,Tipo,Valor\n"; foreach (var tx in transacoesDetalhadas) { csv += $"{tx.Data:yyyy-MM-dd},{tx.Descricao},{tx.Categoria},{tx.Conta},{tx.Tipo},R$ {tx.Valor:F2}\n"; } // Em produção, usar Blazored.Download para fazer download real Console.WriteLine("CSV exportado (simulated)"); } public class Transacao { public DateTime Data { get; set; } public string? Descricao { get; set; } public string? Categoria { get; set; } public string? Conta { get; set; } public decimal Valor { get; set; } public string? Tipo { get; set; } } public class TransacaoDetalhada { public DateTime Data { get; set; } public string? Descricao { get; set; } public string? Categoria { get; set; } public string? Conta { get; set; } public decimal Valor { get; set; } public string? Tipo { get; set; } } public class DadosMensais { public string? MesNome { get; set; } public decimal Total { get; set; } public decimal Percentual { get; set; } } }