diff --git a/src/app/api/analitico-filial-oracle/route.ts b/src/app/api/analitico-filial-oracle/route.ts index 9891e47..7d415af 100644 --- a/src/app/api/analitico-filial-oracle/route.ts +++ b/src/app/api/analitico-filial-oracle/route.ts @@ -16,6 +16,7 @@ export async function GET(request: NextRequest) { const codigoGrupo = searchParams.get('codigoGrupo'); const codigoSubgrupo = searchParams.get('codigoSubgrupo'); const codigoConta = searchParams.get('codigoConta'); + const codFilial = searchParams.get('codFilial'); // Parâmetros para exclusão de valores específicos const excluirCentroCusto = searchParams.get('excluirCentroCusto'); @@ -32,6 +33,7 @@ export async function GET(request: NextRequest) { codigoGrupo, codigoSubgrupo, codigoConta, + codFilial, excluirCentroCusto, excluirCodigoConta, codigosCentrosCustoSelecionados, @@ -46,13 +48,32 @@ export async function GET(request: NextRequest) { }); // Construir query SQL com filtros usando a view VB_DRE_FILIAL_DESPESA_ANALITICO - let sql = `SELECT * FROM VB_DRE_FILIAL_DESPESA_ANALITICO WHERE 1=1`; + // Fazer JOIN com FILIAL_CC quando houver filtro por filial + let sql = ''; const params: any[] = []; let paramIndex = 1; + + // Se houver filtro por filial, fazer JOIN com FILIAL_CC + if (codFilial) { + sql = `SELECT FC.CODFILIAL, VB.* +FROM VB_DRE_FILIAL_DESPESA_ANALITICO VB +INNER JOIN FILIAL_CC FC ON FC.CC = VB.CODIGOCENTROCUSTO +WHERE 1=1`; + } else { + sql = `SELECT * FROM VB_DRE_FILIAL_DESPESA_ANALITICO WHERE 1=1`; + } + + // Filtro por filial (usando JOIN com FILIAL_CC) + if (codFilial) { + sql += ` AND FC.CODFILIAL = :${paramIndex}`; + params.push(codFilial); + paramIndex++; + console.log('🏢 Adicionando filtro de filial (CODFILIAL):', codFilial); + } // Filtro por período (usando ANOMESCOMP) if (dataInicio && dataFim) { - sql += ` AND ANOMESCOMP >= :${paramIndex} AND ANOMESCOMP <= :${paramIndex + 1}`; + sql += ` AND VB.ANOMESCOMP >= :${paramIndex} AND VB.ANOMESCOMP <= :${paramIndex + 1}`; params.push(dataInicio, dataFim); paramIndex += 2; console.log('📅 Adicionando filtro de período:', dataInicio, 'a', dataFim); @@ -60,7 +81,7 @@ export async function GET(request: NextRequest) { // Filtro por código do grupo if (codigoGrupo) { - sql += ` AND CODGRUPO = :${paramIndex}`; + sql += ` AND VB.CODGRUPO = :${paramIndex}`; params.push(codigoGrupo); paramIndex++; console.log('📊 Adicionando filtro de grupo:', codigoGrupo); @@ -68,7 +89,7 @@ export async function GET(request: NextRequest) { // Filtro por subgrupo (DIRETO, INDIRETO, SEM CC, etc.) if (codigoSubgrupo) { - sql += ` AND SUBGRUPO = :${paramIndex}`; + sql += ` AND VB.SUBGRUPO = :${paramIndex}`; params.push(codigoSubgrupo); paramIndex++; console.log('📊 Adicionando filtro de subgrupo:', codigoSubgrupo); @@ -76,7 +97,7 @@ export async function GET(request: NextRequest) { // Filtro por código da conta if (codigoConta) { - sql += ` AND CODCONTA = :${paramIndex}`; + sql += ` AND VB.CODCONTA = :${paramIndex}`; params.push(codigoConta); paramIndex++; console.log('💰 Adicionando filtro de conta:', codigoConta); @@ -98,7 +119,7 @@ export async function GET(request: NextRequest) { 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}`; + sql += ` AND VB.CODIGOCENTROCUSTO = :${paramIndex}`; params.push(centroCusto); paramIndex++; console.log('🏢 PRIORIDADE: Filtrando APENAS por centroCusto individual (clique na célula):', centroCusto); @@ -109,7 +130,7 @@ export async function GET(request: NextRequest) { const codigosArray = codigosCentrosCustoSelecionados.split(',').filter(c => c.trim() !== ''); if (codigosArray.length > 0) { const placeholders = codigosArray.map(() => `:${paramIndex++}`).join(','); - sql += ` AND CODIGOCENTROCUSTO IN (${placeholders})`; + sql += ` AND VB.CODIGOCENTROCUSTO IN (${placeholders})`; params.push(...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) + '...'); @@ -121,7 +142,7 @@ export async function GET(request: NextRequest) { // Exclusão de centro de custo específico (quando desmarcado) // Só aplicar se não houver codigosCentrosCustoSelecionados, para evitar conflito if (excluirCentroCusto && !codigosCentrosCustoSelecionados) { - sql += ` AND CODIGOCENTROCUSTO != :${paramIndex}`; + sql += ` AND VB.CODIGOCENTROCUSTO != :${paramIndex}`; params.push(excluirCentroCusto); paramIndex++; console.log('🚫 Excluindo centro de custo:', excluirCentroCusto); @@ -129,7 +150,7 @@ export async function GET(request: NextRequest) { // Exclusão de código de conta específico (quando desmarcado) if (excluirCodigoConta) { - sql += ` AND CODCONTA != :${paramIndex}`; + sql += ` AND VB.CODCONTA != :${paramIndex}`; params.push(excluirCodigoConta); paramIndex++; console.log('🚫 Excluindo código de conta:', excluirCodigoConta); @@ -139,12 +160,12 @@ export async function GET(request: NextRequest) { if (codigosContasSelecionadas) { const codigosArray = codigosContasSelecionadas.split(','); const placeholders = codigosArray.map(() => `:${paramIndex++}`).join(','); - sql += ` AND CODCONTA IN (${placeholders})`; + sql += ` AND VB.CODCONTA IN (${placeholders})`; params.push(...codigosArray); console.log('💰 Filtrando por códigos de contas:', codigosArray); } - sql += ` ORDER BY DTVENC, CODFORNEC, CODCONTA`; + sql += ` ORDER BY VB.DTVENC, VB.CODFORNEC, VB.CODCONTA`; // Log detalhado da query SQL final console.log('═══════════════════════════════════════════════════════════════'); @@ -173,6 +194,8 @@ export async function GET(request: NextRequest) { codigosCentrosCustoSelecionados: codigosCentrosCustoSelecionados || 'N/A', temCodigoConta: !!codigoConta, codigoConta: codigoConta || 'N/A', + temCodFilial: !!codFilial, + codFilial: codFilial || 'N/A', temCodigosContasSelecionadas: !!codigosContasSelecionadas, codigosContasSelecionadas: codigosContasSelecionadas || 'N/A', temExcluirCentroCusto: !!excluirCentroCusto, @@ -204,7 +227,7 @@ export async function GET(request: NextRequest) { codigo_fornecedor: item.CODFORNEC || "", nome_fornecedor: item.FORNECEDOR || "", id: item.NUMLANC || 0, - codfilial: item.FILIAL || "001", // Usar FILIAL da view + codfilial: item.CODFILIAL || item.FILIAL || "001", // Usar CODFILIAL do JOIN ou FILIAL da view recnum: item.NUMLANC || 0, data_competencia: item.ANOMESCOMP || "", data_vencimento: item.DTVENC ? new Date(item.DTVENC).toISOString().split('T')[0] : "", diff --git a/src/app/dre-filial/analitico.tsx b/src/app/dre-filial/analitico.tsx index 6eee0f2..3ca8fa1 100644 --- a/src/app/dre-filial/analitico.tsx +++ b/src/app/dre-filial/analitico.tsx @@ -93,6 +93,7 @@ interface AnaliticoProps { codigoGrupo?: string; codigoSubgrupo?: string; codigoConta?: string; + codFilial?: string; linhaSelecionada?: string; excluirCentroCusto?: string; excluirCodigoConta?: string; @@ -397,6 +398,9 @@ export default function AnaliticoComponent({ filtros }: AnaliticoProps) { if (filtrosExternos.codigoConta) { params.append('codigoConta', filtrosExternos.codigoConta); } + if (filtrosExternos.codFilial) { + params.append('codFilial', filtrosExternos.codFilial); + } if (filtrosExternos.excluirCentroCusto) { params.append('excluirCentroCusto', filtrosExternos.excluirCentroCusto); } @@ -419,6 +423,7 @@ export default function AnaliticoComponent({ filtros }: AnaliticoProps) { codigoGrupo: filtrosExternos.codigoGrupo, codigoSubgrupo: filtrosExternos.codigoSubgrupo, codigoConta: filtrosExternos.codigoConta, + codFilial: filtrosExternos.codFilial, excluirCentroCusto: filtrosExternos.excluirCentroCusto, excluirCodigoConta: filtrosExternos.excluirCodigoConta, codigosCentrosCustoSelecionados: filtrosExternos.codigosCentrosCustoSelecionados, @@ -862,7 +867,7 @@ export default function AnaliticoComponent({ filtros }: AnaliticoProps) { return ( <> {/* Filtros Externos Ativos - Apenas quando maximizado */} - {isMaximized && (filtrosExternos.dataInicio || filtrosExternos.codigoGrupo || filtrosExternos.codigoSubgrupo || filtrosExternos.codigoConta || filtrosExternos.centroCusto) && ( + {isMaximized && (filtrosExternos.dataInicio || filtrosExternos.codigoGrupo || filtrosExternos.codigoSubgrupo || filtrosExternos.codigoConta || filtrosExternos.centroCusto || filtrosExternos.codFilial) && (
Filtros aplicados pela tabela DRE Filial: @@ -887,6 +892,11 @@ export default function AnaliticoComponent({ filtros }: AnaliticoProps) { Conta: {filtrosExternos.codigoConta} )} + {filtrosExternos.codFilial && ( + + Filial: {filtrosExternos.codFilial} + + )} {filtrosExternos.centroCusto && ( Centro Custo: {filtrosExternos.centroCusto} @@ -1044,7 +1054,7 @@ export default function AnaliticoComponent({ filtros }: AnaliticoProps) {
{/* Filtros Externos Ativos - Centralizado */} - {(filtrosExternos.dataInicio || filtrosExternos.codigoGrupo || filtrosExternos.codigoSubgrupo || filtrosExternos.codigoConta || filtrosExternos.centroCusto) && ( + {(filtrosExternos.dataInicio || filtrosExternos.codigoGrupo || filtrosExternos.codigoSubgrupo || filtrosExternos.codigoConta || filtrosExternos.centroCusto || filtrosExternos.codFilial) && (
Filtros aplicados pela tabela DRE Filial: @@ -1069,6 +1079,11 @@ export default function AnaliticoComponent({ filtros }: AnaliticoProps) { Conta: {filtrosExternos.codigoConta} )} + {filtrosExternos.codFilial && ( + + Filial: {filtrosExternos.codFilial} + + )} {filtrosExternos.centroCusto && ( Centro Custo: {filtrosExternos.centroCusto} diff --git a/src/app/dre-filial/teste.tsx b/src/app/dre-filial/teste.tsx index 0c80d28..44e706c 100644 --- a/src/app/dre-filial/teste.tsx +++ b/src/app/dre-filial/teste.tsx @@ -74,7 +74,7 @@ const TableRow = memo(({ }: { row: HierarchicalRow; index: number; - handleRowClick: (row: HierarchicalRow, mes?: string) => void; + handleRowClick: (row: HierarchicalRow, mes?: string, filial?: string) => void; getRowStyle: (row: HierarchicalRow) => string; getIndentStyle: (level: number) => React.CSSProperties; renderCellContent: (row: HierarchicalRow) => React.ReactNode; @@ -112,7 +112,7 @@ const TableRow = memo(({ handleRowClick(row, mes)} + onClick={() => handleRowClick(row, mes, filial)} title={ filial && row.valoresPorMesPorFilial?.[mes]?.[filial] !== undefined ? formatCurrency(row.valoresPorMesPorFilial[mes][filial]) @@ -158,7 +158,7 @@ const TableRow = memo(({ handleRowClick(row, mes)} + onClick={() => handleRowClick(row, mes, filial)} title={ filial && row.percentuaisPorMesPorFilial?.[mes]?.[filial] !== undefined ? `${row.percentuaisPorMesPorFilial[mes][filial].toFixed(1)}%` @@ -257,6 +257,7 @@ export default function Teste() { codigoGrupo: "", codigoSubgrupo: "", codigoConta: "", + codFilial: "", linhaSelecionada: "", excluirCentroCusto: "", excluirCodigoConta: "", @@ -365,7 +366,7 @@ export default function Teste() { }, [formatCurrency]); // Função para lidar com clique nas linhas - const handleRowClick = React.useCallback((row: HierarchicalRow, mesSelecionado?: string) => { + const handleRowClick = React.useCallback((row: HierarchicalRow, mesSelecionado?: string, filialSelecionada?: string) => { console.log('🖱️ Clique na linha:', row); console.log('📅 Mês selecionado:', mesSelecionado); @@ -425,6 +426,28 @@ export default function Teste() { codigoContaFiltro = row.codigo_conta?.toString() || ""; } + // Determinar CODFILIAL baseado na filial selecionada + let codFilialFiltro = ""; + if (filialSelecionada) { + // Se a filial selecionada já é um código numérico, usar diretamente + // Caso contrário, buscar o CODFILIAL correspondente ao nome da filial nos dados + if (/^\d+$/.test(filialSelecionada)) { + codFilialFiltro = filialSelecionada; + } else { + // Buscar o CODFILIAL correspondente ao nome da filial nos dados + const itemComFilial = data.find((item: DREItem) => { + const itemFilial = item.filial || item.codfilial || ""; + return itemFilial === filialSelecionada; + }); + if (itemComFilial) { + codFilialFiltro = itemComFilial.codfilial || filialSelecionada; + } else { + // Se não encontrar, tentar usar o próprio valor como código + codFilialFiltro = filialSelecionada; + } + } + } + const novosFiltros = { dataInicio: dataInicioFiltro, dataFim: dataFimFiltro, @@ -432,6 +455,7 @@ export default function Teste() { codigoGrupo: codigoGrupoFiltro, codigoSubgrupo: "", // Não aplicável na hierarquia filial codigoConta: codigoContaFiltro, + codFilial: codFilialFiltro, linhaSelecionada: row.grupo || row.conta || "", excluirCentroCusto: "", excluirCodigoConta: "", @@ -1006,6 +1030,7 @@ export default function Teste() { codigoGrupo: "", codigoSubgrupo: "", codigoConta: "", + codFilial: "", linhaSelecionada: "", excluirCentroCusto: "", excluirCodigoConta: "", @@ -1057,6 +1082,7 @@ export default function Teste() { codigoGrupo: "", codigoSubgrupo: "", codigoConta: "", + codFilial: "", linhaSelecionada: "", excluirCentroCusto: "", excluirCodigoConta: "",