Last steps for import, in user interface.

This commit is contained in:
James Cole 2017-12-16 20:21:05 +01:00
parent 1d58d519a0
commit 22535c0e43
No known key found for this signature in database
GPG Key ID: C16961E655E74B5E
13 changed files with 44 additions and 315 deletions

View File

@ -7,6 +7,7 @@ namespace FireflyIII\Http\Controllers\Import;
use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Http\Controllers\Controller;
use FireflyIII\Import\Routine\ImportRoutine;
use FireflyIII\Import\Routine\RoutineInterface;
use FireflyIII\Models\ImportJob;
use FireflyIII\Repositories\ImportJob\ImportJobRepositoryInterface;
use Illuminate\Http\Response as LaravelResponse;
@ -126,11 +127,9 @@ class IndexController extends Controller
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);
/** @var RoutineInterface $routine */
$routine = app($className);
$routine->setJob($job);
$result = $routine->run();

View File

@ -43,7 +43,7 @@ class StatusController extends Controller
if (!in_array($job->status, $statuses)) {
return redirect(route('import.file.configure', [$job->key]));
}
$subTitle = trans('firefly.import_status_sub_title');
$subTitle = trans('import.status_sub_title');
$subTitleIcon = 'fa-star';
return view('import.status', compact('job', 'subTitle', 'subTitleIcon'));
@ -67,7 +67,7 @@ class StatusController extends Controller
'show_percentage' => false,
'steps' => $job->extended_status['steps'],
'done' => $job->extended_status['done'],
'statusText' => trans('firefly.import_status_job_' . $job->status),
'statusText' => trans('import.status_job_' . $job->status),
'status' => $job->status,
'finishedText' => '',
];
@ -83,7 +83,7 @@ class StatusController extends Controller
$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]);
$result['finishedText'] = trans('import.status_finished_job', ['link' => route('tags.show', [$tag->id, 'all']), 'tag' => $tag->tag]);
}
if ('running' === $job->status) {

View File

@ -552,14 +552,14 @@ Breadcrumbs::register(
'import.configure',
function (BreadCrumbGenerator $breadcrumbs, ImportJob $job) {
$breadcrumbs->parent('import.index');
$breadcrumbs->push(trans('firefly.import_config_sub_title', ['key' => $job->key]), route('import.configure', [$job->key]));
$breadcrumbs->push(trans('import.config_sub_title', ['key' => $job->key]), route('import.configure', [$job->key]));
}
);
Breadcrumbs::register(
'import.status',
function (BreadCrumbGenerator $breadcrumbs, ImportJob $job) {
$breadcrumbs->parent('import.index');
$breadcrumbs->push(trans('firefly.import_status_bread_crumb', ['key' => $job->key]), route('import.status', [$job->key]));
$breadcrumbs->push(trans('import.status_bread_crumb', ['key' => $job->key]), route('import.status', [$job->key]));
}
);

View File

@ -256,7 +256,7 @@ class CsvProcessor implements FileProcessorInterface
* @var string $value
*/
foreach ($row as $rowIndex => $value) {
$value = trim($value);
$value = trim(strval($value));
if (strlen($value) > 0) {
$annotated = $this->annotateValue($rowIndex, $value);
Log::debug('Annotated value', $annotated);

View File

@ -110,8 +110,10 @@ class FileRoutine implements RoutineInterface
protected function getImportObjects(): Collection
{
$objects = new Collection;
$type = $this->job->file_type;
$class = config(sprintf('firefly.import_processors.%s', $type));
$config = $this->job->configuration;
$fileType = $config['file-type'];
// will only respond to "file"
$class = config(sprintf('import.options.file.processors.%s', $fileType));
/** @var FileProcessorInterface $processor */
$processor = app($class);
$processor->setJob($this->job);
@ -146,7 +148,7 @@ class FileRoutine implements RoutineInterface
$repository = app(TagRepositoryInterface::class);
$repository->setUser($this->job->user);
$data = [
'tag' => trans('firefly.import_with_key', ['key' => $this->job->key]),
'tag' => trans('import.import_with_key', ['key' => $this->job->key]),
'date' => new Carbon,
'description' => null,
'latitude' => null,

View File

@ -40,23 +40,6 @@ return [
'export_formats' => [
'csv' => 'FireflyIII\Export\Exporter\CsvExporter',
],
'import_formats' => [
'csv' => 'FireflyIII\Import\Configurator\CsvConfigurator',
'spectre' => '',
],
'import_processors' => [
'csv' => 'FireflyIII\Import\FileProcessor\CsvProcessor',
],
'import_info' => [
'bunq' => 'FireflyIII\Support\Import\Information\BunqInformation',
'spectre' => 'FireflyIII\Support\Import\Information\SpectreInformation',
'plaid' => 'FireflyIII\Support\Import\Information\PlaidInformation',
],
'import_transactions' => [
'bunq' => 'FireflyIII\Support\Import\Transactions\BunqTransactions',
'spectre' => 'FireflyIII\Support\Import\Transactions\SpectreTransactions',
'plaid' => 'FireflyIII\Support\Import\Transactions\PlaidTransactions',
],
'bunq' => [
'server' => 'https://sandbox.public.api.bunq.com',
],

View File

@ -32,6 +32,9 @@ return [
'file' => [
'import_formats' => ['csv'], // mt940
'default_import_format' => 'csv',
'processors' => [
'csv' => 'FireflyIII\Import\FileProcessor\CsvProcessor',
],
],
],
'default_config' => [

View File

@ -1074,7 +1074,6 @@ return [
'import_from_bunq' => 'Import from bunq',
'import_using_spectre' => 'Import using Spectre',
'import_using_plaid' => 'Import using Plaid',
'import_config_sub_title' => 'Set up your import',
'import_config_bread_crumb' => 'Set up your import',
// import index page:
@ -1082,23 +1081,6 @@ return [
'import_index_sub_title' => 'Index',
'import_general_index_intro' => 'Welcome to Firefly\'s import routine. There are a few ways of importing data into Firefly III, displayed here as buttons.',
// import status page:
'import_status_bread_crumb' => 'Import status',
'import_status_sub_title' => 'Import status',
'import_status_ready_config' => 'Download configuration',
'import_status_ready_start' => 'Start the import',
'import_status_ready_share' => 'Please consider downloading your configuration and sharing it at the <strong><a href="https://github.com/firefly-iii/import-configurations/wiki">import configuration center</a></strong>. This will allow other users of Firefly III to import their files more easily.',
'import_status_running_title' => 'The import is running',
'import_status_running_placeholder' => 'Please hold for an update...',
'import_status_errors_title' => 'Errors during the import',
'import_status_errors_single' => 'An error has occured during the import. It does not appear to be fatal.',
'import_status_errors_multi' => 'Some errors occured during the import. These do not appear to be fatal.',
'import_status_finished_title' => 'Import routine finished',
'import_status_finished_text' => 'The import routine has imported your file.',
'import_status_finished_job' => 'The transactions imported can be found in tag <a href=":link" class="label label-success" style="font-size:100%;font-weight:normal;">:tag</a>.',
'import_status_job_running' => 'The import is running...',
'import_with_key' => 'Import with key \':key\'',
// sandstorm.io errors and messages:
'sandstorm_not_available' => 'This function is not available when you are using Firefly III within a Sandstorm.io environment.',

View File

@ -26,6 +26,22 @@ return [
'status_ready_title' => 'Import is ready to start',
'status_ready_text' => 'The import is ready to start. All the configuration you needed to do has been done. Please download the configuration file. It will help you with the import should it not go as planned. To actually run the import, you can either execute the following command in your console, or run the web-based import. Depending on your configuration, the console import will give you more feedback.',
'status_ready_noconfig_text' => 'The import is ready to start. All the configuration you needed to do has been done. To actually run the import, you can either execute the following command in your console, or run the web-based import. Depending on your configuration, the console import will give you more feedback.',
'status_ready_config' => 'Download configuration',
'status_ready_start' => 'Start the import',
'status_ready_share' => 'Please consider downloading your configuration and sharing it at the <strong><a href="https://github.com/firefly-iii/import-configurations/wiki">import configuration center</a></strong>. This will allow other users of Firefly III to import their files more easily.',
'status_job_running' => 'The import is running.. Please wait..',
'status_running_title' => 'The import is running',
'status_running_placeholder' => 'Please hold for an update...',
'status_finished_title' => 'Import routine finished',
'status_finished_text' => 'The import routine has imported your data.',
'status_errors_title' => 'Errors during the import',
'status_errors_single' => 'An error has occurred during the import. It does not appear to be fatal.',
'status_errors_multi' => 'Some errors occurred during the import. These do not appear to be fatal.',
'status_bread_crumb' => 'Import status',
'status_sub_title' => 'Import status',
'config_sub_title' => 'Set up your import',
'status_finished_job' => 'The transactions imported can be found in tag <a href=":link" class="label label-success" style="font-size:100%;font-weight:normal;">:tag</a>.',
'import_with_key' => 'Import with key \':key\'',
// file: upload something:
'file_upload_title' => 'Import setup (1/4) - Upload your file',

View File

@ -1,38 +0,0 @@
{% extends "./layout/default" %}
{% block breadcrumbs %}
{{ Breadcrumbs.renderIfExists }}
{% endblock %}
{% block content %}
<div class="row">
<div class="col-lg-12 col-md-12 col-sm-12">
<div class="box box-default">
<div class="box-header with-border">
<h3 class="box-title">{{ 'import_finished'|_ }}</h3>
</div>
<div class="box-body">
<p>
{{ 'import_finished_intro'|_ }}
</p>
{% if tagId > 0 %}
<p>
{{ trans('firefly.import_finished_text_with_link', {tag: tagId})|raw }}
</p>
{% else %}
<p>
{{ 'import_finished_text_without_link'|_ }}
</p>
{% endif %}
<p>
{{ 'import_share_configuration'|_ }}
</p>
</div>
</div>
</div>
</div>
{% endblock %}
{% block scripts %}
{% endblock %}
{% block styles %}
{% endblock %}

View File

@ -1,53 +0,0 @@
{% extends "./layout/default" %}
{% block breadcrumbs %}
{{ Breadcrumbs.renderIfExists }}
{% endblock %}
{% block content %}
<div class="row">
<div class="col-lg-12 col-md-12 col-sm-12">
<div class="box box-default">
<div class="box-header with-border">
<h3 class="box-title">{{ 'import_index_title'|_ }}</h3>
</div>
<div class="box-body">
<div class="row">
<div class="col-lg-8">
<p>
{{ 'import_index_intro'|_ }}
</p>
</div>
</div>
<div class="row">
<form method="POST" action="{{ route('import.file.initialize') }}" accept-charset="UTF-8" class="form-horizontal" id="initialize"
enctype="multipart/form-data">
<input name="_token" type="hidden" value="{{ csrf_token() }}">
<div class="col-lg-8 col-md-8 col-sm-12 col-xs-12">
{{ ExpandedForm.file('import_file', {helpText: 'import_index_file'|_}) }}
{{ ExpandedForm.file('configuration_file', {helpText: 'import_index_config'|_|raw}) }}
{{ ExpandedForm.select('import_file_type', importFileTypes, defaultImportType, {'helpText' : 'import_index_type'|_}) }}
<div class="form-group" id="import_file_holder">
<label for="ffInput_submit" class="col-sm-4 control-label">&nbsp;</label>
<div class="col-sm-8">
<button type="submit" class="btn pull-right btn-success">
{{ ('import_index_start')|_ }}
</button>
</div>
</div>
</div>
</form>
</div>
</div>
</div>
</div>
</div>
{% endblock %}
{% block scripts %}
{% endblock %}
{% block styles %}
{% endblock %}

View File

@ -1,165 +0,0 @@
{% extends "./layout/default" %}
{% block breadcrumbs %}
{{ Breadcrumbs.renderIfExists }}
{% endblock %}
{% block content %}
{# Initial display. Will refresh (and disappear almost immediately. #}
<div class="row status_initial statusbox">
<div class="col-lg-8 col-lg-offset-2 col-md-12 col-sm-12">
<div class="box box-primary">
<div class="box-header with-border">
<h3 class="box-title">{{ 'import_status_wait_title'|_ }}</h3>
</div>
<div class="box-body">
<p>
{{ 'import_status_wait_text'|_ }}
</p>
</div>
</div>
</div>
</div>
{# Fatal error display. Will be shown (duh) when something goes horribly wrong. #}
<div class="row fatal_error" style="display:none;">
<div class="col-lg-8 col-lg-offset-2 col-md-12 col-sm-12">
<div class="box box-danger">
<div class="box-header with-border">
<h3 class="box-title">{{ 'import_status_fatal_title'|_ }}</h3>
</div>
<div class="box-body">
<p>
{{ 'import_status_fatal_text'|_ }}
</p>
<p class="text-danger fatal_error_txt">
</p>
<p>
{{ 'import_status_fatal_more'|_ }}
</p>
</div>
</div>
</div>
</div>
{# Box for when the job is ready to start #}
<div class="row status_configured statusbox" style="display:none;">
<div class="col-lg-8 col-lg-offset-2 col-md-12 col-sm-12">
<div class="box box-primary">
<div class="box-header with-border">
<h3 class="box-title">{{ 'import_status_ready_title'|_ }}</h3>
</div>
<div class="box-body">
<p>
{% if job.configuration['has-config-file'] == false %}
This should only be visible momentarily.
{% else %}
{{ 'import_status_ready_text'|_ }}
{% endif %}
</p>
<p>
<code>php artisan firefly:start-import {{ job.key }}</code>
</p>
<div class="row">
{% if job.configuration['has-config-file'] != false %}
<div class="col-lg-4">
<a href="{{ route('import.file.download', [job.key]) }}" class="btn btn-default"><i
class="fa fa-fw fa-download"></i> {{ 'import_status_ready_config'|_ }}</a>
</div>
<div class="col-lg-4">
<button class="btn btn-success start-job"><i class="fa fa-fw fa-gears"></i> {{ 'import_status_ready_start'|_ }}</button>
</div>
{% endif %}
</div>
{% if job.configuration['has-config-file'] != false %}
<p>
&nbsp;
</p>
<p class="text-info">
{{ 'import_status_ready_share'|_ }}
</p>
{% endif %}
</div>
</div>
</div>
</div>
{# Box for when the job is running! #}
<div class="row status_running statusbox" style="display: none;">
<div class="col-lg-8 col-lg-offset-2 col-md-12 col-sm-12">
<div class="box box-primary">
<div class="box-header with-border">
<h3 class="box-title" id="import-status-title">{{ 'import_status_running_title'|_ }}</h3>
</div>
<div class="box-body">
<div id="import-status-holder">
<div class="progress" id="import-status-holder">
<div id="import-status-bar" class="progress-bar progress-bar-info active progress-bar-striped" role="progressbar"
aria-valuenow="100" aria-valuemin="0"
aria-valuemax="100" style="width: 100%;min-width:40px;">
</div>
</div>
<p id="import-status-txt">{{ 'import_status_running_placeholder'|_ }}</p>
</div>
</div>
</div>
</div>
</div>
{# displays the finished status of the import #}
<div class="row status_finished statusbox" style="display:none;">
<div class="col-lg-8 col-lg-offset-2 col-md-12 col-sm-12">
<div class="box box-default">
<div class="box-header with-border">
<h3 class="box-title">{{ 'import_status_finished_title'|_ }}</h3>
</div>
<div class="box-body">
<p id="import-status-intro">
{{ 'import_status_finished_text'|_ }}
</p>
<p id="import-status-more-info"></p>
</div>
</div>
</div>
</div>
{# box to show error information. #}
<div class="row info_errors" style="display:none;">
<div class="col-lg-8 col-lg-offset-2 col-md-12 col-sm-12">
<div class="box box-danger">
<div class="box-header with-border">
<h3 class="box-title">{{ 'import_status_errors_title'|_ }}</h3>
</div>
<div class="box-body">
<p id="import-status-error-intro">
</p>
<div id="import-status-error-list"></div>
</div>
</div>
</div>
</div>
{% endblock %}
{% block scripts %}
<script type="text/javascript">
// some useful translations.
var langImportSingleError = '{{ trans('firefly.import_status_errors_single')|escape('js') }}';
var langImportMultiError = '{{ trans('firefly.import_status_errors_multi')|escape('js') }}';
var jobKey = '{{ job.key }}';
var jobImportUrl = '{{ route('import.file.json', [job.key]) }}';
var jobStartUrl = '{{ route('import.file.start', [job.key]) }}';
var token = '{{ csrf_token() }}';
{% if job.configuration['auto-start'] == true %}
var autoStart = true;
{% else %}
var autoStart = false;
{% endif %}
</script>
<script type="text/javascript" src="js/ff/import/status.js?v={{ FF_VERSION }}"></script>
{% endblock %}
{% block styles %}
{% endblock %}

View File

@ -65,11 +65,11 @@
{% if job.configuration['has-config-file'] != false %}
<div class="col-lg-4">
<a href="{{ route('import.download', [job.key]) }}" class="btn btn-default"><i
class="fa fa-fw fa-download"></i> {{ 'import_status_ready_config'|_ }}</a>
class="fa fa-fw fa-download"></i> {{ trans('import.status_ready_config') }}</a>
</div>
{% endif %}
<div class="col-lg-4">
<button class="btn btn-success start-job"><i class="fa fa-fw fa-gears"></i> {{ 'import_status_ready_start'|_ }}</button>
<button class="btn btn-success start-job"><i class="fa fa-fw fa-gears"></i> {{ trans('import.status_ready_start') }}</button>
</div>
</div>
{% if job.configuration['has-config-file'] != false %}
@ -77,7 +77,7 @@
&nbsp;
</p>
<p class="text-info">
{{ 'import_status_ready_share'|_ }}
{{ trans('import.status_ready_share')|raw }}
</p>
{% endif %}
</div>
@ -90,7 +90,7 @@
<div class="col-lg-8 col-lg-offset-2 col-md-12 col-sm-12">
<div class="box box-primary">
<div class="box-header with-border">
<h3 class="box-title" id="import-status-title">{{ 'import_status_running_title'|_ }}</h3>
<h3 class="box-title" id="import-status-title">{{ trans('import.status_running_title') }}</h3>
</div>
<div class="box-body">
<div id="import-status-holder">
@ -100,7 +100,7 @@
aria-valuemax="100" style="width: 100%;min-width:40px;">
</div>
</div>
<p id="import-status-txt">{{ 'import_status_running_placeholder'|_ }}</p>
<p id="import-status-txt">{{ trans('import.status_running_placeholder') }}</p>
</div>
</div>
</div>
@ -112,11 +112,11 @@
<div class="col-lg-8 col-lg-offset-2 col-md-12 col-sm-12">
<div class="box box-default">
<div class="box-header with-border">
<h3 class="box-title">{{ 'import_status_finished_title'|_ }}</h3>
<h3 class="box-title">{{ trans('import.status_finished_title') }}</h3>
</div>
<div class="box-body">
<p id="import-status-intro">
{{ 'import_status_finished_text'|_ }}
{{ trans('import.status_finished_text') }}
</p>
<p id="import-status-more-info"></p>
</div>
@ -129,7 +129,7 @@
<div class="col-lg-8 col-lg-offset-2 col-md-12 col-sm-12">
<div class="box box-danger">
<div class="box-header with-border">
<h3 class="box-title">{{ 'import_status_errors_title'|_ }}</h3>
<h3 class="box-title">{{ trans('import.status_errors_title') }}</h3>
</div>
<div class="box-body">
<p id="import-status-error-intro">
@ -145,8 +145,8 @@
<script type="text/javascript">
// some useful translations.
var langImportSingleError = '{{ trans('firefly.import_status_errors_single')|escape('js') }}';
var langImportMultiError = '{{ trans('firefly.import_status_errors_multi')|escape('js') }}';
var langImportSingleError = '{{ trans('import.status_errors_single')|escape('js') }}';
var langImportMultiError = '{{ trans('import.status_errors_multi')|escape('js') }}';
var jobStatusUri = '{{ route('import.status.json', [job.key]) }}';
var jobStartUri = '{{ route('import.start', [job.key]) }}';
var token = '{{ csrf_token() }}';