diff --git a/src/app/DRE/teste.tsx b/src/app/DRE/teste.tsx index 3e014e5..ddfdf5a 100644 --- a/src/app/DRE/teste.tsx +++ b/src/app/DRE/teste.tsx @@ -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): Record => { + const valoresPorMes: Record = {}; + + // 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): Record => { + const valoresPorMes: Record = {}; + + // 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)) {