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

@@ -162,6 +162,36 @@ class GroupCollector implements GroupCollectorInterface
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
*/
@@ -177,6 +207,26 @@ class GroupCollector implements GroupCollectorInterface
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
*/
@@ -206,6 +256,36 @@ class GroupCollector implements GroupCollectorInterface
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
*/
foreach ($this->postFilters as $function) {
$nextCollection = new Collection;
// loop everything in the current collection
// and save it (or not) in the new collection.
@@ -618,6 +697,30 @@ class GroupCollector implements GroupCollectorInterface
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
*/
@@ -628,6 +731,19 @@ class GroupCollector implements GroupCollectorInterface
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.
*
@@ -643,6 +759,21 @@ class GroupCollector implements GroupCollectorInterface
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.
*
@@ -663,6 +794,26 @@ class GroupCollector implements GroupCollectorInterface
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.
*
@@ -688,6 +839,9 @@ class GroupCollector implements GroupCollectorInterface
*/
public function setSearchWords(array $array): GroupCollectorInterface
{
if (0 === count($array)) {
return $this;
}
$this->query->where(
static function (EloquentBuilder $q) use ($array) {
$q->where(
@@ -712,6 +866,43 @@ class GroupCollector implements GroupCollectorInterface
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.
*
@@ -740,6 +931,16 @@ class GroupCollector implements GroupCollectorInterface
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.
*
@@ -842,6 +1043,15 @@ class GroupCollector implements GroupCollectorInterface
return $this;
}
/**
* @inheritDoc
*/
public function isNotReconciled(): GroupCollectorInterface
{
$this->query->where('source.reconciled', 0)->where('destination.reconciled', 0);
return $this;
}
/**
* @inheritDoc
*/