fix: ajuste no novo calculo de valores dos grupos calculados da tabela sintetica

This commit is contained in:
Alessandro Gonçaalves 2025-10-23 16:47:32 -03:00
parent 891aa8663d
commit ee95e72119
1 changed files with 288 additions and 6 deletions

View File

@ -661,22 +661,163 @@ export default function Teste() {
return codigoA.localeCompare(codigoB);
});
// Função para calcular valores de grupos calculados usando códigos dos grupos (mesma lógica da função principal)
const calcularGrupoCalculadoCompleta = (codigoGrupo: string, gruposData: Record<string, DREItem[]>): Record<string, number> => {
const valoresPorMes: Record<string, number> = {};
// Inicializar valores para todos os meses disponíveis
mesesDisponiveis.forEach(mes => {
valoresPorMes[mes] = 0;
});
// Função auxiliar para obter valor de um grupo por código e mês
const obterValorGrupo = (codigoGrupo: string, mes: string): number => {
const grupoEncontrado = Object.values(gruposData).find(items =>
items.length > 0 && items[0].codgrupo === codigoGrupo
);
if (!grupoEncontrado) return 0;
const itemsMes = grupoEncontrado.filter(item => item.data_competencia === mes);
return itemsMes.reduce((sum, item) => sum + parseFloat(item.valor), 0);
};
switch (codigoGrupo) {
case "03": // Faturamento Líquido = Grupo 01 + 02
mesesDisponiveis.forEach(mes => {
const valor01 = obterValorGrupo("01", mes);
const valor02 = obterValorGrupo("02", mes);
valoresPorMes[mes] = valor01 + valor02;
});
break;
case "05": // Lucro Bruto = Grupo 03 + 04
mesesDisponiveis.forEach(mes => {
const valor03 = obterValorGrupo("03", mes);
const valor04 = obterValorGrupo("04", mes);
valoresPorMes[mes] = valor03 + valor04;
});
break;
case "07": // Margem Loja = Grupo 05 + 06
mesesDisponiveis.forEach(mes => {
const valor05 = obterValorGrupo("05", mes);
const valor06 = obterValorGrupo("06", mes);
valoresPorMes[mes] = valor05 + valor06;
});
break;
case "10": // Resultado Operacional = Grupo 07 + 08 + 09
mesesDisponiveis.forEach(mes => {
const valor07 = obterValorGrupo("07", mes);
const valor08 = obterValorGrupo("08", mes);
const valor09 = obterValorGrupo("09", mes);
valoresPorMes[mes] = valor07 + valor08 + valor09;
});
break;
case "13": // Resultado Financeiro = Grupo 11 + 12
mesesDisponiveis.forEach(mes => {
const valor11 = obterValorGrupo("11", mes);
const valor12 = obterValorGrupo("12", mes);
valoresPorMes[mes] = valor11 + valor12;
});
break;
case "18": // Outras Receitas/Despesas = Grupo 14 + 15 + 16 + 17
mesesDisponiveis.forEach(mes => {
const valor14 = obterValorGrupo("14", mes);
const valor15 = obterValorGrupo("15", mes);
const valor16 = obterValorGrupo("16", mes);
const valor17 = obterValorGrupo("17", mes);
valoresPorMes[mes] = valor14 + valor15 + valor16 + valor17;
});
break;
case "19": // LAIR = Grupo 10 + 13 + 18
mesesDisponiveis.forEach(mes => {
const valor10 = obterValorGrupo("10", mes);
const valor13 = obterValorGrupo("13", mes);
const valor18 = obterValorGrupo("18", mes);
valoresPorMes[mes] = valor10 + valor13 + valor18;
});
break;
case "20": // IR = Se LAIR > 0 calcular 20% e resultado negativo (*-1), se não 0
mesesDisponiveis.forEach(mes => {
const valor19 = obterValorGrupo("19", mes);
if (valor19 > 0) {
valoresPorMes[mes] = (valor19 * 0.20) * -1;
} else {
valoresPorMes[mes] = 0;
}
});
break;
case "21": // CSLL = Se LAIR > 0 calcular 9% e resultado negativo (*-1), se não 0
mesesDisponiveis.forEach(mes => {
const valor19 = obterValorGrupo("19", mes);
if (valor19 > 0) {
valoresPorMes[mes] = (valor19 * 0.09) * -1;
} else {
valoresPorMes[mes] = 0;
}
});
break;
case "22": // Lucro Líquido = Grupo 19 + 20 + 21
mesesDisponiveis.forEach(mes => {
const valor19 = obterValorGrupo("19", mes);
const valor20 = obterValorGrupo("20", mes);
const valor21 = obterValorGrupo("21", mes);
valoresPorMes[mes] = valor19 + valor20 + valor21;
});
break;
case "24": // EBITDA = Grupo 19 - (13 + 18 + 23)
mesesDisponiveis.forEach(mes => {
const valor19 = obterValorGrupo("19", mes);
const valor13 = obterValorGrupo("13", mes);
const valor18 = obterValorGrupo("18", mes);
const valor23 = obterValorGrupo("23", mes);
valoresPorMes[mes] = valor19 - (valor13 + valor18 + valor23);
});
break;
}
return valoresPorMes;
};
sortedGrupos.forEach(([grupo, items]) => {
const totalGrupo = items.reduce(
(sum, item) => sum + parseFloat(item.valor),
0
);
// Verificar se é um grupo calculado
const codigoGrupo = items[0]?.codgrupo || "";
const isCalculado = ["03", "05", "07", "10", "13", "18", "19", "20", "21", "22", "24"].includes(codigoGrupo);
let valoresGrupoPorMes;
if (isCalculado) {
// Usar cálculo específico para grupos calculados
valoresGrupoPorMes = calcularGrupoCalculadoCompleta(codigoGrupo, grupos);
} else {
// Usar cálculo normal para grupos não calculados
valoresGrupoPorMes = calcularValoresPorMes(items);
}
// Calcular total do grupo
const totalCalculado = Object.values(valoresGrupoPorMes).reduce((sum, valor) => sum + valor, 0);
// Linha do grupo (Level 0)
const valoresGrupoPorMes = calcularValoresPorMes(items);
rows.push({
type: "grupo",
level: 0,
grupo,
total: totalGrupo,
total: isCalculado ? totalCalculado : totalGrupo,
valoresPorMes: valoresGrupoPorMes,
percentuaisPorMes: calcularPercentuaisPorMes(valoresGrupoPorMes, grupo),
isCalculado: items[0]?.isCalculado || false,
isCalculado: isCalculado,
});
if (ordemHierarquiaContasPrimeiro) {
@ -1091,23 +1232,164 @@ export default function Teste() {
return grupoA.localeCompare(grupoB);
});
// Função para calcular valores de grupos calculados usando códigos dos grupos
const calcularGrupoCalculado = (codigoGrupo: string, gruposData: Record<string, DREItem[]>): Record<string, number> => {
const valoresPorMes: Record<string, number> = {};
// Inicializar valores para todos os meses disponíveis
mesesDisponiveis.forEach(mes => {
valoresPorMes[mes] = 0;
});
// Função auxiliar para obter valor de um grupo por código e mês
const obterValorGrupo = (codigoGrupo: string, mes: string): number => {
const grupoEncontrado = Object.values(gruposData).find(items =>
items.length > 0 && items[0].codgrupo === codigoGrupo
);
if (!grupoEncontrado) return 0;
const itemsMes = grupoEncontrado.filter(item => item.data_competencia === mes);
return itemsMes.reduce((sum, item) => sum + parseFloat(item.valor), 0);
};
switch (codigoGrupo) {
case "03": // Faturamento Líquido = Grupo 01 + 02
mesesDisponiveis.forEach(mes => {
const valor01 = obterValorGrupo("01", mes);
const valor02 = obterValorGrupo("02", mes);
valoresPorMes[mes] = valor01 + valor02;
});
break;
case "05": // Lucro Bruto = Grupo 03 + 04
mesesDisponiveis.forEach(mes => {
const valor03 = obterValorGrupo("03", mes);
const valor04 = obterValorGrupo("04", mes);
valoresPorMes[mes] = valor03 + valor04;
});
break;
case "07": // Margem Loja = Grupo 05 + 06
mesesDisponiveis.forEach(mes => {
const valor05 = obterValorGrupo("05", mes);
const valor06 = obterValorGrupo("06", mes);
valoresPorMes[mes] = valor05 + valor06;
});
break;
case "10": // Resultado Operacional = Grupo 07 + 08 + 09
mesesDisponiveis.forEach(mes => {
const valor07 = obterValorGrupo("07", mes);
const valor08 = obterValorGrupo("08", mes);
const valor09 = obterValorGrupo("09", mes);
valoresPorMes[mes] = valor07 + valor08 + valor09;
});
break;
case "13": // Resultado Financeiro = Grupo 11 + 12
mesesDisponiveis.forEach(mes => {
const valor11 = obterValorGrupo("11", mes);
const valor12 = obterValorGrupo("12", mes);
valoresPorMes[mes] = valor11 + valor12;
});
break;
case "18": // Outras Receitas/Despesas = Grupo 14 + 15 + 16 + 17
mesesDisponiveis.forEach(mes => {
const valor14 = obterValorGrupo("14", mes);
const valor15 = obterValorGrupo("15", mes);
const valor16 = obterValorGrupo("16", mes);
const valor17 = obterValorGrupo("17", mes);
valoresPorMes[mes] = valor14 + valor15 + valor16 + valor17;
});
break;
case "19": // LAIR = Grupo 10 + 13 + 18
mesesDisponiveis.forEach(mes => {
const valor10 = obterValorGrupo("10", mes);
const valor13 = obterValorGrupo("13", mes);
const valor18 = obterValorGrupo("18", mes);
valoresPorMes[mes] = valor10 + valor13 + valor18;
});
break;
case "20": // IR = Se LAIR > 0 calcular 20% e resultado negativo (*-1), se não 0
mesesDisponiveis.forEach(mes => {
const valor19 = obterValorGrupo("19", mes);
if (valor19 > 0) {
valoresPorMes[mes] = (valor19 * 0.20) * -1;
} else {
valoresPorMes[mes] = 0;
}
});
break;
case "21": // CSLL = Se LAIR > 0 calcular 9% e resultado negativo (*-1), se não 0
mesesDisponiveis.forEach(mes => {
const valor19 = obterValorGrupo("19", mes);
if (valor19 > 0) {
valoresPorMes[mes] = (valor19 * 0.09) * -1;
} else {
valoresPorMes[mes] = 0;
}
});
break;
case "22": // Lucro Líquido = Grupo 19 + 20 + 21
mesesDisponiveis.forEach(mes => {
const valor19 = obterValorGrupo("19", mes);
const valor20 = obterValorGrupo("20", mes);
const valor21 = obterValorGrupo("21", mes);
valoresPorMes[mes] = valor19 + valor20 + valor21;
});
break;
case "24": // EBITDA = Grupo 19 - (13 + 18 + 23)
mesesDisponiveis.forEach(mes => {
const valor19 = obterValorGrupo("19", mes);
const valor13 = obterValorGrupo("13", mes);
const valor18 = obterValorGrupo("18", mes);
const valor23 = obterValorGrupo("23", mes);
valoresPorMes[mes] = valor19 - (valor13 + valor18 + valor23);
});
break;
}
return valoresPorMes;
};
sortedGrupos.forEach(([grupo, items]) => {
const totalGrupo = items.reduce(
(sum, item) => sum + parseFloat(item.valor),
0
);
// Verificar se é um grupo calculado
const codigoGrupo = items[0]?.codgrupo || "";
const isCalculado = ["03", "05", "07", "10", "13", "18", "19", "20", "21", "22", "24"].includes(codigoGrupo);
let valoresPorMes;
if (isCalculado) {
// Usar cálculo específico para grupos calculados
valoresPorMes = calcularGrupoCalculado(codigoGrupo, grupos);
} else {
// Usar cálculo normal para grupos não calculados
valoresPorMes = calcularValoresPorMes(items);
}
// Calcular total do grupo
const totalCalculado = Object.values(valoresPorMes).reduce((sum, valor) => sum + valor, 0);
// Linha do grupo
const valoresPorMes = calcularValoresPorMes(items);
rows.push({
type: "grupo",
level: 0,
grupo,
total: totalGrupo,
total: isCalculado ? totalCalculado : totalGrupo,
isExpanded: expandedGroups.has(grupo),
valoresPorMes,
percentuaisPorMes: calcularPercentuaisPorMes(valoresPorMes, grupo),
isCalculado: items[0]?.isCalculado || false, // Usar a propriedade isCalculado do primeiro item
isCalculado: isCalculado,
});
if (expandedGroups.has(grupo)) {