diff --git a/src/app/DRE/teste.tsx b/src/app/DRE/teste.tsx index 21a9e0b..2846bd5 100644 --- a/src/app/DRE/teste.tsx +++ b/src/app/DRE/teste.tsx @@ -38,6 +38,7 @@ interface DREItem { valor: string; codgrupo?: string; isCalculado?: boolean; + entidades?: string; } interface HierarchicalRow { @@ -215,6 +216,7 @@ export default function Teste() { const [contasSelecionadas, setContasSelecionadas] = useState([]); // Estado para armazenar os códigos das contas const [codigosContas, setCodigosContas] = useState>({}); + const [entidadesSelecionadas, setEntidadesSelecionadas] = useState([]); const [isFilterOpen, setIsFilterOpen] = useState(false); const [dadosFiltrados, setDadosFiltrados] = useState([]); const [filtrosAplicados, setFiltrosAplicados] = useState(false); @@ -225,10 +227,12 @@ export default function Teste() { const [opcoesSubgrupos, setOpcoesSubgrupos] = useState([]); const [opcoesCentrosCusto, setOpcoesCentrosCusto] = useState([]); const [opcoesContas, setOpcoesContas] = useState([]); + const [opcoesEntidades, setOpcoesEntidades] = useState([]); // Estados para filtros de busca nos campos de seleção const [filtroCentroCusto, setFiltroCentroCusto] = useState(""); const [filtroConta, setFiltroConta] = useState(""); + const [filtroEntidade, setFiltroEntidade] = useState(""); // Estados para analítico const [analiticoFiltros, setAnaliticoFiltros] = useState({ @@ -340,6 +344,12 @@ export default function Teste() { }); setCodigosContas(codigosContasObj); + // Extrair entidades únicas + 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); + // Inicializar com todos os itens selecionados, exceto o centro de custo 002.003.017 e conta 100050 const centrosCustoIniciaisSelecionados = centrosCustoUnicos.filter(centro => { const item = dadosCompletos.find((d: DREItem) => d.centro_custo === centro); @@ -354,6 +364,9 @@ export default function Teste() { setCentrosCustoSelecionados(centrosCustoIniciaisSelecionados); setContasSelecionadas(contasIniciaisSelecionadas); + // Inicializar com todas as entidades selecionadas + setEntidadesSelecionadas(entidadesUnicas); + } catch (error) { console.error("Erro ao carregar períodos:", error); } @@ -657,6 +670,24 @@ export default function Teste() { setContasSelecionadas([]); }; + const toggleEntidade = (entidade: string) => { + setEntidadesSelecionadas(prev => { + if (prev.includes(entidade)) { + return prev.filter(e => e !== entidade); + } else { + return [...prev, entidade]; + } + }); + }; + + const selecionarTodasEntidades = () => { + setEntidadesSelecionadas(opcoesEntidades); + }; + + const limparEntidades = () => { + setEntidadesSelecionadas([]); + }; + // Função auxiliar para obter o código do centro de custo const obterCodigoCentroCusto = React.useCallback((nomeCentro: string): string => { if (!data || data.length === 0) { @@ -1431,10 +1462,12 @@ export default function Teste() { // Limpar multi-seleções setCentrosCustoSelecionados([]); setContasSelecionadas([]); + setEntidadesSelecionadas([]); // Limpar filtros de busca setFiltroCentroCusto(""); setFiltroConta(""); + setFiltroEntidade(""); // Limpar dados da tabela setData([]); @@ -1579,6 +1612,26 @@ 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 + }); + } + // Remover grupos calculados antigos (que foram calculados com todos os dados) // Eles serão recalculados com base apenas nos dados filtrados dadosFiltrados = dadosFiltrados.filter((item: DREItem) => @@ -2562,6 +2615,68 @@ export default function Teste() { /> */} + {/* Entidades */} +
+
+ +
+ + +
+
+ {/* Input de filtro para Entidades */} + setFiltroEntidade(e.target.value)} + className="h-8 text-sm" + /> +
+ {opcoesEntidades + .filter(entidade => { + if (!filtroEntidade) return true; + const termo = filtroEntidade.toLowerCase(); + return entidade.toLowerCase().includes(termo); + }) + .map(entidade => ( +
+ toggleEntidade(entidade)} + /> + +
+ ))} +
+ {entidadesSelecionadas.length > 0 && ( +
+ {entidadesSelecionadas.length} entidade(s) selecionada(s) +
+ )} +
+ {/* Ordem da Hierarquia */}
diff --git a/src/app/api/dre-oracle/route.ts b/src/app/api/dre-oracle/route.ts index 4469378..857e344 100644 --- a/src/app/api/dre-oracle/route.ts +++ b/src/app/api/dre-oracle/route.ts @@ -12,6 +12,12 @@ export async function GET(request: NextRequest) { console.log('✅ Query executada com sucesso:', data.length, 'registros encontrados'); + // Debug: Verificar se a coluna ENTIDADES existe no primeiro registro + if (data.length > 0) { + console.log('🔍 Primeiro registro do Oracle:', Object.keys(data[0])); + console.log('🔍 Valores de ENTIDADES encontrados:', [...new Set(data.map((item: any) => item.ENTIDADES || item.ENTIDADE).filter(Boolean))]); + } + // Transformar os dados do Oracle para o formato esperado pelo componente const transformedData = data.map((item: any) => { const codgrupo = item.CODGRUPO || ""; @@ -29,6 +35,7 @@ export async function GET(request: NextRequest) { conta: item.CONTA || "", // Usar CONTA do Oracle valor: item.VALOR?.toString() || "0", // Converter VALOR para string codgrupo: codgrupo, // Adicionar código do grupo para cálculos + entidades: item.ENTIDADES || item.ENTIDADE || "", // Mapear coluna ENTIDADES (tentar variações do nome) }; });