diff --git a/app/Helpers/Collector/Extensions/MetaCollection.php b/app/Helpers/Collector/Extensions/MetaCollection.php index 746657ac98..193cb8ef63 100644 --- a/app/Helpers/Collector/Extensions/MetaCollection.php +++ b/app/Helpers/Collector/Extensions/MetaCollection.php @@ -212,6 +212,36 @@ trait MetaCollection return $this; } + /** + * @inheritDoc + */ + public function withoutExternalUrl(): GroupCollectorInterface + { + if (false === $this->hasJoinedMetaTables) { + $this->hasJoinedMetaTables = true; + $this->query->leftJoin('journal_meta', 'transaction_journals.id', '=', 'journal_meta.transaction_journal_id'); + } + $this->query->where('journal_meta.name', '=', 'external_url'); + $this->query->whereNull('journal_meta.data'); + + return $this; + } + + /** + * @inheritDoc + */ + public function withExternalUrl(): GroupCollectorInterface + { + if (false === $this->hasJoinedMetaTables) { + $this->hasJoinedMetaTables = true; + $this->query->leftJoin('journal_meta', 'transaction_journals.id', '=', 'journal_meta.transaction_journal_id'); + } + $this->query->where('journal_meta.name', '=', 'external_url'); + $this->query->whereNotNull('journal_meta.data'); + + return $this; + } + /** * @inheritDoc */ diff --git a/app/Helpers/Collector/GroupCollectorInterface.php b/app/Helpers/Collector/GroupCollectorInterface.php index ccbee0145e..5216a59242 100644 --- a/app/Helpers/Collector/GroupCollectorInterface.php +++ b/app/Helpers/Collector/GroupCollectorInterface.php @@ -305,6 +305,20 @@ interface GroupCollectorInterface */ public function setExternalId(string $externalId): GroupCollectorInterface; + /** + * Transactions without an external URL + * + * @return GroupCollectorInterface + */ + public function withoutExternalUrl(): GroupCollectorInterface; + + /** + * Transactions with an external URL + * + * @return GroupCollectorInterface + */ + public function withExternalUrl(): GroupCollectorInterface; + /** * Limit results to a specific foreign currency. * diff --git a/app/Support/Search/OperatorQuerySearch.php b/app/Support/Search/OperatorQuerySearch.php index e89927ee62..269b43928f 100644 --- a/app/Support/Search/OperatorQuerySearch.php +++ b/app/Support/Search/OperatorQuerySearch.php @@ -627,6 +627,15 @@ class OperatorQuerySearch implements SearchInterface $this->collector->setUpdatedAt($updatedAt); break; // + // external URL + // + case 'no_external_url': + $this->collector->withoutExternalUrl(); + break; + case 'any_external_url': + $this->collector->withExternalUrl(); + break; + // // other fields // case 'external_id': diff --git a/config/firefly.php b/config/firefly.php index 5b2189b007..fa75e3621b 100644 --- a/config/firefly.php +++ b/config/firefly.php @@ -518,6 +518,8 @@ return [ 'notes_are' => ['alias' => false, 'needs_context' => true,], 'no_notes' => ['alias' => false, 'needs_context' => false,], 'any_notes' => ['alias' => false, 'needs_context' => false,], + 'no_external_url' => ['alias' => false, 'needs_context' => false,], + 'any_external_url' => ['alias' => false, 'needs_context' => false,], // one exact (or array of) journals: 'id' => ['alias' => false, 'trigger_class' => null, 'needs_context' => true,], diff --git a/public/v1/js/ff/rules/create-edit.js b/public/v1/js/ff/rules/create-edit.js index 2f2eb43140..656746a822 100644 --- a/public/v1/js/ff/rules/create-edit.js +++ b/public/v1/js/ff/rules/create-edit.js @@ -348,6 +348,8 @@ function updateTriggerInput(selectList) { case 'source_is_cash': case 'destination_is_cash': case 'account_is_cash': + case 'no_external_url': + case 'any_external_url': console.log('Select list value is ' + selectList.val() + ', so input needs to be disabled.'); inputResult.prop('disabled', true); inputResult.typeahead('destroy'); diff --git a/resources/lang/en_US/firefly.php b/resources/lang/en_US/firefly.php index f5fa8f107e..403ea38144 100644 --- a/resources/lang/en_US/firefly.php +++ b/resources/lang/en_US/firefly.php @@ -562,6 +562,8 @@ return [ 'rule_trigger_internal_reference' => 'Internal reference is ":trigger_value"', 'rule_trigger_journal_id_choice' => 'Transaction journal ID is..', 'rule_trigger_journal_id' => 'Transaction journal ID is ":trigger_value"', + 'rule_trigger_no_external_url' => 'Transaction has no external URL', + 'rule_trigger_any_external_url' => 'Transaction has an external URL', // actions 'rule_action_delete_transaction_choice' => 'DELETE transaction (!)',