• Модуль: crm
  • Путь к файлу: ~/bitrix/modules/crm/lib/Reservation/Helpers/Doctor.php
  • Класс: Bitrix\Crm\Reservation\Helpers\Doctor
  • Вызов: Doctor::getRows
private function getRows(): array
{
	$result = [];

	$db = Application::getConnection();

	// load crm reserves
	$crmReservesSql = '
		SELECT
			cprr.ROW_ID,
			cpr.OWNER_ID,
			cpr.OWNER_TYPE,
			cpr.PRODUCT_ID,
			cpr.PRODUCT_NAME,
			cprr.STORE_ID AS CRM_RESERVE_STORE_ID,
			cprr.RESERVE_QUANTITY AS CRM_RESERVE_QUANTITY,
			DATE(cprr.DATE_RESERVE_END) AS CRM_RESERVE_DATE_END,
			sbr.BASKET_ID
		FROM
			b_crm_product_row_reservation as cprr
			LEFT JOIN b_crm_product_reservation_map AS cprm ON cprr.ROW_ID = cprm.PRODUCT_ROW_ID
			LEFT JOIN b_sale_basket_reservation AS sbr ON cprm.BASKET_RESERVATION_ID = sbr.ID
			LEFT JOIN b_crm_product_row AS cpr ON cpr.ID = cprr.ROW_ID
	';
	$rows = $db->query($crmReservesSql);
	foreach ($rows as $row)
	{
		$rowId = (int)$row['ROW_ID'];

		$row['CRM_RESERVE_STORE_ID'] = (int)$row['CRM_RESERVE_STORE_ID'];
		$row['CRM_RESERVE_QUANTITY'] = (float)$row['CRM_RESERVE_QUANTITY'];
		$row['CRM_RESERVE_DATE_END'] = (string)$row['CRM_RESERVE_DATE_END'];

		$result[$rowId] = $row;
		$result[$rowId] += [
			'SALE_RESERVE_DATE_END' => '',
			'SALE_RESERVE_STORE_ID' => 0,
			'SALE_RESERVE_QUANTITY' => 0.0,
			'SALE_DEDUCTED_QUANTITY' => 0.0,
		];
	}

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

	// load sale reserves and deductes
	$basketToRowIds = BasketService::getInstance()->getRowIdsToBasketIdsByRows(array_keys($result));
	if (!empty($basketToRowIds))
	{
		$basketIdsSql = join(',', $basketToRowIds);
		$basketToRowIds = array_flip($basketToRowIds);

		$saleReservesSql = "
			SELECT
				BASKET_ID,
				STORE_ID AS SALE_RESERVE_STORE_ID,
				QUANTITY AS SALE_RESERVE_QUANTITY,
				DATE(DATE_RESERVE_END) AS SALE_RESERVE_DATE_END
			FROM
				b_sale_basket_reservation
			WHERE
				BASKET_ID IN ({$basketIdsSql})
		";

		$rows = $db->query($saleReservesSql);
		foreach ($rows as $row)
		{
			$basketId = (int)$row['BASKET_ID'];
			$rowId = $basketToRowIds[$basketId] ?? null;
			if ($rowId !== null)
			{
				$result[$rowId]['SALE_RESERVE_STORE_ID'] = (int)$row['SALE_RESERVE_STORE_ID'];
				$result[$rowId]['SALE_RESERVE_QUANTITY'] = (float)$row['SALE_RESERVE_QUANTITY'];
				$result[$rowId]['SALE_RESERVE_DATE_END'] = (string)$row['SALE_RESERVE_DATE_END'];
			}
		}

		$saleDeductedSql = "
			SELECT
				sodb.BASKET_ID,
				SUM(sodb.QUANTITY) as SALE_DEDUCTED_QUANTITY
			FROM
				b_sale_order_dlv_basket AS sodb
				INNER JOIN b_sale_order_delivery AS sod ON sodb.ORDER_DELIVERY_ID = sod.ID AND sod.DEDUCTED = 'Y'
			WHERE
				sodb.BASKET_ID IN ({$basketIdsSql})
			GROUP BY
				sodb.BASKET_ID
		";
		$rows = $db->query($saleDeductedSql);
		foreach ($rows as $row)
		{
			$basketId = (int)$row['BASKET_ID'];
			$rowId = $basketToRowIds[$basketId] ?? null;
			if ($rowId !== null)
			{
				$result[$rowId]['SALE_DEDUCTED_QUANTITY'] = (float)$row['SALE_DEDUCTED_QUANTITY'];
			}
		}
	}

	// sort columns
	$sortOrder = array_flip([
		'ROW_ID',
		'OWNER_ID',
		'OWNER_TYPE',
		'PRODUCT_ID',
		'PRODUCT_NAME',
		'BASKET_ID',
		'CRM_RESERVE_STORE_ID',
		'SALE_RESERVE_STORE_ID',
		'CRM_RESERVE_DATE_END',
		'SALE_RESERVE_DATE_END',
		'CRM_RESERVE_QUANTITY',
		'SALE_RESERVE_QUANTITY',
		'SALE_DEDUCTED_QUANTITY',
	]);

	foreach ($result as &$row)
	{
		uksort(
			$row,
			static fn($a, $b) => $sortOrder[$a] <=> $sortOrder[$b]
		);
	}
	unset($row);

	return $result;
}