Remove import code.

This commit is contained in:
James Cole
2020-06-06 21:23:26 +02:00
parent 60fa0d7244
commit 6cc4d14fcb
217 changed files with 41 additions and 23415 deletions

View File

@@ -1,181 +0,0 @@
<?php
/**
* ImportController.php
* Copyright (c) 2019 james@firefly-iii.org
*
* This file is part of Firefly III (https://github.com/firefly-iii).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program 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 Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
namespace FireflyIII\Api\V1\Controllers;
use FireflyIII\Helpers\Collector\GroupCollectorInterface;
use FireflyIII\Models\ImportJob;
use FireflyIII\Repositories\ImportJob\ImportJobRepositoryInterface;
use FireflyIII\Support\Http\Api\TransactionFilter;
use FireflyIII\Transformers\ImportJobTransformer;
use FireflyIII\Transformers\TransactionGroupTransformer;
use FireflyIII\User;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Illuminate\Pagination\LengthAwarePaginator;
use Illuminate\Support\Collection;
use League\Fractal\Pagination\IlluminatePaginatorAdapter;
use League\Fractal\Resource\Collection as FractalCollection;
use League\Fractal\Resource\Item;
/**
* Class ImportController
*
* @deprecated
* @codeCoverageIgnore
*/
class ImportController extends Controller
{
use TransactionFilter;
/** @var ImportJobRepositoryInterface Import job repository. */
private $repository;
/**
* ImportController constructor.
*
* @codeCoverageIgnore
*/
public function __construct()
{
parent::__construct();
$this->middleware(
function ($request, $next) {
/** @var User $user */
$user = auth()->user();
$this->repository = app(ImportJobRepositoryInterface::class);
$this->repository->setUser($user);
return $next($request);
}
);
}
/**
* @return JsonResponse
* @codeCoverageIgnore
*/
public function listAll(): JsonResponse
{
// create some objects:
$manager = $this->getManager();
$pageSize = (int) app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data;
// get list of accounts. Count it and split it.
$collection = $this->repository->get();
$count = $collection->count();
$importJobs = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize);
// make paginator:
$paginator = new LengthAwarePaginator($importJobs, $count, $pageSize, $this->parameters->get('page'));
$paginator->setPath(route('api.v1.import.list') . $this->buildParams());
/** @var ImportJobTransformer $transformer */
$transformer = app(ImportJobTransformer::class);
$transformer->setParameters($this->parameters);
$resource = new FractalCollection($importJobs, $transformer, 'import_jobs');
$resource->setPaginator(new IlluminatePaginatorAdapter($paginator));
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
}
/**
* @param ImportJob $importJob
*
* @return JsonResponse
* @codeCoverageIgnore
*/
public function show(ImportJob $importJob): JsonResponse
{
$manager = $this->getManager();
/** @var ImportJobTransformer $transformer */
$transformer = app(ImportJobTransformer::class);
$transformer->setParameters($this->parameters);
$resource = new Item($importJob, $transformer, 'import_jobs');
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
}
/**
* Show all transactions
*
* @param Request $request
* @param ImportJob $importJob
*
* @return JsonResponse
* @codeCoverageIgnore
*/
public function transactions(Request $request, ImportJob $importJob): JsonResponse
{
$pageSize = (int) app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data;
$type = $request->get('type') ?? 'default';
$this->parameters->set('type', $type);
$types = $this->mapTransactionTypes($this->parameters->get('type'));
$manager = $this->getManager();
$tag = $importJob->tag;
$transactions = new Collection();
$paginator = new LengthAwarePaginator($transactions, 0, $pageSize);
$paginator->setPath(route('api.v1.import.transactions', [$importJob->key]) . $this->buildParams());
if (null !== $tag) {
/** @var User $admin */
$admin = auth()->user();
// use new group collector:
/** @var GroupCollectorInterface $collector */
$collector = app(GroupCollectorInterface::class);
$collector
->setUser($admin)
// filter on tag.
->setTag($tag)
// all info needed for the API:
->withAPIInformation()
// set page size:
->setLimit($pageSize)
// set page to retrieve
->setPage($this->parameters->get('page'))
// set types of transactions to return.
->setTypes($types);
if (null !== $this->parameters->get('start') && null !== $this->parameters->get('end')) {
$collector->setRange($this->parameters->get('start'), $this->parameters->get('end'));
}
$paginator = $collector->getPaginatedGroups();
$paginator->setPath(route('api.v1.transactions.index') . $this->buildParams());
$transactions = $paginator->getCollection();
}
/** @var TransactionGroupTransformer $transformer */
$transformer = app(TransactionGroupTransformer::class);
$transformer->setParameters($this->parameters);
$resource = new FractalCollection($transactions, $transformer, 'transactions');
$resource->setPaginator(new IlluminatePaginatorAdapter($paginator));
return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
}
}

View File

