fix: ajuste no percentual do faturamento líquido

This commit is contained in:
Alessandro Gonçaalves 2025-11-19 17:12:58 -03:00
parent beaefcc736
commit 6ce426222e
1 changed files with 103 additions and 38 deletions

View File

@ -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<string, number>,
grupo: string // Não usado na nova hierarquia, mantido para compatibilidade
): Record<string, number> => {
const percentuais: Record<string, number> = {};
// Função auxiliar para calcular o faturamento líquido por mês
const calcularFaturamentoLiquidoPorMes = (): Record<string, number> => {
const faturamentoLiquidoPorMes: Record<string, number> = {};
// Calcular o total geral de todas as entidades para usar como referência
const totalGeralPorMes: Record<string, number> = {};
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<string, number>,
grupo: string // Usado para verificar se é faturamento líquido (CODGRUPO = "00")
): Record<string, number> => {
const percentuais: Record<string, number> = {};
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),
});
});
}