From 6f707912391cd4bef0a445d2a0a992095a50c1ab Mon Sep 17 00:00:00 2001 From: James Cole Date: Fri, 5 Oct 2018 17:54:51 +0200 Subject: [PATCH] Refactoring of code for #1159 --- .../FinTSConfigurationSteps.php | 35 ++ .../FinTSJobConfiguration.php | 15 +- app/Import/Routine/FinTSRoutine.php | 6 +- app/Support/FinTS/FinTS.php | 85 +++-- .../FinTS/ChooseAccountHandler.php | 29 +- .../FinTS/FinTSConfigurationInterface.php | 5 +- .../FinTS/NewFinTSJobHandler.php | 17 +- .../Routine/FinTS/StageImportDataHandler.php | 173 ++++++---- composer.lock | 305 ++++++++++++------ resources/lang/en_US/form.php | 2 +- resources/lang/en_US/import.php | 207 ++++++------ 11 files changed, 543 insertions(+), 336 deletions(-) create mode 100644 app/Import/JobConfiguration/FinTSConfigurationSteps.php diff --git a/app/Import/JobConfiguration/FinTSConfigurationSteps.php b/app/Import/JobConfiguration/FinTSConfigurationSteps.php new file mode 100644 index 0000000000..6f77b61b09 --- /dev/null +++ b/app/Import/JobConfiguration/FinTSConfigurationSteps.php @@ -0,0 +1,35 @@ +. + */ + +declare(strict_types=1); + +namespace FireflyIII\Import\JobConfiguration; + +/** + * + * Class FinTSConfigurationSteps + */ +abstract class FinTSConfigurationSteps +{ + public const NEW = 'new'; + public const CHOOSE_ACCOUNT = 'choose_account'; + public const GO_FOR_IMPORT = 'go-for-import'; +} \ No newline at end of file diff --git a/app/Import/JobConfiguration/FinTSJobConfiguration.php b/app/Import/JobConfiguration/FinTSJobConfiguration.php index a3dc24b709..4b9c337343 100644 --- a/app/Import/JobConfiguration/FinTSJobConfiguration.php +++ b/app/Import/JobConfiguration/FinTSJobConfiguration.php @@ -1,7 +1,7 @@ importJob->stage == FinTSConfigurationSteps::GO_FOR_IMPORT; + return $this->importJob->stage === FinTSConfigurationSteps::GO_FOR_IMPORT; } /** diff --git a/app/Import/Routine/FinTSRoutine.php b/app/Import/Routine/FinTSRoutine.php index 7effeecfc5..7248c10a3f 100644 --- a/app/Import/Routine/FinTSRoutine.php +++ b/app/Import/Routine/FinTSRoutine.php @@ -1,7 +1,7 @@ . + */ +declare(strict_types=1); namespace FireflyIII\Support\FinTS; @@ -7,6 +26,10 @@ use Fhp\Model\SEPAAccount; use FireflyIII\Exceptions\FireflyException; use Illuminate\Support\Facades\Crypt; +/** + * + * Class FinTS + */ class FinTS { /** @var \Fhp\FinTs */ @@ -14,19 +37,14 @@ class FinTS /** * @param array $config + * * @throws FireflyException */ public function __construct(array $config) { - if ( - !isset($config['fints_url']) or - !isset($config['fints_port']) or - !isset($config['fints_bank_code']) or - !isset($config['fints_username']) or - !isset($config['fints_password'])) - throw new FireflyException( - "Constructed FinTS with incomplete config." - ); + if (!isset($config['fints_url'], $config['fints_port'], $config['fints_bank_code'], $config['fints_username'], $config['fints_password'])) { + throw new FireflyException('Constructed FinTS with incomplete config.'); + } $this->finTS = new \Fhp\FinTs( $config['fints_url'], $config['fints_port'], @@ -36,16 +54,41 @@ class FinTS ); } + /** + * @return bool|string + */ public function checkConnection() { try { $this->finTS->getSEPAAccounts(); + return true; } catch (\Exception $exception) { return $exception->getMessage(); } } + /** + * @param string $accountNumber + * + * @return SEPAAccount + * @throws FireflyException + */ + public function getAccount(string $accountNumber) + { + $accounts = $this->getAccounts(); + $filteredAccounts = array_filter( + $accounts, function (SEPAAccount $account) use ($accountNumber) { + return $account->getAccountNumber() === $accountNumber; + } + ); + if (count($filteredAccounts) != 1) { + throw new FireflyException("Cannot find account with number " . $accountNumber); + } + + return reset($filteredAccounts); + } + /** * @return SEPAAccount[] * @throws FireflyException @@ -59,27 +102,11 @@ class FinTS } } - /** - * @param string $accountNumber - * @return SEPAAccount - * @throws FireflyException - */ - public function getAccount(string $accountNumber) - { - $accounts = $this->getAccounts(); - $filteredAccounts = array_filter($accounts, function (SEPAAccount $account) use ($accountNumber) { - return $account->getAccountNumber() == $accountNumber; - }); - if (count($filteredAccounts) != 1) { - throw new FireflyException("Cannot find account with number " . $accountNumber); - } - return reset($filteredAccounts); - } - /** * @param SEPAAccount $account - * @param \DateTime $from - * @param \DateTIme $to + * @param \DateTime $from + * @param \DateTIme $to + * * @return \Fhp\Model\StatementOfAccount\StatementOfAccount|null * @throws FireflyException */ diff --git a/app/Support/Import/JobConfiguration/FinTS/ChooseAccountHandler.php b/app/Support/Import/JobConfiguration/FinTS/ChooseAccountHandler.php index d08575288a..7f3ce9a511 100644 --- a/app/Support/Import/JobConfiguration/FinTS/ChooseAccountHandler.php +++ b/app/Support/Import/JobConfiguration/FinTS/ChooseAccountHandler.php @@ -1,7 +1,7 @@ importJob->configuration; + $config = $this->repository->getConfiguration($this->importJob); $config['fints_account'] = (string)($data['fints_account'] ?? ''); $config['local_account'] = (string)($data['local_account'] ?? ''); $config['from_date'] = (string)($data['from_date'] ?? ''); @@ -59,7 +63,7 @@ class ChooseAccountHandler implements FinTSConfigurationInterface $this->repository->setConfiguration($this->importJob, $config); try { - $finTS = app(FinTS::class, ['config' => $this->importJob->configuration]); + $finTS = app(FinTS::class, ['config' => $config]); $finTS->getAccount($config['fints_account']); } catch (FireflyException $e) { return new MessageBag([$e->getMessage()]); @@ -89,19 +93,20 @@ class ChooseAccountHandler implements FinTSConfigurationInterface foreach ($this->accountRepository->getAccountsByType([AccountType::ASSET]) as $localAccount) { $display_name = $localAccount->name; if ($localAccount->iban) { - $display_name .= " - $localAccount->iban"; + $display_name .= sprintf(' - %s', $localAccount->iban); } $localAccounts[$localAccount->id] = $display_name; } $data = [ 'fints_accounts' => $finTSAccountsData, - 'fints_account' => $this->importJob->configuration['fints_account'] ?? null, + 'fints_account' => $this->importJob->configuration['fints_account'] ?? null, 'local_accounts' => $localAccounts, - 'local_account' => $this->importJob->configuration['local_account'] ?? null, - 'from_date' => $this->importJob->configuration['from_date'] ?? (new Carbon('now - 1 month'))->format('Y-m-d'), - 'to_date' => $this->importJob->configuration['to_date'] ?? (new Carbon('now'))->format('Y-m-d') + 'local_account' => $this->importJob->configuration['local_account'] ?? null, + 'from_date' => $this->importJob->configuration['from_date'] ?? (new Carbon('now - 1 month'))->format('Y-m-d'), + 'to_date' => $this->importJob->configuration['to_date'] ?? (new Carbon('now'))->format('Y-m-d'), ]; + return $data; } @@ -115,6 +120,4 @@ class ChooseAccountHandler implements FinTSConfigurationInterface $this->accountRepository = app(AccountRepositoryInterface::class); $this->repository->setUser($importJob->user); } - - } \ No newline at end of file diff --git a/app/Support/Import/JobConfiguration/FinTS/FinTSConfigurationInterface.php b/app/Support/Import/JobConfiguration/FinTS/FinTSConfigurationInterface.php index 47bcedad33..81bfd45c8c 100644 --- a/app/Support/Import/JobConfiguration/FinTS/FinTSConfigurationInterface.php +++ b/app/Support/Import/JobConfiguration/FinTS/FinTSConfigurationInterface.php @@ -1,7 +1,7 @@ $this->importJob->configuration]); - if (($checkConnection = $finTS->checkConnection()) !== true) { + if (true !== ($checkConnection = $finTS->checkConnection())) { return new MessageBag([trans('import.fints_connection_failed', ['originalError' => $checkConnection])]); } @@ -84,11 +88,12 @@ class NewFinTSJobHandler implements FinTSConfigurationInterface public function getNextData(): array { $config = $this->importJob->configuration; + return [ - 'fints_url' => $config['fints_url'] ?? '', - 'fints_port' => $config['fints_port'] ?? '443', + 'fints_url' => $config['fints_url'] ?? '', + 'fints_port' => $config['fints_port'] ?? '443', 'fints_bank_code' => $config['fints_bank_code'] ?? '', - 'fints_username' => $config['fints_username'] ?? '' + 'fints_username' => $config['fints_username'] ?? '', ]; } diff --git a/app/Support/Import/Routine/FinTS/StageImportDataHandler.php b/app/Support/Import/Routine/FinTS/StageImportDataHandler.php index 2162b1d754..89095dac35 100644 --- a/app/Support/Import/Routine/FinTS/StageImportDataHandler.php +++ b/app/Support/Import/Routine/FinTS/StageImportDataHandler.php @@ -1,34 +1,92 @@ . + */ +declare(strict_types=1); namespace FireflyIII\Support\Import\Routine\FinTS; -use Fhp\Model\StatementOfAccount\Transaction as FinTSTransaction; use Fhp\Model\StatementOfAccount\Transaction; +use Fhp\Model\StatementOfAccount\Transaction as FinTSTransaction; use FireflyIII\Exceptions\FireflyException; +use FireflyIII\Models\Account as LocalAccount; use FireflyIII\Models\AccountType; use FireflyIII\Models\ImportJob; use FireflyIII\Models\TransactionType; use FireflyIII\Repositories\Account\AccountRepositoryInterface; use FireflyIII\Repositories\ImportJob\ImportJobRepositoryInterface; use FireflyIII\Support\FinTS\FinTS; -use FireflyIII\Models\Account as LocalAccount; use FireflyIII\Support\Import\Routine\File\OpposingAccountMapper; use Illuminate\Support\Facades\Log; +/** + * + * Class StageImportDataHandler + */ class StageImportDataHandler { /** @var AccountRepositoryInterface */ private $accountRepository; /** @var ImportJob */ private $importJob; + /** @var OpposingAccountMapper */ + private $mapper; /** @var ImportJobRepositoryInterface */ private $repository; /** @var array */ private $transactions; - /** @var OpposingAccountMapper */ - private $mapper; + + /** + * @return array + */ + public function getTransactions(): array + { + return $this->transactions; + } + + /** + * @throws FireflyException + */ + public function run() + { + Log::debug('Now in StageImportDataHandler::run()'); + + $localAccount = $this->accountRepository->findNull($this->importJob->configuration['local_account']); + if (null === $localAccount) { + throw new FireflyException(sprintf('Cannot find Firefly account with id #%d ' , $this->importJob->configuration['local_account'])); + } + $finTS = app(FinTS::class, ['config' => $this->importJob->configuration]); + $fintTSAccount = $finTS->getAccount($this->importJob->configuration['fints_account']); + $statementOfAccount = $finTS->getStatementOfAccount( + $fintTSAccount, new \DateTime($this->importJob->configuration['from_date']), new \DateTime($this->importJob->configuration['to_date']) + ); + $collection = []; + foreach ($statementOfAccount->getStatements() as $statement) { + foreach ($statement->getTransactions() as $transaction) { + $collection[] = $this->convertTransaction($transaction, $localAccount); + } + } + + $this->transactions = $collection; + } /** * @param ImportJob $importJob @@ -48,40 +106,23 @@ class StageImportDataHandler } /** - * @throws FireflyException + * @param FinTSTransaction $transaction + * @param LocalAccount $source + * + * @return array */ - public function run() - { - Log::debug('Now in StageImportDataHandler::run()'); - - $localAccount = $this->accountRepository->findNull($this->importJob->configuration['local_account']); - if ($localAccount === null) { - throw new FireflyException('Cannot find Firefly account with id ' . $this->importJob->configuration['local_account']); - } - $finTS = app(FinTS::class, ['config' => $this->importJob->configuration]); - $fintTSAccount = $finTS->getAccount($this->importJob->configuration['fints_account']); - $statementOfAccount = $finTS->getStatementOfAccount($fintTSAccount, new \DateTime($this->importJob->configuration['from_date']), new \DateTime($this->importJob->configuration['to_date'])); - $collection = []; - foreach ($statementOfAccount->getStatements() as $statement) { - foreach ($statement->getTransactions() as $transaction) { - $collection[] = $this->convertTransaction($transaction, $localAccount); - } - } - - $this->transactions = $collection; - } - private function convertTransaction(FinTSTransaction $transaction, LocalAccount $source): array { Log::debug(sprintf('Start converting transaction %s', $transaction->getDescription1())); - $amount = (string) $transaction->getAmount(); + $amount = (string)$transaction->getAmount(); $debitOrCredit = $transaction->getCreditDebit(); - + // assume deposit. + $type = TransactionType::DEPOSIT; Log::debug(sprintf('Amount is %s', $amount)); - if ($debitOrCredit == Transaction::CD_CREDIT) { - $type = TransactionType::DEPOSIT; - } else { + + // inverse if not. + if ($debitOrCredit !== Transaction::CD_CREDIT) { $type = TransactionType::WITHDRAWAL; $amount = bcmul($amount, '-1'); } @@ -91,7 +132,7 @@ class StageImportDataHandler $amount, ['iban' => $transaction->getAccountNumber(), 'name' => $transaction->getName()] ); - if ($debitOrCredit == Transaction::CD_CREDIT) { + if ($debitOrCredit === Transaction::CD_CREDIT) { [$source, $destination] = [$destination, $source]; } @@ -101,52 +142,44 @@ class StageImportDataHandler } $storeData = [ - 'user' => $this->importJob->user_id, - 'type' => $type, - 'date' => $transaction->getValutaDate()->format('Y-m-d'), - 'description' => $transaction->getDescription1(), - 'piggy_bank_id' => null, - 'piggy_bank_name' => null, - 'bill_id' => null, - 'bill_name' => null, - 'tags' => [], + 'user' => $this->importJob->user_id, + 'type' => $type, + 'date' => $transaction->getValutaDate()->format('Y-m-d'), + 'description' => $transaction->getDescription1(), + 'piggy_bank_id' => null, + 'piggy_bank_name' => null, + 'bill_id' => null, + 'bill_name' => null, + 'tags' => [], 'internal_reference' => null, - 'external_id' => null, - 'notes' => null, - 'bunq_payment_id' => null, - 'original-source' => sprintf('fints-v%s', config('firefly.version')), - 'transactions' => [ + 'external_id' => null, + 'notes' => null, + 'bunq_payment_id' => null, + 'original-source' => sprintf('fints-v%s', config('firefly.version')), + 'transactions' => [ // single transaction: [ - 'description' => null, - 'amount' => $amount, - 'currency_id' => null, - 'currency_code' => 'EUR', - 'foreign_amount' => null, - 'foreign_currency_id' => null, + 'description' => null, + 'amount' => $amount, + 'currency_id' => null, + 'currency_code' => 'EUR', + 'foreign_amount' => null, + 'foreign_currency_id' => null, 'foreign_currency_code' => null, - 'budget_id' => null, - 'budget_name' => null, - 'category_id' => null, - 'category_name' => null, - 'source_id' => $source->id, - 'source_name' => null, - 'destination_id' => $destination->id, - 'destination_name' => null, - 'reconciled' => false, - 'identifier' => 0, + 'budget_id' => null, + 'budget_name' => null, + 'category_id' => null, + 'category_name' => null, + 'source_id' => $source->id, + 'source_name' => null, + 'destination_id' => $destination->id, + 'destination_name' => null, + 'reconciled' => false, + 'identifier' => 0, ], ], ]; return $storeData; } - - /** - * @return array - */ - public function getTransactions(): array - { - return $this->transactions; - } } \ No newline at end of file diff --git a/composer.lock b/composer.lock index 0ee40dde37..0a1196cefc 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "9297702ac3c2fc200aac5fc68821bdd6", + "content-hash": "a15b5b4991745824880345223530fa9e", "packages": [ { "name": "bacon/bacon-qr-code", @@ -1022,16 +1022,16 @@ }, { "name": "laravel/framework", - "version": "v5.7.6", + "version": "v5.7.8", "source": { "type": "git", "url": "https://github.com/laravel/framework.git", - "reference": "93e761bb5367166ce98ba908d5eb0edd6be76792" + "reference": "763b64a43ebb6042e463aab4214d4cc9722147be" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/framework/zipball/93e761bb5367166ce98ba908d5eb0edd6be76792", - "reference": "93e761bb5367166ce98ba908d5eb0edd6be76792", + "url": "https://api.github.com/repos/laravel/framework/zipball/763b64a43ebb6042e463aab4214d4cc9722147be", + "reference": "763b64a43ebb6042e463aab4214d4cc9722147be", "shasum": "" }, "require": { @@ -1043,6 +1043,7 @@ "league/flysystem": "^1.0.8", "monolog/monolog": "^1.12", "nesbot/carbon": "^1.26.3", + "opis/closure": "^3.1", "php": "^7.1.3", "psr/container": "^1.0", "psr/simple-cache": "^1.0", @@ -1159,7 +1160,7 @@ "framework", "laravel" ], - "time": "2018-09-25T14:29:00+00:00" + "time": "2018-10-04T14:47:20+00:00" }, { "name": "laravel/passport", @@ -1838,6 +1839,41 @@ ], "time": "2017-06-19T01:22:40+00:00" }, + { + "name": "mschindler83/fints-hbci-php", + "version": "1.0.4", + "source": { + "type": "git", + "url": "https://github.com/mschindler83/fints-hbci-php.git", + "reference": "e58cb825c178d4c39a8974a9dd93abbc8094551f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/mschindler83/fints-hbci-php/zipball/e58cb825c178d4c39a8974a9dd93abbc8094551f", + "reference": "e58cb825c178d4c39a8974a9dd93abbc8094551f", + "shasum": "" + }, + "require": { + "php": ">=5.3.2", + "psr/log": "~1.0" + }, + "suggest": { + "monolog/monolog": "Allow sending log messages to a variety of different handlers" + }, + "type": "library", + "autoload": { + "psr-0": { + "Fhp": "lib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "PHP Library for the protocols fints and hbci", + "homepage": "http://fints-hbci-php.markus-schindler.de", + "time": "2017-02-15T13:48:21+00:00" + }, { "name": "nesbot/carbon", "version": "1.34.0", @@ -1893,6 +1929,67 @@ ], "time": "2018-09-20T19:36:25+00:00" }, + { + "name": "opis/closure", + "version": "3.1.1", + "source": { + "type": "git", + "url": "https://github.com/opis/closure.git", + "reference": "d3209e46ad6c69a969b705df0738fd0dbe26ef9e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/opis/closure/zipball/d3209e46ad6c69a969b705df0738fd0dbe26ef9e", + "reference": "d3209e46ad6c69a969b705df0738fd0dbe26ef9e", + "shasum": "" + }, + "require": { + "php": "^5.4 || ^7.0" + }, + "require-dev": { + "jeremeamia/superclosure": "^2.0", + "phpunit/phpunit": "^4.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Opis\\Closure\\": "src/" + }, + "files": [ + "functions.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Marius Sarca", + "email": "marius.sarca@gmail.com" + }, + { + "name": "Sorin Sarca", + "email": "sarca_sorin@hotmail.com" + } + ], + "description": "A library that can be used to serialize closures (anonymous functions) and arbitrary objects.", + "homepage": "https://opis.io/closure", + "keywords": [ + "anonymous functions", + "closure", + "function", + "serializable", + "serialization", + "serialize" + ], + "time": "2018-10-02T13:36:53+00:00" + }, { "name": "paragonie/constant_time_encoding", "version": "v2.2.2", @@ -2633,16 +2730,16 @@ }, { "name": "symfony/console", - "version": "v4.1.4", + "version": "v4.1.6", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "ca80b8ced97cf07390078b29773dc384c39eee1f" + "reference": "dc7122fe5f6113cfaba3b3de575d31112c9aa60b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/ca80b8ced97cf07390078b29773dc384c39eee1f", - "reference": "ca80b8ced97cf07390078b29773dc384c39eee1f", + "url": "https://api.github.com/repos/symfony/console/zipball/dc7122fe5f6113cfaba3b3de575d31112c9aa60b", + "reference": "dc7122fe5f6113cfaba3b3de575d31112c9aa60b", "shasum": "" }, "require": { @@ -2697,20 +2794,20 @@ ], "description": "Symfony Console Component", "homepage": "https://symfony.com", - "time": "2018-07-26T11:24:31+00:00" + "time": "2018-10-03T08:15:46+00:00" }, { "name": "symfony/css-selector", - "version": "v4.1.4", + "version": "v4.1.6", "source": { "type": "git", "url": "https://github.com/symfony/css-selector.git", - "reference": "2a4df7618f869b456f9096781e78c57b509d76c7" + "reference": "d67de79a70a27d93c92c47f37ece958bf8de4d8a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/css-selector/zipball/2a4df7618f869b456f9096781e78c57b509d76c7", - "reference": "2a4df7618f869b456f9096781e78c57b509d76c7", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/d67de79a70a27d93c92c47f37ece958bf8de4d8a", + "reference": "d67de79a70a27d93c92c47f37ece958bf8de4d8a", "shasum": "" }, "require": { @@ -2750,20 +2847,20 @@ ], "description": "Symfony CssSelector Component", "homepage": "https://symfony.com", - "time": "2018-07-26T09:10:45+00:00" + "time": "2018-10-02T16:36:10+00:00" }, { "name": "symfony/debug", - "version": "v4.1.4", + "version": "v4.1.6", "source": { "type": "git", "url": "https://github.com/symfony/debug.git", - "reference": "47ead688f1f2877f3f14219670f52e4722ee7052" + "reference": "e3f76ce6198f81994e019bb2b4e533e9de1b9b90" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/debug/zipball/47ead688f1f2877f3f14219670f52e4722ee7052", - "reference": "47ead688f1f2877f3f14219670f52e4722ee7052", + "url": "https://api.github.com/repos/symfony/debug/zipball/e3f76ce6198f81994e019bb2b4e533e9de1b9b90", + "reference": "e3f76ce6198f81994e019bb2b4e533e9de1b9b90", "shasum": "" }, "require": { @@ -2806,11 +2903,11 @@ ], "description": "Symfony Debug Component", "homepage": "https://symfony.com", - "time": "2018-08-03T11:13:38+00:00" + "time": "2018-10-02T16:36:10+00:00" }, { "name": "symfony/event-dispatcher", - "version": "v4.1.4", + "version": "v4.1.6", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", @@ -2873,16 +2970,16 @@ }, { "name": "symfony/finder", - "version": "v4.1.4", + "version": "v4.1.6", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "e162f1df3102d0b7472805a5a9d5db9fcf0a8068" + "reference": "1f17195b44543017a9c9b2d437c670627e96ad06" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/e162f1df3102d0b7472805a5a9d5db9fcf0a8068", - "reference": "e162f1df3102d0b7472805a5a9d5db9fcf0a8068", + "url": "https://api.github.com/repos/symfony/finder/zipball/1f17195b44543017a9c9b2d437c670627e96ad06", + "reference": "1f17195b44543017a9c9b2d437c670627e96ad06", "shasum": "" }, "require": { @@ -2918,20 +3015,20 @@ ], "description": "Symfony Finder Component", "homepage": "https://symfony.com", - "time": "2018-07-26T11:24:31+00:00" + "time": "2018-10-03T08:47:56+00:00" }, { "name": "symfony/http-foundation", - "version": "v4.1.4", + "version": "v4.1.6", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "3a5c91e133b220bb882b3cd773ba91bf39989345" + "reference": "d528136617ff24f530e70df9605acc1b788b08d4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/3a5c91e133b220bb882b3cd773ba91bf39989345", - "reference": "3a5c91e133b220bb882b3cd773ba91bf39989345", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/d528136617ff24f530e70df9605acc1b788b08d4", + "reference": "d528136617ff24f530e70df9605acc1b788b08d4", "shasum": "" }, "require": { @@ -2972,20 +3069,20 @@ ], "description": "Symfony HttpFoundation Component", "homepage": "https://symfony.com", - "time": "2018-08-27T17:47:02+00:00" + "time": "2018-10-03T08:48:45+00:00" }, { "name": "symfony/http-kernel", - "version": "v4.1.4", + "version": "v4.1.6", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "33de0a1ff2e1720096189e3ced682d7a4e8f5e35" + "reference": "f5e7c15a5d010be0e16ce798594c5960451d4220" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/33de0a1ff2e1720096189e3ced682d7a4e8f5e35", - "reference": "33de0a1ff2e1720096189e3ced682d7a4e8f5e35", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/f5e7c15a5d010be0e16ce798594c5960451d4220", + "reference": "f5e7c15a5d010be0e16ce798594c5960451d4220", "shasum": "" }, "require": { @@ -3059,7 +3156,7 @@ ], "description": "Symfony HttpKernel Component", "homepage": "https://symfony.com", - "time": "2018-08-28T06:17:42+00:00" + "time": "2018-10-03T12:53:38+00:00" }, { "name": "symfony/polyfill-ctype", @@ -3343,16 +3440,16 @@ }, { "name": "symfony/process", - "version": "v4.1.4", + "version": "v4.1.6", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "86cdb930a6a855b0ab35fb60c1504cb36184f843" + "reference": "ee33c0322a8fee0855afcc11fff81e6b1011b529" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/86cdb930a6a855b0ab35fb60c1504cb36184f843", - "reference": "86cdb930a6a855b0ab35fb60c1504cb36184f843", + "url": "https://api.github.com/repos/symfony/process/zipball/ee33c0322a8fee0855afcc11fff81e6b1011b529", + "reference": "ee33c0322a8fee0855afcc11fff81e6b1011b529", "shasum": "" }, "require": { @@ -3388,7 +3485,7 @@ ], "description": "Symfony Process Component", "homepage": "https://symfony.com", - "time": "2018-08-03T11:13:38+00:00" + "time": "2018-10-02T12:40:59+00:00" }, { "name": "symfony/psr-http-message-bridge", @@ -3453,16 +3550,16 @@ }, { "name": "symfony/routing", - "version": "v4.1.4", + "version": "v4.1.6", "source": { "type": "git", "url": "https://github.com/symfony/routing.git", - "reference": "a5784c2ec4168018c87b38f0e4f39d2278499f51" + "reference": "537803f0bdfede36b9acef052d2e4d447d9fa0e9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/a5784c2ec4168018c87b38f0e4f39d2278499f51", - "reference": "a5784c2ec4168018c87b38f0e4f39d2278499f51", + "url": "https://api.github.com/repos/symfony/routing/zipball/537803f0bdfede36b9acef052d2e4d447d9fa0e9", + "reference": "537803f0bdfede36b9acef052d2e4d447d9fa0e9", "shasum": "" }, "require": { @@ -3526,20 +3623,20 @@ "uri", "url" ], - "time": "2018-08-03T07:58:40+00:00" + "time": "2018-10-02T12:40:59+00:00" }, { "name": "symfony/translation", - "version": "v4.1.4", + "version": "v4.1.6", "source": { "type": "git", "url": "https://github.com/symfony/translation.git", - "reference": "fa2182669f7983b7aa5f1a770d053f79f0ef144f" + "reference": "9f0b61e339160a466ebcde167a6c5521c810e304" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation/zipball/fa2182669f7983b7aa5f1a770d053f79f0ef144f", - "reference": "fa2182669f7983b7aa5f1a770d053f79f0ef144f", + "url": "https://api.github.com/repos/symfony/translation/zipball/9f0b61e339160a466ebcde167a6c5521c810e304", + "reference": "9f0b61e339160a466ebcde167a6c5521c810e304", "shasum": "" }, "require": { @@ -3595,20 +3692,20 @@ ], "description": "Symfony Translation Component", "homepage": "https://symfony.com", - "time": "2018-08-07T12:45:11+00:00" + "time": "2018-10-02T16:36:10+00:00" }, { "name": "symfony/var-dumper", - "version": "v4.1.4", + "version": "v4.1.6", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "a05426e27294bba7b0226ffc17dd01a3c6ef9777" + "reference": "60319b45653580b0cdacca499344577d87732f16" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/a05426e27294bba7b0226ffc17dd01a3c6ef9777", - "reference": "a05426e27294bba7b0226ffc17dd01a3c6ef9777", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/60319b45653580b0cdacca499344577d87732f16", + "reference": "60319b45653580b0cdacca499344577d87732f16", "shasum": "" }, "require": { @@ -3670,7 +3767,7 @@ "debug", "dump" ], - "time": "2018-08-02T09:24:26+00:00" + "time": "2018-10-02T16:36:10+00:00" }, { "name": "tijsverkoyen/css-to-inline-styles", @@ -4656,16 +4753,16 @@ }, { "name": "mockery/mockery", - "version": "1.1.0", + "version": "1.2.0", "source": { "type": "git", "url": "https://github.com/mockery/mockery.git", - "reference": "99e29d3596b16dabe4982548527d5ddf90232e99" + "reference": "100633629bf76d57430b86b7098cd6beb996a35a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/mockery/mockery/zipball/99e29d3596b16dabe4982548527d5ddf90232e99", - "reference": "99e29d3596b16dabe4982548527d5ddf90232e99", + "url": "https://api.github.com/repos/mockery/mockery/zipball/100633629bf76d57430b86b7098cd6beb996a35a", + "reference": "100633629bf76d57430b86b7098cd6beb996a35a", "shasum": "" }, "require": { @@ -4674,8 +4771,7 @@ "php": ">=5.6.0" }, "require-dev": { - "phpdocumentor/phpdocumentor": "^2.9", - "phpunit/phpunit": "~5.7.10|~6.5" + "phpunit/phpunit": "~5.7.10|~6.5|~7.0" }, "type": "library", "extra": { @@ -4718,7 +4814,7 @@ "test double", "testing" ], - "time": "2018-05-08T08:54:48+00:00" + "time": "2018-10-02T21:52:37+00:00" }, { "name": "myclabs/deep-copy", @@ -5170,16 +5266,16 @@ }, { "name": "phpunit/php-code-coverage", - "version": "6.0.7", + "version": "6.0.8", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "865662550c384bc1db7e51d29aeda1c2c161d69a" + "reference": "848f78b3309780fef7ec8c4666b7ab4e6b09b22f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/865662550c384bc1db7e51d29aeda1c2c161d69a", - "reference": "865662550c384bc1db7e51d29aeda1c2c161d69a", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/848f78b3309780fef7ec8c4666b7ab4e6b09b22f", + "reference": "848f78b3309780fef7ec8c4666b7ab4e6b09b22f", "shasum": "" }, "require": { @@ -5229,7 +5325,7 @@ "testing", "xunit" ], - "time": "2018-06-01T07:51:50+00:00" + "time": "2018-10-04T03:41:23+00:00" }, { "name": "phpunit/php-file-iterator", @@ -5422,16 +5518,16 @@ }, { "name": "phpunit/phpunit", - "version": "7.3.5", + "version": "7.4.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "7b331efabbb628c518c408fdfcaf571156775de2" + "reference": "f3837fa1e07758057ae06e8ddec6d06ba183f126" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/7b331efabbb628c518c408fdfcaf571156775de2", - "reference": "7b331efabbb628c518c408fdfcaf571156775de2", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/f3837fa1e07758057ae06e8ddec6d06ba183f126", + "reference": "f3837fa1e07758057ae06e8ddec6d06ba183f126", "shasum": "" }, "require": { @@ -5456,7 +5552,7 @@ "sebastian/exporter": "^3.1", "sebastian/global-state": "^2.0", "sebastian/object-enumerator": "^3.0.3", - "sebastian/resource-operations": "^1.0", + "sebastian/resource-operations": "^2.0", "sebastian/version": "^2.0.1" }, "conflict": { @@ -5476,7 +5572,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "7.3-dev" + "dev-master": "7.4-dev" } }, "autoload": { @@ -5502,7 +5598,7 @@ "testing", "xunit" ], - "time": "2018-09-08T15:14:29+00:00" + "time": "2018-10-05T04:05:24+00:00" }, { "name": "roave/security-advisories", @@ -5510,6 +5606,7 @@ "conflict": { "3f/pygmentize": "<1.2", "adodb/adodb-php": "<5.20.12", + "alterphp/easyadmin-extension-bundle": ">=1.2,<1.2.11|>=1.3,<1.3.1", "amphp/artax": "<1.0.6|>=2,<2.0.6", "amphp/http": "<1.0.1", "asymmetricrypt/asymmetricrypt": ">=0,<9.9.99", @@ -5677,7 +5774,7 @@ } ], "description": "Prevents installation of composer packages with known security vulnerabilities: no API, simply require it", - "time": "2018-09-17T20:20:31+00:00" + "time": "2018-10-02T16:19:22+00:00" }, { "name": "sebastian/code-unit-reverse-lookup", @@ -6159,25 +6256,25 @@ }, { "name": "sebastian/resource-operations", - "version": "1.0.0", + "version": "2.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/resource-operations.git", - "reference": "ce990bb21759f94aeafd30209e8cfcdfa8bc3f52" + "reference": "4d7a795d35b889bf80a0cc04e08d77cedfa917a9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/ce990bb21759f94aeafd30209e8cfcdfa8bc3f52", - "reference": "ce990bb21759f94aeafd30209e8cfcdfa8bc3f52", + "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/4d7a795d35b889bf80a0cc04e08d77cedfa917a9", + "reference": "4d7a795d35b889bf80a0cc04e08d77cedfa917a9", "shasum": "" }, "require": { - "php": ">=5.6.0" + "php": "^7.1" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.0.x-dev" + "dev-master": "2.0-dev" } }, "autoload": { @@ -6197,7 +6294,7 @@ ], "description": "Provides a list of PHP built-in functions that operate on resources", "homepage": "https://www.github.com/sebastianbergmann/resource-operations", - "time": "2015-07-28T20:34:47+00:00" + "time": "2018-10-04T04:07:39+00:00" }, { "name": "sebastian/version", @@ -6337,16 +6434,16 @@ }, { "name": "symfony/config", - "version": "v4.1.4", + "version": "v4.1.6", "source": { "type": "git", "url": "https://github.com/symfony/config.git", - "reference": "76015a3cc372b14d00040ff58e18e29f69eba717" + "reference": "b3d4d7b567d7a49e6dfafb6d4760abc921177c96" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/config/zipball/76015a3cc372b14d00040ff58e18e29f69eba717", - "reference": "76015a3cc372b14d00040ff58e18e29f69eba717", + "url": "https://api.github.com/repos/symfony/config/zipball/b3d4d7b567d7a49e6dfafb6d4760abc921177c96", + "reference": "b3d4d7b567d7a49e6dfafb6d4760abc921177c96", "shasum": "" }, "require": { @@ -6396,20 +6493,20 @@ ], "description": "Symfony Config Component", "homepage": "https://symfony.com", - "time": "2018-08-08T06:37:38+00:00" + "time": "2018-09-08T13:24:10+00:00" }, { "name": "symfony/filesystem", - "version": "v4.1.4", + "version": "v4.1.6", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "c0f5f62db218fa72195b8b8700e4b9b9cf52eb5e" + "reference": "596d12b40624055c300c8b619755b748ca5cf0b5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/c0f5f62db218fa72195b8b8700e4b9b9cf52eb5e", - "reference": "c0f5f62db218fa72195b8b8700e4b9b9cf52eb5e", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/596d12b40624055c300c8b619755b748ca5cf0b5", + "reference": "596d12b40624055c300c8b619755b748ca5cf0b5", "shasum": "" }, "require": { @@ -6446,20 +6543,20 @@ ], "description": "Symfony Filesystem Component", "homepage": "https://symfony.com", - "time": "2018-08-18T16:52:46+00:00" + "time": "2018-10-02T12:40:59+00:00" }, { "name": "symfony/stopwatch", - "version": "v4.1.4", + "version": "v4.1.6", "source": { "type": "git", "url": "https://github.com/symfony/stopwatch.git", - "reference": "966c982df3cca41324253dc0c7ffe76b6076b705" + "reference": "5bfc064125b73ff81229e19381ce1c34d3416f4b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/stopwatch/zipball/966c982df3cca41324253dc0c7ffe76b6076b705", - "reference": "966c982df3cca41324253dc0c7ffe76b6076b705", + "url": "https://api.github.com/repos/symfony/stopwatch/zipball/5bfc064125b73ff81229e19381ce1c34d3416f4b", + "reference": "5bfc064125b73ff81229e19381ce1c34d3416f4b", "shasum": "" }, "require": { @@ -6495,20 +6592,20 @@ ], "description": "Symfony Stopwatch Component", "homepage": "https://symfony.com", - "time": "2018-07-26T11:00:49+00:00" + "time": "2018-10-02T12:40:59+00:00" }, { "name": "symfony/yaml", - "version": "v4.1.4", + "version": "v4.1.6", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "b832cc289608b6d305f62149df91529a2ab3c314" + "reference": "367e689b2fdc19965be435337b50bc8adf2746c9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/b832cc289608b6d305f62149df91529a2ab3c314", - "reference": "b832cc289608b6d305f62149df91529a2ab3c314", + "url": "https://api.github.com/repos/symfony/yaml/zipball/367e689b2fdc19965be435337b50bc8adf2746c9", + "reference": "367e689b2fdc19965be435337b50bc8adf2746c9", "shasum": "" }, "require": { @@ -6554,7 +6651,7 @@ ], "description": "Symfony Yaml Component", "homepage": "https://symfony.com", - "time": "2018-08-18T16:52:46+00:00" + "time": "2018-10-02T16:36:10+00:00" }, { "name": "theseer/tokenizer", diff --git a/resources/lang/en_US/form.php b/resources/lang/en_US/form.php index fd79a7f5aa..6b4999f3f9 100644 --- a/resources/lang/en_US/form.php +++ b/resources/lang/en_US/form.php @@ -231,7 +231,7 @@ return [ 'local_account' => 'Firefly III account', 'from_date' => 'Date from', 'to_date' => 'Date to', - + 'due_date' => 'Due date', 'payment_date' => 'Payment date', diff --git a/resources/lang/en_US/import.php b/resources/lang/en_US/import.php index 783b8f0a7f..30a275c585 100644 --- a/resources/lang/en_US/import.php +++ b/resources/lang/en_US/import.php @@ -47,6 +47,9 @@ return [ 'button_yodlee' => 'Import using Yodlee', 'button_quovo' => 'Import using Quovo', 'button_ynab' => 'Import from You Need A Budget', + 'button_fints' => 'Import using FinTS', + + // global config box (index) 'global_config_title' => 'Global import configuration', 'global_config_text' => 'In the future, this box will feature preferences that apply to ALL import providers above.', @@ -201,118 +204,118 @@ return [ 'spectre_extra_key_transactions_count' => 'Transaction count', //job configuration for finTS 'fints_connection_failed' => 'An error occurred while trying to connecting to your bank. Please mak sure that all the data you entered is correct. Original error message: :originalError', - 'button_fints' => 'FinTS', - 'job_config_fints_url_help' => 'E.g. https://banking-dkb.s-fints-pt-dkb.de/fints30', - 'job_config_fints_username_help' => 'For many banks this is your account number.', - 'job_config_fints_port_help' => 'The default port is 443.', - 'job_config_fints_account_help' => 'Choose the bank account for which you want to import transactions.', - 'job_config_local_account_help' => 'Choose the Firefly III account corresponding to your bank account chosen above.', + + 'job_config_fints_url_help' => 'E.g. https://banking-dkb.s-fints-pt-dkb.de/fints30', + 'job_config_fints_username_help' => 'For many banks this is your account number.', + 'job_config_fints_port_help' => 'The default port is 443.', + 'job_config_fints_account_help' => 'Choose the bank account for which you want to import transactions.', + 'job_config_local_account_help' => 'Choose the Firefly III account corresponding to your bank account chosen above.', // specifics: - 'specific_ing_name' => 'ING NL', - 'specific_ing_descr' => 'Create better descriptions in ING exports', - 'specific_sns_name' => 'SNS / Volksbank NL', - 'specific_sns_descr' => 'Trim quotes from SNS / Volksbank export files', - 'specific_abn_name' => 'ABN AMRO NL', - 'specific_abn_descr' => 'Fixes potential problems with ABN AMRO files', - 'specific_rabo_name' => 'Rabobank NL', - 'specific_rabo_descr' => 'Fixes potential problems with Rabobank files', - 'specific_pres_name' => 'President\'s Choice Financial CA', - 'specific_pres_descr' => 'Fixes potential problems with PC files', + 'specific_ing_name' => 'ING NL', + 'specific_ing_descr' => 'Create better descriptions in ING exports', + 'specific_sns_name' => 'SNS / Volksbank NL', + 'specific_sns_descr' => 'Trim quotes from SNS / Volksbank export files', + 'specific_abn_name' => 'ABN AMRO NL', + 'specific_abn_descr' => 'Fixes potential problems with ABN AMRO files', + 'specific_rabo_name' => 'Rabobank NL', + 'specific_rabo_descr' => 'Fixes potential problems with Rabobank files', + 'specific_pres_name' => 'President\'s Choice Financial CA', + 'specific_pres_descr' => 'Fixes potential problems with PC files', // job configuration for file provider (stage: roles) - 'job_config_roles_title' => 'Import setup (3/4) - Define each column\'s role', - 'job_config_roles_text' => 'Each column in your CSV file contains certain data. Please indicate what kind of data the importer should expect. The option to "map" data means that you will link each entry found in the column to a value in your database. An often mapped column is the column that contains the IBAN of the opposing account. That can be easily matched to IBAN\'s present in your database already.', - 'job_config_roles_submit' => 'Continue', - 'job_config_roles_column_name' => 'Name of column', - 'job_config_roles_column_example' => 'Column example data', - 'job_config_roles_column_role' => 'Column data meaning', - 'job_config_roles_do_map_value' => 'Map these values', - 'job_config_roles_no_example' => 'No example data available', - 'job_config_roles_fa_warning' => 'If you mark a column as containing an amount in a foreign currency, you must also set the column that contains which currency it is.', - 'job_config_roles_rwarning' => 'At the very least, mark one column as the amount-column. It is advisable to also select a column for the description, date and the opposing account.', - 'job_config_roles_colum_count' => 'Column', + 'job_config_roles_title' => 'Import setup (3/4) - Define each column\'s role', + 'job_config_roles_text' => 'Each column in your CSV file contains certain data. Please indicate what kind of data the importer should expect. The option to "map" data means that you will link each entry found in the column to a value in your database. An often mapped column is the column that contains the IBAN of the opposing account. That can be easily matched to IBAN\'s present in your database already.', + 'job_config_roles_submit' => 'Continue', + 'job_config_roles_column_name' => 'Name of column', + 'job_config_roles_column_example' => 'Column example data', + 'job_config_roles_column_role' => 'Column data meaning', + 'job_config_roles_do_map_value' => 'Map these values', + 'job_config_roles_no_example' => 'No example data available', + 'job_config_roles_fa_warning' => 'If you mark a column as containing an amount in a foreign currency, you must also set the column that contains which currency it is.', + 'job_config_roles_rwarning' => 'At the very least, mark one column as the amount-column. It is advisable to also select a column for the description, date and the opposing account.', + 'job_config_roles_colum_count' => 'Column', // job config for the file provider (stage: mapping): - 'job_config_map_title' => 'Import setup (4/4) - Connect import data to Firefly III data', - 'job_config_map_text' => 'In the following tables, the left value shows you information found in your uploaded file. It is your task to map this value, if possible, to a value already present in your database. Firefly will stick to this mapping. If there is no value to map to, or you do not wish to map the specific value, select nothing.', - 'job_config_map_nothing' => 'There is no data present in your file that you can map to existing values. Please press "Start the import" to continue.', - 'job_config_field_value' => 'Field value', - 'job_config_field_mapped' => 'Mapped to', - 'map_do_not_map' => '(do not map)', - 'job_config_map_submit' => 'Start the import', + 'job_config_map_title' => 'Import setup (4/4) - Connect import data to Firefly III data', + 'job_config_map_text' => 'In the following tables, the left value shows you information found in your uploaded file. It is your task to map this value, if possible, to a value already present in your database. Firefly will stick to this mapping. If there is no value to map to, or you do not wish to map the specific value, select nothing.', + 'job_config_map_nothing' => 'There is no data present in your file that you can map to existing values. Please press "Start the import" to continue.', + 'job_config_field_value' => 'Field value', + 'job_config_field_mapped' => 'Mapped to', + 'map_do_not_map' => '(do not map)', + 'job_config_map_submit' => 'Start the import', // import status page: - 'import_with_key' => 'Import with key \':key\'', - 'status_wait_title' => 'Please hold...', - 'status_wait_text' => 'This box will disappear in a moment.', - 'status_running_title' => 'The import is running', - 'status_job_running' => 'Please wait, running the import...', - 'status_job_storing' => 'Please wait, storing data...', - 'status_job_rules' => 'Please wait, running rules...', - 'status_fatal_title' => 'Fatal error', - 'status_fatal_text' => 'The import has suffered from an error it could not recover from. Apologies!', - 'status_fatal_more' => 'This (possibly very cryptic) error message is complemented by log files, which you can find on your hard drive, or in the Docker container where you run Firefly III from.', - 'status_finished_title' => 'Import finished', - 'status_finished_text' => 'The import has finished.', - 'finished_with_errors' => 'There were some errors during the import. Please review them carefully.', - 'unknown_import_result' => 'Unknown import result', - 'result_no_transactions' => 'No transactions have been imported. Perhaps they were all duplicates is simply no transactions where present to be imported. Perhaps the log files can tell you what happened. If you import data regularly, this is normal.', - 'result_one_transaction' => 'Exactly one transaction has been imported. It is stored under tag :tag where you can inspect it further.', - 'result_many_transactions' => 'Firefly III has imported :count transactions. They are stored under tag :tag where you can inspect them further.', + 'import_with_key' => 'Import with key \':key\'', + 'status_wait_title' => 'Please hold...', + 'status_wait_text' => 'This box will disappear in a moment.', + 'status_running_title' => 'The import is running', + 'status_job_running' => 'Please wait, running the import...', + 'status_job_storing' => 'Please wait, storing data...', + 'status_job_rules' => 'Please wait, running rules...', + 'status_fatal_title' => 'Fatal error', + 'status_fatal_text' => 'The import has suffered from an error it could not recover from. Apologies!', + 'status_fatal_more' => 'This (possibly very cryptic) error message is complemented by log files, which you can find on your hard drive, or in the Docker container where you run Firefly III from.', + 'status_finished_title' => 'Import finished', + 'status_finished_text' => 'The import has finished.', + 'finished_with_errors' => 'There were some errors during the import. Please review them carefully.', + 'unknown_import_result' => 'Unknown import result', + 'result_no_transactions' => 'No transactions have been imported. Perhaps they were all duplicates is simply no transactions where present to be imported. Perhaps the log files can tell you what happened. If you import data regularly, this is normal.', + 'result_one_transaction' => 'Exactly one transaction has been imported. It is stored under tag :tag where you can inspect it further.', + 'result_many_transactions' => 'Firefly III has imported :count transactions. They are stored under tag :tag where you can inspect them further.', // general errors and warnings: - 'bad_job_status' => 'To access this page, your import job cannot have status ":status".', + 'bad_job_status' => 'To access this page, your import job cannot have status ":status".', // column roles for CSV import: - 'column__ignore' => '(ignore this column)', - 'column_account-iban' => 'Asset account (IBAN)', - 'column_account-id' => 'Asset account ID (matching FF3)', - 'column_account-name' => 'Asset account (name)', - 'column_account-bic' => 'Asset account (BIC)', - 'column_amount' => 'Amount', - 'column_amount_foreign' => 'Amount (in foreign currency)', - 'column_amount_debit' => 'Amount (debit column)', - 'column_amount_credit' => 'Amount (credit column)', - 'column_amount_negated' => 'Amount (negated column)', - 'column_amount-comma-separated' => 'Amount (comma as decimal separator)', - 'column_bill-id' => 'Bill ID (matching FF3)', - 'column_bill-name' => 'Bill name', - 'column_budget-id' => 'Budget ID (matching FF3)', - 'column_budget-name' => 'Budget name', - 'column_category-id' => 'Category ID (matching FF3)', - 'column_category-name' => 'Category name', - 'column_currency-code' => 'Currency code (ISO 4217)', - 'column_foreign-currency-code' => 'Foreign currency code (ISO 4217)', - 'column_currency-id' => 'Currency ID (matching FF3)', - 'column_currency-name' => 'Currency name (matching FF3)', - 'column_currency-symbol' => 'Currency symbol (matching FF3)', - 'column_date-interest' => 'Interest calculation date', - 'column_date-book' => 'Transaction booking date', - 'column_date-process' => 'Transaction process date', - 'column_date-transaction' => 'Date', - 'column_date-due' => 'Transaction due date', - 'column_date-payment' => 'Transaction payment date', - 'column_date-invoice' => 'Transaction invoice date', - 'column_description' => 'Description', - 'column_opposing-iban' => 'Opposing account (IBAN)', - 'column_opposing-bic' => 'Opposing account (BIC)', - 'column_opposing-id' => 'Opposing account ID (matching FF3)', - 'column_external-id' => 'External ID', - 'column_opposing-name' => 'Opposing account (name)', - 'column_rabo-debit-credit' => 'Rabobank specific debit/credit indicator', - 'column_ing-debit-credit' => 'ING specific debit/credit indicator', - 'column_sepa-ct-id' => 'SEPA end-to-end Identifier', - 'column_sepa-ct-op' => 'SEPA Opposing Account Identifier', - 'column_sepa-db' => 'SEPA Mandate Identifier', - 'column_sepa-cc' => 'SEPA Clearing Code', - 'column_sepa-ci' => 'SEPA Creditor Identifier', - 'column_sepa-ep' => 'SEPA External Purpose', - 'column_sepa-country' => 'SEPA Country Code', - 'column_tags-comma' => 'Tags (comma separated)', - 'column_tags-space' => 'Tags (space separated)', - 'column_account-number' => 'Asset account (account number)', - 'column_opposing-number' => 'Opposing account (account number)', - 'column_note' => 'Note(s)', - 'column_internal-reference' => 'Internal reference', + 'column__ignore' => '(ignore this column)', + 'column_account-iban' => 'Asset account (IBAN)', + 'column_account-id' => 'Asset account ID (matching FF3)', + 'column_account-name' => 'Asset account (name)', + 'column_account-bic' => 'Asset account (BIC)', + 'column_amount' => 'Amount', + 'column_amount_foreign' => 'Amount (in foreign currency)', + 'column_amount_debit' => 'Amount (debit column)', + 'column_amount_credit' => 'Amount (credit column)', + 'column_amount_negated' => 'Amount (negated column)', + 'column_amount-comma-separated' => 'Amount (comma as decimal separator)', + 'column_bill-id' => 'Bill ID (matching FF3)', + 'column_bill-name' => 'Bill name', + 'column_budget-id' => 'Budget ID (matching FF3)', + 'column_budget-name' => 'Budget name', + 'column_category-id' => 'Category ID (matching FF3)', + 'column_category-name' => 'Category name', + 'column_currency-code' => 'Currency code (ISO 4217)', + 'column_foreign-currency-code' => 'Foreign currency code (ISO 4217)', + 'column_currency-id' => 'Currency ID (matching FF3)', + 'column_currency-name' => 'Currency name (matching FF3)', + 'column_currency-symbol' => 'Currency symbol (matching FF3)', + 'column_date-interest' => 'Interest calculation date', + 'column_date-book' => 'Transaction booking date', + 'column_date-process' => 'Transaction process date', + 'column_date-transaction' => 'Date', + 'column_date-due' => 'Transaction due date', + 'column_date-payment' => 'Transaction payment date', + 'column_date-invoice' => 'Transaction invoice date', + 'column_description' => 'Description', + 'column_opposing-iban' => 'Opposing account (IBAN)', + 'column_opposing-bic' => 'Opposing account (BIC)', + 'column_opposing-id' => 'Opposing account ID (matching FF3)', + 'column_external-id' => 'External ID', + 'column_opposing-name' => 'Opposing account (name)', + 'column_rabo-debit-credit' => 'Rabobank specific debit/credit indicator', + 'column_ing-debit-credit' => 'ING specific debit/credit indicator', + 'column_sepa-ct-id' => 'SEPA end-to-end Identifier', + 'column_sepa-ct-op' => 'SEPA Opposing Account Identifier', + 'column_sepa-db' => 'SEPA Mandate Identifier', + 'column_sepa-cc' => 'SEPA Clearing Code', + 'column_sepa-ci' => 'SEPA Creditor Identifier', + 'column_sepa-ep' => 'SEPA External Purpose', + 'column_sepa-country' => 'SEPA Country Code', + 'column_tags-comma' => 'Tags (comma separated)', + 'column_tags-space' => 'Tags (space separated)', + 'column_account-number' => 'Asset account (account number)', + 'column_opposing-number' => 'Opposing account (account number)', + 'column_note' => 'Note(s)', + 'column_internal-reference' => 'Internal reference', ];