Some better feedback in the import process.

This commit is contained in:
James Cole
2016-08-13 14:22:40 +02:00
parent c4d6aaeef3
commit ef876a165a
8 changed files with 73 additions and 15 deletions

View File

@@ -13,6 +13,7 @@ namespace FireflyIII\Console\Commands;
use FireflyIII\Crud\Account\AccountCrud; use FireflyIII\Crud\Account\AccountCrud;
use FireflyIII\Import\Importer\ImporterInterface; use FireflyIII\Import\Importer\ImporterInterface;
use FireflyIII\Import\ImportResult;
use FireflyIII\Import\ImportStorage; use FireflyIII\Import\ImportStorage;
use FireflyIII\Import\ImportValidator; use FireflyIII\Import\ImportValidator;
use FireflyIII\Import\Logging\CommandHandler; use FireflyIII\Import\Logging\CommandHandler;
@@ -70,6 +71,8 @@ class Import extends Command
return; return;
} }
$job->status = 'import_running';
$job->save();
$this->line('Going to import job with key "' . $job->key . '" of type ' . $job->file_type); $this->line('Going to import job with key "' . $job->key . '" of type ' . $job->file_type);
$valid = array_keys(config('firefly.import_formats')); $valid = array_keys(config('firefly.import_formats'));
@@ -105,9 +108,25 @@ class Import extends Command
$storage->setUser($job->user); $storage->setUser($job->user);
// and run store routine: // and run store routine:
$storage->store(); $result = $storage->store();
$job->status = 'import_complete';
$job->save();
/**
* @var int $index
* @var ImportResult $entry
*/
foreach ($result as $index => $entry) {
if ($entry->isSuccess()) {
$this->line(sprintf('Line #%d has been imported as transaction #%d.', $index, $entry->journal->id));
continue;
}
$errors = join(', ', $entry->errors->all());
$this->error(sprintf('Could not store line #%d, because: %s', $index, $errors));
}
$this->line('Something something import: ' . $jobKey); $this->line('The import has completed.');
} }
} }

View File

@@ -80,7 +80,7 @@ class AssetAccountNumber extends BasicConverter implements ConverterInterface
if (is_null($account->id)) { if (is_null($account->id)) {
$this->setCertainty(0); $this->setCertainty(0);
Log::notice('Could not store new asset account by account number', $account->getErrors()->toArray()); Log::info('Could not store new asset account by account number', $account->getErrors()->toArray());
return new Account; return new Account;
} }

View File

@@ -37,8 +37,8 @@ class Date extends BasicConverter implements ConverterInterface
try { try {
$date = Carbon::createFromFormat($this->config['date-format'], $value); $date = Carbon::createFromFormat($this->config['date-format'], $value);
} catch (InvalidArgumentException $e) { } catch (InvalidArgumentException $e) {
Log::notice($e->getMessage()); Log::info($e->getMessage());
Log::notice('Cannot convert this string using the given format.', ['value' => $value, 'format' => $this->config['date-format']]); Log::info('Cannot convert this string using the given format.', ['value' => $value, 'format' => $this->config['date-format']]);
$this->setCertainty(0); $this->setCertainty(0);
return new Carbon; return new Carbon;
} }

View File

@@ -56,7 +56,7 @@ class OpposingAccountIban extends BasicConverter implements ConverterInterface
$account = $repository->findByIban($value, []); $account = $repository->findByIban($value, []);
if (!is_null($account->id)) { if (!is_null($account->id)) {
Log::debug('Found account by IBAN', ['id' => $account->id]); Log::debug('Found account by IBAN', ['id' => $account->id]);
Log::notice( Log::info(
'The match between IBAN and account is uncertain because the type of transactions may not have been determined.', 'The match between IBAN and account is uncertain because the type of transactions may not have been determined.',
['id' => $account->id, 'iban' => $value] ['id' => $account->id, 'iban' => $value]
); );

View File

@@ -10,6 +10,8 @@
declare(strict_types = 1); declare(strict_types = 1);
namespace FireflyIII\Import; namespace FireflyIII\Import;
use FireflyIII\Models\TransactionJournal;
use Illuminate\Support\Collection; use Illuminate\Support\Collection;
/** /**
@@ -25,6 +27,8 @@ class ImportResult
/** @var Collection */ /** @var Collection */
public $errors; public $errors;
/** @var TransactionJournal */
public $journal;
/** @var Collection */ /** @var Collection */
public $messages; public $messages;
/** @var int */ /** @var int */
@@ -102,6 +106,14 @@ class ImportResult
return $this; return $this;
} }
/**
* @return bool
*/
public function isSuccess(): bool
{
return $this->status === self::IMPORT_SUCCESS;
}
/** /**
* @param Collection $errors * @param Collection $errors
*/ */
@@ -110,6 +122,14 @@ class ImportResult
$this->errors = $errors; $this->errors = $errors;
} }
/**
* @param TransactionJournal $journal
*/
public function setJournal(TransactionJournal $journal)
{
$this->journal = $journal;
}
/** /**
* @param Collection $messages * @param Collection $messages
*/ */

View File

