Skip to content
Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
110 changes: 55 additions & 55 deletions php/index-light.php
Original file line number Diff line number Diff line change
Expand Up @@ -1441,23 +1441,23 @@ function executeLimport($ledgerFile, $csvFile, $account, $setSearch, $options =
return "Error: CSV file '$csvFile' not found.";
}

// DEBUG: Log das opções
// DEBUG: Log das opções
error_log("Limport options received: " . print_r($options, true));

// Construir comando na ORDEM CORRETA
$command = 'php ' . escapeshellarg($limportPath);

// 1. Primeiro: flag -f obrigatória
// 1. Primeiro: flag -f obrigatória
$command .= ' -f ' . escapeshellarg($ledgerFile);

// 2. Depois: --set-search obrigatório
// 2. Depois: --set-search obrigatório
if (empty($setSearch)) {
$setSearch = 'Expenses';
}
$command .= ' --set-search=' . escapeshellarg($setSearch);

// 3. Flags booleanas (--neg, --allow-matching, --wide) - CORREÇÃO AQUI
// Verificar se a opção existe e é verdadeira, EXATAMENTE como --wide
// 3. Flags booleanas (--neg, --allow-matching, --wide) - CORREÇÃO AQUI
// Verificar se a opção existe e é verdadeira, EXATAMENTE como --wide
if (isset($options['neg']) && $options['neg'] === true) {
$command .= ' --neg';
error_log("Adding --neg flag to command");
Expand All @@ -1473,7 +1473,7 @@ function executeLimport($ledgerFile, $csvFile, $account, $setSearch, $options =
error_log("Adding --wide flag to command");
}

// 4. Opções com valores (apenas se não for padrão)
// 4. Opções com valores (apenas se não for padrão)
if (isset($options['scale']) && (float)$options['scale'] != 1.0) {
$command .= ' --scale=' . escapeshellarg((string)$options['scale']);
}
Expand All @@ -1486,7 +1486,7 @@ function executeLimport($ledgerFile, $csvFile, $account, $setSearch, $options =
$command .= ' --delimiter=' . escapeshellarg($options['delimiter']);
}

// 5. Argumentos posicionais DEVEM ser os ÚLTIMOS: <account> <csv-file>
// 5. Argumentos posicionais DEVEM ser os ÚLTIMOS: <account> <csv-file>
$command .= ' ' . escapeshellarg($account);
$command .= ' ' . escapeshellarg($csvFile);

Expand All @@ -1509,29 +1509,29 @@ function executeLimport($ledgerFile, $csvFile, $account, $setSearch, $options =
if (strpos($result, 'Insufficient arguments') !== false ||
strpos($result, 'Error:') === 0) {

// Tentar abordagem alternativa: colocar --set-search como espaço separado
// Tentar abordagem alternativa: colocar --set-search como espaço separado
$altCommand = 'php ' . escapeshellarg($limportPath);
$altCommand .= ' -f ' . escapeshellarg($ledgerFile);
// --neg se necessário - CORREÇÃO AQUI TAMBÉM

// --neg se necessário - CORREÇÃO AQUI TAMBÉM
if (isset($options['neg']) && $options['neg'] === true) {
$altCommand .= ' --neg';
}

// --allow-matching se necessário
// --allow-matching se necessário
if (isset($options['allow_matching']) && $options['allow_matching'] === true) {
$altCommand .= ' --allow-matching';
}

// --wide se necessário
// --wide se necessário
if (isset($options['wide']) && $options['wide'] === true) {
$altCommand .= ' --wide';
}

// --set-search com espaço (não com =)
// --set-search com espaço (não com =)
$altCommand .= ' --set-search ' . escapeshellarg($setSearch);

// Opções com valores
// Opções com valores
if (isset($options['scale']) && (float)$options['scale'] != 1.0) {
$altCommand .= ' --scale=' . escapeshellarg((string)$options['scale']);
}
Expand All @@ -1544,7 +1544,7 @@ function executeLimport($ledgerFile, $csvFile, $account, $setSearch, $options =
$altCommand .= ' --delimiter=' . escapeshellarg($options['delimiter']);
}

// Argumentos posicionais (CONTA e ARQUIVO CSV) - ÚLTIMOS!
// Argumentos posicionais (CONTA e ARQUIVO CSV) - ÚLTIMOS!
$altCommand .= ' ' . escapeshellarg($account);
$altCommand .= ' ' . escapeshellarg($csvFile);

Expand Down Expand Up @@ -1637,7 +1637,7 @@ function importCSV($ledgerFile, $isPreview = false) {
return "Error: Account is required for CSV import.";
}

// Prepare options - CORREÇÃO CRÍTICA AQUI
// Prepare options - CORREÇÃO CRÍTICA AQUI
// Processar checkboxes da mesma forma que --wide
$options = [
'neg' => isset($_POST['csv_neg']) && ($_POST['csv_neg'] == '1' || $_POST['csv_neg'] == 'on'),
Expand Down Expand Up @@ -1674,16 +1674,16 @@ function importCSV($ledgerFile, $isPreview = false) {
}

// ==========================================================
// CORREÇÃO COMPLETA DA FORMATAÇÃO DO ARQUIVO
// CORREÇÃO COMPLETA DA FORMATAÇÃO DO ARQUIVO
// ==========================================================

// 1. Ler conteúdo atual do arquivo ledger
// 1. Ler conteúdo atual do arquivo ledger
$content = file_get_contents($ledgerFile);

// 2. Remover TODAS as quebras de linha extras no final
$content = rtrim($content);

// 3. Extrair transações do output (remover cabeçalho de preview se existir)
// 3. Extrair transações do output (remover cabeçalho de preview se existir)
$transactionsOutput = $output;
if (strpos($output, '=== CSV IMPORT PREVIEW ===') !== false) {
$lines = explode("\n", $output);
Expand All @@ -1700,17 +1700,17 @@ function importCSV($ledgerFile, $isPreview = false) {
$transactionsOutput = preg_replace('/\n=== PREVIEW MODE ===.*/s', '', $transactionsOutput);
}

// 4. Limpar o output das transações
// 4. Limpar o output das transações
$transactionsOutput = trim($transactionsOutput);

// Se não há transações para importar, retornar
// Se não há transações para importar, retornar
if (empty($transactionsOutput)) {
return "No transactions were imported from CSV.";
}

// 5. PROCESSAMENTO CRÍTICO: Garantir formatação correta das transações
// Cada transação deve terminar com \n\n (duas quebras de linha)
// O arquivo final deve terminar com \n\n\n (três quebras de linha)
// 5. PROCESSAMENTO CRÍTICO: Garantir formatação correta das transações
// Cada transação deve terminar com \n\n (duas quebras de linha)
// O arquivo final deve terminar com \n\n\n (três quebras de linha)

// Dividir por linhas
$lines = explode("\n", $transactionsOutput);
Expand All @@ -1721,71 +1721,71 @@ function importCSV($ledgerFile, $isPreview = false) {
foreach ($lines as $line) {
$trimmedLine = trim($line);

// Se é início de nova transação (linha com data YYYY/MM/DD)
// Se é início de nova transação (linha com data YYYY/MM/DD)
if (preg_match('/^\d{4}\/\d{2}\/\d{2}\s/', $line)) {
// Se já estávamos em uma transação, processar a transação anterior
// Se já estávamos em uma transação, processar a transação anterior
if ($inTransaction && !empty($transactionLines)) {
// Adicionar transação formatada
// Adicionar transação formatada
foreach ($transactionLines as $transLine) {
$formattedLines[] = $transLine;
}
// Adicionar linha em branco após a transação (\n\n)
// Adicionar linha em branco após a transação (\n\n)
$formattedLines[] = '';
$transactionLines = [];
}

// Iniciar nova transação
// Iniciar nova transação
$inTransaction = true;
$transactionLines[] = $line;
}
// Se é linha dentro de uma transação (comentário ou conta)
// Se é linha dentro de uma transação (comentário ou conta)
elseif ($inTransaction) {
// Linha vazia dentro de transação - ignorar (não deve ter)
// Linha vazia dentro de transação - ignorar (não deve ter)
if ($trimmedLine === '') {
continue;
}
$transactionLines[] = $line;
}
// Linha fora de transação (não deveria acontecer)
// Linha fora de transação (não deveria acontecer)
else {
$formattedLines[] = $line;
}
}

// Processar última transação
// Processar última transação
if ($inTransaction && !empty($transactionLines)) {
foreach ($transactionLines as $transLine) {
$formattedLines[] = $transLine;
}
// Adicionar linha em branco após a última transação (\n\n)
// Adicionar linha em branco após a última transação (\n\n)
$formattedLines[] = '';
}

// Remover última linha em branco se for a única (será adicionada depois)
// Remover última linha em branco se for a única (será adicionada depois)
if (end($formattedLines) === '' && count($formattedLines) > 1) {
array_pop($formattedLines);
}

// Reconstruir transactionsOutput formatado
$transactionsOutput = implode("\n", $formattedLines);

// 6. PREPARAR CONTEÚDO FINAL DO ARQUIVO
// 6. PREPARAR CONTEÚDO FINAL DO ARQUIVO

// Se o arquivo original tem conteúdo
// Se o arquivo original tem conteúdo
if (!empty(trim($content))) {
// Remover quebras de linha extras no final
$content = rtrim($content);

// Verificar o final do conteúdo atual
// Verificar o final do conteúdo atual
$contentLength = strlen($content);
$lastChars = '';
if ($contentLength >= 3) {
$lastChars = substr($content, -3);
}

// Se o conteúdo já termina com \n\n\n, manter
// Se o conteúdo já termina com \n\n\n, manter
if ($lastChars === "\n\n\n") {
// Já está correto, não fazer nada
// Já está correto, não fazer nada
}
// Se termina com \n\n, adicionar mais um \n
elseif (substr($content, -2) === "\n\n") {
Expand All @@ -1795,17 +1795,17 @@ function importCSV($ledgerFile, $isPreview = false) {
elseif (substr($content, -1) === "\n") {
$content .= "\n\n";
}
// Se não termina com \n, adicionar três \n
// Se não termina com \n, adicionar três \n
else {
$content .= "\n\n\n";
}
}

// 7. ADICIONAR NOVAS TRANSAÇÕES
// 7. ADICIONAR NOVAS TRANSAÇՕES

// Se transactionsOutput não está vazio
// Se transactionsOutput não está vazio
if (!empty(trim($transactionsOutput))) {
// Se já há conteúdo e não termina com \n\n, ajustar
// Se já há conteúdo e não termina com \n\n, ajustar
if (!empty(trim($content)) && substr(rtrim($content), -2) !== "\n\n") {
$content = rtrim($content);
if (substr($content, -1) === "\n") {
Expand All @@ -1815,26 +1815,26 @@ function importCSV($ledgerFile, $isPreview = false) {
}
}

// Adicionar transações
// Adicionar transações
$content .= $transactionsOutput;
}

// 8. GARANTIR FORMATAÇÃO FINAL DO ARQUIVO
// 8. GARANTIR FORMATAÇÃO FINAL DO ARQUIVO

// Remover espaços em branco extras no final
// Remover espaços em branco extras no final
$content = rtrim($content);

// Garantir que o arquivo termine com \n\n\n (três quebras de linha)
// Garantir que o arquivo termine com \n\n\n (três quebras de linha)
// Isso significa 2 linhas em branco no final
$content .= "\n\n\n";

// 9. SALVAR ARQUIVO

if (file_put_contents($ledgerFile, $content, LOCK_EX) !== false) {
// Tentar definir permissões restritivas
// Tentar definir permissões restritivas
@chmod($ledgerFile, 0600);

// Contar transações importadas
// Contar transações importadas
$transactionCount = 0;
$lines = explode("\n", $transactionsOutput);
foreach ($lines as $line) {
Expand Down Expand Up @@ -2997,7 +2997,7 @@ function e($text) {
}

.advanced-options h4:after {
content: '▌';
content: '';
font-size: 10px;
transition: transform 0.2s;
}
Expand Down Expand Up @@ -3644,15 +3644,15 @@ function previewCSV() {
return;
}

// Create FormData - CORREÇÃO: Enviar '1' para checked e '' para não checked
// Create FormData - CORREÇÃO: Enviar '1' para checked e '' para não checked
const formData = new FormData();
formData.append('ajax_preview_csv', '1');
formData.append('ajax_file', currentFile);
formData.append('csv_file', csvFileInput.files[0]);
formData.append('csv_account', csvAccount);
formData.append('csv_set_search', csvSetSearch);

// CORREÇÃO CRÍTICA: Enviar checkboxes como '1' ou 'on' quando marcados
// CORREÇÃO CRÍTICA: Enviar checkboxes como '1' ou 'on' quando marcados
formData.append('csv_neg', document.getElementById('csv_neg').checked ? '1' : '');
formData.append('csv_allow_matching', document.getElementById('csv_allow_matching').checked ? '1' : '');
formData.append('csv_wide', document.getElementById('csv_wide').checked ? '1' : '');
Expand Down Expand Up @@ -4009,15 +4009,15 @@ function importCSV() {
return;
}

// Create FormData - CORREÇÃO: Enviar '1' para checked e '' para não checked
// Create FormData - CORREÇÃO: Enviar '1' para checked e '' para não checked
const formData = new FormData();
formData.append('ajax_import_csv', '1');
formData.append('ajax_file', currentFile);
formData.append('csv_file', csvFileInput.files[0]);
formData.append('csv_account', csvAccount);
formData.append('csv_set_search', csvSetSearch);

// CORREÇÃO CRÍTICA: Enviar checkboxes como '1' ou 'on' quando marcados
// CORREÇÃO CRÍTICA: Enviar checkboxes como '1' ou 'on' quando marcados
formData.append('csv_neg', document.getElementById('csv_neg').checked ? '1' : '');
formData.append('csv_allow_matching', document.getElementById('csv_allow_matching').checked ? '1' : '');
formData.append('csv_wide', document.getElementById('csv_wide').checked ? '1' : '');
Expand Down