Fix: Ensure despesas_cartao database connection

Check and resolve issues preventing credit card expense inclusion, verifying the database connection.
This commit is contained in:
gpt-engineer-app[bot] 2025-05-21 09:25:21 +00:00
parent 80835c6ca0
commit a7506e7070
3 changed files with 55 additions and 45 deletions

View File

@ -1,11 +1,11 @@
import { useState } from 'react'; import { useState } from 'react';
import { useForm } from 'react-hook-form'; import { useForm } from 'react-hook-form';
import { zodResolver } from '@hookform/resolvers/zod'; import { zodResolver } from '@hookform/resolvers/zod';
import * as z from 'zod'; import * as z from 'zod';
import { useToast } from '@/components/ui/use-toast'; import { useToast } from '@/components/ui/use-toast';
import { CartaoCredito } from '@/types/cartaoTypes'; import { CartaoCredito } from '@/types/cartaoTypes';
import { criarDespesa } from '@/services/cartaoCreditoService'; import { criarDespesa } from '@/services/cartao/despesasService';
import { gerarCartaoCodigo } from '@/services/cartao/cartaoCodigoUtils';
import { CalendarIcon } from 'lucide-react'; import { CalendarIcon } from 'lucide-react';
import { format } from 'date-fns'; import { format } from 'date-fns';
import { ptBR } from 'date-fns/locale'; import { ptBR } from 'date-fns/locale';
@ -78,10 +78,10 @@ export function DespesaCartaoFormSelect({ cartoes, onSuccess, onCancel }: Despes
}; };
async function onSubmit(data: DespesaCartaoFormValues) { async function onSubmit(data: DespesaCartaoFormValues) {
if (!selectedCartao || !selectedCartao.cartao_codigo) { if (!selectedCartao) {
toast({ toast({
title: "Erro", title: "Erro",
description: "Informações do cartão incompletas", description: "Selecione um cartão primeiro",
variant: "destructive" variant: "destructive"
}); });
return; return;
@ -92,9 +92,20 @@ export function DespesaCartaoFormSelect({ cartoes, onSuccess, onCancel }: Despes
try { try {
const formattedDate = format(data.data_despesa, 'yyyy-MM-dd'); 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( const resultado = await criarDespesa(
data.cartao_id, data.cartao_id,
selectedCartao.cartao_codigo, cartaoCodigo,
data.valor, data.valor,
formattedDate, formattedDate,
data.descricao data.descricao

View File

@ -2,7 +2,6 @@
import { supabase } from "@/integrations/supabase/client"; import { supabase } from "@/integrations/supabase/client";
import { CartaoCredito } from "@/types/cartaoTypes"; import { CartaoCredito } from "@/types/cartaoTypes";
import { gerarCartaoCodigo } from "./cartaoCodigoUtils"; import { gerarCartaoCodigo } from "./cartaoCodigoUtils";
import { getTotalDespesasCartao } from "./despesasService";
/** /**
* Fetches all credit cards for the current user * Fetches all credit cards for the current user
@ -32,13 +31,21 @@ export async function getCartoes(): Promise<CartaoCredito[]> {
throw new Error('Não foi possível carregar os cartões de crédito'); 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 // Para cada cartão, adicionar os campos faltantes
const cartoesComDespesas = await Promise.all(data.map(async (cartao) => { const cartoesCompletos = data.map(async (cartao) => {
// Gerar um código único para o cartão, já que não existe na tabela // Gerar um código único para o cartão, já que não existe na tabela
const cartaoCodigo = gerarCartaoCodigo(cartao.nome, 'banco_padrao'); const cartaoCodigo = gerarCartaoCodigo(cartao.nome, 'banco_padrao');
// Obter o total de despesas usando o código gerado ou o nome como fallback // Obter o total de despesas de forma direta para evitar dependência circular
const totalDespesas = await getTotalDespesasCartao(cartaoCodigo); 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 // Retornar o objeto completo com os campos faltantes
return { return {
@ -52,9 +59,10 @@ export async function getCartoes(): Promise<CartaoCredito[]> {
cartao_codigo: cartaoCodigo, cartao_codigo: cartaoCodigo,
total_despesas: totalDespesas total_despesas: totalDespesas
} as CartaoCredito; } as CartaoCredito;
})); });
return cartoesComDespesas; // Aguardar a resolução de todas as promessas
return Promise.all(cartoesCompletos);
} catch (error) { } catch (error) {
console.error('Erro ao buscar cartões:', error); console.error('Erro ao buscar cartões:', error);
return []; return [];
@ -90,8 +98,16 @@ export async function getCartao(cartaoId: string): Promise<CartaoCredito | null>
// Gerar um código único para o cartão, já que não existe na tabela // Gerar um código único para o cartão, já que não existe na tabela
const cartaoCodigo = gerarCartaoCodigo(data.nome, 'banco_padrao'); const cartaoCodigo = gerarCartaoCodigo(data.nome, 'banco_padrao');
// Obter o total de despesas para esse cartão // Obter o total de despesas para esse cartão diretamente do banco
const totalDespesas = await getTotalDespesasCartao(cartaoCodigo); 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 // Retornar o objeto completo com os campos faltantes
return { return {

View File

@ -83,15 +83,21 @@ export async function criarDespesa(
const normalizedEmail = userEmail.trim().toLowerCase(); const normalizedEmail = userEmail.trim().toLowerCase();
try { 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 const { data, error } = await supabase
.from('despesas_cartao') .from('despesas_cartao')
.insert([{ .insert([{
cartao_id: cartao_id, cartao_id: cartao_id,
valor: valor, valor: valor,
data_despesa: data_despesa, data_despesa: data_despesa,
descricao: descricao, descricao: descricao
login: normalizedEmail,
user_id: userId
}]) }])
.select(); .select();
@ -120,40 +126,17 @@ export async function criarDespesa(
/** /**
* Calculates the total expenses for a credit card * Calculates the total expenses for a credit card
* @param cartaoCodigo Card code * @param cartaoId Card ID (not code)
* @returns Total expenses amount * @returns Total expenses amount
*/ */
export async function getTotalDespesasCartao(cartaoCodigo: string): Promise<number> { export async function getTotalDespesasCartao(cartaoId: string): Promise<number> {
// Check if cartaoCodigo is empty // Check if cartaoId is empty
if (!cartaoCodigo) { if (!cartaoId) {
console.error('Código do cartão não fornecido'); console.error('ID 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');
return 0; return 0;
} }
try { 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 // Buscar despesas pelo ID do cartão
const { data, error } = await supabase const { data, error } = await supabase
.from('despesas_cartao') .from('despesas_cartao')