Skip to content

Commit

Permalink
Merge branch 'pu/pm/SalesDocumentsDivisionFilter' into '2024.11'
Browse files Browse the repository at this point in the history
tweak(Sales Division) documents filter for division

See merge request tine20/tine20!4745
  • Loading branch information
paulmhh committed Jan 11, 2024
2 parents ecd76a3 + 97cc044 commit ffcac5e
Show file tree
Hide file tree
Showing 4 changed files with 123 additions and 1 deletion.
33 changes: 33 additions & 0 deletions tests/tine20/Sales/Document/ControllerTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -120,6 +120,39 @@ public function testCustomerFilterForDocuments()

$feFilter = $filter->toArray(true);
$this->assertSame($filterArray, $feFilter);

$result = Sales_Controller_Document_Order::getInstance()->search(Tinebase_Model_Filter_FilterGroup::getFilterForModel(
Sales_Model_Document_Offer::class, [
['field' => 'division_id', 'operator' => 'equals', 'value' => Sales_Config::getInstance()->{Sales_Config::DEFAULT_DIVISION}],
]
));
$this->assertSame(1, $result->count());

$result = Sales_Controller_Document_Order::getInstance()->search(Tinebase_Model_Filter_FilterGroup::getFilterForModel(
Sales_Model_Document_Offer::class, [
['field' => 'division_id', 'operator' => 'not', 'value' => Sales_Config::getInstance()->{Sales_Config::DEFAULT_DIVISION}],
]
));
$this->assertSame(0, $result->count());

$division = Sales_Controller_Division::getInstance()->get(Sales_Config::getInstance()->{Sales_Config::DEFAULT_DIVISION});
$result = Sales_Controller_Document_Order::getInstance()->search(Tinebase_Model_Filter_FilterGroup::getFilterForModel(
Sales_Model_Document_Offer::class, [
['field' => 'division_id', 'operator' => 'definedBy', 'value' => [
['field' => 'title', 'operator' => 'equals', 'value' => $division->title],
]],
]
));
$this->assertSame(1, $result->count());

$result = Sales_Controller_Document_Order::getInstance()->search(Tinebase_Model_Filter_FilterGroup::getFilterForModel(
Sales_Model_Document_Offer::class, [
['field' => 'division_id', 'operator' => 'notDefinedBy', 'value' => [
['field' => 'title', 'operator' => 'equals', 'value' => $division->title],
]],
]
));
$this->assertSame(0, $result->count());
}

public function testOrderAddresses()
Expand Down
22 changes: 22 additions & 0 deletions tine20/Sales/Model/Document/Abstract.php
Original file line number Diff line number Diff line change
Expand Up @@ -146,6 +146,23 @@ abstract class Sales_Model_Document_Abstract extends Tinebase_Record_NewAbstract
]
],

self::FILTER_MODEL => [
Sales_Model_Debitor::FLD_DIVISION_ID => [
self::LABEL => 'Division', // _('Division')
self::FILTER => Sales_Model_Document_DivisionFilter::class,
self::OPTIONS => [
self::MODEL_NAME => 'xxx',
],
'jsConfig' => [
'filtertype' => 'foreignrecord',
'linkType' => 'foreignId',
'foreignRecordClass' => 'xxx',
'multipleForeignRecords' => true,
'defaultOperator' => 'definedBy'
],
],
],

self::FIELDS => [
self::FLD_DOCUMENT_NUMBER => [
self::TYPE => self::TYPE_NUMBERABLE_STRING,
Expand Down Expand Up @@ -427,6 +444,11 @@ public static function inheritModelConfigHook(array &$_definition)
)->_(static::$_documentNumberPrefix);
$_definition[self::FIELDS][self::FLD_DOCUMENT_NUMBER][self::CONFIG][Tinebase_Numberable::CONFIG_OVERRIDE] =
'Sales_Controller_' . static::MODEL_NAME_PART . '::documentNumberConfigOverride';

$_definition[self::FILTER_MODEL][Sales_Model_Debitor::FLD_DIVISION_ID][self::OPTIONS][self::MODEL_NAME] =
'Sales_Model_' . static::MODEL_NAME_PART;
$_definition[self::FILTER_MODEL][Sales_Model_Debitor::FLD_DIVISION_ID]['jsConfig']['foreignRecordClass'] =
'Sales_Model_' . static::MODEL_NAME_PART;
}

public function isBooked(): bool
Expand Down
3 changes: 2 additions & 1 deletion tine20/Sales/Model/Document/Debitor.php
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ class Sales_Model_Document_Debitor extends Sales_Model_Debitor

public const FLD_DOCUMENT_ID = 'document_id';

public static string $documentIdModel = Sales_Model_Document_Offer::MODEL_NAME_PART;
/**
* @param array $_definition
*/
Expand Down Expand Up @@ -60,7 +61,7 @@ public static function inheritModelConfigHook(array &$_definition)
self::NORESOLVE => true,
self::CONFIG => [
self::APP_NAME => Sales_Config::APP_NAME,
self::MODEL_NAME => Sales_Model_Document_Offer::MODEL_NAME_PART, // TODO not nice, it can be any document really...
self::MODEL_NAME => self::$documentIdModel, // TODO not nice, it can be any document really...
],
];
}
Expand Down
66 changes: 66 additions & 0 deletions tine20/Sales/Model/Document/DivisionFilter.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
<?php declare(strict_types=1);
/**
* Tine 2.0
* @package Sales
* @subpackage Model
* @license http://www.gnu.org/licenses/agpl.html AGPL Version 3
* @author Paul Mehrer <[email protected]>
* @copyright Copyright (c) 2024 Metaways Infosystems GmbH (http://www.metaways.de)
*/

use Tinebase_ModelConfiguration_Const as TMCC;
use Tinebase_Model_Filter_Abstract as TMFA;

class Sales_Model_Document_DivisionFilter extends Tinebase_Model_Filter_ForeignRecords
{
protected $_orgOrgOperator = null;

/**
* set options
*
* @param array $_options
* @throws Tinebase_Exception_InvalidArgument
*/
protected function _setOptions(array $_options)
{
$_options[TMCC::REF_ID_FIELD] = Sales_Model_Document_Debitor::FLD_DOCUMENT_ID;
$_options[TMCC::RECORD_CLASS_NAME] = Sales_Model_Document_Debitor::class;
$_options[TMCC::CONTROLLER_CLASS_NAME] = Sales_Controller_Document_Debitor::class;
parent::_setOptions($_options);
}

public function setOperator($_operator)
{
$this->_orgOrgOperator = $_operator;

parent::setOperator('definedBy');
}

public function setValue($_value)
{
$value = [
[TMFA::FIELD => Sales_Model_Debitor::FLD_DIVISION_ID, TMFA::OPERATOR => $this->_orgOrgOperator, TMFA::VALUE => $_value],
];
Sales_Model_Document_Debitor::$documentIdModel = $this->_options[TMCC::MODEL_NAME];
Sales_Model_Document_Debitor::resetConfiguration();
parent::setValue($value);
}

public function appendFilterSql($_select, $_backend)
{
Sales_Model_Document_Debitor::$documentIdModel = $this->_options[TMCC::MODEL_NAME];
Sales_Model_Document_Debitor::resetConfiguration();
parent::appendFilterSql($_select, $_backend);
}

public function toArray($_valueToJson = false)
{
$result = parent::toArray($_valueToJson);
$result['operator'] = $this->_orgOrgOperator;
if ($_valueToJson) {
$result['value'] = $result['value'][0]['value'];
}
return $result;
}
}

0 comments on commit ffcac5e

Please sign in to comment.