Compare commits

..

No commits in common. "a5c9e6985d9cbfe4cdb6cc8f609874332b20bd10" and "76ab77fb5183ce9a68cfa77eba6c610005dab654" have entirely different histories.

7 changed files with 1627 additions and 2288 deletions

File diff suppressed because it is too large Load Diff

View File

@ -1,5 +1,5 @@
import { executeOracleQuery } from '@/db/oracle';
import { NextRequest, NextResponse } from 'next/server'; import { NextRequest, NextResponse } from 'next/server';
import { executeOracleQuery } from '@/db/oracle';
export async function GET(request: NextRequest) { export async function GET(request: NextRequest) {
try { try {
@ -16,18 +16,14 @@ export async function GET(request: NextRequest) {
const codigoGrupo = searchParams.get('codigoGrupo'); const codigoGrupo = searchParams.get('codigoGrupo');
const codigoSubgrupo = searchParams.get('codigoSubgrupo'); const codigoSubgrupo = searchParams.get('codigoSubgrupo');
const codigoConta = searchParams.get('codigoConta'); const codigoConta = searchParams.get('codigoConta');
// Parâmetros para exclusão de valores específicos // Parâmetros para exclusão de valores específicos
const excluirCentroCusto = searchParams.get('excluirCentroCusto'); const excluirCentroCusto = searchParams.get('excluirCentroCusto');
const excluirCodigoConta = searchParams.get('excluirCodigoConta'); const excluirCodigoConta = searchParams.get('excluirCodigoConta');
// Novos parâmetros para códigos selecionados no filtro // Novos parâmetros para códigos selecionados no filtro
const codigosCentrosCustoSelecionados = searchParams.get( const codigosCentrosCustoSelecionados = searchParams.get('codigosCentrosCustoSelecionados');
'codigosCentrosCustoSelecionados' const codigosContasSelecionadas = searchParams.get('codigosContasSelecionadas');
);
const codigosContasSelecionadas = searchParams.get(
'codigosContasSelecionadas'
);
console.log('🎯 Filtros recebidos na API:', { console.log('🎯 Filtros recebidos na API:', {
dataInicio, dataInicio,
@ -39,17 +35,14 @@ export async function GET(request: NextRequest) {
excluirCentroCusto, excluirCentroCusto,
excluirCodigoConta, excluirCodigoConta,
codigosCentrosCustoSelecionados, codigosCentrosCustoSelecionados,
codigosContasSelecionadas, codigosContasSelecionadas
}); });
console.log('🔍 Verificação específica de centroCusto:', { console.log('🔍 Verificação específica de centroCusto:', {
centroCusto, centroCusto,
tipo: typeof centroCusto, tipo: typeof centroCusto,
vazio: vazio: centroCusto === null || centroCusto === undefined || centroCusto === '',
centroCusto === null || centroCusto === undefined || centroCusto === '',
codigosCentrosCustoSelecionados, codigosCentrosCustoSelecionados,
codigosCentrosCustoSelecionadosVazio: codigosCentrosCustoSelecionadosVazio: !codigosCentrosCustoSelecionados || codigosCentrosCustoSelecionados === ''
!codigosCentrosCustoSelecionados ||
codigosCentrosCustoSelecionados === '',
}); });
// Construir query SQL com filtros usando a view DESPESA_ENTIDADE_ANALITICO // Construir query SQL com filtros usando a view DESPESA_ENTIDADE_ANALITICO
@ -59,17 +52,10 @@ export async function GET(request: NextRequest) {
// Filtro por período (usando ANOMESCOMP) // Filtro por período (usando ANOMESCOMP)
if (dataInicio && dataFim) { if (dataInicio && dataFim) {
sql += ` AND ANOMESCOMP >= :${paramIndex} AND ANOMESCOMP <= :${ sql += ` AND ANOMESCOMP >= :${paramIndex} AND ANOMESCOMP <= :${paramIndex + 1}`;
paramIndex + 1
}`;
params.push(dataInicio, dataFim); params.push(dataInicio, dataFim);
paramIndex += 2; paramIndex += 2;
console.log( console.log('📅 Adicionando filtro de período:', dataInicio, 'a', dataFim);
'📅 Adicionando filtro de período:',
dataInicio,
'a',
dataFim
);
} }
// Filtro por código do grupo // Filtro por código do grupo
@ -101,15 +87,12 @@ export async function GET(request: NextRequest) {
console.log('🔍 Antes de aplicar filtro de centro de custo:', { console.log('🔍 Antes de aplicar filtro de centro de custo:', {
codigosCentrosCustoSelecionados, codigosCentrosCustoSelecionados,
centroCusto, centroCusto,
codigosCentrosCustoSelecionadosVazio: codigosCentrosCustoSelecionadosVazio: !codigosCentrosCustoSelecionados || codigosCentrosCustoSelecionados.trim() === '',
!codigosCentrosCustoSelecionados ||
codigosCentrosCustoSelecionados.trim() === '',
centroCustoVazio: !centroCusto || centroCusto.trim() === '', centroCustoVazio: !centroCusto || centroCusto.trim() === '',
centroCustoLength: centroCusto?.length, centroCustoLength: centroCusto?.length,
codigosCentrosCustoSelecionadosLength: codigosCentrosCustoSelecionadosLength: codigosCentrosCustoSelecionados?.length
codigosCentrosCustoSelecionados?.length,
}); });
// IMPORTANTE: Quando centroCusto individual é fornecido (clique na célula), ele tem PRIORIDADE ABSOLUTA // IMPORTANTE: Quando centroCusto individual é fornecido (clique na célula), ele tem PRIORIDADE ABSOLUTA
// e deve filtrar APENAS por ele, ignorando codigosCentrosCustoSelecionados do filtro geral // e deve filtrar APENAS por ele, ignorando codigosCentrosCustoSelecionados do filtro geral
if (centroCusto && centroCusto.trim() !== '') { if (centroCusto && centroCusto.trim() !== '') {
@ -118,44 +101,21 @@ export async function GET(request: NextRequest) {
sql += ` AND CODIGOCENTROCUSTO = :${paramIndex}`; sql += ` AND CODIGOCENTROCUSTO = :${paramIndex}`;
params.push(centroCusto); params.push(centroCusto);
paramIndex++; paramIndex++;
console.log( console.log('🏢 PRIORIDADE: Filtrando APENAS por centroCusto individual (clique na célula):', centroCusto);
'🏢 PRIORIDADE: Filtrando APENAS por centroCusto individual (clique na célula):', console.log('⚠️ Ignorando codigosCentrosCustoSelecionados do filtro geral quando há centroCusto individual');
centroCusto console.log('📝 SQL após adicionar filtro =:', sql.substring(0, 200) + '...');
); } else if (codigosCentrosCustoSelecionados && codigosCentrosCustoSelecionados.trim() !== '') {
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 // Se só codigosCentrosCustoSelecionados existe (sem clique na célula), usar ele
const codigosArray = codigosCentrosCustoSelecionados const codigosArray = codigosCentrosCustoSelecionados.split(',').filter(c => c.trim() !== '');
.split(',')
.filter((c) => c.trim() !== '');
if (codigosArray.length > 0) { if (codigosArray.length > 0) {
const placeholders = codigosArray const placeholders = codigosArray.map(() => `:${paramIndex++}`).join(',');
.map(() => `:${paramIndex++}`)
.join(',');
sql += ` AND CODIGOCENTROCUSTO IN (${placeholders})`; sql += ` AND CODIGOCENTROCUSTO IN (${placeholders})`;
params.push(...codigosArray); params.push(...codigosArray);
console.log( console.log('🏢 Filtrando por códigos de centros de custo selecionados (filtro geral):', codigosArray);
'🏢 Filtrando por códigos de centros de custo selecionados (filtro geral):', console.log('📝 SQL após adicionar filtro IN:', sql.substring(0, 200) + '...');
codigosArray
);
console.log(
'📝 SQL após adicionar filtro IN:',
sql.substring(0, 200) + '...'
);
} }
} else { } else {
console.log( console.log('⚠️ Nenhum filtro de centro de custo aplicado - ambos estão vazios');
'⚠️ Nenhum filtro de centro de custo aplicado - ambos estão vazios'
);
} }
// Exclusão de centro de custo específico (quando desmarcado) // Exclusão de centro de custo específico (quando desmarcado)
@ -187,33 +147,19 @@ export async function GET(request: NextRequest) {
sql += ` ORDER BY DTVENC, CODFORNEC, CODCONTA`; sql += ` ORDER BY DTVENC, CODFORNEC, CODCONTA`;
// Log detalhado da query SQL final // Log detalhado da query SQL final
console.log( console.log('═══════════════════════════════════════════════════════════════');
'═══════════════════════════════════════════════════════════════'
);
console.log('🗄️ QUERY SQL FINAL:'); console.log('🗄️ QUERY SQL FINAL:');
console.log( console.log('═══════════════════════════════════════════════════════════════');
'═══════════════════════════════════════════════════════════════'
);
console.log(sql); console.log(sql);
console.log( console.log('═══════════════════════════════════════════════════════════════');
'═══════════════════════════════════════════════════════════════' console.log('📋 PARÂMETROS FINAIS (na ordem dos placeholders :1, :2, :3, ...):');
); console.log('═══════════════════════════════════════════════════════════════');
console.log(
'📋 PARÂMETROS FINAIS (na ordem dos placeholders :1, :2, :3, ...):'
);
console.log(
'═══════════════════════════════════════════════════════════════'
);
params.forEach((param, index) => { params.forEach((param, index) => {
console.log(` :${index + 1} = ${param} (${typeof param})`); console.log(` :${index + 1} = ${param} (${typeof param})`);
}); });
console.log( console.log('═══════════════════════════════════════════════════════════════');
'═══════════════════════════════════════════════════════════════'
);
console.log('📊 RESUMO DOS FILTROS APLICADOS:'); console.log('📊 RESUMO DOS FILTROS APLICADOS:');
console.log( console.log('═══════════════════════════════════════════════════════════════');
'═══════════════════════════════════════════════════════════════'
);
console.log({ console.log({
temPeriodo: dataInicio && dataFim, temPeriodo: dataInicio && dataFim,
periodo: dataInicio && dataFim ? `${dataInicio} a ${dataFim}` : 'N/A', periodo: dataInicio && dataFim ? `${dataInicio} a ${dataFim}` : 'N/A',
@ -232,111 +178,60 @@ export async function GET(request: NextRequest) {
temExcluirCentroCusto: !!excluirCentroCusto, temExcluirCentroCusto: !!excluirCentroCusto,
excluirCentroCusto: excluirCentroCusto || 'N/A', excluirCentroCusto: excluirCentroCusto || 'N/A',
temExcluirCodigoConta: !!excluirCodigoConta, temExcluirCodigoConta: !!excluirCodigoConta,
excluirCodigoConta: excluirCodigoConta || 'N/A', excluirCodigoConta: excluirCodigoConta || 'N/A'
}); });
console.log( console.log('═══════════════════════════════════════════════════════════════');
'═══════════════════════════════════════════════════════════════'
);
// Se há centroCusto individual, destacar especialmente // Se há centroCusto individual, destacar especialmente
if (centroCusto && centroCusto.trim() !== '') { if (centroCusto && centroCusto.trim() !== '') {
console.log( console.log('🎯 FILTRO INDIVIDUAL DE CENTRO DE CUSTO ATIVO (clique na célula)');
'🎯 FILTRO INDIVIDUAL DE CENTRO DE CUSTO ATIVO (clique na célula)'
);
console.log(` Centro de Custo: ${centroCusto}`); console.log(` Centro de Custo: ${centroCusto}`);
console.log( console.log(' ⚠️ Este filtro tem PRIORIDADE sobre codigosCentrosCustoSelecionados');
' ⚠️ Este filtro tem PRIORIDADE sobre codigosCentrosCustoSelecionados'
);
} }
console.log( console.log('═══════════════════════════════════════════════════════════════');
'═══════════════════════════════════════════════════════════════'
);
const data = await executeOracleQuery(sql, params); const data = await executeOracleQuery(sql, params);
console.log( console.log('✅ Query executada com sucesso:', data.length, 'registros encontrados');
'✅ Query executada com sucesso:',
data.length,
'registros encontrados'
);
console.log('📝 Primeiros 3 registros:', data.slice(0, 3)); console.log('📝 Primeiros 3 registros:', data.slice(0, 3));
// Transformar os dados do Oracle para o formato esperado pelo componente // Transformar os dados do Oracle para o formato esperado pelo componente
// Usando a view DESPESA_ENTIDADE_ANALITICO // Usando a view DESPESA_ENTIDADE_ANALITICO
const transformedData = data.map((item: any, index: number) => { const transformedData = data.map((item: any) => {
// Gerar ID único: combinar NUMLANC com índice para garantir unicidade
// Se NUMLANC for null/undefined, usar índice + outros campos para criar ID único
const numLanc =
item.NUMLANC !== null && item.NUMLANC !== undefined
? item.NUMLANC
: null;
const uniqueId =
numLanc !== null
? `${numLanc}-${item.CODFORNEC || ''}-${item.CODCONTA || ''}-${
item.CODIGOCENTROCUSTO || ''
}-${index}`
: `row-${item.CODFORNEC || ''}-${item.CODCONTA || ''}-${
item.CODIGOCENTROCUSTO || ''
}-${item.DTVENC || ''}-${index}`;
return { return {
codigo_grupo: item.CODGRUPO || '', codigo_grupo: item.CODGRUPO || "",
codigo_subgrupo: item.SUBGRUPO || '', // SUBGRUPO existe na nova view codigo_subgrupo: item.SUBGRUPO || "", // SUBGRUPO existe na nova view
codigo_fornecedor: item.CODFORNEC || '', codigo_fornecedor: item.CODFORNEC || "",
nome_fornecedor: item.FORNECEDOR || '', nome_fornecedor: item.FORNECEDOR || "",
id: uniqueId, id: item.NUMLANC || 0,
codfilial: '001', // Valor padrão codfilial: "001", // Valor padrão
recnum: numLanc !== null ? numLanc : index, recnum: item.NUMLANC || 0,
data_competencia: item.ANOMESCOMP || '', data_competencia: item.ANOMESCOMP || "",
data_vencimento: item.DTVENC data_vencimento: item.DTVENC ? new Date(item.DTVENC).toISOString().split('T')[0] : "",
? new Date(item.DTVENC).toISOString().split('T')[0] data_pagamento: item.DTPAGTO ? new Date(item.DTPAGTO).toISOString().split('T')[0] : "",
: '', data_caixa: item.DTCAIXA ? new Date(item.DTCAIXA).toISOString().split('T')[0] : "",
data_pagamento: item.DTPAGTO codigo_conta: item.CODCONTA || "",
? new Date(item.DTPAGTO).toISOString().split('T')[0] conta: item.CONTA || "",
: '', codigo_centrocusto: item.CODIGOCENTROCUSTO || "",
data_caixa: item.DTCAIXA centro_custo: item.CENTROCUSTO || "",
? new Date(item.DTCAIXA).toISOString().split('T')[0] valor: item.VLREALIZADO !== null && item.VLREALIZADO !== undefined ? Number(item.VLREALIZADO) : 0,
: '', historico: item.HISTORICO || "",
codigo_conta: item.CODCONTA || '', historico2: item.HISTORICO2 || "",
conta: item.CONTA || '',
codigo_centrocusto: item.CODIGOCENTROCUSTO || '',
centro_custo: item.CENTROCUSTO || '',
valor:
item.VLREALIZADO !== null && item.VLREALIZADO !== undefined
? Number(item.VLREALIZADO)
: 0,
historico: item.HISTORICO || '',
historico2: item.HISTORICO2 || '',
created_at: new Date().toISOString(), created_at: new Date().toISOString(),
updated_at: new Date().toISOString(), updated_at: new Date().toISOString(),
// Campos adicionais do Oracle // Campos adicionais do Oracle
entidade: item.ENTIDADE || '', entidade: item.ENTIDADE || "",
tipo_parceiro: item.TIPOPARCEIRO || '', tipo_parceiro: item.TIPOPARCEIRO || "",
valor_previsto: valor_previsto: item.VLPREVISTO !== null && item.VLPREVISTO !== undefined ? Number(item.VLPREVISTO) : 0,
item.VLPREVISTO !== null && item.VLPREVISTO !== undefined valor_confirmado: item.VLCONFIRMADO !== null && item.VLCONFIRMADO !== undefined ? Number(item.VLCONFIRMADO) : 0,
? Number(item.VLPREVISTO) valor_pago: item.VLPAGO !== null && item.VLPAGO !== undefined ? Number(item.VLPAGO) : 0,
: 0,
valor_confirmado:
item.VLCONFIRMADO !== null && item.VLCONFIRMADO !== undefined
? Number(item.VLCONFIRMADO)
: 0,
valor_pago:
item.VLPAGO !== null && item.VLPAGO !== undefined
? Number(item.VLPAGO)
: 0,
numero_lancamento: item.NUMLANC || 0, numero_lancamento: item.NUMLANC || 0,
ano_mes_comp: item.ANOMESCOMP || '', ano_mes_comp: item.ANOMESCOMP || "",
codgrupo: item.CODGRUPO || '', codgrupo: item.CODGRUPO || "",
// Novos campos // Novos campos
data_lancamento: item.DTLANC data_lancamento: item.DTLANC ? new Date(item.DTLANC).toISOString().split('T')[0] : "",
? new Date(item.DTLANC).toISOString().split('T')[0] data_compensacao: item.DTCOMPENSACAO ? new Date(item.DTCOMPENSACAO).toISOString().split('T')[0] : "",
: '', data_pagto: item.DTPAGTO ? new Date(item.DTPAGTO).toISOString().split('T')[0] : ""
data_compensacao: item.DTCOMPENSACAO
? new Date(item.DTCOMPENSACAO).toISOString().split('T')[0]
: '',
data_pagto: item.DTPAGTO
? new Date(item.DTPAGTO).toISOString().split('T')[0]
: '',
}; };
}); });
@ -344,6 +239,7 @@ export async function GET(request: NextRequest) {
console.log('📝 Primeiros 3 transformados:', transformedData.slice(0, 3)); console.log('📝 Primeiros 3 transformados:', transformedData.slice(0, 3));
return NextResponse.json(transformedData); return NextResponse.json(transformedData);
} catch (error) { } catch (error) {
console.error('❌ Erro ao buscar dados analíticos do Oracle:', error); console.error('❌ Erro ao buscar dados analíticos do Oracle:', error);
@ -351,9 +247,10 @@ export async function GET(request: NextRequest) {
{ {
success: false, success: false,
error: error instanceof Error ? error.message : 'Erro desconhecido', error: error instanceof Error ? error.message : 'Erro desconhecido',
details: error instanceof Error ? error.stack : undefined, details: error instanceof Error ? error.stack : undefined
}, },
{ status: 500 } { status: 500 }
); );
} }
} }

View File

@ -235,30 +235,15 @@ WHERE 1=1`;
// Transformar os dados do Oracle para o formato esperado pelo componente // Transformar os dados do Oracle para o formato esperado pelo componente
// Usando a view VB_DRE_FILIAL_DESPESA_ANALITICO // Usando a view VB_DRE_FILIAL_DESPESA_ANALITICO
const transformedData = data.map((item: any, index: number) => { const transformedData = data.map((item: any) => {
// Gerar ID único: combinar NUMLANC com índice para garantir unicidade
// Se NUMLANC for null/undefined, usar índice + outros campos para criar ID único
const numLanc =
item.NUMLANC !== null && item.NUMLANC !== undefined
? item.NUMLANC
: null;
const uniqueId =
numLanc !== null
? `${numLanc}-${item.CODFORNEC || ''}-${item.CODCONTA || ''}-${
item.CODIGOCENTROCUSTO || ''
}-${index}`
: `row-${item.CODFORNEC || ''}-${item.CODCONTA || ''}-${
item.CODIGOCENTROCUSTO || ''
}-${item.DTVENC || ''}-${index}`;
return { return {
codigo_grupo: item.CODGRUPO || "", codigo_grupo: item.CODGRUPO || "",
codigo_subgrupo: item.SUBGRUPO || "", // SUBGRUPO existe na nova view codigo_subgrupo: item.SUBGRUPO || "", // SUBGRUPO existe na nova view
codigo_fornecedor: item.CODFORNEC || "", codigo_fornecedor: item.CODFORNEC || "",
nome_fornecedor: item.FORNECEDOR || "", nome_fornecedor: item.FORNECEDOR || "",
id: uniqueId, id: item.NUMLANC || 0,
codfilial: item.CODFILIAL || item.FILIAL || "001", // Usar CODFILIAL do JOIN ou FILIAL da view codfilial: item.CODFILIAL || item.FILIAL || "001", // Usar CODFILIAL do JOIN ou FILIAL da view
recnum: numLanc !== null ? numLanc : index, recnum: item.NUMLANC || 0,
data_competencia: item.ANOMESCOMP || "", data_competencia: item.ANOMESCOMP || "",
data_vencimento: item.DTVENC ? new Date(item.DTVENC).toISOString().split('T')[0] : "", data_vencimento: item.DTVENC ? new Date(item.DTVENC).toISOString().split('T')[0] : "",
data_pagamento: item.DTPAGTO ? new Date(item.DTPAGTO).toISOString().split('T')[0] : "", data_pagamento: item.DTPAGTO ? new Date(item.DTPAGTO).toISOString().split('T')[0] : "",

View File

@ -119,7 +119,7 @@ export async function GET(request: NextRequest) {
console.log('📝 Primeiros 3 registros:', data.slice(0, 3)); console.log('📝 Primeiros 3 registros:', data.slice(0, 3));
// Transformar os dados do Oracle para o formato esperado pelo componente // Transformar os dados do Oracle para o formato esperado pelo componente
const transformedData = data.map((item: any, index: number) => { const transformedData = data.map((item: any) => {
// Debug dos valores monetários // Debug dos valores monetários
// console.log('🔍 Item original:', { // console.log('🔍 Item original:', {
// VLREALIZADO: item.VLREALIZADO, // VLREALIZADO: item.VLREALIZADO,
@ -129,29 +129,14 @@ export async function GET(request: NextRequest) {
// tipo_VLREALIZADO: typeof item.VLREALIZADO // tipo_VLREALIZADO: typeof item.VLREALIZADO
// }); // });
// Gerar ID único: combinar NUMLANC com índice para garantir unicidade
// Se NUMLANC for null/undefined, usar índice + outros campos para criar ID único
const numLanc =
item.NUMLANC !== null && item.NUMLANC !== undefined
? item.NUMLANC
: null;
const uniqueId =
numLanc !== null
? `${numLanc}-${item.CODFORNEC || ''}-${item.CODCONTA || ''}-${
item.CODIGOCENTROCUSTO || ''
}-${index}`
: `row-${item.CODFORNEC || ''}-${item.CODCONTA || ''}-${
item.CODIGOCENTROCUSTO || ''
}-${item.DTVENC || ''}-${index}`;
return { return {
codigo_grupo: item.CODGRUPO || "", codigo_grupo: item.CODGRUPO || "",
codigo_subgrupo: "", // Não existe na tabela Oracle codigo_subgrupo: "", // Não existe na tabela Oracle
codigo_fornecedor: item.CODFORNEC || "", codigo_fornecedor: item.CODFORNEC || "",
nome_fornecedor: item.FORNECEDOR || "", nome_fornecedor: item.FORNECEDOR || "",
id: uniqueId, id: item.NUMLANC || 0,
codfilial: "001", // Valor padrão codfilial: "001", // Valor padrão
recnum: numLanc !== null ? numLanc : index, recnum: item.NUMLANC || 0,
data_competencia: item.ANOMESCOMP || "", data_competencia: item.ANOMESCOMP || "",
data_vencimento: item.DTVENC ? new Date(item.DTVENC).toISOString().split('T')[0] : "", data_vencimento: item.DTVENC ? new Date(item.DTVENC).toISOString().split('T')[0] : "",
data_pagamento: item.DTPAGTO ? new Date(item.DTPAGTO).toISOString().split('T')[0] : "", data_pagamento: item.DTPAGTO ? new Date(item.DTPAGTO).toISOString().split('T')[0] : "",

File diff suppressed because it is too large Load Diff

View File

@ -57,7 +57,7 @@ interface AnaliticoItem {
codigo_subgrupo: string; codigo_subgrupo: string;
codigo_fornecedor: string; codigo_fornecedor: string;
nome_fornecedor: string; nome_fornecedor: string;
id: string | number; // Pode ser string (gerado pela API) ou number (legado) id: number;
codfilial: string; codfilial: string;
recnum: number; recnum: number;
data_competencia: string; data_competencia: string;
@ -501,25 +501,10 @@ export default function AnaliticoComponent({ filtros }: AnaliticoProps) {
return filterValues.includes(stringValue); return filterValues.includes(stringValue);
}); });
}) })
.map((row, index) => { .map((row, index) => ({
// Garantir ID único: usar o id original se existir, senão criar baseado em recnum e índice ...row,
const originalId = id: `filtered-${row.id || row.recnum || index}`, // Garantir ID único e estável
row.id !== null && row.id !== undefined }));
? typeof row.id === 'string' && row.id !== ''
? row.id
: String(row.id)
: null;
const recnumValue =
row.recnum !== null && row.recnum !== undefined ? row.recnum : null;
const uniqueId = originalId
? `filtered-${originalId}`
: `filtered-${recnumValue !== null ? recnumValue : 'idx'}-${index}`;
return {
...row,
id: uniqueId, // Garantir ID único e estável (agora é string)
};
});
}, [data, columnFilters]); }, [data, columnFilters]);
// Função para renderizar header com filtro Excel // Função para renderizar header com filtro Excel
@ -1125,24 +1110,9 @@ export default function AnaliticoComponent({ filtros }: AnaliticoProps) {
disableColumnSorting={true} disableColumnSorting={true}
pagination={false} pagination={false}
disableVirtualization={false} disableVirtualization={false}
getRowId={(row: any) => { getRowId={(row: any) =>
// Usar verificação explícita para garantir que id seja usado mesmo se for string vazia row.id || `row-${row.recnum || Math.random()}`
if ( }
row.id !== null &&
row.id !== undefined &&
row.id !== ''
) {
return String(row.id);
}
// Fallback: usar recnum se disponível, senão criar ID único
const recnumValue =
row.recnum !== null && row.recnum !== undefined
? row.recnum
: null;
return recnumValue !== null
? `row-${recnumValue}`
: `row-${Math.random()}-${Date.now()}`;
}}
sx={{ sx={{
height: '100%', height: '100%',
width: '100%', width: '100%',

File diff suppressed because it is too large Load Diff