mirror of
https://github.com/firefly-iii/firefly-iii.git
synced 2025-02-25 18:45:27 -06:00
Improve fake import.
This commit is contained in:
parent
6e84326583
commit
b541f7b944
@ -73,7 +73,7 @@ class JobConfigurationController extends Controller
|
|||||||
$allowed = ['has_prereq', 'need_job_config', 'has_config'];
|
$allowed = ['has_prereq', 'need_job_config', 'has_config'];
|
||||||
if (null !== $importJob && !in_array($importJob->status, $allowed)) {
|
if (null !== $importJob && !in_array($importJob->status, $allowed)) {
|
||||||
Log::error('Job is not new but wants to do prerequisites');
|
Log::error('Job is not new but wants to do prerequisites');
|
||||||
session()->flash('error', trans('import.bad_job_status'));
|
session()->flash('error', trans('import.bad_job_status', ['status' => $importJob->status]));
|
||||||
return redirect(route('import.index'));
|
return redirect(route('import.index'));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -101,7 +101,7 @@ class JobConfigurationController extends Controller
|
|||||||
|
|
||||||
$view = $configurator->getNextView();
|
$view = $configurator->getNextView();
|
||||||
$data = $configurator->getNextData();
|
$data = $configurator->getNextData();
|
||||||
$subTitle = trans('firefly.import_config_bread_crumb');
|
$subTitle = trans('import.job_configuration_breadcrumb', ['key' => $importJob->key]);
|
||||||
$subTitleIcon = 'fa-wrench';
|
$subTitleIcon = 'fa-wrench';
|
||||||
|
|
||||||
return view($view, compact('data', 'importJob', 'subTitle', 'subTitleIcon'));
|
return view($view, compact('data', 'importJob', 'subTitle', 'subTitleIcon'));
|
||||||
@ -123,7 +123,7 @@ class JobConfigurationController extends Controller
|
|||||||
$allowed = ['has_prereq', 'need_job_config', 'has_config'];
|
$allowed = ['has_prereq', 'need_job_config', 'has_config'];
|
||||||
if (null !== $importJob && !in_array($importJob->status, $allowed)) {
|
if (null !== $importJob && !in_array($importJob->status, $allowed)) {
|
||||||
Log::error('Job is not new but wants to do prerequisites');
|
Log::error('Job is not new but wants to do prerequisites');
|
||||||
session()->flash('error', trans('import.bad_job_status'));
|
session()->flash('error', trans('import.bad_job_status', ['status' => $importJob->status]));
|
||||||
return redirect(route('import.index'));
|
return redirect(route('import.index'));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -30,9 +30,7 @@ use FireflyIII\Import\Routine\RoutineInterface;
|
|||||||
use FireflyIII\Import\Storage\ImportArrayStorage;
|
use FireflyIII\Import\Storage\ImportArrayStorage;
|
||||||
use FireflyIII\Models\ImportJob;
|
use FireflyIII\Models\ImportJob;
|
||||||
use FireflyIII\Repositories\ImportJob\ImportJobRepositoryInterface;
|
use FireflyIII\Repositories\ImportJob\ImportJobRepositoryInterface;
|
||||||
use FireflyIII\Repositories\Tag\TagRepositoryInterface;
|
|
||||||
use Illuminate\Http\JsonResponse;
|
use Illuminate\Http\JsonResponse;
|
||||||
use Illuminate\Http\RedirectResponse;
|
|
||||||
use Log;
|
use Log;
|
||||||
use Symfony\Component\Debug\Exception\FatalThrowableError;
|
use Symfony\Component\Debug\Exception\FatalThrowableError;
|
||||||
|
|
||||||
@ -83,7 +81,10 @@ class JobStatusController extends Controller
|
|||||||
// TODO to finished screen.
|
// TODO to finished screen.
|
||||||
}
|
}
|
||||||
|
|
||||||
return view('import.status', compact('importJob'));
|
$subTitleIcon = 'fa-gear';
|
||||||
|
$subTitle = trans('import.job_status_breadcrumb', ['key' => $importJob->key]);
|
||||||
|
|
||||||
|
return view('import.status', compact('importJob', 'subTitle', 'subTitleIcon'));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -94,24 +95,25 @@ class JobStatusController extends Controller
|
|||||||
public function json(ImportJob $importJob): JsonResponse
|
public function json(ImportJob $importJob): JsonResponse
|
||||||
{
|
{
|
||||||
$extendedStatus = $importJob->extended_status;
|
$extendedStatus = $importJob->extended_status;
|
||||||
|
$count = \count($importJob->transactions);
|
||||||
$json = [
|
$json = [
|
||||||
'status' => $importJob->status,
|
'status' => $importJob->status,
|
||||||
'errors' => $importJob->errors,
|
'errors' => $importJob->errors,
|
||||||
'count' => count($importJob->transactions),
|
'count' => $count,
|
||||||
'tag_id' => $importJob->tag_id,
|
'tag_id' => $importJob->tag_id,
|
||||||
'tag_name' => null === $importJob->tag_id ? null : $importJob->tag->tag,
|
'tag_name' => null === $importJob->tag_id ? null : $importJob->tag->tag,
|
||||||
'journals' => $extendedStatus['count'] ?? 0,
|
'journals' => $extendedStatus['count'] ?? 0,
|
||||||
'journals_text' => trans_choice('import.status_with_count', $extendedStatus['count'] ?? 0),
|
'report_txt' => trans('import.unknown_import_result'),
|
||||||
'tag_text' => '',
|
|
||||||
];
|
];
|
||||||
if (null !== $importJob->tag_id) {
|
// if count is zero:
|
||||||
$json['tag_text'] = trans(
|
if ($count === 0) {
|
||||||
'import.status_finished_job',
|
$json['report_txt'] = trans('import.result_no_transactions');
|
||||||
['count' => $extendedStatus['count'],
|
}
|
||||||
'link' => route('tags.show', [$importJob->tag_id]),
|
if ($count === 1 && null !== $importJob->tag_id) {
|
||||||
'tag' => $importJob->tag->tag,
|
$json['report_txt'] = trans('import.result_one_transaction', ['route' => route('tags.show', [$importJob->tag_id]), '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]), 'tag' => $importJob->tag->tag ]);
|
||||||
}
|
}
|
||||||
|
|
||||||
return response()->json($json);
|
return response()->json($json);
|
||||||
|
@ -78,7 +78,8 @@ class PrerequisitesController extends Controller
|
|||||||
$allowed = ['new'];
|
$allowed = ['new'];
|
||||||
if (null !== $importJob && !in_array($importJob->status, $allowed)) {
|
if (null !== $importJob && !in_array($importJob->status, $allowed)) {
|
||||||
Log::error('Job is not new but wants to do prerequisites');
|
Log::error('Job is not new but wants to do prerequisites');
|
||||||
session()->flash('error', trans('import.bad_job_status'));
|
session()->flash('error', trans('import.bad_job_status', ['status' => $importJob->status]));
|
||||||
|
|
||||||
return redirect(route('import.index'));
|
return redirect(route('import.index'));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -131,7 +132,8 @@ class PrerequisitesController extends Controller
|
|||||||
$allowed = ['new'];
|
$allowed = ['new'];
|
||||||
if (null !== $importJob && !in_array($importJob->status, $allowed)) {
|
if (null !== $importJob && !in_array($importJob->status, $allowed)) {
|
||||||
Log::error('Job is not new but wants to do prerequisites');
|
Log::error('Job is not new but wants to do prerequisites');
|
||||||
session()->flash('error', trans('import.bad_job_status'));
|
session()->flash('error', trans('import.bad_job_status', ['status' => $importJob->status]));
|
||||||
|
|
||||||
return redirect(route('import.index'));
|
return redirect(route('import.index'));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -81,7 +81,7 @@ class FakeJobConfiguration implements JobConfigurationInterface
|
|||||||
$artist = strtolower($data['artist'] ?? '');
|
$artist = strtolower($data['artist'] ?? '');
|
||||||
$song = strtolower($data['song'] ?? '');
|
$song = strtolower($data['song'] ?? '');
|
||||||
$album = strtolower($data['album'] ?? '');
|
$album = strtolower($data['album'] ?? '');
|
||||||
$applyRules = isset($data['apply-rules']) ? (int)$data['apply-rules'] === 1 : null;
|
$applyRules = isset($data['apply_rules']) ? (int)$data['apply_rules'] === 1 : null;
|
||||||
$configuration = $this->job->configuration;
|
$configuration = $this->job->configuration;
|
||||||
if ($artist === 'david bowie') {
|
if ($artist === 'david bowie') {
|
||||||
// store artist
|
// store artist
|
||||||
@ -119,7 +119,12 @@ class FakeJobConfiguration implements JobConfigurationInterface
|
|||||||
*/
|
*/
|
||||||
public function getNextData(): array
|
public function getNextData(): array
|
||||||
{
|
{
|
||||||
return [];
|
return [
|
||||||
|
'rulesOptions' => [
|
||||||
|
1 => trans('firefly.yes'),
|
||||||
|
0 => trans('firefly.no'),
|
||||||
|
],
|
||||||
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -130,10 +135,10 @@ class FakeJobConfiguration implements JobConfigurationInterface
|
|||||||
public function getNextView(): string
|
public function getNextView(): string
|
||||||
{
|
{
|
||||||
// first configure artist:
|
// first configure artist:
|
||||||
$config = $this->job->configuration;
|
$config = $this->job->configuration;
|
||||||
$artist = $config['artist'] ?? '';
|
$artist = $config['artist'] ?? '';
|
||||||
$song = $config['song'] ?? '';
|
$song = $config['song'] ?? '';
|
||||||
$album = $config['album'] ?? '';
|
$album = $config['album'] ?? '';
|
||||||
$applyRules = $config['apply-rules'] ?? null;
|
$applyRules = $config['apply-rules'] ?? null;
|
||||||
if (null === $applyRules) {
|
if (null === $applyRules) {
|
||||||
return 'import.fake.apply-rules';
|
return 'import.fake.apply-rules';
|
||||||
|
@ -36,7 +36,7 @@ class StageAhoyHandler
|
|||||||
*/
|
*/
|
||||||
public function run(): void
|
public function run(): void
|
||||||
{
|
{
|
||||||
for ($i = 0; $i < 2; $i++) {
|
for ($i = 0; $i < 15; $i++) {
|
||||||
Log::debug(sprintf('Am now in stage AHOY hander, sleeping... (%d)', $i));
|
Log::debug(sprintf('Am now in stage AHOY hander, sleeping... (%d)', $i));
|
||||||
sleep(1);
|
sleep(1);
|
||||||
}
|
}
|
||||||
|
@ -36,7 +36,7 @@ class StageNewHandler
|
|||||||
*/
|
*/
|
||||||
public function run(): void
|
public function run(): void
|
||||||
{
|
{
|
||||||
for ($i = 0; $i < 2; $i++) {
|
for ($i = 0; $i < 15; $i++) {
|
||||||
Log::debug(sprintf('Am now in stage new hander, sleeping... (%d)', $i));
|
Log::debug(sprintf('Am now in stage new hander, sleeping... (%d)', $i));
|
||||||
sleep(1);
|
sleep(1);
|
||||||
}
|
}
|
||||||
|
310
public/js/ff/import/status_v2.js
vendored
310
public/js/ff/import/status_v2.js
vendored
@ -31,15 +31,15 @@ var startCount = 0;
|
|||||||
|
|
||||||
$(function () {
|
$(function () {
|
||||||
"use strict";
|
"use strict";
|
||||||
timeOutId = setTimeout(checkJobStatus, checkInitialInterval);
|
timeOutId = setTimeout(checkJobJSONStatus, checkInitialInterval);
|
||||||
});
|
});
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Downloads some JSON and responds to its content to see what the status is of the current import job.
|
* Downloads some JSON and responds to its content to see what the status is of the current import job.
|
||||||
*/
|
*/
|
||||||
function checkJobStatus() {
|
function checkJobJSONStatus() {
|
||||||
console.log('In checkJobStatus()');
|
console.log('In checkJobJSONStatus()');
|
||||||
$.getJSON(jobStatusUri).done(reportOnJobStatus).fail(reportFailure);
|
$.getJSON(jobStatusUri).done(reportJobJSONDone).fail(reportJobJSONFailure);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -47,8 +47,8 @@ function checkJobStatus() {
|
|||||||
*
|
*
|
||||||
* @param data
|
* @param data
|
||||||
*/
|
*/
|
||||||
function reportOnJobStatus(data) {
|
function reportJobJSONDone(data) {
|
||||||
console.log('In reportOnJobStatus()');
|
console.log('In reportJobJSONDone() with status "' + data.status + '"');
|
||||||
console.log(data);
|
console.log(data);
|
||||||
switch (data.status) {
|
switch (data.status) {
|
||||||
case "ready_to_run":
|
case "ready_to_run":
|
||||||
@ -56,13 +56,13 @@ function reportOnJobStatus(data) {
|
|||||||
hasStartedJob = false;
|
hasStartedJob = false;
|
||||||
}
|
}
|
||||||
startCount++;
|
startCount++;
|
||||||
startJob();
|
sendJobPOSTStart();
|
||||||
checkOnJob();
|
recheckJobJSONStatus();
|
||||||
break;
|
break;
|
||||||
case "running":
|
case "running":
|
||||||
case "storing_data":
|
case "storing_data":
|
||||||
showProgressBox(data.status);
|
showProgressBox(data.status);
|
||||||
checkOnJob();
|
recheckJobJSONStatus();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case "need_job_config":
|
case "need_job_config":
|
||||||
@ -71,8 +71,8 @@ function reportOnJobStatus(data) {
|
|||||||
break;
|
break;
|
||||||
case 'provider_finished':
|
case 'provider_finished':
|
||||||
// call routine to store stuff:
|
// call routine to store stuff:
|
||||||
storeJobData();
|
sendJobPOSTStore();
|
||||||
checkOnJob();
|
recheckJobJSONStatus();
|
||||||
break;
|
break;
|
||||||
case "finished":
|
case "finished":
|
||||||
showJobResults(data);
|
showJobResults(data);
|
||||||
@ -88,16 +88,12 @@ function reportOnJobStatus(data) {
|
|||||||
* @param data
|
* @param data
|
||||||
*/
|
*/
|
||||||
function showJobResults(data) {
|
function showJobResults(data) {
|
||||||
|
console.log('In showJobResults()');
|
||||||
// hide all boxes.
|
// hide all boxes.
|
||||||
// hide status boxes:
|
|
||||||
$('.statusbox').hide();
|
$('.statusbox').hide();
|
||||||
|
|
||||||
// render the count:
|
// render the count:
|
||||||
$('#import-status-more-info').append($('<span>').text(data.journals_text));
|
$('#import-status-more-info').append($('<span>').html(data.report_txt));
|
||||||
|
|
||||||
if(data.tag_id) {
|
|
||||||
$('#import-status-more-info').append($('<br>')).append($('<span>').html(data.tag_text));
|
|
||||||
}
|
|
||||||
|
|
||||||
// render relevant data from JSON thing.
|
// render relevant data from JSON thing.
|
||||||
if (data.errors.length > 0) {
|
if (data.errors.length > 0) {
|
||||||
@ -117,9 +113,10 @@ function showJobResults(data) {
|
|||||||
/**
|
/**
|
||||||
* Will refresh and get job status.
|
* Will refresh and get job status.
|
||||||
*/
|
*/
|
||||||
function checkOnJob() {
|
function recheckJobJSONStatus() {
|
||||||
|
console.log('In recheckJobJSONStatus()');
|
||||||
if (maxLoops !== 0 && totalLoops < maxLoops) {
|
if (maxLoops !== 0 && totalLoops < maxLoops) {
|
||||||
timeOutId = setTimeout(checkJobStatus, checkNextInterval);
|
timeOutId = setTimeout(checkJobJSONStatus, checkNextInterval);
|
||||||
}
|
}
|
||||||
if (maxLoops !== 0) {
|
if (maxLoops !== 0) {
|
||||||
console.log('max: ' + maxLoops + ' current: ' + totalLoops);
|
console.log('max: ' + maxLoops + ' current: ' + totalLoops);
|
||||||
@ -130,31 +127,32 @@ function checkOnJob() {
|
|||||||
/**
|
/**
|
||||||
* Start the job.
|
* Start the job.
|
||||||
*/
|
*/
|
||||||
function startJob() {
|
function sendJobPOSTStart() {
|
||||||
console.log('In startJob()');
|
console.log('In sendJobPOSTStart()');
|
||||||
if (hasStartedJob) {
|
if (hasStartedJob) {
|
||||||
console.log('Job already started!');
|
console.log('Import job already started!');
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
console.log('JOB STARTED!');
|
console.log('Job was started');
|
||||||
hasStartedJob = true;
|
hasStartedJob = true;
|
||||||
$.post(jobStartUri, {_token: token}).fail(reportOnSubmitError).done(reportOnSubmit)
|
$.post(jobStartUri, {_token: token}).fail(reportJobPOSTFailure).done(reportJobPOSTDone)
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Start the storage routine for this job.
|
* Start the storage routine for this job.
|
||||||
*/
|
*/
|
||||||
function storeJobData() {
|
function sendJobPOSTStore() {
|
||||||
console.log('In storeJobData()');
|
console.log('In sendJobPOSTStore()');
|
||||||
if (jobStorageStarted) {
|
if (jobStorageStarted) {
|
||||||
console.log('Store job already started!');
|
console.log('Store job already started!');
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
console.log('STORAGE JOB STARTED!');
|
console.log('Storage job has started!');
|
||||||
jobStorageStarted = true;
|
jobStorageStarted = true;
|
||||||
$.post(jobStorageStartUri, {_token: token}).fail(reportOnSubmitError).done(reportOnSubmit)
|
$.post(jobStorageStartUri, {_token: token}).fail(reportJobPOSTFailure).done(reportJobPOSTDone)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Function is called when the JSON array could not be retrieved.
|
* Function is called when the JSON array could not be retrieved.
|
||||||
*
|
*
|
||||||
@ -162,7 +160,8 @@ function storeJobData() {
|
|||||||
* @param status
|
* @param status
|
||||||
* @param error
|
* @param error
|
||||||
*/
|
*/
|
||||||
function reportFailure(xhr, status, error) {
|
function reportJobJSONFailure(xhr, status, error) {
|
||||||
|
console.log('In reportJobJSONFailure()');
|
||||||
// cancel checking again for job status:
|
// cancel checking again for job status:
|
||||||
clearTimeout(timeOutId);
|
clearTimeout(timeOutId);
|
||||||
|
|
||||||
@ -180,12 +179,13 @@ function reportFailure(xhr, status, error) {
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
function showProgressBox(status) {
|
function showProgressBox(status) {
|
||||||
|
console.log('In showProgressBox()');
|
||||||
// hide fatal error box:
|
// hide fatal error box:
|
||||||
$('.fatal_error').hide();
|
$('.fatal_error').hide();
|
||||||
|
|
||||||
// hide initial status box:
|
// hide initial status box:
|
||||||
$('.status_initial').hide();
|
$('.status_initial').hide();
|
||||||
if(status === 'running' || status === 'ready_to_run') {
|
if (status === 'running' || status === 'ready_to_run') {
|
||||||
$('#import-status-txt').text(langImportRunning);
|
$('#import-status-txt').text(langImportRunning);
|
||||||
} else {
|
} else {
|
||||||
$('#import-status-txt').text(langImportStoring);
|
$('#import-status-txt').text(langImportStoring);
|
||||||
@ -202,7 +202,8 @@ function showProgressBox(status) {
|
|||||||
* @param status
|
* @param status
|
||||||
* @param error
|
* @param error
|
||||||
*/
|
*/
|
||||||
function reportOnSubmitError(xhr, status, error) {
|
function reportJobPOSTFailure(xhr, status, error) {
|
||||||
|
console.log('In reportJobPOSTFailure()');
|
||||||
// cancel checking again for job status:
|
// cancel checking again for job status:
|
||||||
clearTimeout(timeOutId);
|
clearTimeout(timeOutId);
|
||||||
|
|
||||||
@ -216,7 +217,8 @@ function reportOnSubmitError(xhr, status, error) {
|
|||||||
// show error box.
|
// show error box.
|
||||||
}
|
}
|
||||||
|
|
||||||
function reportOnSubmit(data) {
|
function reportJobPOSTDone(data) {
|
||||||
|
console.log('In function reportJobPOSTDone() with status "' + data.status + '"');
|
||||||
if (data.status === 'NOK') {
|
if (data.status === 'NOK') {
|
||||||
// cancel checking again for job status:
|
// cancel checking again for job status:
|
||||||
clearTimeout(timeOutId);
|
clearTimeout(timeOutId);
|
||||||
@ -230,246 +232,4 @@ function reportOnSubmit(data) {
|
|||||||
$('.fatal_error_txt').text('Job could not be started or crashed: ' + data.message);
|
$('.fatal_error_txt').text('Job could not be started or crashed: ' + data.message);
|
||||||
// show error box.
|
// show error box.
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// /**
|
|
||||||
// * This method is called when the JSON query returns an error. If possible, this error is relayed to the user.
|
|
||||||
// */
|
|
||||||
// function reportFailedJob(jqxhr, textStatus, error) {
|
|
||||||
// console.log('In reportFailedJob()');
|
|
||||||
//
|
|
||||||
// // cancel refresh
|
|
||||||
// clearTimeout(timeOutId);
|
|
||||||
//
|
|
||||||
// // hide all possible boxes:
|
|
||||||
// $('.statusbox').hide();
|
|
||||||
//
|
|
||||||
// // fill in some details:
|
|
||||||
// var errorMessage = textStatus + " " + error;
|
|
||||||
//
|
|
||||||
// $('.fatal_error_txt').text(errorMessage);
|
|
||||||
//
|
|
||||||
// // show the fatal error box:
|
|
||||||
// $('.fatal_error').show();
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// /**
|
|
||||||
// * This method is called when the job enquiry (JSON) returns some info.
|
|
||||||
// * It also decides whether or not to check again.
|
|
||||||
// *
|
|
||||||
// * @param data
|
|
||||||
// */
|
|
||||||
// function reportOnJobStatus(data) {
|
|
||||||
// console.log('In reportOnJobStatus()');
|
|
||||||
// switch (data.status) {
|
|
||||||
// case "configured":
|
|
||||||
// console.log('Job reports configured.');
|
|
||||||
// // job is ready. Do not check again, just show the start-box. Hide the rest.
|
|
||||||
// if (!job.configuration['auto-start']) {
|
|
||||||
// $('.statusbox').hide();
|
|
||||||
// $('.status_configured').show();
|
|
||||||
// }
|
|
||||||
// if (job.configuration['auto-start']) {
|
|
||||||
// timeOutId = setTimeout(checkJobStatus, interval);
|
|
||||||
// }
|
|
||||||
// if (pressedStart) {
|
|
||||||
// // do a time out just in case. Could be that job is running or is even done already.
|
|
||||||
// timeOutId = setTimeout(checkJobStatus, 2000);
|
|
||||||
// pressedStart = false;
|
|
||||||
// }
|
|
||||||
// break;
|
|
||||||
// case "running":
|
|
||||||
// console.log('Job reports running.');
|
|
||||||
// // job is running! Show the running box:
|
|
||||||
// $('.statusbox').hide();
|
|
||||||
// $('.status_running').show();
|
|
||||||
//
|
|
||||||
// // update the bar
|
|
||||||
// updateBar(data);
|
|
||||||
//
|
|
||||||
// // update the status text:
|
|
||||||
// updateStatusText(data);
|
|
||||||
//
|
|
||||||
// // report on detected errors:
|
|
||||||
// reportOnErrors(data);
|
|
||||||
//
|
|
||||||
// if (jobIsStalled(data)) {
|
|
||||||
// // do something
|
|
||||||
// showStalledBox();
|
|
||||||
// } else {
|
|
||||||
// // check again in 500ms
|
|
||||||
// timeOutId = setTimeout(checkJobStatus, interval);
|
|
||||||
// }
|
|
||||||
// break;
|
|
||||||
// case "finished":
|
|
||||||
// console.log('Job reports finished.');
|
|
||||||
// $('.statusbox').hide();
|
|
||||||
// $('.status_finished').show();
|
|
||||||
// // report on detected errors:
|
|
||||||
// reportOnErrors(data);
|
|
||||||
// // show text:
|
|
||||||
// $('#import-status-more-info').html(data.finishedText);
|
|
||||||
// break;
|
|
||||||
// case "error":
|
|
||||||
// clearTimeout(timeOutId);
|
|
||||||
// console.log('Job reports ERROR.');
|
|
||||||
// // hide all possible boxes:
|
|
||||||
// $('.statusbox').hide();
|
|
||||||
//
|
|
||||||
// // fill in some details:
|
|
||||||
// var errorMessage = data.errors.join(", ");
|
|
||||||
//
|
|
||||||
// $('.fatal_error_txt').text(errorMessage);
|
|
||||||
//
|
|
||||||
// // show the fatal error box:
|
|
||||||
// $('.fatal_error').show();
|
|
||||||
// break;
|
|
||||||
// case "configuring":
|
|
||||||
// console.log('Job reports configuring.');
|
|
||||||
// // redirect back to configure screen.
|
|
||||||
// window.location = jobConfigureUri;
|
|
||||||
// break;
|
|
||||||
// default:
|
|
||||||
// console.error('Cannot handle job status ' + data.status);
|
|
||||||
// break;
|
|
||||||
//
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// /**
|
|
||||||
// * Shows a fatal error when the job seems to be stalled.
|
|
||||||
// */
|
|
||||||
// function showStalledBox() {
|
|
||||||
// console.log('In showStalledBox().');
|
|
||||||
// $('.statusbox').hide();
|
|
||||||
// $('.fatal_error').show();
|
|
||||||
// $('.fatal_error_txt').text(langImportTimeOutError);
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// /**
|
|
||||||
// * Detects if a job is frozen.
|
|
||||||
// *
|
|
||||||
// * @param data
|
|
||||||
// */
|
|
||||||
// function jobIsStalled(data) {
|
|
||||||
// console.log('In jobIsStalled().');
|
|
||||||
// if (data.done === numberOfSteps) {
|
|
||||||
// numberOfReports++;
|
|
||||||
// console.log('Number of reports ' + numberOfReports);
|
|
||||||
// }
|
|
||||||
// if (data.done !== numberOfSteps) {
|
|
||||||
// numberOfReports = 0;
|
|
||||||
// console.log('Number of reports ' + numberOfReports);
|
|
||||||
// }
|
|
||||||
// if (numberOfReports > 20) {
|
|
||||||
// console.log('Number of reports > 20! ' + numberOfReports);
|
|
||||||
// return true;
|
|
||||||
// }
|
|
||||||
// numberOfSteps = data.done;
|
|
||||||
// console.log('Number of steps ' + numberOfSteps);
|
|
||||||
// return false;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// /**
|
|
||||||
// * This function tells Firefly start the job. It will also initialize a re-check in 500ms time.
|
|
||||||
// * Only when job is in "configured" state.
|
|
||||||
// */
|
|
||||||
// function startJob() {
|
|
||||||
// console.log('In startJob().');
|
|
||||||
// if (job.status === "configured") {
|
|
||||||
// console.log('Job status = configured.');
|
|
||||||
// // disable the button, add loading thing.
|
|
||||||
// $('.start-job').prop('disabled', true).text('...');
|
|
||||||
// $.post(jobStartUri, {_token: token}).fail(reportOnSubmitError);
|
|
||||||
//
|
|
||||||
// // check status, every 500 ms.
|
|
||||||
// timeOutId = setTimeout(checkJobStatus, startInterval);
|
|
||||||
// return;
|
|
||||||
// }
|
|
||||||
// console.log('Job.status = ' + job.status);
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// /**
|
|
||||||
// * When the start button fails (returns error code) this function reports. It assumes a time out.
|
|
||||||
// */
|
|
||||||
// function reportOnSubmitError(jqxhr, textStatus, error) {
|
|
||||||
// console.log('In reportOnSubmitError().');
|
|
||||||
// // stop the refresh thing
|
|
||||||
// clearTimeout(timeOutId);
|
|
||||||
//
|
|
||||||
// // hide all possible boxes:
|
|
||||||
// $('.statusbox').hide();
|
|
||||||
//
|
|
||||||
// // fill in some details:
|
|
||||||
// var errorMessage = "Submitting the job returned an error: " + textStatus + ' ' + error;
|
|
||||||
//
|
|
||||||
// $('.fatal_error_txt').text(errorMessage);
|
|
||||||
//
|
|
||||||
// // show the fatal error box:
|
|
||||||
// $('.fatal_error').show();
|
|
||||||
// jobFailed = true;
|
|
||||||
//
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// /**
|
|
||||||
// * This method updates the percentage bar thing if the job is running!
|
|
||||||
// */
|
|
||||||
// function updateBar(data) {
|
|
||||||
// console.log('In updateBar().');
|
|
||||||
// var bar = $('#import-status-bar');
|
|
||||||
// if (data.show_percentage) {
|
|
||||||
// bar.addClass('progress-bar-success').removeClass('progress-bar-info');
|
|
||||||
// bar.attr('aria-valuenow', data.percentage);
|
|
||||||
// bar.css('width', data.percentage + '%');
|
|
||||||
// $('#import-status-bar').text(data.done + '/' + data.steps);
|
|
||||||
// return true;
|
|
||||||
// }
|
|
||||||
// // dont show percentage:
|
|
||||||
// bar.removeClass('progress-bar-success').addClass('progress-bar-info');
|
|
||||||
// bar.attr('aria-valuenow', 100);
|
|
||||||
// bar.css('width', '100%');
|
|
||||||
// return true;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// /**
|
|
||||||
// * Add text with current import status.
|
|
||||||
// * @param data
|
|
||||||
// */
|
|
||||||
// function updateStatusText(data) {
|
|
||||||
// "use strict";
|
|
||||||
// console.log('In updateStatusText().');
|
|
||||||
// $('#import-status-txt').removeClass('text-danger').text(data.statusText);
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// /**
|
|
||||||
// * Report on errors found in import:
|
|
||||||
// * @param data
|
|
||||||
// */
|
|
||||||
// function reportOnErrors(data) {
|
|
||||||
// console.log('In reportOnErrors().');
|
|
||||||
// if (knownErrors === data.errors.length) {
|
|
||||||
// return;
|
|
||||||
// }
|
|
||||||
// if (data.errors.length === 0) {
|
|
||||||
// return;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// if (data.errors.length === 1) {
|
|
||||||
// $('#import-status-error-intro').text(langImportSingleError);
|
|
||||||
// //'An error has occured during the import. The import can continue, however.'
|
|
||||||
// }
|
|
||||||
// if (data.errors.length > 1) {
|
|
||||||
// // 'Errors have occured during the import. The import can continue, however.'
|
|
||||||
// $('#import-status-error-intro').text(langImportMultiError);
|
|
||||||
// }
|
|
||||||
// $('.info_errors').show();
|
|
||||||
// // fill the list with error texts
|
|
||||||
// $('#import-status-error-list').empty();
|
|
||||||
// for (var i = 0; i < data.errors.length; i++) {
|
|
||||||
// var errorSet = data.errors[i];
|
|
||||||
// for (var j = 0; j < errorSet.length; j++) {
|
|
||||||
// var item = $('<li>').html(errorSet[j]);
|
|
||||||
// $('#import-status-error-list').append(item);
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// }
|
|
@ -184,6 +184,13 @@ return [
|
|||||||
'blocked' => 'Is blocked?',
|
'blocked' => 'Is blocked?',
|
||||||
'blocked_code' => 'Reason for block',
|
'blocked_code' => 'Reason for block',
|
||||||
|
|
||||||
|
// import
|
||||||
|
'apply_rules' => 'Apply rules',
|
||||||
|
'artist' => 'Artist',
|
||||||
|
'album' => 'Album',
|
||||||
|
'song' => 'Song',
|
||||||
|
|
||||||
|
|
||||||
// admin
|
// admin
|
||||||
'domain' => 'Domain',
|
'domain' => 'Domain',
|
||||||
'single_user_mode' => 'Disable user registration',
|
'single_user_mode' => 'Disable user registration',
|
||||||
|
@ -22,254 +22,300 @@ declare(strict_types=1);
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
return [
|
return [
|
||||||
// status of import:
|
// ALL breadcrumbs and subtitles:
|
||||||
'status_wait_title' => 'Please hold...',
|
'index_breadcrumb' => 'Import data into Firefly III',
|
||||||
'status_wait_text' => 'This box will disappear in a moment.',
|
'prerequisites_breadcrumb_fake' => 'Prerequisites for the fake import provider',
|
||||||
'status_fatal_title' => 'A fatal error occurred',
|
'job_configuration_breadcrumb' => 'Configuration for ":key"',
|
||||||
'status_fatal_text' => 'A fatal error occurred, which the import-routine cannot recover from. Please see the explanation in red below.',
|
'job_status_breadcrumb' => 'Import status for ":key"',
|
||||||
'status_fatal_more' => 'If the error is a time-out, the import will have stopped half-way. For some server configurations, it is merely the server that stopped while the import keeps running in the background. To verify this, check out the log files. If the problem persists, consider importing over the command line instead.',
|
|
||||||
'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_new' => 'The job is brand new.',
|
|
||||||
'status_job_configuring' => 'The import is being configured.',
|
|
||||||
'status_job_configured' => 'The import is configured.',
|
|
||||||
'status_job_running' => 'The import is running.. Please wait..',
|
|
||||||
'status_job_storing' => 'The import is storing your data.. Please wait..',
|
|
||||||
'status_job_error' => 'The job has generated an error.',
|
|
||||||
'status_job_finished' => 'The import has finished!',
|
|
||||||
'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_with_count' => 'One transaction has been imported|:count transactions have been imported.',
|
|
||||||
'job_status_breadcrumb' => 'Import job state',
|
|
||||||
|
|
||||||
'status_bread_crumb' => 'Import status',
|
|
||||||
'status_sub_title' => 'Import status',
|
|
||||||
'config_sub_title' => 'Set up your import',
|
|
||||||
'import_config_bread_crumb' => 'Import configuration',
|
|
||||||
'status_finished_job' => 'The :count transactions imported can be found in tag <a href=":link" class="label label-success" style="font-size:100%;font-weight:normal;">:tag</a>.',
|
|
||||||
'status_finished_no_tag' => 'Firefly III has not collected any transactions from your import file.',
|
|
||||||
'import_with_key' => 'Import with key \':key\'',
|
|
||||||
'finished_with_errors' => 'The import reported some problems.',
|
|
||||||
|
|
||||||
// file, upload something
|
|
||||||
'file_upload_title' => 'Import setup (1/4) - Upload your file',
|
|
||||||
'file_upload_text' => 'This routine will help you import files from your bank into Firefly III. Please check out the help pages in the top right corner.',
|
|
||||||
'file_upload_fields' => 'Fields',
|
|
||||||
'file_upload_help' => 'Select your file. Please make sure the file is UTF-8 encoded.',
|
|
||||||
'file_upload_config_help' => 'If you have previously imported data into Firefly III, you may have a configuration file, which will pre-set configuration values for you. For some banks, other users have kindly provided their <a href="https://github.com/firefly-iii/import-configurations/wiki">configuration file</a>',
|
|
||||||
'file_upload_type_help' => 'Select the type of file you will upload',
|
|
||||||
'file_upload_submit' => 'Upload files',
|
|
||||||
|
|
||||||
// file, upload types
|
|
||||||
'import_file_type_csv' => 'CSV (comma separated values)',
|
|
||||||
|
|
||||||
// file, initial config for CSV
|
|
||||||
'csv_initial_title' => 'Import setup (2/4) - Basic CSV import setup',
|
|
||||||
'csv_initial_text' => 'To be able to import your file correctly, please validate the options below.',
|
|
||||||
'csv_initial_box' => 'Basic CSV import setup',
|
|
||||||
'csv_initial_box_title' => 'Basic CSV import setup options',
|
|
||||||
'csv_initial_header_help' => 'Check this box if the first row of your CSV file are the column titles.',
|
|
||||||
'csv_initial_date_help' => 'Date time format in your CSV. Follow the format like <a href="https://secure.php.net/manual/en/datetime.createfromformat.php#refsect1-datetime.createfromformat-parameters">this page</a> indicates. The default value will parse dates that look like this: :dateExample.',
|
|
||||||
'csv_initial_delimiter_help' => 'Choose the field delimiter that is used in your input file. If not sure, comma is the safest option.',
|
|
||||||
'csv_initial_import_account_help' => 'If your CSV file does NOT contain information about your asset account(s), use this dropdown to select to which account the transactions in the CSV belong to.',
|
|
||||||
'csv_initial_submit' => 'Continue with step 3/4',
|
|
||||||
|
|
||||||
// file, new options:
|
|
||||||
'file_apply_rules_title' => 'Apply rules',
|
|
||||||
'file_apply_rules_description' => 'Apply your rules. Note that this slows the import significantly.',
|
|
||||||
'file_match_bills_title' => 'Match bills',
|
|
||||||
'file_match_bills_description' => 'Match your bills to newly created withdrawals. Note that this slows the import significantly.',
|
|
||||||
|
|
||||||
// file, roles config
|
|
||||||
'csv_roles_title' => 'Import setup (3/4) - Define each column\'s role',
|
|
||||||
'csv_roles_text' => 'Each column in your CSV file contains certain data. Please indicate what kind of data the importer should expect. The option to "map" data means that you will link each entry found in the column to a value in your database. An often mapped column is the column that contains the IBAN of the opposing account. That can be easily matched to IBAN\'s present in your database already.',
|
|
||||||
'csv_roles_table' => 'Table',
|
|
||||||
'csv_roles_column_name' => 'Name of column',
|
|
||||||
'csv_roles_column_example' => 'Column example data',
|
|
||||||
'csv_roles_column_role' => 'Column data meaning',
|
|
||||||
'csv_roles_do_map_value' => 'Map these values',
|
|
||||||
'csv_roles_column' => 'Column',
|
|
||||||
'csv_roles_no_example_data' => 'No example data available',
|
|
||||||
'csv_roles_submit' => 'Continue with step 4/4',
|
|
||||||
|
|
||||||
// not csv, but normal warning
|
|
||||||
'roles_warning' => 'At the very least, mark one column as the amount-column. It is advisable to also select a column for the description, date and the opposing account.',
|
|
||||||
'foreign_amount_warning' => 'If you mark a column as containing an amount in a foreign currency, you must also set the column that contains which currency it is.',
|
|
||||||
|
|
||||||
// file, map data
|
|
||||||
'file_map_title' => 'Import setup (4/4) - Connect import data to Firefly III data',
|
|
||||||
'file_map_text' => 'In the following tables, the left value shows you information found in your uploaded file. It is your task to map this value, if possible, to a value already present in your database. Firefly will stick to this mapping. If there is no value to map to, or you do not wish to map the specific value, select nothing.',
|
|
||||||
'file_map_field_value' => 'Field value',
|
|
||||||
'file_map_field_mapped_to' => 'Mapped to',
|
|
||||||
'map_do_not_map' => '(do not map)',
|
|
||||||
'file_map_submit' => 'Start the import',
|
|
||||||
'file_nothing_to_map' => 'There is no data present in your file that you can map to existing values. Please press "Start the import" to continue.',
|
|
||||||
|
|
||||||
// map things.
|
|
||||||
'column__ignore' => '(ignore this column)',
|
|
||||||
'column_account-iban' => 'Asset account (IBAN)',
|
|
||||||
'column_account-id' => 'Asset account ID (matching FF3)',
|
|
||||||
'column_account-name' => 'Asset account (name)',
|
|
||||||
'column_amount' => 'Amount',
|
|
||||||
'column_amount_foreign' => 'Amount (in foreign currency)',
|
|
||||||
'column_amount_debit' => 'Amount (debit column)',
|
|
||||||
'column_amount_credit' => 'Amount (credit column)',
|
|
||||||
'column_amount-comma-separated' => 'Amount (comma as decimal separator)',
|
|
||||||
'column_bill-id' => 'Bill ID (matching FF3)',
|
|
||||||
'column_bill-name' => 'Bill name',
|
|
||||||
'column_budget-id' => 'Budget ID (matching FF3)',
|
|
||||||
'column_budget-name' => 'Budget name',
|
|
||||||
'column_category-id' => 'Category ID (matching FF3)',
|
|
||||||
'column_category-name' => 'Category name',
|
|
||||||
'column_currency-code' => 'Currency code (ISO 4217)',
|
|
||||||
'column_foreign-currency-code' => 'Foreign currency code (ISO 4217)',
|
|
||||||
'column_currency-id' => 'Currency ID (matching FF3)',
|
|
||||||
'column_currency-name' => 'Currency name (matching FF3)',
|
|
||||||
'column_currency-symbol' => 'Currency symbol (matching FF3)',
|
|
||||||
'column_date-interest' => 'Interest calculation date',
|
|
||||||
'column_date-book' => 'Transaction booking date',
|
|
||||||
'column_date-process' => 'Transaction process date',
|
|
||||||
'column_date-transaction' => 'Date',
|
|
||||||
'column_date-due' => 'Transaction due date',
|
|
||||||
'column_date-payment' => 'Transaction payment date',
|
|
||||||
'column_date-invoice' => 'Transaction invoice date',
|
|
||||||
'column_description' => 'Description',
|
|
||||||
'column_opposing-iban' => 'Opposing account (IBAN)',
|
|
||||||
'column_opposing-bic' => 'Opposing account (BIC)',
|
|
||||||
'column_opposing-id' => 'Opposing account ID (matching FF3)',
|
|
||||||
'column_external-id' => 'External ID',
|
|
||||||
'column_opposing-name' => 'Opposing account (name)',
|
|
||||||
'column_rabo-debit-credit' => 'Rabobank specific debit/credit indicator',
|
|
||||||
'column_ing-debit-credit' => 'ING specific debit/credit indicator',
|
|
||||||
'column_sepa-ct-id' => 'SEPA end-to-end Identifier',
|
|
||||||
'column_sepa-ct-op' => 'SEPA Opposing Account Identifier',
|
|
||||||
'column_sepa-db' => 'SEPA Mandate Identifier',
|
|
||||||
'column_sepa-cc' => 'SEPA Clearing Code',
|
|
||||||
'column_sepa-ci' => 'SEPA Creditor Identifier',
|
|
||||||
'column_sepa-ep' => 'SEPA External Purpose',
|
|
||||||
'column_sepa-country' => 'SEPA Country Code',
|
|
||||||
'column_tags-comma' => 'Tags (comma separated)',
|
|
||||||
'column_tags-space' => 'Tags (space separated)',
|
|
||||||
'column_account-number' => 'Asset account (account number)',
|
|
||||||
'column_opposing-number' => 'Opposing account (account number)',
|
|
||||||
'column_note' => 'Note(s)',
|
|
||||||
'column_internal-reference' => 'Internal reference',
|
|
||||||
|
|
||||||
// prerequisites
|
|
||||||
'prerequisites' => 'Prerequisites',
|
|
||||||
'prerequisites_breadcrumb_fake' => 'Prerequisites for fake provider',
|
|
||||||
'prerequisites_breadcrumb_file' => 'Prerequisites for file imports',
|
|
||||||
'prerequisites_breadcrumb_bunq' => 'Prerequisites for Bunq',
|
|
||||||
'prerequisites_breadcrumb_spectre' => 'Prerequisites for Spectre',
|
|
||||||
'prerequisites_breadcrumb_plaid' => 'Prerequisites for Plaid',
|
|
||||||
'prerequisites_breadcrumb_quovo' => 'Prerequisites for Quovo',
|
|
||||||
'prerequisites_breadcrumb_yodlee' => 'Prerequisites for Yodlee',
|
|
||||||
|
|
||||||
// success messages:
|
|
||||||
'prerequisites_saved_for_fake' => 'API key stored for fake provider',
|
|
||||||
'prerequisites_saved_for_file' => 'Data stored for file imports',
|
|
||||||
'prerequisites_saved_for_bunq' => 'API key and IP stored for bunq',
|
|
||||||
'prerequisites_saved_for_spectre' => 'App ID and secret stored for Spectre',
|
|
||||||
'prerequisites_saved_for_plaid' => 'Data stored for Plaid',
|
|
||||||
'prerequisites_saved_for_quovo' => 'Data stored for Quovo',
|
|
||||||
'prerequisites_saved_for_yodlee' => 'Data stored for Yodlee',
|
|
||||||
|
|
||||||
// index of import:
|
|
||||||
'general_index_title' => 'Import a file',
|
|
||||||
'general_index_intro' => 'Welcome to Firefly III\'s import routine. There are a few ways of importing data into Firefly III, displayed here as buttons.',
|
|
||||||
'bad_job_status' => 'You cannot access this page when the job is at this point. Sorry!',
|
|
||||||
|
|
||||||
|
// index page:
|
||||||
|
'general_index_title' => 'Import a file',
|
||||||
|
'general_index_intro' => 'Welcome to Firefly III\'s import routine. There are a few ways of importing data into Firefly III, displayed here as buttons.',
|
||||||
// import provider strings (index):
|
// import provider strings (index):
|
||||||
'button_fake' => 'Fake an import',
|
'button_fake' => 'Fake an import',
|
||||||
'button_file' => 'Import a file',
|
'button_file' => 'Import a file',
|
||||||
'button_bunq' => 'Import from bunq',
|
'button_bunq' => 'Import from bunq',
|
||||||
'button_spectre' => 'Import using Spectre',
|
'button_spectre' => 'Import using Spectre',
|
||||||
'button_plaid' => 'Import using Plaid',
|
'button_plaid' => 'Import using Plaid',
|
||||||
'button_yodlee' => 'Import using Yodlee',
|
'button_yodlee' => 'Import using Yodlee',
|
||||||
'button_quovo' => 'Import using Quovo',
|
'button_quovo' => 'Import using Quovo',
|
||||||
|
// global config box (index)
|
||||||
|
'global_config_title' => 'Global import configuration',
|
||||||
|
'global_config_text' => 'In the future, this box will feature preferences that apply to ALL import providers above.',
|
||||||
|
// prerequisites box (index)
|
||||||
|
'need_prereq_title' => 'Import prerequisites',
|
||||||
|
'need_prereq_intro' => 'Some import methods need your attention before they can be used. For example, they might require special API keys or application secrets. You can configure them here. The icon indicates if these prerequisites have been met.',
|
||||||
|
'do_prereq_fake' => 'Prerequisites for the fake provider',
|
||||||
|
'do_prereq_file' => 'Prerequisites for file imports',
|
||||||
|
'do_prereq_bunq' => 'Prerequisites for imports from bunq',
|
||||||
|
'do_prereq_spectre' => 'Prerequisites for imports using Spectre',
|
||||||
|
'do_prereq_plaid' => 'Prerequisites for imports using Plaid',
|
||||||
|
'do_prereq_yodlee' => 'Prerequisites for imports using Yodlee',
|
||||||
|
'do_prereq_quovo' => 'Prerequisites for imports using Quovo',
|
||||||
|
// provider config box (index)
|
||||||
|
'can_config_title' => 'Import configuration',
|
||||||
|
'can_config_intro' => 'Some import methods can be configured to your liking. They have extra settings you can tweak.',
|
||||||
|
'do_config_fake' => 'Configuration for the fake provider',
|
||||||
|
'do_config_file' => 'Configuration for file imports',
|
||||||
|
'do_config_bunq' => 'Configuration for bunq imports',
|
||||||
|
'do_config_spectre' => 'Configuration for imports from Spectre',
|
||||||
|
'do_config_plaid' => 'Configuration for imports from Plaid',
|
||||||
|
'do_config_yodlee' => 'Configuration for imports from Yodlee',
|
||||||
|
'do_config_quovo' => 'Configuration for imports from Quovo',
|
||||||
|
|
||||||
// global config box
|
// prerequisites:
|
||||||
'global_config_title' => 'Global import configuration',
|
'prereq_fake_title' => 'Prerequisites for an import from the fake import provider',
|
||||||
'global_config_text' => 'In the future, this box will feature preferences that apply to ALL import providers above.',
|
'prereq_fake_text' => 'This fake provider requires a fake API key. It must be 32 characters long. You can use this one: 123456789012345678901234567890AA',
|
||||||
|
// prerequisites success messages:
|
||||||
// prereq box:
|
'prerequisites_saved_for_fake' => 'Fake API key stored successfully!',
|
||||||
'need_prereq_title' => 'Import prerequisites',
|
|
||||||
'need_prereq_intro' => 'Some import methods need your attention before they can be used. For example, they might require special API keys or application secrets. You can configure them here. The icon indicates if these prerequisites have been met.',
|
|
||||||
'do_prereq_fake' => 'Prerequisites for the fake provider',
|
|
||||||
'do_prereq_file' => 'Prerequisites for file imports',
|
|
||||||
'do_prereq_bunq' => 'Prerequisites for imports from bunq',
|
|
||||||
'do_prereq_spectre' => 'Prerequisites for imports using Spectre',
|
|
||||||
'do_prereq_plaid' => 'Prerequisites for imports using Plaid',
|
|
||||||
'do_prereq_yodlee' => 'Prerequisites for imports using Yodlee',
|
|
||||||
'do_prereq_quovo' => 'Prerequisites for imports using Quovo',
|
|
||||||
|
|
||||||
// provider config box:
|
|
||||||
'can_config_title' => 'Import configuration',
|
|
||||||
'can_config_intro' => 'Some import methods can be configured to your liking. They have extra settings you can tweak.',
|
|
||||||
'do_config_fake' => 'Configuration for the fake provider',
|
|
||||||
'do_config_file' => 'Configuration for file imports',
|
|
||||||
'do_config_bunq' => 'Configuration for bunq imports',
|
|
||||||
'do_config_spectre' => 'Configuration for imports from Spectre',
|
|
||||||
'do_config_plaid' => 'Configuration for imports from Plaid',
|
|
||||||
'do_config_yodlee' => 'Configuration for imports from Yodlee',
|
|
||||||
'do_config_quovo' => 'Configuration for imports from Quovo',
|
|
||||||
|
|
||||||
// job configuration:
|
// job configuration:
|
||||||
'job_configuration_breadcrumb' => 'Configuration for job ":key"',
|
'job_config_apply_rules_title' => 'Job configuration - apply your rules?',
|
||||||
|
'job_config_apply_rules_text' => 'Once the fake provider has run, your rules can be applied to the transactions. This adds time to the import.',
|
||||||
|
'job_config_input' => 'Your input',
|
||||||
|
// job configuration for the fake provider:
|
||||||
|
'job_config_fake_artist_title' => 'Enter album name',
|
||||||
|
'job_config_fake_artist_text' => 'Many import routines have a few configuration steps you must go through. In the case of the fake import provider, you must answer some weird questions. In this case, enter "David Bowie" to continue.',
|
||||||
|
'job_config_fake_song_title' => 'Enter song name',
|
||||||
|
'job_config_fake_song_text' => 'Mention the song "Golden years" to continue with the fake import.',
|
||||||
|
'job_config_fake_album_title' => 'Enter album name',
|
||||||
|
'job_config_fake_album_text' => 'Some import routines require extra data halfway through the import. In the case of the fake import provider, you must answer some weird questions. In this case, enter "station to station" to continue.',
|
||||||
|
|
||||||
// import index page:
|
// import status page:
|
||||||
'index_breadcrumb' => 'Index',
|
'import_with_key' => 'Import with key \':key\'',
|
||||||
'upload_error' => 'The file you have uploaded could not be processed. Possibly it is of an invalid file type or encoding. The log files will have more information.',
|
'status_wait_title' => 'Please hold...',
|
||||||
|
'status_wait_text' => 'This box will disappear in a moment.',
|
||||||
|
'status_running_title' => 'The import is running',
|
||||||
|
'status_job_running' => 'Please wait, running the import...',
|
||||||
|
'status_job_storing' => 'Please wait, storing data...',
|
||||||
|
'status_fatal_title' => 'Fatal error',
|
||||||
|
'status_fatal_text' => 'The import has suffered from an error it could not recover from. Apologies!',
|
||||||
|
'status_fatal_more' => 'This (possibly very cryptic) error message is complemented by log files, which you can find on your hard drive, or in the Docker container where you run Firefly III from.',
|
||||||
|
'status_finished_title' => 'Import finished',
|
||||||
|
'status_finished_text' => 'The import has finished.',
|
||||||
|
'finished_with_errors' => 'There were some errors during the import. Please review them carefully.',
|
||||||
|
'unknown_import_result' => 'Unknown import result',
|
||||||
|
'result_no_transactions' => 'No transactions have been imported. Perhaps they were all duplicates is simply no transactions where present to be imported. Perhaps the error message below can tell you what happened.',
|
||||||
|
'result_one_transaction' => 'Exactly one transaction has been imported. It is stored under tag <a href=":route" class="label label-success" style="font-size:100%;font-weight:normal;">:tag</a> where you can inspect it further.',
|
||||||
|
'result_many_transactions' => 'Firefly III has imported :count transactions. They are stored under tag <a href=":route" class="label label-success" style="font-size:100%;font-weight:normal;">:tag</a> where you can inspect them further.',
|
||||||
|
|
||||||
|
|
||||||
// bunq
|
// general errors and warnings:
|
||||||
'bunq_prerequisites_title' => 'Prerequisites for an import from bunq',
|
'bad_job_status' => 'To access this page, your import job cannot have status ":status".',
|
||||||
'bunq_prerequisites_text' => 'In order to import from bunq, you need to obtain an API key. You can do this through the app. Please note that the import function for bunq is in BETA. It has only been tested against the sandbox API.',
|
|
||||||
'bunq_prerequisites_text_ip' => 'Bunq requires your externally facing IP address. Firefly III has tried to fill this in using <a href="https://www.ipify.org/">the ipify service</a>. Make sure this IP address is correct, or the import will fail.',
|
|
||||||
'bunq_do_import' => 'Yes, import from this account',
|
|
||||||
'bunq_accounts_title' => 'Bunq accounts',
|
|
||||||
'bunq_accounts_text' => 'These are the accounts associated with your bunq account. Please select the accounts from which you want to import, and in which account the transactions must be imported.',
|
|
||||||
|
|
||||||
// Spectre
|
|
||||||
'spectre_title' => 'Import using Spectre',
|
|
||||||
'spectre_prerequisites_title' => 'Prerequisites for an import using Spectre',
|
|
||||||
'spectre_prerequisites_text' => 'In order to import data using the Spectre API (v4), you must provide Firefly III with two secret values. They can be found on the <a href="https://www.saltedge.com/clients/profile/secrets">secrets page</a>.',
|
|
||||||
'spectre_enter_pub_key' => 'The import will only work when you enter this public key on your <a href="https://www.saltedge.com/clients/profile/secrets">secrets page</a>.',
|
|
||||||
'spectre_accounts_title' => 'Select accounts to import from',
|
|
||||||
'spectre_accounts_text' => 'Each account on the left below has been found by Spectre and can be imported into Firefly III. Please select the asset account that should hold any given transactions. If you do not wish to import from any particular account, remove the check from the checkbox.',
|
|
||||||
'spectre_do_import' => 'Yes, import from this account',
|
|
||||||
'spectre_no_supported_accounts' => 'You cannot import from this account due to a currency mismatch.',
|
|
||||||
|
|
||||||
// keys from "extra" array:
|
// status of import:
|
||||||
'spectre_extra_key_iban' => 'IBAN',
|
// 'status_wait_title' => 'Please hold...',
|
||||||
'spectre_extra_key_swift' => 'SWIFT',
|
// 'status_wait_text' => 'This box will disappear in a moment.',
|
||||||
'spectre_extra_key_status' => 'Status',
|
// 'status_fatal_title' => 'A fatal error occurred',
|
||||||
'spectre_extra_key_card_type' => 'Card type',
|
// 'status_fatal_text' => 'A fatal error occurred, which the import-routine cannot recover from. Please see the explanation in red below.',
|
||||||
'spectre_extra_key_account_name' => 'Account name',
|
// 'status_fatal_more' => 'If the error is a time-out, the import will have stopped half-way. For some server configurations, it is merely the server that stopped while the import keeps running in the background. To verify this, check out the log files. If the problem persists, consider importing over the command line instead.',
|
||||||
'spectre_extra_key_client_name' => 'Client name',
|
// 'status_ready_title' => 'Import is ready to start',
|
||||||
'spectre_extra_key_account_number' => 'Account number',
|
// '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.',
|
||||||
'spectre_extra_key_blocked_amount' => 'Blocked amount',
|
// '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.',
|
||||||
'spectre_extra_key_available_amount' => 'Available amount',
|
// 'status_ready_config' => 'Download configuration',
|
||||||
'spectre_extra_key_credit_limit' => 'Credit limit',
|
// 'status_ready_start' => 'Start the import',
|
||||||
'spectre_extra_key_interest_rate' => 'Interest rate',
|
// '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.',
|
||||||
'spectre_extra_key_expiry_date' => 'Expiry date',
|
// 'status_job_new' => 'The job is brand new.',
|
||||||
'spectre_extra_key_open_date' => 'Open date',
|
// 'status_job_configuring' => 'The import is being configured.',
|
||||||
'spectre_extra_key_current_time' => 'Current time',
|
// 'status_job_configured' => 'The import is configured.',
|
||||||
'spectre_extra_key_current_date' => 'Current date',
|
// 'status_job_running' => 'The import is running.. Please wait..',
|
||||||
'spectre_extra_key_cards' => 'Cards',
|
// 'status_job_storing' => 'The import is storing your data.. Please wait..',
|
||||||
'spectre_extra_key_units' => 'Units',
|
// 'status_job_error' => 'The job has generated an error.',
|
||||||
'spectre_extra_key_unit_price' => 'Unit price',
|
// 'status_job_finished' => 'The import has finished!',
|
||||||
'spectre_extra_key_transactions_count' => 'Transaction count',
|
// '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_with_count' => 'One transaction has been imported|:count transactions have been imported.',
|
||||||
|
// 'job_status_breadcrumb' => 'Import job state',
|
||||||
|
//
|
||||||
|
// 'status_bread_crumb' => 'Import status',
|
||||||
|
// 'status_sub_title' => 'Import status',
|
||||||
|
// 'config_sub_title' => 'Set up your import',
|
||||||
|
// 'import_config_bread_crumb' => 'Import configuration',
|
||||||
|
// 'status_finished_job' => 'The :count transactions imported can be found in tag <a href=":link" class="label label-success" style="font-size:100%;font-weight:normal;">:tag</a>.',
|
||||||
|
// 'status_finished_no_tag' => 'Firefly III has not collected any transactions from your import file.',
|
||||||
|
// 'import_with_key' => 'Import with key \':key\'',
|
||||||
|
// 'finished_with_errors' => 'The import reported some problems.',
|
||||||
|
//
|
||||||
|
// // file, upload something
|
||||||
|
// 'file_upload_title' => 'Import setup (1/4) - Upload your file',
|
||||||
|
// 'file_upload_text' => 'This routine will help you import files from your bank into Firefly III. Please check out the help pages in the top right corner.',
|
||||||
|
// 'file_upload_fields' => 'Fields',
|
||||||
|
// 'file_upload_help' => 'Select your file. Please make sure the file is UTF-8 encoded.',
|
||||||
|
// 'file_upload_config_help' => 'If you have previously imported data into Firefly III, you may have a configuration file, which will pre-set configuration values for you. For some banks, other users have kindly provided their <a href="https://github.com/firefly-iii/import-configurations/wiki">configuration file</a>',
|
||||||
|
// 'file_upload_type_help' => 'Select the type of file you will upload',
|
||||||
|
// 'file_upload_submit' => 'Upload files',
|
||||||
|
//
|
||||||
|
// // file, upload types
|
||||||
|
// 'import_file_type_csv' => 'CSV (comma separated values)',
|
||||||
|
//
|
||||||
|
// // file, initial config for CSV
|
||||||
|
// 'csv_initial_title' => 'Import setup (2/4) - Basic CSV import setup',
|
||||||
|
// 'csv_initial_text' => 'To be able to import your file correctly, please validate the options below.',
|
||||||
|
// 'csv_initial_box' => 'Basic CSV import setup',
|
||||||
|
// 'csv_initial_box_title' => 'Basic CSV import setup options',
|
||||||
|
// 'csv_initial_header_help' => 'Check this box if the first row of your CSV file are the column titles.',
|
||||||
|
// 'csv_initial_date_help' => 'Date time format in your CSV. Follow the format like <a href="https://secure.php.net/manual/en/datetime.createfromformat.php#refsect1-datetime.createfromformat-parameters">this page</a> indicates. The default value will parse dates that look like this: :dateExample.',
|
||||||
|
// 'csv_initial_delimiter_help' => 'Choose the field delimiter that is used in your input file. If not sure, comma is the safest option.',
|
||||||
|
// 'csv_initial_import_account_help' => 'If your CSV file does NOT contain information about your asset account(s), use this dropdown to select to which account the transactions in the CSV belong to.',
|
||||||
|
// 'csv_initial_submit' => 'Continue with step 3/4',
|
||||||
|
//
|
||||||
|
// // file, new options:
|
||||||
|
// 'file_apply_rules_title' => 'Apply rules',
|
||||||
|
// 'file_apply_rules_description' => 'Apply your rules. Note that this slows the import significantly.',
|
||||||
|
// 'file_match_bills_title' => 'Match bills',
|
||||||
|
// 'file_match_bills_description' => 'Match your bills to newly created withdrawals. Note that this slows the import significantly.',
|
||||||
|
//
|
||||||
|
// // file, roles config
|
||||||
|
// 'csv_roles_title' => 'Import setup (3/4) - Define each column\'s role',
|
||||||
|
// 'csv_roles_text' => 'Each column in your CSV file contains certain data. Please indicate what kind of data the importer should expect. The option to "map" data means that you will link each entry found in the column to a value in your database. An often mapped column is the column that contains the IBAN of the opposing account. That can be easily matched to IBAN\'s present in your database already.',
|
||||||
|
// 'csv_roles_table' => 'Table',
|
||||||
|
// 'csv_roles_column_name' => 'Name of column',
|
||||||
|
// 'csv_roles_column_example' => 'Column example data',
|
||||||
|
// 'csv_roles_column_role' => 'Column data meaning',
|
||||||
|
// 'csv_roles_do_map_value' => 'Map these values',
|
||||||
|
// 'csv_roles_column' => 'Column',
|
||||||
|
// 'csv_roles_no_example_data' => 'No example data available',
|
||||||
|
// 'csv_roles_submit' => 'Continue with step 4/4',
|
||||||
|
//
|
||||||
|
// // not csv, but normal warning
|
||||||
|
// 'roles_warning' => 'At the very least, mark one column as the amount-column. It is advisable to also select a column for the description, date and the opposing account.',
|
||||||
|
// 'foreign_amount_warning' => 'If you mark a column as containing an amount in a foreign currency, you must also set the column that contains which currency it is.',
|
||||||
|
//
|
||||||
|
// // file, map data
|
||||||
|
// 'file_map_title' => 'Import setup (4/4) - Connect import data to Firefly III data',
|
||||||
|
// 'file_map_text' => 'In the following tables, the left value shows you information found in your uploaded file. It is your task to map this value, if possible, to a value already present in your database. Firefly will stick to this mapping. If there is no value to map to, or you do not wish to map the specific value, select nothing.',
|
||||||
|
// 'file_map_field_value' => 'Field value',
|
||||||
|
// 'file_map_field_mapped_to' => 'Mapped to',
|
||||||
|
// 'map_do_not_map' => '(do not map)',
|
||||||
|
// 'file_map_submit' => 'Start the import',
|
||||||
|
// 'file_nothing_to_map' => 'There is no data present in your file that you can map to existing values. Please press "Start the import" to continue.',
|
||||||
|
//
|
||||||
|
// // map things.
|
||||||
|
// 'column__ignore' => '(ignore this column)',
|
||||||
|
// 'column_account-iban' => 'Asset account (IBAN)',
|
||||||
|
// 'column_account-id' => 'Asset account ID (matching FF3)',
|
||||||
|
// 'column_account-name' => 'Asset account (name)',
|
||||||
|
// 'column_amount' => 'Amount',
|
||||||
|
// 'column_amount_foreign' => 'Amount (in foreign currency)',
|
||||||
|
// 'column_amount_debit' => 'Amount (debit column)',
|
||||||
|
// 'column_amount_credit' => 'Amount (credit column)',
|
||||||
|
// 'column_amount-comma-separated' => 'Amount (comma as decimal separator)',
|
||||||
|
// 'column_bill-id' => 'Bill ID (matching FF3)',
|
||||||
|
// 'column_bill-name' => 'Bill name',
|
||||||
|
// 'column_budget-id' => 'Budget ID (matching FF3)',
|
||||||
|
// 'column_budget-name' => 'Budget name',
|
||||||
|
// 'column_category-id' => 'Category ID (matching FF3)',
|
||||||
|
// 'column_category-name' => 'Category name',
|
||||||
|
// 'column_currency-code' => 'Currency code (ISO 4217)',
|
||||||
|
// 'column_foreign-currency-code' => 'Foreign currency code (ISO 4217)',
|
||||||
|
// 'column_currency-id' => 'Currency ID (matching FF3)',
|
||||||
|
// 'column_currency-name' => 'Currency name (matching FF3)',
|
||||||
|
// 'column_currency-symbol' => 'Currency symbol (matching FF3)',
|
||||||
|
// 'column_date-interest' => 'Interest calculation date',
|
||||||
|
// 'column_date-book' => 'Transaction booking date',
|
||||||
|
// 'column_date-process' => 'Transaction process date',
|
||||||
|
// 'column_date-transaction' => 'Date',
|
||||||
|
// 'column_date-due' => 'Transaction due date',
|
||||||
|
// 'column_date-payment' => 'Transaction payment date',
|
||||||
|
// 'column_date-invoice' => 'Transaction invoice date',
|
||||||
|
// 'column_description' => 'Description',
|
||||||
|
// 'column_opposing-iban' => 'Opposing account (IBAN)',
|
||||||
|
// 'column_opposing-bic' => 'Opposing account (BIC)',
|
||||||
|
// 'column_opposing-id' => 'Opposing account ID (matching FF3)',
|
||||||
|
// 'column_external-id' => 'External ID',
|
||||||
|
// 'column_opposing-name' => 'Opposing account (name)',
|
||||||
|
// 'column_rabo-debit-credit' => 'Rabobank specific debit/credit indicator',
|
||||||
|
// 'column_ing-debit-credit' => 'ING specific debit/credit indicator',
|
||||||
|
// 'column_sepa-ct-id' => 'SEPA end-to-end Identifier',
|
||||||
|
// 'column_sepa-ct-op' => 'SEPA Opposing Account Identifier',
|
||||||
|
// 'column_sepa-db' => 'SEPA Mandate Identifier',
|
||||||
|
// 'column_sepa-cc' => 'SEPA Clearing Code',
|
||||||
|
// 'column_sepa-ci' => 'SEPA Creditor Identifier',
|
||||||
|
// 'column_sepa-ep' => 'SEPA External Purpose',
|
||||||
|
// 'column_sepa-country' => 'SEPA Country Code',
|
||||||
|
// 'column_tags-comma' => 'Tags (comma separated)',
|
||||||
|
// 'column_tags-space' => 'Tags (space separated)',
|
||||||
|
// 'column_account-number' => 'Asset account (account number)',
|
||||||
|
// 'column_opposing-number' => 'Opposing account (account number)',
|
||||||
|
// 'column_note' => 'Note(s)',
|
||||||
|
// 'column_internal-reference' => 'Internal reference',
|
||||||
|
//
|
||||||
|
// // prerequisites
|
||||||
|
// 'prerequisites' => 'Prerequisites',
|
||||||
|
// 'prerequisites_breadcrumb_fake' => 'Prerequisites for fake provider',
|
||||||
|
// 'prerequisites_breadcrumb_file' => 'Prerequisites for file imports',
|
||||||
|
// 'prerequisites_breadcrumb_bunq' => 'Prerequisites for Bunq',
|
||||||
|
// 'prerequisites_breadcrumb_spectre' => 'Prerequisites for Spectre',
|
||||||
|
// 'prerequisites_breadcrumb_plaid' => 'Prerequisites for Plaid',
|
||||||
|
// 'prerequisites_breadcrumb_quovo' => 'Prerequisites for Quovo',
|
||||||
|
// 'prerequisites_breadcrumb_yodlee' => 'Prerequisites for Yodlee',
|
||||||
|
//
|
||||||
|
// // success messages:
|
||||||
|
// 'prerequisites_saved_for_fake' => 'API key stored for fake provider',
|
||||||
|
// 'prerequisites_saved_for_file' => 'Data stored for file imports',
|
||||||
|
// 'prerequisites_saved_for_bunq' => 'API key and IP stored for bunq',
|
||||||
|
// 'prerequisites_saved_for_spectre' => 'App ID and secret stored for Spectre',
|
||||||
|
// 'prerequisites_saved_for_plaid' => 'Data stored for Plaid',
|
||||||
|
// 'prerequisites_saved_for_quovo' => 'Data stored for Quovo',
|
||||||
|
// 'prerequisites_saved_for_yodlee' => 'Data stored for Yodlee',
|
||||||
|
//
|
||||||
|
|
||||||
// various other strings:
|
//
|
||||||
'imported_from_account' => 'Imported from ":account"',
|
|
||||||
|
//
|
||||||
|
// // job configuration:
|
||||||
|
// 'job_configuration_breadcrumb' => 'Configuration for job ":key"',
|
||||||
|
//
|
||||||
|
// // import index page:
|
||||||
|
// 'index_breadcrumb' => 'Index',
|
||||||
|
// 'upload_error' => 'The file you have uploaded could not be processed. Possibly it is of an invalid file type or encoding. The log files will have more information.',
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// // bunq
|
||||||
|
// 'bunq_prerequisites_title' => 'Prerequisites for an import from bunq',
|
||||||
|
// 'bunq_prerequisites_text' => 'In order to import from bunq, you need to obtain an API key. You can do this through the app. Please note that the import function for bunq is in BETA. It has only been tested against the sandbox API.',
|
||||||
|
// 'bunq_prerequisites_text_ip' => 'Bunq requires your externally facing IP address. Firefly III has tried to fill this in using <a href="https://www.ipify.org/">the ipify service</a>. Make sure this IP address is correct, or the import will fail.',
|
||||||
|
// 'bunq_do_import' => 'Yes, import from this account',
|
||||||
|
// 'bunq_accounts_title' => 'Bunq accounts',
|
||||||
|
// 'bunq_accounts_text' => 'These are the accounts associated with your bunq account. Please select the accounts from which you want to import, and in which account the transactions must be imported.',
|
||||||
|
//
|
||||||
|
// // Spectre
|
||||||
|
// 'spectre_title' => 'Import using Spectre',
|
||||||
|
// 'spectre_prerequisites_title' => 'Prerequisites for an import using Spectre',
|
||||||
|
// 'spectre_prerequisites_text' => 'In order to import data using the Spectre API (v4), you must provide Firefly III with two secret values. They can be found on the <a href="https://www.saltedge.com/clients/profile/secrets">secrets page</a>.',
|
||||||
|
// 'spectre_enter_pub_key' => 'The import will only work when you enter this public key on your <a href="https://www.saltedge.com/clients/profile/secrets">secrets page</a>.',
|
||||||
|
// 'spectre_accounts_title' => 'Select accounts to import from',
|
||||||
|
// 'spectre_accounts_text' => 'Each account on the left below has been found by Spectre and can be imported into Firefly III. Please select the asset account that should hold any given transactions. If you do not wish to import from any particular account, remove the check from the checkbox.',
|
||||||
|
// 'spectre_do_import' => 'Yes, import from this account',
|
||||||
|
// 'spectre_no_supported_accounts' => 'You cannot import from this account due to a currency mismatch.',
|
||||||
|
//
|
||||||
|
// // keys from "extra" array:
|
||||||
|
// 'spectre_extra_key_iban' => 'IBAN',
|
||||||
|
// 'spectre_extra_key_swift' => 'SWIFT',
|
||||||
|
// 'spectre_extra_key_status' => 'Status',
|
||||||
|
// 'spectre_extra_key_card_type' => 'Card type',
|
||||||
|
// 'spectre_extra_key_account_name' => 'Account name',
|
||||||
|
// 'spectre_extra_key_client_name' => 'Client name',
|
||||||
|
// 'spectre_extra_key_account_number' => 'Account number',
|
||||||
|
// 'spectre_extra_key_blocked_amount' => 'Blocked amount',
|
||||||
|
// 'spectre_extra_key_available_amount' => 'Available amount',
|
||||||
|
// 'spectre_extra_key_credit_limit' => 'Credit limit',
|
||||||
|
// 'spectre_extra_key_interest_rate' => 'Interest rate',
|
||||||
|
// 'spectre_extra_key_expiry_date' => 'Expiry date',
|
||||||
|
// 'spectre_extra_key_open_date' => 'Open date',
|
||||||
|
// 'spectre_extra_key_current_time' => 'Current time',
|
||||||
|
// 'spectre_extra_key_current_date' => 'Current date',
|
||||||
|
// 'spectre_extra_key_cards' => 'Cards',
|
||||||
|
// 'spectre_extra_key_units' => 'Units',
|
||||||
|
// 'spectre_extra_key_unit_price' => 'Unit price',
|
||||||
|
// 'spectre_extra_key_transactions_count' => 'Transaction count',
|
||||||
|
//
|
||||||
|
// // various other strings:
|
||||||
|
// 'imported_from_account' => 'Imported from ":account"',
|
||||||
];
|
];
|
||||||
|
@ -8,11 +8,11 @@
|
|||||||
<div class="col-lg-12">
|
<div class="col-lg-12">
|
||||||
<div class="box">
|
<div class="box">
|
||||||
<div class="box-header with-border">
|
<div class="box-header with-border">
|
||||||
<h3 class="box-title">Rules</h3>
|
<h3 class="box-title">{{ trans('import.job_config_apply_rules_title') }}</h3>
|
||||||
</div>
|
</div>
|
||||||
<div class="box-body">
|
<div class="box-body">
|
||||||
<p>
|
<p>
|
||||||
Should apply rules?
|
{{ trans('import.job_config_apply_rules_text') }}
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -20,19 +20,19 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<form method="POST" action="{{ route('import.job.configuration.post', importJob.key) }}" accept-charset="UTF-8" class="form-horizontal" enctype="multipart/form-data">
|
<form method="POST" action="{{ route('import.job.configuration.post', importJob.key) }}" accept-charset="UTF-8" class="form-horizontal"
|
||||||
|
enctype="multipart/form-data">
|
||||||
<input name="_token" type="hidden" value="{{ csrf_token() }}">
|
<input name="_token" type="hidden" value="{{ csrf_token() }}">
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-lg-12">
|
<div class="col-lg-12">
|
||||||
<div class="box">
|
<div class="box">
|
||||||
<div class="box-header with-border">
|
<div class="box-header with-border">
|
||||||
<h3 class="box-title">Fields be here.</h3>
|
<h3 class="box-title">
|
||||||
|
{{ trans('import.job_config_input') }}
|
||||||
|
</h3>
|
||||||
</div>
|
</div>
|
||||||
<div class="box-body">
|
<div class="box-body">
|
||||||
<select name="apply-rules">
|
{{ ExpandedForm.select('apply_rules', data.rulesOptions) }}
|
||||||
<option value="1">yes</option>
|
|
||||||
<option value="0">no</option>
|
|
||||||
</select>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -8,11 +8,11 @@
|
|||||||
<div class="col-lg-12">
|
<div class="col-lg-12">
|
||||||
<div class="box">
|
<div class="box">
|
||||||
<div class="box-header with-border">
|
<div class="box-header with-border">
|
||||||
<h3 class="box-title">Enter station for fake import</h3>
|
<h3 class="box-title">{{ trans('import.job_config_fake_album_title') }}</h3>
|
||||||
</div>
|
</div>
|
||||||
<div class="box-body">
|
<div class="box-body">
|
||||||
<p>
|
<p>
|
||||||
Enter "station to station", no matter the capitalization.
|
{{ trans('import.job_config_fake_album_text') }}
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -26,7 +26,7 @@
|
|||||||
<div class="col-lg-12">
|
<div class="col-lg-12">
|
||||||
<div class="box">
|
<div class="box">
|
||||||
<div class="box-header with-border">
|
<div class="box-header with-border">
|
||||||
<h3 class="box-title">Fields be here.</h3>
|
<h3 class="box-title">{{ trans('import.job_config_input') }}</h3>
|
||||||
</div>
|
</div>
|
||||||
<div class="box-body">
|
<div class="box-body">
|
||||||
{{ ExpandedForm.text('album') }}
|
{{ ExpandedForm.text('album') }}
|
||||||
|
@ -8,11 +8,11 @@
|
|||||||
<div class="col-lg-12">
|
<div class="col-lg-12">
|
||||||
<div class="box">
|
<div class="box">
|
||||||
<div class="box-header with-border">
|
<div class="box-header with-border">
|
||||||
<h3 class="box-title">Enter artist for fake import</h3>
|
<h3 class="box-title">{{ trans('import.job_config_fake_artist_title') }}</h3>
|
||||||
</div>
|
</div>
|
||||||
<div class="box-body">
|
<div class="box-body">
|
||||||
<p>
|
<p>
|
||||||
Enter "David Bowie", no matter the capitalization.
|
{{ trans('import.job_config_fake_artist_text') }}
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -26,7 +26,7 @@
|
|||||||
<div class="col-lg-12">
|
<div class="col-lg-12">
|
||||||
<div class="box">
|
<div class="box">
|
||||||
<div class="box-header with-border">
|
<div class="box-header with-border">
|
||||||
<h3 class="box-title">Fields be here.</h3>
|
<h3 class="box-title">{{ trans('import.job_config_input') }}</h3>
|
||||||
</div>
|
</div>
|
||||||
<div class="box-body">
|
<div class="box-body">
|
||||||
{{ ExpandedForm.text('artist') }}
|
{{ ExpandedForm.text('artist') }}
|
||||||
|
@ -8,11 +8,11 @@
|
|||||||
<div class="col-lg-12">
|
<div class="col-lg-12">
|
||||||
<div class="box">
|
<div class="box">
|
||||||
<div class="box-header with-border">
|
<div class="box-header with-border">
|
||||||
<h3 class="box-title">Enter song for fake import</h3>
|
<h3 class="box-title">{{ trans('import.job_config_fake_song_title') }}</h3>
|
||||||
</div>
|
</div>
|
||||||
<div class="box-body">
|
<div class="box-body">
|
||||||
<p>
|
<p>
|
||||||
Enter "golden years", no matter the capitalization.
|
{{ trans('import.job_config_fake_song_text') }}
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -26,7 +26,7 @@
|
|||||||
<div class="col-lg-12">
|
<div class="col-lg-12">
|
||||||
<div class="box">
|
<div class="box">
|
||||||
<div class="box-header with-border">
|
<div class="box-header with-border">
|
||||||
<h3 class="box-title">Fields be here.</h3>
|
<h3 class="box-title">{{ trans('import.job_config_input') }}</h3>
|
||||||
</div>
|
</div>
|
||||||
<div class="box-body">
|
<div class="box-body">
|
||||||
{{ ExpandedForm.text('song') }}
|
{{ ExpandedForm.text('song') }}
|
||||||
|
@ -10,13 +10,13 @@
|
|||||||
<div class="col-lg-12 col-md-12 col-sm-12">
|
<div class="col-lg-12 col-md-12 col-sm-12">
|
||||||
<div class="box box-default">
|
<div class="box box-default">
|
||||||
<div class="box-header with-border">
|
<div class="box-header with-border">
|
||||||
<h3 class="box-title">Fake prerequisites</h3>
|
<h3 class="box-title">{{ trans('import.prereq_fake_title') }}</h3>
|
||||||
</div>
|
</div>
|
||||||
<div class="box-body">
|
<div class="box-body">
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-lg-8">
|
<div class="col-lg-8">
|
||||||
<p>
|
<p>
|
||||||
Bla bla bla bla
|
{{ trans('import.prereq_fake_text') }}
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
Loading…
Reference in New Issue
Block a user