From 6ce426222ee331a017da73242d379cd3c5b2299d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alessandro=20Gon=C3=A7aalves?= Date: Wed, 19 Nov 2025 17:12:58 -0300 Subject: [PATCH] =?UTF-8?q?fix:=20ajuste=20no=20percentual=20do=20faturame?= =?UTF-8?q?nto=20l=C3=ADquido?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/app/dre-entidade/teste.tsx | 141 ++++++++++++++++++++++++--------- 1 file changed, 103 insertions(+), 38 deletions(-) diff --git a/src/app/dre-entidade/teste.tsx b/src/app/dre-entidade/teste.tsx index d5398b3..ea368d5 100644 --- a/src/app/dre-entidade/teste.tsx +++ b/src/app/dre-entidade/teste.tsx @@ -795,6 +795,10 @@ export default function Teste() { const totalEntidade = items.reduce((sum, item) => sum + parseFloat(item.valor), 0); const valoresEntidadePorMes = calcularValoresPorMes(items); + // Verificar se a entidade contém faturamento líquido + const temFaturamentoLiquido = items.some(item => item.codgrupo === "00"); + const codgrupoParaCalculo = temFaturamentoLiquido ? "00" : ""; + // Linha da entidade (Level 0) - sempre expandida rows.push({ type: "entidade", @@ -803,8 +807,8 @@ export default function Teste() { total: totalEntidade, isExpanded: true, valoresPorMes: valoresEntidadePorMes, - percentuaisPorMes: calcularPercentuaisPorMes(valoresEntidadePorMes, ""), - percentualTotal: calcularPercentualTotal(totalEntidade, ""), + percentuaisPorMes: calcularPercentuaisPorMes(valoresEntidadePorMes, codgrupoParaCalculo), + percentualTotal: calcularPercentualTotal(totalEntidade, codgrupoParaCalculo), }); // Agrupar por direto/indireto (SUBGRUPO) dentro da entidade @@ -834,6 +838,10 @@ export default function Teste() { ); const valoresDiretoIndiretoPorMes = calcularValoresPorMes(diretoIndiretoItems); + // Verificar se direto/indireto contém faturamento líquido + const temFaturamentoLiquidoDI = diretoIndiretoItems.some(item => item.codgrupo === "00"); + const codgrupoParaCalculoDI = temFaturamentoLiquidoDI ? "00" : ""; + // Linha direto/indireto (Level 1) - sempre expandida rows.push({ type: "direto_indireto", @@ -843,8 +851,8 @@ export default function Teste() { total: totalDiretoIndireto, isExpanded: true, valoresPorMes: valoresDiretoIndiretoPorMes, - percentuaisPorMes: calcularPercentuaisPorMes(valoresDiretoIndiretoPorMes, ""), - percentualTotal: calcularPercentualTotal(totalDiretoIndireto, ""), + percentuaisPorMes: calcularPercentuaisPorMes(valoresDiretoIndiretoPorMes, codgrupoParaCalculoDI), + percentualTotal: calcularPercentualTotal(totalDiretoIndireto, codgrupoParaCalculoDI), }); // Agrupar por centro de custo dentro de direto/indireto @@ -877,6 +885,10 @@ export default function Teste() { ); const valoresCentroPorMes = calcularValoresPorMes(centroItems); + // Verificar se centro de custo contém faturamento líquido + const temFaturamentoLiquidoCC = centroItems.some(item => item.codgrupo === "00"); + const codgrupoParaCalculoCC = temFaturamentoLiquidoCC ? "00" : ""; + // Linha do centro de custo (Level 2) - sempre expandida rows.push({ type: "centro_custo", @@ -888,8 +900,8 @@ export default function Teste() { total: totalCentro, isExpanded: true, valoresPorMes: valoresCentroPorMes, - percentuaisPorMes: calcularPercentuaisPorMes(valoresCentroPorMes, ""), - percentualTotal: calcularPercentualTotal(totalCentro, ""), + percentuaisPorMes: calcularPercentuaisPorMes(valoresCentroPorMes, codgrupoParaCalculoCC), + percentualTotal: calcularPercentualTotal(totalCentro, codgrupoParaCalculoCC), }); // Agrupar por conta dentro do centro de custo @@ -922,6 +934,10 @@ export default function Teste() { ); const valoresContaPorMes = calcularValoresPorMes(contaItems); + // Verificar se conta contém faturamento líquido + const temFaturamentoLiquidoConta = contaItems.some(item => item.codgrupo === "00"); + const codgrupoParaCalculoConta = temFaturamentoLiquidoConta ? "00" : ""; + // Linha da conta (Level 3) rows.push({ type: "conta", @@ -934,8 +950,8 @@ export default function Teste() { codigo_centro_custo: centroItems[0].codigo_centro_custo, total: totalConta, valoresPorMes: valoresContaPorMes, - percentuaisPorMes: calcularPercentuaisPorMes(valoresContaPorMes, ""), - percentualTotal: calcularPercentualTotal(totalConta, ""), + percentuaisPorMes: calcularPercentuaisPorMes(valoresContaPorMes, codgrupoParaCalculoConta), + percentualTotal: calcularPercentualTotal(totalConta, codgrupoParaCalculoConta), }); }); }); @@ -1476,28 +1492,52 @@ export default function Teste() { return valoresPorMes; }; - // Função para calcular percentuais (simplificada para nova hierarquia) - const calcularPercentuaisPorMes = ( - valoresPorMes: Record, - grupo: string // Não usado na nova hierarquia, mantido para compatibilidade - ): Record => { - const percentuais: Record = {}; + // Função auxiliar para calcular o faturamento líquido por mês + const calcularFaturamentoLiquidoPorMes = (): Record => { + const faturamentoLiquidoPorMes: Record = {}; - // Calcular o total geral de todas as entidades para usar como referência - const totalGeralPorMes: Record = {}; mesesDisponiveis.forEach(mes => { - totalGeralPorMes[mes] = data - .filter(item => item.data_competencia === mes) - .reduce((sum, item) => sum + parseFloat(item.valor), 0); + // Buscar itens com CODGRUPO = "00" (faturamento líquido) + const dadosMes = data.filter(item => item.data_competencia === mes); + + const faturamentoLiquidoItems = dadosMes.filter(item => item.codgrupo === "00"); + + if (faturamentoLiquidoItems.length > 0) { + // Se encontrou itens com CODGRUPO = "00", somar seus valores + faturamentoLiquidoPorMes[mes] = faturamentoLiquidoItems.reduce( + (sum, item) => sum + parseFloat(item.valor), + 0 + ); + } else { + // Se não encontrou, retornar 0 + faturamentoLiquidoPorMes[mes] = 0; + } }); - // Calcular percentuais baseado no total geral + return faturamentoLiquidoPorMes; + }; + + // Função para calcular percentuais baseado no faturamento líquido + const calcularPercentuaisPorMes = ( + valoresPorMes: Record, + grupo: string // Usado para verificar se é faturamento líquido (CODGRUPO = "00") + ): Record => { + const percentuais: Record = {}; + const faturamentoLiquidoPorMes = calcularFaturamentoLiquidoPorMes(); + + // Verificar se é faturamento líquido (CODGRUPO = "00") + const isFaturamentoLiquido = grupo === "00" || grupo.includes("00") || grupo.includes("FATURAMENTO LÍQUIDO"); + Object.keys(valoresPorMes).forEach((mes) => { const valorAtual = valoresPorMes[mes]; - const totalGeral = totalGeralPorMes[mes] || 0; + const faturamentoLiquido = faturamentoLiquidoPorMes[mes] || 0; - if (totalGeral !== 0) { - percentuais[mes] = (valorAtual / totalGeral) * 100; + if (isFaturamentoLiquido) { + // Se for faturamento líquido, sempre retornar 100% + percentuais[mes] = 100; + } else if (faturamentoLiquido !== 0) { + // Calcular percentual baseado no faturamento líquido + percentuais[mes] = (valorAtual / faturamentoLiquido) * 100; } else { percentuais[mes] = 0; } @@ -1506,19 +1546,28 @@ export default function Teste() { return percentuais; }; - // Função para calcular percentual do total + // Função para calcular percentual do total baseado no faturamento líquido const calcularPercentualTotal = ( total: number, - grupo: string // Não usado na nova hierarquia, mantido para compatibilidade + grupo: string // Usado para verificar se é faturamento líquido (CODGRUPO = "00") ): number => { - // Calcular o total geral - const totalGeral = data.reduce( - (sum, item) => sum + parseFloat(item.valor), + // Verificar se é faturamento líquido + const isFaturamentoLiquido = grupo === "00" || grupo.includes("00") || grupo.includes("FATURAMENTO LÍQUIDO"); + + if (isFaturamentoLiquido) { + // Se for faturamento líquido, sempre retornar 100% + return 100; + } + + // Calcular o total do faturamento líquido + const faturamentoLiquidoPorMes = calcularFaturamentoLiquidoPorMes(); + const totalFaturamentoLiquido = Object.values(faturamentoLiquidoPorMes).reduce( + (sum, valor) => sum + valor, 0 ); - if (totalGeral !== 0) { - return (total / totalGeral) * 100; + if (totalFaturamentoLiquido !== 0) { + return (total / totalFaturamentoLiquido) * 100; } else { return 0; } @@ -1552,6 +1601,10 @@ export default function Teste() { ); const valoresEntidadePorMes = calcularValoresPorMes(items); + // Verificar se a entidade contém faturamento líquido (CODGRUPO = "00") + const temFaturamentoLiquido = items.some(item => item.codgrupo === "00"); + const codgrupoParaCalculo = temFaturamentoLiquido ? "00" : ""; + // Linha da entidade (Level 0) rows.push({ type: "entidade", @@ -1560,8 +1613,8 @@ export default function Teste() { total: totalEntidade, isExpanded: expandedEntidades.has(entidade), valoresPorMes: valoresEntidadePorMes, - percentuaisPorMes: calcularPercentuaisPorMes(valoresEntidadePorMes, ""), - percentualTotal: calcularPercentualTotal(totalEntidade, ""), + percentuaisPorMes: calcularPercentuaisPorMes(valoresEntidadePorMes, codgrupoParaCalculo), + percentualTotal: calcularPercentualTotal(totalEntidade, codgrupoParaCalculo), }); if (expandedEntidades.has(entidade)) { @@ -1592,6 +1645,10 @@ export default function Teste() { ); const valoresDiretoIndiretoPorMes = calcularValoresPorMes(diretoIndiretoItems); + // Verificar se direto/indireto contém faturamento líquido + const temFaturamentoLiquidoDI = diretoIndiretoItems.some(item => item.codgrupo === "00"); + const codgrupoParaCalculoDI = temFaturamentoLiquidoDI ? "00" : ""; + // Linha direto/indireto (Level 1) const chaveDiretoIndireto = `${entidade}-${diretoIndireto}`; rows.push({ @@ -1602,8 +1659,8 @@ export default function Teste() { total: totalDiretoIndireto, isExpanded: expandedDiretoIndireto.has(chaveDiretoIndireto), valoresPorMes: valoresDiretoIndiretoPorMes, - percentuaisPorMes: calcularPercentuaisPorMes(valoresDiretoIndiretoPorMes, ""), - percentualTotal: calcularPercentualTotal(totalDiretoIndireto, ""), + percentuaisPorMes: calcularPercentuaisPorMes(valoresDiretoIndiretoPorMes, codgrupoParaCalculoDI), + percentualTotal: calcularPercentualTotal(totalDiretoIndireto, codgrupoParaCalculoDI), }); if (expandedDiretoIndireto.has(chaveDiretoIndireto)) { @@ -1640,6 +1697,10 @@ export default function Teste() { ); const valoresCentroPorMes = calcularValoresPorMes(centroItems); + // Verificar se centro de custo contém faturamento líquido + const temFaturamentoLiquidoCC = centroItems.some(item => item.codgrupo === "00"); + const codgrupoParaCalculoCC = temFaturamentoLiquidoCC ? "00" : ""; + // Linha do centro de custo (Level 2) const chaveCentro = `${entidade}-${diretoIndireto}-${centro}`; rows.push({ @@ -1652,8 +1713,8 @@ export default function Teste() { total: totalCentro, isExpanded: expandedCentros.has(chaveCentro), valoresPorMes: valoresCentroPorMes, - percentuaisPorMes: calcularPercentuaisPorMes(valoresCentroPorMes, ""), - percentualTotal: calcularPercentualTotal(totalCentro, ""), + percentuaisPorMes: calcularPercentuaisPorMes(valoresCentroPorMes, codgrupoParaCalculoCC), + percentualTotal: calcularPercentualTotal(totalCentro, codgrupoParaCalculoCC), }); if (expandedCentros.has(chaveCentro)) { @@ -1690,6 +1751,10 @@ export default function Teste() { ); const valoresContaPorMes = calcularValoresPorMes(contaItems); + // Verificar se conta contém faturamento líquido + const temFaturamentoLiquidoConta = contaItems.some(item => item.codgrupo === "00"); + const codgrupoParaCalculoConta = temFaturamentoLiquidoConta ? "00" : ""; + // Linha da conta (Level 3) rows.push({ type: "conta", @@ -1702,8 +1767,8 @@ export default function Teste() { codigo_centro_custo: centroItems[0].codigo_centro_custo, total: totalConta, valoresPorMes: valoresContaPorMes, - percentuaisPorMes: calcularPercentuaisPorMes(valoresContaPorMes, ""), - percentualTotal: calcularPercentualTotal(totalConta, ""), + percentuaisPorMes: calcularPercentuaisPorMes(valoresContaPorMes, codgrupoParaCalculoConta), + percentualTotal: calcularPercentualTotal(totalConta, codgrupoParaCalculoConta), }); }); }