From acb094271bb867773c551b81388bb6c98cff93f9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alessandro=20Gon=C3=A7aalves?= Date: Wed, 22 Oct 2025 10:51:41 -0300 Subject: [PATCH] =?UTF-8?q?feta:=20inclus=C3=A3o=20da=20funcionalidade=20d?= =?UTF-8?q?e=20expandir=20e=20recolher=20os=20dados=20sint=C3=A9ticos?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/app/DRE/teste.tsx | 179 ++++++++++++++++++++++++++++++++++++------ 1 file changed, 157 insertions(+), 22 deletions(-) diff --git a/src/app/DRE/teste.tsx b/src/app/DRE/teste.tsx index 51a44ea..7f05b55 100644 --- a/src/app/DRE/teste.tsx +++ b/src/app/DRE/teste.tsx @@ -202,6 +202,7 @@ export default function Teste() { const [isFilterOpen, setIsFilterOpen] = useState(false); const [dadosFiltrados, setDadosFiltrados] = useState([]); const [filtrosAplicados, setFiltrosAplicados] = useState(false); + const [ordemHierarquiaContasPrimeiro, setOrdemHierarquiaContasPrimeiro] = useState(false); // Estados para opções dos filtros const [opcoesGrupos, setOpcoesGrupos] = useState([]); @@ -526,6 +527,7 @@ export default function Teste() { setFiltrosAplicados(false); setMesesDisponiveis([]); setIsAllExpanded(false); + setOrdemHierarquiaContasPrimeiro(false); // Recarregar opções e selecionar todos novamente carregarPeriodosDisponiveis(); @@ -786,8 +788,52 @@ export default function Teste() { }); if (expandedSubgrupos.has(`${grupo}-${subgrupo}`)) { - // Agrupar por centro de custo dentro do subgrupo - const centros = subgrupoItems.reduce((acc, item) => { + if (ordemHierarquiaContasPrimeiro) { + // NOVA ORDEM: Contas primeiro, depois Centros de Custo + + // Agrupar por conta dentro do subgrupo + const contas = subgrupoItems.reduce((acc, item) => { + if (!acc[item.conta]) { + acc[item.conta] = []; + } + acc[item.conta].push(item); + return acc; + }, {} as Record); + + // Ordenar contas + const sortedContas = Object.entries(contas).sort(([a], [b]) => + a.localeCompare(b) + ); + + sortedContas.forEach(([conta, contaItems]) => { + const totalConta = contaItems.reduce( + (sum, item) => sum + parseFloat(item.valor), + 0 + ); + + // Linha da conta (Level 2 - antes era Level 3) + const valoresContaPorMes = calcularValoresPorMes(contaItems); + rows.push({ + type: "conta", + level: 2, + grupo, + subgrupo, + conta, + codigo_conta: contaItems[0].codigo_conta, + total: totalConta, + isExpanded: expandedCentros.has( + `${grupo}-${subgrupo}-${conta}` + ), + valoresPorMes: valoresContaPorMes, + percentuaisPorMes: calcularPercentuaisPorMes( + valoresContaPorMes, + grupo + ), + }); + + if (expandedCentros.has(`${grupo}-${subgrupo}-${conta}`)) { + // Agrupar por centro de custo dentro da conta + const centros = contaItems.reduce((acc, item) => { if (!acc[item.centro_custo]) { acc[item.centro_custo] = []; } @@ -796,9 +842,51 @@ export default function Teste() { }, {} as Record); // Ordenar centros de custo - const sortedCentros = Object.entries(centros).sort(([a], [b]) => - a.localeCompare(b) - ); + const sortedCentros = Object.entries(centros).sort(([a], [b]) => + a.localeCompare(b) + ); + + sortedCentros.forEach(([centro, centroItems]) => { + const totalCentro = centroItems.reduce( + (sum, item) => sum + parseFloat(item.valor), + 0 + ); + + // Linha do centro de custo (Level 3 - antes era Level 2) + const valoresCentroPorMes = calcularValoresPorMes(centroItems); + rows.push({ + type: "centro_custo", + level: 3, + grupo, + subgrupo, + centro_custo: centro, + conta, + total: totalCentro, + valoresPorMes: valoresCentroPorMes, + percentuaisPorMes: calcularPercentuaisPorMes( + valoresCentroPorMes, + grupo + ), + }); + }); + } + }); + } else { + // ORDEM ORIGINAL: Centros de Custo primeiro, depois Contas + + // Agrupar por centro de custo dentro do subgrupo + const centros = subgrupoItems.reduce((acc, item) => { + if (!acc[item.centro_custo]) { + acc[item.centro_custo] = []; + } + acc[item.centro_custo].push(item); + return acc; + }, {} as Record); + + // Ordenar centros de custo + const sortedCentros = Object.entries(centros).sort(([a], [b]) => + a.localeCompare(b) + ); sortedCentros.forEach(([centro, centroItems]) => { const totalCentro = centroItems.reduce( @@ -809,7 +897,7 @@ export default function Teste() { // Linha do centro de custo const valoresCentroPorMes = calcularValoresPorMes(centroItems); rows.push({ - type: "centro_custo", + type: "centro_custo", level: 2, grupo, subgrupo, @@ -836,9 +924,9 @@ export default function Teste() { }, {} as Record); // Ordenar contas - const sortedContas = Object.entries(contas).sort(([a], [b]) => - a.localeCompare(b) - ); + const sortedContas = Object.entries(contas).sort(([a], [b]) => + a.localeCompare(b) + ); sortedContas.forEach(([conta, contaItems]) => { const totalConta = contaItems.reduce( @@ -846,10 +934,10 @@ export default function Teste() { 0 ); - // Linha da conta (sem ano/mês no nome) + // Linha da conta const valoresContaPorMes = calcularValoresPorMes(contaItems); rows.push({ - type: "conta", + type: "conta", level: 3, grupo, subgrupo, @@ -866,6 +954,7 @@ export default function Teste() { }); } }); + } } }); } @@ -976,18 +1065,26 @@ export default function Teste() { case "centro_custo": return (
+ {ordemHierarquiaContasPrimeiro ? ( + // Nova ordem: Centro de custo é level 3 (sem botão de toggle) +
+ +
+ ) : ( + // Ordem original: Centro de custo é level 2 (com botão de toggle) + )} + ) : ( + // Ordem original: Conta é level 3 (sem botão de toggle) +
+ +
+ )} -
+
{opcoesContas.map(conta => ( @@ -1283,6 +1397,27 @@ export default function Teste() { placeholder="Pesquise por grupo, subgrupo, centro ou conta" />
*/} + + {/* Ordem da Hierarquia */} +
+ +
+ setOrdemHierarquiaContasPrimeiro(checked)} + /> + +
+
+ {ordemHierarquiaContasPrimeiro + ? "📄 Contas → 🏢 Centros de Custo" + : "🏢 Centros de Custo → 📄 Contas" + } +
+