fix: ajuste analitico

This commit is contained in:
Alessandro Gonçaalves 2025-12-09 18:21:15 -03:00
parent 078c4842ed
commit 021de27ab9
3 changed files with 82 additions and 18 deletions

View File

@ -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] : "",

View File

@ -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) && (
<div className="flex items-center gap-2 mb-4">
<div className="w-2 h-2 bg-blue-500 rounded-full"></div>
<span className="text-sm font-medium text-blue-900">Filtros aplicados pela tabela DRE Filial:</span>
@ -887,6 +892,11 @@ export default function AnaliticoComponent({ filtros }: AnaliticoProps) {
Conta: {filtrosExternos.codigoConta}
</span>
)}
{filtrosExternos.codFilial && (
<span className="px-2 py-1 bg-blue-100 rounded">
Filial: {filtrosExternos.codFilial}
</span>
)}
{filtrosExternos.centroCusto && (
<span className="px-2 py-1 bg-blue-100 rounded">
Centro Custo: {filtrosExternos.centroCusto}
@ -1044,7 +1054,7 @@ export default function AnaliticoComponent({ filtros }: AnaliticoProps) {
</div>
{/* 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) && (
<div className="flex items-center gap-2">
<div className="w-2 h-2 bg-blue-500 rounded-full"></div>
<span className="text-sm font-medium text-blue-900">Filtros aplicados pela tabela DRE Filial:</span>
@ -1069,6 +1079,11 @@ export default function AnaliticoComponent({ filtros }: AnaliticoProps) {
Conta: {filtrosExternos.codigoConta}
</span>
)}
{filtrosExternos.codFilial && (
<span className="px-2 py-1 bg-blue-100 rounded">
Filial: {filtrosExternos.codFilial}
</span>
)}
{filtrosExternos.centroCusto && (
<span className="px-2 py-1 bg-blue-100 rounded">
Centro Custo: {filtrosExternos.centroCusto}

View File

@ -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(({
<React.Fragment key={`${mes}-${filial || 'default'}`}>
<td
className="px-2 py-1 text-right font-semibold cursor-pointer hover:bg-blue-50/50 transition-colors duration-200 whitespace-nowrap overflow-hidden w-[120px] min-w-[120px]"
onClick={() => 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(({
</td>
<td
className="px-2 py-1 text-center font-medium cursor-pointer hover:bg-blue-50/50 transition-colors duration-200 whitespace-nowrap overflow-hidden w-[100px] min-w-[100px]"
onClick={() => 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: "",