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:
parent
436fc843fa
commit
386ceb6792
@ -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
|
||||||
|
|||||||
@ -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) {
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user