Fix: Ensure expense card shows monthly expenses

The expense card on the dashboard should display expenses for the selected month, not a general total.
This commit is contained in:
gpt-engineer-app[bot] 2025-06-25 18:26:33 +00:00
parent 436fc843fa
commit 386ceb6792
2 changed files with 74 additions and 9 deletions

View File

@ -47,13 +47,13 @@ const Dashboard = () => {
const loadResumo = async () => {
try {
setIsLoading(true);
console.log("Carregando resumo financeiro...");
const data = await getResumoFinanceiro();
console.log("Carregando resumo financeiro com filtro:", selectedMonth);
const data = await getResumoFinanceiro(selectedMonth);
console.log("Resumo carregado:", data);
setResumo(data);
// Load categories for chart
const categoriesData = await getCategorySummary('despesa');
// Load categories for chart with month filter
const categoriesData = await getCategorySummary('despesa', selectedMonth);
setCategories(categoriesData);
// Load monthly data for chart

View File

@ -1,13 +1,16 @@
import { supabase } from "@/integrations/supabase/client";
import { CategorySummary, MonthlyData, ResumoFinanceiro } from "@/types/financialTypes";
import { getUserEmail, getUserGroups } from "./baseService";
/**
* Get transaction summary (total income, expenses, balance)
* @param monthFilter - Optional month filter in format 'YYYY-MM'
* @returns Promise with transaction summary
*/
export async function getTransactionSummary(): Promise<{ totalReceitas: number; totalDespesas: number; saldo: number }> {
export async function getTransactionSummary(monthFilter?: string): Promise<{ totalReceitas: number; totalDespesas: number; saldo: number }> {
console.log("📊 [getTransactionSummary] Calculando resumo de transações...");
console.log("📊 [getTransactionSummary] Filtro de mês:", monthFilter);
const normalizedEmail = getUserEmail();
@ -28,6 +31,20 @@ export async function getTransactionSummary(): Promise<{ totalReceitas: number;
query = query.eq('login', normalizedEmail);
}
// Apply month filter if provided
if (monthFilter) {
const startDate = `${monthFilter}-01`;
const year = parseInt(monthFilter.split('-')[0]);
const month = parseInt(monthFilter.split('-')[1]);
const endDate = new Date(year, month, 0).toISOString().split('T')[0];
query = query
.gte('quando', startDate)
.lte('quando', `${endDate}T23:59:59.999Z`);
console.log(`📅 [getTransactionSummary] Filtro de data aplicado: ${startDate} até ${endDate}`);
}
const { data, error } = await query;
if (error) {
@ -56,10 +73,12 @@ export async function getTransactionSummary(): Promise<{ totalReceitas: number;
/**
* Get financial summary including credit cards
* @param monthFilter - Optional month filter in format 'YYYY-MM'
* @returns Promise with complete financial summary
*/
export async function getResumoFinanceiro(): Promise<ResumoFinanceiro> {
export async function getResumoFinanceiro(monthFilter?: string): Promise<ResumoFinanceiro> {
console.log("📊 [getResumoFinanceiro] Calculando resumo financeiro completo...");
console.log("📊 [getResumoFinanceiro] Filtro de mês:", monthFilter);
const normalizedEmail = getUserEmail();
@ -80,6 +99,20 @@ export async function getResumoFinanceiro(): Promise<ResumoFinanceiro> {
query = query.eq('login', normalizedEmail);
}
// Apply month filter if provided
if (monthFilter) {
const startDate = `${monthFilter}-01`;
const year = parseInt(monthFilter.split('-')[0]);
const month = parseInt(monthFilter.split('-')[1]);
const endDate = new Date(year, month, 0).toISOString().split('T')[0];
query = query
.gte('quando', startDate)
.lte('quando', `${endDate}T23:59:59.999Z`);
console.log(`📅 [getResumoFinanceiro] Filtro de data aplicado: ${startDate} até ${endDate}`);
}
const { data, error } = await query;
if (error) {
@ -95,12 +128,28 @@ export async function getResumoFinanceiro(): Promise<ResumoFinanceiro> {
.filter(t => t.tipo?.toLowerCase() === 'despesa')
.reduce((sum, t) => sum + Number(t.valor || 0), 0);
// Get credit card expenses
const { data: cartaoData, error: cartaoError } = await supabase
// Get credit card expenses with month filter
let cartaoQuery = supabase
.from('despesas_cartao')
.select('valor')
.eq('login', normalizedEmail);
// Apply month filter to credit card expenses if provided
if (monthFilter) {
const startDate = `${monthFilter}-01`;
const year = parseInt(monthFilter.split('-')[0]);
const month = parseInt(monthFilter.split('-')[1]);
const endDate = new Date(year, month, 0).toISOString().split('T')[0];
cartaoQuery = cartaoQuery
.gte('data_despesa', startDate)
.lte('data_despesa', endDate);
console.log(`📅 [getResumoFinanceiro] Filtro aplicado também aos cartões: ${startDate} até ${endDate}`);
}
const { data: cartaoData, error: cartaoError } = await cartaoQuery;
const totalCartoes = cartaoError ? 0 :
(cartaoData || []).reduce((sum, despesa) => sum + Number(despesa.valor || 0), 0);
@ -123,10 +172,12 @@ export async function getResumoFinanceiro(): Promise<ResumoFinanceiro> {
/**
* Get category summary for expenses or income
* @param tipo - Transaction type filter ('despesa', 'receita', 'all')
* @param monthFilter - Optional month filter in format 'YYYY-MM'
* @returns Promise with array of category summaries
*/
export async function getCategorySummary(tipo: string = 'despesa'): Promise<CategorySummary[]> {
export async function getCategorySummary(tipo: string = 'despesa', monthFilter?: string): Promise<CategorySummary[]> {
console.log(`📋 [getCategorySummary] Obtendo resumo por categoria para tipo: ${tipo}`);
console.log("📋 [getCategorySummary] Filtro de mês:", monthFilter);
const normalizedEmail = getUserEmail();
@ -152,6 +203,20 @@ export async function getCategorySummary(tipo: string = 'despesa'): Promise<Cate
query = query.eq('tipo', tipo);
}
// Apply month filter if provided
if (monthFilter) {
const startDate = `${monthFilter}-01`;
const year = parseInt(monthFilter.split('-')[0]);
const month = parseInt(monthFilter.split('-')[1]);
const endDate = new Date(year, month, 0).toISOString().split('T')[0];
query = query
.gte('quando', startDate)
.lte('quando', `${endDate}T23:59:59.999Z`);
console.log(`📅 [getCategorySummary] Filtro de data aplicado: ${startDate} até ${endDate}`);
}
const { data, error } = await query;
if (error) {