• Модуль: crm
  • Путь к файлу: ~/bitrix/modules/crm/lib/volume/base.php
  • Класс: Bitrix\Crm\Volume\Base
  • Вызов: Base::prepareUserFieldQuery
protected function prepareUserFieldQuery($entityClass, array $userField, array $entityGroupField = array())
{
	/**
	 * @var ORM\Data\DataManager $entityClass
	 */
	$ufName = $entityClass::getUfId();
	if (empty($ufName))
	{
		return '';
	}

	$ufType = $userField['USER_TYPE_ID'];
	$isDiskAvailable = self::isModuleAvailable('disk');

	// need to filter by Entity
	$entityQuery = $entityClass::query();
	$entityEntity = $entityClass::getEntity();

	$entityQuery->addSelect('ID');


	// STAGE_SEMANTIC_ID
	if ($entityClass == Crm\QuoteTable::class)
	{
		Volume\Quote::registerStageField($entityQuery, '', 'STAGE_SEMANTIC_ID');
		Volume\Quote::registerStageField($entityQuery, '', 'QUOTE_STAGE_SEMANTIC_ID');
	}
	if ($entityClass == Crm\InvoiceTable::class)
	{
		Volume\Invoice::registerStageField($entityQuery, '', 'STAGE_SEMANTIC_ID');
		Volume\Invoice::registerStageField($entityQuery, '', 'INVOICE_STAGE_SEMANTIC_ID');
	}
	// DATE
	if (
		$entityClass == Crm\CompanyTable::class ||
		$entityClass == Crm\ContactTable::class
	)
	{
		$dayField = new ORM\Fields\ExpressionField(
			'DATE_CREATE_SHORT',
			'DATE(%s)',
			'DATE_CREATE'
		);
		$entityQuery->registerRuntimeField($dayField);
	}
	if (
		$entityClass == Crm\InvoiceTable::class
	)
	{
		$dayField = new ORM\Fields\ExpressionField(
			'DATE_CREATE_SHORT',
			'DATE(%s)',
			'DATE_INSERT'
		);
		$entityQuery->registerRuntimeField($dayField);
	}



	$entityFieldsSql = '';
	$entityFieldsGroupSql = '';
	$entityFields = array();
	foreach ($entityGroupField as $alias => $field)
	{
		$entityQuery->addSelect($field, $alias);
		$entityFields[] = 'entity.'. $alias;
	}

	if ($this->prepareEntityFilter($entityQuery, $entityEntity))
	{
		$entityFilterQuerySql = $entityQuery->getQuery();

		if (count($entityFields) > 0)
		{
			$entityFieldsSql = ', '.implode(', ', $entityFields);
			$entityFieldsGroupSql = 'GROUP BY '.implode(', ', $entityFields);
		}
	}
	else
	{
		// cannot filter this Entity
		return '';
	}


	$querySql = '';
	if ($userField['MULTIPLE'] === 'Y')
	{
		$ufId = $userField['ID'];
		$utmEntityTableName = 'b_utm_'.mb_strtolower($ufName);

		if (isset(self::$tablesInformation[$utmEntityTableName]))
		{
			if (
				$isDiskAvailable &&
				$ufType === Disk\Uf\FileUserType::USER_TYPE_ID
			)
			{
				$querySql = "
					SELECT 
						SUM(f.FILE_SIZE) as FILE_SIZE,
						COUNT(DISTINCT f.ID) as FILE_COUNT,
						SUM(f.FILE_SIZE) as DISK_SIZE,
						COUNT(DISTINCT f.ID) as DISK_COUNT
						{$entityFieldsSql}
					FROM
						{$utmEntityTableName} ufsrc
						INNER JOIN ( {$entityFilterQuerySql} ) entity 
							ON entity.ID = ufsrc.VALUE_ID
						INNER JOIN b_disk_attached_object attached
							ON attached.ID = ufsrc.VALUE_INT
							AND ufsrc.FIELD_ID = '{$ufId}'
						INNER JOIN b_disk_object files
							ON files.ID = attached.OBJECT_ID 
							AND files.ID = files.REAL_OBJECT_ID
							AND files.TYPE = '".Disk\Internals\ObjectTable::TYPE_FILE."'
						INNER JOIN b_file f
							ON f.ID = files.FILE_ID 
					{$entityFieldsGroupSql}  
				";
			}

			elseif (
				$isDiskAvailable &&
				$ufType === Disk\Uf\VersionUserType::USER_TYPE_ID
			)
			{
				$querySql = "
					SELECT DISTINCT
						SUM(f.FILE_SIZE) as FILE_SIZE,
						COUNT(DISTINCT f.ID) as FILE_COUNT,
						SUM(f.FILE_SIZE) as DISK_SIZE,
						COUNT(DISTINCT f.ID) as DISK_COUNT
						{$entityFieldsSql}
					FROM
						{$utmEntityTableName} ufsrc
						INNER JOIN ( {$entityFilterQuerySql} ) entity 
							ON entity.ID = ufsrc.VALUE_ID
						INNER JOIN b_disk_attached_object attached
							ON attached.ID = ufsrc.VALUE_INT
							AND ufsrc.FIELD_ID = '{$ufId}'
						INNER JOIN b_disk_version versions
							ON versions.ID = attached.VERSION_ID 
						INNER JOIN b_disk_object files
							ON files.ID = versions.OBJECT_ID
							AND files.ID = attached.OBJECT_ID 
							AND files.ID = files.REAL_OBJECT_ID
							AND files.TYPE = '".Disk\Internals\ObjectTable::TYPE_FILE."'
						INNER JOIN b_file f
							ON f.ID = versions.FILE_ID
					{$entityFieldsGroupSql}
				";
			}

			elseif (
				$ufType === \CUserTypeFile::USER_TYPE_ID
			)
			{
				$querySql = "
					SELECT 
						SUM(f.FILE_SIZE) as FILE_SIZE,
						COUNT(DISTINCT f.ID) as FILE_COUNT,
						0 as DISK_SIZE,
						0 as DISK_COUNT
						{$entityFieldsSql}
					FROM
						{$utmEntityTableName} ufsrc
						INNER JOIN ( {$entityFilterQuerySql} ) entity 
							ON entity.ID = ufsrc.VALUE_ID
						INNER JOIN b_file f
							ON f.ID = ufsrc.VALUE_INT
							AND ufsrc.FIELD_ID = '{$ufId}'
					{$entityFieldsGroupSql}
				";
			}
		}
	}
	else
	{
		$ufEntityTableFieldName = $userField['FIELD_NAME'];
		$utsEntityTableName = 'b_uts_'.mb_strtolower($ufName);

		if (isset(self::$tablesInformation[$utsEntityTableName]))
		{
			if (
				$isDiskAvailable &&
				$ufType === Disk\Uf\FileUserType::USER_TYPE_ID
			)
			{
				$querySql = "
					SELECT 
						SUM(f.FILE_SIZE) as FILE_SIZE,
						COUNT(DISTINCT f.ID) as FILE_COUNT,
						SUM(f.FILE_SIZE) as DISK_SIZE,
						COUNT(DISTINCT f.ID) as DISK_COUNT
						{$entityFieldsSql}
					FROM
						{$utsEntityTableName} ufsrc
						INNER JOIN ( {$entityFilterQuerySql} ) entity 
							ON entity.ID = ufsrc.VALUE_ID
						INNER JOIN b_disk_attached_object attached
							ON attached.ID = cast(ufsrc.{$ufEntityTableFieldName} as UNSIGNED)
							and ufsrc.{$ufEntityTableFieldName} REGEXP '^[0-9]+$'
						INNER JOIN b_disk_object files
							ON files.ID = attached.OBJECT_ID 
							AND files.ID = files.REAL_OBJECT_ID
							AND files.TYPE = '".Disk\Internals\ObjectTable::TYPE_FILE."'
						INNER JOIN b_file f
							ON f.ID = files.FILE_ID 
					{$entityFieldsGroupSql}
				";
			}

			elseif (
				$isDiskAvailable &&
				$ufType === Disk\Uf\VersionUserType::USER_TYPE_ID
			)
			{
				$querySql = "
					SELECT 
						SUM(f.FILE_SIZE) as FILE_SIZE,
						COUNT(DISTINCT f.ID) as FILE_COUNT,
						SUM(f.FILE_SIZE) as DISK_SIZE,
						COUNT(DISTINCT f.ID) as DISK_COUNT
						{$entityFieldsSql}
					FROM
						{$utsEntityTableName} ufsrc
						INNER JOIN ( {$entityFilterQuerySql} ) entity 
							ON entity.ID = ufsrc.VALUE_ID
						INNER JOIN b_disk_attached_object attached
							ON attached.ID = cast(ufsrc.{$ufEntityTableFieldName} as UNSIGNED)
							and ufsrc.{$ufEntityTableFieldName} REGEXP '^[0-9]+$'
						INNER JOIN b_disk_version versions
							ON versions.ID = attached.VERSION_ID 
						INNER JOIN b_disk_object files
							ON files.ID = versions.OBJECT_ID
							AND files.ID = attached.OBJECT_ID
							AND files.ID = files.REAL_OBJECT_ID
							AND files.TYPE = '".Disk\Internals\ObjectTable::TYPE_FILE."'
						INNER JOIN b_file f
							ON f.ID = versions.FILE_ID 
					{$entityFieldsGroupSql}
				";
			}

			elseif (
				$ufType === \CUserTypeFile::USER_TYPE_ID
			)
			{
				$querySql = "
					SELECT 
						SUM(f.FILE_SIZE) as FILE_SIZE,
						COUNT(DISTINCT f.ID) as FILE_COUNT,
						0 as DISK_SIZE,
						0 as DISK_COUNT
						{$entityFieldsSql}
					FROM
						{$utsEntityTableName} ufsrc
						INNER JOIN ( {$entityFilterQuerySql} ) entity 
							ON entity.ID = ufsrc.VALUE_ID
						INNER JOIN b_file f
							ON f.ID = cast(ufsrc.{$ufEntityTableFieldName} as UNSIGNED)
							and ufsrc.{$ufEntityTableFieldName} REGEXP '^[0-9]+$'
					{$entityFieldsGroupSql}
				";
			}
		}
	}

	return $querySql;
}