diff --git a/src/app/DRE/teste.tsx b/src/app/DRE/teste.tsx index b941d30..018bcbf 100644 --- a/src/app/DRE/teste.tsx +++ b/src/app/DRE/teste.tsx @@ -29,6 +29,7 @@ interface HierarchicalRow { total?: number; isExpanded?: boolean; valoresPorMes?: Record; + percentuaisPorMes?: Record; } type SortField = 'descricao' | 'valor'; @@ -243,15 +244,77 @@ export default function Teste() { return valoresPorMes; }; + // Função para calcular percentuais baseado no grupo 03 como referência + const calcularPercentuaisPorMes = ( + valoresPorMes: Record, + grupo: string + ): Record => { + const percentuais: Record = {}; + + // Se for o grupo 03, retorna 100% para todos os meses + if (grupo.includes('03')) { + Object.keys(valoresPorMes).forEach((mes) => { + percentuais[mes] = 100; + }); + return percentuais; + } + + // Para outros grupos, calcular percentual baseado no grupo 03 + Object.keys(valoresPorMes).forEach((mes) => { + const valorAtual = valoresPorMes[mes]; + + // Encontrar o valor do grupo 03 para o mesmo mês + const grupo03Items = data.filter((item) => { + const dataCompetencia = new Date(item.data_competencia); + const anoMes = `${dataCompetencia.getFullYear()}-${String( + dataCompetencia.getMonth() + 1 + ).padStart(2, '0')}`; + return anoMes === mes && item.grupo.includes('03'); + }); + + const valorGrupo03 = grupo03Items.reduce( + (sum, item) => sum + parseFloat(item.valor), + 0 + ); + + if (valorGrupo03 !== 0) { + percentuais[mes] = (valorAtual / valorGrupo03) * 100; + } else { + percentuais[mes] = 0; + } + }); + + return percentuais; + }; + const buildHierarchicalData = (): HierarchicalRow[] => { const rows: HierarchicalRow[] = []; - // Agrupar por grupo + // Agrupar por grupo, mas tratar grupo 05 como subgrupo do grupo 04 const grupos = data.reduce((acc, item) => { - if (!acc[item.grupo]) { - acc[item.grupo] = []; + // Se for grupo 05, adicionar ao grupo 04 como subgrupo + if (item.grupo.includes('05')) { + // Encontrar grupo 04 existente ou criar um + const grupo04Key = Object.keys(acc).find((key) => key.includes('04')); + if (grupo04Key) { + acc[grupo04Key].push(item); + } else { + // Se não existe grupo 04, criar um grupo especial + const grupo04Nome = + Object.keys(acc).find((key) => key.includes('04')) || + '04 - GRUPO 04'; + if (!acc[grupo04Nome]) { + acc[grupo04Nome] = []; + } + acc[grupo04Nome].push(item); + } + } else { + // Para outros grupos, agrupar normalmente + if (!acc[item.grupo]) { + acc[item.grupo] = []; + } + acc[item.grupo].push(item); } - acc[item.grupo].push(item); return acc; }, {} as Record); @@ -283,22 +346,34 @@ export default function Teste() { ); // Linha do grupo + const valoresPorMes = calcularValoresPorMes(items); rows.push({ type: 'grupo', level: 0, grupo, total: totalGrupo, isExpanded: expandedGroups.has(grupo), - valoresPorMes: calcularValoresPorMes(items), + valoresPorMes, + percentuaisPorMes: calcularPercentuaisPorMes(valoresPorMes, grupo), }); if (expandedGroups.has(grupo)) { // Agrupar por subgrupo dentro do grupo const subgrupos = items.reduce((acc, item) => { - if (!acc[item.subgrupo]) { - acc[item.subgrupo] = []; + // Se o item originalmente era do grupo 05, agrupar tudo sob o nome do grupo 05 + if (item.grupo.includes('05')) { + const subgrupoKey = item.grupo; // Usar o nome completo do grupo 05 + if (!acc[subgrupoKey]) { + acc[subgrupoKey] = []; + } + acc[subgrupoKey].push(item); + } else { + // Para outros itens, agrupar normalmente por subgrupo + if (!acc[item.subgrupo]) { + acc[item.subgrupo] = []; + } + acc[item.subgrupo].push(item); } - acc[item.subgrupo].push(item); return acc; }, {} as Record); @@ -330,6 +405,7 @@ export default function Teste() { ); // Linha do subgrupo + const valoresSubgrupoPorMes = calcularValoresPorMes(subgrupoItems); rows.push({ type: 'subgrupo', level: 1, @@ -337,7 +413,11 @@ export default function Teste() { subgrupo, total: totalSubgrupo, isExpanded: expandedSubgrupos.has(`${grupo}-${subgrupo}`), - valoresPorMes: calcularValoresPorMes(subgrupoItems), + valoresPorMes: valoresSubgrupoPorMes, + percentuaisPorMes: calcularPercentuaisPorMes( + valoresSubgrupoPorMes, + grupo + ), }); if (expandedSubgrupos.has(`${grupo}-${subgrupo}`)) { @@ -378,6 +458,7 @@ export default function Teste() { ); // Linha do centro de custo + const valoresCentroPorMes = calcularValoresPorMes(centroItems); rows.push({ type: 'centro_custo', level: 2, @@ -388,7 +469,11 @@ export default function Teste() { isExpanded: expandedCentros.has( `${grupo}-${subgrupo}-${centro}` ), - valoresPorMes: calcularValoresPorMes(centroItems), + valoresPorMes: valoresCentroPorMes, + percentuaisPorMes: calcularPercentuaisPorMes( + valoresCentroPorMes, + grupo + ), }); if (expandedCentros.has(`${grupo}-${subgrupo}-${centro}`)) { @@ -429,6 +514,7 @@ export default function Teste() { ); // Linha da conta (sem ano/mês no nome) + const valoresContaPorMes = calcularValoresPorMes(contaItems); rows.push({ type: 'conta', level: 3, @@ -438,7 +524,11 @@ export default function Teste() { conta, codigo_conta: contaItems[0].codigo_conta, total: totalConta, - valoresPorMes: calcularValoresPorMes(contaItems), + valoresPorMes: valoresContaPorMes, + percentuaisPorMes: calcularPercentuaisPorMes( + valoresContaPorMes, + grupo + ), }); }); } @@ -611,11 +701,13 @@ export default function Teste() { {mesesDisponiveis.map((mes) => ( -
- {mes} +
+
+ {mes} +
+
+ % +
))}
@@ -641,26 +733,36 @@ export default function Teste() { {renderCellContent(row)}
{mesesDisponiveis.map((mes) => ( -
handleRowClick(row, mes)} - > - {row.valoresPorMes && row.valoresPorMes[mes] - ? (() => { - const { formatted, isNegative } = - formatCurrencyWithColor(row.valoresPorMes[mes]); - return ( - - {formatted} - - ); - })() - : '-'} +
+
handleRowClick(row, mes)} + > + {row.valoresPorMes && row.valoresPorMes[mes] + ? (() => { + const { formatted, isNegative } = + formatCurrencyWithColor(row.valoresPorMes[mes]); + return ( + + {formatted} + + ); + })() + : '-'} +
+
handleRowClick(row, mes)} + > + {row.percentuaisPorMes && + row.percentuaisPorMes[mes] !== undefined + ? `${row.percentuaisPorMes[mes].toFixed(1)}%` + : '-'} +
))}