import { NextRequest, NextResponse } from 'next/server'; import { executeOracleQuery } from '@/db/oracle'; export async function GET(request: NextRequest) { try { console.log('🔄 Buscando dados DRE do Oracle...'); // Query para buscar dados da tabela DRE_RESULTADO const sql = `SELECT * FROM DRE_RESULTADO ORDER BY CODGRUPO, CODCONTA, CODCENTROCUSTO`; const data = await executeOracleQuery(sql); console.log('✅ Query executada com sucesso:', data.length, 'registros encontrados'); // Transformar os dados do Oracle para o formato esperado pelo componente const transformedData = data.map((item: any) => { const codgrupo = item.CODGRUPO || ""; const nomeGrupo = item.GRUPO || ""; return { codfilial: "001", // Valor padrĂŁo data_competencia: item.DATA || "2023-03", // Usar DATA do Oracle data_cai: item.DATA || "2023-03", // Usar DATA do Oracle grupo: codgrupo ? `${codgrupo} - ${nomeGrupo}` : nomeGrupo, // Concatenar cĂłdigo + nome subgrupo: item.CENTROCUSTO || "", // Usar CENTROCUSTO como subgrupo centro_custo: item.CENTROCUSTO || "", // Usar CENTROCUSTO (nome do centro) codigo_centro_custo: item.CODIGOCENTROCUSTO || "", // Usar CODIGOCENTROCUSTO (cĂłdigo do centro) codigo_conta: parseInt(item.CODCONTA) || 0, // Converter CODCONTA para nĂșmero conta: item.CONTA || "", // Usar CONTA do Oracle valor: item.VALOR?.toString() || "0", // Converter VALOR para string codgrupo: codgrupo, // Adicionar cĂłdigo do grupo para cĂĄlculos }; }); // Criar grupos calculados que nĂŁo existem no Oracle const gruposCalculados = criarGruposCalculados(transformedData); // Combinar dados originais com grupos calculados const dadosCompletos = [...transformedData, ...gruposCalculados]; return NextResponse.json(dadosCompletos); } catch (error) { console.error('❌ Erro ao buscar dados DRE do Oracle:', error); return NextResponse.json( { success: false, error: error instanceof Error ? error.message : 'Erro desconhecido', details: error instanceof Error ? error.stack : undefined }, { status: 500 } ); } } function criarGruposCalculados(dados: any[]) { const gruposCalculados: any[] = []; // Agrupar dados por mĂȘs para cĂĄlculos const dadosPorMes = dados.reduce((acc, item) => { const mes = item.data_competencia; if (!acc[mes]) acc[mes] = []; acc[mes].push(item); return acc; }, {} as Record); // Para cada mĂȘs, criar os grupos calculados Object.keys(dadosPorMes).forEach(mes => { const dadosMes = dadosPorMes[mes]; // Calcular valores por grupo usando cĂłdigo numĂ©rico const valoresPorGrupo = dadosMes.reduce((acc: Record, item: any) => { const codgrupo = item.codgrupo; if (!acc[codgrupo]) acc[codgrupo] = 0; acc[codgrupo] += parseFloat(item.valor); return acc; }, {} as Record); // 03 - Faturamento LĂ­quido (01 + 02) const faturamentoBruto = valoresPorGrupo['01'] || 0; const devolucao = valoresPorGrupo['02'] || 0; const faturamentoLiquido = faturamentoBruto + devolucao; gruposCalculados.push({ codfilial: "001", data_competencia: mes, data_cai: mes, grupo: "03 - FATURAMENTO LÍQUIDO", subgrupo: "CALCULADO", centro_custo: "CALCULADO", codigo_conta: 0, conta: "FATURAMENTO LÍQUIDO", valor: faturamentoLiquido.toString(), codgrupo: "03", isCalculado: true }); // 05 - Lucro Bruto (03 + 04) const cmv = valoresPorGrupo['04'] || 0; const lucroBruto = faturamentoLiquido + cmv; gruposCalculados.push({ codfilial: "001", data_competencia: mes, data_cai: mes, grupo: "05 - LUCRO BRUTO", subgrupo: "CALCULADO", centro_custo: "CALCULADO", codigo_conta: 0, conta: "LUCRO BRUTO", valor: lucroBruto.toString(), codgrupo: "05", isCalculado: true }); // 07 - Margem Loja (05 + 06) const receitasGastosDiretos = valoresPorGrupo['06'] || 0; const margemLoja = lucroBruto + receitasGastosDiretos; gruposCalculados.push({ codfilial: "001", data_competencia: mes, data_cai: mes, grupo: "07 - MARGEM LOJA", subgrupo: "CALCULADO", centro_custo: "CALCULADO", codigo_conta: 0, conta: "MARGEM LOJA", valor: margemLoja.toString(), codgrupo: "07", isCalculado: true }); // 10 - Resultado Operacional (07 + 08 + 09) const verba = valoresPorGrupo['08'] || 0; const receitasGastosIndiretos = valoresPorGrupo['09'] || 0; const resultadoOperacional = margemLoja + verba + receitasGastosIndiretos; gruposCalculados.push({ codfilial: "001", data_competencia: mes, data_cai: mes, grupo: "10 - RESULTADO OPERACIONAL", subgrupo: "CALCULADO", centro_custo: "CALCULADO", codigo_conta: 0, conta: "RESULTADO OPERACIONAL", valor: resultadoOperacional.toString(), codgrupo: "10", isCalculado: true }); // 13 - Resultado Financeiro (11 + 12) const receitaFinanceira = valoresPorGrupo['11'] || 0; const despesaFinanceira = valoresPorGrupo['12'] || 0; const resultadoFinanceiro = receitaFinanceira + despesaFinanceira; gruposCalculados.push({ codfilial: "001", data_competencia: mes, data_cai: mes, grupo: "13 - RESULTADO FINANCEIRO", subgrupo: "CALCULADO", centro_custo: "CALCULADO", codigo_conta: 0, conta: "RESULTADO FINANCEIRO", valor: resultadoFinanceiro.toString(), codgrupo: "13", isCalculado: true }); // 19 - Resultado NĂŁo Operacional (14 + 15 + 16 + 17 + 18) const prejuizosPerdas = valoresPorGrupo['14'] || 0; const inativas = valoresPorGrupo['15'] || 0; const diretoria = valoresPorGrupo['16'] || 0; const lancamentosSemCC = valoresPorGrupo['17'] || 0; const receitasDespesasNaoOperacional = valoresPorGrupo['18'] || 0; const resultadoNaoOperacional = prejuizosPerdas + inativas + diretoria + lancamentosSemCC + receitasDespesasNaoOperacional; gruposCalculados.push({ codfilial: "001", data_competencia: mes, data_cai: mes, grupo: "19 - RESULTADO NÃO OPERACIONAL", subgrupo: "CALCULADO", centro_custo: "CALCULADO", codigo_conta: 0, conta: "RESULTADO NÃO OPERACIONAL", valor: resultadoNaoOperacional.toString(), codgrupo: "19", isCalculado: true }); // 20 - LAIR (10 + 13 + 19) const lair = resultadoOperacional + resultadoFinanceiro + resultadoNaoOperacional; gruposCalculados.push({ codfilial: "001", data_competencia: mes, data_cai: mes, grupo: "20 - LAIR", subgrupo: "CALCULADO", centro_custo: "CALCULADO", codigo_conta: 0, conta: "LAIR", valor: lair.toString(), codgrupo: "20", isCalculado: true }); // 21 - IR (se LAIR > 0 calcular 20% e resultado negativo, se nĂŁo 0) const ir = lair > 0 ? -(lair * 0.20) : 0; gruposCalculados.push({ codfilial: "001", data_competencia: mes, data_cai: mes, grupo: "21 - IR", subgrupo: "CALCULADO", centro_custo: "CALCULADO", codigo_conta: 0, conta: "IMPOSTO DE RENDA", valor: ir.toString(), codgrupo: "21", isCalculado: true }); // 22 - CSLL (se LAIR > 0 calcular 9% e resultado negativo, se nĂŁo 0) const csll = lair > 0 ? -(lair * 0.09) : 0; gruposCalculados.push({ codfilial: "001", data_competencia: mes, data_cai: mes, grupo: "22 - CSLL", subgrupo: "CALCULADO", centro_custo: "CALCULADO", codigo_conta: 0, conta: "CONTRIBUIÇÃO SOCIAL SOBRE LUCRO LÍQUIDO", valor: csll.toString(), codgrupo: "22", isCalculado: true }); // 23 - Lucro LĂ­quido (20 + 21 + 22) const lucroLiquido = lair + ir + csll; gruposCalculados.push({ codfilial: "001", data_competencia: mes, data_cai: mes, grupo: "23 - LUCRO LÍQUIDO", subgrupo: "CALCULADO", centro_custo: "CALCULADO", codigo_conta: 0, conta: "LUCRO LÍQUIDO", valor: lucroLiquido.toString(), codgrupo: "23", isCalculado: true }); // 25 - EBITDA (20 - (13 + 19 + 24)) const despesaTributaria = valoresPorGrupo['24'] || 0; const ebitda = lair - (resultadoFinanceiro + resultadoNaoOperacional + despesaTributaria); gruposCalculados.push({ codfilial: "001", data_competencia: mes, data_cai: mes, grupo: "25 - EBITDA", subgrupo: "CALCULADO", centro_custo: "CALCULADO", codigo_conta: 0, conta: "EBITDA", valor: ebitda.toString(), codgrupo: "25", isCalculado: true }); }); return gruposCalculados; }