From 6a38fd0bf1cfaecf5977349a7b9e7c87dcc21019 Mon Sep 17 00:00:00 2001 From: "gpt-engineer-app[bot]" <159125892+gpt-engineer-app[bot]@users.noreply.github.com> Date: Tue, 20 May 2025 01:08:48 +0000 Subject: [PATCH] Refactor: Use email (login) for user identification Update the system to use the user's email (login) as the primary identifier for linking users, WhatsApp groups, and transactions. This includes changes to the `grupos_whatsapp` and `transacoes` tables, as well as adjustments to queries and data retrieval logic. The `user_id` field is maintained for compatibility. --- src/components/dashboard/TransactionForm.tsx | 39 ++++++--- src/services/gruposWhatsAppService.ts | 12 ++- src/services/transacaoService.ts | 83 ++++++++++++++------ src/types/financialTypes.ts | 7 +- 4 files changed, 96 insertions(+), 45 deletions(-) diff --git a/src/components/dashboard/TransactionForm.tsx b/src/components/dashboard/TransactionForm.tsx index c3d3a2b..4c1d666 100644 --- a/src/components/dashboard/TransactionForm.tsx +++ b/src/components/dashboard/TransactionForm.tsx @@ -52,11 +52,18 @@ export function TransactionForm({ onSuccess, onCancel, defaultTipo = 'despesa', // Buscar grupos do usuário ao carregar o formulário useState(() => { const fetchGrupos = async () => { - const userId = localStorage.getItem('userId') || 'default'; + const userEmail = localStorage.getItem('userEmail'); + if (!userEmail) { + console.error('Email do usuário não encontrado'); + return; + } + + const normalizedEmail = userEmail.trim().toLowerCase(); + const { data, error } = await supabase .from('grupos_whatsapp') .select('remote_jid, nome_grupo') - .eq('user_id', userId); + .eq('login', normalizedEmail); if (error) { console.error('Erro ao buscar grupos:', error); @@ -85,10 +92,23 @@ export function TransactionForm({ onSuccess, onCancel, defaultTipo = 'despesa', setIsSubmitting(true); try { - // Get user ID from localStorage - with RLS disabled, this is just for reference - const userId = localStorage.getItem('userId') || 'default'; - const userEmail = localStorage.getItem('userEmail') || ''; - const userName = localStorage.getItem('userName') || ''; + // Get user email from localStorage - principal identifier now + const userEmail = localStorage.getItem('userEmail'); + + if (!userEmail) { + toast({ + title: "Erro no formulário", + description: "Email do usuário não encontrado", + variant: "destructive" + }); + return; + } + + // Normalizar o email (minúsculo e sem espaços) + const normalizedEmail = userEmail.trim().toLowerCase(); + + // Get user ID from localStorage - kept for compatibility + const userId = localStorage.getItem('userId') || ''; const valorNumerico = parseFloat(data.valor.replace(',', '.')); @@ -106,11 +126,12 @@ export function TransactionForm({ onSuccess, onCancel, defaultTipo = 'despesa', ? Math.abs(valorNumerico) : Math.abs(valorNumerico); - console.log(`Salvando transação para usuário: ${userId} (${userEmail || userName})`); + console.log(`Salvando transação para usuário: ${normalizedEmail} (ID: ${userId})`); - // Preparar dados da transação incluindo o grupo_id se fornecido + // Preparar dados da transação incluindo o login e grupo_id const transactionData = { - user: userId, + user: userId, // Mantido por compatibilidade + login: normalizedEmail, // Campo principal para identificação estabelecimento: data.estabelecimento, valor: valorFinal, detalhes: data.detalhes, diff --git a/src/services/gruposWhatsAppService.ts b/src/services/gruposWhatsAppService.ts index 6b93d65..a6512f1 100644 --- a/src/services/gruposWhatsAppService.ts +++ b/src/services/gruposWhatsAppService.ts @@ -18,13 +18,11 @@ export async function cadastrarGrupoWhatsApp(): Promise { // Criar registro na tabela grupos_whatsapp const { data, error } = await supabase .from('grupos_whatsapp') - .insert([ - { - user_id: localStorage.getItem('userId') || '', - login: normalizedEmail, - status: 'pendente' - } - ]) + .insert({ + user_id: localStorage.getItem('userId') || '', // Mantido por compatibilidade + login: normalizedEmail, + status: 'pendente' + }) .select(); if (error) { diff --git a/src/services/transacaoService.ts b/src/services/transacaoService.ts index 1858aaf..c27196b 100644 --- a/src/services/transacaoService.ts +++ b/src/services/transacaoService.ts @@ -5,16 +5,24 @@ import { Transaction, CategorySummary } from "@/types/financialTypes"; export async function getTransacoes(): Promise { console.log("Buscando transações do Supabase..."); - // Obter o ID do usuário atual do localStorage - const userId = localStorage.getItem('userId') || 'default'; - console.log("Buscando transações para o usuário:", userId); + // Obter o email do usuário do localStorage + const userEmail = localStorage.getItem('userEmail'); + + if (!userEmail) { + console.error('Email do usuário não encontrado no localStorage'); + return []; + } + + // Normalizar o email (minúsculo e sem espaços) + const normalizedEmail = userEmail.trim().toLowerCase(); + console.log("Buscando transações para o usuário com email:", normalizedEmail); try { - // Primeiro, buscar todos os grupos do usuário + // Primeiro, buscar todos os grupos do usuário pelo email const { data: userGroups, error: groupsError } = await supabase .from('grupos_whatsapp') .select('remote_jid') - .eq('user_id', userId); + .eq('login', normalizedEmail); if (groupsError) { console.error('Erro ao buscar grupos do usuário:', groupsError); @@ -24,11 +32,11 @@ export async function getTransacoes(): Promise { const groupIds = userGroups ? userGroups.map(group => group.remote_jid) : []; console.log(`Encontrados ${groupIds.length} grupos vinculados ao usuário:`, groupIds); - // Buscar transações com filtro aprimorado + // Buscar transações com filtro baseado no email (login) ou grupo_id const { data, error } = await supabase .from('transacoes') .select('*') - .or(`user.eq.${userId},${groupIds.length > 0 ? `grupo_id.in.(${groupIds.map(id => `"${id}"`).join(',')})` : ''}`) + .or(`login.eq.${normalizedEmail},${groupIds.length > 0 ? `grupo_id.in.(${groupIds.map(id => `"${id}"`).join(',')})` : ''}`) .order('quando', { ascending: false }); if (error) { @@ -42,6 +50,7 @@ export async function getTransacoes(): Promise { return data.map((item: any) => ({ id: item.id.toString(), user: item.user || '', + login: item.login || normalizedEmail, // Garantir que o campo login esteja preenchido created_at: item.created_at, valor: item.tipo?.toLowerCase() === 'receita' ? Math.abs(item.valor || 0) : -Math.abs(item.valor || 0), quando: item.quando || new Date().toISOString(), @@ -60,15 +69,23 @@ export async function getTransacoes(): Promise { export async function getTransactionSummary() { console.log("Buscando resumo das transações..."); - // Obter o ID do usuário atual do localStorage - const userId = localStorage.getItem('userId') || 'default'; + // Obter o email do usuário do localStorage + const userEmail = localStorage.getItem('userEmail'); + + if (!userEmail) { + console.error('Email do usuário não encontrado no localStorage'); + return { receitas: 0, despesas: 0, saldo: 0 }; + } + + // Normalizar o email (minúsculo e sem espaços) + const normalizedEmail = userEmail.trim().toLowerCase(); try { - // Primeiro, buscar todos os grupos do usuário + // Primeiro, buscar todos os grupos do usuário pelo email const { data: userGroups, error: groupsError } = await supabase .from('grupos_whatsapp') .select('remote_jid') - .eq('user_id', userId); + .eq('login', normalizedEmail); if (groupsError) { console.error('Erro ao buscar grupos do usuário:', groupsError); @@ -77,11 +94,11 @@ export async function getTransactionSummary() { // Extrair IDs dos grupos para usar no filtro const groupIds = userGroups ? userGroups.map(group => group.remote_jid) : []; - // Buscar resumo das transações com filtro aprimorado + // Buscar resumo das transações com filtro aprimorado baseado no email (login) ou grupo_id const { data, error } = await supabase .from('transacoes') .select('tipo, valor') - .or(`user.eq.${userId},${groupIds.length > 0 ? `grupo_id.in.(${groupIds.map(id => `"${id}"`).join(',')})` : ''}`); + .or(`login.eq.${normalizedEmail},${groupIds.length > 0 ? `grupo_id.in.(${groupIds.map(id => `"${id}"`).join(',')})` : ''}`); if (error) { console.error('Erro ao buscar resumo das transações:', error); @@ -115,15 +132,23 @@ export async function getTransactionSummary() { export async function getCategorySummary(tipoFiltro: string = 'despesa') { console.log(`Buscando resumo de categorias para tipo: ${tipoFiltro}`); - // Obter o ID do usuário atual do localStorage - const userId = localStorage.getItem('userId') || 'default'; + // Obter o email do usuário do localStorage + const userEmail = localStorage.getItem('userEmail'); + + if (!userEmail) { + console.error('Email do usuário não encontrado no localStorage'); + return []; + } + + // Normalizar o email (minúsculo e sem espaços) + const normalizedEmail = userEmail.trim().toLowerCase(); try { - // Primeiro, buscar todos os grupos do usuário + // Primeiro, buscar todos os grupos do usuário pelo email const { data: userGroups, error: groupsError } = await supabase .from('grupos_whatsapp') .select('remote_jid') - .eq('user_id', userId); + .eq('login', normalizedEmail); if (groupsError) { console.error('Erro ao buscar grupos do usuário:', groupsError); @@ -132,11 +157,11 @@ export async function getCategorySummary(tipoFiltro: string = 'despesa') { // Extrair IDs dos grupos para usar no filtro const groupIds = userGroups ? userGroups.map(group => group.remote_jid) : []; - // Buscar resumo de categorias com filtro aprimorado + // Buscar resumo de categorias com filtro aprimorado baseado no email (login) ou grupo_id const { data, error } = await supabase .from('transacoes') .select('categoria, valor, tipo') - .or(`user.eq.${userId},${groupIds.length > 0 ? `grupo_id.in.(${groupIds.map(id => `"${id}"`).join(',')})` : ''}`); + .or(`login.eq.${normalizedEmail},${groupIds.length > 0 ? `grupo_id.in.(${groupIds.map(id => `"${id}"`).join(',')})` : ''}`); if (error) { console.error('Erro ao buscar resumo de categorias:', error); @@ -192,15 +217,23 @@ export async function getCategorySummary(tipoFiltro: string = 'despesa') { export async function getMonthlyData() { console.log("Buscando dados mensais..."); - // Obter o ID do usuário atual do localStorage - const userId = localStorage.getItem('userId') || 'default'; + // Obter o email do usuário do localStorage + const userEmail = localStorage.getItem('userEmail'); + + if (!userEmail) { + console.error('Email do usuário não encontrado no localStorage'); + return []; + } + + // Normalizar o email (minúsculo e sem espaços) + const normalizedEmail = userEmail.trim().toLowerCase(); try { - // Primeiro, buscar todos os grupos do usuário + // Primeiro, buscar todos os grupos do usuário pelo email const { data: userGroups, error: groupsError } = await supabase .from('grupos_whatsapp') .select('remote_jid') - .eq('user_id', userId); + .eq('login', normalizedEmail); if (groupsError) { console.error('Erro ao buscar grupos do usuário:', groupsError); @@ -209,11 +242,11 @@ export async function getMonthlyData() { // Extrair IDs dos grupos para usar no filtro const groupIds = userGroups ? userGroups.map(group => group.remote_jid) : []; - // Buscar dados mensais com filtro aprimorado + // Buscar dados mensais com filtro aprimorado baseado no email (login) ou grupo_id const { data, error } = await supabase .from('transacoes') .select('quando, valor, tipo') - .or(`user.eq.${userId},${groupIds.length > 0 ? `grupo_id.in.(${groupIds.map(id => `"${id}"`).join(',')})` : ''}`); + .or(`login.eq.${normalizedEmail},${groupIds.length > 0 ? `grupo_id.in.(${groupIds.map(id => `"${id}"`).join(',')})` : ''}`); if (error) { console.error('Erro ao buscar dados mensais:', error); diff --git a/src/types/financialTypes.ts b/src/types/financialTypes.ts index df2f016..4fbdd91 100644 --- a/src/types/financialTypes.ts +++ b/src/types/financialTypes.ts @@ -1,8 +1,8 @@ - export interface Transaction { id: string; user: string; + login?: string; // E-mail do usuário como identificador principal created_at: string; valor: number; quando: string; @@ -60,11 +60,10 @@ export interface ResultadoMeta { export interface WhatsAppGroup { id: number; - user_id: string; + user_id: string | null; // Mantido apenas por compatibilidade remote_jid: string | null; nome_grupo: string | null; created_at: string; status: string; - login: string; + login: string; // E-mail do usuário como identificador principal } -