Fix: Dashboard and Categorias page data

The dashboard was not displaying expenses correctly, and the categorias menu was empty. This commit revises the code to ensure expenses are correctly calculated and displayed, and that the categorias menu populates with data.
This commit is contained in:
gpt-engineer-app[bot] 2025-05-18 02:24:03 +00:00
parent 8a056a56dc
commit 0df3fc10ee
3 changed files with 24 additions and 8 deletions

View File

@ -11,6 +11,8 @@ interface CategoryChartProps {
const CategoryChart: React.FC<CategoryChartProps> = ({ categories, isLoading = false }) => { const CategoryChart: React.FC<CategoryChartProps> = ({ categories, isLoading = false }) => {
const renderCustomizedLabel = ({ cx, cy, midAngle, innerRadius, outerRadius, percent }: any) => { const renderCustomizedLabel = ({ cx, cy, midAngle, innerRadius, outerRadius, percent }: any) => {
if (percent === 0) return null;
const radius = innerRadius + (outerRadius - innerRadius) * 0.5; const radius = innerRadius + (outerRadius - innerRadius) * 0.5;
const x = cx + radius * Math.cos(-midAngle * Math.PI / 180); const x = cx + radius * Math.cos(-midAngle * Math.PI / 180);
const y = cy + radius * Math.sin(-midAngle * Math.PI / 180); const y = cy + radius * Math.sin(-midAngle * Math.PI / 180);

View File

@ -77,6 +77,7 @@ const CategoriasPage = () => {
<Card> <Card>
<CardContent className="py-10 text-center"> <CardContent className="py-10 text-center">
<p className="text-muted-foreground">Nenhuma categoria encontrada</p> <p className="text-muted-foreground">Nenhuma categoria encontrada</p>
<p className="mt-2 text-sm">Verifique se existem transações do tipo 'despesa' cadastradas</p>
</CardContent> </CardContent>
</Card> </Card>
) : ( ) : (

View File

@ -16,16 +16,16 @@ export async function getTransacoes(): Promise<Transaction[]> {
console.log("Transações encontradas:", data); console.log("Transações encontradas:", data);
// Transformar os dados recebidos para o formato esperado // Transformar os dados recebidos para o formato esperado, normalizando os tipos
return data.map((item) => ({ return data.map((item) => ({
id: item.id.toString(), id: item.id.toString(),
user: item.user || '', user: item.user || '',
created_at: item.created_at, created_at: item.created_at,
valor: item.tipo === 'receita' ? Math.abs(item.valor || 0) : -Math.abs(item.valor || 0), valor: item.tipo?.toLowerCase() === 'receita' ? Math.abs(item.valor || 0) : -Math.abs(item.valor || 0),
quando: item.quando || new Date().toISOString(), quando: item.quando || new Date().toISOString(),
detalhes: item.detalhes || '', detalhes: item.detalhes || '',
estabelecimento: item.estabelecimento || '', estabelecimento: item.estabelecimento || '',
tipo: item.tipo || 'despesa', tipo: item.tipo?.toLowerCase() || 'despesa',
categoria: item.categoria || 'Outros' categoria: item.categoria || 'Outros'
})); }));
} }
@ -44,11 +44,11 @@ export async function getTransactionSummary() {
console.log("Dados para resumo encontrados:", data); console.log("Dados para resumo encontrados:", data);
const totalReceitas = data const totalReceitas = data
.filter(item => item.tipo === 'receita') .filter(item => item.tipo?.toLowerCase() === 'receita')
.reduce((sum, item) => sum + Math.abs(item.valor || 0), 0); .reduce((sum, item) => sum + Math.abs(item.valor || 0), 0);
const totalDespesas = data const totalDespesas = data
.filter(item => item.tipo === 'despesa') .filter(item => item.tipo?.toLowerCase() === 'despesa')
.reduce((sum, item) => sum + Math.abs(item.valor || 0), 0); .reduce((sum, item) => sum + Math.abs(item.valor || 0), 0);
const resultado = { const resultado = {
@ -66,7 +66,7 @@ export async function getCategorySummary() {
const { data, error } = await supabase const { data, error } = await supabase
.from('transacoes') .from('transacoes')
.select('categoria, valor, tipo') .select('categoria, valor, tipo')
.eq('tipo', 'despesa'); .eq('tipo', 'Despesa');
if (error) { if (error) {
console.error('Erro ao buscar resumo de categorias:', error); console.error('Erro ao buscar resumo de categorias:', error);
@ -75,6 +75,19 @@ export async function getCategorySummary() {
console.log("Dados de categorias encontrados:", data); console.log("Dados de categorias encontrados:", data);
// Vamos buscar tanto "Despesa" quanto "despesa" para garantir
const { data: dataLowerCase, error: errorLowerCase } = await supabase
.from('transacoes')
.select('categoria, valor, tipo')
.eq('tipo', 'despesa');
if (errorLowerCase) {
console.error('Erro ao buscar despesas minúsculas:', errorLowerCase);
} else if (dataLowerCase) {
data.push(...dataLowerCase);
console.log("Dados adicionais encontrados:", dataLowerCase);
}
// Agrupar por categoria // Agrupar por categoria
const categorias: Record<string, number> = {}; const categorias: Record<string, number> = {};
data.forEach(item => { data.forEach(item => {
@ -126,14 +139,14 @@ export async function getMonthlyData() {
meses[mes] = { receitas: 0, despesas: 0 }; meses[mes] = { receitas: 0, despesas: 0 };
}); });
// Agrupar por mês // Agrupar por mês, normalizando o tipo
data.forEach(item => { data.forEach(item => {
if (item.quando && item.valor) { if (item.quando && item.valor) {
const data = new Date(item.quando); const data = new Date(item.quando);
const mesIndex = data.getMonth(); const mesIndex = data.getMonth();
const nomeMes = nomesMeses[mesIndex]; const nomeMes = nomesMeses[mesIndex];
if (item.tipo === 'receita') { if (item.tipo?.toLowerCase() === 'receita') {
meses[nomeMes].receitas += Math.abs(item.valor); meses[nomeMes].receitas += Math.abs(item.valor);
} else { } else {
meses[nomeMes].despesas += Math.abs(item.valor); meses[nomeMes].despesas += Math.abs(item.valor);