From a77187135f4bd907648293fa0efc68afc3feafe8 Mon Sep 17 00:00:00 2001 From: James Cole Date: Fri, 5 Jun 2020 06:34:55 +0200 Subject: [PATCH] Fixed #3297 --- .../Triggers/ForeignCurrencyIs.php | 99 +++++++++++++++++++ config/firefly.php | 2 + public/v1/js/ff/rules/create-edit.js | 1 + resources/lang/en_US/firefly.php | 2 + 4 files changed, 104 insertions(+) create mode 100644 app/TransactionRules/Triggers/ForeignCurrencyIs.php diff --git a/app/TransactionRules/Triggers/ForeignCurrencyIs.php b/app/TransactionRules/Triggers/ForeignCurrencyIs.php new file mode 100644 index 0000000000..2705beb91b --- /dev/null +++ b/app/TransactionRules/Triggers/ForeignCurrencyIs.php @@ -0,0 +1,99 @@ +. + */ +declare(strict_types=1); + +namespace FireflyIII\TransactionRules\Triggers; + +use FireflyIII\Models\Transaction; +use FireflyIII\Models\TransactionJournal; +use FireflyIII\Repositories\Currency\CurrencyRepositoryInterface; +use Log; + +/** + * Class ForeignCurrencyIs. + */ +final class ForeignCurrencyIs extends AbstractTrigger implements TriggerInterface +{ + /** + * A trigger is said to "match anything", or match any given transaction, + * when the trigger value is very vague or has no restrictions. Easy examples + * are the "AmountMore"-trigger combined with an amount of 0: any given transaction + * has an amount of more than zero! Other examples are all the "Description"-triggers + * which have hard time handling empty trigger values such as "" or "*" (wild cards). + * + * If the user tries to create such a trigger, this method MUST return true so Firefly III + * can stop the storing / updating the trigger. If the trigger is in any way restrictive + * (even if it will still include 99.9% of the users transactions), this method MUST return + * false. + * + * @param mixed $value + * + * @return bool + */ + public static function willMatchEverything($value = null): bool + { + if (null !== $value) { + return false; + } + + Log::error(sprintf('Cannot use %s with a null value.', self::class)); + + return true; + } + + /** + * Returns true when description is X + * + * @param TransactionJournal $journal + * + * @return bool + */ + public function triggered(TransactionJournal $journal): bool + { + /** @var CurrencyRepositoryInterface $repository */ + $repository = app(CurrencyRepositoryInterface::class); + + // if currency name contains " (" + if (0 === strpos($this->triggerValue, ' (')) { + $parts = explode(' (', $this->triggerValue); + $this->triggerValue = $parts[0]; + } + + $currency = $repository->findByNameNull($this->triggerValue); + $hit = true; + if (null !== $currency) { + /** @var Transaction $transaction */ + foreach ($journal->transactions as $transaction) { + if ((int)$transaction->foreign_currency_id !== (int)$currency->id) { + Log::debug( + sprintf( + 'Trigger ForeignCurrencyIs: Transaction #%d in journal #%d uses currency %d instead of sought for #%d. No hit!', + $transaction->id, $journal->id, $transaction->foreign_currency_id, $currency->id + ) + ); + $hit = false; + } + } + } + + return $hit; + } +} diff --git a/config/firefly.php b/config/firefly.php index 68597b46e3..e1284db118 100644 --- a/config/firefly.php +++ b/config/firefly.php @@ -85,6 +85,7 @@ use FireflyIII\TransactionRules\Triggers\AmountMore; use FireflyIII\TransactionRules\Triggers\BudgetIs; use FireflyIII\TransactionRules\Triggers\CategoryIs; use FireflyIII\TransactionRules\Triggers\CurrencyIs; +use FireflyIII\TransactionRules\Triggers\ForeignCurrencyIs; use FireflyIII\TransactionRules\Triggers\DateIs; use FireflyIII\TransactionRules\Triggers\DateBefore; use FireflyIII\TransactionRules\Triggers\DateAfter; @@ -479,6 +480,7 @@ return [ 'budget_is' => BudgetIs::class, 'tag_is' => TagIs::class, 'currency_is' => CurrencyIs::class, + 'foreign_currency_is' => ForeignCurrencyIs::class, 'has_attachments' => HasAttachment::class, 'has_no_category' => HasNoCategory::class, 'has_any_category' => HasAnyCategory::class, diff --git a/public/v1/js/ff/rules/create-edit.js b/public/v1/js/ff/rules/create-edit.js index 69d0b95a97..bc221ed541 100644 --- a/public/v1/js/ff/rules/create-edit.js +++ b/public/v1/js/ff/rules/create-edit.js @@ -350,6 +350,7 @@ function updateTriggerInput(selectList) { inputResult.typeahead('destroy'); break; case 'currency_is': + case 'foreign_currency_is': console.log('Select list value is ' + selectList.val() + ', so input needs auto complete.'); createAutoComplete(inputResult, 'json/currency-names'); break; diff --git a/resources/lang/en_US/firefly.php b/resources/lang/en_US/firefly.php index 8070d3cdb7..cadc73fefa 100644 --- a/resources/lang/en_US/firefly.php +++ b/resources/lang/en_US/firefly.php @@ -436,6 +436,8 @@ return [ 'rule_trigger_tag_is' => 'A tag is ":trigger_value"', 'rule_trigger_currency_is_choice' => 'Transaction currency is..', 'rule_trigger_currency_is' => 'Transaction currency is ":trigger_value"', + 'rule_trigger_foreign_currency_is_choice' => 'Transaction foreign currency is..', + 'rule_trigger_foreign_currency_is' => 'Transaction foreign currency is ":trigger_value"', 'rule_trigger_has_attachments_choice' => 'Has at least this many attachments', 'rule_trigger_has_attachments' => 'Has at least :count attachment|Has at least :count attachments', 'rule_trigger_store_journal' => 'When a transaction is created',