• Модуль: crm
  • Путь к файлу: ~/bitrix/modules/crm/lib/volume/contact.php
  • Класс: Bitrix\Crm\Volume\Contact
  • Вызов: Contact::measureFiles
public function measureFiles()
{
	self::loadTablesInformation();

	$query = $this->prepareQuery();

	if ($this->prepareFilter($query))
	{
		$source = array();

		$groupByFields = array(
			'DATE_CREATE_SHORT' => 'DATE_CREATE_SHORT',
		);

		$query
			->registerRuntimeField(new ORM\Fields\ExpressionField('PHOTO_FILE_ID', 'cast(%s as UNSIGNED)', 'PHOTO'))
			->registerRuntimeField(new ORM\Fields\Relations\Reference(
				'PHOTO_FILE',
				Main\FileTable::class,
				ORM\Query\Join::on('this.PHOTO_FILE_ID', 'ref.ID')->whereNotNull('this.PHOTO'),
				array('join_type' => 'INNER')
			));

		$query
			->registerRuntimeField(new ORM\Fields\ExpressionField('FILE_SIZE', 'SUM(%s)', 'PHOTO_FILE.FILE_SIZE'))
			->registerRuntimeField(new ORM\Fields\ExpressionField('FILE_COUNT', 'COUNT(%s)', 'PHOTO_FILE.FILE_SIZE'))
			->addSelect('FILE_SIZE')
			->addSelect('FILE_COUNT')

			->registerRuntimeField(new ORM\Fields\ExpressionField('DISK_SIZE', '0'))
			->registerRuntimeField(new ORM\Fields\ExpressionField('DISK_COUNT', '0'))
			->addSelect('DISK_SIZE')
			->addSelect('DISK_COUNT')
		;

		foreach ($groupByFields as $alias => $field)
		{
			$query->addSelect($field, $alias);
			$query->addGroup($alias);
		}

		$source[] = $query->getQuery();


		$entityUserFieldList = $this->getUserTypeFieldList(Crm\ContactTable::class);
		/** @var array $userField */
		foreach ($entityUserFieldList as $userField)
		{
			$sql = $this->prepareUserFieldQuery(Crm\ContactTable::class, $userField, $groupByFields);

			if ($sql !== '')
			{
				$source[] = $sql;
			}
		}

		$diskConnector = static::getDiskConnector(Crm\ContactTable::class);
		if ($diskConnector !== null)
		{
			$sql = $this->prepareDiskAttachedQuery(Crm\ContactTable::class, $diskConnector, $groupByFields);
			if ($sql !== '')
			{
				$source[] = $sql;
			}
		}

		$liveFeedConnector = static::getLiveFeedConnector(Crm\ContactTable::class);
		if ($liveFeedConnector !== null)
		{
			$sql = $this->prepareLiveFeedQuery(Crm\ContactTable::class, $liveFeedConnector, $groupByFields);
			if ($sql !== '')
			{
				$source[] = $sql;
			}
		}

		if (count($source) > 0)
		{
			$querySql = "
				SELECT 
					'".static::getIndicatorId()."' as INDICATOR_TYPE,
					'".$this->getOwner()."' as OWNER_ID,
					'-' as STAGE_SEMANTIC_ID,
					DATE_CREATE_SHORT as DATE_CREATE,
					SUM(FILE_SIZE) as FILE_SIZE,
					SUM(FILE_COUNT) as FILE_COUNT,
					SUM(DISK_SIZE) as DISK_SIZE,
					SUM(DISK_COUNT) as DISK_COUNT
				FROM 
				(
					(".implode(' ) UNION ( ', $source).")
				) src
				GROUP BY 
					DATE_CREATE
			";

			Crm\VolumeTable::updateFromSelect(
				$querySql,
				array(
					'FILE_SIZE' => 'destination.FILE_SIZE + source.FILE_SIZE',
					'FILE_COUNT' => 'destination.FILE_COUNT + source.FILE_COUNT',
					'DISK_SIZE' => 'destination.DISK_SIZE + source.DISK_SIZE',
					'DISK_COUNT' => 'destination.DISK_COUNT + source.DISK_COUNT',
				),
				array(
					'INDICATOR_TYPE',
					'OWNER_ID',
					'DATE_CREATE',
					'STAGE_SEMANTIC_ID',
				)
			);
		}
	}

	return $this;
}