From c1ac2bb156dd83e4517b340006221275aa2f80a9 Mon Sep 17 00:00:00 2001 From: James Cole Date: Tue, 31 Jul 2018 05:49:03 +0200 Subject: [PATCH] Expand text and routine for YNAB --- .../Ynab/SelectBudgetHandler.php | 69 +++++++++++++++++-- resources/lang/en_US/import.php | 3 + resources/lang/en_US/list.php | 1 + .../views/import/ynab/select-budgets.twig | 25 ++++++- 4 files changed, 90 insertions(+), 8 deletions(-) diff --git a/app/Support/Import/JobConfiguration/Ynab/SelectBudgetHandler.php b/app/Support/Import/JobConfiguration/Ynab/SelectBudgetHandler.php index 244eba2b5b..a65d7be089 100644 --- a/app/Support/Import/JobConfiguration/Ynab/SelectBudgetHandler.php +++ b/app/Support/Import/JobConfiguration/Ynab/SelectBudgetHandler.php @@ -23,8 +23,13 @@ declare(strict_types=1); namespace FireflyIII\Support\Import\JobConfiguration\Ynab; +use FireflyIII\Models\Account; +use FireflyIII\Models\AccountType; use FireflyIII\Models\ImportJob; +use FireflyIII\Repositories\Account\AccountRepositoryInterface; +use FireflyIII\Repositories\Currency\CurrencyRepositoryInterface; use FireflyIII\Repositories\ImportJob\ImportJobRepositoryInterface; +use Illuminate\Support\Collection; use Illuminate\Support\MessageBag; use Log; @@ -33,6 +38,12 @@ use Log; */ class SelectBudgetHandler implements YnabJobConfigurationInterface { + /** @var AccountRepositoryInterface */ + private $accountRepository; + /** @var Collection */ + private $accounts; + /** @var CurrencyRepositoryInterface */ + private $currencyRepository; /** @var ImportJob */ private $importJob; /** @var ImportJobRepositoryInterface */ @@ -51,6 +62,7 @@ class SelectBudgetHandler implements YnabJobConfigurationInterface if ($selectedBudget !== '') { Log::debug(sprintf('Selected budget is %s, config is complete. Return true.', $selectedBudget)); $this->repository->setStage($this->importJob, 'get_accounts'); + return true; } Log::debug('User has not selected a budget yet, config is not yet complete.'); @@ -90,13 +102,24 @@ class SelectBudgetHandler implements YnabJobConfigurationInterface Log::debug('Now in SelectBudgetHandler::getNextData'); $configuration = $this->repository->getConfiguration($this->importJob); $budgets = $configuration['budgets'] ?? []; - $return = []; + $available = []; + $notAvailable = []; + $total = \count($budgets); foreach ($budgets as $budget) { - $return[$budget['id']] = $budget['name'] . ' (' . $budget['currency_code'] . ')'; + if ($this->haveAssetWithCurrency($budget['currency_code'])) { + Log::debug('Add budget to available list.'); + $available[$budget['id']] = $budget['name'] . ' (' . $budget['currency_code'] . ')'; + continue; + } + Log::debug('Add budget to notAvailable list.'); + $notAvailable[$budget['id']] = $budget['name'] . ' (' . $budget['currency_code'] . ')'; + } return [ - 'budgets' => $return, + 'available' => $available, + 'not_available' => $notAvailable, + 'total' => $total, ]; } @@ -119,8 +142,44 @@ class SelectBudgetHandler implements YnabJobConfigurationInterface */ public function setImportJob(ImportJob $importJob): void { - $this->importJob = $importJob; - $this->repository = app(ImportJobRepositoryInterface::class); + $this->importJob = $importJob; + $this->repository = app(ImportJobRepositoryInterface::class); + $this->currencyRepository = app(CurrencyRepositoryInterface::class); + $this->accountRepository = app(AccountRepositoryInterface::class); + $this->repository->setUser($importJob->user); + $this->currencyRepository->setUser($importJob->user); + $this->accountRepository->setUser($importJob->user); + $this->accountRepository->setUser($importJob->user); + + $this->accounts = $this->accountRepository->getAccountsByType([AccountType::ASSET, AccountType::DEFAULT]); + } + + /** + * @param string $code + * + * @return bool + */ + private function haveAssetWithCurrency(string $code): bool + { + $currency = $this->currencyRepository->findByCodeNull($code); + if (null === $currency) { + Log::debug(sprintf('No currency found with code "%s"', $code)); + + return false; + } + /** @var Account $account */ + foreach ($this->accounts as $account) { + $currencyId = (int)$this->accountRepository->getMetaValue($account, 'currency_id'); + Log::debug(sprintf('Currency of %s is %d (looking for %d).', $account->name, $currencyId, $currency->id)); + if ($currencyId === $currency->id) { + Log::debug('Return true!'); + + return true; + } + } + Log::debug('Found nothing, return false.'); + + return false; } } \ No newline at end of file diff --git a/resources/lang/en_US/import.php b/resources/lang/en_US/import.php index 1788206605..524135901c 100644 --- a/resources/lang/en_US/import.php +++ b/resources/lang/en_US/import.php @@ -171,6 +171,9 @@ return [ 'job_config_ynab_no_budgets' => 'There are no budgets available to be imported from.', 'ynab_no_mapping' => 'It seems you have not selected any accounts to import from.', 'job_config_ynab_bad_currency' => 'You cannot import from the following budget(s), because you do not have accounts with the same currency as these budgets.', + 'job_config_ynab_accounts_title' => 'Select accounts', + 'job_config_ynab_accounts_text' => 'You have the following accounts available in this budget. Please select from which accounts you want to import, and where the transactions should be stored.', + // keys from "extra" array: 'spectre_extra_key_iban' => 'IBAN', diff --git a/resources/lang/en_US/list.php b/resources/lang/en_US/list.php index 8932fdf83a..bc36c21a41 100644 --- a/resources/lang/en_US/list.php +++ b/resources/lang/en_US/list.php @@ -104,6 +104,7 @@ return [ 'sum_transfers' => 'Sum of transfers', 'reconcile' => 'Reconcile', 'account_on_spectre' => 'Account (Spectre)', + 'account_on_ynab' => 'Account (YNAB)', 'do_import' => 'Import from this account', 'sepa-ct-id' => 'SEPA End to End Identifier', 'sepa-ct-op' => 'SEPA Opposing Account Identifier', diff --git a/resources/views/import/ynab/select-budgets.twig b/resources/views/import/ynab/select-budgets.twig index 1ab9b8efbc..1c6c37b8fd 100644 --- a/resources/views/import/ynab/select-budgets.twig +++ b/resources/views/import/ynab/select-budgets.twig @@ -11,21 +11,40 @@
-

{{ trans('import.job_config_select_budgets') }}

+

{{ trans('import.job_config_ynab_select_budgets') }}

- {{ trans('import.job_config_spectre_select_budgets_text', {count: data.budgets|length}) }} + {{ trans('import.job_config_ynab_select_budgets_text', {count: data.total}) }}

- {{ ExpandedForm.select('budget_id', data.budgets) }} + {% if data.available|length == 0 %} +

+ {{ trans('import.job_config_ynab_no_budgets') }} +

+ {% else %} + {{ ExpandedForm.select('budget_id', data.available) }} + {% endif %} + + {% if data.not_available|length > 0 %} +

+ {{ trans('import.job_config_ynab_bad_currency') }} +

+
    + {% for budget in data.not_available %} +
  • {{ budget }}
  • + {% endfor %} +
+ {% endif %}