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 totalEntidade = items.reduce((sum, item) => sum + parseFloat(item.valor), 0);
const valoresEntidadePorMes = calcularValoresPorMes(items); 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 // Linha da entidade (Level 0) - sempre expandida
rows.push({ rows.push({
type: "entidade", type: "entidade",
@ -803,8 +807,8 @@ export default function Teste() {
total: totalEntidade, total: totalEntidade,
isExpanded: true, isExpanded: true,
valoresPorMes: valoresEntidadePorMes, valoresPorMes: valoresEntidadePorMes,
percentuaisPorMes: calcularPercentuaisPorMes(valoresEntidadePorMes, ""), percentuaisPorMes: calcularPercentuaisPorMes(valoresEntidadePorMes, codgrupoParaCalculo),
percentualTotal: calcularPercentualTotal(totalEntidade, ""), percentualTotal: calcularPercentualTotal(totalEntidade, codgrupoParaCalculo),
}); });
// Agrupar por direto/indireto (SUBGRUPO) dentro da entidade // Agrupar por direto/indireto (SUBGRUPO) dentro da entidade
@ -834,6 +838,10 @@ export default function Teste() {
); );
const valoresDiretoIndiretoPorMes = calcularValoresPorMes(diretoIndiretoItems); 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 // Linha direto/indireto (Level 1) - sempre expandida
rows.push({ rows.push({
type: "direto_indireto", type: "direto_indireto",
@ -843,8 +851,8 @@ export default function Teste() {
total: totalDiretoIndireto, total: totalDiretoIndireto,
isExpanded: true, isExpanded: true,
valoresPorMes: valoresDiretoIndiretoPorMes, valoresPorMes: valoresDiretoIndiretoPorMes,
percentuaisPorMes: calcularPercentuaisPorMes(valoresDiretoIndiretoPorMes, ""), percentuaisPorMes: calcularPercentuaisPorMes(valoresDiretoIndiretoPorMes, codgrupoParaCalculoDI),
percentualTotal: calcularPercentualTotal(totalDiretoIndireto, ""), percentualTotal: calcularPercentualTotal(totalDiretoIndireto, codgrupoParaCalculoDI),
}); });
// Agrupar por centro de custo dentro de direto/indireto // Agrupar por centro de custo dentro de direto/indireto
@ -877,6 +885,10 @@ export default function Teste() {
); );
const valoresCentroPorMes = calcularValoresPorMes(centroItems); 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 // Linha do centro de custo (Level 2) - sempre expandida
rows.push({ rows.push({
type: "centro_custo", type: "centro_custo",
@ -888,8 +900,8 @@ export default function Teste() {
total: totalCentro, total: totalCentro,
isExpanded: true, isExpanded: true,
valoresPorMes: valoresCentroPorMes, valoresPorMes: valoresCentroPorMes,
percentuaisPorMes: calcularPercentuaisPorMes(valoresCentroPorMes, ""), percentuaisPorMes: calcularPercentuaisPorMes(valoresCentroPorMes, codgrupoParaCalculoCC),
percentualTotal: calcularPercentualTotal(totalCentro, ""), percentualTotal: calcularPercentualTotal(totalCentro, codgrupoParaCalculoCC),
}); });
// Agrupar por conta dentro do centro de custo // Agrupar por conta dentro do centro de custo
@ -922,6 +934,10 @@ export default function Teste() {
); );
const valoresContaPorMes = calcularValoresPorMes(contaItems); 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) // Linha da conta (Level 3)
rows.push({ rows.push({
type: "conta", type: "conta",
@ -934,8 +950,8 @@ export default function Teste() {
codigo_centro_custo: centroItems[0].codigo_centro_custo, codigo_centro_custo: centroItems[0].codigo_centro_custo,
total: totalConta, total: totalConta,
valoresPorMes: valoresContaPorMes, valoresPorMes: valoresContaPorMes,
percentuaisPorMes: calcularPercentuaisPorMes(valoresContaPorMes, ""), percentuaisPorMes: calcularPercentuaisPorMes(valoresContaPorMes, codgrupoParaCalculoConta),
percentualTotal: calcularPercentualTotal(totalConta, ""), percentualTotal: calcularPercentualTotal(totalConta, codgrupoParaCalculoConta),
}); });
}); });
}); });
@ -1476,28 +1492,52 @@ export default function Teste() {
return valoresPorMes; return valoresPorMes;
}; };
// Função para calcular percentuais (simplificada para nova hierarquia) // Função auxiliar para calcular o faturamento líquido por mês
const calcularPercentuaisPorMes = ( const calcularFaturamentoLiquidoPorMes = (): Record<string, number> => {
valoresPorMes: Record<string, number>, const faturamentoLiquidoPorMes: Record<string, number> = {};
grupo: string // Não usado na nova hierarquia, mantido para compatibilidade
): Record<string, number> => {
const percentuais: Record<string, number> = {};
// Calcular o total geral de todas as entidades para usar como referência
const totalGeralPorMes: Record<string, number> = {};
mesesDisponiveis.forEach(mes => { mesesDisponiveis.forEach(mes => {
totalGeralPorMes[mes] = data // Buscar itens com CODGRUPO = "00" (faturamento líquido)
.filter(item => item.data_competencia === mes) const dadosMes = data.filter(item => item.data_competencia === mes);
.reduce((sum, item) => sum + parseFloat(item.valor), 0);
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) => { Object.keys(valoresPorMes).forEach((mes) => {
const valorAtual = valoresPorMes[mes]; const valorAtual = valoresPorMes[mes];
const totalGeral = totalGeralPorMes[mes] || 0; const faturamentoLiquido = faturamentoLiquidoPorMes[mes] || 0;
if (totalGeral !== 0) { if (isFaturamentoLiquido) {
percentuais[mes] = (valorAtual / totalGeral) * 100; // 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 { } else {
percentuais[mes] = 0; percentuais[mes] = 0;
} }
@ -1506,19 +1546,28 @@ export default function Teste() {
return percentuais; return percentuais;
}; };
// Função para calcular percentual do total // Função para calcular percentual do total baseado no faturamento líquido
const calcularPercentualTotal = ( const calcularPercentualTotal = (
total: number, 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 => { ): number => {
// Calcular o total geral // Verificar se é faturamento líquido
const totalGeral = data.reduce( const isFaturamentoLiquido = grupo === "00" || grupo.includes("00") || grupo.includes("FATURAMENTO LÍQUIDO");
(sum, item) => sum + parseFloat(item.valor),
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 0
); );
if (totalGeral !== 0) { if (totalFaturamentoLiquido !== 0) {
return (total / totalGeral) * 100; return (total / totalFaturamentoLiquido) * 100;
} else { } else {
return 0; return 0;
} }
@ -1552,6 +1601,10 @@ export default function Teste() {
); );
const valoresEntidadePorMes = calcularValoresPorMes(items); 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) // Linha da entidade (Level 0)
rows.push({ rows.push({
type: "entidade", type: "entidade",
@ -1560,8 +1613,8 @@ export default function Teste() {
total: totalEntidade, total: totalEntidade,
isExpanded: expandedEntidades.has(entidade), isExpanded: expandedEntidades.has(entidade),
valoresPorMes: valoresEntidadePorMes, valoresPorMes: valoresEntidadePorMes,
percentuaisPorMes: calcularPercentuaisPorMes(valoresEntidadePorMes, ""), percentuaisPorMes: calcularPercentuaisPorMes(valoresEntidadePorMes, codgrupoParaCalculo),
percentualTotal: calcularPercentualTotal(totalEntidade, ""), percentualTotal: calcularPercentualTotal(totalEntidade, codgrupoParaCalculo),
}); });
if (expandedEntidades.has(entidade)) { if (expandedEntidades.has(entidade)) {
@ -1592,6 +1645,10 @@ export default function Teste() {
); );
const valoresDiretoIndiretoPorMes = calcularValoresPorMes(diretoIndiretoItems); 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) // Linha direto/indireto (Level 1)
const chaveDiretoIndireto = `${entidade}-${diretoIndireto}`; const chaveDiretoIndireto = `${entidade}-${diretoIndireto}`;
rows.push({ rows.push({
@ -1602,8 +1659,8 @@ export default function Teste() {
total: totalDiretoIndireto, total: totalDiretoIndireto,
isExpanded: expandedDiretoIndireto.has(chaveDiretoIndireto), isExpanded: expandedDiretoIndireto.has(chaveDiretoIndireto),
valoresPorMes: valoresDiretoIndiretoPorMes, valoresPorMes: valoresDiretoIndiretoPorMes,
percentuaisPorMes: calcularPercentuaisPorMes(valoresDiretoIndiretoPorMes, ""), percentuaisPorMes: calcularPercentuaisPorMes(valoresDiretoIndiretoPorMes, codgrupoParaCalculoDI),
percentualTotal: calcularPercentualTotal(totalDiretoIndireto, ""), percentualTotal: calcularPercentualTotal(totalDiretoIndireto, codgrupoParaCalculoDI),
}); });
if (expandedDiretoIndireto.has(chaveDiretoIndireto)) { if (expandedDiretoIndireto.has(chaveDiretoIndireto)) {
@ -1640,6 +1697,10 @@ export default function Teste() {
); );
const valoresCentroPorMes = calcularValoresPorMes(centroItems); 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) // Linha do centro de custo (Level 2)
const chaveCentro = `${entidade}-${diretoIndireto}-${centro}`; const chaveCentro = `${entidade}-${diretoIndireto}-${centro}`;
rows.push({ rows.push({
@ -1652,8 +1713,8 @@ export default function Teste() {
total: totalCentro, total: totalCentro,
isExpanded: expandedCentros.has(chaveCentro), isExpanded: expandedCentros.has(chaveCentro),
valoresPorMes: valoresCentroPorMes, valoresPorMes: valoresCentroPorMes,
percentuaisPorMes: calcularPercentuaisPorMes(valoresCentroPorMes, ""), percentuaisPorMes: calcularPercentuaisPorMes(valoresCentroPorMes, codgrupoParaCalculoCC),
percentualTotal: calcularPercentualTotal(totalCentro, ""), percentualTotal: calcularPercentualTotal(totalCentro, codgrupoParaCalculoCC),
}); });
if (expandedCentros.has(chaveCentro)) { if (expandedCentros.has(chaveCentro)) {
@ -1690,6 +1751,10 @@ export default function Teste() {
); );
const valoresContaPorMes = calcularValoresPorMes(contaItems); 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) // Linha da conta (Level 3)
rows.push({ rows.push({
type: "conta", type: "conta",
@ -1702,8 +1767,8 @@ export default function Teste() {
codigo_centro_custo: centroItems[0].codigo_centro_custo, codigo_centro_custo: centroItems[0].codigo_centro_custo,
total: totalConta, total: totalConta,
valoresPorMes: valoresContaPorMes, valoresPorMes: valoresContaPorMes,
percentuaisPorMes: calcularPercentuaisPorMes(valoresContaPorMes, ""), percentuaisPorMes: calcularPercentuaisPorMes(valoresContaPorMes, codgrupoParaCalculoConta),
percentualTotal: calcularPercentualTotal(totalConta, ""), percentualTotal: calcularPercentualTotal(totalConta, codgrupoParaCalculoConta),
}); });
}); });
} }