fix: ajuste no filtro por centro de custo

This commit is contained in:
Alessandro Gonçaalves 2025-11-03 15:06:43 -03:00
parent 00a66b6249
commit 4be3965fea
2 changed files with 119 additions and 30 deletions

View File

@ -275,12 +275,40 @@ export default function Teste() {
setOpcoesCentrosCusto(centrosCustoUnicos);
// Criar objeto de códigos dos centros de custo
// Usar um Map para garantir que pegamos o código correto mesmo com duplicatas
const codigos: Record<string, string> = {};
const codigosPorNome = new Map<string, Set<string>>();
dadosCompletos.forEach((item: DREItem) => {
if (item.centro_custo && item.codigo_centro_custo) {
codigos[item.centro_custo] = item.codigo_centro_custo;
if (!codigosPorNome.has(item.centro_custo)) {
codigosPorNome.set(item.centro_custo, new Set());
}
codigosPorNome.get(item.centro_custo)!.add(item.codigo_centro_custo);
}
});
// Para cada centro de custo, usar o código mais comum ou o primeiro encontrado
codigosPorNome.forEach((codigosSet, nome) => {
const codigosArray = Array.from(codigosSet);
// Se houver apenas um código, usar esse
if (codigosArray.length === 1) {
codigos[nome] = codigosArray[0];
} else {
// Se houver múltiplos códigos, verificar qual é mais frequente nos dados
const frequencia: Record<string, number> = {};
dadosCompletos.forEach((item: DREItem) => {
if (item.centro_custo === nome && item.codigo_centro_custo) {
frequencia[item.codigo_centro_custo] = (frequencia[item.codigo_centro_custo] || 0) + 1;
}
});
// Pegar o código mais frequente
const codigoMaisFrequente = Object.entries(frequencia).sort((a, b) => b[1] - a[1])[0];
codigos[nome] = codigoMaisFrequente ? codigoMaisFrequente[0] : codigosArray[0];
}
});
console.log('🗺️ Mapeamento de códigos de centros de custo criado:', codigos);
setCodigosCentrosCusto(codigos);
// Extrair contas únicas
@ -454,30 +482,61 @@ export default function Teste() {
let excluirCodigoConta = "";
// Se o centro de custo "002.003.017" não está selecionado, excluir da consulta
if (!centrosCustoSelecionados.some(centro => {
const centroCusto002003017Selecionado = centrosCustoSelecionados.some(centro => {
// Verificar pelo código no mapeamento primeiro
const codigoCentro = codigosCentrosCusto[centro];
if (codigoCentro === "002.003.017") {
return true;
}
// Se não encontrar no mapeamento, buscar nos dados
const item = data.find((d: DREItem) => d.centro_custo === centro);
return item?.codigo_centro_custo === "002.003.017";
})) {
});
if (!centroCusto002003017Selecionado) {
excluirCentroCusto = "002.003.017";
}
// Se a conta "100050" não está selecionada, excluir da consulta
if (!contasSelecionadas.some(conta => {
const conta100050Selecionada = contasSelecionadas.some(conta => {
// Verificar pelo código no mapeamento primeiro
const codigoConta = codigosContas[conta];
if (codigoConta === "100050") {
return true;
}
// Se não encontrar no mapeamento, buscar nos dados
const item = data.find((d: DREItem) => d.conta === conta);
return item?.codigo_conta?.toString() === "100050";
})) {
});
if (!conta100050Selecionada) {
excluirCodigoConta = "100050";
}
// Obter códigos dos centros de custo selecionados no filtro
// Obter códigos dos centros de custo selecionados no filtro - APENAS CÓDIGOS
const codigosCentrosCustoSelecionados = centrosCustoSelecionados
.map(centro => {
// Primeiro tentar buscar no objeto codigosCentrosCusto (mapeamento)
const codigoDoMapeamento = codigosCentrosCusto[centro];
if (codigoDoMapeamento) {
console.log(`🔍 Código encontrado no mapeamento para "${centro}": ${codigoDoMapeamento}`);
return codigoDoMapeamento;
}
// Se não encontrar no mapeamento, buscar nos dados
const item = data.find((d: DREItem) => d.centro_custo === centro);
return item?.codigo_centro_custo;
const codigoEncontrado = item?.codigo_centro_custo;
if (codigoEncontrado) {
console.log(`🔍 Código encontrado nos dados para "${centro}": ${codigoEncontrado}`);
} else {
console.warn(`⚠️ Código NÃO encontrado para centro de custo "${centro}"`);
}
return codigoEncontrado;
})
.filter(codigo => codigo) // Remover undefined
.filter(codigo => codigo && codigo.trim() !== '') // Remover undefined e strings vazias
.join(',');
console.log('📋 Códigos de centros de custo selecionados:', codigosCentrosCustoSelecionados);
// Obter códigos das contas selecionadas no filtro
const codigosContasSelecionadas = contasSelecionadas
.map(conta => {
@ -1147,11 +1206,40 @@ export default function Teste() {
);
}
// Filtro por centro de custo (multi-seleção)
// Filtro por centro de custo (multi-seleção) - USAR APENAS CÓDIGO
if (centrosCustoSelecionados.length > 0) {
dadosFiltrados = dadosFiltrados.filter((item: DREItem) =>
centrosCustoSelecionados.includes(item.centro_custo)
);
// Criar conjunto de códigos esperados dos centros selecionados - APENAS CÓDIGOS
const codigosEsperados = new Set<string>();
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);
}
}
});
// Filtrar APENAS pelo código do centro de custo, ignorando o nome
dadosFiltrados = dadosFiltrados.filter((item: DREItem) => {
if (!item.codigo_centro_custo) {
return false;
}
return codigosEsperados.has(item.codigo_centro_custo);
});
console.log('🏢 Filtro de centros de custo aplicado (APENAS CÓDIGO):', {
selecionados: centrosCustoSelecionados,
codigosEsperados: Array.from(codigosEsperados),
totalFiltrado: dadosFiltrados.length,
centrosEncontrados: [...new Set(dadosFiltrados.map((d: DREItem) => d.centro_custo))],
codigosEncontrados: [...new Set(dadosFiltrados.map((d: DREItem) => d.codigo_centro_custo).filter(Boolean))]
});
}
// Filtro por conta (multi-seleção)

