Expand search with negated search options

This commit is contained in:
James Cole
2022-09-25 15:31:07 +02:00
parent 80a732b32b
commit 3c33ea959e
8 changed files with 1570 additions and 108 deletions

View File

@@ -72,6 +72,26 @@ trait AccountCollection
return $this; return $this;
} }
/**
* These accounts must not be included.
*
* @param Collection $accounts
*
* @return GroupCollectorInterface
*/
public function excludeAccounts(Collection $accounts): GroupCollectorInterface
{
if ($accounts->count() > 0) {
$accountIds = $accounts->pluck('id')->toArray();
$this->query->whereNotIn('source.account_id', $accountIds);
$this->query->whereNotIn('destination.account_id', $accountIds);
app('log')->debug(sprintf('GroupCollector: excludeAccounts: %s', implode(', ', $accountIds)));
}
return $this;
}
/** /**
* Define which accounts can be part of the source and destination transactions. * Define which accounts can be part of the source and destination transactions.
* *
@@ -95,6 +115,29 @@ trait AccountCollection
return $this; return $this;
} }
/**
* Define which accounts can NOT be part of the source and destination transactions.
*
* @param Collection $accounts
*
* @return GroupCollectorInterface
*/
public function setNotAccounts(Collection $accounts): GroupCollectorInterface
{
if ($accounts->count() > 0) {
$accountIds = $accounts->pluck('id')->toArray();
$this->query->where(
static function (EloquentBuilder $query) use ($accountIds) {
$query->whereNotIn('source.account_id', $accountIds);
$query->whereNotIn('destination.account_id', $accountIds);
}
);
//app('log')->debug(sprintf('GroupCollector: setAccounts: %s', implode(', ', $accountIds)));
}
return $this;
}
/** /**
* Both source AND destination must be in this list of accounts. * Both source AND destination must be in this list of accounts.
* *

View File

@@ -51,6 +51,20 @@ trait AmountCollection
return $this; return $this;
} }
/**
* @inheritDoc
*/
public function amountIsNot(string $amount): GroupCollectorInterface
{
$this->query->where(
static function (EloquentBuilder $q) use ($amount) {
$q->where('source.amount','!=', app('steam')->negative($amount));
}
);
return $this;
}
/** /**
* Get transactions where the amount is less than. * Get transactions where the amount is less than.
* *
@@ -106,6 +120,25 @@ trait AmountCollection
return $this; return $this;
} }
/**
* Get transactions with a specific foreign amount.
*
* @param string $amount
*
* @return GroupCollectorInterface
*/
public function foreignAmountIsNot(string $amount): GroupCollectorInterface
{
$this->query->where(
static function (EloquentBuilder $q) use ($amount) {
$q->whereNull('source.foreign_amount');
$q->orWhere('source.foreign_amount','!=', app('steam')->negative($amount));
}
);
return $this;
}
/** /**
* Get transactions where the amount is less than. * Get transactions where the amount is less than.
* *

View File

@@ -30,6 +30,7 @@ use FireflyIII\Models\Budget;
use FireflyIII\Models\Category; use FireflyIII\Models\Category;
use FireflyIII\Models\Tag; use FireflyIII\Models\Tag;
use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Builder as EloquentBuilder;
use Illuminate\Database\Query\JoinClause; use Illuminate\Database\Query\JoinClause;
use Illuminate\Support\Collection; use Illuminate\Support\Collection;
@@ -226,6 +227,53 @@ trait MetaCollection
return $this; return $this;
} }
/**
* @param string $value
*
* @return GroupCollectorInterface
*/
public function notesDoNotContain(string $value): GroupCollectorInterface
{
$this->withNotes();
$this->query->where(static function (Builder $q) use ($value) {
$q->whereNull('notes.text');
$q->orWhere('notes.text', 'NOT LIKE', sprintf('%%%s%%', $value));
});
return $this;
}
/**
* @param string $value
*
* @return GroupCollectorInterface
*/
public function notesDontStartWith(string $value): GroupCollectorInterface
{
$this->withNotes();
$this->query->where(static function (Builder $q) use ($value) {
$q->whereNull('notes.text');
$q->orWhere('notes.text', 'NOT LIKE', sprintf('%s%%', $value));
});
return $this;
}
/**
* @param string $value
*
* @return GroupCollectorInterface
*/
public function notesDontEndWith(string $value): GroupCollectorInterface
{
$this->withNotes();
$this->query->where(static function (Builder $q) use ($value) {
$q->whereNull('notes.text');
$q->orWhere('notes.text', 'NOT LIKE', sprintf('%%%s', $value));
});
return $this;
}
/** /**
* @inheritDoc * @inheritDoc
@@ -276,6 +324,22 @@ trait MetaCollection
return $this; return $this;
} }
/**
* @param string $value
*
* @return GroupCollectorInterface
*/
public function notesExactlyNot(string $value): GroupCollectorInterface
{
$this->withNotes();
$this->query->where(static function (Builder $q) use ($value) {
$q->whereNull('notes.text');
$q->orWhere('notes.text', '!=', sprintf('%s', $value));
});
return $this;
}
/** /**
* @param string $value * @param string $value
* *
@@ -338,6 +402,20 @@ trait MetaCollection
return $this; return $this;
} }
/**
* @inheritDoc
*/
public function excludeBills(Collection $bills): GroupCollectorInterface
{
$this->withBillInformation();
$this->query->where(static function(EloquentBuilder $q1) use ($bills) {
$q1->whereNotIn('transaction_journals.bill_id', $bills->pluck('id')->toArray());
$q1->orWhereNull('transaction_journals.bill_id');
});
return $this;
}
/** /**
* Limit the search to a specific budget. * Limit the search to a specific budget.
* *
@@ -391,6 +469,22 @@ trait MetaCollection
return $this; return $this;
} }
/**
* @inheritDoc
*/
public function excludeBudgets(Collection $budgets): GroupCollectorInterface
{
if ($budgets->count() > 0) {
$this->withBudgetInformation();
$this->query->where(static function (EloquentBuilder $q1) use ($budgets) {
$q1->whereNotIn('budgets.id', $budgets->pluck('id')->toArray());
$q1->orWhereNull('budgets.id');
});
}
return $this;
}
/** /**
* Limit the search to a specific bunch of categories. * Limit the search to a specific bunch of categories.
* *
@@ -409,17 +503,16 @@ trait MetaCollection
} }
/** /**
* Limit the search to a specific bunch of categories. * @inheritDoc
*
* @param Collection $categories
*
* @return GroupCollectorInterface
*/ */
public function setNotCategories(Collection $categories): GroupCollectorInterface public function excludeCategories(Collection $categories): GroupCollectorInterface
{ {
if ($categories->count() > 0) { if ($categories->count() > 0) {
$this->withCategoryInformation(); $this->withCategoryInformation();
$this->query->whereNotIn('categories.id', $categories->pluck('id')->toArray()); $this->query->where(static function (EloquentBuilder $q1) use ($categories) {
$q1->whereNotIn('categories.id', $categories->pluck('id')->toArray());
$q1->orWhereNull('categories.id');
});
} }
return $this; return $this;
@@ -461,6 +554,44 @@ trait MetaCollection
return $this; return $this;
} }
/**
* Exclude a specific category.
*
* @param Category $category
*
* @return GroupCollectorInterface
*/
public function excludeCategory(Category $category): GroupCollectorInterface
{
$this->withCategoryInformation();
$this->query->where(static function(EloquentBuilder $q2) use ($category) {
$q2->where('categories.id','!=', $category->id);
$q2->orWhereNull('categories.id');
});
return $this;
}
/**
* Exclude a specific budget.
*
* @param Budget $budget
*
* @return GroupCollectorInterface
*/
public function excludeBudget(Budget $budget): GroupCollectorInterface
{
$this->withBudgetInformation();
$this->query->where(static function(EloquentBuilder $q2) use ($budget) {
$q2->where('budgets.id','!=', $budget->id);
$q2->orWhereNull('budgets.id');
});
return $this;
}
/** /**
* @inheritDoc * @inheritDoc
*/ */

View File

