• Модуль: crm
  • Путь к файлу: ~/bitrix/modules/crm/lib/Reservation/Strategy/ReservePaidProductsStrategy.php
  • Класс: Bitrix\Crm\Reservation\Strategy\ReservePaidProductsStrategy
  • Вызов: ReservePaidProductsStrategy::getPaidProductRows
protected function getPaidProductRows(int $ownerTypeId, int $ownerId): array
{
	$rows = EntityBinding::getList([
		'select' => [
			'ORDER_ID',
		],
		'filter' => [
			'=OWNER_TYPE_ID' => $ownerTypeId,
			'=OWNER_ID' => $ownerId,
		],
	]);

	$entityOrderIds = array_column($rows->fetchAll(), 'ORDER_ID');
	if (!$entityOrderIds)
	{
		return [];
	}

	// TODO: after realization order synchronizer refactor with link `b_crm_product_row.XML_ID` = `b_sale_basket.ID`
	$paidProducts = [];
	$rows = PayableItemCollection::getList([
		'select' => [
			'PRODUCT_ID' => 'BASKET.PRODUCT_ID',
			'QUANTITY',
		],
		'filter' => [
			'=ENTITY_TYPE' => Registry::ENTITY_BASKET_ITEM,
			'=PAYMENT.ORDER_ID' => $entityOrderIds,
			'=PAYMENT.PAID' => 'Y',
			'!BASKET.PRODUCT_ID' => null,
		],
	]);
	foreach ($rows as $row)
	{
		$productId = (int)$row['PRODUCT_ID'];
		$paidProducts[$productId] ??= 0.0;
		$paidProducts[$productId] += (float)$row['QUANTITY'];
	}

	if (empty($paidProducts))
	{
		return [];
	}

	$paidProductRows = [];
	$rows = ProductRowTable::getList([
		'select' => [
			'ID',
			'PRODUCT_ID',
		],
		'filter' => [
			'=OWNER_TYPE' => CCrmOwnerTypeAbbr::ResolveByTypeID($ownerTypeId),
			'=OWNER_ID' => $ownerId,
			'=PRODUCT_ID' => array_keys($paidProducts),
			'!@TYPE' => ReservationService::getInstance()->getRestrictedProductTypes(),
		],
	]);
	foreach ($rows as $row)
	{
		$productId = (int)$row['PRODUCT_ID'];
		$paidQuantity = $paidProducts[$productId] ?? null;

		if ($paidQuantity)
		{
			$rowId = (int)$row['ID'];
			$paidProductRows[$rowId] = $paidQuantity;
		}
	}

	return $paidProductRows;
}