284 lines
8.9 KiB
TypeScript
284 lines
8.9 KiB
TypeScript
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<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: Record<string, number>, item: any) => {
|
|
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
|
|
});
|
|
|
|
// 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;
|
|
}
|