diff --git a/app/Http/Controllers/Import/FileController.php b/app/Http/Controllers/Import/FileController.php
index 5e13cc9ed3..d6ad685aa2 100644
--- a/app/Http/Controllers/Import/FileController.php
+++ b/app/Http/Controllers/Import/FileController.php
@@ -175,50 +175,7 @@ class FileController extends Controller
return redirect(route('import.file.configure', [$job->key]));
}
- /**
- * Show status of import job in JSON.
- *
- * @param ImportJob $job
- *
- * @return \Illuminate\Http\JsonResponse
- */
- public function json(ImportJob $job)
- {
- $result = [
- 'started' => false,
- 'finished' => false,
- 'running' => false,
- 'errors' => array_values($job->extended_status['errors']),
- 'percentage' => 0,
- 'show_percentage' => false,
- 'steps' => $job->extended_status['steps'],
- 'done' => $job->extended_status['done'],
- 'statusText' => trans('firefly.import_status_job_' . $job->status),
- 'status' => $job->status,
- 'finishedText' => '',
- ];
- if (0 !== $job->extended_status['steps']) {
- $result['percentage'] = round(($job->extended_status['done'] / $job->extended_status['steps']) * 100, 0);
- $result['show_percentage'] = true;
- }
-
- if ('finished' === $job->status) {
- $tagId = $job->extended_status['tag'];
- /** @var TagRepositoryInterface $repository */
- $repository = app(TagRepositoryInterface::class);
- $tag = $repository->find($tagId);
- $result['finished'] = true;
- $result['finishedText'] = trans('firefly.import_status_finished_job', ['link' => route('tags.show', [$tag->id, 'all']), 'tag' => $tag->tag]);
- }
-
- if ('running' === $job->status) {
- $result['started'] = true;
- $result['running'] = true;
- }
-
- return Response::json($result);
- }
/**
* Step 4. Save the configuration.
@@ -269,24 +226,7 @@ class FileController extends Controller
return Response::json(['run' => 'ok']);
}
- throw new FireflyException('Job did not complete succesfully.');
- }
-
- /**
- * @param ImportJob $job
- *
- * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector|View
- */
- public function status(ImportJob $job)
- {
- $statuses = ['configured', 'running', 'finished'];
- if (!in_array($job->status, $statuses)) {
- return redirect(route('import.file.configure', [$job->key]));
- }
- $subTitle = trans('firefly.import_status_sub_title');
- $subTitleIcon = 'fa-star';
-
- return view('import.status', compact('job', 'subTitle', 'subTitleIcon'));
+ throw new FireflyException('Job did not complete successfully.');
}
/**
diff --git a/app/Http/Controllers/Import/IndexController.php b/app/Http/Controllers/Import/IndexController.php
index 866f0b1557..b644e561e3 100644
--- a/app/Http/Controllers/Import/IndexController.php
+++ b/app/Http/Controllers/Import/IndexController.php
@@ -6,7 +6,12 @@ namespace FireflyIII\Http\Controllers\Import;
use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Http\Controllers\Controller;
+use FireflyIII\Import\Routine\ImportRoutine;
+use FireflyIII\Models\ImportJob;
use FireflyIII\Repositories\ImportJob\ImportJobRepositoryInterface;
+use Illuminate\Http\Response as LaravelResponse;
+use Log;
+use Response;
use View;
/**
@@ -56,6 +61,42 @@ class IndexController extends Controller
}
+ /**
+ * 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)
+ {
+ Log::debug('Now in download()', ['job' => $job->key]);
+ $config = $job->configuration;
+
+ // This is CSV import specific:
+ $config['column-roles-complete'] = false;
+ $config['column-mapping-complete'] = false;
+ $config['initial-config-complete'] = false;
+ $config['has-file-upload'] = false;
+ $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, 200);
+ $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.
*
@@ -70,4 +111,34 @@ class IndexController extends Controller
return view('import.index', compact('subTitle', 'subTitleIcon', 'routines'));
}
+ /**
+ * @param ImportJob $job
+ *
+ * @return \Illuminate\Http\JsonResponse
+ * @throws FireflyException
+ */
+ public function start(ImportJob $job)
+ {
+
+ $type = $job->file_type;
+ $key = sprintf('import.routine.%s', $type);
+ $className = config($key);
+ if (null === $className || !class_exists($className)) {
+ throw new FireflyException(sprintf('Cannot find import routine class for job of type "%s".', $type)); // @codeCoverageIgnore
+ }
+ var_dump($className);
+ exit;
+
+ /** @var ImportRoutine $routine */
+ $routine = app(ImportRoutine::class);
+ $routine->setJob($job);
+ $result = $routine->run();
+
+ if ($result) {
+ return Response::json(['run' => 'ok']);
+ }
+
+ throw new FireflyException('Job did not complete successfully. Please review the log files.');
+ }
+
}
\ No newline at end of file
diff --git a/app/Http/Controllers/Import/StatusController.php b/app/Http/Controllers/Import/StatusController.php
index f4f11d9fda..d04d4edb00 100644
--- a/app/Http/Controllers/Import/StatusController.php
+++ b/app/Http/Controllers/Import/StatusController.php
@@ -5,6 +5,9 @@ namespace FireflyIII\Http\Controllers\Import;
use FireflyIII\Http\Controllers\Controller;
+use FireflyIII\Models\ImportJob;
+use FireflyIII\Repositories\Tag\TagRepositoryInterface;
+use Response;
/**
* Class StatusController
@@ -12,4 +15,83 @@ use FireflyIII\Http\Controllers\Controller;
class StatusController extends Controller
{
+ /**
+ *
+ */
+ public function __construct()
+ {
+ parent::__construct();
+
+ $this->middleware(
+ function ($request, $next) {
+ app('view')->share('mainTitleIcon', 'fa-archive');
+ app('view')->share('title', trans('firefly.import_index_title'));
+
+ return $next($request);
+ }
+ );
+ }
+ /**
+ * @param ImportJob $job
+ *
+ * @return \Illuminate\Contracts\View\Factory|\Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector|\Illuminate\View\View
+ */
+ public function index(ImportJob $job)
+ {
+ $statuses = ['configured', 'running', 'finished', 'errored'];
+ if (!in_array($job->status, $statuses)) {
+ return redirect(route('import.file.configure', [$job->key]));
+ }
+ $subTitle = trans('firefly.import_status_sub_title');
+ $subTitleIcon = 'fa-star';
+
+ return view('import.status', compact('job', 'subTitle', 'subTitleIcon'));
+ }
+
+ /**
+ * Show status of import job in JSON.
+ *
+ * @param ImportJob $job
+ *
+ * @return \Illuminate\Http\JsonResponse
+ */
+ public function json(ImportJob $job)
+ {
+ $result = [
+ 'started' => false,
+ 'finished' => false,
+ 'running' => false,
+ 'errors' => array_values($job->extended_status['errors']),
+ 'percentage' => 0,
+ 'show_percentage' => false,
+ 'steps' => $job->extended_status['steps'],
+ 'done' => $job->extended_status['done'],
+ 'statusText' => trans('firefly.import_status_job_' . $job->status),
+ 'status' => $job->status,
+ 'finishedText' => '',
+ ];
+
+ if (0 !== $job->extended_status['steps']) {
+ $result['percentage'] = round(($job->extended_status['done'] / $job->extended_status['steps']) * 100, 0);
+ $result['show_percentage'] = true;
+ }
+
+ if ('finished' === $job->status) {
+ $tagId = $job->extended_status['tag'];
+ /** @var TagRepositoryInterface $repository */
+ $repository = app(TagRepositoryInterface::class);
+ $tag = $repository->find($tagId);
+ $result['finished'] = true;
+ $result['finishedText'] = trans('firefly.import_status_finished_job', ['link' => route('tags.show', [$tag->id, 'all']), 'tag' => $tag->tag]);
+ }
+
+ if ('running' === $job->status) {
+ $result['started'] = true;
+ $result['running'] = true;
+ }
+ // TODO cannot handle 'errored'
+
+ return Response::json($result);
+ }
+
}
\ No newline at end of file
diff --git a/app/Import/Routine/FileRoutine.php b/app/Import/Routine/FileRoutine.php
index 74dc52150c..eb5ea1cd9c 100644
--- a/app/Import/Routine/FileRoutine.php
+++ b/app/Import/Routine/FileRoutine.php
@@ -1,6 +1,6 @@
.
+ */
+declare(strict_types=1);
+
+namespace FireflyIII\Import\Routine;
+
+use Carbon\Carbon;
+use DB;
+use FireflyIII\Import\FileProcessor\FileProcessorInterface;
+use FireflyIII\Import\Storage\ImportStorage;
+use FireflyIII\Models\ImportJob;
+use FireflyIII\Models\Tag;
+use FireflyIII\Repositories\Tag\TagRepositoryInterface;
+use Illuminate\Support\Collection;
+use Log;
+
+interface RoutineInterface
+{
+ /**
+ * @return bool
+ */
+ public function run(): bool;
+
+ /**
+ * @param ImportJob $job
+ *
+ * @return mixed
+ */
+ public function setJob(ImportJob $job);
+}
diff --git a/config/import.php b/config/import.php
index 4181666ea5..877eeb4711 100644
--- a/config/import.php
+++ b/config/import.php
@@ -2,25 +2,32 @@
declare(strict_types=1);
return [
- 'enabled' => [
+ 'enabled' => [
'file' => true,
'bunq' => true,
'spectre' => true,
'plaid' => true,
],
- 'prerequisites' => [
+ 'prerequisites' => [
'file' => 'FireflyIII\Import\Prerequisites\FilePrerequisites',
'bunq' => 'FireflyIII\Import\Prerequisites\BunqPrerequisites',
'spectre' => 'FireflyIII\Import\Prerequisites\SpectrePrerequisites',
'plaid' => 'FireflyIII\Import\Prerequisites\PlaidPrerequisites',
],
- 'configuration' => [
+ 'configuration' => [
'file' => 'FireflyIII\Import\Configuration\FileConfigurator',
'bunq' => 'FireflyIII\Import\Configuration\BunqConfigurator',
'spectre' => 'FireflyIII\Import\Configuration\SpectreConfigurator',
'plaid' => 'FireflyIII\Import\Configuration\PlaidConfigurator',
],
+ 'routine' => [
+ 'file' => 'FireflyIII\Import\Routine\FileRoutine',
+ 'bunq' => 'FireflyIII\Import\Routine\BunqRoutine',
+ 'spectre' => 'FireflyIII\Import\Routine\SpectreRoutine',
+ 'plaid' => 'FireflyIII\Import\Routine\PlaidRoutine',
+ ],
+
'options' => [
'file' => [
'import_formats' => ['csv'], // mt940
diff --git a/public/js/ff/import/status.js b/public/js/ff/import/status.js
index 02c3bbd073..d864c2cd14 100644
--- a/public/js/ff/import/status.js
+++ b/public/js/ff/import/status.js
@@ -18,7 +18,7 @@
* along with Firefly III. If not, see
+ {{ trans('import.status_wait_text') }} +
+