From 2808b6a25c8fed4c30a2fe90e618dbb84d7debcd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alessandro=20Gon=C3=A7aalves?= Date: Fri, 21 Nov 2025 00:08:43 -0300 Subject: [PATCH] =?UTF-8?q?fix:=20corre=C3=A7=C3=A3o=20filtro=20analitico?= =?UTF-8?q?=20centro=20custro?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/analitico-entidade-oracle/route.ts | 91 ++++++++++++-- src/app/dre-entidade/analitico.tsx | 13 ++ src/app/dre-entidade/teste.tsx | 118 +++++++++++++++++- 3 files changed, 206 insertions(+), 16 deletions(-) diff --git a/src/app/api/analitico-entidade-oracle/route.ts b/src/app/api/analitico-entidade-oracle/route.ts index 4bc46e2..8b725d9 100644 --- a/src/app/api/analitico-entidade-oracle/route.ts +++ b/src/app/api/analitico-entidade-oracle/route.ts @@ -25,7 +25,7 @@ export async function GET(request: NextRequest) { const codigosCentrosCustoSelecionados = searchParams.get('codigosCentrosCustoSelecionados'); const codigosContasSelecionadas = searchParams.get('codigosContasSelecionadas'); - console.log('🎯 Filtros recebidos:', { + console.log('🎯 Filtros recebidos na API:', { dataInicio, dataFim, centroCusto, @@ -37,6 +37,13 @@ export async function GET(request: NextRequest) { codigosCentrosCustoSelecionados, 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 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); } - // Filtro por cΓ³digos de centros de custo selecionados no filtro (tem prioridade sobre centroCusto individual) - if (codigosCentrosCustoSelecionados) { + // Filtro por cΓ³digos de centros de custo selecionados no filtro + // 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() !== ''); 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); + 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) { - // 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); + } else { + console.log('⚠️ Nenhum filtro de centro de custo aplicado - ambos estΓ£o vazios'); } // 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`; - console.log('πŸ—„οΈ Query SQL final:', sql); - console.log('πŸ“‹ ParΓ’metros:', params); + // Log detalhado da query SQL final + 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); diff --git a/src/app/dre-entidade/analitico.tsx b/src/app/dre-entidade/analitico.tsx index aa7a68f..cea7b3f 100644 --- a/src/app/dre-entidade/analitico.tsx +++ b/src/app/dre-entidade/analitico.tsx @@ -384,6 +384,9 @@ export default function AnaliticoComponent({ filtros }: AnaliticoProps) { } if (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) { params.append('codigoGrupo', filtrosExternos.codigoGrupo); @@ -409,6 +412,16 @@ export default function AnaliticoComponent({ filtros }: AnaliticoProps) { const url = `/api/analitico-entidade-oracle?${params.toString()}`; 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); if (response.ok) { diff --git a/src/app/dre-entidade/teste.tsx b/src/app/dre-entidade/teste.tsx index 6e1cd26..ac354e9 100644 --- a/src/app/dre-entidade/teste.tsx +++ b/src/app/dre-entidade/teste.tsx @@ -482,22 +482,26 @@ export default function Teste() { const dataFimFiltro = mesSelecionado || dataFimStr; // 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 codigoContaFiltro = ""; let codigoGrupoFiltro = ""; let entidadeFiltro = ""; 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 || ""; // 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), // 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 || ""; // 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 = ""; if (row.type === "direto_indireto" && row.direto_indireto) { // Verificar se a entidade pai estΓ‘ expandida @@ -507,6 +511,44 @@ export default function Teste() { codigoSubgrupoFiltro = row.direto_indireto; 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 @@ -567,8 +609,48 @@ export default function Teste() { } // 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 || ""; + // 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 @@ -647,12 +729,22 @@ export default function Teste() { .filter(codigo => codigo) .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 = { dataInicio: dataInicioFiltro, dataFim: dataFimFiltro, centroCusto: centroCustoFiltro, 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, linhaSelecionada: row.entidade || row.direto_indireto || row.centro_custo || row.conta || "", excluirCentroCusto, @@ -660,8 +752,26 @@ export default function Teste() { codigosCentrosCustoSelecionados, 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('πŸ” 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); };