2namespace Bitrix\Sale\Internals;
5use \Bitrix\Main\Config;
7use Bitrix\Main\Localization\Loc;
9Loc::loadMessages(__FILE__);
31 return "b_sale_product2product";
38 'data_type' =>
'integer',
40 'autocomplete' =>
true,
42 'PRODUCT_ID' =>
array(
43 'data_type' =>
'integer'
45 'PARENT_PRODUCT_ID' =>
array(
46 'data_type' =>
'integer'
49 'data_type' =>
'integer'
65 $liveTime = (int)$liveTime;
69 if (
$connection->isTableExists(
'b_sale_order_product_stat'))
72 $now = $helper->getCurrentDateTimeFunction();
73 $liveTo = $helper->addSecondsToDateTime($liveTime * 24 * 3600,
'ORDER_DATE');
74 $sqlDelete =
"DELETE FROM b_sale_order_product_stat WHERE $now > $liveTo";
76 $connection->query(
'TRUNCATE TABLE b_sale_product2product');
78 $sqlUpdate =
'INSERT INTO b_sale_product2product(PRODUCT_ID, PARENT_PRODUCT_ID, CNT)
79 SELECT ops.PRODUCT_ID, ops.RELATED_PRODUCT_ID, SUM(ops.CNT)
80 FROM b_sale_order_product_stat ops
81 GROUP BY PRODUCT_ID, RELATED_PRODUCT_ID';
93 $updateRemStatusSql =
"UPDATE b_sale_order_processing SET PRODUCTS_REMOVED = 'Y'";
96 return "\\Bitrix\\Sale\\Product2ProductTable::deleteOldProducts(".$liveTime.
");";
108 $liveTime = (int)$liveTime;
112 if (!
$connection->isTableExists(
'b_sale_order_product_stat'))
117 $sqlDelete =
"TRUNCATE TABLE b_sale_order_product_stat";
123 $liveTo = $helper->addSecondsToDateTime($liveTime * 24 * 3600,
"b.DATE_INSERT");
124 $dateLimit =
" AND NOW() < $liveTo";
127 INSERT INTO b_sale_order_product_stat (PRODUCT_ID, RELATED_PRODUCT_ID, ORDER_DATE, CNT)
129 b.PRODUCT_ID as PRODUCT_ID,
130 b1.PRODUCT_ID as RELATED_PRODUCT_ID,
131 " . $helper->getDatetimeToDateFunction(
'b.DATE_INSERT') .
" as ORDER_DATE,
133 FROM b_sale_basket b, b_sale_basket b1
134 WHERE b.ORDER_ID = b1.ORDER_ID
137 GROUP BY b.PRODUCT_ID, b1.PRODUCT_ID, ORDER_DATE"
147 $sqlDelete =
"TRUNCATE TABLE b_sale_product2product";
150 INSERT INTO b_sale_product2product (PRODUCT_ID, PARENT_PRODUCT_ID, CNT)
151 SELECT ops.PRODUCT_ID, ops.RELATED_PRODUCT_ID, SUM(ops.CNT)
152 FROM b_sale_order_product_stat ops
153 GROUP BY PRODUCT_ID, RELATED_PRODUCT_ID"
183 if (
$connection->isTableExists(
'b_sale_order_product_stat'))
185 $sqlUpdate = $helper->prepareMergeSelect(
186 'b_sale_order_product_stat',
187 [
'PRODUCT_ID',
'RELATED_PRODUCT_ID',
'ORDER_DATE'],
188 [
'PRODUCT_ID',
'RELATED_PRODUCT_ID',
'ORDER_DATE'],
192 " . $helper->getDatetimeToDateFunction(
'b.DATE_INSERT') .
"
193 FROM b_sale_basket b, b_sale_basket b1
194 WHERE b.ORDER_ID = b1.ORDER_ID AND
201 $sqlUpdate = $helper->prepareCorrelatedUpdate(
202 'b_sale_product2product',
204 [
'CNT' =>
'p2p.CNT + 1'],
205 'b_sale_basket b, b_sale_basket b1',
206 "b.ORDER_ID = b1.ORDER_ID AND
209 p2p.PRODUCT_ID = b.PRODUCT_ID AND
210 p2p.PARENT_PRODUCT_ID = b1.PRODUCT_ID"
216 $sqlInsert =
"INSERT INTO b_sale_product2product (PRODUCT_ID, PARENT_PRODUCT_ID, CNT)
217 SELECT b.PRODUCT_ID, b1.PRODUCT_ID, 1
218 FROM b_sale_basket b, b_sale_basket b1
219 WHERE b.ORDER_ID = b1.ORDER_ID AND
220 b.ORDER_ID = $orderId AND
222 NOT EXISTS (SELECT 1 FROM b_sale_product2product d WHERE d.PRODUCT_ID = b.PRODUCT_ID AND d.PARENT_PRODUCT_ID = b1.PRODUCT_ID)";
226 Sale\OrderProcessingTable::markProductsAdded(
$orderId);
228 if (defined(
"BX_COMP_MANAGED_CACHE"))
231 $app->getTaggedCache()->clearByTag(
'sale_product_buy');
245 $limit = (int)$limit;
248 $isTableExists =
$connection->isTableExists(
'b_sale_order_product_stat');
253 '=PRODUCTS_ADDED' =>
'N',
266 $processingData = Sale\OrderProcessingTable::getList(
$params);
267 while ($processingOrder = $processingData->fetch())
269 $orderIds[] = (int)$processingOrder[
'ORDER_ID'];
272 if (!empty($orderIds))
274 $sqlOrderIds = implode(
',', $orderIds);
275 Sale\OrderProcessingTable::markProductsAddedByList($orderIds);
278 $sqlInsert = $helper->prepareMergeSelect(
279 'b_sale_order_product_stat',
280 [
'PRODUCT_ID',
'RELATED_PRODUCT_ID',
'ORDER_DATE'],
281 [
'CNT',
'PRODUCT_ID',
'RELATED_PRODUCT_ID',
'ORDER_DATE'],
282 "SELECT SUMM, PRODUCT_ID, PARENT_PRODUCT_ID, TODAY
284 SELECT COUNT(1) as SUMM,
285 b.PRODUCT_ID as PRODUCT_ID,
286 b1.PRODUCT_ID as PARENT_PRODUCT_ID,
287 " . $helper->getCurrentDateFunction() .
" as TODAY
288 FROM b_sale_basket b, b_sale_basket b1
290 b1.ORDER_ID = b.ORDER_ID
292 AND b.ORDER_ID IN ($sqlOrderIds)
293 GROUP BY b.PRODUCT_ID, b1.PRODUCT_ID
294 " . (
$type ===
'mysql' ?
'ORDER BY NULL' :
'') .
"
300 $sqlUpdate = $helper->prepareCorrelatedUpdate(
301 'b_sale_product2product',
303 [
'CNT' =>
'p2p.CNT + calc.CNT'],
305 SELECT COUNT(1) as CNT,
306 b.PRODUCT_ID as PRODUCT_ID,
307 b1.PRODUCT_ID as PARENT_PRODUCT_ID
308 FROM b_sale_basket b, b_sale_basket b1
310 b1.ORDER_ID = b.ORDER_ID
312 AND b.ORDER_ID IN ($sqlOrderIds)
313 GROUP BY b.PRODUCT_ID, b1.PRODUCT_ID
315 'p2p.PRODUCT_ID = calc.PRODUCT_ID AND p2p.PARENT_PRODUCT_ID = calc.PARENT_PRODUCT_ID'
321 INSERT INTO b_sale_product2product (PRODUCT_ID, PARENT_PRODUCT_ID, CNT)
322 SELECT b.PRODUCT_ID, b1.PRODUCT_ID, 1
323 FROM b_sale_basket b, b_sale_basket b1
324 WHERE b.ORDER_ID = b1.ORDER_ID AND
325 b.ORDER_ID IN ($sqlOrderIds) AND
327 NOT EXISTS (SELECT 1 FROM b_sale_product2product d WHERE d.PRODUCT_ID = b.PRODUCT_ID AND d.PARENT_PRODUCT_ID = b1.PRODUCT_ID)";
330 if (defined(
"BX_COMP_MANAGED_CACHE"))
333 $app->getTaggedCache()->clearByTag(
'sale_product_buy');
338 $agentName =
"\\Bitrix\\Sale\\Product2ProductTable::addProductsByAgent($limit);";
339 $agentData = \CAgent::GetList(
342 'NAME' => $agentName,
343 'MODULE_ID' =>
'sale',
346 $agent = $agentData->Fetch();
348 $agentId = (int)($agent[
'ID'] ?? 0);
350 $processingData = Sale\OrderProcessingTable::getRow([
352 '=PRODUCTS_ADDED' =>
'N'
361 && (
int)$agent[
'AGENT_INTERVAL'] > 60
364 \CAgent::Update($agentId, [
'AGENT_INTERVAL' => 60]);
372 && (
int)$agent[
'AGENT_INTERVAL'] < 86400
375 \CAgent::Update($agentId, [
'AGENT_INTERVAL' => 86400]);
391 $isNew =
$event->getParameter(
'IS_NEW');
395 Main\EventResult::ERROR,
396 new Sale\
ResultError(
Main\
Localization\Loc::getMessage(
'SALE_EVENT_PRODUCT2PRODUCT_WRONG_ORDER'),
'SALE_EVENT_PRODUCT2PRODUCT_ON_SALE_ORDER_ADD_WRONG_ORDER'),
401 $basket =
$order->getBasket();
403 if ($isNew && ($basket &&
count($basket) > 0))
405 static::onSaleOrderAdd(
$order->getId());
419 $value =
$event->getParameter(
'VALUE');
423 Main\EventResult::ERROR,
424 new Sale\
ResultError(
Main\
Localization\Loc::getMessage(
'SALE_EVENT_PRODUCT2PRODUCT_WRONG_ORDER'),
'SALE_EVENT_PRODUCT2PRODUCT_ON_SALE_ORDER_STATUS_WRONG_ORDER'),
429 static::onSaleStatusOrderHandler(
$order->getId(), $value);
441 $shipment =
$event->getParameter(
'ENTITY');
445 Main\EventResult::ERROR,
446 new Sale\
ResultError(
Main\
Localization\Loc::getMessage(
'SALE_EVENT_PRODUCT2PRODUCT_WRONG_SHIPMENT'),
'SALE_EVENT_PRODUCT2PRODUCT_ON_SALE_DELIVERY_ORDER_WRONG_SHIPMENT'),
451 if (!$shipmentCollection = $shipment->getCollection())
454 Main\EventResult::ERROR,
455 new Sale\
ResultError(
Main\
Localization\Loc::getMessage(
'SALE_EVENT_PRODUCT2PRODUCT_WRONG_SHIPMENTCOLLECTION'),
'SALE_EVENT_PRODUCT2PRODUCT_ON_SALE_DELIVERY_ORDER_WRONG_SHIPMENTCOLLECTION'),
461 if (!
$order = $shipmentCollection->getOrder())
464 Main\EventResult::ERROR,
465 new Sale\
ResultError(
Main\
Localization\Loc::getMessage(
'SALE_EVENT_PRODUCT2PRODUCT_WRONG_ORDER'),
'SALE_EVENT_PRODUCT2PRODUCT_ON_SALE_DELIVERY_ORDER_WRONG_ORDER'),
471 static::onSaleDeliveryOrderHandler(
$order->getId(),
$order->isAllowDelivery() ?
'Y' :
'N');
483 $shipment =
$event->getParameter(
'ENTITY');
487 Main\EventResult::ERROR,
488 new Sale\
ResultError(
Main\
Localization\Loc::getMessage(
'SALE_EVENT_PRODUCT2PRODUCT_WRONG_SHIPMENT'),
'SALE_EVENT_PRODUCT2PRODUCT_ON_SALE_DEDUCT_ORDER_WRONG_SHIPMENT'),
493 if (!$shipmentCollection = $shipment->getCollection())
496 Main\EventResult::ERROR,
497 new Sale\
ResultError(
Main\
Localization\Loc::getMessage(
'SALE_EVENT_PRODUCT2PRODUCT_WRONG_SHIPMENTCOLLECTION'),
'SALE_EVENT_PRODUCT2PRODUCT_ON_SALE_DEDUCT_ORDER_WRONG_SHIPMENTCOLLECTION'),
503 if (!
$order = $shipmentCollection->getOrder())
506 Main\EventResult::ERROR,
507 new Sale\
ResultError(
Main\
Localization\Loc::getMessage(
'SALE_EVENT_PRODUCT2PRODUCT_WRONG_ORDER'),
'SALE_EVENT_PRODUCT2PRODUCT_ON_SALE_DEDUCT_ORDER_WRONG_ORDER'),
514 static::onSaleDeductOrderHandler(
$order->getId(),
$order->isShipped() ?
'Y' :
'N');
530 Main\EventResult::ERROR,
531 new Sale\
ResultError(
Main\
Localization\Loc::getMessage(
'SALE_EVENT_PRODUCT2PRODUCT_WRONG_ORDER'),
'SALE_EVENT_PRODUCT2PRODUCT_ON_SALE_CANCELED_ORDER_WRONG_ORDER'),
536 static::onSaleCancelOrderHandler(
$order->getId(),
$order->isCanceled() ?
'Y' :
'N');
552 Main\EventResult::ERROR,
553 new Sale\
ResultError(
Main\
Localization\Loc::getMessage(
'SALE_EVENT_PRODUCT2PRODUCT_WRONG_ORDER'),
'SALE_EVENT_PRODUCT2PRODUCT_ON_SALE_PAID_ORDER_WRONG_ORDER'),
558 static::onSaleCancelOrderHandler(
$order->getId(),
$order->isPaid() ?
'Y' :
'N');
572 static::addOrderProcessing(
$orderId, $statusName);
598 $statusName =
"F_DELIVERY";
599 static::addOrderProcessing(
$orderId, $statusName);
614 $statusName =
"F_OUT";
615 static::addOrderProcessing(
$orderId, $statusName);
630 $statusName =
"F_CANCELED";
631 static::addOrderProcessing(
$orderId, $statusName);
646 $statusName =
"F_PAY";
647 static::addOrderProcessing(
$orderId, $statusName);
662 if ($allowStatuses !=
'')
663 $allowStatuses = unserialize($allowStatuses, [
'allowed_classes' =>
false]);
665 $allowStatuses =
array();
667 if ($allowCollecting ==
"Y" && !empty($allowStatuses) && is_array($allowStatuses) && in_array($statusName, $allowStatuses))
669 $orderInformation = Sale\OrderProcessingTable::getList(
675 $result = $orderInformation->fetch();
677 Sale\OrderProcessingTable::add(
array(
"ORDER_ID" => (
int)
$orderId));
static getConnection($name="")
static get($moduleId, $name, $default="", $siteId=false)
static hasAddedProducts($orderId=0)
static onSaleStatusOrderHandler($orderId, $status)
static onSaleDeductOrderHandlerEvent(Main\Event $event)
static addProductsByAgent($limit=100)
static onSaleDeductOrderHandler($orderId, $status)
static onSaleStatusOrderHandlerEvent(Main\Event $event)
static onSaleOrderAdd($orderId)
static onSaleCancelOrderHandlerEvent(Main\Event $event)
static refreshProductStatistic($liveTime=10)
static addOrderProcessing($orderId, $statusName)
static deleteOldProducts($liveTime=10)
static addProductsFromOrder($orderId=0)
static onSaleOrderAddEvent(Main\Event $event)
static onSaleDeliveryOrderHandler($orderId, $status)
static onSaleDeliveryOrderHandlerEvent(Main\Event $event)
static onSaleCancelOrderHandler($orderId, $status)
static onSalePayOrderHandlerEvent(Main\Event $event)
static onSalePayOrderHandler($orderId, $status)
</td ></tr ></table ></td ></tr >< tr >< td class="bx-popup-label bx-width30"><?=GetMessage("PAGE_NEW_TAGS")?> array( $site)
</p ></td >< td valign=top style='border-top:none;border-left:none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;padding:0cm 2.0pt 0cm 2.0pt;height:9.0pt'>< p class=Normal align=center style='margin:0cm;margin-bottom:.0001pt;text-align:center;line-height:normal'>< a name=ТекстовоеПоле54 ></a ><?=($taxRate > count( $arTaxList) > 0) ? $taxRate."%"
if($inWords) echo htmlspecialcharsbx(Number2Word_Rus(roundEx($totalVatSum $params['CURRENCY']