Ajustar CSV parsing
Refactor do parser CSV para suportar CSV com delimitador ponto-e-vírgula, cabeçalhos de várias linhas, e formato brasileiro de números (ponto para milhares, vírgula para decimal). Adicionado mapeamento de colunas robusto e tratamento de valores negativos, garantindo que as transações importadas não gerem duplicatas com o estado atual. X-Lovable-Edit-ID: edt-7c96a5a4-c4c5-4829-843c-babdb3755a30
This commit is contained in:
commit
bac21bec6d
@ -12,6 +12,7 @@ export async function parseCSV(file: File, contaBancariaId?: string): Promise<Tr
|
|||||||
Papa.parse(file, {
|
Papa.parse(file, {
|
||||||
header: true,
|
header: true,
|
||||||
skipEmptyLines: true,
|
skipEmptyLines: true,
|
||||||
|
delimiter: ';', // Suporta CSV com ponto e vírgula
|
||||||
complete: (results) => {
|
complete: (results) => {
|
||||||
try {
|
try {
|
||||||
const transacoes: TransacaoImportada[] = [];
|
const transacoes: TransacaoImportada[] = [];
|
||||||
@ -25,8 +26,8 @@ export async function parseCSV(file: File, contaBancariaId?: string): Promise<Tr
|
|||||||
const primeiraLinha = data[0];
|
const primeiraLinha = data[0];
|
||||||
const colunas = Object.keys(primeiraLinha);
|
const colunas = Object.keys(primeiraLinha);
|
||||||
|
|
||||||
// Encontrar colunas relevantes
|
// Encontrar colunas relevantes (suporta nomes com acentos e espaços)
|
||||||
const colunaData = detectarColuna(colunas, ['data', 'date', 'quando', 'dt']);
|
const colunaData = detectarColuna(colunas, ['data', 'date', 'quando', 'dt', 'lancamento']);
|
||||||
const colunaDescricao = detectarColuna(colunas, ['descricao', 'description', 'historico', 'memo', 'estabelecimento']);
|
const colunaDescricao = detectarColuna(colunas, ['descricao', 'description', 'historico', 'memo', 'estabelecimento']);
|
||||||
const colunaValor = detectarColuna(colunas, ['valor', 'value', 'amount', 'quantia']);
|
const colunaValor = detectarColuna(colunas, ['valor', 'value', 'amount', 'quantia']);
|
||||||
const colunaTipo = detectarColuna(colunas, ['tipo', 'type', 'natureza', 'credito', 'debito']);
|
const colunaTipo = detectarColuna(colunas, ['tipo', 'type', 'natureza', 'credito', 'debito']);
|
||||||
@ -114,11 +115,20 @@ function parseData(dataStr: string): string | null {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function parseValor(valorStr: string): number {
|
function parseValor(valorStr: string): number {
|
||||||
// Remove símbolos de moeda, espaços e converte vírgula em ponto
|
// Remove símbolos de moeda e espaços
|
||||||
const valorLimpo = valorStr
|
let valorLimpo = valorStr.replace(/[R$\s€£¥]/g, '').trim();
|
||||||
.replace(/[R$\s€£¥]/g, '')
|
|
||||||
.replace(/\./g, '')
|
// Detecta formato brasileiro (usa vírgula como decimal)
|
||||||
.replace(',', '.');
|
// Ex: 1.234,56 ou -2.390,22
|
||||||
|
if (valorLimpo.includes(',')) {
|
||||||
|
valorLimpo = valorLimpo.replace(/\./g, '').replace(',', '.');
|
||||||
|
}
|
||||||
|
// Senão, assume formato americano (ponto como decimal)
|
||||||
|
// Ex: 1234.56 ou 1,234.56
|
||||||
|
else if (valorLimpo.includes('.')) {
|
||||||
|
// Remove vírgulas de milhares se existirem
|
||||||
|
valorLimpo = valorLimpo.replace(/,/g, '');
|
||||||
|
}
|
||||||
|
|
||||||
return parseFloat(valorLimpo);
|
return parseFloat(valorLimpo);
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user