Merge pull request #68 from JurunenseDevInterno/dev

ajuste nas grid da DRE e dre-entidade, verificado que era exibido mais de uma vez na dre-entidade o mesmo lancamento e não era na query e sim a falta de um id para manter a unicidade dos dados, revalidado tambem nos outros routes para manter a unicidade
This commit is contained in:
Felipe Batista 2025-12-23 13:19:12 -03:00 committed by GitHub
commit a8165af67b
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
6 changed files with 1751 additions and 1377 deletions

File diff suppressed because it is too large Load Diff

View File

@ -1,5 +1,5 @@
import { NextRequest, NextResponse } from 'next/server';
import { executeOracleQuery } from '@/db/oracle'; import { executeOracleQuery } from '@/db/oracle';
import { NextRequest, NextResponse } from 'next/server';
export async function GET(request: NextRequest) { export async function GET(request: NextRequest) {
try { try {
@ -16,14 +16,18 @@ 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('codigosCentrosCustoSelecionados'); const codigosCentrosCustoSelecionados = searchParams.get(
const codigosContasSelecionadas = searchParams.get('codigosContasSelecionadas'); 'codigosCentrosCustoSelecionados'
);
const codigosContasSelecionadas = searchParams.get(
'codigosContasSelecionadas'
);
console.log('🎯 Filtros recebidos na API:', { console.log('🎯 Filtros recebidos na API:', {
dataInicio, dataInicio,
@ -35,14 +39,17 @@ 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: centroCusto === null || centroCusto === undefined || centroCusto === '', vazio:
centroCusto === null || centroCusto === undefined || centroCusto === '',
codigosCentrosCustoSelecionados, codigosCentrosCustoSelecionados,
codigosCentrosCustoSelecionadosVazio: !codigosCentrosCustoSelecionados || codigosCentrosCustoSelecionados === '' codigosCentrosCustoSelecionadosVazio:
!codigosCentrosCustoSelecionados ||
codigosCentrosCustoSelecionados === '',
}); });
// Construir query SQL com filtros usando a view DESPESA_ENTIDADE_ANALITICO // Construir query SQL com filtros usando a view DESPESA_ENTIDADE_ANALITICO
@ -52,10 +59,17 @@ 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 <= :${paramIndex + 1}`; sql += ` AND ANOMESCOMP >= :${paramIndex} AND ANOMESCOMP <= :${
paramIndex + 1
}`;
params.push(dataInicio, dataFim); params.push(dataInicio, dataFim);
paramIndex += 2; paramIndex += 2;
console.log('📅 Adicionando filtro de período:', dataInicio, 'a', dataFim); console.log(
'📅 Adicionando filtro de período:',
dataInicio,
'a',
dataFim
);
} }
// Filtro por código do grupo // Filtro por código do grupo
@ -87,12 +101,15 @@ 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: !codigosCentrosCustoSelecionados || codigosCentrosCustoSelecionados.trim() === '', codigosCentrosCustoSelecionadosVazio:
!codigosCentrosCustoSelecionados ||
codigosCentrosCustoSelecionados.trim() === '',
centroCustoVazio: !centroCusto || centroCusto.trim() === '', centroCustoVazio: !centroCusto || centroCusto.trim() === '',
centroCustoLength: centroCusto?.length, centroCustoLength: centroCusto?.length,
codigosCentrosCustoSelecionadosLength: codigosCentrosCustoSelecionados?.length codigosCentrosCustoSelecionadosLength:
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() !== '') {
@ -101,21 +118,44 @@ export async function GET(request: NextRequest) {
sql += ` AND CODIGOCENTROCUSTO = :${paramIndex}`; sql += ` AND CODIGOCENTROCUSTO = :${paramIndex}`;
params.push(centroCusto); params.push(centroCusto);
paramIndex++; paramIndex++;
console.log('🏢 PRIORIDADE: Filtrando APENAS por centroCusto individual (clique na célula):', centroCusto); console.log(
console.log('⚠️ Ignorando codigosCentrosCustoSelecionados do filtro geral quando há centroCusto individual'); '🏢 PRIORIDADE: Filtrando APENAS por centroCusto individual (clique na célula):',
console.log('📝 SQL após adicionar filtro =:', sql.substring(0, 200) + '...'); centroCusto
} 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.split(',').filter(c => c.trim() !== ''); const codigosArray = codigosCentrosCustoSelecionados
.split(',')
.filter((c) => c.trim() !== '');
if (codigosArray.length > 0) { if (codigosArray.length > 0) {
const placeholders = codigosArray.map(() => `:${paramIndex++}`).join(','); const placeholders = codigosArray
.map(() => `:${paramIndex++}`)
.join(',');
sql += ` AND CODIGOCENTROCUSTO IN (${placeholders})`; sql += ` AND CODIGOCENTROCUSTO IN (${placeholders})`;
params.push(...codigosArray); params.push(...codigosArray);
console.log('🏢 Filtrando por códigos de centros de custo selecionados (filtro geral):', codigosArray); console.log(
console.log('📝 SQL após adicionar filtro IN:', sql.substring(0, 200) + '...'); '🏢 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 { } else {
console.log('⚠️ Nenhum filtro de centro de custo aplicado - ambos estão vazios'); console.log(
'⚠️ 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)
@ -147,19 +187,33 @@ 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',
@ -178,60 +232,111 @@ 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('🎯 FILTRO INDIVIDUAL DE CENTRO DE CUSTO ATIVO (clique na célula)'); console.log(
'🎯 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(' ⚠️ Este filtro tem PRIORIDADE sobre codigosCentrosCustoSelecionados'); console.log(
' ⚠️ Este filtro tem PRIORIDADE sobre codigosCentrosCustoSelecionados'
);
} }
console.log('═══════════════════════════════════════════════════════════════'); console.log(
'═══════════════════════════════════════════════════════════════'
);
const data = await executeOracleQuery(sql, params); const data = await executeOracleQuery(sql, params);
console.log('✅ Query executada com sucesso:', data.length, 'registros encontrados'); console.log(
'✅ 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) => { const transformedData = data.map((item: any, index: number) => {
// 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: item.NUMLANC || 0, id: uniqueId,
codfilial: "001", // Valor padrão codfilial: '001', // Valor padrão
recnum: item.NUMLANC || 0, recnum: numLanc !== null ? numLanc : index,
data_competencia: item.ANOMESCOMP || "", data_competencia: item.ANOMESCOMP || '',
data_vencimento: item.DTVENC ? new Date(item.DTVENC).toISOString().split('T')[0] : "", data_vencimento: item.DTVENC
data_pagamento: item.DTPAGTO ? new Date(item.DTPAGTO).toISOString().split('T')[0] : "", ? new Date(item.DTVENC).toISOString().split('T')[0]
data_caixa: item.DTCAIXA ? new Date(item.DTCAIXA).toISOString().split('T')[0] : "", : '',
codigo_conta: item.CODCONTA || "", data_pagamento: item.DTPAGTO
conta: item.CONTA || "", ? new Date(item.DTPAGTO).toISOString().split('T')[0]
codigo_centrocusto: item.CODIGOCENTROCUSTO || "", : '',
centro_custo: item.CENTROCUSTO || "", data_caixa: item.DTCAIXA
valor: item.VLREALIZADO !== null && item.VLREALIZADO !== undefined ? Number(item.VLREALIZADO) : 0, ? new Date(item.DTCAIXA).toISOString().split('T')[0]
historico: item.HISTORICO || "", : '',
historico2: item.HISTORICO2 || "", codigo_conta: item.CODCONTA || '',
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: item.VLPREVISTO !== null && item.VLPREVISTO !== undefined ? Number(item.VLPREVISTO) : 0, valor_previsto:
valor_confirmado: item.VLCONFIRMADO !== null && item.VLCONFIRMADO !== undefined ? Number(item.VLCONFIRMADO) : 0, item.VLPREVISTO !== null && item.VLPREVISTO !== undefined
valor_pago: item.VLPAGO !== null && item.VLPAGO !== undefined ? Number(item.VLPAGO) : 0, ? Number(item.VLPREVISTO)
: 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 ? new Date(item.DTLANC).toISOString().split('T')[0] : "", data_lancamento: item.DTLANC
data_compensacao: item.DTCOMPENSACAO ? new Date(item.DTCOMPENSACAO).toISOString().split('T')[0] : "", ? new Date(item.DTLANC).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]
: '',
}; };
}); });
@ -239,7 +344,6 @@ 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);
@ -247,10 +351,9 @@ 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,15 +235,30 @@ 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) => { const transformedData = data.map((item: any, index: number) => {
// 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: item.NUMLANC || 0, id: uniqueId,
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: item.NUMLANC || 0, recnum: numLanc !== null ? numLanc : index,
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) => { const transformedData = data.map((item: any, index: number) => {
// 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,14 +129,29 @@ 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: item.NUMLANC || 0, id: uniqueId,
codfilial: "001", // Valor padrão codfilial: "001", // Valor padrão
recnum: item.NUMLANC || 0, recnum: numLanc !== null ? numLanc : index,
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: number; id: string | number; // Pode ser string (gerado pela API) ou number (legado)
codfilial: string; codfilial: string;
recnum: number; recnum: number;
data_competencia: string; data_competencia: string;
@ -501,10 +501,25 @@ export default function AnaliticoComponent({ filtros }: AnaliticoProps) {
return filterValues.includes(stringValue); return filterValues.includes(stringValue);
}); });
}) })
.map((row, index) => ({ .map((row, index) => {
...row, // Garantir ID único: usar o id original se existir, senão criar baseado em recnum e índice
id: `filtered-${row.id || row.recnum || index}`, // Garantir ID único e estável const originalId =
})); 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
@ -1110,9 +1125,24 @@ export default function AnaliticoComponent({ filtros }: AnaliticoProps) {
disableColumnSorting={true} disableColumnSorting={true}
pagination={false} pagination={false}
disableVirtualization={false} disableVirtualization={false}
getRowId={(row: any) => getRowId={(row: any) => {
row.id || `row-${row.recnum || Math.random()}` // Usar verificação explícita para garantir que id seja usado mesmo se for string vazia
} 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%',