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 { 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

View File

@ -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<CartaoCredito[]> {
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<CartaoCredito[]> {
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<CartaoCredito | null>
// 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 {

View File

@ -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<number> {
// 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<number> {
// 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')