diff --git a/src/app/DRE/teste.tsx b/src/app/DRE/teste.tsx index e7fa32b..1c74366 100644 --- a/src/app/DRE/teste.tsx +++ b/src/app/DRE/teste.tsx @@ -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 = {}; + const codigosPorNome = new Map>(); + 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 = {}; + 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,29 +482,60 @@ 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 @@ -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(); + + 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) diff --git a/src/app/api/analitico-oracle/route.ts b/src/app/api/analitico-oracle/route.ts index 13c6254..ce3dcbf 100644 --- a/src/app/api/analitico-oracle/route.ts +++ b/src/app/api/analitico-oracle/route.ts @@ -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(',');