• Модуль: crm
  • Путь к файлу: ~/bitrix/modules/crm/lib/tracking/analytics/provider/action.php
  • Класс: Bitrix\Crm\Tracking\Analytics\Provider\Action
  • Вызов: Action::getUserExpenses
static function getUserExpenses(Date $dateFrom, Date $dateTo)
{
	$list = [];
	$listBySource = [];
	$sources = Tracking\Provider::getActualSources();
	$sourceIds = array_column($sources, 'ID');
	$sources = array_combine($sourceIds, $sources);
	$sourceIds = array_filter(
		$sourceIds,
		function ($item)
		{
			return !empty($item);
		}
	);

	$sourcesWithMoney = [];
	$rows = Tracking\Internals\SourceExpensesTable::getList([
		'select' => ['CNT', 'SUM', 'CURRENCY_ID', 'SOURCE_ID'],
		'filter' => [
			'=SOURCE_ID' => $sourceIds,
			'>=DATE_STAT' => $dateFrom,
			'<=DATE_STAT' => $dateTo,
			'=TYPE_ID' => Tracking\Internals\SourceExpensesTable::TYPE_MANUAL,
		],
		'runtime' => [
			new Orm\Fields\ExpressionField('SUM', 'SUM(%s)', ['EXPENSES']),
			new Orm\Fields\ExpressionField('CNT', 'SUM(%s)', ['ACTIONS'])
		],
		'group' => ['CURRENCY_ID', 'SOURCE_ID']
	]);
	foreach ($rows as $row)
	{
		$sourceId = $row['SOURCE_ID'];
		if (!is_array($listBySource[$sourceId]))
		{
			$listBySource[$sourceId] = [];
		}

		$currencyId = $row['CURRENCY_ID'];
		if ($currencyId === 'BYN' && \CCrmCurrency::getAccountCurrencyID() === 'BYR')
		{
			$currencyId = 'BYR';
		}
		$listBySource[$sourceId][] = [
			'CNT' => $row['CNT'],
			'SUM' => \CCrmCurrency::convertMoney(
				$row['SUM'],
				$currencyId,
				\CCrmCurrency::getAccountCurrencyID()
			)
		];

		if (!Tracking\Analytics\Ad::isSupported($sources[$sourceId]['CODE']))
		{
			$sourcesWithMoney[] = $sourceId;
		}
	}

	$sourcesWithMoney = array_unique($sourcesWithMoney);
	$traces = Tracking\Internals\TraceTable::getList([
		'select' => ['SOURCE_ID', 'TRACE_CNT'],
		'filter' => [
			'>=DATE_CREATE' => $dateFrom,
			'<=DATE_CREATE' => $dateTo,
			'=SOURCE_ID' => $sourcesWithMoney,
		],
		'runtime' => [
			new Orm\Fields\ExpressionField('TRACE_CNT', 'COUNT(%s)', ['ID'])
		],
		'group' => ['SOURCE_ID']
	])->fetchAll();
	$traces = array_combine(
		array_column($traces, 'SOURCE_ID'),
		array_column($traces, 'TRACE_CNT')
	);

	foreach ($listBySource as $sourceId => $rows)
	{
		$cnt = isset($traces[$sourceId]) ? (int) $traces[$sourceId] : 0;
		$sum = 0;

		foreach ($rows as $row)
		{
			$cnt += $row['CNT'];
			$sum += $row['SUM'];
		}

		$list[] = [
			'CNT' => $cnt,
			'SUM' => $sum,
			'VIEWS' => 0,
			'ASSIGNED_BY_ID' => null,
			'TRACKING_SOURCE_ID' => $sourceId,
		];
	}

	return $list;
}