• Модуль: sale
  • Путь к файлу: ~/bitrix/modules/sale/lib/buyerstatistic.php
  • Класс: BitrixSaleBuyerStatistic
  • Вызов: BuyerStatistic::collectUserData
static function collectUserData($userId, $currency, $lid)
{
	$result = new Result();
	$userId = (int)$userId;
	if ($userId <= 0)
	{
		$result->addError(new MainError('Wrong user id'));
		return $result;
	}

	$registry = SaleRegistry::getInstance(SaleRegistry::REGISTRY_TYPE_ORDER);
	/** @var SaleOrder $orderClass */
	$orderClass = $registry->getOrderClassName();

	$lastOrderDate = null;
	$lastArchiveDate = null;

	$orderData = $orderClass::getList([
		'select' => ['DATE_INSERT'],
		'filter' => ['=USER_ID' => $userId, '=CURRENCY' => $currency, '=LID' => $lid],
		'order' => ['DATE_INSERT' => 'DESC'],
		'limit' => 1
	]);

	if ($resultOrder = $orderData->fetch())
	{
		$lastOrderDate = $resultOrder['DATE_INSERT'];
	}

	$archiveData = ArchiveManager::getList([
		'select' => ['DATE_INSERT'],
		'filter' => ['=USER_ID' => $userId, '=CURRENCY' => $currency, '=LID' => $lid],
		'order' => ['DATE_INSERT' => 'DESC'],
		'limit' => 1
	]);

	if ($resultOrder = $archiveData->fetch())
	{
		$lastArchiveDate = $resultOrder['DATE_INSERT'];
	}

	if ($lastOrderDate || $lastArchiveDate)
	{
		$statistic = array(
			'USER_ID' => $userId,
			'CURRENCY' => $currency,
			'LID' => $lid,
			'LAST_ORDER_DATE' => ($lastOrderDate) ? $lastOrderDate : $lastArchiveDate
		);

		if ($lastOrderDate)
		{
			$orderDataCount = $orderClass::getList([
				'select' => ['FULL_SUM_PAID', 'COUNT_FULL_PAID_ORDER', 'COUNT_PART_PAID_ORDER'],
				'filter' => [
					'=USER_ID' => $userId,
					'=CURRENCY' => $currency,
					'=LID' => $lid,
					'>SUM_PAID' => 0
				],
				'group' => ['USER_ID'],
				'runtime' => [
					new ExpressionField('COUNT_PART_PAID_ORDER', 'COUNT(1)'),
					new ExpressionField('COUNT_FULL_PAID_ORDER', 'SUM(CASE WHEN PAYED = "Y" THEN 1 ELSE 0 END)'),
					new ExpressionField('FULL_SUM_PAID', 'SUM(SUM_PAID)')
				],
			]);

			$countData = $orderDataCount->fetch();

			$statistic['SUM_PAID'] = !empty($countData['FULL_SUM_PAID']) ? $countData['FULL_SUM_PAID'] : "0.0000";
			$statistic['COUNT_PART_PAID_ORDER'] = !empty($countData['COUNT_PART_PAID_ORDER']) ? $countData['COUNT_PART_PAID_ORDER'] : 0;
			$statistic['COUNT_FULL_PAID_ORDER'] = !empty($countData['COUNT_FULL_PAID_ORDER']) ? $countData['COUNT_FULL_PAID_ORDER'] : 0;
		}

		if ($lastArchiveDate)
		{
			$archiveDataCount = ArchiveManager::getList([
				'select' => ['FULL_SUM_PAID', 'COUNT_FULL_PAID_ORDER', 'COUNT_PART_PAID_ORDER'],
				'filter' => [
					'=USER_ID' => $userId,
					'=CURRENCY' => $currency,
					'=LID' => $lid,
					'>SUM_PAID' => 0
				],
				'group' => ['USER_ID'],
				'runtime' => [
					new ExpressionField('COUNT_PART_PAID_ORDER', 'COUNT(1)'),
					new ExpressionField('COUNT_FULL_PAID_ORDER', 'SUM(CASE WHEN PAYED = "Y" THEN 1 ELSE 0 END)'),
					new ExpressionField('FULL_SUM_PAID', 'SUM(SUM_PAID)')
				],
			]);

			$countArchiveData = $archiveDataCount->fetch();

			if ($countArchiveData['FULL_SUM_PAID'] > 0)
				$statistic['SUM_PAID'] += $countArchiveData['FULL_SUM_PAID'];
			if ($countArchiveData['COUNT_PART_PAID_ORDER'] > 0)
				$statistic['COUNT_PART_PAID_ORDER'] += $countArchiveData['COUNT_PART_PAID_ORDER'];
			if ($countArchiveData['COUNT_FULL_PAID_ORDER'] > 0)
				$statistic['COUNT_FULL_PAID_ORDER'] += $countArchiveData['COUNT_FULL_PAID_ORDER'];
		}

		$result->setData($statistic);
	}
	else
	{
		$result->addWarning(new MainError('User doesn't have orders' ));
	}

	return $result;
}