@@ -62,6 +62,16 @@ trait TimeCollection
return $this; return $this;
} }
/**
* @param string $day
* @return GroupCollectorInterface
*/
public function dayIsNot(string $day): GroupCollectorInterface
{
$this->query->whereDay('transaction_journals.date', '!=', $day);
return $this;
}
/** /**
* @param string $day * @param string $day
* @param string $field * @param string $field
@@ -142,6 +152,28 @@ trait TimeCollection
return $this; return $this;
} }
/**
* @param string $day
* @param string $field
* @return GroupCollectorInterface
*/
public function metaDayIsNot(string $day, string $field): GroupCollectorInterface
{
$this->withMetaDate($field);
$filter = function (int $index, array $object) use ($field, $day): bool {
foreach ($object['transactions'] as $transaction) {
if (array_key_exists($field, $transaction) && $transaction[$field] instanceof Carbon
) {
return (int) $day !== $transaction[$field]->day;
}
}
return false;
};
$this->postFilters[] = $filter;
return $this;
}
/** /**
* @param string $month * @param string $month
* @param string $field * @param string $field
@@ -210,6 +242,28 @@ trait TimeCollection
return $this; return $this;
} }
/**
* @param string $month
* @param string $field
* @return GroupCollectorInterface
*/
public function metaMonthIsNot(string $month, string $field): GroupCollectorInterface
{
$this->withMetaDate($field);
$filter = function (int $index, array $object) use ($field, $month): bool {
foreach ($object['transactions'] as $transaction) {
if (array_key_exists($field, $transaction) && $transaction[$field] instanceof Carbon
) {
return (int) $month !== $transaction[$field]->month;
}
}
return false;
};
$this->postFilters[] = $filter;
return $this;
}
/** /**
* @param string $year * @param string $year
* @param string $field * @param string $field
@@ -279,6 +333,28 @@ trait TimeCollection
return $this; return $this;
} }
/**
* @param string $year
* @param string $field
* @return GroupCollectorInterface
*/
public function metaYearIsNot(string $year, string $field): GroupCollectorInterface
{
$this->withMetaDate($field);
$filter = function (int $index, array $object) use ($field, $year): bool {
foreach ($object['transactions'] as $transaction) {
if (array_key_exists($field, $transaction) && $transaction[$field] instanceof Carbon
) {
return $year !== (string) $transaction[$field]->year;
}
}
return true;
};
$this->postFilters[] = $filter;
return $this;
}
/** /**
* @param string $month * @param string $month
* @return GroupCollectorInterface * @return GroupCollectorInterface
@@ -311,6 +387,16 @@ trait TimeCollection
return $this; return $this;
} }
/**
* @param string $month
* @return GroupCollectorInterface
*/
public function monthIsNot(string $month): GroupCollectorInterface
{
$this->query->whereMonth('transaction_journals.date', '!=', $month);
return $this;
}
/** /**
* @param string $day * @param string $day
* @param string $field * @param string $field
@@ -344,6 +430,17 @@ trait TimeCollection
return $this; return $this;
} }
/**
* @param string $day
* @param string $field
* @return GroupCollectorInterface
*/
public function objectDayIsNot(string $day, string $field): GroupCollectorInterface
{
$this->query->whereDay(sprintf('transaction_journals.%s', $field), '!=', $day);
return $this;
}
/** /**
* @param string $month * @param string $month
* @param string $field * @param string $field
@@ -377,6 +474,17 @@ trait TimeCollection
return $this; return $this;
} }
/**
* @param string $month
* @param string $field
* @return GroupCollectorInterface
*/
public function objectMonthIsNot(string $month, string $field): GroupCollectorInterface
{
$this->query->whereMonth(sprintf('transaction_journals.%s', $field), '!=', $month);
return $this;
}
/** /**
* @param string $year * @param string $year
* @param string $field * @param string $field
@@ -410,6 +518,17 @@ trait TimeCollection
return $this; return $this;
} }
/**
* @param string $year
* @param string $field
* @return GroupCollectorInterface
*/
public function objectYearIsNot(string $year, string $field): GroupCollectorInterface
{
$this->query->whereYear(sprintf('transaction_journals.%s', $field), '!=', $year);
return $this;
}
/** /**
* Collect transactions after a specific date. * Collect transactions after a specific date.
* *
@@ -535,6 +654,37 @@ trait TimeCollection
} }
/**
* @param Carbon $start
* @param Carbon $end
* @param string $field
* @return GroupCollectorInterface
*/
public function excludeMetaDateRange(Carbon $start, Carbon $end, string $field): GroupCollectorInterface
{
if ($end < $start) {
[$start, $end] = [$end, $start];
}
$end = clone $end; // this is so weird, but it works if $end and $start secretly point to the same object.
$end->endOfDay();
$start->startOfDay();
$this->withMetaDate($field);
$filter = function (int $index, array $object) use ($field, $start, $end): bool {
foreach ($object['transactions'] as $transaction) {
if (array_key_exists($field, $transaction) && $transaction[$field] instanceof Carbon) {
return $transaction[$field]->lt($start) || $transaction[$field]->gt($end);
}
}
return false;
};
$this->postFilters[] = $filter;
return $this;
}
/** /**
* @param Carbon $date * @param Carbon $date
* @param string $field * @param string $field
@@ -576,6 +726,23 @@ trait TimeCollection
return $this; return $this;
} }
/**
* @param Carbon $start
* @param Carbon $end
* @param string $field
* @return GroupCollectorInterface
*/
public function excludeObjectRange(Carbon $start, Carbon $end, string $field): GroupCollectorInterface
{
$after = $start->format('Y-m-d 00:00:00');
$before = $end->format('Y-m-d 23:59:59');
$this->query->where(sprintf('transaction_journals.%s', $field), '<', $after);
$this->query->orWhere(sprintf('transaction_journals.%s', $field), '>', $before);
return $this;
}
/** /**
* Set the start and end time of the results to return. * Set the start and end time of the results to return.
* *
@@ -599,6 +766,27 @@ trait TimeCollection
return $this; return $this;
} }
/**
* @param Carbon $start
* @param Carbon $end
* @return GroupCollectorInterface
*/
public function excludeRange(Carbon $start, Carbon $end): GroupCollectorInterface
{
if ($end < $start) {
[$start, $end] = [$end, $start];
}
$startStr = $start->format('Y-m-d 00:00:00');
$endStr = $end->format('Y-m-d 23:59:59');
$this->query->where('transaction_journals.date', '<', $startStr);
$this->query->orWhere('transaction_journals.date', '>', $endStr);
return $this;
}
/** /**
* Collect transactions updated on a specific date. * Collect transactions updated on a specific date.
* *
@@ -616,22 +804,44 @@ trait TimeCollection
return $this; return $this;
} }
/**
* @param string $year
* @return GroupCollectorInterface
*/
public function yearAfter(string $year): GroupCollectorInterface public function yearAfter(string $year): GroupCollectorInterface
{ {
$this->query->whereYear('transaction_journals.date', '>=', $year); $this->query->whereYear('transaction_journals.date', '>=', $year);
return $this; return $this;
} }
/**
* @param string $year
* @return GroupCollectorInterface
*/
public function yearBefore(string $year): GroupCollectorInterface public function yearBefore(string $year): GroupCollectorInterface
{ {
$this->query->whereYear('transaction_journals.date', '<=', $year); $this->query->whereYear('transaction_journals.date', '<=', $year);
return $this; return $this;
} }
/**
* @param string $year
* @return GroupCollectorInterface
*/
public function yearIs(string $year): GroupCollectorInterface public function yearIs(string $year): GroupCollectorInterface
{ {
$this->query->whereYear('transaction_journals.date', '=', $year); $this->query->whereYear('transaction_journals.date', '=', $year);
return $this; return $this;
} }
/**
* @param string $year
* @return GroupCollectorInterface
*/
public function yearIsNot(string $year): GroupCollectorInterface
{
$this->query->whereYear('transaction_journals.date', '!=', $year);
return $this;
}
} }

View File

