diff --git a/src/services/importacao/parseCSV.ts b/src/services/importacao/parseCSV.ts index 8447fa8..ce8ac62 100644 --- a/src/services/importacao/parseCSV.ts +++ b/src/services/importacao/parseCSV.ts @@ -16,15 +16,34 @@ export async function parseCSV(file: File, contaBancariaId?: string): Promise { try { const transacoes: TransacaoImportada[] = []; - const data = results.data as any[]; + const linhas = results.data as any[][]; // matriz de linhas - if (data.length === 0) { + if (!linhas || linhas.length === 0) { throw new Error('Arquivo CSV vazio'); } - // Tentar detectar colunas automaticamente - const primeiraLinha = data[0]; - const colunas = Object.keys(primeiraLinha); + // Encontrar linha de cabeçalho real (que contém "Data" e "Valor" etc.) + let headerIndex = -1; + for (let i = 0; i < linhas.length; i++) { + const row = linhas[i]; + if (!row || row.length === 0) continue; + + const primeiraColuna = String(row[0] ?? '').toLowerCase().normalize('NFD').replace(/[\u0300-\u036f]/g, ''); + const segundaColuna = String(row[1] ?? '').toLowerCase().normalize('NFD').replace(/[\u0300-\u036f]/g, ''); + + // Ex: "Data Lançamento" | "Histórico" | "Descrição" | "Valor" | "Saldo" + if (primeiraColuna.includes('data') && (segundaColuna.includes('historico') || segundaColuna.includes('descricao'))) { + headerIndex = i; + break; + } + } + + if (headerIndex === -1) { + throw new Error('Não foi possível identificar o cabeçalho do arquivo (linha com Data/Histórico/Valor)'); + } + + const headerRow = linhas[headerIndex]; + const colunas = headerRow.map((c) => String(c ?? '')); // Encontrar colunas relevantes (suporta nomes com acentos e espaços) const colunaData = detectarColuna(colunas, ['data', 'date', 'quando', 'dt', 'lancamento']); @@ -36,10 +55,19 @@ export async function parseCSV(file: File, contaBancariaId?: string): Promise = {}; + colunas.forEach((col, idx) => { + rowObj[col] = linha[idx]; + }); + + const dataStr = rowObj[colunaData]; + const descricao = limparDescricao(String(rowObj[colunaDescricao] || '')); + const valorStr = String(rowObj[colunaValor] || '0'); // Parse de data (tenta vários formatos) const data = parseData(dataStr); @@ -51,9 +79,11 @@ export async function parseCSV(file: File, contaBancariaId?: string): Promise= 0 ? 'entrada' : 'saida'; }