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 { 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
|
||||||
|
|||||||
@ -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 {
|
||||||
|
|||||||
@ -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')
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user