View File

@ -49,14 +49,6 @@ export async function GET(request: NextRequest) {
console.log('📅 Adicionando filtro de período:', dataInicio, 'a', dataFim);
}
// Filtro por centro de custo
if (centroCusto) {
sql += ` AND CODIGOCENTROCUSTO = :${paramIndex}`;
params.push(centroCusto);
paramIndex++;
console.log('🏢 Adicionando filtro de centro:', centroCusto);
}
// Filtro por código do grupo
if (codigoGrupo) {
sql += ` AND CODGRUPO = :${paramIndex}`;
@ -73,8 +65,26 @@ export async function GET(request: NextRequest) {
console.log('💰 Adicionando filtro de conta:', codigoConta);
}
// Filtro por códigos de centros de custo selecionados no filtro (tem prioridade sobre centroCusto individual)
if (codigosCentrosCustoSelecionados) {
const codigosArray = codigosCentrosCustoSelecionados.split(',').filter(c => c.trim() !== '');
if (codigosArray.length > 0) {
const placeholders = codigosArray.map(() => `:${paramIndex++}`).join(',');
sql += ` AND CODIGOCENTROCUSTO IN (${placeholders})`;
params.push(...codigosArray);
console.log('🏢 Filtrando por códigos de centros de custo selecionados:', codigosArray);
}
} else if (centroCusto) {
// Só usar filtro individual de centroCusto se não houver codigosCentrosCustoSelecionados
sql += ` AND CODIGOCENTROCUSTO = :${paramIndex}`;
params.push(centroCusto);
paramIndex++;
console.log('🏢 Adicionando filtro de centro individual:', centroCusto);
}
// Exclusão de centro de custo específico (quando desmarcado)
if (excluirCentroCusto) {
// Só aplicar se não houver codigosCentrosCustoSelecionados, para evitar conflito
if (excluirCentroCusto && !codigosCentrosCustoSelecionados) {
sql += ` AND CODIGOCENTROCUSTO != :${paramIndex}`;
params.push(excluirCentroCusto);
paramIndex++;
@ -89,15 +99,6 @@ export async function GET(request: NextRequest) {
console.log('🚫 Excluindo código de conta:', excluirCodigoConta);
}
// Filtro por códigos de centros de custo selecionados no filtro
if (codigosCentrosCustoSelecionados) {
const codigosArray = codigosCentrosCustoSelecionados.split(',');
const placeholders = codigosArray.map(() => `:${paramIndex++}`).join(',');
sql += ` AND CODIGOCENTROCUSTO IN (${placeholders})`;
params.push(...codigosArray);
console.log('🏢 Filtrando por códigos de centros de custo:', codigosArray);
}
// Filtro por códigos de contas selecionadas no filtro
if (codigosContasSelecionadas) {
const codigosArray = codigosContasSelecionadas.split(',');