Current Path : /var/www/axolotl/data/www/nn.axolotls.ru/bitrix/modules/crm/lib/filter/ |
Current File : /var/www/axolotl/data/www/nn.axolotls.ru/bitrix/modules/crm/lib/filter/timelinedataprovider.php |
<?php namespace Bitrix\Crm\Filter; use Bitrix\Main; use Bitrix\Main\Localization\Loc; use Bitrix\Crm; Loc::loadMessages(__FILE__); class TimelineDataProvider extends DataProvider { /** @var TimelineSettings|null */ protected $settings = null; function __construct(TimelineSettings $settings) { $this->settings = $settings; } /** * Get Settings * @return TimelineSettings */ public function getSettings() { return $this->settings; } /** * Prepare field list. * @return Field[] * @throws Main\ArgumentException */ public function prepareFields() { $result = array( 'ENTRY_CATEGORY_ID' => $this->createField( 'ENTRY_CATEGORY_ID', array( 'name' => Loc::getMessage('CRM_TIMELINE_FILTER_ENTRY_CATEGORY'), 'type' => 'list', 'default' => true, 'partial' => true ) ), 'CREATED' => $this->createField( 'CREATED', array( 'name' => Loc::getMessage('CRM_TIMELINE_FILTER_CREATED'), 'type' => 'date', 'default' => true ) ), 'AUTHOR_ID' => $this->createField( 'AUTHOR_ID', array( 'name' => Loc::getMessage('CRM_TIMELINE_FILTER_AUTHOR'), 'type' => 'dest_selector', 'default' => true, 'partial' => true ) ), 'CLIENT' => $this->createField( 'CLIENT', array( 'name' => Loc::getMessage('CRM_TIMELINE_FILTER_CLIENT'), 'type' => 'dest_selector', 'default' => false, 'partial' => true ) ) ); return $result; } /** * Prepare complete field data for specified field. * @param string $fieldID Field ID. * @return array|null */ public function prepareFieldData($fieldID) { if($fieldID === 'ENTRY_CATEGORY_ID') { return array( 'params' => array('multiple' => 'Y'), 'items' => TimelineEntryCategory::getDescriptions() ); } elseif($fieldID === 'AUTHOR_ID') { return array( 'params' => array( 'context' => 'CRM_TIMELINE_FILTER_AUTHOR_ID', 'multiple' => 'Y', 'contextCode' => 'U', 'enableAll' => 'N', 'enableSonetgroups' => 'N', 'allowEmailInvitation' => 'N', 'allowSearchEmailUsers' => 'N', 'departmentSelectDisable' => 'Y', 'isNumeric' => 'Y', 'prefix' => 'U' ) ); } elseif($fieldID === 'CLIENT') { return array( 'params' => array( 'apiVersion' => 3, 'context' => 'CRM_TIMELINE_FILTER_CLIENT', 'contextCode' => 'CRM', 'useClientDatabase' => 'N', 'enableAll' => 'N', 'enableDepartments' => 'N', 'enableUsers' => 'N', 'enableSonetgroups' => 'N', 'allowEmailInvitation' => 'N', 'allowSearchEmailUsers' => 'N', 'departmentSelectDisable' => 'Y', 'enableCrm' => 'Y', 'enableCrmContacts' => 'Y', 'enableCrmCompanies' => 'Y', 'addTabCrmContacts' => 'Y', 'addTabCrmCompanies' => 'Y', 'convertJson' => 'Y', 'multiple' => 'Y' ) ); } return null; } /** * @param Main\Entity\Query $query * @param array $filter */ public static function prepareQuery($query, $filter) { //region Search Content $searchContentBuilder = new Crm\Search\TimelineSearchContentBuilder(); $searchContentBuilder->convertEntityFilterValues($filter); $searchContentFilter = $searchContentBuilder->prepareEntityFilter($filter); if(!empty($searchContentFilter)) { $searchContentQuery = new Main\Entity\Query(Crm\Timeline\Entity\TimelineSearchTable::getEntity()); foreach($searchContentFilter as $k => $v) { $searchContentQuery->addFilter($k, $v); } $searchContentQuery->addSelect('OWNER_ID'); $query->registerRuntimeField('', new Main\Entity\ReferenceField('search', Main\Entity\Base::getInstanceByQuery($searchContentQuery), array('=this.ID' => 'ref.OWNER_ID'), array('join_type' => 'INNER') ) ); } //endregion TimelineEntryCategory::prepareQuery($query, $filter); $createdDateFilter = Main\Entity\Query::filter(); $createdDateFilter->logic('and'); foreach(Crm\UI\Filter\EntityHandler::findAllFieldOperations('CREATED', $filter) as $operationInfo) { $date = $operationInfo['CONDITION'] instanceof Main\Type\DateTime ? $operationInfo['CONDITION'] : Main\Type\DateTime::tryParse($operationInfo['CONDITION']); if($date !== null) { $createdDateFilter->where('CREATED', $operationInfo['OPERATION'], $date); } } if($createdDateFilter->hasConditions()) { $query->where($createdDateFilter); } $operationInfo = Crm\UI\Filter\EntityHandler::findFieldOperation('AUTHOR_ID', $filter); if(is_array($operationInfo)) { if(is_array($operationInfo['CONDITION']) && $operationInfo['OPERATION'] === '=') { $query->whereIn('AUTHOR_ID', $operationInfo['CONDITION']); } else { $query->where('AUTHOR_ID', $operationInfo['OPERATION'], $operationInfo['CONDITION']); } } $operationInfo = Crm\UI\Filter\EntityHandler::findFieldOperation('CLIENT', $filter); if(is_array($operationInfo)) { $clientFilter = Main\Entity\Query::filter(); $clientFilter->logic('or'); foreach($operationInfo['CONDITION'] as $condition) { $entityInfo = \CCrmOwnerType::ParseEntitySlug($condition); if(is_array($entityInfo)) { $clientFilter->where( Main\Entity\Query::filter() ->where('ENTITY_TYPE_ID', '=', $entityInfo['ENTITY_TYPE_ID']) ->where('ENTITY_ID', '=', $entityInfo['ENTITY_ID']) ); } } if($clientFilter->hasConditions()) { $clientBindingQuery = new Main\Entity\Query(Crm\Timeline\Entity\TimelineBindingTable::getEntity()); $clientBindingQuery->addSelect('OWNER_ID'); $clientBindingQuery->where($clientFilter); $query->registerRuntimeField('', new Main\Entity\ReferenceField('client_bind', Main\Entity\Base::getInstanceByQuery($clientBindingQuery), array('=this.ID' => 'ref.OWNER_ID'), array('join_type' => 'INNER') ) ); } } } }