diff --git a/src/app/dre-entidade/teste.tsx b/src/app/dre-entidade/teste.tsx index 0c02732..53ce958 100644 --- a/src/app/dre-entidade/teste.tsx +++ b/src/app/dre-entidade/teste.tsx @@ -292,7 +292,13 @@ export default function Teste() { // Extrair centros de custo únicos com nome e código const centrosCustoUnicos = [...new Set(dadosCompletos.map((item: DREItem) => item.centro_custo))].sort() as string[]; - setOpcoesCentrosCusto(centrosCustoUnicos); + // Filtrar centro de custo 999.998 da lista de opções (mas sempre manter selecionado) + const centrosCustoParaExibir = centrosCustoUnicos.filter(centro => { + const item = dadosCompletos.find((d: DREItem) => d.centro_custo === centro); + return item?.codigo_centro_custo !== "999.998"; + }); + + setOpcoesCentrosCusto(centrosCustoParaExibir); // Criar objeto de códigos dos centros de custo // Usar um Map para garantir que pegamos o código correto mesmo com duplicatas @@ -333,7 +339,14 @@ export default function Teste() { // Extrair contas únicas const contasUnicas = [...new Set(dadosCompletos.map((item: DREItem) => item.conta))].sort() as string[]; - setOpcoesContas(contasUnicas); + + // Filtrar conta 199 da lista de opções (mas sempre manter selecionada) + const contasParaExibir = contasUnicas.filter(conta => { + const item = dadosCompletos.find((d: DREItem) => d.conta === conta); + return item?.codigo_conta?.toString() !== "199"; + }); + + setOpcoesContas(contasParaExibir); // Criar objeto de códigos das contas const codigosContasObj: Record = {}; @@ -348,23 +361,43 @@ export default function Teste() { const entidadesUnicas = [...new Set(dadosCompletos.map((item: DREItem) => item.entidades).filter(Boolean))].sort() as string[]; console.log('🏢 Entidades únicas encontradas:', entidadesUnicas); console.log('📊 Total de entidades:', entidadesUnicas.length); - setOpcoesEntidades(entidadesUnicas); + + // Filtrar "Faturamento líquido" da lista de opções (mas sempre manter selecionado) + const entidadeFaturamentoLiquido = entidadesUnicas.find(ent => + ent.toLowerCase().includes('faturamento') && ent.toLowerCase().includes('líquido') + ) || entidadesUnicas.find(ent => + ent.toLowerCase().includes('faturamento liquido') + ); + + const entidadesParaExibir = entidadesUnicas.filter(ent => ent !== entidadeFaturamentoLiquido); + setOpcoesEntidades(entidadesParaExibir); // Inicializar com todos os itens selecionados, exceto o centro de custo 002.003.017 e conta 100050 + // Mas sempre incluir centro de custo 999.998 e conta 199 const centrosCustoIniciaisSelecionados = centrosCustoUnicos.filter(centro => { const item = dadosCompletos.find((d: DREItem) => d.centro_custo === centro); + // Sempre incluir centro de custo com código 999.998 + if (item?.codigo_centro_custo === "999.998") { + return true; + } + // Excluir centro de custo 002.003.017 return item?.codigo_centro_custo !== "002.003.017"; }); const contasIniciaisSelecionadas = contasUnicas.filter(conta => { const item = dadosCompletos.find((d: DREItem) => d.conta === conta); + // Sempre incluir conta com código 199 + if (item?.codigo_conta?.toString() === "199") { + return true; + } + // Excluir conta 100050 return item?.codigo_conta?.toString() !== "100050"; }); setCentrosCustoSelecionados(centrosCustoIniciaisSelecionados); setContasSelecionadas(contasIniciaisSelecionadas); - // Inicializar com todas as entidades selecionadas + // Inicializar com todas as entidades selecionadas (incluindo Faturamento líquido) setEntidadesSelecionadas(entidadesUnicas); } catch (error) { @@ -603,6 +636,13 @@ export default function Teste() { // Funções para multi-seleção const toggleCentroCusto = (centro: string) => { + // Verificar se é centro de custo 999.998 (não pode ser desmarcado) + const item = data.find((d: DREItem) => d.centro_custo === centro); + if (item?.codigo_centro_custo === "999.998") { + // Não permitir desmarcar centro de custo 999.998 + return; + } + setCentrosCustoSelecionados(prev => { if (prev.includes(centro)) { return prev.filter(c => c !== centro); @@ -613,6 +653,13 @@ export default function Teste() { }; const toggleConta = (conta: string) => { + // Verificar se é conta 199 (não pode ser desmarcada) + const item = data.find((d: DREItem) => d.conta === conta); + if (item?.codigo_conta?.toString() === "199") { + // Não permitir desmarcar conta 199 + return; + } + setContasSelecionadas(prev => { if (prev.includes(conta)) { return prev.filter(c => c !== conta); @@ -623,7 +670,13 @@ export default function Teste() { }; const selecionarTodosCentros = () => { - setCentrosCustoSelecionados(opcoesCentrosCusto); + // Sempre incluir centro de custo 999.998 mesmo que não esteja nas opções + const centroCusto999998 = data.find((d: DREItem) => d.codigo_centro_custo === "999.998")?.centro_custo; + const todosCentros = centroCusto999998 && !opcoesCentrosCusto.includes(centroCusto999998) + ? [...opcoesCentrosCusto, centroCusto999998] + : opcoesCentrosCusto; + + setCentrosCustoSelecionados(todosCentros); }; const limparCentros = () => { @@ -631,7 +684,13 @@ export default function Teste() { }; const selecionarTodasContas = () => { - setContasSelecionadas(opcoesContas); + // Sempre incluir conta 199 mesmo que não esteja nas opções + const conta199 = data.find((d: DREItem) => d.codigo_conta?.toString() === "199")?.conta; + const todasContas = conta199 && !opcoesContas.includes(conta199) + ? [...opcoesContas, conta199] + : opcoesContas; + + setContasSelecionadas(todasContas); }; const limparContas = () => { @@ -639,6 +698,15 @@ export default function Teste() { }; const toggleEntidadeFiltro = (entidade: string) => { + // Verificar se é "Faturamento líquido" (não pode ser desmarcado) + const isFaturamentoLiquido = entidade.toLowerCase().includes('faturamento') && + (entidade.toLowerCase().includes('líquido') || entidade.toLowerCase().includes('liquido')); + + if (isFaturamentoLiquido) { + // Não permitir desmarcar Faturamento líquido + return; + } + setEntidadesSelecionadas(prev => { if (prev.includes(entidade)) { return prev.filter(e => e !== entidade); @@ -649,7 +717,19 @@ export default function Teste() { }; const selecionarTodasEntidades = () => { - setEntidadesSelecionadas(opcoesEntidades); + // Sempre incluir "Faturamento líquido" mesmo que não esteja nas opções + const entidadeFaturamentoLiquido = data.find((d: DREItem) => + d.entidades && ( + d.entidades.toLowerCase().includes('faturamento') && + (d.entidades.toLowerCase().includes('líquido') || d.entidades.toLowerCase().includes('liquido')) + ) + )?.entidades; + + const todasEntidades = entidadeFaturamentoLiquido && !opcoesEntidades.includes(entidadeFaturamentoLiquido) + ? [...opcoesEntidades, entidadeFaturamentoLiquido] + : opcoesEntidades; + + setEntidadesSelecionadas(todasEntidades); }; const limparEntidades = () => { @@ -1361,25 +1441,34 @@ export default function Teste() { ); } - // Filtro por centro de custo (multi-seleção) - USAR APENAS CÓDIGO - // IMPORTANTE: Preservar grupos calculados (isCalculado ou centro_custo === "CALCULADO") - if (centrosCustoSelecionados.length > 0) { - // Criar conjunto de códigos esperados dos centros selecionados - APENAS CÓDIGOS - const codigosEsperados = new Set(); - - centrosCustoSelecionados.forEach(centro => { - // Buscar o código no mapeamento primeiro - const codigoCentro = codigosCentrosCusto[centro]; - if (codigoCentro) { - codigosEsperados.add(codigoCentro); - } else { - // Se não encontrar no mapeamento, tentar buscar nos dados carregados - const item = dadosCompletos.find((d: DREItem) => d.centro_custo === centro); - if (item?.codigo_centro_custo) { - codigosEsperados.add(item.codigo_centro_custo); - } - } - }); + // Filtro por centro de custo (multi-seleção) - USAR APENAS CÓDIGO + // IMPORTANTE: Preservar grupos calculados (isCalculado ou centro_custo === "CALCULADO") + // Sempre incluir centro de custo 999.998 mesmo que não esteja na lista de selecionados + const centroCusto999998 = dadosCompletos.find((d: DREItem) => d.codigo_centro_custo === "999.998")?.centro_custo; + const centrosCustoParaFiltrar = centroCusto999998 && !centrosCustoSelecionados.includes(centroCusto999998) + ? [...centrosCustoSelecionados, centroCusto999998] + : centrosCustoSelecionados; + + if (centrosCustoParaFiltrar.length > 0) { + // Criar conjunto de códigos esperados dos centros selecionados - APENAS CÓDIGOS + const codigosEsperados = new Set(); + + // Sempre incluir código 999.998 + codigosEsperados.add("999.998"); + + centrosCustoParaFiltrar.forEach(centro => { + // Buscar o código no mapeamento primeiro + const codigoCentro = codigosCentrosCusto[centro]; + if (codigoCentro) { + codigosEsperados.add(codigoCentro); + } else { + // Se não encontrar no mapeamento, tentar buscar nos dados carregados + const item = dadosCompletos.find((d: DREItem) => d.centro_custo === centro); + if (item?.codigo_centro_custo) { + codigosEsperados.add(item.codigo_centro_custo); + } + } + }); // Filtrar APENAS pelo código do centro de custo, ignorando o nome // MAS preservar grupos calculados @@ -1406,18 +1495,24 @@ export default function Teste() { }); } - // Filtro por conta (multi-seleção) - // IMPORTANTE: Preservar grupos calculados (isCalculado ou centro_custo === "CALCULADO") - if (contasSelecionadas.length > 0) { - dadosFiltrados = dadosFiltrados.filter((item: DREItem) => { - // Preservar grupos calculados - if (item.centro_custo === "CALCULADO" || item.isCalculado === true) { - return true; - } - // Para outros itens, verificar se a conta está selecionada - return contasSelecionadas.includes(item.conta); - }); - } + // Filtro por conta (multi-seleção) + // IMPORTANTE: Preservar grupos calculados (isCalculado ou centro_custo === "CALCULADO") + // Sempre incluir conta 199 mesmo que não esteja na lista de selecionadas + const conta199 = dadosCompletos.find((d: DREItem) => d.codigo_conta?.toString() === "199")?.conta; + const contasParaFiltrar = conta199 && !contasSelecionadas.includes(conta199) + ? [...contasSelecionadas, conta199] + : contasSelecionadas; + + if (contasParaFiltrar.length > 0) { + dadosFiltrados = dadosFiltrados.filter((item: DREItem) => { + // Preservar grupos calculados + if (item.centro_custo === "CALCULADO" || item.isCalculado === true) { + return true; + } + // Para outros itens, verificar se a conta está selecionada (incluindo conta 199) + return contasParaFiltrar.includes(item.conta); + }); + } // Filtro por valor mínimo if (filtros.valorMin) { @@ -1446,25 +1541,38 @@ export default function Teste() { ); } - // Filtro por entidades (multi-seleção) - // IMPORTANTE: Preservar grupos calculados (isCalculado ou centro_custo === "CALCULADO") - if (entidadesSelecionadas.length > 0) { - dadosFiltrados = dadosFiltrados.filter((item: DREItem) => { - // Preservar grupos calculados - if (item.centro_custo === "CALCULADO" || item.isCalculado === true) { - return true; - } - // Para outros itens, verificar se a entidade está selecionada - return item.entidades && entidadesSelecionadas.includes(item.entidades); - }); - - console.log('🏢 Filtro de entidades aplicado:', { - selecionadas: entidadesSelecionadas, - totalFiltrado: dadosFiltrados.length, - entidadesEncontradas: [...new Set(dadosFiltrados.map((d: DREItem) => d.entidades).filter(Boolean))], - gruposCalculados: dadosFiltrados.filter((d: DREItem) => d.centro_custo === "CALCULADO" || d.isCalculado === true).length - }); - } + // Filtro por entidades (multi-seleção) + // IMPORTANTE: Preservar grupos calculados (isCalculado ou centro_custo === "CALCULADO") + // Sempre incluir "Faturamento líquido" mesmo que não esteja na lista de selecionadas + const entidadeFaturamentoLiquido = dadosCompletos.find((d: DREItem) => + d.entidades && ( + d.entidades.toLowerCase().includes('faturamento') && + (d.entidades.toLowerCase().includes('líquido') || d.entidades.toLowerCase().includes('liquido')) + ) + )?.entidades; + + const entidadesParaFiltrar = entidadeFaturamentoLiquido + ? [...entidadesSelecionadas, entidadeFaturamentoLiquido] + : entidadesSelecionadas; + + if (entidadesParaFiltrar.length > 0) { + dadosFiltrados = dadosFiltrados.filter((item: DREItem) => { + // Preservar grupos calculados + if (item.centro_custo === "CALCULADO" || item.isCalculado === true) { + return true; + } + // Para outros itens, verificar se a entidade está selecionada (incluindo Faturamento líquido) + return item.entidades && entidadesParaFiltrar.includes(item.entidades); + }); + + console.log('🏢 Filtro de entidades aplicado:', { + selecionadas: entidadesSelecionadas, + incluindoFaturamentoLiquido: entidadeFaturamentoLiquido, + totalFiltrado: dadosFiltrados.length, + entidadesEncontradas: [...new Set(dadosFiltrados.map((d: DREItem) => d.entidades).filter(Boolean))], + gruposCalculados: dadosFiltrados.filter((d: DREItem) => d.centro_custo === "CALCULADO" || d.isCalculado === true).length + }); + } // Remover grupos calculados antigos (que foram calculados com todos os dados) // Eles serão recalculados com base apenas nos dados filtrados