@@ -53,15 +53,20 @@ class ImportStorage
} }
/** /**
* * @return Collection
*/ */
public function store() public function store(): Collection
{ {
$collection = new Collection;
Log::notice(sprintf('Started storing %d entry(ies).', $this->entries->count()));
foreach ($this->entries as $index => $entry) { foreach ($this->entries as $index => $entry) {
Log::debug(sprintf('--- import store start for row %d ---', $index)); Log::debug(sprintf('--- import store start for row %d ---', $index));
$this->storeSingle($index, $entry); $result = $this->storeSingle($index, $entry);
$collection->put($index, $result);
} }
Log::notice(sprintf('Finished storing %d entry(ies).', $collection->count()));
return $collection;
} }
/** /**
@@ -200,10 +205,10 @@ class ImportStorage
private function storeSingle(int $index, ImportEntry $entry): ImportResult private function storeSingle(int $index, ImportEntry $entry): ImportResult
{ {
if ($entry->valid === false) { if ($entry->valid === false) {
Log::error(sprintf('Cannot import row %d, because valid=false', $index)); Log::warning(sprintf('Cannot import row %d, because valid=false', $index));
$result = new ImportResult(); $result = new ImportResult();
$result->failed(); $result->failed();
$result->appendError(sprintf('Cannot import row %d, because valid=false', $index)); $result->appendError(sprintf('Cannot import row %d, because the current line is not valid.', $index));
return $result; return $result;
} }
@@ -242,6 +247,13 @@ class ImportStorage
$this->storeCategory($journal, $entry); $this->storeCategory($journal, $entry);
$this->storeBill($journal, $entry); $this->storeBill($journal, $entry);
$result = new ImportResult();
$result->success();
$result->appendMessage(sprintf('Journal titled "%s" imported.', $journal->description));
$result->setJournal($journal);
return $result;
} }
} }

View File

@@ -50,6 +50,7 @@ class ImportValidator
*/ */
public function clean(): Collection public function clean(): Collection
{ {
Log::notice(sprintf('Started validating %d entry(ies).', $this->entries->count()));
$newCollection = new Collection; $newCollection = new Collection;
/** @var ImportEntry $entry */ /** @var ImportEntry $entry */
foreach ($this->entries as $index => $entry) { foreach ($this->entries as $index => $entry) {
@@ -71,6 +72,7 @@ class ImportValidator
$newCollection->put($index, $entry); $newCollection->put($index, $entry);
} }
Log::notice(sprintf('Finished validating %d entry(ies).', $newCollection->count()));
return $newCollection; return $newCollection;
} }
@@ -100,7 +102,7 @@ class ImportValidator
{ {
if ($entry->fields['amount'] == 0) { if ($entry->fields['amount'] == 0) {
$entry->valid = false; $entry->valid = false;
Log::error('Amount of transaction is zero, cannot handle.'); Log::warning('Amount of transaction is zero, cannot handle.');
return $entry; return $entry;
} }
@@ -229,7 +231,7 @@ class ImportValidator
// default import is null? should not happen. Entry cannot be imported. // default import is null? should not happen. Entry cannot be imported.
// set error message and block. // set error message and block.
$entry->valid = false; $entry->valid = false;
Log::error('Cannot import entry. Asset account is NULL and import account is also NULL.'); Log::warning('Cannot import entry. Asset account is NULL and import account is also NULL.');
} }
Log::debug('Asset account is OK.', ['id' => $entry->fields['asset-account']->id, 'name' => $entry->fields['asset-account']->name]); Log::debug('Asset account is OK.', ['id' => $entry->fields['asset-account']->id, 'name' => $entry->fields['asset-account']->name]);
@@ -379,7 +381,7 @@ class ImportValidator
return $entry; return $entry;
} }
Log::error(sprintf('Opposing account is of type %s, cannot handle this.', $type)); Log::warning(sprintf('Opposing account is of type %s, cannot handle this.', $type));
$entry->valid = false; $entry->valid = false;
return $entry; return $entry;

View File

@@ -54,15 +54,20 @@ class CsvImporter implements ImporterInterface
$reader->setDelimiter($config['delimiter']); $reader->setDelimiter($config['delimiter']);
$start = $config['has-headers'] ? 1 : 0; $start = $config['has-headers'] ? 1 : 0;
$results = $reader->fetch(); $results = $reader->fetch();
Log::notice('Building importable objects from CSV file.');
foreach ($results as $index => $row) { foreach ($results as $index => $row) {
if ($index >= $start) { if ($index >= $start) {
$line = $index + 1;
Log::debug('----- import entry build start --'); Log::debug('----- import entry build start --');
Log::debug(sprintf('Now going to import row %d.', $index)); Log::debug(sprintf('Now going to import row %d.', $index));
$importEntry = $this->importSingleRow($index, $row); $importEntry = $this->importSingleRow($index, $row);
$this->collection->put($index, $importEntry); $this->collection->put($line, $importEntry);
} }
} }
Log::debug(sprintf('Import collection contains %d entries', $this->collection->count())); Log::debug(sprintf('Import collection contains %d entries', $this->collection->count()));
Log::notice(sprintf('Built %d importable object(s) from your CSV file.', $this->collection->count()));
return $this->collection; return $this->collection;
} }