feat: inclusão do filtro por entidades

This commit is contained in:
Alessandro Gonçaalves 2025-11-07 09:17:46 -03:00
parent 6e201cfbaa
commit c631eedcf3
2 changed files with 122 additions and 0 deletions

View File

@ -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<string[]>([]);
// Estado para armazenar os códigos das contas
const [codigosContas, setCodigosContas] = useState<Record<string, string>>({});
const [entidadesSelecionadas, setEntidadesSelecionadas] = useState<string[]>([]);
const [isFilterOpen, setIsFilterOpen] = useState(false);
const [dadosFiltrados, setDadosFiltrados] = useState<DREItem[]>([]);
const [filtrosAplicados, setFiltrosAplicados] = useState(false);
@ -225,10 +227,12 @@ export default function Teste() {
const [opcoesSubgrupos, setOpcoesSubgrupos] = useState<string[]>([]);
const [opcoesCentrosCusto, setOpcoesCentrosCusto] = useState<string[]>([]);
const [opcoesContas, setOpcoesContas] = useState<string[]>([]);
const [opcoesEntidades, setOpcoesEntidades] = useState<string[]>([]);
// Estados para filtros de busca nos campos de seleção
const [filtroCentroCusto, setFiltroCentroCusto] = useState<string>("");
const [filtroConta, setFiltroConta] = useState<string>("");
const [filtroEntidade, setFiltroEntidade] = useState<string>("");
// 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() {
/>
</div>*/}
{/* Entidades */}
<div className="grid gap-2">
<div className="flex items-center justify-between">
<Label htmlFor="entidades">ENTIDADES</Label>
<div className="flex gap-1">
<Button
type="button"
variant="outline"
size="sm"
onClick={selecionarTodasEntidades}
className="text-xs h-5 px-2"
>
Todas
</Button>
<Button
type="button"
variant="outline"
size="sm"
onClick={limparEntidades}
className="text-xs h-5 px-2"
>
Limpar
</Button>
</div>
</div>
{/* Input de filtro para Entidades */}
<Input
placeholder="Filtrar entidades..."
value={filtroEntidade}
onChange={(e) => setFiltroEntidade(e.target.value)}
className="h-8 text-sm"
/>
<div className="max-h-32 overflow-y-auto border rounded-md p-1 space-y-1">
{opcoesEntidades
.filter(entidade => {
if (!filtroEntidade) return true;
const termo = filtroEntidade.toLowerCase();
return entidade.toLowerCase().includes(termo);
})
.map(entidade => (
<div key={entidade} className="flex items-center space-x-1">
<Checkbox
id={`entidade-${entidade}`}
checked={entidadesSelecionadas.includes(entidade)}
onCheckedChange={() => toggleEntidade(entidade)}
/>
<Label
htmlFor={`entidade-${entidade}`}
className="text-sm font-normal cursor-pointer flex-1"
>
{entidade}
</Label>
</div>
))}
</div>
{entidadesSelecionadas.length > 0 && (
<div className="text-xs text-gray-500">
{entidadesSelecionadas.length} entidade(s) selecionada(s)
</div>
)}
</div>
{/* Ordem da Hierarquia */}
<div className="grid gap-2">
<Label>Ordem da Hierarquia</Label>

View File

@ -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)
};
});