- Модуль: 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;
}