feat: inclusão do filtro por entidades
This commit is contained in:
parent
6e201cfbaa
commit
c631eedcf3
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
};
|
||||
});
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue