diff --git a/app/Console/Commands/CreateImport.php b/app/Console/Commands/CreateImport.php new file mode 100644 index 0000000000..093ab03c3f --- /dev/null +++ b/app/Console/Commands/CreateImport.php @@ -0,0 +1,153 @@ +argument('file'); + $configuration = $this->argument('configuration'); + $user = $userRepository->find(intval($this->option('user'))); + $cwd = getcwd(); + $type = strtolower($this->option('type')); + + if (!$this->validArguments()) { + return; + } + + // try to parse configuration data: + $configurationData = json_decode(file_get_contents($configuration)); + if (is_null($configurationData)) { + $this->error(sprintf('Firefly III cannot read the contents of configuration file "%s" (working directory: "%s").', $configuration, $cwd)); + + return; + } + + $this->info(sprintf('Going to create a job to import file: %s', $file)); + $this->info(sprintf('Using configuration file: %s', $configuration)); + $this->info(sprintf('Import into user: #%d (%s)', $user->id, $user->email)); + $this->info(sprintf('Type of import: %s', $type)); + + /** @var ImportJobRepositoryInterface $jobRepository */ + $jobRepository = app(ImportJobRepositoryInterface::class, [$user]); + + $job = $jobRepository->create($type); + $this->line(sprintf('Created job "%s"...', $job->key)); + + // put the file in the proper place: + Artisan::call('firefly:encrypt', ['file' => $file, 'key' => $job->key]); + $this->line('Stored import data...'); + + // store the configuration in the job: + $job->configuration = $configurationData; + $job->status = 'settings_complete'; + $job->save(); + $this->line('Stored configuration...'); + + // if user wants to run it, do! + if ($this->option('start') === true) { + $this->line('The import will start in a moment. This process is not visible...'); + Log::debug('Go for import!'); + Artisan::call('firefly:start-import', ['key' => $job->key]); + $this->line('Done!'); + } + + return; + } + + /** + * @return bool + */ + private function validArguments(): bool + { + // find the file + /** @var UserRepositoryInterface $userRepository */ + $userRepository = app(UserRepositoryInterface::class); + $file = $this->argument('file'); + $configuration = $this->argument('configuration'); + $user = $userRepository->find(intval($this->option('user'))); + $cwd = getcwd(); + $validTypes = array_keys(config('firefly.import_formats')); + $type = strtolower($this->option('type')); + + if (is_null($user->id)) { + $this->error(sprintf('There is no user with ID %d.', $this->option('user'))); + + return false; + } + if (!in_array($type, $validTypes)) { + $this->error(sprintf('Cannot import file of type "%s"', $type)); + + return false; + } + + if (!file_exists($file)) { + $this->error(sprintf('Firefly III cannot find file "%s" (working directory: "%s").', $file, $cwd)); + + return false; + } + + if (!file_exists($configuration)) { + $this->error(sprintf('Firefly III cannot find configuration file "%s" (working directory: "%s").', $configuration, $cwd)); + + return false; + } + + return true; + } +} diff --git a/app/Console/Commands/Import.php b/app/Console/Commands/Import.php index 7b8c77e9f3..8d7c23b0ac 100644 --- a/app/Console/Commands/Import.php +++ b/app/Console/Commands/Import.php @@ -32,14 +32,14 @@ class Import extends Command * * @var string */ - protected $description = 'Import stuff into Firefly III.'; + protected $description = 'This will start a new import.'; /** * The name and signature of the console command. * * @var string */ - protected $signature = 'firefly:import {key}'; + protected $signature = 'firefly:start-import {key}'; /** * Create a new command instance. @@ -57,9 +57,11 @@ class Import extends Command */ public function handle() { + Log::debug('Start start-import command'); $jobKey = $this->argument('key'); $job = ImportJob::whereKey($jobKey)->first(); if (!$this->isValid($job)) { + Log::error('Job is not valid for some reason. Exit.'); return; } diff --git a/app/Console/Kernel.php b/app/Console/Kernel.php index f52e0c1570..d62f5371ca 100755 --- a/app/Console/Kernel.php +++ b/app/Console/Kernel.php @@ -13,6 +13,7 @@ declare(strict_types = 1); namespace FireflyIII\Console; +use FireflyIII\Console\Commands\CreateImport; use FireflyIII\Console\Commands\EncryptFile; use FireflyIII\Console\Commands\Import; use FireflyIII\Console\Commands\ScanAttachments; @@ -58,6 +59,7 @@ class Kernel extends ConsoleKernel UpgradeFireflyInstructions::class, VerifyDatabase::class, Import::class, + CreateImport::class, EncryptFile::class, ScanAttachments::class, UpgradeDatabase::class, diff --git a/app/Http/Controllers/ProfileController.php b/app/Http/Controllers/ProfileController.php index 24939b2406..b03420b592 100644 --- a/app/Http/Controllers/ProfileController.php +++ b/app/Http/Controllers/ProfileController.php @@ -35,6 +35,9 @@ class ProfileController extends Controller public function __construct() { parent::__construct(); + + View::share('title', trans('firefly.profile')); + View::share('mainTitleIcon', 'fa-user'); } /** @@ -63,7 +66,10 @@ class ProfileController extends Controller */ public function index() { - return view('profile.index')->with('title', trans('firefly.profile'))->with('subTitle', auth()->user()->email)->with('mainTitleIcon', 'fa-user'); + $subTitle = auth()->user()->email; + $userId = auth()->user()->id; + + return view('profile.index', compact('subTitle', 'userId')); } /** diff --git a/app/Import/Converter/OpposingAccountIban.php b/app/Import/Converter/OpposingAccountIban.php index b1f8dc63e7..c3dacbd712 100644 --- a/app/Import/Converter/OpposingAccountIban.php +++ b/app/Import/Converter/OpposingAccountIban.php @@ -13,6 +13,7 @@ declare(strict_types = 1); namespace FireflyIII\Import\Converter; +use FireflyIII\Exceptions\FireflyException; use FireflyIII\Models\Account; use FireflyIII\Repositories\Account\AccountRepositoryInterface; use Log; @@ -69,11 +70,20 @@ class OpposingAccountIban extends BasicConverter implements ConverterInterface return $account; } - $account = $repository->store( - ['name' => $value, 'iban' => $value, 'user' => $this->user->id, 'accountType' => 'import', 'virtualBalance' => 0, 'active' => true, - 'openingBalance' => 0] - ); - $this->setCertainty(100); + // the IBAN given may not be a valid IBAN. If not, we cannot store by + // iban and we have no opposing account. There should be some kind of fall back + // routine. + try { + $account = $repository->store( + ['name' => $value, 'iban' => $value, 'user' => $this->user->id, 'accountType' => 'import', 'virtualBalance' => 0, 'active' => true, + 'openingBalance' => 0] + ); + $this->setCertainty(100); + } catch (FireflyException $e) { + Log::error($e); + + $account = new Account; + } return $account; } diff --git a/app/Repositories/User/UserRepository.php b/app/Repositories/User/UserRepository.php index d382708be8..97642b2ea9 100644 --- a/app/Repositories/User/UserRepository.php +++ b/app/Repositories/User/UserRepository.php @@ -59,6 +59,21 @@ class UserRepository implements UserRepositoryInterface return $this->all()->count(); } + /** + * @param int $userId + * + * @return User + */ + public function find(int $userId): User + { + $user = User::find($userId); + if (!is_null($user)) { + return $user; + } + + return new User; + } + /** * Return basic user information. * diff --git a/app/Repositories/User/UserRepositoryInterface.php b/app/Repositories/User/UserRepositoryInterface.php index 349fc0cdb4..a5fce26bad 100644 --- a/app/Repositories/User/UserRepositoryInterface.php +++ b/app/Repositories/User/UserRepositoryInterface.php @@ -31,6 +31,13 @@ interface UserRepositoryInterface */ public function all(): Collection; + /** + * @param int $userId + * + * @return User + */ + public function find(int $userId): User; + /** * Return basic user information. * diff --git a/resources/lang/en_US/firefly.php b/resources/lang/en_US/firefly.php index 04bab8676f..773bef3979 100644 --- a/resources/lang/en_US/firefly.php +++ b/resources/lang/en_US/firefly.php @@ -69,6 +69,7 @@ return [ 'no_budget_pointer' => 'You seem to have no budgets yet. You should create some on the budgets-page. Budgets can help you keep track of expenses.', 'source_accounts' => 'Source account(s)', 'destination_accounts' => 'Destination account(s)', + 'user_id_is' => 'Your user id is :user', // repeat frequencies: 'repeat_freq_monthly' => 'monthly', @@ -669,48 +670,49 @@ return [ 'add_money_to_piggy_title' => 'Add money to piggy bank ":name"', 'remove_money_from_piggy_title' => 'Remove money from piggy bank ":name"', 'add' => 'Add', - 'remove' => 'Remove', - 'max_amount_add' => 'The maximum amount you can add is', - 'max_amount_remove' => 'The maximum amount you can remove is', - 'update_piggy_button' => 'Update piggy bank', - 'update_piggy_title' => 'Update piggy bank ":name"', - 'updated_piggy_bank' => 'Updated piggy bank ":name"', - 'details' => 'Details', - 'events' => 'Events', - 'target_amount' => 'Target amount', - 'start_date' => 'Start date', - 'target_date' => 'Target date', - 'no_target_date' => 'No target date', - 'todo' => 'to do', - 'table' => 'Table', - 'piggy_bank_not_exists' => 'Piggy bank no longer exists.', - 'add_any_amount_to_piggy' => 'Add money to this piggy bank to reach your target of :amount.', - 'add_set_amount_to_piggy' => 'Add :amount to fill this piggy bank on :date', - 'delete_piggy_bank' => 'Delete piggy bank ":name"', - 'cannot_add_amount_piggy' => 'Could not add :amount to ":name".', - 'deleted_piggy_bank' => 'Deleted piggy bank ":name"', - 'added_amount_to_piggy' => 'Added :amount to ":name"', - 'removed_amount_from_piggy' => 'Removed :amount from ":name"', - 'cannot_remove_amount_piggy' => 'Could not remove :amount from ":name".', + + 'remove' => 'Remove', + 'max_amount_add' => 'The maximum amount you can add is', + 'max_amount_remove' => 'The maximum amount you can remove is', + 'update_piggy_button' => 'Update piggy bank', + 'update_piggy_title' => 'Update piggy bank ":name"', + 'updated_piggy_bank' => 'Updated piggy bank ":name"', + 'details' => 'Details', + 'events' => 'Events', + 'target_amount' => 'Target amount', + 'start_date' => 'Start date', + 'target_date' => 'Target date', + 'no_target_date' => 'No target date', + 'todo' => 'to do', + 'table' => 'Table', + 'piggy_bank_not_exists' => 'Piggy bank no longer exists.', + 'add_any_amount_to_piggy' => 'Add money to this piggy bank to reach your target of :amount.', + 'add_set_amount_to_piggy' => 'Add :amount to fill this piggy bank on :date', + 'delete_piggy_bank' => 'Delete piggy bank ":name"', + 'cannot_add_amount_piggy' => 'Could not add :amount to ":name".', + 'deleted_piggy_bank' => 'Deleted piggy bank ":name"', + 'added_amount_to_piggy' => 'Added :amount to ":name"', + 'removed_amount_from_piggy' => 'Removed :amount from ":name"', + 'cannot_remove_amount_piggy' => 'Could not remove :amount from ":name".', // tags - 'regular_tag' => 'Just a regular tag.', - 'balancing_act' => 'The tag takes at most two transactions; an expense and a transfer. They\'ll balance each other out.', - 'advance_payment' => 'The tag accepts one expense and any number of deposits aimed to repay the original expense.', - 'delete_tag' => 'Delete tag ":tag"', - 'deleted_tag' => 'Deleted tag ":tag"', - 'new_tag' => 'Make new tag', - 'edit_tag' => 'Edit tag ":tag"', - 'updated_tag' => 'Updated tag ":tag"', - 'created_tag' => 'Tag ":tag" has been created!', - 'no_year' => 'No year set', - 'no_month' => 'No month set', - 'tag_title_nothing' => 'Default tags', - 'tag_title_balancingAct' => 'Balancing act tags', - 'tag_title_advancePayment' => 'Advance payment tags', - 'tags_introduction' => 'Usually tags are singular words, designed to quickly band items together using things like expensive, bill or for-party. In Firefly III, tags can have more properties such as a date, description and location. This allows you to join transactions together in a more meaningful way. For example, you could make a tag called Christmas dinner with friends and add information about the restaurant. Such tags are "singular", you would only use them for a single occasion, perhaps with multiple transactions.', - 'tags_group' => 'Tags group transactions together, which makes it possible to store reimbursements (in case you front money for others) and other "balancing acts" where expenses are summed up (the payments on your new TV) or where expenses and deposits are cancelling each other out (buying something with saved money). It\'s all up to you. Using tags the old-fashioned way is of course always possible.', - 'tags_start' => 'Create a tag to get started or enter tags when creating new transactions.', + 'regular_tag' => 'Just a regular tag.', + 'balancing_act' => 'The tag takes at most two transactions; an expense and a transfer. They\'ll balance each other out.', + 'advance_payment' => 'The tag accepts one expense and any number of deposits aimed to repay the original expense.', + 'delete_tag' => 'Delete tag ":tag"', + 'deleted_tag' => 'Deleted tag ":tag"', + 'new_tag' => 'Make new tag', + 'edit_tag' => 'Edit tag ":tag"', + 'updated_tag' => 'Updated tag ":tag"', + 'created_tag' => 'Tag ":tag" has been created!', + 'no_year' => 'No year set', + 'no_month' => 'No month set', + 'tag_title_nothing' => 'Default tags', + 'tag_title_balancingAct' => 'Balancing act tags', + 'tag_title_advancePayment' => 'Advance payment tags', + 'tags_introduction' => 'Usually tags are singular words, designed to quickly band items together using things like expensive, bill or for-party. In Firefly III, tags can have more properties such as a date, description and location. This allows you to join transactions together in a more meaningful way. For example, you could make a tag called Christmas dinner with friends and add information about the restaurant. Such tags are "singular", you would only use them for a single occasion, perhaps with multiple transactions.', + 'tags_group' => 'Tags group transactions together, which makes it possible to store reimbursements (in case you front money for others) and other "balancing acts" where expenses are summed up (the payments on your new TV) or where expenses and deposits are cancelling each other out (buying something with saved money). It\'s all up to you. Using tags the old-fashioned way is of course always possible.', + 'tags_start' => 'Create a tag to get started or enter tags when creating new transactions.', 'transaction_journal_information' => 'Transaction information', 'transaction_journal_meta' => 'Meta information', diff --git a/resources/views/profile/index.twig b/resources/views/profile/index.twig index 697b8f7fb0..2be9d63b54 100644 --- a/resources/views/profile/index.twig +++ b/resources/views/profile/index.twig @@ -12,6 +12,9 @@
+ {{ trans('firefly.user_id_is',{user: userId})|raw }} +