@@ -162,6 +162,36 @@ class GroupCollector implements GroupCollectorInterface
return $this; return $this;
} }
/**
* @inheritDoc
*/
public function descriptionDoesNotEnd(array $array): GroupCollectorInterface
{
$this->query->where(
static function (EloquentBuilder $q) use ($array) {
$q->where(
static function (EloquentBuilder $q1) use ($array) {
foreach ($array as $word) {
$keyword = sprintf('%%%s', $word);
$q1->where('transaction_journals.description', 'NOT LIKE', $keyword);
}
}
);
$q->where(
static function (EloquentBuilder $q2) use ($array) {
foreach ($array as $word) {
$keyword = sprintf('%%%s', $word);
$q2->where('transaction_groups.title', 'NOT LIKE', $keyword);
$q2->orWhereNull('transaction_groups.title');
}
}
);
}
);
return $this;
}
/** /**
* @inheritDoc * @inheritDoc
*/ */
@@ -177,6 +207,26 @@ class GroupCollector implements GroupCollectorInterface
return $this; return $this;
} }
/**
* @inheritDoc
*/
public function descriptionIsNot(string $value): GroupCollectorInterface
{
$this->query->where(
static function (EloquentBuilder $q) use ($value) {
$q->where('transaction_journals.description', '!=', $value);
$q->where(
static function (EloquentBuilder $q2) use ($value) {
$q2->where('transaction_groups.title', '!=', $value);
$q2->orWhereNull('transaction_groups.title');
}
);
}
);
return $this;
}
/** /**
* @inheritDoc * @inheritDoc
*/ */
@@ -206,6 +256,36 @@ class GroupCollector implements GroupCollectorInterface
return $this; return $this;
} }
/**
* @inheritDoc
*/
public function descriptionDoesNotStart(array $array): GroupCollectorInterface
{
$this->query->where(
static function (EloquentBuilder $q) use ($array) {
$q->where(
static function (EloquentBuilder $q1) use ($array) {
foreach ($array as $word) {
$keyword = sprintf('%s%%', $word);
$q1->where('transaction_journals.description', 'NOT LIKE', $keyword);
}
}
);
$q->where(
static function (EloquentBuilder $q2) use ($array) {
foreach ($array as $word) {
$keyword = sprintf('%s%%', $word);
$q2->where('transaction_groups.title', 'NOT LIKE', $keyword);
$q2->orWhereNull('transaction_groups.title');
}
}
);
}
);
return $this;
}
/** /**
* *
*/ */
@@ -546,7 +626,6 @@ class GroupCollector implements GroupCollectorInterface
* @var Closure $function * @var Closure $function
*/ */
foreach ($this->postFilters as $function) { foreach ($this->postFilters as $function) {
$nextCollection = new Collection; $nextCollection = new Collection;
// loop everything in the current collection // loop everything in the current collection
// and save it (or not) in the new collection. // and save it (or not) in the new collection.
@@ -618,6 +697,30 @@ class GroupCollector implements GroupCollectorInterface
return $this; return $this;
} }
/**
* Limit results to NOT a specific currency, either foreign or normal one.
*
* @param TransactionCurrency $currency
*
* @return GroupCollectorInterface
*/
public function excludeCurrency(TransactionCurrency $currency): GroupCollectorInterface
{
$this->query->where(
static function (EloquentBuilder $q) use ($currency) {
$q->where('source.transaction_currency_id','!=', $currency->id);
$q->where(
static function (EloquentBuilder $q2) use ($currency) {
$q2->where('source.foreign_currency_id','!=', $currency->id);
$q2->orWhereNull('source.foreign_currency_id');
}
);
}
);
return $this;
}
/** /**
* @inheritDoc * @inheritDoc
*/ */
@@ -628,6 +731,19 @@ class GroupCollector implements GroupCollectorInterface
return $this; return $this;
} }
/**
* @inheritDoc
*/
public function excludeForeignCurrency(TransactionCurrency $currency): GroupCollectorInterface
{
$this->query->where(static function(EloquentBuilder $q2) use ($currency) {
$q2->where('source.foreign_currency_id','!=', $currency->id);
$q2->orWhereNull('source.foreign_currency_id');
});
return $this;
}
/** /**
* Limit the result to a set of specific transaction groups. * Limit the result to a set of specific transaction groups.
* *
@@ -643,6 +759,21 @@ class GroupCollector implements GroupCollectorInterface
return $this; return $this;
} }
/**
* Limit the result to NOT a set of specific transaction groups.
*
* @param array $groupIds
*
* @return GroupCollectorInterface
*/
public function excludeIds(array $groupIds): GroupCollectorInterface
{
$this->query->whereNotIn('transaction_groups.id', $groupIds);
return $this;
}
/** /**
* Limit the result to a set of specific journals. * Limit the result to a set of specific journals.
* *
@@ -663,6 +794,26 @@ class GroupCollector implements GroupCollectorInterface
return $this; return $this;
} }
/**
* Limit the result to NOT a set of specific journals.
*
* @param array $journalIds
*
* @return GroupCollectorInterface
*/
public function excludeJournalIds(array $journalIds): GroupCollectorInterface
{
if (!empty($journalIds)) {
// make all integers.
$integerIDs = array_map('intval', $journalIds);
$this->query->whereNotIn('transaction_journals.id', $integerIDs);
}
return $this;
}
/** /**
* Set the page to get. * Set the page to get.
* *
@@ -688,6 +839,9 @@ class GroupCollector implements GroupCollectorInterface
*/ */
public function setSearchWords(array $array): GroupCollectorInterface public function setSearchWords(array $array): GroupCollectorInterface
{ {
if (0 === count($array)) {
return $this;
}
$this->query->where( $this->query->where(
static function (EloquentBuilder $q) use ($array) { static function (EloquentBuilder $q) use ($array) {
$q->where( $q->where(
@@ -712,6 +866,43 @@ class GroupCollector implements GroupCollectorInterface
return $this; return $this;
} }
/**
* Search for words in descriptions.
*
* @param array $array
*
* @return GroupCollectorInterface
*/
public function excludeSearchWords(array $array): GroupCollectorInterface
{
if (0 === count($array)) {
return $this;
}
$this->query->where(
static function (EloquentBuilder $q) use ($array) {
$q->where(
static function (EloquentBuilder $q1) use ($array) {
foreach ($array as $word) {
$keyword = sprintf('%%%s%%', $word);
$q1->where('transaction_journals.description', 'NOT LIKE', $keyword);
}
}
);
$q->where(
static function (EloquentBuilder $q2) use ($array) {
foreach ($array as $word) {
$keyword = sprintf('%%%s%%', $word);
$q2->where('transaction_groups.title', 'NOT LIKE', $keyword);
$q2->orWhereNull('transaction_groups.title');
}
}
);
}
);
return $this;
}
/** /**
* Limit the search to one specific transaction group. * Limit the search to one specific transaction group.
* *
@@ -740,6 +931,16 @@ class GroupCollector implements GroupCollectorInterface
return $this; return $this;
} }
/**
* @inheritDoc
*/
public function excludeTypes(array $types): GroupCollectorInterface
{
$this->query->whereNotIn('transaction_types.type', $types);
return $this;
}
/** /**
* Set the user object and start the query. * Set the user object and start the query.
* *
@@ -842,6 +1043,15 @@ class GroupCollector implements GroupCollectorInterface
return $this; return $this;
} }
/**
* @inheritDoc
*/
public function isNotReconciled(): GroupCollectorInterface
{
$this->query->where('source.reconciled', 0)->where('destination.reconciled', 0);
return $this;
}
/** /**
* @inheritDoc * @inheritDoc
*/ */

View File

@@ -48,6 +48,12 @@ interface GroupCollectorInterface
*/ */
public function amountIs(string $amount): GroupCollectorInterface; public function amountIs(string $amount): GroupCollectorInterface;
/**
* @param string $amount
*
* @return GroupCollectorInterface
*/
public function amountIsNot(string $amount): GroupCollectorInterface;
/** /**
* Only journals that are reconciled. * Only journals that are reconciled.
@@ -56,6 +62,13 @@ interface GroupCollectorInterface
*/ */
public function isReconciled(): GroupCollectorInterface; public function isReconciled(): GroupCollectorInterface;
/**
* Only journals that are reconciled.
*
* @return GroupCollectorInterface
*/
public function isNotReconciled(): GroupCollectorInterface;
/** /**
* @return GroupCollectorInterface * @return GroupCollectorInterface
*/ */
@@ -145,6 +158,12 @@ interface GroupCollectorInterface
*/ */
public function dayIs(string $day): GroupCollectorInterface; public function dayIs(string $day): GroupCollectorInterface;
/**
* @param string $day
* @return GroupCollectorInterface
*/
public function dayIsNot(string $day): GroupCollectorInterface;
/** /**
* End of the description must match: * End of the description must match:
* *
@@ -154,6 +173,15 @@ interface GroupCollectorInterface
*/ */
public function descriptionEnds(array $array): GroupCollectorInterface; public function descriptionEnds(array $array): GroupCollectorInterface;
/**
* End of the description must not match:
*
* @param array $array
*
* @return GroupCollectorInterface
*/
public function descriptionDoesNotEnd(array $array): GroupCollectorInterface;
/** /**
* Description must be: * Description must be:
* *
@@ -163,6 +191,15 @@ interface GroupCollectorInterface
*/ */
public function descriptionIs(string $value): GroupCollectorInterface; public function descriptionIs(string $value): GroupCollectorInterface;
/**
* Description must not be:
*
* @param string $value
*
* @return GroupCollectorInterface
*/
public function descriptionIsNot(string $value): GroupCollectorInterface;
/** /**
* Beginning of the description must match: * Beginning of the description must match:
* *
@@ -172,6 +209,16 @@ interface GroupCollectorInterface
*/ */
public function descriptionStarts(array $array): GroupCollectorInterface; public function descriptionStarts(array $array): GroupCollectorInterface;
/**
* Beginning of the description must not start with:
*
* @param array $array
*
* @return GroupCollectorInterface
*/
public function descriptionDoesNotStart(array $array): GroupCollectorInterface;
/** /**
* Exclude destination accounts. * Exclude destination accounts.
* *
@@ -190,6 +237,15 @@ interface GroupCollectorInterface
*/ */
public function excludeSourceAccounts(Collection $accounts): GroupCollectorInterface; public function excludeSourceAccounts(Collection $accounts): GroupCollectorInterface;
/**
* These accounts must not be accounts.
*
* @param Collection $accounts
*
* @return GroupCollectorInterface
*/
public function excludeAccounts(Collection $accounts): GroupCollectorInterface;
/** /**
* @param string $externalId * @param string $externalId
* @return GroupCollectorInterface * @return GroupCollectorInterface
@@ -242,6 +298,15 @@ interface GroupCollectorInterface
*/ */
public function foreignAmountIs(string $amount): GroupCollectorInterface; public function foreignAmountIs(string $amount): GroupCollectorInterface;
/**
* Get transactions with a specific foreign amount.
*
* @param string $amount
*
* @return GroupCollectorInterface
*/
public function foreignAmountIsNot(string $amount): GroupCollectorInterface;
/** /**
* Get transactions where the amount is less than. * Get transactions where the amount is less than.
* *
@@ -339,6 +404,13 @@ interface GroupCollectorInterface
*/ */
public function metaDayIs(string $day, string $field): GroupCollectorInterface; public function metaDayIs(string $day, string $field): GroupCollectorInterface;
/**
* @param string $day
* @param string $field
* @return GroupCollectorInterface
*/
public function metaDayIsNot(string $day, string $field): GroupCollectorInterface;
/** /**
* @param string $month * @param string $month
* @param string $field * @param string $field
@@ -360,6 +432,13 @@ interface GroupCollectorInterface
*/ */
public function metaMonthIs(string $month, string $field): GroupCollectorInterface; public function metaMonthIs(string $month, string $field): GroupCollectorInterface;
/**
* @param string $month
* @param string $field
* @return GroupCollectorInterface
*/
public function metaMonthIsNot(string $month, string $field): GroupCollectorInterface;
/** /**
* @param string $year * @param string $year
* @param string $field * @param string $field
@@ -381,6 +460,14 @@ interface GroupCollectorInterface
*/ */
public function metaYearIs(string $year, string $field): GroupCollectorInterface; public function metaYearIs(string $year, string $field): GroupCollectorInterface;
/**
* @param string $year
* @param string $field
* @return GroupCollectorInterface
*/
public function metaYearIsNot(string $year, string $field): GroupCollectorInterface;
/** /**
* @param string $month * @param string $month
* @return GroupCollectorInterface * @return GroupCollectorInterface
@@ -399,6 +486,12 @@ interface GroupCollectorInterface
*/ */
public function monthIs(string $month): GroupCollectorInterface; public function monthIs(string $month): GroupCollectorInterface;
/**
* @param string $month
* @return GroupCollectorInterface
*/
public function monthIsNot(string $month): GroupCollectorInterface;
/** /**
* @param string $value * @param string $value
* *
@@ -406,6 +499,13 @@ interface GroupCollectorInterface
*/ */
public function notesContain(string $value): GroupCollectorInterface; public function notesContain(string $value): GroupCollectorInterface;
/**
* @param string $value
*
* @return GroupCollectorInterface
*/
public function notesDoNotContain(string $value): GroupCollectorInterface;
/** /**
* @param string $value * @param string $value
* *
@@ -413,6 +513,13 @@ interface GroupCollectorInterface
*/ */
public function notesEndWith(string $value): GroupCollectorInterface; public function notesEndWith(string $value): GroupCollectorInterface;
/**
* @param string $value
*
* @return GroupCollectorInterface
*/
public function notesDontEndWith(string $value): GroupCollectorInterface;
/** /**
* @param string $value * @param string $value
* *
@@ -420,6 +527,13 @@ interface GroupCollectorInterface
*/ */
public function notesExactly(string $value): GroupCollectorInterface; public function notesExactly(string $value): GroupCollectorInterface;
/**
* @param string $value
*
* @return GroupCollectorInterface
*/
public function notesExactlyNot(string $value): GroupCollectorInterface;
/** /**
* @param string $value * @param string $value
* *
@@ -427,6 +541,12 @@ interface GroupCollectorInterface
*/ */
public function notesStartWith(string $value): GroupCollectorInterface; public function notesStartWith(string $value): GroupCollectorInterface;
/**
* @param string $value
* @return GroupCollectorInterface
*/
public function notesDontStartWith(string $value): GroupCollectorInterface;
/** /**
* @param string $day * @param string $day
* @param string $field * @param string $field
@@ -448,6 +568,13 @@ interface GroupCollectorInterface
*/ */
public function objectDayIs(string $day, string $field): GroupCollectorInterface; public function objectDayIs(string $day, string $field): GroupCollectorInterface;
/**
* @param string $day
* @param string $field
* @return GroupCollectorInterface
*/
public function objectDayIsNot(string $day, string $field): GroupCollectorInterface;
/** /**
* @param string $month * @param string $month
* @param string $field * @param string $field
@@ -469,6 +596,13 @@ interface GroupCollectorInterface
*/ */
public function objectMonthIs(string $month, string $field): GroupCollectorInterface; public function objectMonthIs(string $month, string $field): GroupCollectorInterface;
/**
* @param string $month
* @param string $field
* @return GroupCollectorInterface
*/
public function objectMonthIsNot(string $month, string $field): GroupCollectorInterface;
/** /**
* @param string $year * @param string $year
* @param string $field * @param string $field
@@ -490,6 +624,13 @@ interface GroupCollectorInterface
*/ */
public function objectYearIs(string $year, string $field): GroupCollectorInterface; public function objectYearIs(string $year, string $field): GroupCollectorInterface;
/**
* @param string $year
* @param string $field
* @return GroupCollectorInterface
*/
public function objectYearIsNot(string $year, string $field): GroupCollectorInterface;
/** /**
* Define which accounts can be part of the source and destination transactions. * Define which accounts can be part of the source and destination transactions.
* *
@@ -499,6 +640,18 @@ interface GroupCollectorInterface
*/ */
public function setAccounts(Collection $accounts): GroupCollectorInterface; public function setAccounts(Collection $accounts): GroupCollectorInterface;
/**
* Define which accounts can NOT be part of the source and destination transactions.
*
* @param Collection $accounts
*
* @return GroupCollectorInterface
*/
public function setNotAccounts(Collection $accounts): GroupCollectorInterface;
/** /**
* Collect transactions after a specific date. * Collect transactions after a specific date.
* *
@@ -535,6 +688,15 @@ interface GroupCollectorInterface
*/ */
public function setBills(Collection $bills): GroupCollectorInterface; public function setBills(Collection $bills): GroupCollectorInterface;
/**
* Exclude a specific set of bills
*
* @param Collection $bills
*
* @return GroupCollectorInterface
*/
public function excludeBills(Collection $bills): GroupCollectorInterface;
/** /**
* Both source AND destination must be in this list of accounts. * Both source AND destination must be in this list of accounts.
* *
@@ -553,6 +715,15 @@ interface GroupCollectorInterface
*/ */
public function setBudget(Budget $budget): GroupCollectorInterface; public function setBudget(Budget $budget): GroupCollectorInterface;
/**
* Exclude a budget
*
* @param Budget $budget
*
* @return GroupCollectorInterface
*/
public function excludeBudget(Budget $budget): GroupCollectorInterface;
/** /**
* Limit the search to a specific set of budgets. * Limit the search to a specific set of budgets.
* *
@@ -562,6 +733,15 @@ interface GroupCollectorInterface
*/ */
public function setBudgets(Collection $budgets): GroupCollectorInterface; public function setBudgets(Collection $budgets): GroupCollectorInterface;
/**
* Exclude a budget.
*
* @param Collection $budgets
*
* @return GroupCollectorInterface
*/
public function excludeBudgets(Collection $budgets): GroupCollectorInterface;
/** /**
* Limit the search to a specific bunch of categories. * Limit the search to a specific bunch of categories.
* *
@@ -572,13 +752,12 @@ interface GroupCollectorInterface
public function setCategories(Collection $categories): GroupCollectorInterface; public function setCategories(Collection $categories): GroupCollectorInterface;
/** /**
* Limit the search not to have a specific bunch of categories. * Exclude a set of categories.
* *
* @param Collection $categories * @param Collection $categories
*
* @return GroupCollectorInterface * @return GroupCollectorInterface
*/ */
public function setNotCategories(Collection $categories): GroupCollectorInterface; public function excludeCategories(Collection $categories): GroupCollectorInterface;
/** /**
* Limit the search to a specific category. * Limit the search to a specific category.
@@ -589,6 +768,15 @@ interface GroupCollectorInterface
*/ */
public function setCategory(Category $category): GroupCollectorInterface; public function setCategory(Category $category): GroupCollectorInterface;
/**
* Exclude a specific category
*
* @param Category $category
*
* @return GroupCollectorInterface
*/
public function excludeCategory(Category $category): GroupCollectorInterface;
/** /**
* Collect transactions created on a specific date. * Collect transactions created on a specific date.
* *
@@ -607,6 +795,15 @@ interface GroupCollectorInterface
*/ */
public function setCurrency(TransactionCurrency $currency): GroupCollectorInterface; public function setCurrency(TransactionCurrency $currency): GroupCollectorInterface;
/**
* Limit results to NOT a specific currency, either foreign or normal one.
*
* @param TransactionCurrency $currency
*
* @return GroupCollectorInterface
*/
public function excludeCurrency(TransactionCurrency $currency): GroupCollectorInterface;
/** /**
* Set destination accounts. * Set destination accounts.
* *
@@ -640,6 +837,15 @@ interface GroupCollectorInterface
*/ */
public function setForeignCurrency(TransactionCurrency $currency): GroupCollectorInterface; public function setForeignCurrency(TransactionCurrency $currency): GroupCollectorInterface;
/**
* Limit results to exclude a specific foreign currency.
*
* @param TransactionCurrency $currency
*
* @return GroupCollectorInterface
*/
public function excludeForeignCurrency(TransactionCurrency $currency): GroupCollectorInterface;
/** /**
* Limit the result to a set of specific transaction groups. * Limit the result to a set of specific transaction groups.
* *
@@ -649,6 +855,15 @@ interface GroupCollectorInterface
*/ */
public function setIds(array $groupIds): GroupCollectorInterface; public function setIds(array $groupIds): GroupCollectorInterface;
/**
* Limit the result to NOT a set of specific transaction groups.
*
* @param array $groupIds
*
* @return GroupCollectorInterface
*/
public function excludeIds(array $groupIds): GroupCollectorInterface;
/** /**
* Look for specific external ID's. * Look for specific external ID's.
* *
@@ -667,6 +882,15 @@ interface GroupCollectorInterface
*/ */
public function setJournalIds(array $journalIds): GroupCollectorInterface; public function setJournalIds(array $journalIds): GroupCollectorInterface;
/**
* Limit the result to NOT a set of specific transaction journals.
*
* @param array $journalIds
*
* @return GroupCollectorInterface
*/
public function excludeJournalIds(array $journalIds): GroupCollectorInterface;
/** /**
* Limit the number of returned entries. * Limit the number of returned entries.
* *
@@ -705,6 +929,16 @@ interface GroupCollectorInterface
*/ */
public function setMetaDateRange(Carbon $start, Carbon $end, string $field): GroupCollectorInterface; public function setMetaDateRange(Carbon $start, Carbon $end, string $field): GroupCollectorInterface;
/**
* @param Carbon $start
* @param Carbon $end
* @param string $field
* @return GroupCollectorInterface
*/
public function excludeMetaDateRange(Carbon $start, Carbon $end, string $field): GroupCollectorInterface;
/** /**
* @param Carbon $date * @param Carbon $date
* @param string $field * @param string $field
@@ -727,6 +961,14 @@ interface GroupCollectorInterface
*/ */
public function setObjectRange(Carbon $start, Carbon $end, string $field): GroupCollectorInterface; public function setObjectRange(Carbon $start, Carbon $end, string $field): GroupCollectorInterface;
/**
* @param Carbon $start
* @param Carbon $end
* @param string $field
* @return GroupCollectorInterface
*/
public function excludeObjectRange(Carbon $start, Carbon $end, string $field): GroupCollectorInterface;
/** /**
* Set the page to get. * Set the page to get.
* *
@@ -746,6 +988,13 @@ interface GroupCollectorInterface
*/ */
public function setRange(Carbon $start, Carbon $end): GroupCollectorInterface; public function setRange(Carbon $start, Carbon $end): GroupCollectorInterface;
/**
* @param Carbon $start
* @param Carbon $end
* @return GroupCollectorInterface
*/
public function excludeRange(Carbon $start, Carbon $end): GroupCollectorInterface;
/** /**
* Look for specific recurring ID's. * Look for specific recurring ID's.
* *
@@ -764,6 +1013,15 @@ interface GroupCollectorInterface
*/ */
public function setSearchWords(array $array): GroupCollectorInterface; public function setSearchWords(array $array): GroupCollectorInterface;
/**
* Exclude words in descriptions.
*
* @param array $array
*
* @return GroupCollectorInterface
*/
public function excludeSearchWords(array $array): GroupCollectorInterface;
/** /**
* Set source accounts. * Set source accounts.
* *
@@ -809,6 +1067,15 @@ interface GroupCollectorInterface
*/ */
public function setTypes(array $types): GroupCollectorInterface; public function setTypes(array $types): GroupCollectorInterface;
/**
* Limit the included transaction types.
*
* @param array $types
*
* @return GroupCollectorInterface
*/
public function excludeTypes(array $types): GroupCollectorInterface;
/** /**
* Collect transactions updated on a specific date. * Collect transactions updated on a specific date.
* *
@@ -1000,5 +1267,11 @@ interface GroupCollectorInterface
*/ */
public function yearIs(string $year): GroupCollectorInterface; public function yearIs(string $year): GroupCollectorInterface;
/**
* @param string $year
* @return GroupCollectorInterface
*/
public function yearIsNot(string $year): GroupCollectorInterface;
} }

File diff suppressed because it is too large Load Diff

View File

@@ -323,67 +323,120 @@ return [
// old // old
'search_modifier_date_on' => 'Transaction date is ":value"', 'search_modifier_date_on' => 'Transaction date is ":value"',
'search_modifier_not_date_on' => 'Transaction date is not ":value"',
'search_modifier_reconciled' => 'Transaction is reconciled', 'search_modifier_reconciled' => 'Transaction is reconciled',
'search_modifier_not_reconciled' => 'Transaction is not reconciled',
'search_modifier_id' => 'Transaction ID is ":value"', 'search_modifier_id' => 'Transaction ID is ":value"',
'search_modifier_date_before' => 'Transaction date is before or on ":value"', 'search_modifier_date_before' => 'Transaction date is before or on ":value"',
'search_modifier_date_after' => 'Transaction date is after or on ":value"', 'search_modifier_date_after' => 'Transaction date is after or on ":value"',
'search_modifier_external_id_is' => 'External ID is ":value"', 'search_modifier_external_id_is' => 'External ID is ":value"',
'search_modifier_no_external_url' => 'The transaction has no external URL', 'search_modifier_no_external_url' => 'The transaction has no external URL',
'search_modifier_not_any_external_url' => 'The transaction has no external URL',
'search_modifier_any_external_url' => 'The transaction must have a (any) external URL', 'search_modifier_any_external_url' => 'The transaction must have a (any) external URL',
'search_modifier_not_no_external_url' => 'The transaction must have a (any) external URL',
'search_modifier_internal_reference_is' => 'Internal reference is ":value"', 'search_modifier_internal_reference_is' => 'Internal reference is ":value"',
'search_modifier_description_starts' => 'Description is ":value"', 'search_modifier_description_starts' => 'Description starts with ":value"',
'search_modifier_description_ends' => 'Description ends with ":value"', 'search_modifier_not_description_starts' => 'Description does not start with ":value"',
'search_modifier_description_ends' => 'Description ends on ":value"',
'search_modifier_not_description_ends' => 'Description does not end on ":value"',
'search_modifier_description_contains' => 'Description contains ":value"', 'search_modifier_description_contains' => 'Description contains ":value"',
'search_modifier_not_description_contains' => 'Description does not contain ":value"',
'search_modifier_description_is' => 'Description is exactly ":value"', 'search_modifier_description_is' => 'Description is exactly ":value"',
'search_modifier_not_description_is' => 'Description is exactly not ":value"',
'search_modifier_currency_is' => 'Transaction (foreign) currency is ":value"', 'search_modifier_currency_is' => 'Transaction (foreign) currency is ":value"',
'search_modifier_not_currency_is' => 'Transaction (foreign) currency is not ":value"',
'search_modifier_foreign_currency_is' => 'Transaction foreign currency is ":value"', 'search_modifier_foreign_currency_is' => 'Transaction foreign currency is ":value"',
'search_modifier_not_foreign_currency_is' => 'Transaction foreign currency is not ":value"',
'search_modifier_has_attachments' => 'The transaction must have an attachment', 'search_modifier_has_attachments' => 'The transaction must have an attachment',
'search_modifier_has_no_category' => 'The transaction must have no category', 'search_modifier_has_no_category' => 'The transaction must have no category',
'search_modifier_not_has_no_category' => 'The transaction must have a (any) category',
'search_modifier_not_has_any_category' => 'The transaction must have no category',
'search_modifier_has_any_category' => 'The transaction must have a (any) category', 'search_modifier_has_any_category' => 'The transaction must have a (any) category',
'search_modifier_has_no_budget' => 'The transaction must have no budget', 'search_modifier_has_no_budget' => 'The transaction must have no budget',
'search_modifier_not_has_any_budget' => 'The transaction must have no budget',
'search_modifier_has_any_budget' => 'The transaction must have a (any) budget', 'search_modifier_has_any_budget' => 'The transaction must have a (any) budget',
'search_modifier_not_has_no_budget' => 'The transaction must have a (any) budget',
'search_modifier_has_no_bill' => 'The transaction must have no bill', 'search_modifier_has_no_bill' => 'The transaction must have no bill',
'search_modifier_not_has_no_bill' => 'The transaction must have a (any) bill',
'search_modifier_has_any_bill' => 'The transaction must have a (any) bill', 'search_modifier_has_any_bill' => 'The transaction must have a (any) bill',
'search_modifier_not_has_any_bill' => 'The transaction must have no bill',
'search_modifier_has_no_tag' => 'The transaction must have no tags', 'search_modifier_has_no_tag' => 'The transaction must have no tags',
'search_modifier_not_has_any_tag' => 'The transaction must have no tags',
'search_modifier_not_has_no_tag' => 'The transaction must have a (any) tag',
'search_modifier_has_any_tag' => 'The transaction must have a (any) tag', 'search_modifier_has_any_tag' => 'The transaction must have a (any) tag',
'search_modifier_notes_contains' => 'The transaction notes contain ":value"', 'search_modifier_notes_contains' => 'The transaction notes contain ":value"',
'search_modifier_not_notes_contains' => 'The transaction notes do not contain ":value"',
'search_modifier_notes_starts' => 'The transaction notes start with ":value"', 'search_modifier_notes_starts' => 'The transaction notes start with ":value"',
'search_modifier_not_notes_starts' => 'The transaction notes do not start with ":value"',
'search_modifier_notes_ends' => 'The transaction notes end with ":value"', 'search_modifier_notes_ends' => 'The transaction notes end with ":value"',
'search_modifier_not_notes_ends' => 'The transaction notes do not end with ":value"',
'search_modifier_notes_is' => 'The transaction notes are exactly ":value"', 'search_modifier_notes_is' => 'The transaction notes are exactly ":value"',
'search_modifier_not_notes_is' => 'The transaction notes are exactly not ":value"',
'search_modifier_no_notes' => 'The transaction has no notes', 'search_modifier_no_notes' => 'The transaction has no notes',
'search_modifier_not_no_notes' => 'The transaction must have notes',
'search_modifier_any_notes' => 'The transaction must have notes', 'search_modifier_any_notes' => 'The transaction must have notes',
'search_modifier_not_any_notes' => 'The transaction has no notes',
'search_modifier_amount_is' => 'Amount is exactly :value', 'search_modifier_amount_is' => 'Amount is exactly :value',
'search_modifier_not_amount_is' => 'Amount is not :value',
'search_modifier_amount_less' => 'Amount is less than or equal to :value', 'search_modifier_amount_less' => 'Amount is less than or equal to :value',
'search_modifier_not_amount_more' => 'Amount is less than or equal to :value',
'search_modifier_amount_more' => 'Amount is more than or equal to :value', 'search_modifier_amount_more' => 'Amount is more than or equal to :value',
'search_modifier_not_amount_less' => 'Amount is more than or equal to :value',
'search_modifier_source_account_is' => 'Source account name is exactly ":value"', 'search_modifier_source_account_is' => 'Source account name is exactly ":value"',
'search_modifier_not_source_account_is' => 'Source account name is not ":value"',
'search_modifier_source_account_contains' => 'Source account name contains ":value"', 'search_modifier_source_account_contains' => 'Source account name contains ":value"',
'search_modifier_not_source_account_contains' => 'Source account name does not contain ":value"',
'search_modifier_source_account_starts' => 'Source account name starts with ":value"', 'search_modifier_source_account_starts' => 'Source account name starts with ":value"',
'search_modifier_not_source_account_starts' => 'Source account name does not start with ":value"',
'search_modifier_source_account_ends' => 'Source account name ends with ":value"', 'search_modifier_source_account_ends' => 'Source account name ends with ":value"',
'search_modifier_not_source_account_ends' => 'Source account name does not end with ":value"',
'search_modifier_source_account_id' => 'Source account ID is :value', 'search_modifier_source_account_id' => 'Source account ID is :value',
'search_modifier_not_source_account_id' => 'Source account ID is not :value',
'search_modifier_source_account_nr_is' => 'Source account number (IBAN) is ":value"', 'search_modifier_source_account_nr_is' => 'Source account number (IBAN) is ":value"',
'search_modifier_not_source_account_nr_is' => 'Source account number (IBAN) is not ":value"',
'search_modifier_source_account_nr_contains' => 'Source account number (IBAN) contains ":value"', 'search_modifier_source_account_nr_contains' => 'Source account number (IBAN) contains ":value"',
'search_modifier_source_account_nr_starts' => 'Source account number (IBAN) starts with ":value"', 'search_modifier_source_account_nr_starts' => 'Source account number (IBAN) starts with ":value"',
'search_modifier_source_account_nr_ends' => 'Source account number (IBAN) ends with ":value"', 'search_modifier_not_source_account_nr_starts' => 'Source account number (IBAN) does not start with ":value"',
'search_modifier_source_account_nr_ends' => 'Source account number (IBAN) ends on ":value"',
'search_modifier_not_source_account_nr_ends' => 'Source account number (IBAN) does not end on ":value"',
'search_modifier_destination_account_is' => 'Destination account name is exactly ":value"', 'search_modifier_destination_account_is' => 'Destination account name is exactly ":value"',
'search_modifier_not_destination_account_is' => 'Destination account name is not ":value"',
'search_modifier_destination_account_contains' => 'Destination account name contains ":value"', 'search_modifier_destination_account_contains' => 'Destination account name contains ":value"',
'search_modifier_not_destination_account_contains' => 'Destination account name does not contain ":value"',
'search_modifier_destination_account_starts' => 'Destination account name starts with ":value"', 'search_modifier_destination_account_starts' => 'Destination account name starts with ":value"',
'search_modifier_destination_account_ends' => 'Destination account name ends with ":value"', 'search_modifier_not_destination_account_starts' => 'Destination account name does not start with ":value"',
'search_modifier_destination_account_ends' => 'Destination account name ends on ":value"',
'search_modifier_not_destination_account_ends' => 'Destination account name does not end on ":value"',
'search_modifier_destination_account_id' => 'Destination account ID is :value', 'search_modifier_destination_account_id' => 'Destination account ID is :value',
'search_modifier_destination_is_cash' => 'Destination account is (cash) account', 'search_modifier_not_destination_account_id' => 'Destination account ID is not :value',
'search_modifier_source_is_cash' => 'Source account is (cash) account', 'search_modifier_destination_is_cash' => 'Destination account is the "(cash)" account',
'search_modifier_not_destination_is_cash' => 'Destination account is not the "(cash)" account',
'search_modifier_source_is_cash' => 'Source account is the "(cash)" account',
'search_modifier_not_source_is_cash' => 'Source account is not the "(cash)" account',
'search_modifier_destination_account_nr_is' => 'Destination account number (IBAN) is ":value"', 'search_modifier_destination_account_nr_is' => 'Destination account number (IBAN) is ":value"',
'search_modifier_destination_account_nr_contains' => 'Destination account number (IBAN) contains ":value"', 'search_modifier_destination_account_nr_contains' => 'Destination account number (IBAN) contains ":value"',
'search_modifier_not_destination_account_nr_contains' => 'Destination account number (IBAN) does not contain ":value"',
'search_modifier_destination_account_nr_starts' => 'Destination account number (IBAN) starts with ":value"', 'search_modifier_destination_account_nr_starts' => 'Destination account number (IBAN) starts with ":value"',
'search_modifier_not_destination_account_nr_starts' => 'Destination account number (IBAN) does not start with ":value"',
'search_modifier_destination_account_nr_ends' => 'Destination account number (IBAN) ends with ":value"', 'search_modifier_destination_account_nr_ends' => 'Destination account number (IBAN) ends with ":value"',
'search_modifier_not_destination_account_nr_ends' => 'Destination account number (IBAN) does not end with ":value"',
'search_modifier_account_id' => 'Source or destination account ID\'s is/are: :value', 'search_modifier_account_id' => 'Source or destination account ID\'s is/are: :value',
'search_modifier_not_account_id' => 'Source or destination account ID\'s is/are not: :value',
'search_modifier_category_is' => 'Category is ":value"', 'search_modifier_category_is' => 'Category is ":value"',
'search_modifier_not_category_is' => 'Category is not ":value"',
'search_modifier_budget_is' => 'Budget is ":value"', 'search_modifier_budget_is' => 'Budget is ":value"',
'search_modifier_not_budget_is' => 'Budget is not ":value"',
'search_modifier_bill_is' => 'Bill is ":value"', 'search_modifier_bill_is' => 'Bill is ":value"',
'search_modifier_not_bill_is' => 'Bill is not ":value"',
'search_modifier_transaction_type' => 'Transaction type is ":value"', 'search_modifier_transaction_type' => 'Transaction type is ":value"',
'search_modifier_tag_is' => 'Tag is ":value"', 'search_modifier_tag_is' => 'Tag is ":value"',
'search_modifier_not_tag_is' => 'No tag is ":value"',
'search_modifier_date_on_year' => 'Transaction is in year ":value"', 'search_modifier_date_on_year' => 'Transaction is in year ":value"',
'search_modifier_not_date_on_year' => 'Transaction is not in year ":value"',
'search_modifier_date_on_month' => 'Transaction is in month ":value"', 'search_modifier_date_on_month' => 'Transaction is in month ":value"',
'search_modifier_not_date_on_month' => 'Transaction is not in month ":value"',
'search_modifier_date_on_day' => 'Transaction is on day of month ":value"', 'search_modifier_date_on_day' => 'Transaction is on day of month ":value"',
'search_modifier_not_date_on_day' => 'Transaction is not on day of month ":value"',
'search_modifier_date_before_year' => 'Transaction is before or in year ":value"', 'search_modifier_date_before_year' => 'Transaction is before or in year ":value"',
'search_modifier_date_before_month' => 'Transaction is before or in month ":value"', 'search_modifier_date_before_month' => 'Transaction is before or in month ":value"',
'search_modifier_date_before_day' => 'Transaction is before or on day of month ":value"', 'search_modifier_date_before_day' => 'Transaction is before or on day of month ":value"',
@@ -394,25 +447,40 @@ return [
// new // new
'search_modifier_tag_is_not' => 'No tag is ":value"', 'search_modifier_tag_is_not' => 'No tag is ":value"',
'search_modifier_not_tag_is_not' => 'Tag is ":value"',
'search_modifier_account_is' => 'Either account is ":value"', 'search_modifier_account_is' => 'Either account is ":value"',
'search_modifier_not_account_is' => 'Neither account is ":value"',
'search_modifier_account_contains' => 'Either account contains ":value"', 'search_modifier_account_contains' => 'Either account contains ":value"',
'search_modifier_not_account_contains' => 'Neither account contains ":value"',
'search_modifier_account_ends' => 'Either account ends with ":value"', 'search_modifier_account_ends' => 'Either account ends with ":value"',
'search_modifier_not_account_ends' => 'Neither account ends with ":value"',
'search_modifier_account_starts' => 'Either account starts with ":value"', 'search_modifier_account_starts' => 'Either account starts with ":value"',
'search_modifier_not_account_starts' => 'Neither account starts with ":value"',
'search_modifier_account_nr_is' => 'Either account number / IBAN is ":value"', 'search_modifier_account_nr_is' => 'Either account number / IBAN is ":value"',
'search_modifier_not_account_nr_is' => 'Neither account number / IBAN is ":value"',
'search_modifier_account_nr_contains' => 'Either account number / IBAN contains ":value"', 'search_modifier_account_nr_contains' => 'Either account number / IBAN contains ":value"',
'search_modifier_not_account_nr_contains' => 'Neither account number / IBAN contains ":value"',
'search_modifier_account_nr_ends' => 'Either account number / IBAN ends with ":value"', 'search_modifier_account_nr_ends' => 'Either account number / IBAN ends with ":value"',
'search_modifier_not_account_nr_ends' => 'Neither account number / IBAN ends with ":value"',
'search_modifier_account_nr_starts' => 'Either account number / IBAN starts with ":value"', 'search_modifier_account_nr_starts' => 'Either account number / IBAN starts with ":value"',
'search_modifier_not_account_nr_starts' => 'Neither account number / IBAN starts with ":value"',
'search_modifier_category_contains' => 'Category contains ":value"', 'search_modifier_category_contains' => 'Category contains ":value"',
'search_modifier_not_category_contains' => 'Category does not contain ":value"', 'search_modifier_not_category_contains' => 'Category does not contain ":value"',
'search_modifier_category_ends' => 'Category ends with ":value"', 'search_modifier_category_ends' => 'Category ends on ":value"',
'search_modifier_not_category_ends' => 'Category does not end on ":value"',
'search_modifier_category_starts' => 'Category starts with ":value"', 'search_modifier_category_starts' => 'Category starts with ":value"',
'search_modifier_budget_contains' => 'Budget contains ":value"', 'search_modifier_budget_contains' => 'Budget contains ":value"',
'search_modifier_not_budget_contains' => 'Budget does not contain ":value"',
'search_modifier_budget_ends' => 'Budget ends with ":value"', 'search_modifier_budget_ends' => 'Budget ends with ":value"',
'search_modifier_not_budget_ends' => 'Budget does not end on ":value"',
'search_modifier_budget_starts' => 'Budget starts with ":value"', 'search_modifier_budget_starts' => 'Budget starts with ":value"',
'search_modifier_not_budget_starts' => 'Budget does not end on ":value"',
'search_modifier_bill_contains' => 'Bill contains ":value"', 'search_modifier_bill_contains' => 'Bill contains ":value"',
'search_modifier_not_bill_contains' => 'Bill does not contain ":value"',
'search_modifier_bill_ends' => 'Bill ends with ":value"', 'search_modifier_bill_ends' => 'Bill ends with ":value"',
'search_modifier_not_bill_ends' => 'Bill ends does not end on ":value"',
'search_modifier_bill_starts' => 'Bill starts with ":value"', 'search_modifier_bill_starts' => 'Bill starts with ":value"',
'search_modifier_not_bill_starts' => 'Bill does not start with ":value"',
'search_modifier_external_id_contains' => 'External ID contains ":value"', 'search_modifier_external_id_contains' => 'External ID contains ":value"',
'search_modifier_external_id_ends' => 'External ID ends with ":value"', 'search_modifier_external_id_ends' => 'External ID ends with ":value"',
'search_modifier_external_id_starts' => 'External ID starts with ":value"', 'search_modifier_external_id_starts' => 'External ID starts with ":value"',
@@ -424,18 +492,29 @@ return [
'search_modifier_external_url_ends' => 'External URL ends with ":value"', 'search_modifier_external_url_ends' => 'External URL ends with ":value"',
'search_modifier_external_url_starts' => 'External URL starts with ":value"', 'search_modifier_external_url_starts' => 'External URL starts with ":value"',
'search_modifier_has_no_attachments' => 'Transaction has no attachments', 'search_modifier_has_no_attachments' => 'Transaction has no attachments',
'search_modifier_account_is_cash' => 'Either account is a cash account.', 'search_modifier_not_has_no_attachments' => 'Transaction has attachments',
'search_modifier_not_has_attachments' => 'Transaction has no attachments',
'search_modifier_account_is_cash' => 'Either account is the "(cash)" account.',
'search_modifier_not_account_is_cash' => 'Neither account is the "(cash)" account.',
'search_modifier_journal_id' => 'The journal ID is ":value"', 'search_modifier_journal_id' => 'The journal ID is ":value"',
'search_modifier_not_journal_id' => 'The journal ID is not ":value"',
'search_modifier_recurrence_id' => 'The recurring transaction ID is ":value"', 'search_modifier_recurrence_id' => 'The recurring transaction ID is ":value"',
'search_modifier_foreign_amount_is' => 'The foreign amount is ":value"', 'search_modifier_foreign_amount_is' => 'The foreign amount is ":value"',
'search_modifier_foreign_amount_less' => 'The foreign amount is less than ":value"', 'search_modifier_foreign_amount_less' => 'The foreign amount is less than ":value"',
'search_modifier_not_foreign_amount_more' => 'The foreign amount is less than ":value"',
'search_modifier_not_foreign_amount_less' => 'The foreign amount is more than ":value"',
'search_modifier_foreign_amount_more' => 'The foreign amount is more than ":value"', 'search_modifier_foreign_amount_more' => 'The foreign amount is more than ":value"',
'search_modifier_exists' => 'Transaction exists (any transaction)',
// date fields // date fields
'search_modifier_interest_date_on' => 'Transaction interest date is ":value"', 'search_modifier_interest_date_on' => 'Transaction interest date is ":value"',
'search_modifier_not_interest_date_on' => 'Transaction interest date is not ":value"',
'search_modifier_interest_date_on_year' => 'Transaction interest date is in year ":value"', 'search_modifier_interest_date_on_year' => 'Transaction interest date is in year ":value"',
'search_modifier_not_interest_date_on_year' => 'Transaction interest date is not in year ":value"',
'search_modifier_interest_date_on_month' => 'Transaction interest date is in month ":value"', 'search_modifier_interest_date_on_month' => 'Transaction interest date is in month ":value"',
'search_modifier_not_interest_date_on_month' => 'Transaction interest date is not in month ":value"',
'search_modifier_interest_date_on_day' => 'Transaction interest date is on day of month ":value"', 'search_modifier_interest_date_on_day' => 'Transaction interest date is on day of month ":value"',
'search_modifier_not_interest_date_on_day' => 'Transaction interest date is not on day of month ":value"',
'search_modifier_interest_date_before_year' => 'Transaction interest date is before or in year ":value"', 'search_modifier_interest_date_before_year' => 'Transaction interest date is before or in year ":value"',
'search_modifier_interest_date_before_month' => 'Transaction interest date is before or in month ":value"', 'search_modifier_interest_date_before_month' => 'Transaction interest date is before or in month ":value"',
'search_modifier_interest_date_before_day' => 'Transaction interest date is before or on day of month ":value"', 'search_modifier_interest_date_before_day' => 'Transaction interest date is before or on day of month ":value"',
@@ -445,6 +524,9 @@ return [
'search_modifier_book_date_on_year' => 'Transaction book date is in year ":value"', 'search_modifier_book_date_on_year' => 'Transaction book date is in year ":value"',
'search_modifier_book_date_on_month' => 'Transaction book date is in month ":value"', 'search_modifier_book_date_on_month' => 'Transaction book date is in month ":value"',
'search_modifier_book_date_on_day' => 'Transaction book date is on day of month ":value"', 'search_modifier_book_date_on_day' => 'Transaction book date is on day of month ":value"',
'search_modifier_not_book_date_on_year' => 'Transaction book date is not in year ":value"',
'search_modifier_not_book_date_on_month' => 'Transaction book date is not in month ":value"',
'search_modifier_not_book_date_on_day' => 'Transaction book date is not on day of month ":value"',
'search_modifier_book_date_before_year' => 'Transaction book date is before or in year ":value"', 'search_modifier_book_date_before_year' => 'Transaction book date is before or in year ":value"',
'search_modifier_book_date_before_month' => 'Transaction book date is before or in month ":value"', 'search_modifier_book_date_before_month' => 'Transaction book date is before or in month ":value"',
'search_modifier_book_date_before_day' => 'Transaction book date is before or on day of month ":value"', 'search_modifier_book_date_before_day' => 'Transaction book date is before or on day of month ":value"',
@@ -454,6 +536,9 @@ return [
'search_modifier_process_date_on_year' => 'Transaction process date is in year ":value"', 'search_modifier_process_date_on_year' => 'Transaction process date is in year ":value"',
'search_modifier_process_date_on_month' => 'Transaction process date is in month ":value"', 'search_modifier_process_date_on_month' => 'Transaction process date is in month ":value"',
'search_modifier_process_date_on_day' => 'Transaction process date is on day of month ":value"', 'search_modifier_process_date_on_day' => 'Transaction process date is on day of month ":value"',
'search_modifier_not_process_date_on_year' => 'Transaction process date is not in year ":value"',
'search_modifier_not_process_date_on_month' => 'Transaction process date is not in month ":value"',
'search_modifier_not_process_date_on_day' => 'Transaction process date is not on day of month ":value"',
'search_modifier_process_date_before_year' => 'Transaction process date is before or in year ":value"', 'search_modifier_process_date_before_year' => 'Transaction process date is before or in year ":value"',
'search_modifier_process_date_before_month' => 'Transaction process date is before or in month ":value"', 'search_modifier_process_date_before_month' => 'Transaction process date is before or in month ":value"',
'search_modifier_process_date_before_day' => 'Transaction process date is before or on day of month ":value"', 'search_modifier_process_date_before_day' => 'Transaction process date is before or on day of month ":value"',
@@ -463,6 +548,9 @@ return [
'search_modifier_due_date_on_year' => 'Transaction due date is in year ":value"', 'search_modifier_due_date_on_year' => 'Transaction due date is in year ":value"',
'search_modifier_due_date_on_month' => 'Transaction due date is in month ":value"', 'search_modifier_due_date_on_month' => 'Transaction due date is in month ":value"',
'search_modifier_due_date_on_day' => 'Transaction due date is on day of month ":value"', 'search_modifier_due_date_on_day' => 'Transaction due date is on day of month ":value"',
'search_modifier_not_due_date_on_year' => 'Transaction due date is not in year ":value"',
'search_modifier_not_due_date_on_month' => 'Transaction due date is not in month ":value"',
'search_modifier_not_due_date_on_day' => 'Transaction due date is not on day of month ":value"',
'search_modifier_due_date_before_year' => 'Transaction due date is before or in year ":value"', 'search_modifier_due_date_before_year' => 'Transaction due date is before or in year ":value"',
'search_modifier_due_date_before_month' => 'Transaction due date is before or in month ":value"', 'search_modifier_due_date_before_month' => 'Transaction due date is before or in month ":value"',
'search_modifier_due_date_before_day' => 'Transaction due date is before or on day of month ":value"', 'search_modifier_due_date_before_day' => 'Transaction due date is before or on day of month ":value"',
@@ -472,6 +560,9 @@ return [
'search_modifier_payment_date_on_year' => 'Transaction payment date is in year ":value"', 'search_modifier_payment_date_on_year' => 'Transaction payment date is in year ":value"',
'search_modifier_payment_date_on_month' => 'Transaction payment date is in month ":value"', 'search_modifier_payment_date_on_month' => 'Transaction payment date is in month ":value"',
'search_modifier_payment_date_on_day' => 'Transaction payment date is on day of month ":value"', 'search_modifier_payment_date_on_day' => 'Transaction payment date is on day of month ":value"',
'search_modifier_not_payment_date_on_year' => 'Transaction payment date is not in year ":value"',
'search_modifier_not_payment_date_on_month' => 'Transaction payment date is not in month ":value"',
'search_modifier_not_payment_date_on_day' => 'Transaction payment date is not on day of month ":value"',
'search_modifier_payment_date_before_year' => 'Transaction payment date is before or in year ":value"', 'search_modifier_payment_date_before_year' => 'Transaction payment date is before or in year ":value"',
'search_modifier_payment_date_before_month' => 'Transaction payment date is before or in month ":value"', 'search_modifier_payment_date_before_month' => 'Transaction payment date is before or in month ":value"',
'search_modifier_payment_date_before_day' => 'Transaction payment date is before or on day of month ":value"', 'search_modifier_payment_date_before_day' => 'Transaction payment date is before or on day of month ":value"',
@@ -481,6 +572,9 @@ return [
'search_modifier_invoice_date_on_year' => 'Transaction invoice date is in year ":value"', 'search_modifier_invoice_date_on_year' => 'Transaction invoice date is in year ":value"',
'search_modifier_invoice_date_on_month' => 'Transaction invoice date is in month ":value"', 'search_modifier_invoice_date_on_month' => 'Transaction invoice date is in month ":value"',
'search_modifier_invoice_date_on_day' => 'Transaction invoice date is on day of month ":value"', 'search_modifier_invoice_date_on_day' => 'Transaction invoice date is on day of month ":value"',
'search_modifier_not_invoice_date_on_year' => 'Transaction invoice date is not in year ":value"',
'search_modifier_not_invoice_date_on_month' => 'Transaction invoice date is not in month ":value"',
'search_modifier_not_invoice_date_on_day' => 'Transaction invoice date is not on day of month ":value"',
'search_modifier_invoice_date_before_year' => 'Transaction invoice date is before or in year ":value"', 'search_modifier_invoice_date_before_year' => 'Transaction invoice date is before or in year ":value"',
'search_modifier_invoice_date_before_month' => 'Transaction invoice date is before or in month ":value"', 'search_modifier_invoice_date_before_month' => 'Transaction invoice date is before or in month ":value"',
'search_modifier_invoice_date_before_day' => 'Transaction invoice date is before or on day of month ":value"', 'search_modifier_invoice_date_before_day' => 'Transaction invoice date is before or on day of month ":value"',
@@ -491,6 +585,9 @@ return [
'search_modifier_updated_at_on_year' => 'Transaction was last updated in year ":value"', 'search_modifier_updated_at_on_year' => 'Transaction was last updated in year ":value"',
'search_modifier_updated_at_on_month' => 'Transaction was last updated in month ":value"', 'search_modifier_updated_at_on_month' => 'Transaction was last updated in month ":value"',
'search_modifier_updated_at_on_day' => 'Transaction was last updated on day of month ":value"', 'search_modifier_updated_at_on_day' => 'Transaction was last updated on day of month ":value"',
'search_modifier_not_updated_at_on_year' => 'Transaction was not last updated in year ":value"',
'search_modifier_not_updated_at_on_month' => 'Transaction was not last updated in month ":value"',
'search_modifier_not_updated_at_on_day' => 'Transaction was not last updated on day of month ":value"',
'search_modifier_updated_at_before_year' => 'Transaction was last updated in or before year ":value"', 'search_modifier_updated_at_before_year' => 'Transaction was last updated in or before year ":value"',
'search_modifier_updated_at_before_month' => 'Transaction was last updated in or before month ":value"', 'search_modifier_updated_at_before_month' => 'Transaction was last updated in or before month ":value"',
'search_modifier_updated_at_before_day' => 'Transaction was last updated on or before day of month ":value"', 'search_modifier_updated_at_before_day' => 'Transaction was last updated on or before day of month ":value"',
@@ -500,6 +597,9 @@ return [
'search_modifier_created_at_on_year' => 'Transaction was created in year ":value"', 'search_modifier_created_at_on_year' => 'Transaction was created in year ":value"',
'search_modifier_created_at_on_month' => 'Transaction was created in month ":value"', 'search_modifier_created_at_on_month' => 'Transaction was created in month ":value"',
'search_modifier_created_at_on_day' => 'Transaction was created on day of month ":value"', 'search_modifier_created_at_on_day' => 'Transaction was created on day of month ":value"',
'search_modifier_not_created_at_on_year' => 'Transaction was not created in year ":value"',
'search_modifier_not_created_at_on_month' => 'Transaction was not created in month ":value"',
'search_modifier_not_created_at_on_day' => 'Transaction was not created on day of month ":value"',
'search_modifier_created_at_before_year' => 'Transaction was created in or before year ":value"', 'search_modifier_created_at_before_year' => 'Transaction was created in or before year ":value"',
'search_modifier_created_at_before_month' => 'Transaction was created in or before month ":value"', 'search_modifier_created_at_before_month' => 'Transaction was created in or before month ":value"',
'search_modifier_created_at_before_day' => 'Transaction was created on or before day of month ":value"', 'search_modifier_created_at_before_day' => 'Transaction was created on or before day of month ":value"',
@@ -509,26 +609,34 @@ return [
'search_modifier_interest_date_before' => 'Transaction interest date is on or before ":value"', 'search_modifier_interest_date_before' => 'Transaction interest date is on or before ":value"',
'search_modifier_interest_date_after' => 'Transaction interest date is on or after ":value"', 'search_modifier_interest_date_after' => 'Transaction interest date is on or after ":value"',
'search_modifier_book_date_on' => 'Transaction book date is on ":value"', 'search_modifier_book_date_on' => 'Transaction book date is on ":value"',
'search_modifier_not_book_date_on' => 'Transaction book date is not on ":value"',
'search_modifier_book_date_before' => 'Transaction book date is on or before ":value"', 'search_modifier_book_date_before' => 'Transaction book date is on or before ":value"',
'search_modifier_book_date_after' => 'Transaction book date is on or after ":value"', 'search_modifier_book_date_after' => 'Transaction book date is on or after ":value"',
'search_modifier_process_date_on' => 'Transaction process date is on ":value"', 'search_modifier_process_date_on' => 'Transaction process date is on ":value"',
'search_modifier_not_process_date_on' => 'Transaction process date is not on ":value"',
'search_modifier_process_date_before' => 'Transaction process date is on or before ":value"', 'search_modifier_process_date_before' => 'Transaction process date is on or before ":value"',
'search_modifier_process_date_after' => 'Transaction process date is on or after ":value"', 'search_modifier_process_date_after' => 'Transaction process date is on or after ":value"',
'search_modifier_due_date_on' => 'Transaction due date is on ":value"', 'search_modifier_due_date_on' => 'Transaction due date is on ":value"',
'search_modifier_not_due_date_on' => 'Transaction due date is not on ":value"',
'search_modifier_due_date_before' => 'Transaction due date is on or before ":value"', 'search_modifier_due_date_before' => 'Transaction due date is on or before ":value"',
'search_modifier_due_date_after' => 'Transaction due date is on or after ":value"', 'search_modifier_due_date_after' => 'Transaction due date is on or after ":value"',
'search_modifier_payment_date_on' => 'Transaction payment date is on ":value"', 'search_modifier_payment_date_on' => 'Transaction payment date is on ":value"',
'search_modifier_not_payment_date_on' => 'Transaction payment date is not on ":value"',
'search_modifier_payment_date_before' => 'Transaction payment date is on or before ":value"', 'search_modifier_payment_date_before' => 'Transaction payment date is on or before ":value"',
'search_modifier_payment_date_after' => 'Transaction payment date is on or after ":value"', 'search_modifier_payment_date_after' => 'Transaction payment date is on or after ":value"',
'search_modifier_invoice_date_on' => 'Transaction invoice date is on ":value"', 'search_modifier_invoice_date_on' => 'Transaction invoice date is on ":value"',
'search_modifier_not_invoice_date_on' => 'Transaction invoice date is not on ":value"',
'search_modifier_invoice_date_before' => 'Transaction invoice date is on or before ":value"', 'search_modifier_invoice_date_before' => 'Transaction invoice date is on or before ":value"',
'search_modifier_invoice_date_after' => 'Transaction invoice date is on or after ":value"', 'search_modifier_invoice_date_after' => 'Transaction invoice date is on or after ":value"',
'search_modifier_created_at_on' => 'Transaction was created on ":value"', 'search_modifier_created_at_on' => 'Transaction was created on ":value"',
'search_modifier_not_created_at_on' => 'Transaction was not created on ":value"',
'search_modifier_created_at_before' => 'Transaction was created on or before ":value"', 'search_modifier_created_at_before' => 'Transaction was created on or before ":value"',
'search_modifier_created_at_after' => 'Transaction was created on or after ":value"', 'search_modifier_created_at_after' => 'Transaction was created on or after ":value"',
'search_modifier_updated_at_on' => 'Transaction was updated on ":value"', 'search_modifier_updated_at_on' => 'Transaction was updated on ":value"',
'search_modifier_not_updated_at_on' => 'Transaction was not updated on ":value"',
'search_modifier_updated_at_before' => 'Transaction was updated on or before ":value"', 'search_modifier_updated_at_before' => 'Transaction was updated on or before ":value"',
'search_modifier_updated_at_after' => 'Transaction was updated on or after ":value"', 'search_modifier_updated_at_after' => 'Transaction was updated on or after ":value"',
'search_modifier_attachment_name_is' => 'Any attachment\'s name is ":value"', 'search_modifier_attachment_name_is' => 'Any attachment\'s name is ":value"',
'search_modifier_attachment_name_contains' => 'Any attachment\'s name contains ":value"', 'search_modifier_attachment_name_contains' => 'Any attachment\'s name contains ":value"',
'search_modifier_attachment_name_starts' => 'Any attachment\'s name starts with ":value"', 'search_modifier_attachment_name_starts' => 'Any attachment\'s name starts with ":value"',