fix: correção filtro analitico centro custro

This commit is contained in:
Alessandro Gonçaalves 2025-11-21 00:08:43 -03:00
parent 5c97a7911e
commit 2808b6a25c
3 changed files with 206 additions and 16 deletions

View File

@ -25,7 +25,7 @@ export async function GET(request: NextRequest) {
const codigosCentrosCustoSelecionados = searchParams.get('codigosCentrosCustoSelecionados'); const codigosCentrosCustoSelecionados = searchParams.get('codigosCentrosCustoSelecionados');
const codigosContasSelecionadas = searchParams.get('codigosContasSelecionadas'); const codigosContasSelecionadas = searchParams.get('codigosContasSelecionadas');
console.log('🎯 Filtros recebidos:', { console.log('🎯 Filtros recebidos na API:', {
dataInicio, dataInicio,
dataFim, dataFim,
centroCusto, centroCusto,
@ -37,6 +37,13 @@ export async function GET(request: NextRequest) {
codigosCentrosCustoSelecionados, codigosCentrosCustoSelecionados,
codigosContasSelecionadas codigosContasSelecionadas
}); });
console.log('🔍 Verificação específica de centroCusto:', {
centroCusto,
tipo: typeof centroCusto,
vazio: centroCusto === null || centroCusto === undefined || centroCusto === '',
codigosCentrosCustoSelecionados,
codigosCentrosCustoSelecionadosVazio: !codigosCentrosCustoSelecionados || codigosCentrosCustoSelecionados === ''
});
// Construir query SQL com filtros usando a view DESPESA_ENTIDADE_ANALITICO // Construir query SQL com filtros usando a view DESPESA_ENTIDADE_ANALITICO
let sql = `SELECT * FROM DESPESA_ENTIDADE_ANALITICO WHERE 1=1`; let sql = `SELECT * FROM DESPESA_ENTIDADE_ANALITICO WHERE 1=1`;
@ -75,21 +82,40 @@ export async function GET(request: NextRequest) {
console.log('💰 Adicionando filtro de conta:', codigoConta); console.log('💰 Adicionando filtro de conta:', codigoConta);
} }
// Filtro por códigos de centros de custo selecionados no filtro (tem prioridade sobre centroCusto individual) // Filtro por códigos de centros de custo selecionados no filtro
if (codigosCentrosCustoSelecionados) { // Se houver codigosCentrosCustoSelecionados E centroCusto individual, incluir ambos
console.log('🔍 Antes de aplicar filtro de centro de custo:', {
codigosCentrosCustoSelecionados,
centroCusto,
codigosCentrosCustoSelecionadosVazio: !codigosCentrosCustoSelecionados || codigosCentrosCustoSelecionados.trim() === '',
centroCustoVazio: !centroCusto || centroCusto.trim() === '',
centroCustoLength: centroCusto?.length,
codigosCentrosCustoSelecionadosLength: codigosCentrosCustoSelecionados?.length
});
// IMPORTANTE: Quando centroCusto individual é fornecido (clique na célula), ele tem PRIORIDADE ABSOLUTA
// e deve filtrar APENAS por ele, ignorando codigosCentrosCustoSelecionados do filtro geral
if (centroCusto && centroCusto.trim() !== '') {
// Quando há centroCusto individual (clique na célula), usar APENAS ele
// Ignorar codigosCentrosCustoSelecionados do filtro geral para garantir filtro preciso
sql += ` AND CODIGOCENTROCUSTO = :${paramIndex}`;
params.push(centroCusto);
paramIndex++;
console.log('🏢 PRIORIDADE: Filtrando APENAS por centroCusto individual (clique na célula):', centroCusto);
console.log('⚠️ Ignorando codigosCentrosCustoSelecionados do filtro geral quando há centroCusto individual');
console.log('📝 SQL após adicionar filtro =:', sql.substring(0, 200) + '...');
} else if (codigosCentrosCustoSelecionados && codigosCentrosCustoSelecionados.trim() !== '') {
// Se só codigosCentrosCustoSelecionados existe (sem clique na célula), usar ele
const codigosArray = codigosCentrosCustoSelecionados.split(',').filter(c => c.trim() !== ''); const codigosArray = codigosCentrosCustoSelecionados.split(',').filter(c => c.trim() !== '');
if (codigosArray.length > 0) { if (codigosArray.length > 0) {
const placeholders = codigosArray.map(() => `:${paramIndex++}`).join(','); const placeholders = codigosArray.map(() => `:${paramIndex++}`).join(',');
sql += ` AND CODIGOCENTROCUSTO IN (${placeholders})`; sql += ` AND CODIGOCENTROCUSTO IN (${placeholders})`;
params.push(...codigosArray); params.push(...codigosArray);
console.log('🏢 Filtrando por códigos de centros de custo selecionados:', codigosArray); console.log('🏢 Filtrando por códigos de centros de custo selecionados (filtro geral):', codigosArray);
console.log('📝 SQL após adicionar filtro IN:', sql.substring(0, 200) + '...');
} }
} else if (centroCusto) { } else {
// Só usar filtro individual de centroCusto se não houver codigosCentrosCustoSelecionados console.log('⚠️ Nenhum filtro de centro de custo aplicado - ambos estão vazios');
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) // Exclusão de centro de custo específico (quando desmarcado)
@ -120,8 +146,49 @@ export async function GET(request: NextRequest) {
sql += ` ORDER BY DTVENC, CODFORNEC, CODCONTA`; sql += ` ORDER BY DTVENC, CODFORNEC, CODCONTA`;
console.log('🗄️ Query SQL final:', sql); // Log detalhado da query SQL final
console.log('📋 Parâmetros:', params); console.log('═══════════════════════════════════════════════════════════════');
console.log('🗄️ QUERY SQL FINAL:');
console.log('═══════════════════════════════════════════════════════════════');
console.log(sql);
console.log('═══════════════════════════════════════════════════════════════');
console.log('📋 PARÂMETROS FINAIS (na ordem dos placeholders :1, :2, :3, ...):');
console.log('═══════════════════════════════════════════════════════════════');
params.forEach((param, index) => {
console.log(` :${index + 1} = ${param} (${typeof param})`);
});
console.log('═══════════════════════════════════════════════════════════════');
console.log('📊 RESUMO DOS FILTROS APLICADOS:');
console.log('═══════════════════════════════════════════════════════════════');
console.log({
temPeriodo: dataInicio && dataFim,
periodo: dataInicio && dataFim ? `${dataInicio} a ${dataFim}` : 'N/A',
temCodigoGrupo: !!codigoGrupo,
codigoGrupo: codigoGrupo || 'N/A',
temCodigoSubgrupo: !!codigoSubgrupo,
codigoSubgrupo: codigoSubgrupo || 'N/A',
temCentroCusto: !!centroCusto,
centroCusto: centroCusto || 'N/A',
temCodigosCentrosCustoSelecionados: !!codigosCentrosCustoSelecionados,
codigosCentrosCustoSelecionados: codigosCentrosCustoSelecionados || 'N/A',
temCodigoConta: !!codigoConta,
codigoConta: codigoConta || 'N/A',
temCodigosContasSelecionadas: !!codigosContasSelecionadas,
codigosContasSelecionadas: codigosContasSelecionadas || 'N/A',
temExcluirCentroCusto: !!excluirCentroCusto,
excluirCentroCusto: excluirCentroCusto || 'N/A',
temExcluirCodigoConta: !!excluirCodigoConta,
excluirCodigoConta: excluirCodigoConta || 'N/A'
});
console.log('═══════════════════════════════════════════════════════════════');
// Se há centroCusto individual, destacar especialmente
if (centroCusto && centroCusto.trim() !== '') {
console.log('🎯 FILTRO INDIVIDUAL DE CENTRO DE CUSTO ATIVO (clique na célula)');
console.log(` Centro de Custo: ${centroCusto}`);
console.log(' ⚠️ Este filtro tem PRIORIDADE sobre codigosCentrosCustoSelecionados');
}
console.log('═══════════════════════════════════════════════════════════════');
const data = await executeOracleQuery(sql, params); const data = await executeOracleQuery(sql, params);

View File

@ -384,6 +384,9 @@ export default function AnaliticoComponent({ filtros }: AnaliticoProps) {
} }
if (filtrosExternos.centroCusto) { if (filtrosExternos.centroCusto) {
params.append('centroCusto', filtrosExternos.centroCusto); params.append('centroCusto', filtrosExternos.centroCusto);
console.log('🏢 Analítico - Adicionando parâmetro centroCusto:', filtrosExternos.centroCusto);
} else {
console.log('⚠️ Analítico - centroCusto não está presente nos filtros externos');
} }
if (filtrosExternos.codigoGrupo) { if (filtrosExternos.codigoGrupo) {
params.append('codigoGrupo', filtrosExternos.codigoGrupo); params.append('codigoGrupo', filtrosExternos.codigoGrupo);
@ -409,6 +412,16 @@ export default function AnaliticoComponent({ filtros }: AnaliticoProps) {
const url = `/api/analitico-entidade-oracle?${params.toString()}`; const url = `/api/analitico-entidade-oracle?${params.toString()}`;
console.log('🌐 Fazendo requisição para:', url); console.log('🌐 Fazendo requisição para:', url);
console.log('📋 Parâmetros enviados:', {
dataInicio: filtrosExternos.dataInicio,
dataFim: filtrosExternos.dataFim,
centroCusto: filtrosExternos.centroCusto,
codigoGrupo: filtrosExternos.codigoGrupo,
codigoSubgrupo: filtrosExternos.codigoSubgrupo,
codigoConta: filtrosExternos.codigoConta,
codigosCentrosCustoSelecionados: filtrosExternos.codigosCentrosCustoSelecionados,
codigosContasSelecionadas: filtrosExternos.codigosContasSelecionadas
});
const response = await fetch(url); const response = await fetch(url);
if (response.ok) { if (response.ok) {

View File

@ -482,22 +482,26 @@ export default function Teste() {
const dataFimFiltro = mesSelecionado || dataFimStr; const dataFimFiltro = mesSelecionado || dataFimStr;
// Determinar filtros baseado na nova hierarquia [entidade, direto/indireto, cc, conta] // Determinar filtros baseado na nova hierarquia [entidade, direto/indireto, cc, conta]
// IMPORTANTE: Quando clicar em um nível abaixo, manter os filtros dos níveis anteriores
let centroCustoFiltro = ""; let centroCustoFiltro = "";
let codigoContaFiltro = ""; let codigoContaFiltro = "";
let codigoGrupoFiltro = ""; let codigoGrupoFiltro = "";
let entidadeFiltro = ""; let entidadeFiltro = "";
let diretoIndiretoFiltro = ""; let diretoIndiretoFiltro = "";
// Sempre filtrar por entidade se disponível // Sempre filtrar por entidade se disponível (mantém em todos os níveis)
// Quando clicar em centro_custo ou conta, manter a entidade do nível anterior
entidadeFiltro = row.entidade || ""; entidadeFiltro = row.entidade || "";
// Filtrar por direto/indireto se disponível // Filtrar por direto/indireto se disponível
// Quando clicar em uma célula de valor de uma linha "direto_indireto" (DIRETO, INDIRETO ou SEM CC), // Quando clicar em uma célula de valor de uma linha "direto_indireto" (DIRETO, INDIRETO ou SEM CC),
// adicionar o SUBGRUPO como filtro adicional // adicionar o SUBGRUPO como filtro adicional
// Quando clicar em centro_custo ou conta, manter o direto_indireto do nível anterior
diretoIndiretoFiltro = row.direto_indireto || ""; diretoIndiretoFiltro = row.direto_indireto || "";
// Verificar se a linha é do tipo "direto_indireto" e se a entidade pai está expandida (drill aberto) // Verificar se a linha é do tipo "direto_indireto" e se a entidade pai está expandida (drill aberto)
// Se sim, usar o direto_indireto como codigoSubgrupo no filtro // Determinar codigoSubgrupo baseado na hierarquia
// Quando clicar em qualquer nível abaixo de direto_indireto, deve manter o filtro do nível anterior
let codigoSubgrupoFiltro = ""; let codigoSubgrupoFiltro = "";
if (row.type === "direto_indireto" && row.direto_indireto) { if (row.type === "direto_indireto" && row.direto_indireto) {
// Verificar se a entidade pai está expandida // Verificar se a entidade pai está expandida
@ -507,6 +511,44 @@ export default function Teste() {
codigoSubgrupoFiltro = row.direto_indireto; codigoSubgrupoFiltro = row.direto_indireto;
console.log('📊 Drill aberto - Adicionando filtro de subgrupo:', codigoSubgrupoFiltro); console.log('📊 Drill aberto - Adicionando filtro de subgrupo:', codigoSubgrupoFiltro);
} }
} else if (row.type === "centro_custo" && row.direto_indireto) {
// Quando clicar em centro de custo, manter o filtro do nível anterior (direto_indireto)
codigoSubgrupoFiltro = row.direto_indireto;
console.log('📊 Mantendo filtro de subgrupo do nível anterior (centro_custo):', codigoSubgrupoFiltro);
} else if (row.type === "conta" && row.direto_indireto) {
// Quando clicar em conta, manter o filtro do nível anterior (direto_indireto)
codigoSubgrupoFiltro = row.direto_indireto;
console.log('📊 Mantendo filtro de subgrupo do nível anterior (conta):', codigoSubgrupoFiltro);
}
// Quando clicar em uma célula de valor de um centro de custo, sempre adicionar o CODIGOCENTROCUSTO ao filtro
// Sempre adicionar o CODIGOCENTROCUSTO quando clicar em uma célula de valor de centro de custo
let codigoCentroCustoFiltroAdicional = "";
if (row.type === "centro_custo") {
// Sempre adicionar o CODIGOCENTROCUSTO quando clicar em uma célula de valor de centro de custo
// Tentar obter o código do centro de custo de diferentes formas
codigoCentroCustoFiltroAdicional = row.codigo_centro_custo || "";
// Se não tiver codigo_centro_custo na row, tentar buscar nos dados originais
if (!codigoCentroCustoFiltroAdicional && row.centro_custo) {
const itemCentro = data.find((item: DREItem) =>
item.centro_custo === row.centro_custo &&
item.entidades === row.entidade &&
item.subgrupo === row.direto_indireto
);
if (itemCentro?.codigo_centro_custo) {
codigoCentroCustoFiltroAdicional = itemCentro.codigo_centro_custo;
}
}
console.log('📊 Adicionando filtro de centro de custo (sempre):', {
codigoCentroCustoFiltroAdicional,
tipoLinha: row.type,
codigo_centro_custo: row.codigo_centro_custo,
centro_custo: row.centro_custo,
entidade: row.entidade,
direto_indireto: row.direto_indireto
});
} }
// Buscar CODGRUPO dos dados originais baseado na hierarquia selecionada // Buscar CODGRUPO dos dados originais baseado na hierarquia selecionada
@ -567,8 +609,48 @@ export default function Teste() {
} }
// Filtrar por centro de custo se for nível centro_custo ou conta // Filtrar por centro de custo se for nível centro_custo ou conta
if (row.type === "centro_custo" || row.type === "conta") { // IMPORTANTE: Quando clicar em um nível abaixo, manter os filtros dos níveis anteriores
if (row.type === "centro_custo") {
// Sempre usar o codigo_centro_custo quando clicar em uma célula de valor
// Priorizar o filtro adicional se existir, senão usar o codigo_centro_custo da linha
if (codigoCentroCustoFiltroAdicional) {
centroCustoFiltro = codigoCentroCustoFiltroAdicional;
} else if (row.codigo_centro_custo) {
centroCustoFiltro = row.codigo_centro_custo;
} else {
// Se não tiver na row, buscar nos dados originais
const itemCentro = data.find((item: DREItem) =>
item.centro_custo === row.centro_custo &&
item.entidades === row.entidade &&
item.subgrupo === row.direto_indireto
);
centroCustoFiltro = itemCentro?.codigo_centro_custo || "";
}
// Manter filtros dos níveis anteriores (entidade e subgrupo já estão definidos acima)
console.log('📊 Adicionando filtro de centro de custo (mantendo níveis anteriores):', {
centroCustoFiltro,
codigoCentroCustoFiltroAdicional,
codigo_centro_custo: row.codigo_centro_custo,
tipoLinha: row.type,
entidadeFiltro: entidadeFiltro, // Mantido do nível anterior
codigoSubgrupoFiltro: codigoSubgrupoFiltro, // Mantido do nível anterior
rowData: {
centro_custo: row.centro_custo,
entidade: row.entidade,
direto_indireto: row.direto_indireto
}
});
} else if (row.type === "conta") {
// Para conta, adicionar o centro de custo E manter os filtros dos níveis anteriores
centroCustoFiltro = row.codigo_centro_custo || ""; centroCustoFiltro = row.codigo_centro_custo || "";
// Manter filtros dos níveis anteriores (entidade e subgrupo já estão definidos acima)
console.log('📊 Adicionando filtro de conta (mantendo níveis anteriores):', {
codigoContaFiltro: row.codigo_conta?.toString() || "",
centroCustoFiltro,
entidadeFiltro: entidadeFiltro, // Mantido do nível anterior
codigoSubgrupoFiltro: codigoSubgrupoFiltro, // Mantido do nível anterior
tipoLinha: row.type
});
} }
// Filtrar por conta se for nível conta // Filtrar por conta se for nível conta
@ -647,12 +729,22 @@ export default function Teste() {
.filter(codigo => codigo) .filter(codigo => codigo)
.join(','); .join(',');
// Garantir que centroCustoFiltro está definido quando for tipo centro_custo
if (row.type === "centro_custo" && !centroCustoFiltro && row.codigo_centro_custo) {
centroCustoFiltro = row.codigo_centro_custo;
console.log('⚠️ Centro de custo filtro estava vazio, definindo agora:', centroCustoFiltro);
}
// Garantir que codigoSubgrupo seja mantido quando clicar em níveis abaixo
// Se codigoSubgrupoFiltro estiver vazio mas diretoIndiretoFiltro existir, usar diretoIndiretoFiltro
const codigoSubgrupoFinal = codigoSubgrupoFiltro || diretoIndiretoFiltro || "";
const novosFiltros = { const novosFiltros = {
dataInicio: dataInicioFiltro, dataInicio: dataInicioFiltro,
dataFim: dataFimFiltro, dataFim: dataFimFiltro,
centroCusto: centroCustoFiltro, centroCusto: centroCustoFiltro,
codigoGrupo: codigoGrupoFiltro, // CODGRUPO da entidade/linha selecionada codigoGrupo: codigoGrupoFiltro, // CODGRUPO da entidade/linha selecionada
codigoSubgrupo: codigoSubgrupoFiltro || diretoIndiretoFiltro, // SUBGRUPO quando drill aberto (DIRETO, INDIRETO ou SEM CC) codigoSubgrupo: codigoSubgrupoFinal, // SUBGRUPO mantido dos níveis anteriores quando clicar em centro_custo ou conta
codigoConta: codigoContaFiltro, codigoConta: codigoContaFiltro,
linhaSelecionada: row.entidade || row.direto_indireto || row.centro_custo || row.conta || "", linhaSelecionada: row.entidade || row.direto_indireto || row.centro_custo || row.conta || "",
excluirCentroCusto, excluirCentroCusto,
@ -661,7 +753,25 @@ export default function Teste() {
codigosContasSelecionadas, codigosContasSelecionadas,
}; };
console.log('🔍 Verificação de filtros mantidos:', {
tipoLinha: row.type,
codigoSubgrupoFiltro,
diretoIndiretoFiltro,
codigoSubgrupoFinal,
entidadeFiltro,
centroCustoFiltro,
codigoGrupoFiltro
});
console.log('🎯 Novos filtros para analítico:', novosFiltros); console.log('🎯 Novos filtros para analítico:', novosFiltros);
console.log('🔍 Verificação específica de centro de custo:', {
centroCustoFiltro,
tipoLinha: row.type,
codigo_centro_custo: row.codigo_centro_custo,
codigoCentroCustoFiltroAdicional,
centro_custo: row.centro_custo,
novosFiltrosCentroCusto: novosFiltros.centroCusto
});
setAnaliticoFiltros(novosFiltros); setAnaliticoFiltros(novosFiltros);
}; };