15 private const RECORD_LIMIT = 100;
21 $processedRecords = 0;
25 $orderClass = $registry->getOrderClassName();
27 $daysAgo = (int)Option::get(
"sale",
"product_reserve_clear_period");
35 if (!(isset(
$USER) &&
$USER instanceof \CUser))
38 $oldUser =
$USER ??
null;
45 'ORDER_ID' =>
'ORDER.ID',
51 '<=DATE_RESERVE_END' => $date,
52 '=ORDER.PAYED' =>
'N',
53 '=ORDER.CANCELED' =>
'N',
56 new Main\Entity\ReferenceField(
60 '=this.BASKET_ID' =>
'ref.ID',
62 [
'join_type' =>
'inner']
64 new Main\Entity\ReferenceField(
68 '=this.BASKET.ORDER_ID' =>
'ref.ID',
70 [
'join_type' =>
'inner']
73 'limit' => self::RECORD_LIMIT,
80 if (!isset($orderList[
$data[
'ORDER_ID']]))
82 $orderList[
$data[
'ORDER_ID']] = [];
85 if (!isset($orderList[
$data[
'ORDER_ID']][
$data[
'BASKET_ID']]))
87 $orderList[
$data[
'ORDER_ID']][
$data[
'BASKET_ID']] = [];
93 foreach ($orderList as
$orderId => $basketItemIds)
101 $basket =
$order->getBasket();
102 foreach ($basketItemIds as $basketItemId => $reserveIds)
105 $basketItem = $basket->getItemById($basketItemId);
111 foreach ($reserveIds as $reserveId)
114 $reserveCollection = $basketItem->getReserveQuantityCollection();
115 if (!$reserveCollection)
120 $reserve = $reserveCollection->getItemById($reserveId);
133 if (!$r->isSuccess())
135 $errorText = (string)
$order->getField(
'REASON_MARKED');
136 if ($errorText !==
'')
141 foreach($r->getErrorMessages() as
$error)
143 if ((
string)
$error !==
'')
145 $errorText .=
$error.
"\n";
149 Sale\Internals\OrderTable::update(
$order->getId(), [
151 "REASON_MARKED" => $errorText
160 if ($oldUser !==
null)
168 if ($processedRecords < self::RECORD_LIMIT)
170 return self::FINISH_EXECUTION;
173 return self::CONTINUE_EXECUTION;