import { supabase } from '@/integrations/supabase/client'; import { Meta, ResultadoMeta } from '@/types/financialTypes'; // Obter todas as metas do usuário export const getMetas = async (userId: string): Promise => { const { data, error } = await supabase .from('metas') .select('*') .eq('user_id', userId) .order('ano', { ascending: false }) .order('mes', { ascending: false }); if (error) { console.error('Erro ao buscar metas:', error); throw new Error(error.message); } return data || []; }; // Obter meta específica export const getMeta = async (userId: string, mes: number, ano: number): Promise => { const { data, error } = await supabase .from('metas') .select('*') .eq('user_id', userId) .eq('mes', mes) .eq('ano', ano) .maybeSingle(); if (error) { console.error('Erro ao buscar meta:', error); throw new Error(error.message); } return data; }; // Criar ou atualizar meta export const salvarMeta = async (meta: { user_id: string, mes: number, ano: number, valor_meta: number }): Promise => { // Verificar se já existe uma meta para este mês/ano const existingMeta = await getMeta(meta.user_id, meta.mes, meta.ano); if (existingMeta) { // Atualizar meta existente const { data, error } = await supabase .from('metas') .update({ valor_meta: meta.valor_meta }) .eq('id', existingMeta.id) .select() .single(); if (error) { console.error('Erro ao atualizar meta:', error); throw new Error(error.message); } return data; } else { // Criar nova meta const { data, error } = await supabase .from('metas') .insert(meta) .select() .single(); if (error) { console.error('Erro ao criar meta:', error); throw new Error(error.message); } return data; } }; // Deletar meta export const deletarMeta = async (metaId: string): Promise => { const { error } = await supabase .from('metas') .delete() .eq('id', metaId); if (error) { console.error('Erro ao deletar meta:', error); throw new Error(error.message); } }; // Calcular resultados das metas export const calcularResultadosMetas = async (userId: string): Promise => { const metas = await getMetas(userId); const resultados: ResultadoMeta[] = []; for (const meta of metas) { // Buscar transações do mês da meta const startDate = new Date(meta.ano, meta.mes - 1, 1); const endDate = new Date(meta.ano, meta.mes, 0); const { data: transacoes, error } = await supabase .from('transacoes') .select('*') .eq('user', userId) .gte('quando', startDate.toISOString().split('T')[0]) .lte('quando', endDate.toISOString().split('T')[0]); if (error) { console.error('Erro ao buscar transações para cálculo de metas:', error); continue; } // Calcular receitas e despesas do mês const receitas = transacoes .filter(t => t.tipo?.toLowerCase() === 'receita') .reduce((sum, t) => sum + Number(t.valor || 0), 0); const despesas = transacoes .filter(t => t.tipo?.toLowerCase() === 'despesa') .reduce((sum, t) => sum + Number(t.valor || 0), 0); // Calcular economia real const economiaReal = receitas - despesas; // Calcular percentual atingido e se a meta foi batida const percentualAtingido = meta.valor_meta > 0 ? Math.min(100, (economiaReal / meta.valor_meta) * 100) : 0; const metaBatida = economiaReal >= meta.valor_meta; resultados.push({ mes: meta.mes, ano: meta.ano, valor_meta: meta.valor_meta, economia_real: economiaReal, percentual_atingido: percentualAtingido, meta_batida: metaBatida }); } return resultados; };