Fix: Ensure despesas_cartao database connection
Check and resolve issues preventing credit card expense inclusion, verifying the database connection.
This commit is contained in:
parent
80835c6ca0
commit
a7506e7070
@ -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
|
||||
|
||||
@ -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 {
|
||||
|
||||
@ -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')
|
||||
|
||||
Loading…
Reference in New Issue
Block a user