diff --git a/src/components/credito/DespesaCartaoFormSelect.tsx b/src/components/credito/DespesaCartaoFormSelect.tsx index 0643047..b5a2c43 100644 --- a/src/components/credito/DespesaCartaoFormSelect.tsx +++ b/src/components/credito/DespesaCartaoFormSelect.tsx @@ -1,11 +1,11 @@ + import { useState } from 'react'; import { useForm } from 'react-hook-form'; import { zodResolver } from '@hookform/resolvers/zod'; import * as z from 'zod'; import { useToast } from '@/components/ui/use-toast'; import { CartaoCredito } from '@/types/cartaoTypes'; -import { criarDespesa } from '@/services/cartaoCreditoService'; -import { gerarCartaoCodigo } from '@/services/cartao/cartaoCodigoUtils'; +import { criarDespesa } from '@/services/cartao/despesasService'; import { CalendarIcon } from 'lucide-react'; import { format } from 'date-fns'; import { ptBR } from 'date-fns/locale'; @@ -78,10 +78,10 @@ export function DespesaCartaoFormSelect({ cartoes, onSuccess, onCancel }: Despes }; async function onSubmit(data: DespesaCartaoFormValues) { - if (!selectedCartao || !selectedCartao.cartao_codigo) { + if (!selectedCartao) { toast({ title: "Erro", - description: "Informações do cartão incompletas", + description: "Selecione um cartão primeiro", variant: "destructive" }); return; @@ -92,9 +92,20 @@ export function DespesaCartaoFormSelect({ cartoes, onSuccess, onCancel }: Despes try { const formattedDate = format(data.data_despesa, 'yyyy-MM-dd'); + // Garantir que temos um cartao_codigo, mesmo que seja gerado na hora + const cartaoCodigo = selectedCartao.cartao_codigo || selectedCartao.nome; + + console.log('Enviando dados para criar despesa:', { + cartao_id: data.cartao_id, + cartao_codigo: cartaoCodigo, + valor: data.valor, + data_despesa: formattedDate, + descricao: data.descricao + }); + const resultado = await criarDespesa( data.cartao_id, - selectedCartao.cartao_codigo, + cartaoCodigo, data.valor, formattedDate, data.descricao diff --git a/src/services/cartao/cartoesService.ts b/src/services/cartao/cartoesService.ts index 144f268..5d8fae5 100644 --- a/src/services/cartao/cartoesService.ts +++ b/src/services/cartao/cartoesService.ts @@ -2,7 +2,6 @@ import { supabase } from "@/integrations/supabase/client"; import { CartaoCredito } from "@/types/cartaoTypes"; import { gerarCartaoCodigo } from "./cartaoCodigoUtils"; -import { getTotalDespesasCartao } from "./despesasService"; /** * Fetches all credit cards for the current user @@ -32,13 +31,21 @@ export async function getCartoes(): Promise { throw new Error('Não foi possível carregar os cartões de crédito'); } - // Para cada cartão, adicionar os campos faltantes e obter o total de despesas - const cartoesComDespesas = await Promise.all(data.map(async (cartao) => { + // Para cada cartão, adicionar os campos faltantes + const cartoesCompletos = data.map(async (cartao) => { // Gerar um código único para o cartão, já que não existe na tabela const cartaoCodigo = gerarCartaoCodigo(cartao.nome, 'banco_padrao'); - // Obter o total de despesas usando o código gerado ou o nome como fallback - const totalDespesas = await getTotalDespesasCartao(cartaoCodigo); + // Obter o total de despesas de forma direta para evitar dependência circular + const { data: despesasData, error: despesasError } = await supabase + .from('despesas_cartao') + .select('valor') + .eq('cartao_id', cartao.id); + + let totalDespesas = 0; + if (!despesasError && despesasData) { + totalDespesas = despesasData.reduce((acc, item) => acc + Number(item.valor), 0); + } // Retornar o objeto completo com os campos faltantes return { @@ -52,9 +59,10 @@ export async function getCartoes(): Promise { cartao_codigo: cartaoCodigo, total_despesas: totalDespesas } as CartaoCredito; - })); + }); - return cartoesComDespesas; + // Aguardar a resolução de todas as promessas + return Promise.all(cartoesCompletos); } catch (error) { console.error('Erro ao buscar cartões:', error); return []; @@ -90,8 +98,16 @@ export async function getCartao(cartaoId: string): Promise // Gerar um código único para o cartão, já que não existe na tabela const cartaoCodigo = gerarCartaoCodigo(data.nome, 'banco_padrao'); - // Obter o total de despesas para esse cartão - const totalDespesas = await getTotalDespesasCartao(cartaoCodigo); + // Obter o total de despesas para esse cartão diretamente do banco + const { data: despesasData, error: despesasError } = await supabase + .from('despesas_cartao') + .select('valor') + .eq('cartao_id', cartaoId); + + let totalDespesas = 0; + if (!despesasError && despesasData) { + totalDespesas = despesasData.reduce((acc, item) => acc + Number(item.valor), 0); + } // Retornar o objeto completo com os campos faltantes return { diff --git a/src/services/cartao/despesasService.ts b/src/services/cartao/despesasService.ts index 8254b91..3bd7293 100644 --- a/src/services/cartao/despesasService.ts +++ b/src/services/cartao/despesasService.ts @@ -83,15 +83,21 @@ export async function criarDespesa( const normalizedEmail = userEmail.trim().toLowerCase(); try { + console.log('Tentando criar despesa de cartão com os dados:', { + cartao_id, + valor, + data_despesa, + descricao + }); + + // IMPORTANTE: Removemos os campos login e user_id que não existem na tabela despesas_cartao const { data, error } = await supabase .from('despesas_cartao') .insert([{ cartao_id: cartao_id, valor: valor, data_despesa: data_despesa, - descricao: descricao, - login: normalizedEmail, - user_id: userId + descricao: descricao }]) .select(); @@ -120,40 +126,17 @@ export async function criarDespesa( /** * Calculates the total expenses for a credit card - * @param cartaoCodigo Card code + * @param cartaoId Card ID (not code) * @returns Total expenses amount */ -export async function getTotalDespesasCartao(cartaoCodigo: string): Promise { - // Check if cartaoCodigo is empty - if (!cartaoCodigo) { - console.error('Código do cartão não fornecido'); - return 0; - } - - // 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'); +export async function getTotalDespesasCartao(cartaoId: string): Promise { + // Check if cartaoId is empty + if (!cartaoId) { + console.error('ID do cartão não fornecido'); return 0; } try { - // Buscar todas as despesas com o ID do cartão em vez do código - // Já que cartao_codigo não existe na tabela despesas_cartao - const { data: cartoes, error: cartoesError } = await supabase - .from('cartoes_credito') - .select('id') - .eq('nome', cartaoCodigo) // Usamos o nome como identificador alternativo - .limit(1); - - if (cartoesError || !cartoes || cartoes.length === 0) { - console.error('Erro ao buscar cartão pelo código:', cartoesError); - return 0; - } - - const cartaoId = cartoes[0].id; - // Buscar despesas pelo ID do cartão const { data, error } = await supabase .from('despesas_cartao')