1C-Bitrix 25.700.0
Загрузка...
Поиск...
Не найдено
basketitem.php
См. документацию.
1<?php
2
3namespace Bitrix\Sale\Controller;
4
5use Bitrix\Catalog;
6use Bitrix\Main\Engine\AutoWire\ExactParameter;
7use Bitrix\Main\Engine\Response\DataType\Page;
8use Bitrix\Main\Error;
9use Bitrix\Main\Loader;
10use Bitrix\Main\Result;
11use Bitrix\Main\UI\PageNavigation;
12use Bitrix\Sale;
13use Bitrix\Sale\Helpers\Order\Builder\SettingsContainer;
14
16{
17 public function getPrimaryAutoWiredParameter()
18 {
19 return new ExactParameter(
20 Sale\BasketItem::class,
21 'basketItem',
22 function($className, $id)
23 {
25
27 $basketClass = $registry->getBasketClassName();
28
29 $iterator = $basketClass::getList([
30 'select' => [
31 'ORDER_ID',
32 ],
33 'filter'=>[
34 '=ID' => (int)$id,
35 ],
36 ]);
37 $row = $iterator->fetch();
38 unset($iterator);
39 if ($row)
40 {
42 $orderClass = $registry->getOrderClassName();
43
44 $order = $orderClass::load((int)$row['ORDER_ID']);
45 $basket = $order->getBasket()->getItemByBasketCode($id);
46 if ($basket instanceof Sale\BasketItem)
47 {
48 return $basket;
49 }
50 }
51 else
52 {
53 $this->addError(new Error('basket item is not exists', 200140400001));
54 }
55
56 return null;
57 }
58 );
59 }
60
61 //region Actions
62 public function getFieldsAction()
63 {
65
66 return [
67 'BASKET_ITEM' => $entity->prepareFieldInfos($entity->getFields()),
68 ];
69 }
70
72 {
74
75 return [
76 'BASKET_ITEM' => $entity->prepareFieldInfos($entity->getFieldsCatalogProduct()),
77 ];
78 }
79
80 public function modifyAction(array $fields)
81 {
82 $builder = $this->getBuilder();
83 $builder->buildEntityBasket($fields);
84
85 if (!$this->checkBuilderError($builder))
86 {
87 return null;
88 }
89
90 $order = $builder->getOrder();
91
92 $result = $order->save();
93 if (!$result->isSuccess())
94 {
95 $this->addErrors($result->getErrors());
96
97 return null;
98 }
99
100 //TODO: return $basket->toArray();
101 $convertedOrder = $this->toArray($order);
102 return [
103 'BASKET_ITEMS' => $convertedOrder['ORDER']['BASKET_ITEMS'] ?? null,
104 ];
105 }
106
107 public function addAction(array $fields)
108 {
109 $data = [];
110
111 if (Loader::includeModule('bitrix24'))
112 {
113 if (isset($fields['PRODUCT_ID']) && (int)$fields['PRODUCT_ID'] === 0)
114 {
115 $fields['PRODUCT_ID'] = (int)$fields['PRODUCT_ID'];
116 $fields['MODULE'] = '';
117 $fields['PRODUCT_PROVIDER_CLASS'] = '';
118 }
119 else
120 {
121 if (Loader::includeModule('catalog'))
122 {
123 $fields = array_merge(
124 $fields,
125 $this->getStandartProviderDescription()
126 );
127 }
128 else
129 {
130 unset(
131 $fields['MODULE'],
132 $fields['PRODUCT_PROVIDER_CLASS'],
133 );
134 }
135 }
136 }
137
138 if (isset($fields['VAT_RATE']) && $fields['VAT_RATE'] === '')
139 {
140 $fields['VAT_RATE'] = null;
141 }
142
143 $data['ORDER'] = [
144 'ID' => $fields['ORDER_ID'] ?? null,
145 'BASKET_ITEMS' => [
146 $fields,
147 ],
148 ];
149
150 $result = $this->addValidate($fields);
151 if (!$result->isSuccess())
152 {
153 $this->addErrors($result->getErrors());
154
155 return null;
156 }
157
158 $builder = $this->getBuilder(
159 new SettingsContainer([
160 'deleteBasketItemsIfNotExists' => false
161 ])
162 );
163 $builder->buildEntityBasket($data);
164
165 if (!$this->checkBuilderError($builder))
166 {
167 return null;
168 }
169
170 $idx = 0;
171 $order = $builder->getOrder();
172 $collection = $order->getBasket();
174 foreach ($collection as $basketItem)
175 {
176 if ($basketItem->getId() <= 0)
177 {
178 $idx = $basketItem->getInternalIndex();
179 break;
180 }
181 }
182 unset(
183 $basketItem,
185 );
186
187 $result = $order->save();
188
189 if (!$result->isSuccess())
190 {
191 $this->addErrors($result->getErrors());
192
193 return null;
194 }
195
197 $entity = $order->getBasket()->getItemByIndex($idx);
198 if ($entity->getId() <= 0)
199 {
200 $this->addError(new Error('basket item is not saved - bad data', 200140400007));
201
202 return null;
203 }
204
205 return new Page('BASKET_ITEM', $this->get($entity), 1);
206 }
207
209 {
210 if (!$this->checkModuleCatalog())
211 {
212 return null;
213 }
214
215 $fields = array_merge(
216 $fields,
217 $this->getStandartProviderDescription()
218 );
219
220 return $this->addAction($fields);
221 }
222
223 public function updateAction(Sale\BasketItem $basketItem, array $fields)
224 {
225 $data = [];
226
227 $fields['ID'] = $basketItem->getBasketCode();
228 $fields['ORDER_ID'] = $basketItem->getCollection()->getOrderId();
229
230 if (isset($fields['VAT_RATE']) && $fields['VAT_RATE'] === '')
231 {
232 $fields['VAT_RATE'] = null;
233 }
234
235 $data['ORDER']['ID'] = $fields['ORDER_ID'];
236 $data['ORDER']['BASKET_ITEMS'] = [$fields];
237
238 $builder = $this->getBuilder(
239 new SettingsContainer([
240 'deleteBasketItemsIfNotExists' => false
241 ])
242 );
243
244 $builder->buildEntityBasket($data);
245 if (!$this->checkBuilderError($builder))
246 {
247 return null;
248 }
249
250 $order = $builder->getOrder();
251
252 $result = $order->save();
253 if (!$result->isSuccess())
254 {
255 $this->addErrors($result->getErrors());
256
257 return null;
258 }
259
261 $entity = $order->getBasket()->getItemById($basketItem->getId());
262
263 return new Page('BASKET_ITEM', $this->get($entity), 1);
264 }
265
267 {
268 if (!$this->checkModuleCatalog())
269 {
270 return null;
271 }
272
273 return $this->updateAction($basketItem, $fields);
274 }
275
276 public function getAction(Sale\BasketItem $basketItem)
277 {
278 //TODO: $basketItem->toArray();
279 return [
280 'BASKET_ITEM' => $this->get($basketItem),
281 ];
282 }
283
284 public function deleteAction(Sale\BasketItem $basketItem)
285 {
287 $basketCollection = $basketItem->getCollection();
288 $order = $basketCollection->getOrder();
289
290 $result = $basketItem->delete();
291 if ($result->isSuccess())
292 {
293 $result = $order->save();
294 }
295
296 if (!$result->isSuccess())
297 {
298 $this->addErrors($result->getErrors());
299 }
300
301 return $result->isSuccess();
302 }
303
304 public function listAction(
305 PageNavigation $pageNavigation,
306 array $select = [],
307 array $filter = [],
308 array $order = [],
309 bool $__calculateTotalCount = true
310 ): Page
311 {
312 $select = empty($select) ? ['*'] : $select;
313 $order = empty($order)? ['ID' => 'ASC'] : $order;
314
315 $registry = Sale\Registry::getInstance(Sale\Registry::REGISTRY_TYPE_ORDER);
316
318 $basketClass = $registry->getBasketClassName();
319
320 $iterator = $basketClass::getList([
321 'select' => $select,
322 'filter' => $filter,
323 'order' => $order,
324 'offset' => $pageNavigation->getOffset(),
325 'limit' => $pageNavigation->getLimit(),
326 'count_total' => $__calculateTotalCount,
327 ]);
328 $items = $iterator->fetchAll();
329 $totalCount = $__calculateTotalCount ? $iterator->getCount() : 0;
330 unset($iterator);
331
332 return new Page('BASKET_ITEMS', $items, $totalCount);
333 }
334
335 public function canBuyAction(Sale\BasketItem $basketItem)
336 {
337 return $basketItem->canBuy() ? 'Y' : 'N';
338 }
339
340 public function getBasePriceAction(Sale\BasketItem $basketItem)
341 {
342 return $basketItem->getBasePrice();
343 }
344
345 public function getBasePriceWithVatAction(Sale\BasketItem $basketItem)
346 {
347 return $basketItem->getBasePriceWithVat();
348 }
349
350 public function getCurrencyAction(Sale\BasketItem $basketItem)
351 {
352 return $basketItem->getCurrency();
353 }
354
355 public function getDefaultPriceAction(Sale\BasketItem $basketItem)
356 {
357 return $basketItem->getDefaultPrice();
358 }
359
360 public function getDiscountPriceAction(Sale\BasketItem $basketItem)
361 {
362 return $basketItem->getDiscountPrice();
363 }
364
365 public function getFinalPriceAction(Sale\BasketItem $basketItem)
366 {
367 return $basketItem->getFinalPrice();
368 }
369
370 public function getInitialPriceAction(Sale\BasketItem $basketItem)
371 {
372 return $basketItem->getInitialPrice();
373 }
374
375 public function getPriceAction(Sale\BasketItem $basketItem)
376 {
377 return $basketItem->getPrice();
378 }
379
380 public function getPriceWithVatAction(Sale\BasketItem $basketItem)
381 {
382 return $basketItem->getPriceWithVat();
383 }
384
385 public function getProductIdAction(Sale\BasketItem $basketItem)
386 {
387 return $basketItem->getProductId();
388 }
389
390 public function getQuantityAction(Sale\BasketItem $basketItem)
391 {
392 return $basketItem->getQuantity();
393 }
394
395 public function getReservedQuantityAction(Sale\BasketItem $basketItem)
396 {
397 return $basketItem->getReservedQuantity();
398 }
399
400 public function getVatAction(Sale\BasketItem $basketItem)
401 {
402 return $basketItem->getVat();
403 }
404
405 public function getVatRateAction(Sale\BasketItem $basketItem)
406 {
407 return $basketItem->getVatRate();
408 }
409
410 public function getWeightAction(Sale\BasketItem $basketItem)
411 {
412 return $basketItem->getWeight();
413 }
414
415 public function isBarcodeMultiAction(Sale\BasketItem $basketItem)
416 {
417 return $basketItem->isBarcodeMulti()? 'Y':'N';
418 }
419
420 public function isCustomMultiAction(Sale\BasketItem $basketItem)
421 {
422 return $basketItem->isCustom()? 'Y':'N';
423 }
424
425 public function isCustomPriceAction(Sale\BasketItem $basketItem)
426 {
427 return $basketItem->isCustomPrice()? 'Y':'N';
428 }
429
430 public function isDelayAction(Sale\BasketItem $basketItem)
431 {
432 return $basketItem->isDelay()? 'Y':'N';
433 }
434
435 public function isVatInPriceAction(Sale\BasketItem $basketItem)
436 {
437 return $basketItem->isVatInPrice()? 'Y':'N';
438 }
439
440 /*public function checkProductBarcodeAction(Sale\BasketItem $basketItem, array $fields)
441 {
442 $r = false;
443 if ($basketItem)
444 {
445 $r = Provider::checkProductBarcode($basketItem, $fields);
446 }
447
448 if ($r)
449 return true;
450 else
451 {
452 $this->addError(new Error('barcode check failed',200150000010));
453 return null;
454 }
455
456 }*/
457
458 //endregion
459
460 protected function get(Sale\BasketItem $basketItem, array $fields=[])
461 {
462 $convertedOrder = $this->toArray($basketItem->getCollection()->getOrder(), $fields);
463 $items = $convertedOrder['ORDER']['BASKET_ITEMS'] ?? [];
464 unset($convertedOrder);
465
466 foreach ($items as $item)
467 {
468 if ($item['ID'] == $basketItem->getId())
469 {
470 return $item;
471 }
472 }
473
474 return [];
475 }
476
477 public static function prepareFields($fields)
478 {
479 $data = null;
480 Loader::includeModule('catalog');
481
482 if (isset($fields['BASKET_ITEMS']))
483 {
484 $i = 0;
485 foreach ($fields['BASKET_ITEMS'] as $item)
486 {
487 if (isset($item['PRODUCT_ID']))
488 {
489 $item['OFFER_ID'] = $item['PRODUCT_ID'];
490 unset($item['PRODUCT_ID']); // need for builder
491 }
492
493 /*$properties = isset($item['PROPERTIES'])? $item['PROPERTIES']:[];
494 foreach ($properties as &$property)
495 {
496 if(isset($property['BASKET_ID']))
497 unset($property['BASKET_ID']);
498 }
499
500 $item['PROPS'] = $properties;*/
501
502 $item['PROPS'] = $item['PROPERTIES'] ?? [];
503 unset($item['PROPERTIES']);
504
505 $basketCode = $item['ID'] ?? 'n' . ++$i;
506 unset($item['ID']);
507
508 $data[$basketCode] = $item;
509 }
510 unset($fields['BASKET_ITEMS']);
511 }
512
513 return is_array($data) ? ['PRODUCT' => $data] : [];
514 }
515
516 protected function checkPermissionEntity($name)
517 {
518 if (
519 $name === 'canbuy'
520 || $name === 'getbaseprice'
521 || $name === 'getbasepricewithvat'
522 || $name === 'getcurrency'
523 || $name === 'getdefaultprice'
524 || $name === 'getdiscountprice'
525 || $name === 'getfinalprice'
526 || $name === 'getinitialprice'
527 || $name === 'getprice'
528 || $name === 'getpricewithvat'
529 || $name === 'getproductid'
530 || $name === 'getquantity'
531 || $name === 'getreservedquantity'
532 || $name === 'getvat'
533 || $name === 'getvatrate'
534 || $name === 'getweight'
535 || $name === 'isbarcodemulti'
536 || $name === 'iscustommulti'
537 || $name === 'iscustomprice'
538 || $name === 'isdelay'
539 || $name === 'isvatinprice'
540 || $name === 'getfieldscatalogproduct'
541 )
542 {
543 $result = $this->checkReadPermissionEntity();
544 }
545 elseif ($name === 'addcatalogproduct' || $name === 'updatecatalogproduct')
546 {
547 $result = $this->checkCreatePermissionEntity();
548 }
549 else
550 {
551 $result = parent::checkPermissionEntity($name);
552 }
553
554 return $result;
555 }
556
557 protected function addValidate($fields)
558 {
559 $result = new Result();
560
561 if ((int)($fields['ORDER_ID'] ?? null) <= 0)
562 {
563 $result->addError(new Error('Required fields: fields[ORDER_ID]', 200140400008));
564
565 return $result;
566 }
567
570 $orderClass = $registry->getOrderClassName();
571
572 $iterator = $orderClass::getList([
573 'select' => [
574 'ID',
575 'CURRENCY',
576 ],
577 'filter' => [
578 '=ID' => (int)$fields['ORDER_ID'],
579 ],
580 ]);
581 $order = $iterator->fetch();
582 unset($iterator);
583 if (empty($order))
584 {
585 $result->addError(new Error('Order not found', 200140400009));
586
587 return $result;
588 }
589
590 if ($order['CURRENCY'] !== $fields['CURRENCY'])
591 {
592 $result->addError(new Error('Currency must be the currency of the order', 200140400011));
593
594 return $result;
595 }
596
597 return $result;
598 }
599
600 private function checkBuilderError(Sale\Helpers\Order\Builder\OrderBuilder $builder): bool
601 {
602 $errors = $builder->getErrorsContainer();
603 if (!$errors->isSuccess())
604 {
605 $this->addErrors($errors->getErrors());
606
607 return false;
608 }
609
610 return true;
611 }
612
613 private function getStandartProviderDescription(): array
614 {
615 return [
616 'MODULE' => 'catalog',
617 'PRODUCT_PROVIDER_CLASS' => Catalog\Product\Basket::getDefaultProviderName(),
618 ];
619 }
620
621 private function checkModuleCatalog(): bool
622 {
623 if (!Loader::includeModule('catalog'))
624 {
625 $this->addError(new Error('Module catalog is not exists', 200140400006));
626
627 return false;
628 }
629
630 return true;
631 }
632}
addError(Error $error)
Определения controller.php:1070
addErrors(array $errors)
Определения controller.php:1083
getPrimaryAutoWiredParameter()
Определения controller.php:334
Определения error.php:15
getWeightAction(Sale\BasketItem $basketItem)
Определения basketitem.php:410
getFinalPriceAction(Sale\BasketItem $basketItem)
Определения basketitem.php:365
getReservedQuantityAction(Sale\BasketItem $basketItem)
Определения basketitem.php:395
static prepareFields($fields)
Определения basketitem.php:477
getInitialPriceAction(Sale\BasketItem $basketItem)
Определения basketitem.php:370
getProductIdAction(Sale\BasketItem $basketItem)
Определения basketitem.php:385
getAction(Sale\BasketItem $basketItem)
Определения basketitem.php:276
modifyAction(array $fields)
Определения basketitem.php:80
isVatInPriceAction(Sale\BasketItem $basketItem)
Определения basketitem.php:435
getFieldsCatalogProductAction()
Определения basketitem.php:71
updateCatalogProductAction(Sale\BasketItem $basketItem, array $fields)
Определения basketitem.php:266
getPriceWithVatAction(Sale\BasketItem $basketItem)
Определения basketitem.php:380
isCustomPriceAction(Sale\BasketItem $basketItem)
Определения basketitem.php:425
isDelayAction(Sale\BasketItem $basketItem)
Определения basketitem.php:430
checkPermissionEntity($name)
Определения basketitem.php:516
getBasePriceWithVatAction(Sale\BasketItem $basketItem)
Определения basketitem.php:345
getCurrencyAction(Sale\BasketItem $basketItem)
Определения basketitem.php:350
isBarcodeMultiAction(Sale\BasketItem $basketItem)
Определения basketitem.php:415
getDefaultPriceAction(Sale\BasketItem $basketItem)
Определения basketitem.php:355
getPriceAction(Sale\BasketItem $basketItem)
Определения basketitem.php:375
getDiscountPriceAction(Sale\BasketItem $basketItem)
Определения basketitem.php:360
addCatalogProductAction(array $fields)
Определения basketitem.php:208
canBuyAction(Sale\BasketItem $basketItem)
Определения basketitem.php:335
getBasePriceAction(Sale\BasketItem $basketItem)
Определения basketitem.php:340
getVatRateAction(Sale\BasketItem $basketItem)
Определения basketitem.php:405
getVatAction(Sale\BasketItem $basketItem)
Определения basketitem.php:400
getQuantityAction(Sale\BasketItem $basketItem)
Определения basketitem.php:390
isCustomMultiAction(Sale\BasketItem $basketItem)
Определения basketitem.php:420
static getInstance($type)
Определения registry.php:183
const REGISTRY_TYPE_ORDER
Определения registry.php:16
$data['IS_AVAILABLE']
Определения .description.php:13
</td ></tr ></table ></td ></tr >< tr >< td class="bx-popup-label bx-width30"><?=GetMessage("PAGE_NEW_TAGS")?> array( $site)
Определения file_new.php:804
$result
Определения get_property_values.php:14
$entity
$errors
Определения iblock_catalog_edit.php:74
$select
Определения iblock_catalog_list.php:194
$filter
Определения iblock_catalog_list.php:54
$name
Определения menu_edit.php:35
Order
Определения order.php:6
trait Error
Определения error.php:11
$order
Определения payment.php:8
if( $daysToExpire >=0 &&$daysToExpire< 60 elseif)( $daysToExpire< 0)
Определения prolog_main_admin.php:393
$i
Определения factura.php:643
$items
Определения template.php:224
$totalCount
Определения subscription_card_product.php:51
$iterator
Определения yandex_run.php:610
$fields
Определения yandex_run.php:501