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; }