Fix: Dashboard not showing transaction values

The AI fixed the dashboard not displaying transaction values by reviewing the data fetching and display logic. It also addressed the "Assinar Agora" button not working by checking the Mercado Pago integration and subscription page.
This commit is contained in:
gpt-engineer-app[bot] 2025-06-22 02:14:04 +00:00
parent 503b193e30
commit 1b4a148142
2 changed files with 84 additions and 21 deletions

View File

@ -24,15 +24,22 @@ export async function getTransactionSummary(monthFilter?: string) {
// Build the query with month filter if provided // Build the query with month filter if provided
let query = supabase let query = supabase
.from('transacoes') .from('transacoes')
.select('tipo, valor') .select('tipo, valor');
.or(`login.eq.${normalizedEmail},${groupIds.length > 0 ? `grupo_id.in.(${groupIds.map(id => `"${id}"`).join(',')})` : ''}`);
// Apply filters properly
if (groupIds.length > 0) {
const orFilter = `login.eq.${normalizedEmail},grupo_id.in.(${groupIds.map(id => `"${id}"`).join(',')})`;
query = query.or(orFilter);
} else {
query = query.eq('login', normalizedEmail);
}
// Apply month filter if provided // Apply month filter if provided
if (monthFilter) { if (monthFilter) {
const startDate = `${monthFilter}-01`; const startDate = `${monthFilter}-01`;
const year = parseInt(monthFilter.split('-')[0]); const year = parseInt(monthFilter.split('-')[0]);
const month = parseInt(monthFilter.split('-')[1]); const month = parseInt(monthFilter.split('-')[1]);
const endDate = new Date(year, month, 0).toISOString().split('T')[0]; // Last day of the month const endDate = new Date(year, month, 0).toISOString().split('T')[0];
query = query query = query
.gte('quando', startDate) .gte('quando', startDate)
@ -92,15 +99,22 @@ export async function getCategorySummary(tipoFiltro: string = 'despesa', monthFi
// Build the query with month filter if provided // Build the query with month filter if provided
let query = supabase let query = supabase
.from('transacoes') .from('transacoes')
.select('categoria, valor, tipo') .select('categoria, valor, tipo');
.or(`login.eq.${normalizedEmail},${groupIds.length > 0 ? `grupo_id.in.(${groupIds.map(id => `"${id}"`).join(',')})` : ''}`);
// Apply filters properly
if (groupIds.length > 0) {
const orFilter = `login.eq.${normalizedEmail},grupo_id.in.(${groupIds.map(id => `"${id}"`).join(',')})`;
query = query.or(orFilter);
} else {
query = query.eq('login', normalizedEmail);
}
// Apply month filter if provided // Apply month filter if provided
if (monthFilter) { if (monthFilter) {
const startDate = `${monthFilter}-01`; const startDate = `${monthFilter}-01`;
const year = parseInt(monthFilter.split('-')[0]); const year = parseInt(monthFilter.split('-')[0]);
const month = parseInt(monthFilter.split('-')[1]); const month = parseInt(monthFilter.split('-')[1]);
const endDate = new Date(year, month, 0).toISOString().split('T')[0]; // Last day of the month const endDate = new Date(year, month, 0).toISOString().split('T')[0];
query = query query = query
.gte('quando', startDate) .gte('quando', startDate)
@ -177,11 +191,20 @@ export async function getMonthlyData(): Promise<MonthlyData[]> {
// Get user groups by email // Get user groups by email
const groupIds = await getUserGroups(normalizedEmail); const groupIds = await getUserGroups(normalizedEmail);
// Fetch monthly data with enhanced filter based on email (login) or group_id // Build the query properly
const { data, error } = await supabase let query = supabase
.from('transacoes') .from('transacoes')
.select('quando, valor, tipo') .select('quando, valor, tipo');
.or(`login.eq.${normalizedEmail},${groupIds.length > 0 ? `grupo_id.in.(${groupIds.map(id => `"${id}"`).join(',')})` : ''}`);
// Apply filters properly
if (groupIds.length > 0) {
const orFilter = `login.eq.${normalizedEmail},grupo_id.in.(${groupIds.map(id => `"${id}"`).join(',')})`;
query = query.or(orFilter);
} else {
query = query.eq('login', normalizedEmail);
}
const { data, error } = await query;
if (error) { if (error) {
console.error('Erro ao buscar dados mensais:', error); console.error('Erro ao buscar dados mensais:', error);

View File

@ -14,15 +14,20 @@ serve(async (req) => {
} }
try { try {
console.log('🚀 Iniciando processamento da assinatura MercadoPago');
const { email, userId } = await req.json(); const { email, userId } = await req.json();
if (!email || !userId) { if (!email || !userId) {
console.error('❌ Email ou ID do usuário não fornecido');
return new Response(JSON.stringify({ error: 'E-mail ou ID do usuário não fornecido.' }), { return new Response(JSON.stringify({ error: 'E-mail ou ID do usuário não fornecido.' }), {
headers: { ...corsHeaders, 'Content-Type': 'application/json' }, headers: { ...corsHeaders, 'Content-Type': 'application/json' },
status: 400, status: 400,
}); });
} }
console.log('📧 Dados recebidos:', { email, userId });
// Cria um cliente Supabase com a service_role_key para verificar o usuário // Cria um cliente Supabase com a service_role_key para verificar o usuário
const supabaseAdmin = createClient( const supabaseAdmin = createClient(
Deno.env.get('SUPABASE_URL') ?? '', Deno.env.get('SUPABASE_URL') ?? '',
@ -31,6 +36,7 @@ serve(async (req) => {
); );
// Verifica se o usuário existe no banco de dados // Verifica se o usuário existe no banco de dados
console.log('🔍 Verificando usuário no banco de dados...');
const { data: userData, error: userError } = await supabaseAdmin const { data: userData, error: userError } = await supabaseAdmin
.from('usuarios') .from('usuarios')
.select('id') .select('id')
@ -39,16 +45,19 @@ serve(async (req) => {
.single(); .single();
if (userError || !userData) { if (userError || !userData) {
console.error('Falha na verificação do usuário:', userError); console.error('Falha na verificação do usuário:', userError);
return new Response(JSON.stringify({ error: 'Usuário não autorizado.' }), { return new Response(JSON.stringify({ error: 'Usuário não autorizado.' }), {
headers: { ...corsHeaders, 'Content-Type': 'application/json' }, headers: { ...corsHeaders, 'Content-Type': 'application/json' },
status: 401, status: 401,
}); });
} }
console.log('✅ Usuário verificado com sucesso');
const MERCADO_PAGO_ACCESS_TOKEN = Deno.env.get('MERCADO_PAGO_ACCESS_TOKEN') const MERCADO_PAGO_ACCESS_TOKEN = Deno.env.get('MERCADO_PAGO_ACCESS_TOKEN')
if (!MERCADO_PAGO_ACCESS_TOKEN) { if (!MERCADO_PAGO_ACCESS_TOKEN) {
return new Response(JSON.stringify({ error: 'Chave de acesso do Mercado Pago não configurada no servidor.' }), { console.error('❌ Token do MercadoPago não configurado');
return new Response(JSON.stringify({ error: 'Configuração do servidor incompleta.' }), {
headers: { ...corsHeaders, 'Content-Type': 'application/json' }, headers: { ...corsHeaders, 'Content-Type': 'application/json' },
status: 500, status: 500,
}) })
@ -66,7 +75,7 @@ serve(async (req) => {
payer_email: email payer_email: email
}; };
console.log('Enviando requisição para MercadoPago:', JSON.stringify(body)); console.log('📦 Enviando requisição para MercadoPago:', JSON.stringify(body));
const mpResponse = await fetch("https://api.mercadopago.com/preapproval", { const mpResponse = await fetch("https://api.mercadopago.com/preapproval", {
method: "POST", method: "POST",
@ -78,38 +87,69 @@ serve(async (req) => {
}); });
const mpData = await mpResponse.json(); const mpData = await mpResponse.json();
console.log('Resposta do MercadoPago:', mpData); console.log('📨 Resposta do MercadoPago:', { status: mpResponse.status, data: mpData });
if (!mpResponse.ok) { if (!mpResponse.ok) {
console.error('Erro da API do Mercado Pago:', mpData); console.error('Erro da API do Mercado Pago:', mpData);
// Tratar erro específico de países diferentes // Tratar erro específico de países diferentes
if (mpData.message === "Cannot operate between different countries") { if (mpData.message === "Cannot operate between different countries") {
console.log('🌍 Erro de país detectado');
return new Response(JSON.stringify({ return new Response(JSON.stringify({
error: 'Serviço temporariamente indisponível para sua região. Tente novamente mais tarde.' error: 'Serviço temporariamente indisponível para sua região. Entre em contato conosco para mais informações.'
}), { }), {
headers: { ...corsHeaders, 'Content-Type': 'application/json' }, headers: { ...corsHeaders, 'Content-Type': 'application/json' },
status: 503, status: 503,
}); });
} }
throw new Error(mpData.message || "Erro ao criar a assinatura no Mercado Pago."); // Outros erros do MercadoPago
const errorMessage = mpData.message || `Erro no MercadoPago (${mpResponse.status})`;
return new Response(JSON.stringify({ error: errorMessage }), {
headers: { ...corsHeaders, 'Content-Type': 'application/json' },
status: mpResponse.status,
});
} }
if (!mpData.init_point) { if (!mpData.init_point) {
throw new Error("URL de checkout não foi encontrada na resposta do Mercado Pago."); console.error('❌ URL de checkout não encontrada na resposta');
return new Response(JSON.stringify({
error: "Não foi possível gerar o link de pagamento. Tente novamente."
}), {
headers: { ...corsHeaders, 'Content-Type': 'application/json' },
status: 500,
});
} }
console.log('✅ Assinatura criada com sucesso:', mpData.init_point);
return new Response(JSON.stringify({ init_point: mpData.init_point }), { return new Response(JSON.stringify({ init_point: mpData.init_point }), {
headers: { ...corsHeaders, 'Content-Type': 'application/json' }, headers: { ...corsHeaders, 'Content-Type': 'application/json' },
status: 200, status: 200,
}) })
} catch (error) { } catch (error) {
console.error('Erro geral:', error); console.error('💥 Erro geral na função:', error);
return new Response(JSON.stringify({ error: error.message }), {
// Erro de parsing do JSON
if (error instanceof SyntaxError) {
return new Response(JSON.stringify({ error: 'Dados de entrada inválidos.' }), {
headers: { ...corsHeaders, 'Content-Type': 'application/json' },
status: 400,
});
}
// Erro de conexão
if (error instanceof TypeError && error.message.includes('fetch')) {
return new Response(JSON.stringify({ error: 'Erro de comunicação com o MercadoPago. Tente novamente.' }), {
headers: { ...corsHeaders, 'Content-Type': 'application/json' },
status: 503,
});
}
// Erro genérico
return new Response(JSON.stringify({ error: 'Erro interno do servidor. Tente novamente mais tarde.' }), {
headers: { ...corsHeaders, 'Content-Type': 'application/json' }, headers: { ...corsHeaders, 'Content-Type': 'application/json' },
status: 500, status: 500,
}) });
} }
}) })