- Модуль: catalog
- Путь к файлу: ~/bitrix/modules/catalog/lib/component/reportproductlist.php
- Класс: BitrixCatalogComponentReportProductList
- Вызов: ReportProductList::buildDataQuery
protected function buildDataQuery($order = null, $limit = null, $offset = null): Query
{
$storeId = $this->storeId;
$baseFilter = $this->getListFilter();
unset($baseFilter['=STORE_ID']);
$reportInterval = $baseFilter['REPORT_INTERVAL'] ?? [];
unset($baseFilter['REPORT_INTERVAL']);
$storeDocsFilter = $baseFilter + [
'=STORE_ID' => $storeId,
[
'LOGIC' => 'OR',
'=DOCS_ELEMENT.STORE_FROM' => $storeId,
'=DOCS_ELEMENT.STORE_TO' => $storeId,
],
'=DOCUMENT.STATUS' => 'Y',
];
if (!empty($reportInterval))
{
$storeDocsFilter += [
'<=DOCUMENT.DATE_STATUS' => new DateTime($reportInterval['TO']),
];
}
$storeDocsQuery = StoreProductTable::query();
$storeDocsQuery->setSelect(['ID' ,'PRODUCT_ID', 'AMOUNT', 'QUANTITY_RESERVED', 'MEASURE_ID' => 'PRODUCT.MEASURE']);
$storeDocsQuery->registerRuntimeField(
new Reference(
'DOCS_ELEMENT',
StoreDocumentElementTable::class,
Join::on('this.PRODUCT_ID', 'ref.ELEMENT_ID')
)
);
$storeDocsQuery->registerRuntimeField(
new Reference(
'DOCUMENT',
StoreDocumentTable::class,
Join::on('this.DOCS_ELEMENT.DOC_ID', 'ref.ID')
)
);
$storeDocsQuery->setFilter($storeDocsFilter);
$shipmentsFilter = $baseFilter + [
'=STORE_ID' => $storeId,
'=STORE_BARCODE.STORE_ID' => $storeId,
'=ORDER_DELIVERY.DEDUCTED' => 'Y',
];
if (!empty($reportInterval))
{
$shipmentsFilter += [
'<=ORDER_DELIVERY.DATE_DEDUCTED' => new DateTime($reportInterval['TO']),
];
}
$shipmentsQuery = StoreProductTable::query();
$shipmentsQuery->setSelect(['ID' ,'PRODUCT_ID', 'AMOUNT', 'QUANTITY_RESERVED', 'MEASURE_ID' => 'PRODUCT.MEASURE']);
$shipmentsQuery->registerRuntimeField(
new Reference(
'BASKET',
BasketTable::class,
Join::on('this.PRODUCT_ID', 'ref.PRODUCT_ID')
)
);
$shipmentsQuery->registerRuntimeField(
new Reference(
'SHIPMENT_ITEM',
ShipmentItemTable::class,
Join::on('this.BASKET.ID', 'ref.BASKET_ID')
)
);
$shipmentsQuery->registerRuntimeField(
new Reference(
'STORE_BARCODE',
ShipmentItemStoreTable::class,
Join::on('this.SHIPMENT_ITEM.ID', 'ref.ORDER_DELIVERY_BASKET_ID')
)
);
$shipmentsQuery->registerRuntimeField(
new Reference(
'ORDER_DELIVERY',
ShipmentTable::class,
Join::on('this.SHIPMENT_ITEM.ORDER_DELIVERY_ID', 'ref.ID')
)
);
$shipmentsQuery->setFilter($shipmentsFilter);
$storeDocsQuery->union($shipmentsQuery);
if (isset($order))
{
$storeDocsQuery->setUnionOrder($order);
}
if (isset($limit))
{
$storeDocsQuery->setUnionLimit($limit);
}
if (isset($offset))
{
$storeDocsQuery->setUnionOffset($offset);
}
$storeDocsQuery->countTotal(true);
return $storeDocsQuery;
}