Refactoring of code for #1159

This commit is contained in:
James Cole 2018-10-05 17:54:51 +02:00
parent 7ac439fd0e
commit 6f70791239
11 changed files with 543 additions and 336 deletions

View File

@ -0,0 +1,35 @@
<?php
/**
* FinTSConfigurationSteps.php
* Copyright (c) 2018 https://github.com/bnw
*
* This file is part of Firefly III.
*
* Firefly III is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Firefly III is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
*/
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';
}

View File

@ -1,7 +1,7 @@
<?php
/**
* FinTSJobConfiguration.php
* Copyright (c) 2017 thegrumpydictator@gmail.com
* Copyright (c) 2018 https://github.com/bnw
*
* This file is part of Firefly III.
*
@ -29,13 +29,10 @@ use FireflyIII\Support\Import\JobConfiguration\FinTS\FinTSConfigurationInterface
use FireflyIII\Support\Import\JobConfiguration\FinTS\NewFinTSJobHandler;
use Illuminate\Support\MessageBag;
abstract class FinTSConfigurationSteps
{
const NEW = 'new';
const CHOOSE_ACCOUNT = 'choose_account';
const GO_FOR_IMPORT = 'go-for-import';
}
/**
*
* Class FinTSJobConfiguration
*/
class FinTSJobConfiguration implements JobConfigurationInterface
{
/** @var ImportJob */
@ -48,7 +45,7 @@ class FinTSJobConfiguration implements JobConfigurationInterface
*/
public function configurationComplete(): bool
{
return $this->importJob->stage == FinTSConfigurationSteps::GO_FOR_IMPORT;
return $this->importJob->stage === FinTSConfigurationSteps::GO_FOR_IMPORT;
}
/**

View File

@ -1,7 +1,7 @@
<?php
/**
* FinTSRoutine.php
* Copyright (c) 2017 thegrumpydictator@gmail.com
* Copyright (c) 2017 https://github.com/bnw
*
* This file is part of Firefly III.
*
@ -30,6 +30,10 @@ use FireflyIII\Repositories\ImportJob\ImportJobRepositoryInterface;
use FireflyIII\Support\Import\Routine\FinTS\StageImportDataHandler;
use Illuminate\Support\Facades\Log;
/**
*
* Class FinTSRoutine
*/
class FinTSRoutine implements RoutineInterface
{
/** @var ImportJob */

View File

@ -1,5 +1,24 @@
<?php
/**
* FinTS.php
* Copyright (c) 2018 https://github.com/bnw
*
* This file is part of Firefly III.
*
* Firefly III is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Firefly III is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
*/
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
*
* @return \Fhp\Model\StatementOfAccount\StatementOfAccount|null
* @throws FireflyException
*/

View File

@ -1,7 +1,7 @@
<?php
/**
* ChooseAccountHandler.php
* Copyright (c) 2017 thegrumpydictator@gmail.com
* Copyright (c) 2018 https://github.com/bnw
*
* This file is part of Firefly III.
*
@ -28,19 +28,23 @@ use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Import\JobConfiguration\FinTSConfigurationSteps;
use FireflyIII\Models\AccountType;
use FireflyIII\Models\ImportJob;
use FireflyIII\Repositories\Account\AccountRepositoryInterface;
use FireflyIII\Repositories\ImportJob\ImportJobRepositoryInterface;
use FireflyIII\Support\FinTS\FinTS;
use Illuminate\Support\MessageBag;
use FireflyIII\Repositories\Account\AccountRepositoryInterface;
/**
*
* Class ChooseAccountHandler
*/
class ChooseAccountHandler implements FinTSConfigurationInterface
{
/** @var AccountRepositoryInterface */
private $accountRepository;
/** @var ImportJob */
private $importJob;
/** @var ImportJobRepositoryInterface */
private $repository;
/** @var AccountRepositoryInterface */
private $accountRepository;
/**
* Store data associated with current stage.
@ -51,7 +55,7 @@ class ChooseAccountHandler implements FinTSConfigurationInterface
*/
public function configureJob(array $data): MessageBag
{
$config = $this->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,7 +93,7 @@ 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;
}
@ -100,8 +104,9 @@ class ChooseAccountHandler implements FinTSConfigurationInterface
'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')
'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);
}
}

View File

@ -1,7 +1,7 @@
<?php
/**
* FinTSConfigurationInterface.php
* Copyright (c) 2017 thegrumpydictator@gmail.com
* Copyright (c) 2018 https://github.com/bnw
*
* This file is part of Firefly III.
*
@ -25,6 +25,9 @@ namespace FireflyIII\Support\Import\JobConfiguration\FinTS;
use FireflyIII\Models\ImportJob;
use Illuminate\Support\MessageBag;
/**
*
*/
interface FinTSConfigurationInterface
{
/**

View File

@ -1,7 +1,7 @@
<?php
/**
* NewFinTSJobHandler.php
* Copyright (c) 2017 thegrumpydictator@gmail.com
* Copyright (c) 2018 https://github.com/bnw
*
* This file is part of Firefly III.
*
@ -31,6 +31,10 @@ use FireflyIII\Support\FinTS\FinTS;
use Illuminate\Support\Facades\Crypt;
use Illuminate\Support\MessageBag;
/**
*
* Class NewFinTSJobHandler
*/
class NewFinTSJobHandler implements FinTSConfigurationInterface
{
/** @var ImportJob */
@ -60,14 +64,14 @@ class NewFinTSJobHandler implements FinTSConfigurationInterface
$incomplete = false;
foreach ($config as $value) {
$incomplete = $value === '' or $incomplete;
$incomplete = '' === $value or $incomplete;
}
if ($incomplete) {
return new MessageBag([trans('import.incomplete_fints_form')]);
}
$finTS = app(FinTS::class, ['config' => $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_bank_code' => $config['fints_bank_code'] ?? '',
'fints_username' => $config['fints_username'] ?? ''
'fints_username' => $config['fints_username'] ?? '',
];
}

View File

@ -1,34 +1,92 @@
<?php
/**
* StageImportDataHandler.php
* Copyright (c) 2018 https://github.com/bnw
*
* This file is part of Firefly III.
*
* Firefly III is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Firefly III is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
*/
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();
Log::debug(sprintf('Amount is %s', $amount));
if ($debitOrCredit == Transaction::CD_CREDIT) {
// assume deposit.
$type = TransactionType::DEPOSIT;
} else {
Log::debug(sprintf('Amount is %s', $amount));
// 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];
}
@ -141,12 +182,4 @@ class StageImportDataHandler
return $storeData;
}
/**
* @return array
*/
public function getTransactions(): array
{
return $this->transactions;
}
}

305
composer.lock generated
View File

@ -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",

View File

@ -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,7 +204,7 @@ 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.',