@@ -1,76 +0,0 @@
<?php
/**
* CreateCSVImport.php
* Copyright (c) 2020 james@firefly-iii.org
*
* This file is part of Firefly III (https://github.com/firefly-iii).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program 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 Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
/** @noinspection MultipleReturnStatementsInspection */
declare(strict_types=1);
namespace FireflyIII\Console\Commands\Import;
use Exception;
use FireflyIII\Console\Commands\VerifiesAccessToken;
use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Import\Routine\RoutineInterface;
use FireflyIII\Import\Storage\ImportArrayStorage;
use FireflyIII\Models\ImportJob;
use FireflyIII\Repositories\ImportJob\ImportJobRepositoryInterface;
use FireflyIII\Repositories\User\UserRepositoryInterface;
use FireflyIII\User;
use Illuminate\Console\Command;
use Log;
/**
* Class CreateCSVImport.
*
* @deprecated
* @codeCoverageIgnore
*/
class CreateCSVImport extends Command
{
use VerifiesAccessToken;
/**
* The console command description.
*
* @var string
*/
protected $description = 'Use this command to create a new CSV file import.';
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature
= 'firefly-iii:csv-import
{file? : The CSV file to import.}
{configuration? : The configuration file to use for the import.}
{--user=1 : The user ID that the import should import for.}
{--token= : The user\'s access token.}';
/**
* Run the command.
*/
public function handle(): int
{
$this->error('This command is disabled.');
return 1;
}
}

View File

@@ -60,7 +60,7 @@ class ApplyRules extends Command
*/ */
protected $signature protected $signature
= 'firefly-iii:apply-rules = 'firefly-iii:apply-rules
{--user=1 : The user ID that the import should import for.} {--user=1 : The user ID.}
{--token= : The user\'s access token.} {--token= : The user\'s access token.}
{--accounts= : A comma-separated list of asset accounts or liabilities to apply your rules to.} {--accounts= : A comma-separated list of asset accounts or liabilities to apply your rules to.}
{--rule_groups= : A comma-separated list of rule groups to apply. Take the ID\'s of these rule groups from the Firefly III interface.} {--rule_groups= : A comma-separated list of rule groups to apply. Take the ID\'s of these rule groups from the Firefly III interface.}

View File

@@ -224,15 +224,14 @@ class DebugController extends Controller
{ {
$set = RouteFacade::getRoutes(); $set = RouteFacade::getRoutes();
$ignore = ['chart.', 'javascript.', 'json.', 'report-data.', 'popup.', 'debugbar.', 'attachments.download', 'attachments.preview', $ignore = ['chart.', 'javascript.', 'json.', 'report-data.', 'popup.', 'debugbar.', 'attachments.download', 'attachments.preview',
'bills.rescan', 'budgets.income', 'currencies.def', 'error', 'flush', 'help.show', 'import.file', 'bills.rescan', 'budgets.income', 'currencies.def', 'error', 'flush', 'help.show',
'login', 'logout', 'password.reset', 'profile.confirm-email-change', 'profile.undo-email-change', 'login', 'logout', 'password.reset', 'profile.confirm-email-change', 'profile.undo-email-change',
'register', 'report.options', 'routes', 'rule-groups.down', 'rule-groups.up', 'rules.up', 'rules.down', 'register', 'report.options', 'routes', 'rule-groups.down', 'rule-groups.up', 'rules.up', 'rules.down',
'rules.select', 'search.search', 'test-flash', 'transactions.link.delete', 'transactions.link.switch', 'rules.select', 'search.search', 'test-flash', 'transactions.link.delete', 'transactions.link.switch',
'two-factor.lost', 'reports.options', 'debug', 'import.create-job', 'import.download', 'import.start', 'import.status.json', 'two-factor.lost', 'reports.options', 'debug',
'preferences.delete-code', 'rules.test-triggers', 'piggy-banks.remove-money', 'piggy-banks.add-money', 'preferences.delete-code', 'rules.test-triggers', 'piggy-banks.remove-money', 'piggy-banks.add-money',
'accounts.reconcile.transactions', 'accounts.reconcile.overview', 'accounts.reconcile.transactions', 'accounts.reconcile.overview',
'transactions.clone', 'two-factor.index', 'api.v1', 'installer.', 'attachments.view', 'import.create', 'transactions.clone', 'two-factor.index', 'api.v1', 'installer.', 'attachments.view', 'recurring.events',
'import.job.download', 'import.job.start', 'import.job.status.json', 'import.job.store', 'recurring.events',
'recurring.suggest', 'recurring.suggest',
]; ];
$return = '&nbsp;'; $return = '&nbsp;';

View File

@@ -1,82 +0,0 @@
<?php
/**
* CallbackController.php
* Copyright (c) 2019 james@firefly-iii.org
*
* This file is part of Firefly III (https://github.com/firefly-iii).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program 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 Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
namespace FireflyIII\Http\Controllers\Import;
use FireflyIII\Http\Controllers\Controller;
use FireflyIII\Repositories\ImportJob\ImportJobRepositoryInterface;
use Illuminate\Contracts\View\Factory;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\Routing\Redirector;
use Illuminate\View\View;
use Log;
/**
* Class CallbackController
*
* @deprecated
* @codeCoverageIgnore
*/
class CallbackController extends Controller
{
/**
* Callback specifically for YNAB logins.
*
* @param Request $request
*
* @param ImportJobRepositoryInterface $repository
*
* @return Factory|RedirectResponse|Redirector|View
*/
public function ynab(Request $request, ImportJobRepositoryInterface $repository)
{
$code = (string) $request->get('code');
$jobKey = (string) $request->get('state');
if ('' === $code) {
return view('error')->with('message', 'You Need A Budget did not reply with a valid authorization code. Firefly III cannot continue.');
}
$importJob = $repository->findByKey($jobKey);
if ('' === $jobKey || null === $importJob) {
return view('error')->with('message', 'You Need A Budget did not reply with the correct state identifier. Firefly III cannot continue.');
}
Log::debug(sprintf('Got a code from YNAB: %s', $code));
// we have a code. Make the job ready for the next step, and then redirect the user.
$configuration = $repository->getConfiguration($importJob);
$configuration['auth_code'] = $code;
$repository->setConfiguration($importJob, $configuration);
// set stage to make the import routine take the correct action:
$repository->setStatus($importJob, 'ready_to_run');
$repository->setStage($importJob, 'get_access_token');
return redirect(route('import.job.status.index', [$importJob->key]));
}
}

View File

@@ -1,198 +0,0 @@
<?php
/**
* IndexController.php
* Copyright (c) 2019 james@firefly-iii.org
*
* This file is part of Firefly III (https://github.com/firefly-iii).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program 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 Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
namespace FireflyIII\Http\Controllers\Import;
use FireflyIII\Http\Controllers\Controller;
use FireflyIII\Import\Prerequisites\PrerequisitesInterface;
use FireflyIII\Models\ImportJob;
use FireflyIII\Repositories\ImportJob\ImportJobRepositoryInterface;
use FireflyIII\Repositories\User\UserRepositoryInterface;
use FireflyIII\Support\Binder\ImportProvider;
use Illuminate\Contracts\View\Factory;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Response as LaravelResponse;
use Illuminate\Routing\Redirector;
use Illuminate\View\View;
use Log;
/**
*
* Class IndexController
*
* @deprecated
* @codeCoverageIgnore
*/
class IndexController extends Controller
{
/** @var array All available providers */
public $providers;
/** @var ImportJobRepositoryInterface The import job repository */
public $repository;
/** @var UserRepositoryInterface The user repository */
public $userRepository;
/**
* IndexController constructor.
*/
public function __construct()
{
parent::__construct();
$this->middleware(
function ($request, $next) {
app('view')->share('mainTitleIcon', 'fa-archive');
app('view')->share('title', (string) trans('firefly.import_index_title'));
$this->repository = app(ImportJobRepositoryInterface::class);
$this->userRepository = app(UserRepositoryInterface::class);
$this->providers = ImportProvider::getProviders();
return $next($request);
}
);
}
/**
* Creates a new import job for $importProvider.
*
* @param string $importProvider
*
* @return RedirectResponse|Redirector
*
*/
public function create(string $importProvider)
{
$hasPreReq = (bool) config(sprintf('import.has_prereq.%s', $importProvider));
$hasConfig = (bool) config(sprintf('import.has_job_config.%s', $importProvider));
$allowedForDemo = (bool) config(sprintf('import.allowed_for_demo.%s', $importProvider));
$isDemoUser = $this->userRepository->hasRole(auth()->user(), 'demo');
Log::debug(sprintf('Will create job for provider "%s"', $importProvider));
Log::debug(sprintf('Is demo user? %s', var_export($isDemoUser, true)));
Log::debug(sprintf('Is allowed for user? %s', var_export($allowedForDemo, true)));
Log::debug(sprintf('Has prerequisites? %s', var_export($hasPreReq, true)));
Log::debug(sprintf('Has config? %s', var_export($hasConfig, true)));
// @codeCoverageIgnoreStart
if ($isDemoUser && !$allowedForDemo) {
Log::debug('User is demo and this provider doesnt work for demo users.');
return redirect(route('import.index'));
}
// @codeCoverageIgnoreEnd
$importJob = $this->repository->create($importProvider);
Log::debug(sprintf('Created job #%d for provider %s', $importJob->id, $importProvider));
// no prerequisites but job has config:
if (false === $hasPreReq && false !== $hasConfig) {
Log::debug('Provider has no prerequisites. Continue.');
$this->repository->setStatus($importJob, 'has_prereq');
Log::debug('Redirect to configuration.');
return redirect(route('import.job.configuration.index', [$importJob->key]));
}
// job has prerequisites:
Log::debug('Job provider has prerequisites.');
/** @var PrerequisitesInterface $providerPre */
$providerPre = app((string) config(sprintf('import.prerequisites.%s', $importProvider)));
$providerPre->setUser($importJob->user);
// and are not filled in:
if (!$providerPre->isComplete()) {
Log::debug('Job provider prerequisites are not yet filled in. Redirect to prerequisites-page.');
// redirect to global prerequisites
return redirect(route('import.prerequisites.index', [$importProvider, $importJob->key]));
}
Log::debug('Prerequisites are complete.');
// but are filled in:
$this->repository->setStatus($importJob, 'has_prereq');
// and has no config:
if (false === $hasConfig) {
// @codeCoverageIgnoreStart
Log::debug('Provider has no configuration. Job is ready to start.');
$this->repository->setStatus($importJob, 'ready_to_run');
Log::debug('Redirect to status-page.');
return redirect(route('import.job.status.index', [$importJob->key]));
// @codeCoverageIgnoreEnd
}
// but also needs config:
Log::debug('Job has configuration. Redirect to job-config.');
// Otherwise just redirect to job configuration.
return redirect(route('import.job.configuration.index', [$importJob->key]));
}
/**
* Generate a JSON file of the job's configuration and send it to the user.
*
* @param ImportJob $job
*
* @return LaravelResponse
*/
public function download(ImportJob $job): LaravelResponse
{
Log::debug('Now in download()', ['job' => $job->key]);
$config = $this->repository->getConfiguration($job);
// This is CSV import specific:
$config['delimiter'] = $config['delimiter'] ?? ',';
$config['delimiter'] = "\t" === $config['delimiter'] ? 'tab' : $config['delimiter'];
$result = json_encode($config, JSON_PRETTY_PRINT);
$name = sprintf('"%s"', addcslashes('import-configuration-' . date('Y-m-d') . '.json', '"\\'));
/** @var LaravelResponse $response */
$response = response($result);
$response->header('Content-disposition', 'attachment; filename=' . $name)
->header('Content-Type', 'application/json')
->header('Content-Description', 'File Transfer')
->header('Connection', 'Keep-Alive')
->header('Expires', '0')
->header('Cache-Control', 'must-revalidate, post-check=0, pre-check=0')
->header('Pragma', 'public')
->header('Content-Length', strlen($result));
return $response;
}
/**
* General import index.
*
* @return Factory|View
*/
public function index()
{
$providers = $this->providers;
$subTitle = (string) trans('import.index_breadcrumb');
$subTitleIcon = 'fa-home';
$isDemoUser = $this->userRepository->hasRole(auth()->user(), 'demo');
return view('import.index', compact('subTitle', 'subTitleIcon', 'providers', 'isDemoUser'));
}
}

View File

@@ -1,169 +0,0 @@
<?php
/**
* JobConfigurationController.php
* Copyright (c) 2019 james@firefly-iii.org
*
* This file is part of Firefly III (https://github.com/firefly-iii).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program 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 Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
namespace FireflyIII\Http\Controllers\Import;
use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Http\Controllers\Controller;
use FireflyIII\Models\ImportJob;
use FireflyIII\Repositories\ImportJob\ImportJobRepositoryInterface;
use FireflyIII\Support\Http\Controllers\CreateStuff;
use Illuminate\Contracts\View\Factory;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\Http\UploadedFile;
use Illuminate\Routing\Redirector;
use Illuminate\Support\MessageBag;
use Illuminate\View\View;
use Log;
/**
* Class JobConfigurationController
*
* @deprecated
* @codeCoverageIgnore
*/
class JobConfigurationController extends Controller
{
use CreateStuff;
/** @var ImportJobRepositoryInterface The import job repository */
public $repository;
/**
* JobConfigurationController constructor.
*/
public function __construct()
{
parent::__construct();
$this->middleware(
function ($request, $next) {
app('view')->share('mainTitleIcon', 'fa-archive');
app('view')->share('title', (string) trans('firefly.import_index_title'));
$this->repository = app(ImportJobRepositoryInterface::class);
return $next($request);
}
);
}
/**
* Configure the job. This method is returned to until job is deemed "configured".
*
* @param ImportJob $importJob
*
* @throws FireflyException
*
* @return Factory|RedirectResponse|Redirector|View
*
*/
public function index(ImportJob $importJob)
{
Log::debug('Now in JobConfigurationController::index()');
$allowed = ['has_prereq', 'need_job_config'];
if (null !== $importJob && !in_array($importJob->status, $allowed, true)) {
Log::error(sprintf('Job has state "%s", but we only accept %s', $importJob->status, json_encode($allowed)));
session()->flash('error', (string) trans('import.bad_job_status', ['status' => e($importJob->status)]));
return redirect(route('import.index'));
}
Log::debug(sprintf('Now in JobConfigurationController::index() with job "%s" and status "%s"', $importJob->key, $importJob->status));
// if provider has no config, just push it through:
$importProvider = $importJob->provider;
if (!(bool) config(sprintf('import.has_job_config.%s', $importProvider))) {
// @codeCoverageIgnoreStart
Log::debug('Job needs no config, is ready to run!');
$this->repository->setStatus($importJob, 'ready_to_run');
return redirect(route('import.job.status.index', [$importJob->key]));
// @codeCoverageIgnoreEnd
}
$configurator = $this->makeConfigurator($importJob);
if ($configurator->configurationComplete()) {
Log::debug('Config is complete, set status to ready_to_run.');
$this->repository->setStatus($importJob, 'ready_to_run');
return redirect(route('import.job.status.index', [$importJob->key]));
}
$view = $configurator->getNextView();
$data = $configurator->getNextData();
$subTitle = (string) trans('import.job_configuration_breadcrumb', ['key' => $importJob->key]);
$subTitleIcon = 'fa-wrench';
return view($view, compact('data', 'importJob', 'subTitle', 'subTitleIcon'));
}
/**
* Store the configuration. Returns to "configure" method until job is configured.
*
* @param Request $request
* @param ImportJob $importJob
*
* @throws FireflyException
* @return RedirectResponse|Redirector
*
*/
public function post(Request $request, ImportJob $importJob)
{
// catch impossible status:
$allowed = ['has_prereq', 'need_job_config'];
if (null !== $importJob && !in_array($importJob->status, $allowed, true)) {
session()->flash('error', (string) trans('import.bad_job_status', ['status' => e($importJob->status)]));
return redirect(route('import.index'));
}
Log::debug('Now in postConfigure()', ['job' => $importJob->key]);
$configurator = $this->makeConfigurator($importJob);
// is the job already configured?
if ($configurator->configurationComplete()) {
$this->repository->setStatus($importJob, 'ready_to_run');
return redirect(route('import.job.status.index', [$importJob->key]));
}
// uploaded files are attached to the job.
// the configurator can then handle them.
$result = new MessageBag;
/** @var UploadedFile $upload */
foreach ($request->allFiles() as $name => $upload) {
$result = $this->repository->storeFileUpload($importJob, $name, $upload);
}
$data = $request->all();
$messages = $configurator->configureJob($data);
$result->merge($messages);
if ($messages->count() > 0) {
$request->session()->flash('warning', $messages->first());
}
// return to configure
return redirect(route('import.job.configuration.index', [$importJob->key]));
}
}

View File

@@ -1,240 +0,0 @@
<?php
/**
* JobStatusController.php
* Copyright (c) 2019 james@firefly-iii.org
*
* This file is part of Firefly III (https://github.com/firefly-iii).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program 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 Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
namespace FireflyIII\Http\Controllers\Import;
use Exception;
use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Http\Controllers\Controller;
use FireflyIII\Import\Routine\RoutineInterface;
use FireflyIII\Models\ImportJob;
use FireflyIII\Repositories\ImportJob\ImportJobRepositoryInterface;
use FireflyIII\Support\Http\Controllers\CreateStuff;
use Illuminate\Http\JsonResponse;
use Log;
/**
* Class JobStatusController
*
* @deprecated
* @codeCoverageIgnore
*/
class JobStatusController extends Controller
{
use CreateStuff;
/** @var ImportJobRepositoryInterface The import job repository */
private $repository;
/**
* JobStatusController constructor.
*/
public function __construct()
{
parent::__construct();
// set time limit to zero to prevent timeouts.
set_time_limit(0);
$this->middleware(
function ($request, $next) {
app('view')->share('mainTitleIcon', 'fa-archive');
app('view')->share('title', (string) trans('firefly.import_index_title'));
$this->repository = app(ImportJobRepositoryInterface::class);
return $next($request);
}
);
}
/**
* Index for job status.
*
* @param ImportJob $importJob
*
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
*/
public function index(ImportJob $importJob)
{
$subTitleIcon = 'fa-gear';
$subTitle = (string) trans('import.job_status_breadcrumb', ['key' => $importJob->key]);
return view('import.status', compact('importJob', 'subTitle', 'subTitleIcon'));
}
/**
* JSON overview of job status.
*
* @param ImportJob $importJob
*
* @return JsonResponse
*/
public function json(ImportJob $importJob): JsonResponse
{
$count = $this->repository->countTransactions($importJob);
$json = [
'status' => $importJob->status,
'errors' => $importJob->errors,
'count' => $count,
'tag_id' => $importJob->tag_id,
'tag_name' => null === $importJob->tag_id ? null : $importJob->tag->tag,
'report_txt' => (string) trans('import.unknown_import_result'),
'download_config' => false,
'download_config_text' => '',
];
if ('file' === $importJob->provider) {
$json['download_config'] = true;
$json['download_config_text']
= trans('import.should_download_config', ['route' => route('import.job.download', [$importJob->key])]) . ' '
. trans('import.share_config_file');
}
// if count is zero:
if (null !== $importJob->tag_id) {
$count = $this->repository->countByTag($importJob);
}
if (0 === $count) {
$json['report_txt'] = (string) trans('import.result_no_transactions');
}
if (1 === $count && null !== $importJob->tag_id) {
$json['report_txt'] = trans(
'import.result_one_transaction',
['route' => route('tags.show', [$importJob->tag_id, 'all']), 'tag' => $importJob->tag->tag]
);
}
if ($count > 1 && null !== $importJob->tag_id) {
$json['report_txt'] = trans(
'import.result_many_transactions',
['count' => $count, 'route' => route('tags.show', [$importJob->tag_id, 'all']), 'tag' => $importJob->tag->tag]
);
}
return response()->json($json);
}
/**
* Calls to start the job.
*
* @param ImportJob $importJob
*
* @return JsonResponse
*/
public function start(ImportJob $importJob): JsonResponse
{
Log::info('Now in JobStatusController::start');
// catch impossible status:
$allowed = ['ready_to_run', 'need_job_config'];
if (null !== $importJob && !in_array($importJob->status, $allowed, true)) {
Log::error(sprintf('Job is not ready. Status should be in array, but is %s', $importJob->status), $allowed);
$this->repository->setStatus($importJob, 'error');
return response()->json(
['status' => 'NOK', 'message' => sprintf('JobStatusController::start expects status "ready_to_run" instead of "%s".', $importJob->status)]
);
}
$importProvider = $importJob->provider;
$key = sprintf('import.routine.%s', $importProvider);
$className = config($key);
if (null === $className || !class_exists($className)) {
// @codeCoverageIgnoreStart
$message = sprintf('Cannot find import routine class for job of type "%s".', $importProvider);
Log::error($message);
return response()->json(
['status' => 'NOK', 'message' => $message]
);
// @codeCoverageIgnoreEnd
}
/** @var RoutineInterface $routine */
$routine = app($className);
$routine->setImportJob($importJob);
Log::debug(sprintf('Created class of type %s', $className));
try {
Log::debug(sprintf('Try to call %s:run()', $className));
$routine->run();
} catch (FireflyException|Exception $e) {
$message = 'The import routine crashed: ' . $e->getMessage();
Log::error($message);
Log::error($e->getTraceAsString());
// set job errored out:
$this->repository->setStatus($importJob, 'error');
return response()->json(['status' => 'NOK', 'message' => $message]);
}
// expect nothing from routine, just return OK to user.
Log::info('Now finished with JobStatusController::start');
return response()->json(['status' => 'OK', 'message' => 'stage_finished']);
}
/**
* Store does three things:
*
* - Store the transactions.
* - Add them to a tag.
*
* @param ImportJob $importJob
*
* @return JsonResponse
*/
public function store(ImportJob $importJob): JsonResponse
{
Log::info('Now in JobStatusController::store');
// catch impossible status:
$allowed = ['provider_finished', 'storing_data'];
if (null !== $importJob && !in_array($importJob->status, $allowed, true)) {
Log::error(sprintf('Job is not ready. Status should be in array, but is %s', $importJob->status), $allowed);
return response()->json(
['status' => 'NOK', 'message' => sprintf('JobStatusController::start expects status "provider_finished" instead of "%s".', $importJob->status)]
);
}
// set job to be storing data:
$this->repository->setStatus($importJob, 'storing_data');
try {
$this->storeTransactions($importJob);
} catch (FireflyException $e) {
$message = 'The import storage routine crashed: ' . $e->getMessage();
Log::error($message);
Log::error($e->getTraceAsString());
// set job errored out:
$this->repository->setStatus($importJob, 'error');
return response()->json(['status' => 'NOK', 'message' => $message]);
}
// set storage to be finished:
$this->repository->setStatus($importJob, 'storage_finished');
Log::info('Now finished with JobStatusController::start');
// expect nothing from routine, just return OK to user.
return response()->json(['status' => 'OK', 'message' => 'storage_finished']);
}
}

View File

@@ -1,177 +0,0 @@
<?php
/**
* PrerequisitesController.php
* Copyright (c) 2019 james@firefly-iii.org
*
* This file is part of Firefly III (https://github.com/firefly-iii).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program 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 Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
namespace FireflyIII\Http\Controllers\Import;
use FireflyIII\Http\Controllers\Controller;
use FireflyIII\Import\Prerequisites\PrerequisitesInterface;
use FireflyIII\Models\ImportJob;
use FireflyIII\Repositories\ImportJob\ImportJobRepositoryInterface;
use FireflyIII\User;
use Illuminate\Contracts\View\Factory;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\Routing\Redirector;
use Illuminate\View\View;
use Log;
/**
* Class PrerequisitesController
*
* @deprecated
* @codeCoverageIgnore
*/
class PrerequisitesController extends Controller
{
/** @var ImportJobRepositoryInterface The import job repository */
private $repository;
/**
* PrerequisitesController constructor.
*/
public function __construct()
{
parent::__construct();
$this->middleware(
function ($request, $next) {
app('view')->share('mainTitleIcon', 'fa-archive');
app('view')->share('title', (string) trans('firefly.import_index_title'));
app('view')->share('subTitleIcon', 'fa-check');
$this->repository = app(ImportJobRepositoryInterface::class);
return $next($request);
}
);
}
/**
* This method will process and store import provider global prerequisites
* such as API keys.
*
* @param string $importProvider
* @param ImportJob $importJob
*
* @return Factory|RedirectResponse|Redirector|View
*/
public function index(string $importProvider, ImportJob $importJob = null)
{
// catch impossible status:
$allowed = ['new'];
if (null !== $importJob && !in_array($importJob->status, $allowed, true)) {
Log::error(sprintf('Job has state "%s" but this Prerequisites::index() only accepts %s', $importJob->status, json_encode($allowed)));
session()->flash('error', (string) trans('import.bad_job_status', ['status' => e($importJob->status)]));
return redirect(route('import.index'));
}
app('view')->share('subTitle', (string) trans('import.prerequisites_breadcrumb_' . $importProvider));
$class = (string) config(sprintf('import.prerequisites.%s', $importProvider));
/** @var User $user */
$user = auth()->user();
/** @var PrerequisitesInterface $object */
$object = app($class);
$object->setUser($user);
if (null !== $importJob && $object->isComplete()) {
// update job:
$this->repository->setStatus($importJob, 'has_prereq');
// redirect to job config:
return redirect(route('import.job.configuration.index', [$importJob->key]));
}
$view = $object->getView();
$parameters = ['title' => (string) trans('firefly.import_index_title'), 'mainTitleIcon' => 'fa-archive', 'importJob' => $importJob];
$parameters = array_merge($object->getViewParameters(), $parameters);
return view($view, $parameters);
}
/**
* This method processes the prerequisites the user has entered in the previous step.
*
* Whatever storePrerequisites does, it should make sure that the system is ready to continue immediately. So
* no extra calls or stuff, except maybe to open a session
*
* @param Request $request
* @param string $importProvider
* @param ImportJob $importJob
*
* @return RedirectResponse|Redirector
* @see PrerequisitesInterface::storePrerequisites
*
*/
public function post(Request $request, string $importProvider, ImportJob $importJob = null)
{
Log::debug(sprintf('Now in postPrerequisites for %s', $importProvider));
// catch impossible status:
$allowed = ['new'];
if (null !== $importJob && !in_array($importJob->status, $allowed, true)) {
Log::error(sprintf('Job has state "%s" but this Prerequisites::post() only accepts %s', $importJob->status, json_encode($allowed)));
session()->flash('error', (string) trans('import.bad_job_status', ['status' => e($importJob->status)]));
return redirect(route('import.index'));
}
$class = (string) config(sprintf('import.prerequisites.%s', $importProvider));
/** @var User $user */
$user = auth()->user();
/** @var PrerequisitesInterface $object */
$object = app($class);
$object->setUser($user);
Log::debug('Going to store entered prerequisites.');
// store post data
$data = $request->all();
$result = $object->storePrerequisites($data);
Log::debug(sprintf('Result of storePrerequisites has message count: %d', $result->count()));
if ($result->count() > 0) {
$request->session()->flash('error', e($result->first()));
// redirect back to job, if has job:
return redirect(route('import.prerequisites.index', [$importProvider, $importJob->key ?? '']))->withInput();
}
// session flash!
$request->session()->flash('success', (string) trans('import.prerequisites_saved_for_' . $importProvider));
// if has job, redirect to global config for provider
// if no job, back to index!
if (null === $importJob) {
return redirect(route('import.index'));
}
// update job:
$this->repository->setStatus($importJob, 'has_prereq');
// redirect to job config:
return redirect(route('import.job.configuration.index', [$importJob->key]));
}
}

View File

@@ -1,234 +0,0 @@
<?php
/**
* Amount.php
* Copyright (c) 2019 james@firefly-iii.org
*
* This file is part of Firefly III (https://github.com/firefly-iii).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program 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 Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
namespace FireflyIII\Import\Converter;
use Log;
/**
* Class Amount.
*
* @deprecated
* @codeCoverageIgnore
*/
class Amount implements ConverterInterface
{
/**
* Some people, when confronted with a problem, think "I know, I'll use regular expressions." Now they have two problems.
* - Jamie Zawinski.
*
* @param $value
*
* @return string
*/
public function convert($value): string
{
if (null === $value) {
return '0';
}
Log::debug(sprintf('Start with amount "%s"', $value));
$original = $value;
$value = $this->stripAmount((string) $value);
$decimal = null;
if ($this->decimalIsDot($value)) {
$decimal = '.';
Log::debug(sprintf('Decimal character in "%s" seems to be a dot.', $value));
}
if ($this->decimalIsComma($value)) {
$decimal = ',';
Log::debug(sprintf('Decimal character in "%s" seems to be a comma.', $value));
}
// decimal character is null? find out if "0.1" or ".1" or "0,1" or ",1"
if ($this->alternativeDecimalSign($value)) {
$decimal = $this->getAlternativeDecimalSign($value);
}
// decimal character still null? Search from the left for '.',',' or ' '.
if (null === $decimal) {
$decimal = $this->findFromLeft($value);
}
// if decimal is dot, replace all comma's and spaces with nothing
if (null !== $decimal) {
$value = $this->replaceDecimal($decimal, $value);
Log::debug(sprintf('Converted amount from "%s" to "%s".', $original, $value));
}
if (null === $decimal) {
// replace all:
$search = ['.', ' ', ','];
$value = str_replace($search, '', $value);
Log::debug(sprintf('No decimal character found. Converted amount from "%s" to "%s".', $original, $value));
}
if (strpos($value, '.') === 0) {
$value = '0' . $value;
}
if (is_numeric($value)) {
Log::debug(sprintf('Final NUMERIC value is: "%s"', $value));
return $value;
}
// @codeCoverageIgnoreStart
Log::debug(sprintf('Final value is: "%s"', $value));
$formatted = sprintf('%01.12f', $value);
Log::debug(sprintf('Is formatted to : "%s"', $formatted));
return $formatted;
// @codeCoverageIgnoreEnd
}
/**
* Check if the value has a dot or comma on an alternative place,
* catching strings like ",1" or ".5".
*
* @param string $value
*
* @return bool
*/
private function alternativeDecimalSign(string $value): bool
{
$length = strlen($value);
$altPosition = $length - 2;
return $length > 1 && ('.' === $value[$altPosition] || ',' === $value[$altPosition]);
}
/**
* Helper function to see if the decimal separator is a comma.
*
* @param string $value
*
* @return bool
*/
private function decimalIsComma(string $value): bool
{
$length = strlen($value);
$decimalPosition = $length - 3;
return $length > 2 && ',' === $value[$decimalPosition];
}
/**
* Helper function to see if the decimal separator is a dot.
*
* @param string $value
*
* @return bool
*/
private function decimalIsDot(string $value): bool
{
$length = strlen($value);
$decimalPosition = $length - 3;
return ($length > 2 && '.' === $value[$decimalPosition]) || ($length > 2 && strpos($value, '.') > $decimalPosition);
}
/**
* Search from the left for decimal sign.
*
* @param string $value
*
* @return string
*/
private function findFromLeft(string $value): ?string
{
$decimal = null;
Log::debug('Decimal is still NULL, probably number with >2 decimals. Search for a dot.');
$res = strrpos($value, '.');
if (!(false === $res)) {
// blandly assume this is the one.
Log::debug(sprintf('Searched from the left for "." in amount "%s", assume this is the decimal sign.', $value));
$decimal = '.';
}
return $decimal;
}
/**
* Returns the alternative decimal point used, such as a dot or a comma,
* from strings like ",1" or "0.5".
*
* @param string $value
*
* @return string
*/
private function getAlternativeDecimalSign(string $value): string
{
$length = strlen($value);
$altPosition = $length - 2;
return $value[$altPosition];
}
/**
* Replaces other characters like thousand separators with nothing to make the decimal separator the only special
* character in the string.
*
* @param string $decimal
* @param string $value
*
* @return string
*/
private function replaceDecimal(string $decimal, string $value): string
{
$search = [',', ' ']; // default when decimal sign is a dot.
if (',' === $decimal) {
$search = ['.', ' '];
}
$value = str_replace($search, '', $value);
/** @noinspection CascadeStringReplacementInspection */
$value = str_replace(',', '.', $value);
return $value;
}
/**
* Strip amount from weird characters.
*
* @param string $value
*
* @return string
*/
private function stripAmount(string $value): string
{
if (0 === strpos($value, '--')) {
$value = substr($value, 2);
}
// have to strip the € because apparantly the Postbank (DE) thinks "1.000,00 €" is a normal way to format a number.
$value = trim((string) str_replace(['€'], '', $value));
$str = preg_replace('/[^\-\(\)\.\,0-9 ]/', '', $value);
$len = strlen($str);
if ('(' === $str[0] && ')' === $str[$len - 1]) {
$str = '-' . substr($str, 1, $len - 2);
}
Log::debug(sprintf('Stripped "%s" away to "%s"', $value, $str));
return $str;
}
}

View File

@@ -1,49 +0,0 @@
<?php
/**
* AmountCredit.php
* Copyright (c) 2019 james@firefly-iii.org
*
* This file is part of Firefly III (https://github.com/firefly-iii).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program 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 Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
namespace FireflyIII\Import\Converter;
/**
* Class AmountCredit
*
* @deprecated
* @codeCoverageIgnore
*/
class AmountCredit implements ConverterInterface
{
/**
* Convert an amount, always return positive.
*
* @param $value
*
* @return string
*/
public function convert($value): string
{
/** @var ConverterInterface $converter */
$converter = app(Amount::class);
$result = $converter->convert($value);
$result = app('steam')->positive($result);
return $result;
}
}

View File

@@ -1,50 +0,0 @@
<?php
/**
* AmountDebit.php
* Copyright (c) 2019 james@firefly-iii.org
*
* This file is part of Firefly III (https://github.com/firefly-iii).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program 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 Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
namespace FireflyIII\Import\Converter;
/**
* Class AmountDebit
*
* @deprecated
* @codeCoverageIgnore
*/
class AmountDebit implements ConverterInterface
{
/**
* Convert amount, always return positive.
*
* @param $value
*
* @return string
*/
public function convert($value): string
{
/** @var ConverterInterface $converter */
$converter = app(Amount::class);
$result = $converter->convert($value);
$result = app('steam')->positive($result);
$result = bcmul($result, '-1');
return $result;
}
}

View File

@@ -1,49 +0,0 @@
<?php
/**
* AmountNegated.php
* Copyright (c) 2019 james@firefly-iii.org
*
* This file is part of Firefly III (https://github.com/firefly-iii).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program 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 Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
namespace FireflyIII\Import\Converter;
/**
* Class AmountNegated
*
* @deprecated
* @codeCoverageIgnore
*/
class AmountNegated implements ConverterInterface
{
/**
* Negate amount.
*
* @param $value
*
* @return string
*/
public function convert($value): string
{
/** @var ConverterInterface $converter */
$converter = app(Amount::class);
$result = $converter->convert($value);
$result = bcmul($result, '-1');
return $result;
}
}

View File

@@ -1,64 +0,0 @@
<?php
/**
* BankDebitCredit.php
* Copyright (c) 2019 james@firefly-iii.org
*
* This file is part of Firefly III (https://github.com/firefly-iii).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program 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 Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
namespace FireflyIII\Import\Converter;
use Log;
/**
*
* Class BankDebitCredit
*
* @deprecated
* @codeCoverageIgnore
*/
class BankDebitCredit implements ConverterInterface
{
/**
* Convert a value.
*
* @param $value
*
* @return int
*/
public function convert($value): int
{
Log::debug('Going to convert ', ['value' => $value]);
$negative = [
'D', // Old style Rabobank (NL). Short for "Debit"
'A', // New style Rabobank (NL). Short for "Af"
'DR', // https://old.reddit.com/r/FireflyIII/comments/bn2edf/generic_debitcredit_indicator/
'Af', // ING (NL).
'Debet', // Triodos (NL)
'S', // "Soll", German term for debit
'Debit', // Community America (US)
];
if (in_array(trim($value), $negative, true)) {
return -1;
}
return 1;
}
}

View File

@@ -1,42 +0,0 @@
<?php
/**
* ConverterInterface.php
* Copyright (c) 2019 james@firefly-iii.org
*
* This file is part of Firefly III (https://github.com/firefly-iii).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program 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 Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
namespace FireflyIII\Import\Converter;
/**
* Interface ConverterInterface.
*
* @deprecated
* @codeCoverageIgnore
*/
interface ConverterInterface
{
/**
* Convert a value.
*
* @param $value
*
* @return mixed
*
*/
public function convert($value);
}

View File

@@ -1,136 +0,0 @@
<?php
/**
* BunqJobConfiguration.php
* Copyright (c) 2019 james@firefly-iii.org
*
* This file is part of Firefly III (https://github.com/firefly-iii).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program 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 Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
namespace FireflyIII\Import\JobConfiguration;
use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Models\ImportJob;
use FireflyIII\Repositories\ImportJob\ImportJobRepositoryInterface;
use FireflyIII\Support\Import\JobConfiguration\Bunq\BunqJobConfigurationInterface;
use FireflyIII\Support\Import\JobConfiguration\Bunq\ChooseAccountsHandler;
use FireflyIII\Support\Import\JobConfiguration\Bunq\NewBunqJobHandler;
use Illuminate\Support\MessageBag;
use Log;
/**
* Class BunqJobConfiguration
*
* @deprecated
* @codeCoverageIgnore
*/
class BunqJobConfiguration implements JobConfigurationInterface
{
/** @var BunqJobConfigurationInterface Bunq job interface */
private $handler;
/** @var ImportJob The import job */
private $importJob;
/** @var ImportJobRepositoryInterface Import job repository */
private $repository;
/**
* Returns true when the initial configuration for this job is complete.
*
* @return bool
*/
public function configurationComplete(): bool
{
return $this->handler->configurationComplete();
}
/**
* Store any data from the $data array into the job. Anything in the message bag will be flashed
* as an error to the user, regardless of its content.
*
* @param array $data
*
* @return MessageBag
*/
public function configureJob(array $data): MessageBag
{
return $this->handler->configureJob($data);
}
/**
* Return the data required for the next step in the job configuration.
*
* @return array
*/
public function getNextData(): array
{
return $this->handler->getNextData();
}
/**
* Returns the view of the next step in the job configuration.
*
* @return string
*/
public function getNextView(): string
{
return $this->handler->getNextView();
}
/**
* Set import job.
*
* @param ImportJob $importJob
*
* @throws FireflyException
*/
public function setImportJob(ImportJob $importJob): void
{
$this->importJob = $importJob;
$this->repository = app(ImportJobRepositoryInterface::class);
$this->repository->setUser($importJob->user);
$this->handler = $this->getHandler();
}
/**
* Get correct handler.
*
* @throws FireflyException
* @return BunqJobConfigurationInterface
*/
private function getHandler(): BunqJobConfigurationInterface
{
Log::debug(sprintf('Now in BunqJobConfiguration::getHandler() with stage "%s"', $this->importJob->stage));
$handler = null;
switch ($this->importJob->stage) {
case 'new':
$handler = app(NewBunqJobHandler::class);
$handler->setImportJob($this->importJob);
break;
case 'choose-accounts':
/** @var ChooseAccountsHandler $handler */
$handler = app(ChooseAccountsHandler::class);
$handler->setImportJob($this->importJob);
break;
default:
// @codeCoverageIgnoreStart
throw new FireflyException(sprintf('Firefly III cannot create a configuration handler for stage "%s"', $this->importJob->stage));
// @codeCoverageIgnoreEnd
}
return $handler;
}
}

View File

@@ -1,169 +0,0 @@
<?php
/**
* FakeJobConfiguration.php
* Copyright (c) 2019 james@firefly-iii.org
*
* This file is part of Firefly III (https://github.com/firefly-iii).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program 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 Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
namespace FireflyIII\Import\JobConfiguration;
use FireflyIII\Models\ImportJob;
use FireflyIII\Repositories\ImportJob\ImportJobRepositoryInterface;
use Illuminate\Support\MessageBag;
/**
* Class FakeJobConfiguration
*
* @deprecated
* @codeCoverageIgnore
*/
class FakeJobConfiguration implements JobConfigurationInterface
{
/** @var ImportJob The import job */
private $importJob;
/** @var ImportJobRepositoryInterface Import job repository */
private $repository;
/**
* Returns true when the initial configuration for this job is complete.
* configuration array of job must have two values:
* 'artist' must be 'david bowie', case insensitive
* 'song' must be 'golden years', case insensitive.
* if stage is not "new", then album must be 'station to station'
*
* @return bool
*
*/
public function configurationComplete(): bool
{
$config = $this->importJob->configuration;
if ('new' === $this->importJob->stage) {
return
isset($config['artist'], $config['song'], $config['apply-rules'])
&& 'david bowie' === strtolower($config['artist'])
&& 'golden years' === strtolower($config['song']);
}
return isset($config['album']) && 'station to station' === strtolower($config['album']);
}
/**
* Store any data from the $data array into the job.
*
* @param array $data
*
* @return MessageBag
*
*/
public function configureJob(array $data): MessageBag
{
$artist = strtolower($data['artist'] ?? '');
$song = strtolower($data['song'] ?? '');
$album = strtolower($data['album'] ?? '');
$applyRules = isset($data['apply_rules']) ? 1 === (int) $data['apply_rules'] : null;
$configuration = $this->importJob->configuration;
if ('david bowie' === $artist) {
// store artist
$configuration['artist'] = $artist;
}
if ('golden years' === $song) {
// store song
$configuration['song'] = $song;
}
if ('station to station' === $album) {
// store album
$configuration['album'] = $album;
}
if (null !== $applyRules) {
$configuration['apply-rules'] = $applyRules;
}
$this->repository->setConfiguration($this->importJob, $configuration);
$messages = new MessageBag();
if (3 !== count($configuration)) {
$messages->add('some_key', 'Ignore this error: ' . count($configuration));
}
return $messages;
}
/**
* Return the data required for the next step in the job configuration.
*
* @codeCoverageIgnore
* @return array
*/
public function getNextData(): array
{
return [
'rulesOptions' => [
1 => (string) trans('firefly.yes'),
0 => (string) trans('firefly.no'),
],
];
}
/**
* Returns the view of the next step in the job configuration.
*
* @return string
*
*/
public function getNextView(): string
{
// first configure artist:
$config = $this->importJob->configuration;
$artist = $config['artist'] ?? '';
$song = $config['song'] ?? '';
$album = $config['album'] ?? '';
$applyRules = $config['apply-rules'] ?? null;
if (null === $applyRules) {
return 'import.fake.apply-rules';
}
if ('david bowie' !== strtolower($artist)) {
return 'import.fake.enter-artist';
}
if ('golden years' !== strtolower($song)) {
return 'import.fake.enter-song';
}
if ('new' !== $this->importJob->stage && 'station to station' !== strtolower($album)) {
return 'import.fake.enter-album';
}
return 'impossible-view'; // @codeCoverageIgnore
}
/**
* Set import job.
*
* @param ImportJob $importJob
*/
public function setImportJob(ImportJob $importJob): void
{
$this->importJob = $importJob;
$this->repository = app(ImportJobRepositoryInterface::class);
$this->repository->setUser($importJob->user);
}
}

View File

@@ -1,161 +0,0 @@
<?php
/**
* FileJobConfiguration.php
* Copyright (c) 2019 james@firefly-iii.org
*
* This file is part of Firefly III (https://github.com/firefly-iii).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program 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 Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
namespace FireflyIII\Import\JobConfiguration;
use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Models\ImportJob;
use FireflyIII\Repositories\ImportJob\ImportJobRepositoryInterface;
use FireflyIII\Support\Import\JobConfiguration\File\ConfigureMappingHandler;
use FireflyIII\Support\Import\JobConfiguration\File\ConfigureRolesHandler;
use FireflyIII\Support\Import\JobConfiguration\File\ConfigureUploadHandler;
use FireflyIII\Support\Import\JobConfiguration\File\FileConfigurationInterface;
use FireflyIII\Support\Import\JobConfiguration\File\NewFileJobHandler;
use Illuminate\Support\MessageBag;
/**
* Class FileJobConfiguration
*
* @deprecated
* @codeCoverageIgnore
*/
class FileJobConfiguration implements JobConfigurationInterface
{
/** @var ImportJob The import job */
private $importJob;
/** @var ImportJobRepositoryInterface Import job repository */
private $repository;
/**
* Returns true when the initial configuration for this job is complete.
*
* @return bool
*/
public function configurationComplete(): bool
{
return 'ready_to_run' === $this->importJob->stage;
}
/**
* Store any data from the $data array into the job. Anything in the message bag will be flashed
* as an error to the user, regardless of its content.
*
* @param array $data
*
* @throws FireflyException
* @return MessageBag
*/
public function configureJob(array $data): MessageBag
{
$configurator = $this->getConfigurationObject();
$configurator->setImportJob($this->importJob);
return $configurator->configureJob($data);
}
/**
* Return the data required for the next step in the job configuration.
*
* @throws FireflyException
* @return array
*/
public function getNextData(): array
{
$configurator = $this->getConfigurationObject();
$configurator->setImportJob($this->importJob);
return $configurator->getNextData();
}
/**
* Returns the view of the next step in the job configuration.
*
* @throws FireflyException
* @return string
*
*/
public function getNextView(): string
{
switch ($this->importJob->stage) {
case 'new':
return 'import.file.new';
case 'configure-upload':
return 'import.file.configure-upload';
case 'roles':
return 'import.file.roles';
case 'map':
return 'import.file.map';
default:
// @codeCoverageIgnoreStart
throw new FireflyException(
sprintf('FileJobConfiguration::getNextView() cannot handle stage "%s"', $this->importJob->stage)
);
// @codeCoverageIgnoreEnd
}
}
/**
* Set import job.
*
* @param ImportJob $importJob
*/
public function setImportJob(ImportJob $importJob): void
{
$this->importJob = $importJob;
$this->repository = app(ImportJobRepositoryInterface::class);
$this->repository->setUser($importJob->user);
}
/**
* Get the configuration handler for this specific stage.
*
* @throws FireflyException
*
* @return FileConfigurationInterface
*/
private function getConfigurationObject(): FileConfigurationInterface
{
$class = 'DoNotExist';
switch ($this->importJob->stage) {
case 'new': // has nothing, no file upload or anything.
$class = NewFileJobHandler::class;
break;
case 'configure-upload':
$class = ConfigureUploadHandler::class;
break;
case 'roles':
$class = ConfigureRolesHandler::class;
break;
case 'map':
$class = ConfigureMappingHandler::class;
break;
}
if (!class_exists($class)) {
throw new FireflyException(sprintf('Class %s does not exist in getConfigurationClass().', $class)); // @codeCoverageIgnore
}
return app($class);
}
}

View File

@@ -1,38 +0,0 @@
<?php
/**
* FinTSConfigurationSteps.php
* Copyright (c) 2019 https://github.com/bnw
*
* This file is part of Firefly III (https://github.com/firefly-iii).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program 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 Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
namespace FireflyIII\Import\JobConfiguration;
/**
*
* Class FinTSConfigurationSteps
*
* @deprecated
* @codeCoverageIgnore
*/
abstract class FinTSConfigurationSteps
{
public const NEW = 'new';
public const CHOOSE_ACCOUNT = 'choose_account';
public const GO_FOR_IMPORT = 'go-for-import';
}

View File

@@ -1,137 +0,0 @@
<?php
/**
* FinTSJobConfiguration.php
* Copyright (c) 2019 https://github.com/bnw
*
* This file is part of Firefly III (https://github.com/firefly-iii).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program 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 Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
namespace FireflyIII\Import\JobConfiguration;
use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Models\ImportJob;
use FireflyIII\Support\Import\JobConfiguration\FinTS\ChooseAccountHandler;
use FireflyIII\Support\Import\JobConfiguration\FinTS\FinTSConfigurationInterface;
use FireflyIII\Support\Import\JobConfiguration\FinTS\NewFinTSJobHandler;
use Illuminate\Support\MessageBag;
/**
*
* Class FinTSJobConfiguration
*
* @deprecated
* @codeCoverageIgnore
*/
class FinTSJobConfiguration implements JobConfigurationInterface
{
/** @var ImportJob */
private $importJob;
/**
* Returns true when the initial configuration for this job is complete.
*
* @return bool
*/
public function configurationComplete(): bool
{
return $this->importJob->stage === FinTSConfigurationSteps::GO_FOR_IMPORT;
}
/**
* Store any data from the $data array into the job. Anything in the message bag will be flashed
* as an error to the user, regardless of its content.
*
* @param array $data
*
* @throws FireflyException
* @return MessageBag
*/
public function configureJob(array $data): MessageBag
{
return $this->getConfigurationObject()->configureJob($data);
}
/**
* Return the data required for the next step in the job configuration.
*
* @throws FireflyException
* @return array
*/
public function getNextData(): array
{
return $this->getConfigurationObject()->getNextData();
}
/**
* Returns the view of the next step in the job configuration.
*
* @throws FireflyException
* @return string
*/
public function getNextView(): string
{
switch ($this->importJob->stage) {
case FinTSConfigurationSteps::NEW:
case FinTSConfigurationSteps::CHOOSE_ACCOUNT:
return 'import.fints.' . $this->importJob->stage;
break;
default:
// @codeCoverageIgnoreStart
throw new FireflyException(
sprintf('FinTSJobConfiguration::getNextView() cannot handle stage "%s"', $this->importJob->stage)
);
// @codeCoverageIgnoreEnd
}
}
/**
* @param ImportJob $importJob
*/
public function setImportJob(ImportJob $importJob): void
{
$this->importJob = $importJob;
}
/**
* Get the configuration handler for this specific stage.
*
* @throws FireflyException
* @return FinTSConfigurationInterface
*/
private function getConfigurationObject(): FinTSConfigurationInterface
{
$class = 'DoNotExist';
switch ($this->importJob->stage) {
case FinTSConfigurationSteps::NEW:
$class = NewFinTSJobHandler::class;
break;
case FinTSConfigurationSteps::CHOOSE_ACCOUNT:
$class = ChooseAccountHandler::class;
break;
}
if (!class_exists($class)) {
throw new FireflyException(sprintf('Class %s does not exist in getConfigurationClass().', $class)); // @codeCoverageIgnore
}
$configurator = app($class);
$configurator->setImportJob($this->importJob);
return $configurator;
}
}

View File

@@ -1,73 +0,0 @@
<?php
/**
* JobConfigurationInterface.php
* Copyright (c) 2019 james@firefly-iii.org
*
* This file is part of Firefly III (https://github.com/firefly-iii).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program 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 Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
namespace FireflyIII\Import\JobConfiguration;
use FireflyIII\Models\ImportJob;
use Illuminate\Support\MessageBag;
/**
* Interface JobConfigurationInterface.
*
* @deprecated
* @codeCoverageIgnore
*/
interface JobConfigurationInterface
{
/**
* Returns true when the initial configuration for this job is complete.
*
* @return bool
*/
public function configurationComplete(): bool;
/**
* Store any data from the $data array into the job. Anything in the message bag will be flashed
* as an error to the user, regardless of its content.
*
* @param array $data
*
* @return MessageBag
*/
public function configureJob(array $data): MessageBag;
/**
* Return the data required for the next step in the job configuration.
*
* @return array
*/
public function getNextData(): array;
/**
* Returns the view of the next step in the job configuration.
*
* @return string
*/
public function getNextView(): string;
/**
* Set import job.
*
* @param ImportJob $importJob
*/
public function setImportJob(ImportJob $importJob): void;
}

View File

@@ -1,156 +0,0 @@
<?php
/**
* SpectreJobConfiguration.php
* Copyright (c) 2019 james@firefly-iii.org
*
* This file is part of Firefly III (https://github.com/firefly-iii).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program 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 Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
namespace FireflyIII\Import\JobConfiguration;
use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Models\ImportJob;
use FireflyIII\Repositories\ImportJob\ImportJobRepositoryInterface;
use FireflyIII\Support\Import\JobConfiguration\Spectre\AuthenticatedHandler;
use FireflyIII\Support\Import\JobConfiguration\Spectre\ChooseAccountsHandler;
use FireflyIII\Support\Import\JobConfiguration\Spectre\ChooseLoginHandler;
use FireflyIII\Support\Import\JobConfiguration\Spectre\DoAuthenticateHandler;
use FireflyIII\Support\Import\JobConfiguration\Spectre\NewSpectreJobHandler;
use FireflyIII\Support\Import\JobConfiguration\Spectre\SpectreJobConfigurationInterface;
use Illuminate\Support\MessageBag;
use Log;
/**
* Class SpectreJobConfiguration
*
* @deprecated
* @codeCoverageIgnore
*/
class SpectreJobConfiguration implements JobConfigurationInterface
{
/** @var SpectreJobConfigurationInterface The job handler. */
private $handler;
/** @var ImportJob The import job */
private $importJob;
/** @var ImportJobRepositoryInterface Import job repository */
private $repository;
/**
* Returns true when the initial configuration for this job is complete.
*
* @return bool
*/
public function configurationComplete(): bool
{
return $this->handler->configurationComplete();
}
/**
* Store any data from the $data array into the job. Anything in the message bag will be flashed
* as an error to the user, regardless of its content.
*
* @param array $data
*
* @return MessageBag
*/
public function configureJob(array $data): MessageBag
{
return $this->handler->configureJob($data);
}
/**
* Return the data required for the next step in the job configuration.
*
* @return array
*/
public function getNextData(): array
{
return $this->handler->getNextData();
}
/**
* Returns the view of the next step in the job configuration.
*
* @return string
*/
public function getNextView(): string
{
return $this->handler->getNextView();
}
/**
* Set the import job.
*
* @param ImportJob $importJob
*
* @throws FireflyException
*/
public function setImportJob(ImportJob $importJob): void
{
$this->importJob = $importJob;
$this->repository = app(ImportJobRepositoryInterface::class);
$this->repository->setUser($importJob->user);
$this->handler = $this->getHandler();
}
/**
* Get correct handler.
*
* @throws FireflyException
*
* @return SpectreJobConfigurationInterface
*/
private function getHandler(): SpectreJobConfigurationInterface
{
Log::debug(sprintf('Now in SpectreJobConfiguration::getHandler() with stage "%s"', $this->importJob->stage));
$handler = null;
switch ($this->importJob->stage) {
case 'new':
/** @var NewSpectreJobHandler $handler */
$handler = app(NewSpectreJobHandler::class);
$handler->setImportJob($this->importJob);
break;
case 'do-authenticate':
/** @var DoAuthenticateHandler $handler */
$handler = app(DoAuthenticateHandler::class);
$handler->setImportJob($this->importJob);
break;
case 'choose-login':
/** @var ChooseLoginHandler $handler */
$handler = app(ChooseLoginHandler::class);
$handler->setImportJob($this->importJob);
break;
case 'authenticated':
/** @var AuthenticatedHandler $handler */
$handler = app(AuthenticatedHandler::class);
$handler->setImportJob($this->importJob);
break;
case 'choose-accounts':
/** @var ChooseAccountsHandler $handler */
$handler = app(ChooseAccountsHandler::class);
$handler->setImportJob($this->importJob);
break;
default:
// @codeCoverageIgnoreStart
throw new FireflyException(sprintf('Firefly III cannot create a configuration handler for stage "%s"', $this->importJob->stage));
// @codeCoverageIgnoreEnd
}
return $handler;
}
}

View File

@@ -1,143 +0,0 @@
<?php
/**
* YnabJobConfiguration.php
* Copyright (c) 2019 james@firefly-iii.org
*
* This file is part of Firefly III (https://github.com/firefly-iii).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program 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 Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
namespace FireflyIII\Import\JobConfiguration;
use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Models\ImportJob;
use FireflyIII\Repositories\ImportJob\ImportJobRepositoryInterface;
use FireflyIII\Support\Import\JobConfiguration\Ynab\NewYnabJobHandler;
use FireflyIII\Support\Import\JobConfiguration\Ynab\SelectAccountsHandler;
use FireflyIII\Support\Import\JobConfiguration\Ynab\SelectBudgetHandler;
use FireflyIII\Support\Import\JobConfiguration\Ynab\YnabJobConfigurationInterface;
use Illuminate\Support\MessageBag;
use Log;
/**
* Class YnabJobConfiguration
*
* @deprecated
* @codeCoverageIgnore
*/
class YnabJobConfiguration implements JobConfigurationInterface
{
/** @var YnabJobConfigurationInterface The job handler. */
private $handler;
/** @var ImportJob The import job */
private $importJob;
/** @var ImportJobRepositoryInterface Import job repository */
private $repository;
/**
* Returns true when the initial configuration for this job is complete.
*
* @return bool
*/
public function configurationComplete(): bool
{
return $this->handler->configurationComplete();
}
/**
* Store any data from the $data array into the job. Anything in the message bag will be flashed
* as an error to the user, regardless of its content.
*
* @param array $data
*
* @return MessageBag
*/
public function configureJob(array $data): MessageBag
{
return $this->handler->configureJob($data);
}
/**
* Return the data required for the next step in the job configuration.
*
* @return array
*/
public function getNextData(): array
{
return $this->handler->getNextData();
}
/**
* Returns the view of the next step in the job configuration.
*
* @return string
*/
public function getNextView(): string
{
return $this->handler->getNextView();
}
/**
* Set import job.
*
* @param ImportJob $importJob
*
* @throws FireflyException
*/
public function setImportJob(ImportJob $importJob): void
{
$this->importJob = $importJob;
$this->repository = app(ImportJobRepositoryInterface::class);
$this->repository->setUser($importJob->user);
$this->handler = $this->getHandler();
}
/**
* Get correct handler.
*
* @throws FireflyException
*
* @return YnabJobConfigurationInterface
*/
private function getHandler(): YnabJobConfigurationInterface
{
Log::debug(sprintf('Now in YnabJobConfiguration::getHandler() with stage "%s"', $this->importJob->stage));
$handler = null;
switch ($this->importJob->stage) {
case 'new':
/** @var NewYnabJobHandler $handler */
$handler = app(NewYnabJobHandler::class);
$handler->setImportJob($this->importJob);
break;
case 'select_budgets':
/** @var SelectBudgetHandler $handler */
$handler = app(SelectBudgetHandler::class);
$handler->setImportJob($this->importJob);
break;
case 'select_accounts':
$handler = app(SelectAccountsHandler::class);
$handler->setImportJob($this->importJob);
break;
default:
// @codeCoverageIgnoreStart
throw new FireflyException(sprintf('Firefly III cannot create a YNAB configuration handler for stage "%s"', $this->importJob->stage));
// @codeCoverageIgnoreEnd
}
return $handler;
}
}

View File

@@ -1,85 +0,0 @@
<?php
/**
* AssetAccountIbans.php
* Copyright (c) 2019 james@firefly-iii.org
*
* This file is part of Firefly III (https://github.com/firefly-iii).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program 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 Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
namespace FireflyIII\Import\Mapper;
use FireflyIII\Models\Account;
use FireflyIII\Models\AccountType;
use FireflyIII\Repositories\Account\AccountRepositoryInterface;
/**
* Class AssetAccounts.
*
* @deprecated
* @codeCoverageIgnore
*/
class AssetAccountIbans implements MapperInterface
{
/**
* Get map of asset accounts.
*
* @return array
*/
public function getMap(): array
{
/** @var AccountRepositoryInterface $accountRepository */
$accountRepository = app(AccountRepositoryInterface::class);
$set = $accountRepository->getAccountsByType(
[AccountType::DEFAULT, AccountType::ASSET,
AccountType::LOAN, AccountType::DEBT,
AccountType::CREDITCARD, AccountType::MORTGAGE,
]
);
$topList = [];
$list = [];
/** @var Account $account */
foreach ($set as $account) {
$iban = $account->iban ?? '';
$accountId = (int) $account->id;
if ('' !== $iban) {
$name = $account->iban . ' (' . $account->name . ')';
// is a liability?
if (in_array($account->accountType->type, [AccountType::LOAN, AccountType::DEBT, AccountType::CREDITCARD, AccountType::MORTGAGE], true)) {
$name = $name . ' (' . strtolower(trans('import.import_liability_select')) . ')';
}
$topList[$accountId] = $name;
}
if ('' === $iban) {
$name = $account->name;
// is a liability?
if (in_array($account->accountType->type, [AccountType::LOAN, AccountType::DEBT, AccountType::CREDITCARD, AccountType::MORTGAGE], true)) {
$name = $name . ' (' . strtolower(trans('import.import_liability_select')) . ')';
}
$list[$accountId] = $name;
}
}
/** @noinspection AdditionOperationOnArraysInspection */
$list = $topList + $list;
asort($list);
$list = [0 => (string) trans('import.map_do_not_map')] + $list;
return $list;
}
}

View File

@@ -1,72 +0,0 @@
<?php
/**
* AssetAccounts.php
* Copyright (c) 2019 james@firefly-iii.org
*
* This file is part of Firefly III (https://github.com/firefly-iii).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program 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 Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
namespace FireflyIII\Import\Mapper;
use FireflyIII\Models\Account;
use FireflyIII\Models\AccountType;
use FireflyIII\Repositories\Account\AccountRepositoryInterface;
/**
* Class AssetAccounts.
*
* @deprecated
* @codeCoverageIgnore
*/
class AssetAccounts implements MapperInterface
{
/**
* Get map of asset accounts.
*
* @return array
*/
public function getMap(): array
{
/** @var AccountRepositoryInterface $accountRepository */
$accountRepository = app(AccountRepositoryInterface::class);
$set = $accountRepository->getAccountsByType(
[AccountType::DEFAULT, AccountType::ASSET, AccountType::LOAN, AccountType::DEBT, AccountType::CREDITCARD, AccountType::MORTGAGE,]
);
$list = [];
/** @var Account $account */
foreach ($set as $account) {
$accountId = (int) $account->id;
$name = $account->name;
$iban = $account->iban ?? '';
if ('' !== $iban) {
$name .= ' (' . $iban . ')';
}
// is a liability?
if (in_array($account->accountType->type, [AccountType::LOAN, AccountType::DEBT, AccountType::CREDITCARD, AccountType::MORTGAGE], true)) {
$name = trans('import.import_liability_select') . ': ' . $name;
}
$list[$accountId] = $name;
}
asort($list);
$list = [0 => (string) trans('import.map_do_not_map')] + $list;
return $list;
}
}

View File

@@ -1,58 +0,0 @@
<?php
/**
* Bills.php
* Copyright (c) 2019 james@firefly-iii.org
*
* This file is part of Firefly III (https://github.com/firefly-iii).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program 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 Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
namespace FireflyIII\Import\Mapper;
use FireflyIII\Models\Bill;
use FireflyIII\Repositories\Bill\BillRepositoryInterface;
/**
* Class Bills.
*
* @deprecated
* @codeCoverageIgnore
*/
class Bills implements MapperInterface
{
/**
* Get map of bills.
*
* @return array
*/
public function getMap(): array
{
/** @var BillRepositoryInterface $repository */
$repository = app(BillRepositoryInterface::class);
$result = $repository->getBills();
$list = [];
/** @var Bill $bill */
foreach ($result as $bill) {
$billId = (int) $bill->id;
$list[$billId] = $bill->name;
}
asort($list);
$list = [0 => (string) trans('import.map_do_not_map')] + $list;
return $list;
}
}

View File

@@ -1,58 +0,0 @@
<?php
/**
* Budgets.php
* Copyright (c) 2019 james@firefly-iii.org
*
* This file is part of Firefly III (https://github.com/firefly-iii).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program 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 Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
namespace FireflyIII\Import\Mapper;
use FireflyIII\Models\Budget;
use FireflyIII\Repositories\Budget\BudgetRepositoryInterface;
/**
* Class Budgets.
*
* @deprecated
* @codeCoverageIgnore
*/
class Budgets implements MapperInterface
{
/**
* Get map of budgets.
*
* @return array
*/
public function getMap(): array
{
/** @var BudgetRepositoryInterface $repository */
$repository = app(BudgetRepositoryInterface::class);
$result = $repository->getActiveBudgets();
$list = [];
/** @var Budget $budget */
foreach ($result as $budget) {
$budgetId = (int) $budget->id;
$list[$budgetId] = $budget->name;
}
asort($list);
$list = [0 => (string) trans('import.map_do_not_map')] + $list;
return $list;
}
}

View File

@@ -1,58 +0,0 @@
<?php
/**
* Categories.php
* Copyright (c) 2019 james@firefly-iii.org
*
* This file is part of Firefly III (https://github.com/firefly-iii).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program 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 Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
namespace FireflyIII\Import\Mapper;
use FireflyIII\Models\Category;
use FireflyIII\Repositories\Category\CategoryRepositoryInterface;
/**
* Class Categories.
*
* @deprecated
* @codeCoverageIgnore
*/
class Categories implements MapperInterface
{
/**
* Get map of categories.
*
* @return array
*/
public function getMap(): array
{
/** @var CategoryRepositoryInterface $repository */
$repository = app(CategoryRepositoryInterface::class);
$result = $repository->getCategories();
$list = [];
/** @var Category $category */
foreach ($result as $category) {
$categoryId = (int) $category->id;
$list[$categoryId] = $category->name;
}
asort($list);
$list = [0 => (string) trans('import.map_do_not_map')] + $list;
return $list;
}
}

View File

@@ -1,39 +0,0 @@
<?php
/**
* MapperInterface.php
* Copyright (c) 2019 james@firefly-iii.org
*
* This file is part of Firefly III (https://github.com/firefly-iii).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program 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 Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
namespace FireflyIII\Import\Mapper;
/**
* Interface MapperInterface.
*
* @deprecated
* @codeCoverageIgnore
*/
interface MapperInterface
{
/**
* Get map of objects.
*
* @return array
*/
public function getMap(): array;
}

View File

@@ -1,88 +0,0 @@
<?php
/**
* OpposingAccountIbans.php
* Copyright (c) 2019 james@firefly-iii.org
*
* This file is part of Firefly III (https://github.com/firefly-iii).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program 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 Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
namespace FireflyIII\Import\Mapper;
use FireflyIII\Models\Account;
use FireflyIII\Models\AccountType;
use FireflyIII\Repositories\Account\AccountRepositoryInterface;
/**
* Class OpposingAccounts.
*
* @deprecated
* @codeCoverageIgnore
*/
class OpposingAccountIbans implements MapperInterface
{
/**
* Get map of opposing accounts.
*
* @return array
*/
public function getMap(): array
{
/** @var AccountRepositoryInterface $accountRepository */
$accountRepository = app(AccountRepositoryInterface::class);
$set = $accountRepository->getAccountsByType(
[
AccountType::DEFAULT, AccountType::ASSET,
AccountType::EXPENSE, AccountType::BENEFICIARY,
AccountType::REVENUE, AccountType::LOAN, AccountType::DEBT,
AccountType::CREDITCARD, AccountType::MORTGAGE,
]
);
$topList = [];
$list = [];
/** @var Account $account */
foreach ($set as $account) {
$iban = $account->iban ?? '';
$accountId = (int) $account->id;
if ('' !== $iban) {
$name = $account->iban . ' (' . $account->name . ')';
// is a liability?
if (in_array($account->accountType->type, [AccountType::LOAN, AccountType::DEBT, AccountType::CREDITCARD, AccountType::MORTGAGE], true)) {
$name = $name . ' (' . strtolower(trans('import.import_liability_select')) . ')';
}
$topList[$accountId] = $name;
}
if ('' === $iban) {
$name = $account->name;
// is a liability?
if (in_array($account->accountType->type, [AccountType::LOAN, AccountType::DEBT, AccountType::CREDITCARD, AccountType::MORTGAGE], true)) {
$name = $name . ' (' . strtolower(trans('import.import_liability_select')) . ')';
}
$list[$accountId] = $name;
}
}
/** @noinspection AdditionOperationOnArraysInspection */
$list = $topList + $list;
asort($list);
$list = [0 => (string) trans('import.map_do_not_map')] + $list;
return $list;
}
}

View File

@@ -1,76 +0,0 @@
<?php
/**
* OpposingAccounts.php
* Copyright (c) 2019 james@firefly-iii.org
*
* This file is part of Firefly III (https://github.com/firefly-iii).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program 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 Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
namespace FireflyIII\Import\Mapper;
use FireflyIII\Models\Account;
use FireflyIII\Models\AccountType;
use FireflyIII\Repositories\Account\AccountRepositoryInterface;
/**
* Class OpposingAccounts.
*
* @deprecated
* @codeCoverageIgnore
*
*/
class OpposingAccounts implements MapperInterface
{
/**
* Get map of opposing accounts.
*
* @return array
*/
public function getMap(): array
{
/** @var AccountRepositoryInterface $accountRepository */
$accountRepository = app(AccountRepositoryInterface::class);
$set = $accountRepository->getAccountsByType(
[
AccountType::DEFAULT, AccountType::ASSET,
AccountType::EXPENSE, AccountType::BENEFICIARY,
AccountType::REVENUE, AccountType::LOAN, AccountType::DEBT,
AccountType::CREDITCARD, AccountType::MORTGAGE,
]
);
$list = [];
/** @var Account $account */
foreach ($set as $account) {
$accountId = (int) $account->id;
$name = $account->name;
$iban = $account->iban ?? '';
if ('' !== $iban) {
$name .= ' (' . $iban . ')';
}
// is a liability?
if (in_array($account->accountType->type, [AccountType::LOAN, AccountType::DEBT, AccountType::CREDITCARD, AccountType::MORTGAGE], true)) {
$name = trans('import.import_liability_select') . ': ' . $name;
}
$list[$accountId] = $name;
}
asort($list);
$list = [0 => (string) trans('import.map_do_not_map')] + $list;
return $list;
}
}

View File

@@ -1,58 +0,0 @@
<?php
/**
* Tags.php
* Copyright (c) 2019 james@firefly-iii.org
*
* This file is part of Firefly III (https://github.com/firefly-iii).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program 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 Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
namespace FireflyIII\Import\Mapper;
use FireflyIII\Models\Tag;
use FireflyIII\Repositories\Tag\TagRepositoryInterface;
/**
* Class Tags.
*
* @deprecated
* @codeCoverageIgnore
*/
class Tags implements MapperInterface
{
/**
* Get map of tags.
*
* @return array
*/
public function getMap(): array
{
/** @var TagRepositoryInterface $repository */
$repository = app(TagRepositoryInterface::class);
$result = $repository->get();
$list = [];
/** @var Tag $tag */
foreach ($result as $tag) {
$tagId = (int) $tag->id;
$list[$tagId] = $tag->tag;
}
asort($list);
$list = [0 => (string) trans('import.map_do_not_map')] + $list;
return $list;
}
}

View File

@@ -1,56 +0,0 @@
<?php
/**
* TransactionCurrencies.php
* Copyright (c) 2019 james@firefly-iii.org
*
* This file is part of Firefly III (https://github.com/firefly-iii).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program 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 Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
namespace FireflyIII\Import\Mapper;
use FireflyIII\Repositories\Currency\CurrencyRepositoryInterface;
/**
* Class TransactionCurrencies.
*
* @deprecated
* @codeCoverageIgnore
*/
class TransactionCurrencies implements MapperInterface
{
/**
* Get map of currencies.
*
* @return array
*/
public function getMap(): array
{
/** @var CurrencyRepositoryInterface $repository */
$repository = app(CurrencyRepositoryInterface::class);
$currencies = $repository->get();
$list = [];
foreach ($currencies as $currency) {
$currencyId = (int) $currency->id;
$list[$currencyId] = $currency->name . ' (' . $currency->code . ')';
}
asort($list);
$list = [0 => (string) trans('import.map_do_not_map')] + $list;
return $list;
}
}

View File

@@ -1,41 +0,0 @@
<?php
/**
* PreProcessorInterface.php
* Copyright (c) 2019 james@firefly-iii.org
*
* This file is part of Firefly III (https://github.com/firefly-iii).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program 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 Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
namespace FireflyIII\Import\MapperPreProcess;
/**
* Interface PreProcessorInterface.
*
* @deprecated
* @codeCoverageIgnore
*/
interface PreProcessorInterface
{
/**
* Run preprocessor.
*
* @param string $value
*
* @return array
*/
public function run(string $value): array;
}

View File

@@ -1,48 +0,0 @@
<?php
/**
* TagsComma.php
* Copyright (c) 2019 james@firefly-iii.org
*
* This file is part of Firefly III (https://github.com/firefly-iii).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program 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 Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
namespace FireflyIII\Import\MapperPreProcess;
/**
* Class TagsComma.
*
* @deprecated
* @codeCoverageIgnore
*/
class TagsComma implements PreProcessorInterface
{
/**
* Explode and filter list of comma separated tags.
*
* @param string $value
*
* @return array
*/
public function run(string $value): array
{
$set = explode(',', $value);
$set = array_map('trim', $set);
$set = array_filter($set, '\strlen');
return array_values($set);
}
}

View File

@@ -1,48 +0,0 @@
<?php
/**
* TagsSpace.php
* Copyright (c) 2019 james@firefly-iii.org
*
* This file is part of Firefly III (https://github.com/firefly-iii).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program 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 Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
namespace FireflyIII\Import\MapperPreProcess;
/**
* Class TagsSpace.
*
* @deprecated
* @codeCoverageIgnore
*/
class TagsSpace implements PreProcessorInterface
{
/**
* Explode and filter list of space separated tags.
*
* @param string $value
*
* @return array
*/
public function run(string $value): array
{
$set = explode(' ', $value);
$set = array_map('trim', $set);
$set = array_filter($set, '\strlen');
return array_values($set);
}
}

View File

@@ -1,236 +0,0 @@
<?php
/**
* BunqPrerequisites.php
* Copyright (c) 2019 james@firefly-iii.org
*
* This file is part of Firefly III (https://github.com/firefly-iii).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program 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 Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
namespace FireflyIII\Import\Prerequisites;
use bunq\Util\BunqEnumApiEnvironmentType;
use Exception;
use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Services\Bunq\ApiContext;
use FireflyIII\Services\IP\IPRetrievalInterface;
use FireflyIII\User;
use Illuminate\Support\MessageBag;
use Log;
/**
* This class contains all the routines necessary to connect to Bunq.
*
* @deprecated
* @codeCoverageIgnore
*/
class BunqPrerequisites implements PrerequisitesInterface
{
/** @var User The current user */
private $user;
/**
* BunqPrerequisites constructor.
*/
public function __construct()
{
if ('testing' === config('app.env')) {
Log::warning(sprintf('%s should not be instantiated in the TEST environment!', get_class($this)));
}
}
/**
* Returns view name that allows user to fill in prerequisites.
*
* @codeCoverageIgnore
*
* @return string
*/
public function getView(): string
{
return 'import.bunq.prerequisites';
}
/**
* Returns any values required for the prerequisites-view.
*
* @return array
*/
public function getViewParameters(): array
{
Log::debug('Now in BunqPrerequisites::getViewParameters()');
$key = '';
$externalIP = '';
if ($this->hasApiKey()) {
$key = app('preferences')->getForUser($this->user, 'bunq_api_key', null)->data;
}
if ($this->hasExternalIP()) {
$externalIP = app('preferences')->getForUser($this->user, 'bunq_external_ip', null)->data;
}
if (!$this->hasExternalIP()) {
/** @var IPRetrievalInterface $service */
$service = app(IPRetrievalInterface::class);
$externalIP = (string) $service->getIP();
}
return ['api_key' => $key, 'external_ip' => $externalIP];
}
/**
* Indicate if all prerequisites have been met.
*
* @return bool
*/
public function isComplete(): bool
{
return $this->hasApiKey() && $this->hasExternalIP() && $this->hasApiContext();
}
/**
* Set the user for this Prerequisites-routine. Class is expected to implement and save this.
*
* @param User $user
*
* @codeCoverageIgnore
*/
public function setUser(User $user): void
{
$this->user = $user;
}
/**
* This method responds to the user's submission of an API key. Should do nothing but store the value.
*
* Errors must be returned in the message bag under the field name they are requested by.
*
* @param array $data
*
* @return MessageBag
*
*/
public function storePrerequisites(array $data): MessageBag
{
$apiKey = $data['api_key'] ?? '';
$externalIP = $data['external_ip'] ?? '';
Log::debug('Storing bunq API key');
app('preferences')->setForUser($this->user, 'bunq_api_key', $apiKey);
app('preferences')->setForUser($this->user, 'bunq_external_ip', $externalIP);
$environment = $this->getBunqEnvironment();
$deviceDescription = 'Firefly III v' . config('firefly.version');
$permittedIps = [$externalIP];
Log::debug(sprintf('Environment for bunq is %s', $environment->getChoiceString()));
try {
/** @var ApiContext $object */
$object = app(ApiContext::class);
$apiContext = $object->create($environment, $apiKey, $deviceDescription, $permittedIps);
} catch (FireflyException $e) {
$messages = new MessageBag();
$messages->add('bunq_error', $e->getMessage());
return $messages;
}
// store context in JSON:
try {
$json = $apiContext->toJson();
// @codeCoverageIgnoreStart
} catch (Exception $e) {
$messages = new MessageBag();
$messages->add('bunq_error', $e->getMessage());
return $messages;
}
// @codeCoverageIgnoreEnd
// and store for user:
app('preferences')->setForUser($this->user, 'bunq_api_context', $json);
return new MessageBag;
}
/**
* Get correct bunq environment.
*
* @return BunqEnumApiEnvironmentType
* @codeCoverageIgnore
*/
private function getBunqEnvironment(): BunqEnumApiEnvironmentType
{
$env = config('firefly.bunq_use_sandbox');
if (null === $env) {
return BunqEnumApiEnvironmentType::PRODUCTION();
}
if (false === $env) {
return BunqEnumApiEnvironmentType::PRODUCTION();
}
return BunqEnumApiEnvironmentType::SANDBOX();
}
/**
* Check if we have API context.
*
* @return bool
*/
private function hasApiContext(): bool
{
$apiContext = app('preferences')->getForUser($this->user, 'bunq_api_context', null);
if (null === $apiContext) {
return false;
}
if ('' === (string) $apiContext->data) {
return false;
}
return true;
}
/**
* Check if we have the API key.
*
* @return bool
*/
private function hasApiKey(): bool
{
$apiKey = app('preferences')->getForUser($this->user, 'bunq_api_key', null);
if (null === $apiKey) {
return false;
}
if ('' === (string) $apiKey->data) {
return false;
}
return true;
}
/**
* Checks if we have an external IP.
*
* @return bool
*/
private function hasExternalIP(): bool
{
$externalIP = app('preferences')->getForUser($this->user, 'bunq_external_ip', null);
if (null === $externalIP) {
return false;
}
if ('' === (string) $externalIP->data) {
return false;
}
return true;
}
}

View File

@@ -1,146 +0,0 @@
<?php
/**
* FakePrerequisites.php
* Copyright (c) 2019 james@firefly-iii.org
*
* This file is part of Firefly III (https://github.com/firefly-iii).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program 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 Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
namespace FireflyIII\Import\Prerequisites;
use FireflyIII\User;
use Illuminate\Support\MessageBag;
use Log;
use function request;
/**
* This class contains all the routines necessary for the fake import provider.
*
* Class FakePrerequisites
*
* @deprecated
* @codeCoverageIgnore
*/
class FakePrerequisites implements PrerequisitesInterface
{
/** @var User The current user */
private $user;
/**
* FakePrerequisites constructor.
*/
public function __construct()
{
if ('testing' === config('app.env')) {
Log::warning(sprintf('%s should not be instantiated in the TEST environment!', get_class($this)));
}
}
/**
* Returns view name that allows user to fill in prerequisites. Currently asks for the API key.
*
* @codeCoverageIgnore
* @return string
*/
public function getView(): string
{
return 'import.fake.prerequisites';
}
/**
* Returns any values required for the prerequisites-view.
*
* @return array
*/
public function getViewParameters(): array
{
$apiKey = '';
if ($this->hasApiKey()) {
$apiKey = app('preferences')->getForUser($this->user, 'fake_api_key', null)->data;
}
$oldKey = (string) request()->old('api_key');
if ('' !== $oldKey) {
$apiKey = request()->old('api_key'); // @codeCoverageIgnore
}
return ['api_key' => $apiKey];
}
/**
* Indicate if all prerequisites have been met.
*
* @return bool
*/
public function isComplete(): bool
{
return $this->hasApiKey();
}
/**
* Set the user for this Prerequisites-routine. Class is expected to implement and save this.
*
* @param User $user
*/
public function setUser(User $user): void
{
$this->user = $user;
}
/**
* Store fake prerequisites.
*
* @param array $data
*
* @return MessageBag
*/
public function storePrerequisites(array $data): MessageBag
{
$apiKey = $data['api_key'] ?? '';
$messageBag = new MessageBag();
if (32 !== strlen($apiKey)) {
$messageBag->add('api_key', 'API key must be 32 chars.');
return $messageBag;
}
app('preferences')->setForUser($this->user, 'fake_api_key', $apiKey);
return $messageBag;
}
/**
* Check if we have an API key.
*
* @return bool
*/
private function hasApiKey(): bool
{
$apiKey = app('preferences')->getForUser($this->user, 'fake_api_key', false);
if (null === $apiKey) {
return false;
}
if (null === $apiKey->data) {
return false;
}
if (32 === strlen((string) $apiKey->data)) {
return true;
}
return false;
}
}

View File

@@ -1,102 +0,0 @@
<?php
/**
* FilePrerequisites.php
* Copyright (c) 2019 james@firefly-iii.org
*
* This file is part of Firefly III (https://github.com/firefly-iii).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program 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 Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
namespace FireflyIII\Import\Prerequisites;
use FireflyIII\User;
use Illuminate\Support\MessageBag;
use Log;
/**
*
* This class contains all the routines necessary to import from a file. Hint: there are none.
*
* @deprecated
* @codeCoverageIgnore
*/
class FilePrerequisites implements PrerequisitesInterface
{
/**
* FilePrerequisites constructor.
*/
public function __construct()
{
if ('testing' === config('app.env')) {
Log::warning(sprintf('%s should not be instantiated in the TEST environment!', get_class($this)));
}
}
/**
* Returns view name that allows user to fill in prerequisites.
*
* @return string
*/
public function getView(): string
{
return '';
}
/**
* Returns any values required for the prerequisites-view.
*
* @return array
*/
public function getViewParameters(): array
{
return [];
}
/**
* Indicate if all prerequisites have been met.
*
* @return bool
*/
public function isComplete(): bool
{
return true;
}
/**
* Set the user for this Prerequisites-routine. Class is expected to implement and save this.
*
* @param User $user
*/
public function setUser(User $user): void
{
}
/**
* This method responds to the user's submission of an API key. Should do nothing but store the value.
*
* Errors must be returned in the message bag under the field name they are requested by.
*
* @param array $data
*
* @return MessageBag
*/
public function storePrerequisites(array $data): MessageBag
{
return new MessageBag;
}
}

View File

@@ -1,74 +0,0 @@
<?php
/**
* PrerequisitesInterface.php
* Copyright (c) 2019 james@firefly-iii.org
*
* This file is part of Firefly III (https://github.com/firefly-iii).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program 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 Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
namespace FireflyIII\Import\Prerequisites;
use FireflyIII\User;
use Illuminate\Support\MessageBag;
/**
* Interface PrerequisitesInterface
*
* @deprecated
* @codeCoverageIgnore
*/
interface PrerequisitesInterface
{
/**
* Returns view name that allows user to fill in prerequisites.
*
* @return string
*/
public function getView(): string;
/**
* Returns any values required for the prerequisites-view.
*
* @return array
*/
public function getViewParameters(): array;
/**
* Indicate if all prerequisites have been met.
*
* @return bool
*/
public function isComplete(): bool;
/**
* Set the user for this Prerequisites-routine. Class is expected to implement and save this.
*
* @param User $user
*/
public function setUser(User $user): void;
/**
* This method responds to the user's submission of an API key. Should do nothing but store the value.
*
* Errors must be returned in the message bag under the field name they are requested by.
*
* @param array $data
*
* @return MessageBag
*/
public function storePrerequisites(array $data): MessageBag;
}

View File

@@ -1,206 +0,0 @@
<?php
/**
* SpectrePrerequisites.php
* Copyright (c) 2019 james@firefly-iii.org
*
* This file is part of Firefly III (https://github.com/firefly-iii).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program 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 Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
namespace FireflyIII\Import\Prerequisites;
use FireflyIII\Models\Preference;
use FireflyIII\User;
use Illuminate\Support\MessageBag;
use Log;
/**
* This class contains all the routines necessary to connect to Spectre.
*
* @deprecated
* @codeCoverageIgnore
*/
class SpectrePrerequisites implements PrerequisitesInterface
{
/** @var User The current user */
private $user;
/**
* SpectrePrerequisites constructor.
*/
public function __construct()
{
if ('testing' === config('app.env')) {
Log::warning(sprintf('%s should not be instantiated in the TEST environment!', get_class($this)));
}
}
/**
* Returns view name that allows user to fill in prerequisites.
*
* @return string
*/
public function getView(): string
{
return 'import.spectre.prerequisites';
}
/**
* Returns any values required for the prerequisites-view.
*
* @return array
*/
public function getViewParameters(): array
{
/** @var Preference $appIdPreference */
$appIdPreference = app('preferences')->getForUser($this->user, 'spectre_app_id', null);
$appId = null === $appIdPreference ? '' : $appIdPreference->data;
/** @var Preference $secretPreference */
$secretPreference = app('preferences')->getForUser($this->user, 'spectre_secret', null);
$secret = null === $secretPreference ? '' : $secretPreference->data;
$publicKey = $this->getPublicKey();
return [
'app_id' => $appId,
'secret' => $secret,
'public_key' => $publicKey,
];
}
/**
* Indicate if all prerequisites have been met.
*
* @return bool
*/
public function isComplete(): bool
{
return $this->hasAppId() && $this->hasSecret();
}
/**
* Set the user for this Prerequisites-routine. Class is expected to implement and save this.
*
* @param User $user
*/
public function setUser(User $user): void
{
$this->user = $user;
}
/**
* This method responds to the user's submission of an API key. Should do nothing but store the value.
*
* Errors must be returned in the message bag under the field name they are requested by.
*
* @param array $data
*
* @return MessageBag
*/
public function storePrerequisites(array $data): MessageBag
{
Log::debug('Storing Spectre API keys..');
app('preferences')->setForUser($this->user, 'spectre_app_id', $data['app_id'] ?? null);
app('preferences')->setForUser($this->user, 'spectre_secret', $data['secret'] ?? null);
Log::debug('Done!');
return new MessageBag;
}
/**
* This method creates a new public/private keypair for the user. This isn't really secure, since the key is generated on the fly with
* no regards for HSM's, smart cards or other things. It would require some low level programming to get this right. But the private key
* is stored encrypted in the database so it's something.
*/
private function createKeyPair(): void
{
Log::debug('Generate new Spectre key pair for user.');
$keyConfig = [
'digest_alg' => 'sha512',
'private_key_bits' => 2048,
'private_key_type' => OPENSSL_KEYTYPE_RSA,
];
// Create the private and public key
$res = openssl_pkey_new($keyConfig);
// Extract the private key from $res to $privKey
$privKey = '';
openssl_pkey_export($res, $privKey);
// Extract the public key from $res to $pubKey
$pubKey = openssl_pkey_get_details($res);
app('preferences')->setForUser($this->user, 'spectre_private_key', $privKey);
app('preferences')->setForUser($this->user, 'spectre_public_key', $pubKey['key']);
Log::debug('Created key pair');
}
/**
* Get a public key from the users preferences.
*
* @return string
*/
private function getPublicKey(): string
{
Log::debug('get public key');
$preference = app('preferences')->getForUser($this->user, 'spectre_public_key', null);
if (null === $preference) {
Log::debug('public key is null');
// create key pair
$this->createKeyPair();
}
$preference = app('preferences')->getForUser($this->user, 'spectre_public_key', null);
Log::debug('Return public key for user');
return $preference->data;
}
/**
* Check if we have the App ID.
*
* @return bool
*/
private function hasAppId(): bool
{
$appId = app('preferences')->getForUser($this->user, 'spectre_app_id', null);
if (null === $appId) {
return false;
}
if ('' === (string) $appId->data) {
return false;
}
return true;
}
/**
* Check if we have the secret.
*
* @return bool
*/
private function hasSecret(): bool
{
$secret = app('preferences')->getForUser($this->user, 'spectre_secret', null);
if (null === $secret) {
return false;
}
if ('' === (string) $secret->data) {
return false;
}
return true;
}
}

View File

@@ -1,159 +0,0 @@
<?php
/**
* YnabPrerequisites.php
* Copyright (c) 2019 james@firefly-iii.org
*
* This file is part of Firefly III (https://github.com/firefly-iii).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program 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 Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
namespace FireflyIII\Import\Prerequisites;
use FireflyIII\User;
use Illuminate\Support\MessageBag;
use Log;
/**
* Class YnabPrerequisites
*
* @deprecated
* @codeCoverageIgnore
*/
class YnabPrerequisites implements PrerequisitesInterface
{
/** @var User The current user */
private $user;
/**
* YnabPrerequisites constructor.
*/
public function __construct()
{
if ('testing' === config('app.env')) {
Log::warning(sprintf('%s should not be instantiated in the TEST environment!', get_class($this)));
}
}
/**
* Returns view name that allows user to fill in prerequisites.
*
* @return string
*/
public function getView(): string
{
return 'import.ynab.prerequisites';
}
/**
* Returns any values required for the prerequisites-view.
*
* @return array
*/
public function getViewParameters(): array
{
Log::debug('Now in YnabPrerequisites::getViewParameters()');
$clientId = '';
$clientSecret = '';
if ($this->hasClientId()) {
$clientId = app('preferences')->getForUser($this->user, 'ynab_client_id', null)->data;
}
if ($this->hasClientSecret()) {
$clientSecret = app('preferences')->getForUser($this->user, 'ynab_client_secret', null)->data;
}
$callBackUri = route('import.callback.ynab');
$isHttps = 0 === strpos($callBackUri, 'https://');
return ['client_id' => $clientId, 'client_secret' => $clientSecret, 'callback_uri' => $callBackUri, 'is_https' => $isHttps];
}
/**
* Indicate if all prerequisites have been met.
*
* @return bool
*/
public function isComplete(): bool
{
return $this->hasClientId() && $this->hasClientSecret();
}
/**
* Set the user for this Prerequisites-routine. Class is expected to implement and save this.
*
* @param User $user
*/
public function setUser(User $user): void
{
$this->user = $user;
}
/**
* This method responds to the user's submission of an API key. Should do nothing but store the value.
*
* Errors must be returned in the message bag under the field name they are requested by.
*
* @param array $data
*
* @return MessageBag
*/
public function storePrerequisites(array $data): MessageBag
{
$clientId = $data['client_id'] ?? '';
$clientSecret = $data['client_secret'] ?? '';
Log::debug('Storing YNAB client data');
app('preferences')->setForUser($this->user, 'ynab_client_id', $clientId);
app('preferences')->setForUser($this->user, 'ynab_client_secret', $clientSecret);
return new MessageBag;
}
/**
* Check if we have the client ID.
*
* @return bool
*/
private function hasClientId(): bool
{
$clientId = app('preferences')->getForUser($this->user, 'ynab_client_id', null);
if (null === $clientId) {
return false;
}
if ('' === (string) $clientId->data) {
return false;
}
return true;
}
/**
* Check if we have the client secret
*
* @return bool
*/
private function hasClientSecret(): bool
{
$clientSecret = app('preferences')->getForUser($this->user, 'ynab_client_secret', null);
if (null === $clientSecret) {
return false;
}
if ('' === (string) $clientSecret->data) {
return false;
}
return true;
}
}

View File

@@ -1,118 +0,0 @@
<?php
/**
* BunqRoutine.php
* Copyright (c) 2019 james@firefly-iii.org
*
* This file is part of Firefly III (https://github.com/firefly-iii).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program 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 Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
namespace FireflyIII\Import\Routine;
use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Models\ImportJob;
use FireflyIII\Repositories\ImportJob\ImportJobRepositoryInterface;
use FireflyIII\Support\Import\Routine\Bunq\StageImportDataHandler;
use FireflyIII\Support\Import\Routine\Bunq\StageNewHandler;
use Log;
/**
* Class BunqRoutine
*
* @deprecated
* @codeCoverageIgnore
*/
class BunqRoutine implements RoutineInterface
{
/** @var ImportJob The import job */
private $importJob;
/** @var ImportJobRepositoryInterface Import job repository */
private $repository;
/**
* At the end of each run(), the import routine must set the job to the expected status.
*
* The final status of the routine must be "provider_finished".
*
* @throws FireflyException
*/
public function run(): void
{
Log::info(sprintf('Now in BunqRoutine::run() with status "%s" and stage "%s".', $this->importJob->status, $this->importJob->stage));
$valid = ['ready_to_run']; // should be only ready_to_run
if (in_array($this->importJob->status, $valid, true)) {
switch ($this->importJob->stage) {
default:
throw new FireflyException(sprintf('BunqRoutine cannot handle stage "%s".', $this->importJob->stage)); // @codeCoverageIgnore
case 'new':
// list all of the users accounts.
$this->repository->setStatus($this->importJob, 'running');
/** @var StageNewHandler $handler */
$handler = app(StageNewHandler::class);
$handler->setImportJob($this->importJob);
$handler->run();
// make user choose accounts to import from.
$this->repository->setStage($this->importJob, 'choose-accounts');
$this->repository->setStatus($this->importJob, 'need_job_config');
return;
case 'go-for-import':
// list all of the users accounts.
$this->repository->setStatus($this->importJob, 'running');
/** @var StageImportDataHandler $handler */
$handler = app(StageImportDataHandler::class);
$handler->setImportJob($this->importJob);
$handler->run();
$transactions = $handler->getTransactions();
// could be that more transactions will arrive in a second run.
if (true === $handler->isStillRunning()) {
Log::debug('Handler indicates that it is still working.');
$this->repository->setStatus($this->importJob, 'ready_to_run');
$this->repository->setStage($this->importJob, 'go-for-import');
}
$this->repository->appendTransactions($this->importJob, $transactions);
if (false === $handler->isStillRunning()) {
Log::info('Handler indicates that its done!');
$this->repository->setStatus($this->importJob, 'provider_finished');
$this->repository->setStage($this->importJob, 'final');
}
return;
}
}
throw new FireflyException(sprintf('bunq import routine cannot handle status "%s"', $this->importJob->status)); // @codeCoverageIgnore
}
/**
* Set the import job.
*
* @param ImportJob $importJob
*
* @return void
*/
public function setImportJob(ImportJob $importJob): void
{
$this->importJob = $importJob;
$this->repository = app(ImportJobRepositoryInterface::class);
$this->repository->setUser($importJob->user);
}
}

View File

@@ -1,111 +0,0 @@
<?php
/**
* FakeRoutine.php
* Copyright (c) 2019 james@firefly-iii.org
*
* This file is part of Firefly III (https://github.com/firefly-iii).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program 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 Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
namespace FireflyIII\Import\Routine;
use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Models\ImportJob;
use FireflyIII\Repositories\ImportJob\ImportJobRepositoryInterface;
use FireflyIII\Support\Import\Routine\Fake\StageAhoyHandler;
use FireflyIII\Support\Import\Routine\Fake\StageFinalHandler;
use FireflyIII\Support\Import\Routine\Fake\StageNewHandler;
use Log;
/**
* Class FakeRoutine
*
* @deprecated
* @codeCoverageIgnore
*/
class FakeRoutine implements RoutineInterface
{
/** @var ImportJob The import job */
private $importJob;
/** @var ImportJobRepositoryInterface Import job repository */
private $repository;
/**
* Fake import routine has three stages:
*
* "new": will quietly log gibberish for 15 seconds, then switch to stage "ahoy".
* will also set status to "ready_to_run" so it will arrive here again.
* "ahoy": will log some nonsense and then drop job into status:"need_job_config" to force it back to the job config routine.
* "final": will do some logging, sleep for 10 seconds and then finish. Generates 5 random transactions.
*
* @throws FireflyException
*
* @return void
*/
public function run(): void
{
Log::debug(sprintf('Now in run() for fake routine with status: %s', $this->importJob->status));
if ('ready_to_run' !== $this->importJob->status) {
throw new FireflyException(sprintf('Fake job should have status "ready_to_run", not "%s"', $this->importJob->status)); // @codeCoverageIgnore
}
switch ($this->importJob->stage) {
default:
throw new FireflyException(sprintf('Fake routine cannot handle stage "%s".', $this->importJob->stage)); // @codeCoverageIgnore
case 'new':
$this->repository->setStatus($this->importJob, 'running');
/** @var StageNewHandler $handler */
$handler = app(StageNewHandler::class);
$handler->run();
$this->repository->setStage($this->importJob, 'ahoy');
// set job finished this step:
$this->repository->setStatus($this->importJob, 'ready_to_run');
return;
case 'ahoy':
$this->repository->setStatus($this->importJob, 'running');
/** @var StageAhoyHandler $handler */
$handler = app(StageAhoyHandler::class);
$handler->run();
$this->repository->setStatus($this->importJob, 'need_job_config');
$this->repository->setStage($this->importJob, 'final');
break;
case 'final':
$this->repository->setStatus($this->importJob, 'running');
/** @var StageFinalHandler $handler */
$handler = app(StageFinalHandler::class);
$handler->setImportJob($this->importJob);
$transactions = $handler->getTransactions();
$this->repository->setStatus($this->importJob, 'provider_finished');
$this->repository->setStage($this->importJob, 'final');
$this->repository->setTransactions($this->importJob, $transactions);
}
}
/**
* Set the import job.
*
* @param ImportJob $importJob
*
*/
public function setImportJob(ImportJob $importJob): void
{
$this->importJob = $importJob;
$this->repository = app(ImportJobRepositoryInterface::class);
$this->repository->setUser($importJob->user);
}
}

View File

@@ -1,99 +0,0 @@
<?php
/**
* FileRoutine.php
* Copyright (c) 2019 james@firefly-iii.org
*
* This file is part of Firefly III (https://github.com/firefly-iii).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program 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 Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
namespace FireflyIII\Import\Routine;
use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Models\ImportJob;
use FireflyIII\Repositories\ImportJob\ImportJobRepositoryInterface;
use FireflyIII\Support\Import\Routine\File\FileProcessorInterface;
use Log;
/**
* Class FileRoutine
*
* @deprecated
* @codeCoverageIgnore
*/
class FileRoutine implements RoutineInterface
{
/** @var ImportJob The import job */
private $importJob;
/** @var ImportJobRepositoryInterface Import job repository */
private $repository;
/**
* At the end of each run(), the import routine must set the job to the expected status.
*
* The final status of the routine must be "provider_finished".
*
* @throws FireflyException
*/
public function run(): void
{
Log::debug(sprintf('Now in run() for file routine with status: %s', $this->importJob->status));
if ('ready_to_run' === $this->importJob->status) {
$this->repository->setStatus($this->importJob, 'running');
// get processor, depending on file type
// is just CSV for now.
$processor = $this->getProcessor();
$processor->setImportJob($this->importJob);
$transactions = $processor->run();
$this->repository->setStatus($this->importJob, 'provider_finished');
$this->repository->setStage($this->importJob, 'final');
$this->repository->setTransactions($this->importJob, $transactions);
return;
}
throw new FireflyException(sprintf('Import routine cannot handle status "%s"', $this->importJob->status)); // @codeCoverageIgnore
}
/**
* Set the import job.
*
* @param ImportJob $importJob
*
* @return void
*/
public function setImportJob(ImportJob $importJob): void
{
$this->importJob = $importJob;
$this->repository = app(ImportJobRepositoryInterface::class);
$this->repository->setUser($importJob->user);
}
/**
* Return the appropriate file routine handler for
* the file type of the job.
*
* @return FileProcessorInterface
*/
private function getProcessor(): FileProcessorInterface
{
$config = $this->repository->getConfiguration($this->importJob);
$type = $config['file-type'] ?? 'csv';
$class = config(sprintf('import.options.file.processors.%s', $type));
return app($class);
}
}

View File

@@ -1,89 +0,0 @@
<?php
/**
* FinTSRoutine.php
* Copyright (c) 2019 https://github.com/bnw
*
* This file is part of Firefly III (https://github.com/firefly-iii).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program 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 Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
namespace FireflyIII\Import\Routine;
use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Import\JobConfiguration\FinTSConfigurationSteps;
use FireflyIII\Models\ImportJob;
use FireflyIII\Repositories\ImportJob\ImportJobRepositoryInterface;
use FireflyIII\Support\Import\Routine\FinTS\StageImportDataHandler;
use Illuminate\Support\Facades\Log;
/**
*
* Class FinTSRoutine
*
* @deprecated
* @codeCoverageIgnore
*/
class FinTSRoutine implements RoutineInterface
{
/** @var ImportJob */
private $importJob;
/** @var ImportJobRepositoryInterface */
private $repository;
/**
* At the end of each run(), the import routine must set the job to the expected status.
*
* The final status of the routine must be "provider_finished".
*
* @throws FireflyException
*/
public function run(): void
{
Log::debug(sprintf('Now in FinTSRoutine::run() with status "%s" and stage "%s".', $this->importJob->status, $this->importJob->stage));
$valid = ['ready_to_run']; // should be only ready_to_run
if (in_array($this->importJob->status, $valid, true)) {
switch ($this->importJob->stage) {
default:
throw new FireflyException(sprintf('FinTSRoutine cannot handle stage "%s".', $this->importJob->stage)); // @codeCoverageIgnore
case FinTSConfigurationSteps::GO_FOR_IMPORT:
$this->repository->setStatus($this->importJob, 'running');
/** @var StageImportDataHandler $handler */
$handler = app(StageImportDataHandler::class);
$handler->setImportJob($this->importJob);
$handler->run();
$transactions = $handler->getTransactions();
$this->repository->setTransactions($this->importJob, $transactions);
$this->repository->setStatus($this->importJob, 'provider_finished');
$this->repository->setStage($this->importJob, 'final');
}
}
}
/**
* @param ImportJob $importJob
*
* @return void
*/
public function setImportJob(ImportJob $importJob): void
{
$this->importJob = $importJob;
$this->repository = app(ImportJobRepositoryInterface::class);
$this->repository->setUser($importJob->user);
}
}

View File

@@ -1,53 +0,0 @@
<?php
/**
* RoutineInterface.php
* Copyright (c) 2019 james@firefly-iii.org
*
* This file is part of Firefly III (https://github.com/firefly-iii).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program 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 Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
namespace FireflyIII\Import\Routine;
use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Models\ImportJob;
/**
* Interface RoutineInterface
*
* @deprecated
* @codeCoverageIgnore
*/
interface RoutineInterface
{
/**
* At the end of each run(), the import routine must set the job to the expected status.
*
* The final status of the routine must be "provider_finished".
*
* @throws FireflyException
*/
public function run(): void;
/**
* Set the import job.
*
* @param ImportJob $importJob
*
* @return void
*/
public function setImportJob(ImportJob $importJob): void;
}

View File

@@ -1,128 +0,0 @@
<?php
/**
* SpectreRoutine.php
* Copyright (c) 2019 james@firefly-iii.org
*
* This file is part of Firefly III (https://github.com/firefly-iii).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program 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 Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
namespace FireflyIII\Import\Routine;
use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Models\ImportJob;
use FireflyIII\Repositories\ImportJob\ImportJobRepositoryInterface;
use FireflyIII\Support\Import\Routine\Spectre\StageAuthenticatedHandler;
use FireflyIII\Support\Import\Routine\Spectre\StageImportDataHandler;
use FireflyIII\Support\Import\Routine\Spectre\StageNewHandler;
use Log;
/**
* Class SpectreRoutine
*
* @deprecated
* @codeCoverageIgnore
*/
class SpectreRoutine implements RoutineInterface
{
/** @var ImportJob The import job */
private $importJob;
/** @var ImportJobRepositoryInterface Import job repository */
private $repository;
/**
* At the end of each run(), the import routine must set the job to the expected status.
*
* The final status of the routine must be "provider_finished".
*
* @throws FireflyException
*
*/
public function run(): void
{
Log::debug(sprintf('Now in SpectreRoutine::run() with status "%s" and stage "%s".', $this->importJob->status, $this->importJob->stage));
$valid = ['ready_to_run']; // should be only ready_to_run
if (in_array($this->importJob->status, $valid, true)) {
switch ($this->importJob->stage) {
default:
throw new FireflyException(sprintf('SpectreRoutine cannot handle stage "%s".', $this->importJob->stage)); // @codeCoverageIgnore
case 'new':
// list all of the users logins.
$this->repository->setStatus($this->importJob, 'running');
/** @var StageNewHandler $handler */
$handler = app(StageNewHandler::class);
$handler->setImportJob($this->importJob);
$handler->run();
// if count logins is zero, go to authenticate stage
if (0 === $handler->getCountLogins()) {
$this->repository->setStage($this->importJob, 'do-authenticate');
$this->repository->setStatus($this->importJob, 'ready_to_run');
return;
}
// or return to config to select login.
$this->repository->setStage($this->importJob, 'choose-login');
$this->repository->setStatus($this->importJob, 'need_job_config');
break;
case 'do-authenticate':
// set job to require config.
$this->repository->setStatus($this->importJob, 'need_job_config');
return;
case 'authenticated':
$this->repository->setStatus($this->importJob, 'running');
// get accounts from login, store in job.
/** @var StageAuthenticatedHandler $handler */
$handler = app(StageAuthenticatedHandler::class);
$handler->setImportJob($this->importJob);
$handler->run();
// return to config to select account(s).
$this->repository->setStage($this->importJob, 'choose-accounts');
$this->repository->setStatus($this->importJob, 'need_job_config');
break;
case 'go-for-import':
// user has chosen account mapping. Should now be ready to import data.
$this->repository->setStatus($this->importJob, 'running');
$this->repository->setStage($this->importJob, 'do_import');
/** @var StageImportDataHandler $handler */
$handler = app(StageImportDataHandler::class);
$handler->setImportJob($this->importJob);
$handler->run();
$this->repository->setStatus($this->importJob, 'provider_finished');
$this->repository->setStage($this->importJob, 'final');
}
}
}
/**
* Set the import job.
*
* @param ImportJob $importJob
*
* @return void
*/
public function setImportJob(ImportJob $importJob): void
{
$this->importJob = $importJob;
$this->repository = app(ImportJobRepositoryInterface::class);
$this->repository->setUser($importJob->user);
}
}

View File

@@ -1,146 +0,0 @@
<?php
/**
* YnabRoutine.php
* Copyright (c) 2019 james@firefly-iii.org
*
* This file is part of Firefly III (https://github.com/firefly-iii).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program 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 Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
namespace FireflyIII\Import\Routine;
use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Models\ImportJob;
use FireflyIII\Repositories\ImportJob\ImportJobRepositoryInterface;
use FireflyIII\Support\Import\Routine\Ynab\GetAccountsHandler;
use FireflyIII\Support\Import\Routine\Ynab\ImportDataHandler;
use FireflyIII\Support\Import\Routine\Ynab\StageGetAccessHandler;
use FireflyIII\Support\Import\Routine\Ynab\StageGetBudgetsHandler;
use Log;
/**
* Class YnabRoutine
*
* @deprecated
* @codeCoverageIgnore
*/
class YnabRoutine implements RoutineInterface
{
/** @var ImportJob The import job */
private $importJob;
/** @var ImportJobRepositoryInterface Import job repository */
private $repository;
/**
* At the end of each run(), the import routine must set the job to the expected status.
*
* The final status of the routine must be "provider_finished".
*
* @throws FireflyException
*/
public function run(): void
{
Log::debug(sprintf('Now in YNAB routine::run() with status "%s" and stage "%s".', $this->importJob->status, $this->importJob->stage));
$valid = ['ready_to_run']; // should be only ready_to_run
if (in_array($this->importJob->status, $valid, true)) {
// get access token from YNAB
if ('get_access_token' === $this->importJob->stage) {
// list all of the users accounts.
$this->repository->setStatus($this->importJob, 'running');
/** @var StageGetAccessHandler $handler */
$handler = app(StageGetAccessHandler::class);
$handler->setImportJob($this->importJob);
$handler->run();
// back to correct stage:
$this->repository->setStatus($this->importJob, 'ready_to_run');
$this->repository->setStage($this->importJob, 'get_budgets');
return;
}
if ('get_budgets' === $this->importJob->stage) {
$this->repository->setStatus($this->importJob, 'running');
/** @var StageGetBudgetsHandler $handler */
$handler = app(StageGetBudgetsHandler::class);
$handler->setImportJob($this->importJob);
$handler->run();
// count budgets in job, to determine next step.
$configuration = $this->repository->getConfiguration($this->importJob);
$budgets = $configuration['budgets'] ?? [];
// if more than 1 budget, select budget first.
if (count($budgets) > 1) {
$this->repository->setStage($this->importJob, 'select_budgets');
$this->repository->setStatus($this->importJob, 'need_job_config');
return;
}
if (1 === count($budgets)) {
$this->repository->setStatus($this->importJob, 'ready_to_run');
$this->repository->setStage($this->importJob, 'get_accounts');
}
return;
}
if ('get_accounts' === $this->importJob->stage) {
$this->repository->setStatus($this->importJob, 'running');
/** @var GetAccountsHandler $handler */
$handler = app(GetAccountsHandler::class);
$handler->setImportJob($this->importJob);
$handler->run();
$this->repository->setStage($this->importJob, 'select_accounts');
$this->repository->setStatus($this->importJob, 'need_job_config');
return;
}
if ('go-for-import' === $this->importJob->stage) {
$this->repository->setStatus($this->importJob, 'running');
$this->repository->setStage($this->importJob, 'do_import');
/** @var ImportDataHandler $handler */
$handler = app(ImportDataHandler::class);
$handler->setImportJob($this->importJob);
$handler->run();
$this->repository->setStatus($this->importJob, 'provider_finished');
$this->repository->setStage($this->importJob, 'final');
return;
}
throw new FireflyException(sprintf('YNAB import routine cannot handle stage "%s"', $this->importJob->stage));
}
}
/**
* Set the import job.
*
* @param ImportJob $importJob
*
* @return void
*/
public function setImportJob(ImportJob $importJob): void
{
$this->importJob = $importJob;
$this->repository = app(ImportJobRepositoryInterface::class);
$this->repository->setUser($importJob->user);
}
}

View File

@@ -1,243 +0,0 @@
<?php
/**
* AbnAmroDescription.php
* Copyright (c) 2019 Robert Horlings
*
* This file is part of Firefly III (https://github.com/firefly-iii).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program 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 Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
namespace FireflyIII\Import\Specifics;
/**
* Class AbnAmroDescription.
*
* @deprecated
* @codeCoverageIgnore
*
* Parses the description from txt files for ABN AMRO bank accounts.
*
* Based on the logic as described in the following Gist:
* https://gist.github.com/vDorst/68d555a6a90f62fec004
*/
class AbnAmroDescription implements SpecificInterface
{
/** @var array The current row. */
public $row;
/**
* Description of this specific fix.
*
* @return string
* @codeCoverageIgnore
*/
public static function getDescription(): string
{
return 'import.specific_abn_descr';
}
/**
* Name of specific fix.
*
* @return string
* @codeCoverageIgnore
*/
public static function getName(): string
{
return 'import.specific_abn_name';
}
/**
* Run the fix.
*
* @param array $row
*
* @return array
*
*/
public function run(array $row): array
{
$this->row = array_values($row);
if (!isset($row[7])) {
return $row;
}
// Try to parse the description in known formats.
$parsed = $this->parseSepaDescription() || $this->parseTRTPDescription() || $this->parseGEABEADescription() || $this->parseABNAMRODescription();
// If the description could not be parsed, specify an unknown opposing
// account, as an opposing account is required
if (!$parsed) {
$this->row[8] = (string) trans('firefly.unknown'); // opposing-account-name
}
return $this->row;
}
/**
* Parses the current description with costs from ABN AMRO itself.
*
* @return bool true if the description is GEA/BEA-format, false otherwise
*/
protected function parseABNAMRODescription(): bool
{
// See if the current description is formatted in ABN AMRO format
if (preg_match('/ABN AMRO.{24} (.*)/', $this->row[7], $matches)) {
$this->row[8] = 'ABN AMRO'; // this one is new (opposing account name)
$this->row[7] = $matches[1]; // this is the description
return true;
}
return false;
}
/**
* Parses the current description in GEA/BEA format.
*
* @return bool true if the description is GEA/BEAformat, false otherwise
*/
protected function parseGEABEADescription(): bool
{
// See if the current description is formatted in GEA/BEA format
if (preg_match('/([BG]EA) +(NR:[a-zA-Z:0-9]+) +([0-9.\/]+) +([^,]*)/', $this->row[7], $matches)) {
// description and opposing account will be the same.
$this->row[8] = $matches[4]; // 'opposing-account-name'
$this->row[7] = $matches[4]; // 'description'
if ('GEA' === $matches[1]) {
$this->row[7] = 'GEA ' . $matches[4]; // 'description'
}
return true;
}
return false;
}
/**
* Parses the current description in SEPA format.
*
* @return bool true if the description is SEPA format, false otherwise
*
*/
protected function parseSepaDescription(): bool
{
// See if the current description is formatted as a SEPA plain description
if (preg_match('/^SEPA(.{28})/', $this->row[7], $matches)) {
$type = $matches[1];
$reference = '';
$name = '';
$newDescription = '';
// SEPA plain descriptions contain several key-value pairs, split by a colon
preg_match_all('/([A-Za-z]+(?=:\s)):\s([A-Za-z 0-9._#-]+(?=\s|$))/', $this->row[7], $matches, PREG_SET_ORDER);
if (is_array($matches)) {
foreach ($matches as $match) {
$key = $match[1];
$value = trim($match[2]);
switch (strtoupper($key)) {
case 'OMSCHRIJVING':
$newDescription = $value;
break;
case 'NAAM':
$this->row[8] = $value;
$name = $value;
break;
case 'KENMERK':
$reference = $value;
break;
case 'IBAN':
$this->row[9] = $value;
break;
default: // @codeCoverageIgnore
// Ignore the rest
}
}
}
// Set a new description for the current transaction. If none was given
// set the description to type, name and reference
$this->row[7] = $newDescription;
if ('' === $newDescription) {
$this->row[7] = sprintf('%s - %s (%s)', $type, $name, $reference);
}
return true;
}
return false;
}
/**
* Parses the current description in TRTP format.
*
* @return bool true if the description is TRTP format, false otherwise
*
*/
protected function parseTRTPDescription(): bool
{
// See if the current description is formatted in TRTP format
if (preg_match_all('!\/([A-Z]{3,4})\/([^/]*)!', $this->row[7], $matches, PREG_SET_ORDER)) {
$type = '';
$name = '';
$reference = '';
$newDescription = '';
// Search for properties specified in the TRTP format. If no description
// is provided, use the type, name and reference as new description
if (is_array($matches)) {
foreach ($matches as $match) {
$key = $match[1];
$value = trim($match[2]);
switch (strtoupper($key)) {
case 'NAME':
$this->row[8] = $value;
break;
case 'REMI':
$newDescription = $value;
break;
case 'IBAN':
$this->row[9] = $value;
break;
case 'EREF':
$reference = $value;
break;
case 'TRTP':
$type = $value;
break;
default: // @codeCoverageIgnore
// Ignore the rest
}
}
// Set a new description for the current transaction. If none was given
// set the description to type, name and reference
$this->row[7] = $newDescription;
if ('' === $newDescription) {
$this->row[7] = sprintf('%s - %s (%s)', $type, $name, $reference);
}
}
return true;
}
return false;
}
}

View File

@@ -1,96 +0,0 @@
<?php
/**
* Belfius.php
* Copyright (c) 2019 Sander Kleykens <sander@kleykens.com>
*
* This file is part of Firefly III (https://github.com/firefly-iii).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program 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 Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
namespace FireflyIII\Import\Specifics;
/**
* Class Belfius.
*
* @deprecated
* @codeCoverageIgnore
*
* Fixes Belfius CSV files to:
* - Correct descriptions for recurring transactions so doubles can be detected when the equivalent incoming
* transaction is imported.
*
*/
class Belfius implements SpecificInterface
{
/**
* Description of this specific fix.
*
* @return string
* @codeCoverageIgnore
*/
public static function getDescription(): string
{
return 'import.specific_belfius_descr';
}
/**
* Name of specific fix.
*
* @return string
* @codeCoverageIgnore
*/
public static function getName(): string
{
return 'import.specific_belfius_name';
}
/**
* Fixes the description for outgoing recurring transactions so doubles can be detected when the equivalent incoming
* transaction is imported for another bank account.
*
* @return array the row containing the new description
*/
protected static function processRecurringTransactionDescription(array $row): array
{
if (!isset($row[5]) || !isset($row[14])) {
return $row;
}
$opposingAccountName = $row[5];
$description = $row[14];
preg_match('/DOORLOPENDE OPDRACHT.*\s+' . preg_quote($opposingAccountName, '/') . '\s+(.+)\s+REF.\s*:/', $description, $matches);
if (isset($matches[1])) {
$row[14] = $matches[1];
}
return $row;
}
/**
* Run the fix.
*
* @param array $row
*
* @return array
*
*/
public function run(array $row): array
{
return Belfius::processRecurringTransactionDescription($row);
}
}

View File

@@ -1,144 +0,0 @@
<?php
/**
* IngBelgium.php
* Copyright (c) 2019 Sander Kleykens <sander@kleykens.com>
*
* This file is part of Firefly III (https://github.com/firefly-iii).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program 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 Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
namespace FireflyIII\Import\Specifics;
/**
* Class IngBelgium.
*
* @deprecated
* @codeCoverageIgnore
*
* Parses the description and opposing account information (IBAN and name) from CSV files for ING Belgium bank accounts.
*
*/
class IngBelgium implements SpecificInterface
{
/**
* Description of the current specific.
*
* @return string
* @codeCoverageIgnore
*/
public static function getDescription(): string
{
return 'import.specific_ingbelgium_descr';
}
/**
* Name of the current specific.
*
* @return string
* @codeCoverageIgnore
*/
public static function getName(): string
{
return 'import.specific_ingbelgium_name';
}
/**
* Gets the description from the transaction details and makes sure structured descriptions are in the
* "+++090/9337/55493+++" format.
*
* @return string the description
*/
protected static function description(string $transactionDetails): string
{
$description = IngBelgium::parseInformationFromTransactionDetails($transactionDetails, '/Mededeling:\s*(.+)$/');
return IngBelgium::convertStructuredDescriptionToProperFormat($description);
}
/**
* Gets the opposing account's IBAN from the transaction details.
*
* @return string the opposing account's IBAN
*/
protected static function opposingAccountIban(string $transactionDetails): string
{
return IngBelgium::parseInformationFromTransactionDetails($transactionDetails, '/IBAN:\s*(.+?)(?=\s+)/');
}
/**
* Gets the opposing account name from the transaction details.
*
* @return string the opposing account name
*/
protected static function opposingAccountName(string $transactionDetails): string
{
return IngBelgium::parseInformationFromTransactionDetails($transactionDetails, '/Van:\s*(.+?)(?=\s{2,})/');
}
/**
* Gets the description and opposing account information (IBAN and name) from the transaction details and adds
* them to the row of data.
*
* @return array the row containing the description and opposing account's IBAN
*/
protected static function processTransactionDetails(array $row): array
{
if (isset($row[9])) {
$transactionDetails = $row[9];
$row[11] = IngBelgium::opposingAccountName($transactionDetails);
$row[12] = IngBelgium::opposingAccountIban($transactionDetails);
$row[13] = IngBelgium::description($transactionDetails);
}
return $row;
}
private static function convertStructuredDescriptionToProperFormat(string $description): string
{
preg_match('/^\*\*\*(\d{3}\/\d{4}\/\d{5})\*\*\*$/', $description, $matches);
if (isset($matches[1])) {
return '+++' . $matches[1] . '+++';
}
return $description;
}
private static function parseInformationFromTransactionDetails(string $transactionDetails, string $regex): string
{
if (isset($transactionDetails)) {
preg_match($regex, $transactionDetails, $matches);
if (isset($matches[1])) {
return trim($matches[1]);
}
}
return '';
}
/**
* Run the specific code.
*
* @param array $row
*
* @return array
*
*/
public function run(array $row): array
{
return IngBelgium::processTransactionDetails($row);
}
}

View File

@@ -1,173 +0,0 @@
<?php
/**
* IngDescription.php
* Copyright (c) 2019 https://github.com/tomwerf
*
* This file is part of Firefly III (https://github.com/firefly-iii).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program 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 Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
namespace FireflyIII\Import\Specifics;
/**
* Class IngDescription.
*
* @deprecated
* @codeCoverageIgnore
*
* Parses the description from CSV files for Ing bank accounts.
*
* With Mutation 'InternetBankieren', 'Overschrijving', 'Verzamelbetaling' and
* 'Incasso' the Name of Opposing account the Opposing IBAN number are in the
* Description. This class will remove them, and add Name in description by
* 'Betaalautomaat' so those are easily recognizable
*/
class IngDescription implements SpecificInterface
{
/** @var array The current row. */
public $row;
/**
* Description of the current specific.
*
* @return string
* @codeCoverageIgnore
*/
public static function getDescription(): string
{
return 'import.specific_ing_descr';
}
/**
* Name of the current specific.
*
* @return string
* @codeCoverageIgnore
*/
public static function getName(): string
{
return 'import.specific_ing_name';
}
/**
* Run the specific code.
*
* @param array $row
*
* @return array
*
*/
public function run(array $row): array
{
$this->row = array_values($row);
array_push($this->row); // New column for "Valutadatum"
if (count($this->row) >= 8) { // check if the array is correct
switch ($this->row[4]) { // Get value for the mutation type
case 'GT': // InternetBankieren
case 'OV': // Overschrijving
case 'VZ': // Verzamelbetaling
case 'IC': // Incasso
case 'DV': // Divers
$this->removeIBANIngDescription(); // Remove "IBAN:", because it is already at "Tegenrekening"
$this->removeNameIngDescription(); // Remove "Naam:", because it is already at "Naam/ Omschrijving"
$this->removeIngDescription(); // Remove "Omschrijving", but not the value from description
$this->moveValutadatumDescription(); // Move "Valutadatum" from description to new column
$this->MoveSavingsAccount(); // Move savings account number and name
break;
case 'BA': // Betaalautomaat
$this->moveValutadatumDescription(); // Move "Valutadatum" from description to new column
$this->addNameIngDescription();
break;
}
}
return $this->row;
}
/**
* Add the Opposing name from cell 1 in the description for Betaalautomaten
* Otherwise the description is only: 'Pasvolgnr:<nr> <date> Transactie:<NR> Term:<nr>'.
*/
protected function addNameIngDescription(): void
{
$this->row[8] = $this->row[1] . ' ' . $this->row[8];
}
/**
* Move "Valutadatum" from the description to new column.
*/
protected function moveValutadatumDescription(): void
{
$matches = [];
if (preg_match('/Valutadatum: ([0-9-]+)/', $this->row[8], $matches)) {
$this->row[9] = date("Ymd", strtotime($matches[1]));
$this->row[8] = preg_replace('/Valutadatum: [0-9-]+/', '', $this->row[8]);
}
}
/**
* Remove IBAN number out of the description
* Default description of Description is: Naam: <OPPOS NAME> Omschrijving: <DESCRIPTION> IBAN: <OPPOS IBAN NR>.
*/
protected function removeIBANIngDescription(): void
{
// Try replace the iban number with nothing. The IBAN nr is found in the third column
$this->row[8] = preg_replace('/\sIBAN:\s' . $this->row[3] . '/', '', $this->row[8]);
}
/**
* Remove "Omschrijving" (and NOT its value) from the description.
*/
protected function removeIngDescription(): void
{
$this->row[8] = preg_replace('/Omschrijving: /', '', $this->row[8]);
}
/**
* Remove "Naam" (and its value) from the description.
*/
protected function removeNameIngDescription(): void
{
$this->row[8] = preg_replace('/Naam:.*?([a-zA-Z\/]+:)/', '$1', $this->row[8]);
}
/**
* Move savings account number to column 1 and name to column 3.
*/
private function MoveSavingsAccount(): void
{
$matches = [];
if (preg_match('/(Naar|Van) (.*rekening) ([A-Za-z0-9]+)/', $this->row[8], $matches)) { // Search for saving acount at 'Mededelingen' column
$this->row[1] = $this->row[1] . ' ' . $matches[2] . ' ' . $matches[3]; // Current name + Saving acount name + Acount number
if ('' === (string) $this->row[3]) { // if Saving account number does not yet exists
$this->row[3] = $matches[3]; // Copy savings account number
}
$this->row[8] = preg_replace('/(Naar|Van) (.*rekening) ([A-Za-z0-9]+)/', '', $this->row[8]); // Remove the savings account content from description
} elseif (preg_match('/(Naar|Van) (.*rekening) ([A-Za-z0-9]+)/', $this->row[1], $matches)) { // Search for saving acount at 'Naam / Omschrijving' column
$this->row[1] = $matches[2] . ' ' . $matches[3]; // Saving acount name + Acount number
if ('' === (string) $this->row[3]) { // if Saving account number does not yet exists
$this->row[3] = $matches[3]; // Copy savings account number
}
}
if ('' !== (string)$this->row[3]) { // if Saving account number exists
if (! preg_match('/[A-Za-z]/', $this->row[3])) { // if Saving account number has no characters
$this->row[3] = sprintf("%010d", $this->row[3]); // Make the number 10 digits
}
}
}
}

View File

@@ -1,77 +0,0 @@
<?php
/**
* PresidentsChoice.php
* Copyright (c) 2019 james@firefly-iii.org
*
* This file is part of Firefly III (https://github.com/firefly-iii).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program 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 Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
namespace FireflyIII\Import\Specifics;
/**
* Class PresidentsChoice.
*
* @deprecated
* @codeCoverageIgnore
*/
class PresidentsChoice implements SpecificInterface
{
/**
* Description of specific.
*
* @return string
* @codeCoverageIgnore
*/
public static function getDescription(): string
{
return 'import.specific_pres_descr';
}
/**
* Name of specific.
*
* @return string
* @codeCoverageIgnore
*/
public static function getName(): string
{
return 'import.specific_pres_name';
}
/**
* Run this specific.
*
* @param array $row
*
* @return array
*/
public function run(array $row): array
{
$row = array_values($row);
// first, if column 2 is empty and 3 is not, do nothing.
// if column 3 is empty and column 2 is not, move amount to column 3, *-1
if (isset($row[3]) && '' === $row[3]) {
$row[3] = bcmul($row[2], '-1');
}
if (isset($row[1])) {
// copy description into column 2, which is now usable.
$row[2] = $row[1];
}
return $row;
}
}

View File

@@ -1,69 +0,0 @@
<?php
/**
* RabobankDescription.php
* Copyright (c) 2019 james@firefly-iii.org
*
* This file is part of Firefly III (https://github.com/firefly-iii).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program 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 Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
namespace FireflyIII\Import\Specifics;
/**
* Class RabobankDescription.
*
* @codeCoverageIgnore
* @deprecated
*/
class RabobankDescription implements SpecificInterface
{
/**
* Description of this specific.
*
* @return string
* @codeCoverageIgnore
*/
public static function getDescription(): string
{
return 'import.specific_rabo_descr';
}
/**
* Name of this specific.
*
* @return string
* @codeCoverageIgnore
*/
public static function getName(): string
{
return 'import.specific_rabo_name';
}
/**
* Run the specific.
*
* @param array $row
*
* @return array
*
*/
public function run(array $row): array
{
$row = array_values($row);
return $row;
}
}

View File

@@ -1,73 +0,0 @@
<?php
/**
* SnsDescription.php
* Copyright (c) 2019 hugovanduijn@gmail.com.
*
* This file is part of Firefly III (https://github.com/firefly-iii).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program 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 Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
namespace FireflyIII\Import\Specifics;
/**
* Class SnsDescription.
*
* @codeCoverageIgnore
* @deprecated
*/
class SnsDescription implements SpecificInterface
{
/**
* Get description of specific.
*
* @return string
* @codeCoverageIgnore
*/
public static function getDescription(): string
{
return 'import.specific_sns_descr';
}
/**
* Get name of specific.
*
* @return string
* @codeCoverageIgnore
*/
public static function getName(): string
{
return 'import.specific_sns_name';
}
/**
* Run specific.
*
* @param array $row
*
* @return array
*/
public function run(array $row): array
{
$row = array_values($row);
if (!isset($row[17])) {
return $row;
}
$row[17] = ltrim($row[17], "'");
$row[17] = rtrim($row[17], "'");
return $row;
}
}

View File

@@ -1,55 +0,0 @@
<?php
/**
* SpecificInterface.php
* Copyright (c) 2019 james@firefly-iii.org
*
* This file is part of Firefly III (https://github.com/firefly-iii).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program 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 Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
namespace FireflyIII\Import\Specifics;
/**
* Interface SpecificInterface.
*
* @codeCoverageIgnore
* @deprecated
*/
interface SpecificInterface
{
/**
* Get description.
*
* @return string
*/
public static function getDescription(): string;
/**
* Get name.
*
* @return string
*/
public static function getName(): string;
/**
* Run specific.
*
* @param array $row
*
* @return array
*/
public function run(array $row): array;
}

View File

@@ -1,630 +0,0 @@
<?php
/**
* ImportArrayStorage.php
* Copyright (c) 2019 james@firefly-iii.org
*
* This file is part of Firefly III (https://github.com/firefly-iii).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program 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 Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
namespace FireflyIII\Import\Storage;
use Carbon\Carbon;
use DB;
use Exception;
use FireflyIII\Events\RequestedReportOnJournals;
use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Helpers\Collector\GroupCollectorInterface;
use FireflyIII\Models\ImportJob;
use FireflyIII\Models\Preference;
use FireflyIII\Models\TransactionGroup;
use FireflyIII\Models\TransactionJournal;
use FireflyIII\Models\TransactionType;
use FireflyIII\Repositories\ImportJob\ImportJobRepositoryInterface;
use FireflyIII\Repositories\Journal\JournalRepositoryInterface;
use FireflyIII\Repositories\Tag\TagRepositoryInterface;
use FireflyIII\Repositories\TransactionGroup\TransactionGroupRepositoryInterface;
use FireflyIII\TransactionRules\Engine\RuleEngine;
use Illuminate\Database\QueryException;
use Illuminate\Support\Collection;
use Log;
/**
* Creates new transactions based on arrays.
*
* Class ImportArrayStorage
*
* @codeCoverageIgnore
* @deprecated
*
*/
class ImportArrayStorage
{
/** @var int Number of hits required for a transfer to match. */
private const REQUIRED_HITS = 4;
/** @var bool Check for transfers during import. */
private $checkForTransfers = false;
/** @var TransactionGroupRepositoryInterface */
private $groupRepos;
/** @var ImportJob The import job */
private $importJob;
/** @var JournalRepositoryInterface Journal repository for storage. */
private $journalRepos;
/** @var string */
private $language = 'en_US';
/** @var ImportJobRepositoryInterface Import job repository */
private $repository;
/** @var array The transfers the user already has. */
private $transfers;
/**
* Set job, count transfers in the array and create the repository.
*
* @param ImportJob $importJob
*/
public function setImportJob(ImportJob $importJob): void
{
$this->importJob = $importJob;
$this->repository = app(ImportJobRepositoryInterface::class);
$this->repository->setUser($importJob->user);
$this->countTransfers();
$this->journalRepos = app(JournalRepositoryInterface::class);
$this->journalRepos->setUser($importJob->user);
$this->groupRepos = app(TransactionGroupRepositoryInterface::class);
$this->groupRepos->setUser($importJob->user);
// get language of user.
/** @var Preference $pref */
$pref = app('preferences')->getForUser($importJob->user, 'language', config('firefly.default_language', 'en_US'));
$this->language = $pref->data;
Log::debug('Constructed ImportArrayStorage()');
}
/**
* Actually does the storing. Does three things.
* - Store journals
* - Link to tag
* - Run rules (if set to)
*
* @throws FireflyException
* @return Collection
*/
public function store(): Collection
{
// store transactions
$this->setStatus('storing_data');
$collection = $this->storeGroupArray();
$this->setStatus('stored_data');
// link tag:
$this->setStatus('linking_to_tag');
$this->linkToTag($collection);
$this->setStatus('linked_to_tag');
// run rules, if configured to.
$config = $this->importJob->configuration;
if (isset($config['apply-rules']) && true === $config['apply-rules']) {
$this->setStatus('applying_rules');
$this->applyRules($collection);
$this->setStatus('rules_applied');
}
app('preferences')->mark();
// email about this:
event(new RequestedReportOnJournals((int) $this->importJob->user_id, $collection));
return $collection;
}
/**
* Applies the users rules to the created journals.
*
* @param Collection $collection
*
*/
private function applyRules(Collection $collection): void
{
Log::debug('Now in applyRules()');
/** @var RuleEngine $ruleEngine */
$ruleEngine = app(RuleEngine::class);
$ruleEngine->setUser($this->importJob->user);
$ruleEngine->setAllRules(true);
// for this call, the rule engine only includes "store" rules:
$ruleEngine->setTriggerMode(RuleEngine::TRIGGER_STORE);
Log::debug('Start of engine loop');
foreach ($collection as $group) {
$this->applyRulesGroup($ruleEngine, $group);
}
Log::debug('End of engine loop.');
}
/**
* @param RuleEngine $ruleEngine
* @param TransactionGroup $group
*/
private function applyRulesGroup(RuleEngine $ruleEngine, TransactionGroup $group): void
{
Log::debug(sprintf('Processing group #%d', $group->id));
foreach ($group->transactionJournals as $journal) {
Log::debug(sprintf('Processing journal #%d from group #%d', $journal->id, $group->id));
$ruleEngine->processTransactionJournal($journal);
}
}
/**
* Count the number of transfers in the array. If this is zero, don't bother checking for double transfers.
*/
private function countTransfers(): void
{
Log::debug('Now in countTransfers()');
/** @var array $array */
$array = $this->repository->getTransactions($this->importJob);
$count = 0;
foreach ($array as $index => $group) {
foreach ($group['transactions'] as $transaction) {
if (strtolower(TransactionType::TRANSFER) === strtolower($transaction['type'])) {
$count++;
Log::debug(sprintf('Row #%d is a transfer, increase count to %d', $index + 1, $count));
}
}
}
Log::debug(sprintf('Count of transfers in import array is %d.', $count));
if ($count > 0) {
$this->checkForTransfers = true;
Log::debug('Will check for duplicate transfers.');
// get users transfers. Needed for comparison.
$this->getTransfers();
}
}
/**
* @param int $index
* @param array $group
*
* @return bool
*/
private function duplicateDetected(int $index, array $group): bool
{
Log::debug(sprintf('Now in duplicateDetected(%d)', $index));
$transactions = $group['transactions'] ?? [];
foreach ($transactions as $transaction) {
$hash = $this->getHash($transaction);
$existingId = $this->hashExists($hash);
if (null !== $existingId) {
$message = (string) trans('import.duplicate_row', ['row' => $index, 'description' => $transaction['description']]);
$this->logDuplicateObject($transaction, $existingId);
$this->repository->addErrorMessage($this->importJob, $message);
return true;
}
// do transfer detection:
if ($this->checkForTransfers && $this->transferExists($transaction)) {
$message = (string) trans('import.duplicate_row', ['row' => $index, 'description' => $transaction['description']]);
$this->logDuplicateTransfer($transaction);
$this->repository->addErrorMessage($this->importJob, $message);
return true;
}
}
return false;
}
/**
* Get hash of transaction.
*
* @param array $transaction
*
* @return string
*/
private function getHash(array $transaction): string
{
unset($transaction['import_hash_v2'], $transaction['original_source']);
$json = json_encode($transaction, JSON_THROW_ON_ERROR);
if (false === $json) {
// @codeCoverageIgnoreStart
/** @noinspection ForgottenDebugOutputInspection */
Log::error('Could not encode import array.', $transaction);
try {
$json = random_int(1, 10000);
} catch (Exception $e) {
// seriously?
Log::error(sprintf('random_int() just failed. I want a medal: %s', $e->getMessage()));
}
// @codeCoverageIgnoreEnd
}
$hash = hash('sha256', $json);
Log::debug(sprintf('The hash is: %s', $hash), $transaction);
return $hash;
}
/**
* @param TransactionGroup $transactionGroup
*
* @return array
*/
private function getTransactionFromJournal(TransactionGroup $transactionGroup): array
{
// collect transactions using the journal collector
/** @var GroupCollectorInterface $collector */
$collector = app(GroupCollectorInterface::class);
$collector->setUser($this->importJob->user);
$collector->setGroup($transactionGroup);
return $collector->getExtractedJournals();
}
/**
* Get the users transfers, so they can be compared to whatever the user is trying to import.
*/
private function getTransfers(): void
{
Log::debug('Now in getTransfers()');
app('preferences')->mark();
/** @var GroupCollectorInterface $collector */
$collector = app(GroupCollectorInterface::class);
$collector->setUser($this->importJob->user);
$collector
->setTypes([TransactionType::TRANSFER])->setLimit(10000)->setPage(1)
->withAccountInformation();
$this->transfers = $collector->getExtractedJournals();
Log::debug(sprintf('Count of getTransfers() is %d', count($this->transfers)));
}
/**
* Check if the hash exists for the array the user wants to import.
*
* @param string $hash
*
* @return int|null
*/
private function hashExists(string $hash): ?int
{
$entry = $this->journalRepos->findByHash($hash);
if (null === $entry) {
Log::debug(sprintf('Found no transactions with hash %s.', $hash));
return null;
}
Log::info(sprintf('Found a transaction journal with an existing hash: %s', $hash));
return (int) $entry->transaction_journal_id;
}
/**
* Link all imported journals to a tag.
*
* @param Collection $collection
*/
private function linkToTag(Collection $collection): void
{
if (0 === $collection->count()) {
return;
}
/** @var TagRepositoryInterface $repository */
$repository = app(TagRepositoryInterface::class);
$repository->setUser($this->importJob->user);
$data = [
'tag' => (string) trans('import.import_with_key', ['key' => $this->importJob->key]),
'date' => new Carbon,
'description' => null,
'latitude' => null,
'longitude' => null,
'zoom_level' => null,
'tagMode' => 'nothing',
];
$tag = $repository->store($data);
Log::debug(sprintf('Created tag #%d ("%s")', $tag->id, $tag->tag));
Log::debug('Looping groups...');
// TODO double loop.
/** @var TransactionGroup $group */
foreach ($collection as $group) {
Log::debug(sprintf('Looping journals in group #%d', $group->id));
/** @var TransactionJournal $journal */
$journalIds = $group->transactionJournals->pluck('id')->toArray();
$tagId = $tag->id;
foreach ($journalIds as $journalId) {
Log::debug(sprintf('Linking journal #%d to tag #%d...', $journalId, $tagId));
// @codeCoverageIgnoreStart
try {
DB::table('tag_transaction_journal')->insert(['transaction_journal_id' => $journalId, 'tag_id' => $tagId]);
} catch (QueryException $e) {
Log::error(sprintf('Could not link journal #%d to tag #%d because: %s', $journalId, $tagId, $e->getMessage()));
}
// @codeCoverageIgnoreEnd
}
Log::info(sprintf('Linked %d journals to tag #%d ("%s")', $collection->count(), $tag->id, $tag->tag));
}
$this->repository->setTag($this->importJob, $tag);
}
/**
* Log about a duplicate object (double hash).
*
* @param array $transaction
* @param int $existingId
*/
private function logDuplicateObject(array $transaction, int $existingId): void
{
Log::info(
'Transaction is a duplicate, and will not be imported (the hash exists).',
[
'existing' => $existingId,
'description' => $transaction['description'] ?? '',
'amount' => $transaction['transactions'][0]['amount'] ?? 0,
'date' => $transaction['date'] ?? '',
]
);
}
/**
* Log about a duplicate transfer.
*
* @param array $transaction
*/
private function logDuplicateTransfer(array $transaction): void
{
Log::info(
'Transaction is a duplicate transfer, and will not be imported (such a transfer exists already).',
[
'description' => $transaction['description'] ?? '',
'amount' => $transaction['transactions'][0]['amount'] ?? 0,
'date' => $transaction['date'] ?? '',
]
);
}
/**
* Shorthand method to quickly set job status
*
* @param string $status
*/
private function setStatus(string $status): void
{
$this->repository->setStatus($this->importJob, $status);
}
/**
* @param int $index
* @param array $group
*
* @return TransactionGroup|null
*/
private function storeGroup(int $index, array $group): ?TransactionGroup
{
Log::debug(sprintf('Going to store entry #%d', $index + 1));
// do some basic error catching.
foreach ($group['transactions'] as $groupIndex => $transaction) {
$group['transactions'][$groupIndex]['date'] = Carbon::parse($transaction['date'], config('app.timezone'));
$group['transactions'][$groupIndex]['description'] = '' === $transaction['description'] ? '(empty description)' : $transaction['description'];
}
// do duplicate detection!
if ($this->duplicateDetected($index, $group)) {
Log::warning(sprintf('Row #%d seems to be a imported already and will be ignored.', $index));
return null;
}
// store the group
try {
$newGroup = $this->groupRepos->store($group);
// @codeCoverageIgnoreStart
} catch (FireflyException $e) {
Log::error($e->getMessage());
Log::error($e->getTraceAsString());
$this->repository->addErrorMessage($this->importJob, sprintf('Row #%d could not be imported. %s', $index, $e->getMessage()));
return null;
}
// @codeCoverageIgnoreEnd
Log::debug(sprintf('Stored as group #%d', $newGroup->id));
// add to collection of transfers, if necessary:
if ('transfer' === strtolower($group['transactions'][0]['type'])) {
$journals = $this->getTransactionFromJournal($newGroup);
Log::debug('We just stored a transfer, so add the journal to the list of transfers.');
foreach ($journals as $newJournal) {
$this->transfers[] = $newJournal;
}
Log::debug(sprintf('List length is now %d', count($this->transfers)));
}
return $newGroup;
}
/**
* Store array as journals.
*
* @throws FireflyException
*
* @return Collection
*/
private function storeGroupArray(): Collection
{
/** @var array $array */
$array = $this->repository->getTransactions($this->importJob);
$count = count($array);
Log::notice(sprintf('Will now store the groups. Count of groups is %d.', $count));
Log::notice('Going to store...');
$collection = new Collection;
foreach ($array as $index => $group) {
Log::debug(sprintf('Now store #%d', $index + 1));
$result = $this->storeGroup($index, $group);
if (null !== $result) {
$collection->push($result);
}
}
Log::notice(sprintf('Done storing. Firefly III has stored %d transactions.', $collection->count()));
return $collection;
}
/**
* Check if a transfer exists.
*
* @param array $transaction
*
* @return bool
*
*/
private function transferExists(array $transaction): bool
{
Log::debug('transferExists() Check if transaction is a double transfer.');
// how many hits do we need?
Log::debug(sprintf('System has %d existing transfers', count($this->transfers)));
// loop over each split:
// check if is a transfer
if (strtolower(TransactionType::TRANSFER) !== strtolower($transaction['type'])) {
// @codeCoverageIgnoreStart
Log::debug(sprintf('Is a %s, not a transfer so no.', $transaction['type']));
return false;
// @codeCoverageIgnoreEnd
}
Log::debug(sprintf('Required hits for transfer comparison is %d', self::REQUIRED_HITS));
// get the amount:
/** @noinspection UnnecessaryCastingInspection */
$amount = (string) ($transaction['amount'] ?? '0');
if (bccomp($amount, '0') === -1) {
$amount = bcmul($amount, '-1'); // @codeCoverageIgnore
}
// get the description:
//$description = '' === (string)$transaction['description'] ? $transaction['description'] : $transaction['description'];
$description = (string) $transaction['description'];
// get the source and destination ID's:
$transactionSourceIDs = [(int) $transaction['source_id'], (int) $transaction['destination_id']];
sort($transactionSourceIDs);
// get the source and destination names:
$transactionSourceNames = [(string) $transaction['source_name'], (string) $transaction['destination_name']];
sort($transactionSourceNames);
// then loop all transfers:
/** @var array $transfer */
foreach ($this->transfers as $transfer) {
// number of hits for this split-transfer combination:
$hits = 0;
Log::debug(sprintf('Now looking at transaction journal #%d', $transfer['transaction_journal_id']));
// compare amount:
$originalAmount = app('steam')->positive($transfer['amount']);
Log::debug(sprintf('Amount %s compared to %s', $amount, $originalAmount));
if (0 !== bccomp($amount, $originalAmount)) {
Log::debug('Amount is not a match, continue with next transfer.');
continue;
}
++$hits;
Log::debug(sprintf('Comparison is a hit! (%s)', $hits));
// compare description:
// $comparison = '(empty description)' === $transfer['description'] ? '' : $transfer['description'];
$comparison = $transfer['description'];
Log::debug(sprintf('Comparing "%s" to "%s" (original: "%s")', $description, $transfer['description'], $comparison));
if ($description !== $comparison) {
Log::debug('Description is not a match, continue with next transfer.');
continue; // @codeCoverageIgnore
}
++$hits;
Log::debug(sprintf('Comparison is a hit! (%s)', $hits));
// compare date:
$transferDate = $transfer['date']->format('Y-m-d H:i:s');
$transactionDate = $transaction['date']->format('Y-m-d H:i:s');
Log::debug(sprintf('Comparing dates "%s" to "%s"', $transactionDate, $transferDate));
if ($transactionDate !== $transferDate) {
Log::debug('Date is not a match, continue with next transfer.');
continue; // @codeCoverageIgnore
}
++$hits;
Log::debug(sprintf('Comparison is a hit! (%s)', $hits));
// compare source and destination id's
$transferSourceIDs = [(int) $transfer['source_account_id'], (int) $transfer['destination_account_id']];
sort($transferSourceIDs);
/** @noinspection DisconnectedForeachInstructionInspection */
Log::debug('Comparing current transaction source+dest IDs', $transactionSourceIDs);
Log::debug('.. with current transfer source+dest IDs', $transferSourceIDs);
if ($transactionSourceIDs === $transferSourceIDs) {
++$hits;
Log::debug(sprintf('Source IDs are the same! (%d)', $hits));
}
if ($transactionSourceIDs !== $transferSourceIDs) {
Log::debug('Source IDs are not the same.');
}
unset($transferSourceIDs);
// compare source and destination names
$transferSource = [(string) ($transfer['source_account_name'] ?? ''), (string) ($transfer['destination_account_name'] ?? '')];
sort($transferSource);
/** @noinspection DisconnectedForeachInstructionInspection */
Log::debug('Comparing current transaction source+dest names', $transactionSourceNames);
Log::debug('.. with current transfer source+dest names', $transferSource);
if ($transactionSourceNames === $transferSource && $transferSource !== ['', '']) {
// @codeCoverageIgnoreStart
++$hits;
Log::debug(sprintf('Source names are the same! (%d)', $hits));
// @codeCoverageIgnoreEnd
}
if ($transactionSourceNames !== $transferSource) {
Log::debug('Source names are not the same.');
}
Log::debug(sprintf('Number of hits is %d', $hits));
if ($hits >= self::REQUIRED_HITS) {
Log::debug(sprintf('Is more than %d, return true.', self::REQUIRED_HITS));
return true;
}
}
Log::debug('Is not an existing transfer, return false.');
return false;
}
}

View File

@@ -94,6 +94,12 @@ use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
* @property-read int|null $notes_count * @property-read int|null $notes_count
* @property-read int|null $piggy_banks_count * @property-read int|null $piggy_banks_count
* @property-read int|null $transactions_count * @property-read int|null $transactions_count
* @property \Illuminate\Support\Carbon|null $created_at
* @property \Illuminate\Support\Carbon|null $updated_at
* @property int $account_type_id
* @property bool $encrypted
* @property-read \Illuminate\Database\Eloquent\Collection|\FireflyIII\Models\AccountMeta[] $accountMeta
* @property-read \Illuminate\Database\Eloquent\Collection|\FireflyIII\Models\PiggyBank[] $piggyBanks
*/ */
class Account extends Model class Account extends Model
{ {

View File

@@ -1,150 +0,0 @@
<?php
/**
* ImportJob.php
* Copyright (c) 2019 james@firefly-iii.org
*
* This file is part of Firefly III (https://github.com/firefly-iii).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program 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 Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
namespace FireflyIII\Models;
use Carbon\Carbon;
use Eloquent;
use FireflyIII\User;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Collection;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Relations\MorphMany;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
/**
* Class ImportJob.
*
* @codeCoverageIgnore
* @deprecated
* @property array $transactions
* @property array $configuration
* @property User $user
* @property int $user_id
* @property string $status
* @property string $stage
* @property string $key
* @property string $provider
* @property string $file_type
* @property int $tag_id
* @property Tag $tag
* @property array $errors
* @property array extended_status
* @property int id
* @property Carbon $created_at
* @property Carbon $updated_at
* @property-read Collection|Attachment[] $attachments
* @method static Builder|ImportJob newModelQuery()
* @method static Builder|ImportJob newQuery()
* @method static Builder|ImportJob query()
* @method static Builder|ImportJob whereConfiguration($value)
* @method static Builder|ImportJob whereCreatedAt($value)
* @method static Builder|ImportJob whereErrors($value)
* @method static Builder|ImportJob whereExtendedStatus($value)
* @method static Builder|ImportJob whereFileType($value)
* @method static Builder|ImportJob whereId($value)
* @method static Builder|ImportJob whereKey($value)
* @method static Builder|ImportJob whereProvider($value)
* @method static Builder|ImportJob whereStage($value)
* @method static Builder|ImportJob whereStatus($value)
* @method static Builder|ImportJob whereTagId($value)
* @method static Builder|ImportJob whereTransactions($value)
* @method static Builder|ImportJob whereUpdatedAt($value)
* @method static Builder|ImportJob whereUserId($value)
* @mixin Eloquent
* @property-read int|null $attachments_count
* @property int $id
* @property array|null $extended_status
*/
class ImportJob extends Model
{
/**
* The attributes that should be casted to native types.
*
* @var array
*/
protected $casts
= [
'user_id' => 'int',
'created_at' => 'datetime',
'updated_at' => 'datetime',
'configuration' => 'array',
'extended_status' => 'array',
'transactions' => 'array',
'errors' => 'array',
];
/** @var array Fields that can be filled */
protected $fillable = ['key', 'user_id', 'file_type', 'provider', 'status', 'stage', 'configuration', 'extended_status', 'transactions', 'errors'];
/**
* Route binder. Converts the key in the URL to the specified object (or throw 404).
*
* @param $value
*
* @throws NotFoundHttpException
* @return mixed
*
*/
public static function routeBinder(string $value): ImportJob
{
if (auth()->check()) {
$key = trim($value);
/** @var User $user */
$user = auth()->user();
/** @var ImportJob $importJob */
$importJob = $user->importJobs()->where('key', $key)->first();
if (null !== $importJob) {
return $importJob;
}
}
throw new NotFoundHttpException;
}
/**
* @codeCoverageIgnore
* @return MorphMany
*/
public function attachments(): MorphMany
{
return $this->morphMany(Attachment::class, 'attachable');
}
/**
* @codeCoverageIgnore
* @return BelongsTo
*/
public function tag(): BelongsTo
{
return $this->belongsTo(Tag::class);
}
/**
* @codeCoverageIgnore
* @return BelongsTo
*/
public function user(): BelongsTo
{
return $this->belongsTo(User::class);
}
}

View File

@@ -8,6 +8,13 @@ use Illuminate\Database\Eloquent\Model;
/** /**
* Class ObjectGroup * Class ObjectGroup
*
* @property-read \Illuminate\Database\Eloquent\Collection|\FireflyIII\Models\PiggyBank[] $piggyBanks
* @property-read int|null $piggy_banks_count
* @method static \Illuminate\Database\Eloquent\Builder|\FireflyIII\Models\ObjectGroup newModelQuery()
* @method static \Illuminate\Database\Eloquent\Builder|\FireflyIII\Models\ObjectGroup newQuery()
* @method static \Illuminate\Database\Eloquent\Builder|\FireflyIII\Models\ObjectGroup query()
* @mixin \Eloquent
*/ */
class ObjectGroup extends Model class ObjectGroup extends Model
{ {

View File

@@ -78,6 +78,9 @@ use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
* @property-read int|null $notes_count * @property-read int|null $notes_count
* @property-read int|null $piggy_bank_events_count * @property-read int|null $piggy_bank_events_count
* @property-read int|null $piggy_bank_repetitions_count * @property-read int|null $piggy_bank_repetitions_count
* @property bool $encrypted
* @property-read \Illuminate\Database\Eloquent\Collection|\FireflyIII\Models\ObjectGroup[] $objectGroups
* @property-read int|null $object_groups_count
*/ */
class PiggyBank extends Model class PiggyBank extends Model
{ {

View File

@@ -78,6 +78,13 @@ use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
* @property-read \Illuminate\Database\Eloquent\Collection|Location[] $locations * @property-read \Illuminate\Database\Eloquent\Collection|Location[] $locations
* @property-read int|null $locations_count * @property-read int|null $locations_count
* @property-read int|null $transaction_journals_count * @property-read int|null $transaction_journals_count
* @property \Illuminate\Support\Carbon|null $created_at
* @property \Illuminate\Support\Carbon|null $updated_at
* @property string $tagMode
* @property string|null $description
* @property float|null $latitude
* @property float|null $longitude
* @property int|null $zoomLevel
*/ */
class Tag extends Model class Tag extends Model
{ {

View File

@@ -1,62 +0,0 @@
<?php
/**
* ImportServiceProvider.php
* Copyright (c) 2019 james@firefly-iii.org
*
* This file is part of Firefly III (https://github.com/firefly-iii).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program 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 Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
namespace FireflyIII\Providers;
use FireflyIII\Repositories\ImportJob\ImportJobRepository;
use FireflyIII\Repositories\ImportJob\ImportJobRepositoryInterface;
use Illuminate\Foundation\Application;
use Illuminate\Support\ServiceProvider;
/**
* @codeCoverageIgnore
* Class ImportServiceProvider.
* @deprecated
*/
class ImportServiceProvider extends ServiceProvider
{
/**
* Bootstrap the application services.
*/
public function boot(): void
{
}
/**
* Register the application services.
*/
public function register(): void
{
$this->app->bind(
ImportJobRepositoryInterface::class,
function (Application $app) {
/** @var ImportJobRepositoryInterface $repository */
$repository = app(ImportJobRepository::class);
if ($app->auth->check()) {
$repository->setUser(auth()->user());
}
return $repository;
}
);
}
}

View File

@@ -1,479 +0,0 @@
<?php
/**
* ImportJobRepository.php
* Copyright (c) 2019 james@firefly-iii.org
*
* This file is part of Firefly III (https://github.com/firefly-iii).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program 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 Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
namespace FireflyIII\Repositories\ImportJob;
use Crypt;
use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Models\Attachment;
use FireflyIII\Models\ImportJob;
use FireflyIII\Models\Tag;
use FireflyIII\User;
use Illuminate\Support\Collection;
use Illuminate\Support\MessageBag;
use Illuminate\Support\Str;
use Log;
use Storage;
use Symfony\Component\HttpFoundation\File\UploadedFile;
/**
* Class ImportJobRepository.
* @codeCoverageIgnore
* @deprecated
*
*/
class ImportJobRepository implements ImportJobRepositoryInterface
{
/** @var \Illuminate\Contracts\Filesystem\Filesystem */
protected $uploadDisk;
/** @var int */
private $maxUploadSize;
/** @var User */
private $user;
public function __construct()
{
$this->maxUploadSize = (int)config('firefly.maxUploadSize');
$this->uploadDisk = Storage::disk('upload');
if ('testing' === config('app.env')) {
Log::warning(sprintf('%s should not be instantiated in the TEST environment!', get_class($this)));
}
}
/**
* Add message to job.
*
* @param ImportJob $job
* @param string $error
*
* @return ImportJob
*/
public function addErrorMessage(ImportJob $job, string $error): ImportJob
{
$errors = $job->errors;
$errors[] = $error;
$job->errors = $errors;
$job->save();
return $job;
}
/**
* Append transactions to array instead of replacing them.
*
* @param ImportJob $job
* @param array $transactions
*
* @return ImportJob
* @throws \Illuminate\Contracts\Filesystem\FileNotFoundException
*/
public function appendTransactions(ImportJob $job, array $transactions): ImportJob
{
Log::debug(sprintf('Now in appendTransactions(%s)', $job->key));
$existingTransactions = $this->getTransactions($job);
$new = array_merge($existingTransactions, $transactions);
Log::debug(sprintf('Old transaction count: %d', count($existingTransactions)));
Log::debug(sprintf('To be added transaction count: %d', count($transactions)));
Log::debug(sprintf('New count: %d', count($new)));
$this->setTransactions($job, $new);
return $job;
}
/**
* @param ImportJob $job
*
* @return int
*/
public function countTransactions(ImportJob $job): int
{
$info = $job->transactions ?? [];
if (isset($info['count'])) {
return (int)$info['count'];
}
return 0;
}
/**
* @param string $importProvider
*
* @return ImportJob
*
* @throws FireflyException
*/
public function create(string $importProvider): ImportJob
{
$count = 0;
$importProvider = strtolower($importProvider);
while ($count < 30) {
$key = Str::random(12);
$existing = $this->findByKey($key);
if (null === $existing) {
$importJob = ImportJob::create(
[
'user_id' => $this->user->id,
'tag_id' => null,
'provider' => $importProvider,
'file_type' => '',
'key' => Str::random(12),
'status' => 'new',
'stage' => 'new',
'configuration' => [],
'extended_status' => [],
'transactions' => [],
'errors' => [],
]
);
// breaks the loop:
return $importJob;
}
++$count;
}
throw new FireflyException('Could not create an import job with a unique key after 30 tries.');
}
/**
* @param int $jobId
*
* @return ImportJob|null
*/
public function find(int $jobId): ?ImportJob
{
return $this->user->importJobs()->find($jobId);
}
/**
* @param string $key
*
* @return ImportJob|null
*/
public function findByKey(string $key): ?ImportJob
{
/** @var ImportJob $result */
$result = $this->user->importJobs()->where('key', $key)->first(['import_jobs.*']);
if (null === $result) {
return null;
}
return $result;
}
/**
* Return all import jobs.
*
* @return Collection
*/
public function get(): Collection
{
return $this->user->importJobs()->get();
}
/**
* Return all attachments for job.
*
* @param ImportJob $job
*
* @return Collection
*/
public function getAttachments(ImportJob $job): Collection
{
return $job->attachments()->get();
}
/**
* Return configuration of job.
*
* @param ImportJob $job
*
* @return array
*/
public function getConfiguration(ImportJob $job): array
{
return $job->configuration;
}
/**
* Return extended status of job.
*
* @param ImportJob $job
*
* @return array
*/
public function getExtendedStatus(ImportJob $job): array
{
$status = $job->extended_status;
if (is_array($status)) {
return $status;
}
return [];
}
/**
* Return transactions from attachment.
*
* @param ImportJob $job
*
* @return array
* @throws \Illuminate\Contracts\Filesystem\FileNotFoundException
*/
public function getTransactions(ImportJob $job): array
{
// this will overwrite all transactions currently in the job.
$disk = Storage::disk('upload');
$filename = sprintf('%s-%s.json', $job->created_at->format('Ymd'), $job->key);
$array = [];
if ($disk->exists($filename)) {
$json = $disk->get($filename);
$array = json_decode($json, true);
}
if (false === $array) {
$array = [];
}
return $array;
}
/**
* @param ImportJob $job
* @param array $configuration
*
* @return ImportJob
*/
public function setConfiguration(ImportJob $job, array $configuration): ImportJob
{
Log::debug('Updating configuration...');
//Log::debug(sprintf('Incoming config for job "%s" is: ', $job->key), $configuration);
$currentConfig = $job->configuration;
$newConfig = array_merge($currentConfig, $configuration);
$job->configuration = $newConfig;
$job->save();
//Log::debug(sprintf('Set config of job "%s" to: ', $job->key), $newConfig);
return $job;
}
/**
* @param ImportJob $job
* @param string $stage
*
* @return ImportJob
*/
public function setStage(ImportJob $job, string $stage): ImportJob
{
$job->stage = $stage;
$job->save();
return $job;
}
/**
* @param ImportJob $job
* @param string $status
*
* @return ImportJob
*/
public function setStatus(ImportJob $job, string $status): ImportJob
{
Log::debug(sprintf('Set status of job "%s" to "%s"', $job->key, $status));
$job->status = $status;
$job->save();
return $job;
}
/**
* @param ImportJob $job
* @param Tag $tag
*
* @return ImportJob
*/
public function setTag(ImportJob $job, Tag $tag): ImportJob
{
$job->tag()->associate($tag);
$job->save();
return $job;
}
/**
* @param ImportJob $job
* @param array $transactions
*
* @return ImportJob
*/
public function setTransactions(ImportJob $job, array $transactions): ImportJob
{
// this will overwrite all transactions currently in the job.
$disk = Storage::disk('upload');
$filename = sprintf('%s-%s.json', $job->created_at->format('Ymd'), $job->key);
$json = json_encode($transactions);
// set count for easy access
$array = ['count' => count($transactions)];
$job->transactions = $array;
$job->save();
// store file.
$disk->put($filename, $json);
return $job;
}
/**
* @param User $user
*/
public function setUser(User $user): void
{
$this->user = $user;
}
/**
* Handle upload for job.
*
* @param ImportJob $job
* @param string $name
* @param string $fileName
*
* @return MessageBag
*/
public function storeCLIUpload(ImportJob $job, string $name, string $fileName): MessageBag
{
$messages = new MessageBag;
if (!file_exists($fileName)) {
$messages->add('notfound', sprintf('File not found: %s', $fileName));
return $messages;
}
$count = $job->attachments()->get()->filter(
function (Attachment $att) use ($name) {
return $att->filename === $name;
}
)->count();
if ($count > 0) {// don't upload, but also don't complain about it.
Log::error(sprintf('Detected duplicate upload. Will ignore second "%s" file.', $name));
return new MessageBag;
}
$content = file_get_contents($fileName);
$attachment = new Attachment; // create Attachment object.
$attachment->user()->associate($job->user);
$attachment->attachable()->associate($job);
$attachment->md5 = substr(hash('sha256', $content), 0, 32); // limit due to DB.
$attachment->filename = $name;
$attachment->mime = 'plain/txt';
$attachment->size = strlen($content);
$attachment->uploaded = false;
$attachment->save();
$this->uploadDisk->put($attachment->fileName(), $content);
$attachment->uploaded = true; // update attachment
$attachment->save();
return new MessageBag;
}
/**
* Handle upload for job.
*
* @param ImportJob $job
* @param string $name
* @param UploadedFile $file
*
* @return MessageBag
* @throws FireflyException
*/
public function storeFileUpload(ImportJob $job, string $name, UploadedFile $file): MessageBag
{
$messages = new MessageBag;
if ($this->validSize($file)) {
$name = e($file->getClientOriginalName());
$messages->add('size', (string)trans('validation.file_too_large', ['name' => $name]));
return $messages;
}
$count = $job->attachments()->get()->filter(
function (Attachment $att) use ($name) {
return $att->filename === $name;
}
)->count();
if ($count > 0) { // don't upload, but also don't complain about it.
Log::error(sprintf('Detected duplicate upload. Will ignore second "%s" file.', $name));
return new MessageBag;
}
$attachment = new Attachment; // create Attachment object.
$attachment->user()->associate($job->user);
$attachment->attachable()->associate($job);
$attachment->md5 = md5_file($file->getRealPath());
$attachment->filename = $name;
$attachment->mime = $file->getMimeType();
$attachment->size = $file->getSize();
$attachment->uploaded = false;
$attachment->save();
$fileObject = $file->openFile();
$fileObject->rewind();
if (0 === $file->getSize()) {
throw new FireflyException('Cannot upload empty or non-existent file.');
}
$content = $fileObject->fread($file->getSize());
$this->uploadDisk->put($attachment->fileName(), $content);
$attachment->uploaded = true; // update attachment
$attachment->save();
return new MessageBag;
}
/**
* @codeCoverageIgnore
*
* @param UploadedFile $file
*
* @return bool
*/
protected function validSize(UploadedFile $file): bool
{
$size = $file->getSize();
return $size > $this->maxUploadSize;
}
/**
* @param ImportJob $job
*
* @return int
*/
public function countByTag(ImportJob $job): int
{
return $job->tag->transactionJournals->count();
}
}

View File

@@ -1,207 +0,0 @@
<?php
/**
* ImportJobRepositoryInterface.php
* Copyright (c) 2019 james@firefly-iii.org
*
* This file is part of Firefly III (https://github.com/firefly-iii).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program 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 Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
namespace FireflyIII\Repositories\ImportJob;
use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Models\ImportJob;
use FireflyIII\Models\Tag;
use FireflyIII\User;
use Illuminate\Support\Collection;
use Illuminate\Support\MessageBag;
use Symfony\Component\HttpFoundation\File\UploadedFile;
/**
* Interface ImportJobRepositoryInterface.
* @codeCoverageIgnore
* @deprecated
*/
interface ImportJobRepositoryInterface
{
/**
* Add message to job.
*
* @param ImportJob $job
* @param string $error
*
* @return ImportJob
*/
public function addErrorMessage(ImportJob $job, string $error): ImportJob;
/**
* Append transactions to array instead of replacing them.
*
* @param ImportJob $job
* @param array $transactions
*
* @return ImportJob
*/
public function appendTransactions(ImportJob $job, array $transactions): ImportJob;
/**
* @param ImportJob $job
*
* @return int
*/
public function countTransactions(ImportJob $job): int;
/**
* @param ImportJob $job
*
* @return int
*/
public function countByTag(ImportJob $job): int;
/**
* @param string $importProvider
*
* @return ImportJob
*/
public function create(string $importProvider): ImportJob;
/**
* @param int $jobId
*
* @return ImportJob|null
*/
public function find(int $jobId): ?ImportJob;
/**
* @param string $key
*
* @return ImportJob|null
*/
public function findByKey(string $key): ?ImportJob;
/**
* Return all import jobs.
*
* @return Collection
*/
public function get(): Collection;
/**
* Return all attachments for job.
*
* @param ImportJob $job
*
* @return Collection
*/
public function getAttachments(ImportJob $job): Collection;
/**
* Return configuration of job.
*
* @param ImportJob $job
*
* @return array
*/
public function getConfiguration(ImportJob $job): array;
/**
* Return extended status of job.
*
* @param ImportJob $job
*
* @return array
*/
public function getExtendedStatus(ImportJob $job): array;
/**
* Return transactions from attachment.
*
* @param ImportJob $job
*
* @return array
*/
public function getTransactions(ImportJob $job): array;
/**
* @param ImportJob $job
* @param array $configuration
*
* @return ImportJob
*/
public function setConfiguration(ImportJob $job, array $configuration): ImportJob;
/**
* @param ImportJob $job
* @param string $stage
*
* @return ImportJob
*/
public function setStage(ImportJob $job, string $stage): ImportJob;
/**
* @param ImportJob $job
* @param string $status
*
* @return ImportJob
*/
public function setStatus(ImportJob $job, string $status): ImportJob;
/**
* @param ImportJob $job
* @param Tag $tag
*
* @return ImportJob
*/
public function setTag(ImportJob $job, Tag $tag): ImportJob;
/**
* @param ImportJob $job
* @param array $transactions
*
* @return ImportJob
*/
public function setTransactions(ImportJob $job, array $transactions): ImportJob;
/**
* @param User $user
*/
public function setUser(User $user);
/**
* Store file.
*
* @param ImportJob $job
* @param string $name
* @param string $fileName
*
* @return MessageBag
*/
public function storeCLIUpload(ImportJob $job, string $name, string $fileName): MessageBag;
/**
* Handle upload for job.
*
* @param ImportJob $job
* @param string $name
* @param UploadedFile $file
*
* @return MessageBag
* @throws FireflyException
*/
public function storeFileUpload(ImportJob $job, string $name, UploadedFile $file): MessageBag;
}

View File

@@ -98,32 +98,6 @@ class JournalRepository implements JournalRepositoryInterface
$service->destroy($journal); $service->destroy($journal);
} }
/**
* Find a journal by its hash.
*
* @param string $hash
*
* @return TransactionJournalMeta|null
*/
public function findByHash(string $hash): ?TransactionJournalMeta
{
$jsonEncode = json_encode($hash);
$hashOfHash = hash('sha256', $jsonEncode);
Log::debug(sprintf('JSON encoded hash is: %s', $jsonEncode));
Log::debug(sprintf('Hash of hash is: %s', $hashOfHash));
$result = TransactionJournalMeta::withTrashed()
->leftJoin('transaction_journals', 'transaction_journals.id', '=', 'journal_meta.transaction_journal_id')
->where('hash', $hashOfHash)
->where('name', 'import_hash_v2')
->first(['journal_meta.*']);
if (null === $result) {
Log::debug('Result is null');
}
return $result;
}
/** /**
* Find a specific journal. * Find a specific journal.
* *

View File

@@ -67,18 +67,6 @@ interface JournalRepositoryInterface
*/ */
public function destroyJournal(TransactionJournal $journal): void; public function destroyJournal(TransactionJournal $journal): void;
/**
* TODO move to import repository.
*
* Find a journal by its hash.
*
* @param string $hash
*
* @return TransactionJournalMeta|null
*/
public function findByHash(string $hash): ?TransactionJournalMeta;
/** /**
* TODO Refactor to "find". * TODO Refactor to "find".
* Find a specific journal. * Find a specific journal.

View File

@@ -112,26 +112,6 @@ class RuleRepository implements RuleRepositoryInterface
return $this->user->ruleGroups()->first(); return $this->user->ruleGroups()->first();
} }
/**
* Get the rules for a user tailored to the import process.
*
* @return Collection
*/
public function getForImport(): Collection
{
return Rule::distinct()
->where('rules.user_id', $this->user->id)
->leftJoin('rule_groups', 'rule_groups.id', '=', 'rules.rule_group_id')
->leftJoin('rule_triggers', 'rules.id', '=', 'rule_triggers.rule_id')
->where('rule_groups.active', 1)
->where('rule_triggers.trigger_type', 'user_action')
->where('rule_triggers.trigger_value', 'store-journal')
->where('rules.active', 1)
->orderBy('rule_groups.order', 'ASC')
->orderBy('rules.order', 'ASC')
->get(['rules.*', 'rule_groups.order']);
}
/** /**
* @param RuleGroup $ruleGroup * @param RuleGroup $ruleGroup
* *

View File

@@ -72,13 +72,6 @@ interface RuleRepositoryInterface
*/ */
public function getFirstRuleGroup(): RuleGroup; public function getFirstRuleGroup(): RuleGroup;
/**
* Get the rules for a user tailored to the import process.
*
* @return Collection
*/
public function getForImport(): Collection;
/** /**
* @param RuleGroup $ruleGroup * @param RuleGroup $ruleGroup
* *

View File

@@ -261,8 +261,6 @@ class UserRepository implements UserRepositoryInterface
->where('amount', '>', 0) ->where('amount', '>', 0)
->whereNull('budgets.deleted_at') ->whereNull('budgets.deleted_at')
->where('budgets.user_id', $user->id)->get(['budget_limits.budget_id'])->count(); ->where('budgets.user_id', $user->id)->get(['budget_limits.budget_id'])->count();
$return['import_jobs'] = $user->importJobs()->count();
$return['import_jobs_success'] = $user->importJobs()->where('status', 'finished')->count();
$return['rule_groups'] = $user->ruleGroups()->count(); $return['rule_groups'] = $user->ruleGroups()->count();
$return['rules'] = $user->rules()->count(); $return['rules'] = $user->rules()->count();
$return['tags'] = $user->tags()->count(); $return['tags'] = $user->tags()->count();

View File

@@ -28,7 +28,6 @@ use FireflyIII\Models\Account;
use FireflyIII\Models\Bill; use FireflyIII\Models\Bill;
use FireflyIII\Models\Budget; use FireflyIII\Models\Budget;
use FireflyIII\Models\Category; use FireflyIII\Models\Category;
use FireflyIII\Models\ImportJob;
use FireflyIII\Models\PiggyBank; use FireflyIII\Models\PiggyBank;
use FireflyIII\Models\Tag; use FireflyIII\Models\Tag;
use FireflyIII\Models\Transaction; use FireflyIII\Models\Transaction;
@@ -37,7 +36,6 @@ use FireflyIII\Repositories\Account\AccountRepositoryInterface;
use FireflyIII\Repositories\Bill\BillRepositoryInterface; use FireflyIII\Repositories\Bill\BillRepositoryInterface;
use FireflyIII\Repositories\Budget\BudgetRepositoryInterface; use FireflyIII\Repositories\Budget\BudgetRepositoryInterface;
use FireflyIII\Repositories\Category\CategoryRepositoryInterface; use FireflyIII\Repositories\Category\CategoryRepositoryInterface;
use FireflyIII\Repositories\ImportJob\ImportJobRepositoryInterface;
use FireflyIII\Repositories\Journal\JournalAPIRepositoryInterface; use FireflyIII\Repositories\Journal\JournalAPIRepositoryInterface;
use FireflyIII\Repositories\Journal\JournalRepositoryInterface; use FireflyIII\Repositories\Journal\JournalRepositoryInterface;
use FireflyIII\Repositories\PiggyBank\PiggyBankRepositoryInterface; use FireflyIII\Repositories\PiggyBank\PiggyBankRepositoryInterface;
@@ -94,7 +92,6 @@ class IsValidAttachmentModel implements Rule
Bill::class => 'validateBill', Bill::class => 'validateBill',
Budget::class => 'validateBudget', Budget::class => 'validateBudget',
Category::class => 'validateCategory', Category::class => 'validateCategory',
ImportJob::class => 'validateImportJob',
PiggyBank::class => 'validatePiggyBank', PiggyBank::class => 'validatePiggyBank',
Tag::class => 'validateTag', Tag::class => 'validateTag',
Transaction::class => 'validateTransaction', Transaction::class => 'validateTransaction',
@@ -207,20 +204,6 @@ class IsValidAttachmentModel implements Rule
return null !== $repository->findTransaction((int) $value); return null !== $repository->findTransaction((int) $value);
} }
/**
* @param int $value
*
* @return bool
*/
private function validateImportJob(int $value): bool
{
/** @var ImportJobRepositoryInterface $repository */
$repository = app(ImportJobRepositoryInterface::class);
$repository->setUser(auth()->user());
return null !== $repository->find($value);
}
/** /**
* @param int $value * @param int $value
* *

View File

@@ -1,96 +0,0 @@
<?php
/**
* ApiContext.php
* Copyright (c) 2019 james@firefly-iii.org
*
* This file is part of Firefly III (https://github.com/firefly-iii).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program 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 Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
namespace FireflyIII\Services\Bunq;
use bunq\Context\ApiContext as BunqApiContext;
use bunq\Context\BunqContext;
use bunq\Util\BunqEnumApiEnvironmentType;
use Exception;
use FireflyIII\Exceptions\FireflyException;
use Log;
use Tests\Object\FakeApiContext;
/**
* Special class to hide away bunq's static initialisation methods.
*
* Class ApiContext
*
* @codeCoverageIgnore
* @deprecated
*/
class ApiContext
{
/**
* @param BunqEnumApiEnvironmentType $environmentType
* @param string $apiKey
* @param string $description
* @param array $permittedIps
* @param string|null $proxyUrl
*
* @return BunqApiContext|FakeApiContext
*
*@throws FireflyException
*/
public function create(BunqEnumApiEnvironmentType $environmentType, string $apiKey, string $description, array $permittedIps, string $proxyUrl = null
) {
$permittedIps = $permittedIps ?? [];
try {
$context = BunqApiContext::create($environmentType, $apiKey, $description, $permittedIps, $proxyUrl);
} catch (Exception $e) {
$message = $e->getMessage();
Log::error($message);
Log::error($e->getTraceAsString());
if (stripos($message, 'Generating a new private key failed')) {
$message = 'Could not generate key-material. Please make sure OpenSSL is installed and configured: http://bit.ly/FF3-openSSL';
}
throw new FireflyException($message);
}
return $context;
}
/**
* @throws FireflyException
*
* @param string $jsonString
*/
public function fromJson(string $jsonString): void
{
try {
$apiContext = BunqApiContext::fromJson($jsonString);
BunqContext::loadApiContext($apiContext);
} catch (Exception $e) {
$message = $e->getMessage();
Log::error($message);
Log::error($e->getTraceAsString());
if (stripos($message, 'Generating a new private key failed')) {
$message = 'Could not generate key-material. Please make sure OpenSSL is installed and configured: http://bit.ly/FF3-openSSL';
}
throw new FireflyException($message);
}
}
}

View File

@@ -1,59 +0,0 @@
<?php
/**
* MonetaryAccount.php
* Copyright (c) 2019 james@firefly-iii.org
*
* This file is part of Firefly III (https://github.com/firefly-iii).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program 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 Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
namespace FireflyIII\Services\Bunq;
use bunq\Model\Generated\Endpoint\BunqResponseMonetaryAccountList;
use bunq\Model\Generated\Endpoint\MonetaryAccount as BunqMonetaryAccount;
use Exception;
use FireflyIII\Exceptions\FireflyException;
/**
* Class MonetaryAccount
* @codeCoverageIgnore
* @deprecated
*/
class MonetaryAccount
{
/**
* @param array $params
* @param array $customHeaders
*
* @return BunqResponseMonetaryAccountList
* @throws FireflyException
*/
public function listing(array $params = null, array $customHeaders = null): BunqResponseMonetaryAccountList
{
$params = $params ?? [];
$customHeaders = $customHeaders ?? [];
try {
$result = BunqMonetaryAccount::listing($params, $customHeaders);
} catch (Exception $e) {
throw new FireflyException($e->getMessage());
}
return $result;
}
}

View File

@@ -1,63 +0,0 @@
<?php
/**
* Payment.php
* Copyright (c) 2019 james@firefly-iii.org
*
* This file is part of Firefly III (https://github.com/firefly-iii).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program 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 Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
namespace FireflyIII\Services\Bunq;
use bunq\Model\Generated\Endpoint\BunqResponsePaymentList;
use bunq\Model\Generated\Endpoint\Payment as BunqPayment;
use Exception;
use FireflyIII\Exceptions\FireflyException;
/**
* Class Payment
* @codeCoverageIgnore
* @deprecated
*/
class Payment
{
/**
* @param int|null $monetaryAccountId
* @param array|null $params
* @param array|null $customHeaders
*
* @throws FireflyException
* @return BunqResponsePaymentList
*/
public function listing(int $monetaryAccountId = null, array $params = null, array $customHeaders = null): BunqResponsePaymentList
{
$monetaryAccountId = $monetaryAccountId ?? 0;
$params = $params ?? [];
$customHeaders = $customHeaders ?? [];
try {
$result = BunqPayment::listing($monetaryAccountId, $params, $customHeaders);
} catch (Exception $e) {
throw new FireflyException($e->getMessage());
}
return $result;
}
}

View File

@@ -1,31 +0,0 @@
<?php
/**
* GithubObject.php
* Copyright (c) 2019 james@firefly-iii.org
*
* This file is part of Firefly III (https://github.com/firefly-iii).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program 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 Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
namespace FireflyIII\Services\Github\Object;
/**
* @codeCoverageIgnore
* Class GithubObject
*/
class GithubObject
{
}

View File

@@ -1,94 +0,0 @@
<?php
/**
* Release.php
* Copyright (c) 2019 james@firefly-iii.org
*
* This file is part of Firefly III (https://github.com/firefly-iii).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program 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 Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
namespace FireflyIII\Services\Github\Object;
use Carbon\Carbon;
/**
*
* Class Release
*
* @SuppressWarnings(PHPMD.ShortVariable)
*
* @codeCoverageIgnore
*/
class Release extends GithubObject
{
/** @var string */
private $content;
/** @var string */
private $id;
/** @var string */
private $title;
/** @var Carbon */
private $updated;
/**
* Release constructor.
*
* @param array $data
*/
public function __construct(array $data)
{
$this->id = $data['id'];
$this->updated = new Carbon($data['updated']);
$this->title = $data['title'];
$this->content = $data['content'];
}
/**
* @return string
*/
public function getContent(): string
{
return $this->content;
}
/**
* @return string
*/
public function getId(): string
{
return $this->id;
}
/**
* @return string
*/
public function getTitle(): string
{
return $this->title;
}
/**
* @return Carbon
*/
public function getUpdated(): Carbon
{
return $this->updated;
}
}

View File

@@ -1,34 +0,0 @@
<?php
/**
* GithubRequest.php
* Copyright (c) 2019 james@firefly-iii.org
*
* This file is part of Firefly III (https://github.com/firefly-iii).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program 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 Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
namespace FireflyIII\Services\Github\Request;
/**
* Interface GithubRequest
* @deprecated
*/
interface GithubRequest
{
public function call(): void;
}

View File

@@ -1,96 +0,0 @@
<?php
/**
* UpdateRequest.php
* Copyright (c) 2019 james@firefly-iii.org
*
* This file is part of Firefly III (https://github.com/firefly-iii).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program 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 Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
namespace FireflyIII\Services\Github\Request;
use Exception;
use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Services\Github\Object\Release;
use GuzzleHttp\Client;
use GuzzleHttp\Exception\GuzzleException;
use Log;
use RuntimeException;
use SimpleXMLElement;
/**
* Class UpdateRequest
*
* @codeCoverageIgnore
* @deprecated
*/
class UpdateRequest implements GithubRequest
{
/** @var array */
private $releases = [];
/**
*
* @throws FireflyException
*/
public function call(): void
{
$uri = 'https://github.com/firefly-iii/firefly-iii/releases.atom';
Log::debug(sprintf('Going to call %s', $uri));
try {
$client = new Client();
$res = $client->request('GET', $uri);
} catch (GuzzleException|Exception $e) {
throw new FireflyException(sprintf('Response error from Github: %s', $e->getMessage()));
}
if (200 !== $res->getStatusCode()) {
throw new FireflyException(sprintf('Returned code %d.', $res->getStatusCode()));
}
try {
$releaseXml = new SimpleXMLElement($res->getBody()->getContents(), LIBXML_NOCDATA);
} catch (RuntimeException $e) {
Log::error(sprintf('Could not get body from github updat result: %s', $e->getMessage()));
throw new FireflyException(sprintf('Could not get body from github updat result: %s', $e->getMessage()));
}
//fetch the products for each category
if (isset($releaseXml->entry)) {
Log::debug(sprintf('Count of entries is: %d', count($releaseXml->entry)));
foreach ($releaseXml->entry as $entry) {
$array = [
'id' => (string)$entry->id,
'updated' => (string)$entry->updated,
'title' => (string)$entry->title,
'content' => (string)$entry->content,
];
Log::debug(sprintf('Found version %s', $entry->title));
$this->releases[] = new Release($array);
}
}
}
/**
* @return array
*/
public function getReleases(): array
{
return $this->releases;
}
}

View File

@@ -1,40 +0,0 @@
<?php
/**
* IPRetrievalInterface.php
* Copyright (c) 2019 james@firefly-iii.org
*
* This file is part of Firefly III (https://github.com/firefly-iii).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program 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 Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
namespace FireflyIII\Services\IP;
/**
* Interface IPRetrievalInterface
* @codeCoverageIgnore
* @deprecated
*/
interface IPRetrievalInterface
{
/**
* Returns the user's IP address.
*
* @return null|string
*/
public function getIP(): ?string;
}

View File

@@ -1,81 +0,0 @@
<?php
/**
* IpifyOrg.php
* Copyright (c) 2019 james@firefly-iii.org
*
* This file is part of Firefly III (https://github.com/firefly-iii).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program 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 Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
namespace FireflyIII\Services\IP;
use Exception;
use GuzzleHttp\Client;
use GuzzleHttp\Exception\GuzzleException;
use Log;
use RuntimeException;
/**
* Class IpifyOrg
*
* @codeCoverageIgnore
* @deprecated
*/
class IpifyOrg implements IPRetrievalInterface
{
/**
* Constructor.
*/
public function __construct()
{
if ('testing' === config('app.env')) {
Log::warning(sprintf('%s should not be instantiated in the TEST environment!', get_class($this)));
}
}
/**
* Returns the user's IP address.
*
* @noinspection MultipleReturnStatementsInspection
* @return null|string
*/
public function getIP(): ?string
{
try {
$client = new Client;
$res = $client->request('GET', 'https://api.ipify.org');
} catch (GuzzleException|Exception $e) {
Log::warning(sprintf('The ipify.org service could not retrieve external IP: %s', $e->getMessage()));
Log::warning($e->getTraceAsString());
return null;
}
if (200 !== $res->getStatusCode()) {
Log::warning(sprintf('Could not retrieve external IP: %d', $res->getStatusCode()));
return null;
}
try {
$body = (string)$res->getBody()->getContents();
} catch (RuntimeException $e) {
Log::error(sprintf('Could not get body from ipify.org result: %s', $e->getMessage()));
$body = null;
}
return $body;
}
}

View File

@@ -1,34 +0,0 @@
<?php
/**
* DuplicatedCustomerException.php
* Copyright (c) 2019 james@firefly-iii.org
*
* This file is part of Firefly III (https://github.com/firefly-iii).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program 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 Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
namespace FireflyIII\Services\Spectre\Exception;
/**
* @codeCoverageIgnore
* Class DuplicatedCustomerException
* @deprecated
*/
class DuplicatedCustomerException extends SpectreException
{
}

View File

@@ -1,36 +0,0 @@
<?php
/**
* SpectreException.php
* Copyright (c) 2019 james@firefly-iii.org
*
* This file is part of Firefly III (https://github.com/firefly-iii).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program 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 Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
namespace FireflyIII\Services\Spectre\Exception;
use Exception;
/**
* @codeCoverageIgnore
* Class SpectreException
* @deprecated
*/
class SpectreException extends Exception
{
}

View File

@@ -1,34 +0,0 @@
<?php
/**
* WrongRequestFormatException.php
* Copyright (c) 2019 james@firefly-iii.org
*
* This file is part of Firefly III (https://github.com/firefly-iii).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program 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 Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
namespace FireflyIII\Services\Spectre\Exception;
/**
* @codeCoverageIgnore
* Class WrongRequestFormatException
* @deprecated
*/
class WrongRequestFormatException extends SpectreException
{
}

View File

@@ -1,145 +0,0 @@
<?php
/**
* Account.php
* Copyright (c) 2019 james@firefly-iii.org
*
* This file is part of Firefly III (https://github.com/firefly-iii).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program 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 Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
namespace FireflyIII\Services\Spectre\Object;
use Carbon\Carbon;
/**
* Class Account
*
* @codeCoverageIgnore
* @SuppressWarnings(PHPMD.ShortVariable)
* @deprecated
*/
class Account extends SpectreObject
{
/** @var float */
private $balance;
/** @var Carbon */
private $createdAt;
/** @var string */
private $currencyCode;
/** @var array */
private $extra = [];
/** @var int */
private $id;
/** @var int */
private $loginId;
/** @var string */
private $name;
/** @var string */
private $nature;
/** @var Carbon */
private $updatedAt;
/**
* Account constructor.
*
* @param array $data
*/
public function __construct(array $data)
{
$this->id = (int)$data['id'];
$this->loginId = $data['login_id'];
$this->currencyCode = $data['currency_code'];
$this->balance = $data['balance'];
$this->name = $data['name'];
$this->nature = $data['nature'];
$this->createdAt = new Carbon($data['created_at']);
$this->updatedAt = new Carbon($data['updated_at']);
$extraArray = is_array($data['extra']) ? $data['extra'] : [];
foreach ($extraArray as $key => $value) {
$this->extra[$key] = $value;
}
}
/**
* @return float
*/
public function getBalance(): float
{
return $this->balance;
}
/**
* @return string
*/
public function getCurrencyCode(): string
{
return $this->currencyCode;
}
/**
* @return array
*/
public function getExtra(): array
{
return $this->extra;
}
/**
* @return int
*/
public function getId(): int
{
return $this->id;
}
/**
* @return string
*/
public function getName(): string
{
return $this->name;
}
/**
* @return string
*/
public function getNature(): string
{
return $this->nature;
}
/**
* @return array
*/
public function toArray(): array
{
$array = [
'balance' => $this->balance,
'created_at' => $this->createdAt->toIso8601String(),
'currency_code' => $this->currencyCode,
'extra' => $this->extra,
'id' => $this->id,
'login_id' => $this->loginId,
'name' => $this->name,
'nature' => $this->nature,
'updated_at' => $this->updatedAt->toIso8601String(),
];
return $array;
}
}

View File

@@ -1,214 +0,0 @@
<?php
/**
* Attempt.php
* Copyright (c) 2019 james@firefly-iii.org
*
* This file is part of Firefly III (https://github.com/firefly-iii).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program 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 Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
namespace FireflyIII\Services\Spectre\Object;
use Carbon\Carbon;
/**
*
* Class Attempt
*
* @codeCoverageIgnore
* @SuppressWarnings(PHPMD.ShortVariable)
* @SuppressWarnings(PHPMD.TooManyFields)
* @deprecated
*/
class Attempt extends SpectreObject
{
/** @var string */
private $apiMode;
/** @var int */
private $apiVersion;
/** @var bool */
private $automaticFetch;
/** @var bool */
private $categorize;
/** @var Carbon */
private $consentGivenAt;
/** @var array */
private $consentTypes;
/** @var Carbon */
private $createdAt;
/** @var array */
private $customFields;
/** @var bool */
private $dailyRefresh;
/** @var string */
private $deviceType;
/** @var array */
private $excludeAccounts;
/** @var Carbon */
private $failAt;
/** @var string */
private $failErrorClass;
/** @var string */
private $failMessage;
/** @var array */
private $fetchScopes;
/** @var bool */
private $finished;
/** @var bool */
private $finishedRecent;
/** @var Carbon */
private $fromDate;
/** @var int */
private $id;
/** @var bool */
private $interactive;
/** @var string */
private $locale;
/** @var bool */
private $partial;
/** @var string */
private $remoteIp;
/** @var bool */
private $showConsentInformation;
/** @var array */
private $stages;
/** @var bool */
private $storeCredentials;
/** @var Carbon */
private $successAt;
/** @var Carbon */
private $toDate;
/** @var Carbon */
private $updatedAt; // undocumented
/** @var string */
private $userAgent;
/**
* Attempt constructor.
*
* @param array $data
*/
public function __construct(array $data)
{
$this->apiMode = $data['api_mode'];
$this->apiVersion = $data['api_version'];
$this->automaticFetch = $data['automatic_fetch'];
$this->categorize = $data['categorize'];
$this->createdAt = new Carbon($data['created_at']);
$this->consentGivenAt = new Carbon($data['consent_given_at']);
$this->consentTypes = $data['consent_types'];
$this->customFields = $data['custom_fields'];
$this->dailyRefresh = $data['daily_refresh'];
$this->deviceType = $data['device_type'];
$this->userAgent = $data['user_agent'] ?? '';
$this->remoteIp = $data['remote_ip'];
$this->excludeAccounts = $data['exclude_accounts'];
$this->failAt = new Carbon($data['fail_at']);
$this->failErrorClass = $data['fail_error_class'];
$this->failMessage = $data['fail_message'];
$this->fetchScopes = $data['fetch_scopes'];
$this->finished = $data['finished'];
$this->finishedRecent = $data['finished_recent'];
$this->fromDate = new Carbon($data['from_date']);
$this->id = $data['id'];
$this->interactive = $data['interactive'];
$this->locale = $data['locale'];
$this->partial = $data['partial'];
$this->showConsentInformation = $data['show_consent_confirmation'];
$this->stages = $data['stages'] ?? [];
$this->storeCredentials = $data['store_credentials'];
$this->successAt = new Carbon($data['success_at']);
$this->toDate = new Carbon($data['to_date']);
$this->updatedAt = new Carbon($data['updated_at']);
}
/**
* @return Carbon
*/
public function getCreatedAt(): Carbon
{
return $this->createdAt;
}
/**
* @return Carbon
*/
public function getFailAt(): Carbon
{
return $this->failAt;
}
/**
* @return null|string
*/
public function getFailErrorClass(): ?string
{
return $this->failErrorClass;
}
/**
* @return null|string
*/
public function getFailMessage(): ?string
{
return $this->failMessage;
}
/**
* @return array
*/
public function toArray(): array
{
$array = [
'api_mode' => $this->apiMode,
'api_version' => $this->apiVersion,
'automatic_fetch' => $this->automaticFetch,
'categorize' => $this->categorize,
'created_at' => $this->createdAt->toIso8601String(),
'consent_given_at' => $this->consentGivenAt->toIso8601String(),
'consent_types' => $this->consentTypes,
'custom_fields' => $this->customFields,
'daily_refresh' => $this->dailyRefresh,
'device_type' => $this->deviceType,
'user_agent' => $this->userAgent,
'remote_ip' => $this->remoteIp,
'exclude_accounts' => $this->excludeAccounts,
'fail_at' => $this->failAt->toIso8601String(),
'fail_error_class' => $this->failErrorClass,
'fail_message' => $this->failMessage,
'fetch_scopes' => $this->fetchScopes,
'finished' => $this->finished,
'finished_recent' => $this->finishedRecent,
'from_date' => $this->fromDate->toIso8601String(),
'id' => $this->id,
'interactive' => $this->interactive,
'locale' => $this->locale,
'partial' => $this->partial,
'show_consent_confirmation' => $this->showConsentInformation,
'stages' => $this->stages,
'store_credentials' => $this->storeCredentials,
'success_at' => $this->successAt->toIso8601String(),
'to_date' => $this->toDate->toIso8601String(),
'updated_at' => $this->updatedAt->toIso8601String(),
];
return $array;
}
}

View File

@@ -1,112 +0,0 @@
<?php
/**
* Customer.php
* Copyright (c) 2019 james@firefly-iii.org
*
* This file is part of Firefly III (https://github.com/firefly-iii).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program 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 Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
namespace FireflyIII\Services\Spectre\Object;
/**
* Class Customer
*
* @codeCoverageIgnore
* @SuppressWarnings(PHPMD.ShortVariable)
* @deprecated
*/
class Customer extends SpectreObject
{
/** @var int */
private $id;
/** @var string */
private $identifier;
/** @var string */
private $secret;
/**
* Customer constructor.
*
* @param array $data
*/
public function __construct(array $data)
{
$this->id = (int)$data['id'];
$this->identifier = $data['identifier'];
$this->secret = $data['secret'];
}
/**
* @return int
*/
public function getId(): int
{
return $this->id;
}
/**
* @param int $id
*/
public function setId(int $id): void
{
$this->id = $id;
}
/**
* @return string
*/
public function getIdentifier(): string
{
return $this->identifier;
}
/**
* @param string $identifier
*/
public function setIdentifier(string $identifier): void
{
$this->identifier = $identifier;
}
/**
* @return string
*/
public function getSecret(): string
{
return $this->secret;
}
/**
* @param string $secret
*/
public function setSecret(string $secret): void
{
$this->secret = $secret;
}
/**
* @return array
*/
public function toArray(): array
{
return [
'id' => $this->id,
'identifier' => $this->identifier,
'secret' => $this->secret,
];
}
}

View File

@@ -1,52 +0,0 @@
<?php
/**
* Holder.php
* Copyright (c) 2019 james@firefly-iii.org
*
* This file is part of Firefly III (https://github.com/firefly-iii).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program 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 Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
namespace FireflyIII\Services\Spectre\Object;
/**
* Class Holder
*
* @codeCoverageIgnore
* @deprecated
*/
class Holder extends SpectreObject
{
/**
* Holder constructor.
*
* @param array $data
*
*/
public function __construct(array $data)
{
}
/**
* @return array
*/
public function toArray(): array
{
return [];
}
}

View File

@@ -1,191 +0,0 @@
<?php
/**
* Login.php
* Copyright (c) 2019 james@firefly-iii.org
*
* This file is part of Firefly III (https://github.com/firefly-iii).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program 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 Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
namespace FireflyIII\Services\Spectre\Object;
use Carbon\Carbon;
/**
* Class Login
*
* @codeCoverageIgnore
* @SuppressWarnings(PHPMD.ShortVariable)
* @SuppressWarnings(PHPMD.TooManyFields)
* @deprecated
*/
class Login extends SpectreObject
{
/** @var Carbon */
private $consentGivenAt;
/** @var array */
private $consentTypes;
/** @var string */
private $countryCode;
/** @var Carbon */
private $createdAt;
/** @var int */
private $customerId;
/** @var bool */
private $dailyRefresh;
/** @var Holder */
private $holderInfo;
/** @var int */
private $id;
/** @var Attempt */
private $lastAttempt;
/** @var Carbon */
private $lastSuccessAt;
/** @var Carbon */
private $nextRefreshPossibleAt;
/** @var string */
private $providerCode;
/** @var int */
private $providerId;
/** @var string */
private $providerName;
/** @var bool */
private $showConsentConfirmation;
/** @var string */
private $status;
/** @var bool */
private $storeCredentials;
/** @var Carbon */
private $updatedAt;
/**
* Login constructor.
*
* @param array $data
*/
public function __construct(array $data)
{
$this->consentGivenAt = new Carbon($data['consent_given_at']);
$this->consentTypes = $data['consent_types'];
$this->countryCode = $data['country_code'];
$this->createdAt = new Carbon($data['created_at']);
$this->updatedAt = new Carbon($data['updated_at']);
$this->customerId = $data['customer_id'];
$this->dailyRefresh = $data['daily_refresh'];
$this->holderInfo = new Holder($data['holder_info']);
$this->id = (int)$data['id'];
$this->lastAttempt = new Attempt($data['last_attempt']);
$this->lastSuccessAt = new Carbon($data['last_success_at']);
$this->nextRefreshPossibleAt = new Carbon($data['next_refresh_possible_at']);
$this->providerCode = $data['provider_code'];
$this->providerId = $data['provider_id'];
$this->providerName = $data['provider_name'];
$this->showConsentConfirmation = $data['show_consent_confirmation'];
$this->status = $data['status'];
$this->storeCredentials = $data['store_credentials'];
}
/**
* @return string
*/
public function getCountryCode(): string
{
return $this->countryCode;
}
/**
* @return int
*/
public function getId(): int
{
return $this->id;
}
/**
* @return Attempt
*/
public function getLastAttempt(): Attempt
{
return $this->lastAttempt;
}
/**
* @return Carbon
*/
public function getLastSuccessAt(): Carbon
{
return $this->lastSuccessAt;
}
/**
* @return string
*/
public function getProviderName(): string
{
return $this->providerName;
}
/**
* @return string
*/
public function getStatus(): string
{
return $this->status;
}
/**
* @return Carbon
*/
public function getUpdatedAt(): Carbon
{
return $this->updatedAt;
}
/**
* @return array
*/
public function toArray(): array
{
$array = [
'consent_given_at' => $this->consentGivenAt->toIso8601String(),
'consent_types' => $this->consentTypes,
'country_code' => $this->countryCode,
'created_at' => $this->createdAt->toIso8601String(),
'updated_at' => $this->updatedAt->toIso8601String(),
'customer_id' => $this->customerId,
'daily_refresh' => $this->dailyRefresh,
'holder_info' => $this->holderInfo->toArray(),
'id' => $this->id,
'last_attempt' => $this->lastAttempt->toArray(),
'last_success_at' => $this->lastSuccessAt->toIso8601String(),
'next_refresh_possible_at' => $this->nextRefreshPossibleAt->toIso8601String(),
'provider_code' => $this->providerCode,
'provider_id' => $this->providerId,
'provider_name' => $this->providerName,
'show_consent_confirmation' => $this->showConsentConfirmation,
'status' => $this->status,
'store_credentials' => $this->storeCredentials,
];
return $array;
}
}

View File

@@ -1,32 +0,0 @@
<?php
/**
* SpectreObject.php
* Copyright (c) 2019 james@firefly-iii.org
*
* This file is part of Firefly III (https://github.com/firefly-iii).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program 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 Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
namespace FireflyIII\Services\Spectre\Object;
/**
* @codeCoverageIgnore
* Class SpectreObject
* @deprecated
*/
class SpectreObject
{
}

View File

@@ -1,90 +0,0 @@
<?php
/**
* Token.php
* Copyright (c) 2019 james@firefly-iii.org
*
* This file is part of Firefly III (https://github.com/firefly-iii).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program 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 Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
namespace FireflyIII\Services\Spectre\Object;
use Carbon\Carbon;
/**
* @codeCoverageIgnore
* Class Token
* @deprecated
*/
class Token extends SpectreObject
{
/** @var string */
private $connectUrl;
/** @var Carbon */
private $expiresAt;
/** @var string */
private $token;
/**
* Token constructor.
*
* @param array $data
*/
public function __construct(array $data)
{
$this->token = $data['token'];
$this->expiresAt = new Carbon($data['expires_at']);
$this->connectUrl = $data['connect_url'];
}
/**
* @return string
*/
public function getConnectUrl(): string
{
return $this->connectUrl;
}
/**
* @return Carbon
*/
public function getExpiresAt(): Carbon
{
return $this->expiresAt;
}
/**
* @return string
*/
public function getToken(): string
{
return $this->token;
}
/**
*
*/
public function toArray(): array
{
return [
'connect_url' => $this->connectUrl,
'expires_at' => $this->expiresAt->toW3cString(),
'token' => $this->token,
];
}
}

View File

@@ -1,227 +0,0 @@
<?php
/**
* Transaction.php
* Copyright (c) 2019 james@firefly-iii.org
*
* This file is part of Firefly III (https://github.com/firefly-iii).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program 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 Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
namespace FireflyIII\Services\Spectre\Object;
use Carbon\Carbon;
/**
* Class Transaction
*
* @codeCoverageIgnore
* @deprecated
*
* @SuppressWarnings(PHPMD.ShortVariable)
*/
class Transaction extends SpectreObject
{
/** @var int */
private $accountId;
/** @var string */
private $amount;
/** @var string */
private $category;
/** @var Carbon */
private $createdAt;
/** @var string */
private $currencyCode;
/** @var string */
private $description;
/** @var bool */
private $duplicated;
/** @var TransactionExtra */
private $extra;
/** @var int */
private $id;
/** @var Carbon */
private $madeOn;
/** @var string */
private $mode;
/** @var string */
private $status;
/** @var Carbon */
private $updatedAt;
/**
* Transaction constructor.
*
* @param array $data
*/
public function __construct(array $data)
{
$this->id = (int)$data['id'];
$this->mode = $data['mode'];
$this->status = $data['status'];
$this->madeOn = new Carbon($data['made_on']);
$this->amount = $data['amount'];
$this->currencyCode = $data['currency_code'];
$this->description = $data['description'];
$this->category = $data['category'];
$this->duplicated = $data['duplicated'];
$this->extra = new TransactionExtra($data['extra'] ?? []);
$this->accountId = $data['account_id'];
$this->createdAt = new Carbon($data['created_at']);
$this->updatedAt = new Carbon($data['updated_at']);
}
/**
* @return string
*/
public function getAmount(): string
{
return (string)$this->amount;
}
/**
* @return string
*/
public function getCategory(): string
{
return $this->category;
}
/**
* @return string
*/
public function getCurrencyCode(): string
{
return $this->currencyCode;
}
/**
* @return string
*/
public function getDescription(): string
{
return $this->description;
}
/**
* @return TransactionExtra|null
*/
public function getExtra(): ?TransactionExtra
{
return $this->extra;
}
/**
* @return string
*/
public function getHash(): string
{
$array = [
'id' => $this->id,
'mode' => $this->mode,
'status' => $this->status,
'made_on' => $this->madeOn->toIso8601String(),
'amount' => $this->amount,
'currency_code' => $this->currencyCode,
'description' => $this->description,
'category' => $this->category,
'duplicated' => $this->duplicated,
'extra' => $this->extra->toArray(),
'account_id' => $this->accountId,
'created_at' => $this->createdAt->toIso8601String(),
'updated_at' => $this->updatedAt->toIso8601String(),
];
return hash('sha256', json_encode($array));
}
/**
* @return int
*/
public function getId(): int
{
return $this->id;
}
/**
* @return Carbon
*/
public function getMadeOn(): Carbon
{
return $this->madeOn;
}
/**
* @return string
*/
public function getMode(): string
{
return $this->mode;
}
/**
* Get opposing account data.
*
* @return array
*
*/
public function getOpposingAccountData(): array
{
$data = [
'name' => null,
'iban' => null,
'number' => null,
'bic' => null,
];
$extra = $this->getExtra();
if (null !== $extra) {
$arr = $extra->toArray();
foreach ($arr as $key => $value) {
switch ($key) {
case 'account_number':
$data['number'] = $value;
$data['name'] = $data['name'] ?? (string)trans('import.spectre_account_with_number', ['number' => $value]);
break;
case 'payee':
$data['name'] = $value;
break;
default:
break;
}
}
}
return $data;
}
/**
* @return string
*/
public function getStatus(): string
{
return $this->status;
}
/**
* @return bool
*/
public function isDuplicated(): bool
{
return $this->duplicated;
}
}

View File

@@ -1,174 +0,0 @@
<?php
/**
* TransactionExtra.php
* Copyright (c) 2019 james@firefly-iii.org
*
* This file is part of Firefly III (https://github.com/firefly-iii).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program 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 Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
namespace FireflyIII\Services\Spectre\Object;
use Carbon\Carbon;
/**
* Class TransactionExtra
*
* @SuppressWarnings(PHPMD.TooManyFields)
* @SuppressWarnings(PHPMD.ShortVariable)
* @codeCoverageIgnore
* @deprecated
*/
class TransactionExtra extends SpectreObject
{
/** @var string */
private $accountBalanceSnapshot;
/** @var string */
private $accountNumber;
/** @var string */
private $additional;
/** @var string */
private $assetAmount;
/** @var string */
private $assetCode;
/** @var string */
private $categorizationConfidence;
/** @var string */
private $checkNumber;
/** @var string */
private $customerCategoryCode;
/** @var string */
private $customerCategoryName;
/** @var string */
private $id;
/** @var string */
private $information;
/** @var string */
private $mcc;
/** @var string */
private $originalAmount;
/** @var string */
private $originalCategory;
/** @var string */
private $originalCurrencyCode;
/** @var string */
private $originalSubCategory;
/** @var string */
private $payee;
/** @var bool */
private $possibleDuplicate;
/** @var Carbon */
private $postingDate;
/** @var Carbon */
private $postingTime;
/** @var string */
private $recordNumber;
/** @var array */
private $tags;
/** @var Carbon */
private $time;
/** @var string */
private $type;
/** @var string */
private $unitPrice;
/** @var string */
private $units;
/**
* TransactionExtra constructor.
*
* @param array $data
*/
public function __construct(array $data)
{
$this->id = $data['id'] ?? null;
$this->recordNumber = $data['record_number'] ?? null;
$this->information = $data['information'] ?? null;
$this->time = isset($data['time']) ? new Carbon($data['time']) : null;
$this->postingDate = isset($data['posting_date']) ? new Carbon($data['posting_date']) : null;
$this->postingTime = isset($data['posting_time']) ? new Carbon($data['posting_time']) : null;
$this->accountNumber = $data['account_number'] ?? null;
$this->originalAmount = $data['original_amount'] ?? null;
$this->originalCurrencyCode = $data['original_currency_code'] ?? null;
$this->assetCode = $data['asset_code'] ?? null;
$this->assetAmount = $data['asset_amount'] ?? null;
$this->originalCategory = $data['original_category'] ?? null;
$this->originalSubCategory = $data['original_subcategory'] ?? null;
$this->customerCategoryCode = $data['customer_category_code'] ?? null;
$this->customerCategoryName = $data['customer_category_name'] ?? null;
$this->possibleDuplicate = $data['possible_duplicate'] ?? null;
$this->tags = $data['tags'] ?? null;
$this->mcc = $data['mcc'] ?? null;
$this->payee = $data['payee'] ?? null;
$this->type = $data['type'] ?? null;
$this->checkNumber = $data['check_number'] ?? null;
$this->units = $data['units'] ?? null;
$this->additional = $data['additional'] ?? null;
$this->unitPrice = $data['unit_price'] ?? null;
$this->accountBalanceSnapshot = $data['account_balance_snapshot'] ?? null;
$this->categorizationConfidence = $data['categorization_confidence'] ?? null;
}
/**
* @return string|null
*/
public function getId(): ?string
{
return $this->id;
}
/**
* @return array
*/
public function toArray(): array
{
$array = [
'id' => $this->id,
'record_number' => $this->recordNumber,
'information' => $this->information,
'time' => null === $this->time ? null : $this->time->toIso8601String(),
'posting_date' => null === $this->postingDate ? null : $this->postingDate->toIso8601String(),
'posting_time' => null === $this->postingTime ? null : $this->postingTime->toIso8601String(),
'account_number' => $this->accountNumber,
'original_amount' => $this->originalAmount,
'original_currency_code' => $this->originalCurrencyCode,
'asset_code' => $this->assetCode,
'asset_amount' => $this->assetAmount,
'original_category' => $this->originalCategory,
'original_subcategory' => $this->originalSubCategory,
'customer_category_code' => $this->customerCategoryCode,
'customer_category_name' => $this->customerCategoryName,
'possible_duplicate' => $this->possibleDuplicate,
'tags' => $this->tags,
'mcc' => $this->mcc,
'payee' => $this->payee,
'type' => $this->type,
'check_number' => $this->checkNumber,
'units' => $this->units,
'additional' => $this->additional,
'unit_price' => $this->unitPrice,
'account_balance_snapshot' => $this->accountBalanceSnapshot,
'categorization_confidence' => $this->categorizationConfidence,
];
return $array;
}
}

View File

@@ -1,95 +0,0 @@
<?php
/**
* CreateTokenRequest.php
* Copyright (c) 2019 james@firefly-iii.org
*
* This file is part of Firefly III (https://github.com/firefly-iii).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program 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 Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
namespace FireflyIII\Services\Spectre\Request;
use FireflyIII\Services\Spectre\Object\Customer;
use FireflyIII\Services\Spectre\Object\Token;
/**
* Class CreateTokenRequest
*
* @codeCoverageIgnore
* @deprecated
*/
class CreateTokenRequest extends SpectreRequest
{
/** @var Customer */
private $customer;
/** @var Token */
private $token;
/** @var string */
private $uri;
/**
*
* @throws \FireflyIII\Exceptions\FireflyException
*/
public function call(): void
{
// add mandatory fields to login object
$data = [
'data' => [
'customer_id' => $this->customer->getId(),
'fetch_scopes' => ['accounts', 'transactions'],
'daily_refresh' => true,
'include_fake_providers' => true,
'show_consent_confirmation' => true,
'credentials_strategy' => 'ask',
'return_to' => $this->uri,
],
];
$uri = '/api/v4/tokens/create';
$response = $this->sendSignedSpectrePost($uri, $data);
$this->token = new Token($response['data']);
}
/**
* @return Token
*/
public function getToken(): Token
{
return $this->token;
}
/**
* @param Customer $customer
*/
public function setCustomer(Customer $customer): void
{
$this->customer = $customer;
}
/**
* @param string $uri
*/
public function setUri(string $uri): void
{
$this->uri = $uri;
}
}

View File

@@ -1,93 +0,0 @@
<?php
/**
* ListAccountsRequest.php
* Copyright (c) 2019 james@firefly-iii.org
*
* This file is part of Firefly III (https://github.com/firefly-iii).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program 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 Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
namespace FireflyIII\Services\Spectre\Request;
use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Services\Spectre\Object\Account;
use FireflyIII\Services\Spectre\Object\Login;
use Log;
/**
* Class ListAccountsRequest
*
* @codeCoverageIgnore
* @deprecated
*/
class ListAccountsRequest extends SpectreRequest
{
/** @var array */
private $accounts = [];
/** @var Login */
private $login;
/**
* @throws FireflyException
*
*/
public function call(): void
{
$hasNextPage = true;
$nextId = 0;
while ($hasNextPage) {
Log::debug(sprintf('Now calling ListAccountsRequest for next_id %d', $nextId));
$parameters = ['from_id' => $nextId, 'login_id' => $this->login->getId()];
$uri = '/api/v4/accounts?' . http_build_query($parameters);
$response = $this->sendSignedSpectreGet($uri, []);
// count entries:
Log::debug(sprintf('Found %d entries in data-array', count($response['data'])));
// extract next ID
$hasNextPage = false;
if (isset($response['meta']['next_id']) && (int)$response['meta']['next_id'] > $nextId) {
$hasNextPage = true;
$nextId = $response['meta']['next_id'];
Log::debug(sprintf('Next ID is now %d.', $nextId));
}
// store customers:
foreach ($response['data'] as $accountArray) {
$this->accounts[] = new Account($accountArray);
}
}
}
/**
* @return array
*/
public function getAccounts(): array
{
return $this->accounts;
}
/**
* @param Login $login
*/
public function setLogin(Login $login): void
{
$this->login = $login;
}
}

View File

@@ -1,83 +0,0 @@
<?php
/**
* ListCustomersRequest.php
* Copyright (c) 2019 james@firefly-iii.org
*
* This file is part of Firefly III (https://github.com/firefly-iii).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program 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 Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
namespace FireflyIII\Services\Spectre\Request;
use FireflyIII\Services\Spectre\Object\Customer;
use Log;
/**
* Class ListCustomersRequest
*
* @codeCoverageIgnore
* @deprecated
*/
class ListCustomersRequest extends SpectreRequest
{
/** @var array */
private $customers = [];
/**
*
* @throws \FireflyIII\Exceptions\FireflyException
*
*/
public function call(): void
{
$hasNextPage = true;
$nextId = 0;
while ($hasNextPage) {
Log::debug(sprintf('Now calling ListCustomersRequest for next_id %d', $nextId));
$parameters = ['from_id' => $nextId];
$uri = '/api/v4/customers/?' . http_build_query($parameters);
$response = $this->sendSignedSpectreGet($uri, []);
// count entries:
Log::debug(sprintf('Found %d entries in data-array', count($response['data'])));
// extract next ID
$hasNextPage = false;
if (isset($response['meta']['next_id']) && (int)$response['meta']['next_id'] > $nextId) {
$hasNextPage = true;
$nextId = $response['meta']['next_id'];
Log::debug(sprintf('Next ID is now %d.', $nextId));
}
// store customers:
foreach ($response['data'] as $customerArray) {
$this->customers[] = new Customer($customerArray);
}
}
}
/**
* @return array
*/
public function getCustomers(): array
{
return $this->customers;
}
}

View File

@@ -1,103 +0,0 @@
<?php
/**
* ListLoginsRequest.php
* Copyright (c) 2019 james@firefly-iii.org
*
* This file is part of Firefly III (https://github.com/firefly-iii).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program 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 Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
namespace FireflyIII\Services\Spectre\Request;
use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Services\Spectre\Object\Customer;
use FireflyIII\Services\Spectre\Object\Login;
use Illuminate\Support\Collection;
use Log;
/**
* Class ListLoginsRequest
*
* @codeCoverageIgnore
* @deprecated
*/
class ListLoginsRequest extends SpectreRequest
{
/** @var Customer */
private $customer;
/** @var array */
private $logins = [];
/**
* @throws FireflyException
*
*/
public function call(): void
{
$hasNextPage = true;
$nextId = 0;
while ($hasNextPage) {
Log::debug(sprintf('Now calling ListLoginsRequest for next_id %d', $nextId));
$parameters = ['from_id' => $nextId, 'customer_id' => $this->customer->getId()];
$uri = '/api/v4/logins/?' . http_build_query($parameters);
$response = $this->sendSignedSpectreGet($uri, []);
// count entries:
Log::debug(sprintf('Found %d entries in data-array', count($response['data'])));
// extract next ID
$hasNextPage = false;
if (isset($response['meta']['next_id']) && (int)$response['meta']['next_id'] > $nextId) {
$hasNextPage = true;
$nextId = $response['meta']['next_id'];
Log::debug(sprintf('Next ID is now %d.', $nextId));
}
$collection = new Collection;
// store logins:
/** @var array $loginArray */
foreach ($response['data'] as $loginArray) {
$collection->push(new Login($loginArray));
}
// sort logins by date created:
$sorted = $collection->sortByDesc(
static function (Login $login) {
return $login->getUpdatedAt()->timestamp;
}
);
$this->logins = $sorted->toArray();
}
}
/**
* @return array
*/
public function getLogins(): array
{
return $this->logins;
}
/**
* @param Customer $customer
*/
public function setCustomer(Customer $customer): void
{
$this->customer = $customer;
}
}

View File

@@ -1,94 +0,0 @@
<?php
/**
* ListTransactionsRequest.php
* Copyright (c) 2019 james@firefly-iii.org
*
* This file is part of Firefly III (https://github.com/firefly-iii).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program 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 Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
namespace FireflyIII\Services\Spectre\Request;
use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Services\Spectre\Object\Account;
use FireflyIII\Services\Spectre\Object\Transaction;
use Log;
/**
* Class ListTransactionsRequest
*
* @codeCoverageIgnore
* @deprecated
*/
class ListTransactionsRequest extends SpectreRequest
{
/** @var Account */
private $account;
/** @var array */
private $transactions = [];
/**
* @throws FireflyException
*
*/
public function call(): void
{
$hasNextPage = true;
$nextId = 0;
while ($hasNextPage) {
Log::debug(sprintf('Now calling ListTransactionsRequest for next_id %d', $nextId));
$parameters = ['from_id' => $nextId, 'account_id' => $this->account->getId()];
$uri = '/api/v4/transactions?' . http_build_query($parameters);
$response = $this->sendSignedSpectreGet($uri, []);
// count entries:
Log::debug(sprintf('Found %d entries in data-array', count($response['data'])));
// extract next ID
$hasNextPage = false;
if (isset($response['meta']['next_id']) && (int)$response['meta']['next_id'] > $nextId) {
$hasNextPage = true;
$nextId = $response['meta']['next_id'];
Log::debug(sprintf('Next ID is now %d.', $nextId));
}
// store customers:
foreach ($response['data'] as $transactionArray) {
$this->transactions[] = new Transaction($transactionArray);
}
}
}
/**
* @return array
*/
public function getTransactions(): array
{
return $this->transactions;
}
/**
* @param Account $account
*/
public function setAccount(Account $account): void
{
$this->account = $account;
}
}

View File

@@ -1,63 +0,0 @@
<?php
/**
* NewCustomerRequest.php
* Copyright (c) 2019 james@firefly-iii.org
*
* This file is part of Firefly III (https://github.com/firefly-iii).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program 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 Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
namespace FireflyIII\Services\Spectre\Request;
use FireflyIII\Services\Spectre\Object\Customer;
use Log;
/**
* Class NewCustomerRequest
*
* @codeCoverageIgnore
* @deprecated
*/
class NewCustomerRequest extends SpectreRequest
{
/** @var Customer */
protected $customer;
/**
* @throws \FireflyIII\Exceptions\FireflyException
*/
public function call(): void
{
$data = [
'data' => [
'identifier' => 'default_ff3_customer',
],
];
$uri = '/api/v4/customers/';
Log::debug(sprintf('Going to call %s with info:', $uri), $data);
$response = $this->sendSignedSpectrePost($uri, $data);
// create customer:
$this->customer = new Customer($response['data']);
}
/**
* @return Customer
*/
public function getCustomer(): Customer
{
return $this->customer;
}
}

View File

@@ -1,308 +0,0 @@
<?php
/**
* SpectreRequest.php
* Copyright (c) 2019 james@firefly-iii.org
*
* This file is part of Firefly III (https://github.com/firefly-iii).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program 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 Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
namespace FireflyIII\Services\Spectre\Request;
use Exception;
use FireflyIII\Exceptions\FireflyException;
use FireflyIII\User;
use GuzzleHttp\Client;
use GuzzleHttp\Exception\GuzzleException;
use Log;
use RuntimeException;
/**
* Class SpectreRequest
*
* @codeCoverageIgnore
* @deprecated
*/
abstract class SpectreRequest
{
/** @var int */
protected $expiresAt = 0;
/** @var string */
private $appId;
/** @var string */
private $privateKey;
/** @var string */
private $secret;
/** @var string */
private $server;
/** @var User */
private $user;
/**
*
*/
abstract public function call(): void;
/**
* @codeCoverageIgnore
* @return string
*/
public function getAppId(): string
{
return $this->appId;
}
/**
* @codeCoverageIgnore
*
* @param string $appId
*/
public function setAppId(string $appId): void
{
$this->appId = $appId;
}
/**
* @codeCoverageIgnore
* @return string
*/
public function getSecret(): string
{
return $this->secret;
}
/**
* @codeCoverageIgnore
*
* @param string $secret
*/
public function setSecret(string $secret): void
{
$this->secret = $secret;
}
/**
* @codeCoverageIgnore
* @return string
*/
public function getServer(): string
{
return $this->server;
}
/**
* @codeCoverageIgnore
*
* @param string $privateKey
*/
public function setPrivateKey(string $privateKey): void
{
$this->privateKey = $privateKey;
}
/**
* @param User $user
*/
public function setUser(User $user): void
{
$this->user = $user;
$this->server = 'https://' . config('import.options.spectre.server');
$this->expiresAt = time() + 180;
$privateKey = app('preferences')->getForUser($user, 'spectre_private_key', null);
$this->privateKey = $privateKey->data;
// set client ID
$appId = app('preferences')->getForUser($user, 'spectre_app_id', null);
if (null !== $appId && '' !== (string)$appId->data) {
$this->appId = $appId->data;
}
// set service secret
$secret = app('preferences')->getForUser($user, 'spectre_secret', null);
if (null !== $secret && '' !== (string)$secret->data) {
$this->secret = $secret->data;
}
}
/**
* @param string $method
* @param string $uri
* @param string $data
*
* @return string
*
* @throws FireflyException
*/
protected function generateSignature(string $method, string $uri, string $data): string
{
if ('' === $this->privateKey) {
throw new FireflyException('No private key present.');
}
$method = strtolower($method);
if ('get' === $method || 'delete' === $method) {
$data = '';
}
$toSign = $this->expiresAt . '|' . strtoupper($method) . '|' . $uri . '|' . $data . ''; // no file so no content there.
Log::debug(sprintf('String to sign: "%s"', $toSign));
$signature = '';
// Sign the data
openssl_sign($toSign, $signature, $this->privateKey, OPENSSL_ALGO_SHA256);
$signature = base64_encode($signature);
return $signature;
}
/**
* @return array
*/
protected function getDefaultHeaders(): array
{
$userAgent = sprintf('FireflyIII v%s', config('firefly.version'));
return [
'App-id' => $this->getAppId(),
'Secret' => $this->getSecret(),
'Accept' => 'application/json',
'Content-type' => 'application/json',
'Cache-Control' => 'no-cache',
'User-Agent' => $userAgent,
'Expires-at' => $this->expiresAt,
];
}
/**
* @param string $uri
* @param array $data
*
* @return array
*
* @throws FireflyException
*/
protected function sendSignedSpectreGet(string $uri, array $data): array
{
if ('' === $this->server) {
throw new FireflyException('No Spectre server defined');
}
$headers = $this->getDefaultHeaders();
$sendBody = json_encode($data); // OK
$fullUri = $this->server . $uri;
$signature = $this->generateSignature('get', $fullUri, $sendBody);
$headers['Signature'] = $signature;
Log::debug('Final headers for spectre signed get request:', $headers);
try {
$client = new Client;
$res = $client->request('GET', $fullUri, ['headers' => $headers]);
} catch (GuzzleException|Exception $e) {
throw new FireflyException(sprintf('Guzzle Exception: %s', $e->getMessage()));
}
$statusCode = $res->getStatusCode();
try {
$returnBody = $res->getBody()->getContents();
} catch (RuntimeException $e) {
Log::error(sprintf('Could not get body from SpectreRequest::GET result: %s', $e->getMessage()));
$returnBody = '';
}
$this->detectError($returnBody, $statusCode);
$array = json_decode($returnBody, true);
$responseHeaders = $res->getHeaders();
$array['ResponseHeaders'] = $responseHeaders;
$array['ResponseStatusCode'] = $statusCode;
if (isset($array['error_class'])) {
$message = $array['error_message'] ?? '(no message)';
throw new FireflyException(sprintf('Error of class %s: %s', $array['error_class'], $message));
}
return $array;
}
/**
* @param string $uri
* @param array $data
*
* @return array
*
* @throws FireflyException
*/
protected function sendSignedSpectrePost(string $uri, array $data): array
{
if ('' === $this->server) {
throw new FireflyException('No Spectre server defined');
}
$headers = $this->getDefaultHeaders();
$body = json_encode($data);
$fullUri = $this->server . $uri;
$signature = $this->generateSignature('post', $fullUri, $body);
$headers['Signature'] = $signature;
Log::debug('Final headers for spectre signed POST request:', $headers);
try {
$client = new Client;
$res = $client->request('POST', $fullUri, ['headers' => $headers, 'body' => $body]);
} catch (GuzzleException|Exception $e) {
throw new FireflyException(sprintf('Guzzle Exception: %s', $e->getMessage()));
}
try {
$body = $res->getBody()->getContents();
} catch (RuntimeException $e) {
Log::error(sprintf('Could not get body from SpectreRequest::POST result: %s', $e->getMessage()));
$body = '';
}
$statusCode = $res->getStatusCode();
$this->detectError($body, $statusCode);
$array = json_decode($body, true);
$responseHeaders = $res->getHeaders();
$array['ResponseHeaders'] = $responseHeaders;
$array['ResponseStatusCode'] = $statusCode;
return $array;
}
/**
* @param string $body
*
* @param int $statusCode
*
* @throws FireflyException
*/
private function detectError(string $body, int $statusCode): void
{
$array = json_decode($body, true);
if (isset($array['error_class'])) {
$message = $array['error_message'] ?? '(no message)';
$errorClass = $array['error_class'];
$class = sprintf('\\FireflyIII\\Services\\Spectre\Exception\\%sException', $errorClass);
if (class_exists($class)) {
throw new $class($message);
}
throw new FireflyException(sprintf('Error of class %s: %s', $errorClass, $message));
}
if (200 !== $statusCode) {
throw new FireflyException(sprintf('Status code %d: %s', $statusCode, $body));
}
}
}

Some files were not shown because too many files have changed in this diff Show More