commit
a115e96c81
|
|
@ -38,6 +38,7 @@ interface DREItem {
|
||||||
valor: string;
|
valor: string;
|
||||||
codgrupo?: string;
|
codgrupo?: string;
|
||||||
isCalculado?: boolean;
|
isCalculado?: boolean;
|
||||||
|
entidades?: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
interface HierarchicalRow {
|
interface HierarchicalRow {
|
||||||
|
|
@ -215,6 +216,7 @@ export default function Teste() {
|
||||||
const [contasSelecionadas, setContasSelecionadas] = useState<string[]>([]);
|
const [contasSelecionadas, setContasSelecionadas] = useState<string[]>([]);
|
||||||
// Estado para armazenar os códigos das contas
|
// Estado para armazenar os códigos das contas
|
||||||
const [codigosContas, setCodigosContas] = useState<Record<string, string>>({});
|
const [codigosContas, setCodigosContas] = useState<Record<string, string>>({});
|
||||||
|
const [entidadesSelecionadas, setEntidadesSelecionadas] = useState<string[]>([]);
|
||||||
const [isFilterOpen, setIsFilterOpen] = useState(false);
|
const [isFilterOpen, setIsFilterOpen] = useState(false);
|
||||||
const [dadosFiltrados, setDadosFiltrados] = useState<DREItem[]>([]);
|
const [dadosFiltrados, setDadosFiltrados] = useState<DREItem[]>([]);
|
||||||
const [filtrosAplicados, setFiltrosAplicados] = useState(false);
|
const [filtrosAplicados, setFiltrosAplicados] = useState(false);
|
||||||
|
|
@ -225,10 +227,12 @@ export default function Teste() {
|
||||||
const [opcoesSubgrupos, setOpcoesSubgrupos] = useState<string[]>([]);
|
const [opcoesSubgrupos, setOpcoesSubgrupos] = useState<string[]>([]);
|
||||||
const [opcoesCentrosCusto, setOpcoesCentrosCusto] = useState<string[]>([]);
|
const [opcoesCentrosCusto, setOpcoesCentrosCusto] = useState<string[]>([]);
|
||||||
const [opcoesContas, setOpcoesContas] = useState<string[]>([]);
|
const [opcoesContas, setOpcoesContas] = useState<string[]>([]);
|
||||||
|
const [opcoesEntidades, setOpcoesEntidades] = useState<string[]>([]);
|
||||||
|
|
||||||
// Estados para filtros de busca nos campos de seleção
|
// Estados para filtros de busca nos campos de seleção
|
||||||
const [filtroCentroCusto, setFiltroCentroCusto] = useState<string>("");
|
const [filtroCentroCusto, setFiltroCentroCusto] = useState<string>("");
|
||||||
const [filtroConta, setFiltroConta] = useState<string>("");
|
const [filtroConta, setFiltroConta] = useState<string>("");
|
||||||
|
const [filtroEntidade, setFiltroEntidade] = useState<string>("");
|
||||||
|
|
||||||
// Estados para analítico
|
// Estados para analítico
|
||||||
const [analiticoFiltros, setAnaliticoFiltros] = useState({
|
const [analiticoFiltros, setAnaliticoFiltros] = useState({
|
||||||
|
|
@ -340,6 +344,12 @@ export default function Teste() {
|
||||||
});
|
});
|
||||||
setCodigosContas(codigosContasObj);
|
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
|
// Inicializar com todos os itens selecionados, exceto o centro de custo 002.003.017 e conta 100050
|
||||||
const centrosCustoIniciaisSelecionados = centrosCustoUnicos.filter(centro => {
|
const centrosCustoIniciaisSelecionados = centrosCustoUnicos.filter(centro => {
|
||||||
const item = dadosCompletos.find((d: DREItem) => d.centro_custo === centro);
|
const item = dadosCompletos.find((d: DREItem) => d.centro_custo === centro);
|
||||||
|
|
@ -354,6 +364,9 @@ export default function Teste() {
|
||||||
setCentrosCustoSelecionados(centrosCustoIniciaisSelecionados);
|
setCentrosCustoSelecionados(centrosCustoIniciaisSelecionados);
|
||||||
setContasSelecionadas(contasIniciaisSelecionadas);
|
setContasSelecionadas(contasIniciaisSelecionadas);
|
||||||
|
|
||||||
|
// Inicializar com todas as entidades selecionadas
|
||||||
|
setEntidadesSelecionadas(entidadesUnicas);
|
||||||
|
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error("Erro ao carregar períodos:", error);
|
console.error("Erro ao carregar períodos:", error);
|
||||||
}
|
}
|
||||||
|
|
@ -657,6 +670,24 @@ export default function Teste() {
|
||||||
setContasSelecionadas([]);
|
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
|
// Função auxiliar para obter o código do centro de custo
|
||||||
const obterCodigoCentroCusto = React.useCallback((nomeCentro: string): string => {
|
const obterCodigoCentroCusto = React.useCallback((nomeCentro: string): string => {
|
||||||
if (!data || data.length === 0) {
|
if (!data || data.length === 0) {
|
||||||
|
|
@ -1431,10 +1462,12 @@ export default function Teste() {
|
||||||
// Limpar multi-seleções
|
// Limpar multi-seleções
|
||||||
setCentrosCustoSelecionados([]);
|
setCentrosCustoSelecionados([]);
|
||||||
setContasSelecionadas([]);
|
setContasSelecionadas([]);
|
||||||
|
setEntidadesSelecionadas([]);
|
||||||
|
|
||||||
// Limpar filtros de busca
|
// Limpar filtros de busca
|
||||||
setFiltroCentroCusto("");
|
setFiltroCentroCusto("");
|
||||||
setFiltroConta("");
|
setFiltroConta("");
|
||||||
|
setFiltroEntidade("");
|
||||||
|
|
||||||
// Limpar dados da tabela
|
// Limpar dados da tabela
|
||||||
setData([]);
|
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)
|
// Remover grupos calculados antigos (que foram calculados com todos os dados)
|
||||||
// Eles serão recalculados com base apenas nos dados filtrados
|
// Eles serão recalculados com base apenas nos dados filtrados
|
||||||
dadosFiltrados = dadosFiltrados.filter((item: DREItem) =>
|
dadosFiltrados = dadosFiltrados.filter((item: DREItem) =>
|
||||||
|
|
@ -2562,6 +2615,68 @@ export default function Teste() {
|
||||||
/>
|
/>
|
||||||
</div>*/}
|
</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 */}
|
{/* Ordem da Hierarquia */}
|
||||||
<div className="grid gap-2">
|
<div className="grid gap-2">
|
||||||
<Label>Ordem da Hierarquia</Label>
|
<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');
|
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
|
// Transformar os dados do Oracle para o formato esperado pelo componente
|
||||||
const transformedData = data.map((item: any) => {
|
const transformedData = data.map((item: any) => {
|
||||||
const codgrupo = item.CODGRUPO || "";
|
const codgrupo = item.CODGRUPO || "";
|
||||||
|
|
@ -29,6 +35,7 @@ export async function GET(request: NextRequest) {
|
||||||
conta: item.CONTA || "", // Usar CONTA do Oracle
|
conta: item.CONTA || "", // Usar CONTA do Oracle
|
||||||
valor: item.VALOR?.toString() || "0", // Converter VALOR para string
|
valor: item.VALOR?.toString() || "0", // Converter VALOR para string
|
||||||
codgrupo: codgrupo, // Adicionar código do grupo para cálculos
|
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