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

View File

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