From 2a921167a12e490704197c2b1160fd30172fccbe Mon Sep 17 00:00:00 2001
From: Paul Mehrer
Date: Fri, 12 Jan 2024 18:56:34 +0100
Subject: [PATCH] tweak(TB ForeignRecordsFilter) not/definedBy empty value
fixed
---
tests/tine20/Sales/ControllerTest.php | 37 ++++++++++++++++++-
tine20/Addressbook/Model/ListMemberFilter.php | 3 ++
.../Tinebase/Model/Filter/ForeignRecords.php | 26 ++++++++++++-
3 files changed, 64 insertions(+), 2 deletions(-)
diff --git a/tests/tine20/Sales/ControllerTest.php b/tests/tine20/Sales/ControllerTest.php
index 3b002df5348..cc0fc864db4 100644
--- a/tests/tine20/Sales/ControllerTest.php
+++ b/tests/tine20/Sales/ControllerTest.php
@@ -48,7 +48,42 @@ protected function setUp(): void
$this->_backend->setNumberPrefix();
$this->_backend->setNumberZerofill();
}
-
+
+ public function testEvalDimFilter()
+ {
+ $cc = Tinebase_Controller_EvaluationDimension::getInstance()->getAll()->find(Tinebase_Model_EvaluationDimension::FLD_NAME, Tinebase_Model_EvaluationDimension::COST_CENTER);
+ $cc->{Tinebase_Model_EvaluationDimension::FLD_ITEMS} =
+ new Tinebase_Record_RecordSet(Tinebase_Model_EvaluationDimensionItem::class, [
+ new Tinebase_Model_EvaluationDimensionItem([
+ Tinebase_Model_EvaluationDimensionItem::FLD_NAME => 'foo',
+ Tinebase_Model_EvaluationDimensionItem::FLD_NUMBER => '1',
+ ], true),
+ new Tinebase_Model_EvaluationDimensionItem([
+ Tinebase_Model_EvaluationDimensionItem::FLD_NAME => 'bar',
+ Tinebase_Model_EvaluationDimensionItem::FLD_NUMBER => '2',
+ 'divisions' => new Tinebase_Record_RecordSet(Sales_Model_DivisionEvalDimensionItem::class, [
+ new Sales_Model_DivisionEvalDimensionItem([
+ Sales_Model_DivisionEvalDimensionItem::FLD_DIVISION_ID => Sales_Config::getInstance()->{Sales_Config::DEFAULT_DIVISION},
+ ], true),
+ ]),
+ ], true),
+ ]);
+ $cc = Tinebase_Controller_EvaluationDimension::getInstance()->update($cc);
+ $foo = $cc->{Tinebase_Model_EvaluationDimension::FLD_ITEMS}->find(Tinebase_Model_EvaluationDimensionItem::FLD_NAME, 'foo');
+ $bar = $cc->{Tinebase_Model_EvaluationDimension::FLD_ITEMS}->find(Tinebase_Model_EvaluationDimensionItem::FLD_NAME, 'bar');
+
+ $result = Tinebase_Controller_EvaluationDimensionItem::getInstance()->search(Tinebase_Model_Filter_FilterGroup::getFilterForModel(Tinebase_Model_EvaluationDimensionItem::class, [
+ ['field' => 'divisions', 'operator' => 'definedBy', 'value' => null],
+ ['field' => 'divisions', 'operator' => 'definedBy', 'value' => [
+ ['field' => 'division_id', 'operator' => 'in', 'value' => [Sales_Config::getInstance()->{Sales_Config::DEFAULT_DIVISION}]]
+ ]],
+ ], Tinebase_Model_Filter_FilterGroup::CONDITION_OR));
+
+ $this->assertGreaterThanOrEqual(2, $result->count());
+ $this->assertInstanceOf(Tinebase_Model_EvaluationDimensionItem::class, $result->getById($foo->getId()));
+ $this->assertInstanceOf(Tinebase_Model_EvaluationDimensionItem::class, $result->getById($bar->getId()));
+ }
+
/**
* tests for the costcenter controller
*/
diff --git a/tine20/Addressbook/Model/ListMemberFilter.php b/tine20/Addressbook/Model/ListMemberFilter.php
index 2e5864deead..cdc381c8ba6 100644
--- a/tine20/Addressbook/Model/ListMemberFilter.php
+++ b/tine20/Addressbook/Model/ListMemberFilter.php
@@ -36,6 +36,9 @@ protected function _setOptions(array $_options)
*/
protected function _setFilterGroup()
{
+ if ($this->_valueIsNull) {
+ return;
+ }
if ($this->_field === 'contact') {
$this->_options['filtergroup'] = Addressbook_Model_Contact::class;
} else {
diff --git a/tine20/Tinebase/Model/Filter/ForeignRecords.php b/tine20/Tinebase/Model/Filter/ForeignRecords.php
index a13b5404417..d6dbe00116c 100644
--- a/tine20/Tinebase/Model/Filter/ForeignRecords.php
+++ b/tine20/Tinebase/Model/Filter/ForeignRecords.php
@@ -44,6 +44,14 @@ protected function _setOptions(array $_options)
parent::_setOptions($_options);
}
+ public function setValue($_value)
+ {
+ parent::setValue($_value);
+ if ($this->_valueIsNull) {
+ $this->_setFilterGroup();
+ }
+ }
+
/**
* appends sql to given select statement
*
@@ -101,7 +109,23 @@ public function appendFilterSql($_select, $_backend)
$this->_field = 'id';
try {
- parent::appendFilterSql($_select, $_backend);
+ if ($this->_valueIsNull) {
+ if (strpos($this->_operator, 'not') === 0) {
+ if (empty($this->_foreignIds)) {
+ $_select->where('1 = 0');
+ } else {
+ $_select->where($this->_getQuotedFieldName($_backend) . ' IN (?)', $this->_foreignIds);
+ }
+ } else {
+ if (empty($this->_foreignIds)) {
+ $_select->where('1 = 1');
+ } else {
+ $_select->where($this->_getQuotedFieldName($_backend) . ' NOT IN (?)', $this->_foreignIds);
+ }
+ }
+ } else {
+ parent::appendFilterSql($_select, $_backend);
+ }
} finally {
$this->_field = $orgField;
}