1C-Bitrix 25.700.0
Загрузка...
Поиск...
Не найдено
reservedproductcleaner.php
См. документацию.
1<?php
2
3namespace Bitrix\Sale\Helpers;
4
5use Bitrix\Main\Config\Option;
6use Bitrix\Main;
7use Bitrix\Main\ORM;
8use Bitrix\Main\Type\DateTime;
9use Bitrix\Main\Update\Stepper;
10use Bitrix\Sale;
11use Bitrix\Sale\ReserveQuantityCollection;
12
14{
15 private const RECORD_LIMIT = 100;
16
17 protected static $moduleId = "sale";
18
19 public function execute(array &$result)
20 {
21 $processedRecords = 0;
22
25 $orderClass = $registry->getOrderClassName();
26
27 $daysAgo = (int)Option::get("sale", "product_reserve_clear_period");
28
29 if ($daysAgo > 0)
30 {
31 global $USER;
32 $initUser = false;
33 $oldUser = null;
34
35 if (!(isset($USER) && $USER instanceof \CUser))
36 {
37 $initUser = true;
38 $oldUser = $USER ?? null;
39 $USER = new \CUser;
40 }
41
42 $date = new DateTime();
43 $parameters = [
44 'select' => [
45 'ORDER_ID' => 'ORDER.ID',
46 'ID',
47 'BASKET_ID'
48 ],
49 'filter' => [
50 '>QUANTITY' => 0,
51 '<=DATE_RESERVE_END' => $date,
52 '=ORDER.PAYED' => 'N',
53 '=ORDER.CANCELED' => 'N',
54 ],
55 'runtime' => [
56 new Main\Entity\ReferenceField(
57 'BASKET',
58 Sale\Internals\BasketTable::class,
59 [
60 '=this.BASKET_ID' => 'ref.ID',
61 ],
62 ['join_type' => 'inner']
63 ),
64 new Main\Entity\ReferenceField(
65 'ORDER',
66 Sale\Internals\OrderTable::class,
67 [
68 '=this.BASKET.ORDER_ID' => 'ref.ID',
69 ],
70 ['join_type' => 'inner']
71 ),
72 ],
73 'limit' => self::RECORD_LIMIT,
74 ];
75
76 $orderList = [];
78 while ($data = $res->fetch())
79 {
80 if (!isset($orderList[$data['ORDER_ID']]))
81 {
82 $orderList[$data['ORDER_ID']] = [];
83 }
84
85 if (!isset($orderList[$data['ORDER_ID']][$data['BASKET_ID']]))
86 {
87 $orderList[$data['ORDER_ID']][$data['BASKET_ID']] = [];
88 }
89
90 $orderList[$data['ORDER_ID']][$data['BASKET_ID']][] = $data['ID'];
91 }
92
93 foreach ($orderList as $orderId => $basketItemIds)
94 {
95 $order = $orderClass::load($orderId);
96 if (!$order)
97 {
98 continue;
99 }
100
101 $basket = $order->getBasket();
102 foreach ($basketItemIds as $basketItemId => $reserveIds)
103 {
105 $basketItem = $basket->getItemById($basketItemId);
106 if (!$basketItem)
107 {
108 continue;
109 }
110
111 foreach ($reserveIds as $reserveId)
112 {
114 $reserveCollection = $basketItem->getReserveQuantityCollection();
115 if (!$reserveCollection)
116 {
117 continue;
118 }
119
120 $reserve = $reserveCollection->getItemById($reserveId);
121 if (!$reserve)
122 {
123 continue;
124 }
125
126 $reserve->delete();
127
128 $processedRecords++;
129 }
130 }
131
132 $r = $order->save();
133 if (!$r->isSuccess())
134 {
135 $errorText = (string)$order->getField('REASON_MARKED');
136 if ($errorText !== '')
137 {
138 $errorText .= "\n";
139 }
140
141 foreach($r->getErrorMessages() as $error)
142 {
143 if ((string)$error !== '')
144 {
145 $errorText .= $error."\n";
146 }
147 }
148
149 Sale\Internals\OrderTable::update($order->getId(), [
150 "MARKED" => "Y",
151 "REASON_MARKED" => $errorText
152 ]);
153 }
154 }
155
156 // crutch for #120087
157 if ($initUser)
158 {
159 ORM\Entity::destroy(Sale\Internals\OrderTable::getEntity());
160 if ($oldUser !== null)
161 {
162 $USER = $oldUser;
163 }
164 }
165 unset($oldUser);
166 }
167
168 if ($processedRecords < self::RECORD_LIMIT)
169 {
170 return self::FINISH_EXECUTION;
171 }
172
173 return self::CONTINUE_EXECUTION;
174 }
175}
static destroy($entity)
Определения entity.php:1248
execute(array &$option)
static getInstance($type)
Определения registry.php:183
const REGISTRY_TYPE_ORDER
Определения registry.php:16
static getList(array $parameters=[])
Определения reservequantitycollection.php:231
$data['IS_AVAILABLE']
Определения .description.php:13
$orderId
Определения payment.php:5
</td ></tr ></table ></td ></tr >< tr >< td class="bx-popup-label bx-width30"><?=GetMessage("PAGE_NEW_TAGS")?> array( $site)
Определения file_new.php:804
$res
Определения filter_act.php:7
$result
Определения get_property_values.php:14
global $USER
Определения csv_new_run.php:40
$order
Определения payment.php:8
$error
Определения subscription_card_product.php:20