vendaweb-api/src/app/api/dre-oracle/route.ts

282 lines
8.7 KiB
TypeScript
Raw Normal View History

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.CODIGOCENTROCUSTO || "", // Usar CODIGOCENTROCUSTO
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<string, any[]>);
// 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, item) => {
const codgrupo = item.codgrupo;
if (!acc[codgrupo]) acc[codgrupo] = 0;
acc[codgrupo] += parseFloat(item.valor);
return acc;
}, {} as Record<string, number>);
// 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
});
// 18 - Outras Receitas / Despesas (14 + 15 + 16 + 17)
const prejuizosPerdas = valoresPorGrupo['14'] || 0;
const inativas = valoresPorGrupo['15'] || 0;
const diretoria = valoresPorGrupo['16'] || 0;
const lancamentosSemCC = valoresPorGrupo['17'] || 0;
const outrasReceitasDespesas = prejuizosPerdas + inativas + diretoria + lancamentosSemCC;
gruposCalculados.push({
codfilial: "001",
data_competencia: mes,
data_cai: mes,
grupo: "18 - OUTRAS RECEITAS / DESPESAS",
subgrupo: "CALCULADO",
centro_custo: "CALCULADO",
codigo_conta: 0,
conta: "OUTRAS RECEITAS / DESPESAS",
valor: outrasReceitasDespesas.toString(),
codgrupo: "18",
isCalculado: true
});
// 19 - LAIR (10 + 13 + 18)
const lair = resultadoOperacional + resultadoFinanceiro + outrasReceitasDespesas;
gruposCalculados.push({
codfilial: "001",
data_competencia: mes,
data_cai: mes,
grupo: "19 - LAIR",
subgrupo: "CALCULADO",
centro_custo: "CALCULADO",
codigo_conta: 0,
conta: "LAIR",
valor: lair.toString(),
codgrupo: "19",
isCalculado: true
});
// 20 - 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: "20 - IR",
subgrupo: "CALCULADO",
centro_custo: "CALCULADO",
codigo_conta: 0,
conta: "IMPOSTO DE RENDA",
valor: ir.toString(),
codgrupo: "20",
isCalculado: true
});
// 21 - 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: "21 - CSLL",
subgrupo: "CALCULADO",
centro_custo: "CALCULADO",
codigo_conta: 0,
conta: "CONTRIBUIÇÃO SOCIAL SOBRE LUCRO LÍQUIDO",
valor: csll.toString(),
codgrupo: "21",
isCalculado: true
});
// 22 - Lucro Líquido (19 + 20 + 21)
const lucroLiquido = lair + ir + csll;
gruposCalculados.push({
codfilial: "001",
data_competencia: mes,
data_cai: mes,
grupo: "22 - LUCRO LÍQUIDO",
subgrupo: "CALCULADO",
centro_custo: "CALCULADO",
codigo_conta: 0,
conta: "LUCRO LÍQUIDO",
valor: lucroLiquido.toString(),
codgrupo: "22",
isCalculado: true
});
// 24 - EBITDA (19 - (13 + 18 + 23))
const despesaTributaria = valoresPorGrupo['23'] || 0;
const ebitda = lair - (resultadoFinanceiro + outrasReceitasDespesas + despesaTributaria);
gruposCalculados.push({
codfilial: "001",
data_competencia: mes,
data_cai: mes,
grupo: "24 - EBITDA",
subgrupo: "CALCULADO",
centro_custo: "CALCULADO",
codigo_conta: 0,
conta: "EBITDA",
valor: ebitda.toString(),
codgrupo: "24",
isCalculado: true
});
});
return gruposCalculados;
}