1C-Bitrix 25.700.0
Загрузка...
Поиск...
Не найдено
manager.php
См. документацию.
1<?php
2
3namespace Bitrix\Sale\Delivery\ExtraServices;
4
5use Bitrix\Main\Event;
6use Bitrix\Sale\Result;
7use Bitrix\Main\EventResult;
8use Bitrix\Main\SystemException;
9use Bitrix\Main\Localization\Loc;
10use Bitrix\Sale\Delivery\Services;
11use Bitrix\Main\ArgumentNullException;
12use Bitrix\Sale\Internals\ShipmentExtraServiceTable;
13use Bitrix\Sale\Shipment;
14
15Loc::loadMessages(__FILE__);
16
18{
20 protected $items = array();
21 protected static $classes = null;
22 protected static $cachedFields = array();
23
27
28 const STORE_PICKUP_CODE = 'BITRIX_STORE_PICKUP';
29 const STORE_PICKUP_CLASS = '\Bitrix\Sale\Delivery\ExtraServices\Store';
30
32 protected $isClone = false;
33
41 public function __construct($initParam, $currency = "", $values = array(), array $additionalParams = array())
42 {
43 if(!is_array($initParam)) // deliveryId
44 {
45 if(intval($initParam) <= 0) //new delivery service
46 return;
47
48 $itemsParams = self::getExtraServicesList($initParam);
49
50 }
51 else // params array.
52 {
53 $itemsParams = $initParam;
54 }
55
56 if(empty($itemsParams))
57 return;
58
59 if(!empty($this->items))
60 sortByColumn($itemsParams, array("SORT" => SORT_ASC, "NAME" => SORT_ASC), '', null, true);
61
62 foreach($itemsParams as $params)
63 {
64 if($currency === "" && !empty($params["CURRENCY"]))
65 $currency = $params["CURRENCY"];
66
67 $this->addItem($params, $currency, isset($values[$params["ID"]]) ? $values[$params["ID"]] : null, $additionalParams);
68 }
69 }
70
74 public static function getClassesList()
75 {
76 if(static::$classes === null)
77 self::initClassesList();
78
79 return static::$classes;
80 }
81
87 public static function initClassesList()
88 {
89 if(static::$classes !== null)
90 return true;
91
92 $classes = array(
93 '\Bitrix\Sale\Delivery\ExtraServices\Enum' => 'lib/delivery/extra_services/enum.php',
94 '\Bitrix\Sale\Delivery\ExtraServices\Store' => 'lib/delivery/extra_services/store.php',
95 '\Bitrix\Sale\Delivery\ExtraServices\Quantity' => 'lib/delivery/extra_services/quantity.php',
96 '\Bitrix\Sale\Delivery\ExtraServices\Checkbox' => 'lib/delivery/extra_services/checkbox.php'
97 );
98
101 unset($classes['\Bitrix\Sale\Delivery\ExtraServices\Store']);
102 $event = new Event('sale', 'onSaleDeliveryExtraServicesClassNamesBuildList');
103 $event->send();
104 $resultList = $event->getResults();
105
106 if (is_array($resultList) && !empty($resultList))
107 {
108 $customClasses = array();
109
110 foreach ($resultList as $eventResult)
111 {
113 if ($eventResult->getType() != EventResult::SUCCESS)
114 continue;
115
116 $params = $eventResult->getParameters();
117
118 if(!empty($params) && is_array($params))
119 $customClasses = array_merge($customClasses, $params);
120 }
121
122 if(!empty($customClasses))
123 {
125 $classes = array_merge($customClasses, $classes);
126 }
127 }
128
129 static::$classes = array_merge(array_keys($classes));
130
131 return static::$classes;
132 }
133
137 public function getItems()
138 {
139 return $this->items;
140 }
141
146 public function getItem($id)
147 {
148 return (isset($this->items[$id]) ? $this->items[$id] : null);
149 }
150
155 public function getItemByCode($code)
156 {
157 foreach($this->items as $item)
158 if($item->getCode() == $code)
159 return $item;
160
161 return null;
162 }
163
168 public function getTotalCostShipment(Shipment $shipment = null)
169 {
170 $result = 0;
171
172 foreach($this->items as $itemId => $item)
173 $result += $item->getCostShipment($shipment);
174
175 return $result;
176 }
177
183 public static function prepareParamsToSave($params)
184 {
185 if(isset($params["RIGHTS"]))
186 {
187 $params["RIGHTS"] =
188 (isset($params["RIGHTS"][self::RIGHTS_ADMIN_IDX]) ? $params["RIGHTS"][self::RIGHTS_ADMIN_IDX] : "Y").
189 (isset($params["RIGHTS"][self::RIGHTS_MANAGER_IDX]) ? $params["RIGHTS"][self::RIGHTS_MANAGER_IDX] : "Y").
190 (isset($params["RIGHTS"][self::RIGHTS_CLIENT_IDX]) ? $params["RIGHTS"][self::RIGHTS_CLIENT_IDX] : "Y");
191 }
192
193 if(!isset($params["CLASS_NAME"]) || $params["CLASS_NAME"] == '' || !class_exists($params["CLASS_NAME"]))
194 return $params;
195
196 if(!isset($params["ACTIVE"]))
197 $params["ACTIVE"] = "Y";
198
199 if(isset($params["CLASS_NAME_DISABLED"]))
200 unset($params["CLASS_NAME_DISABLED"]);
201
202 if(is_callable($params["CLASS_NAME"]."::prepareParamsToSave"))
204
205 return $params;
206 }
207
216 public static function getAdminParamsControl($className, $name, array $params)
217 {
218 if($className == '')
219 throw new ArgumentNullException("className");
220
221 if(!is_callable($className.'::getAdminParamsControl'))
222 throw new SystemException('"'.$className.'::getAdminParamsControl" does not exist!');
223
224 return $className::getAdminParamsControl($name, $params);
225 }
226
236 public function addItem($params, $currency, $value = null, array $additionalParams = array())
237 {
238 if($params["CLASS_NAME"] === '' )
239 return false;
240
241 if(!isset($params["CLASS_NAME"]))
242 throw new ArgumentNullException("params[\"CLASS_NAME\"]");
243
244 if(!class_exists($params["CLASS_NAME"]))
245 return false;
246
247 if(!is_subclass_of($params["CLASS_NAME"], Base::class))
248 {
249 throw new \Bitrix\Main\SystemException(
250 'Class "' . $params["CLASS_NAME"] . '" is not a subclass of the \Bitrix\Sale\Delivery\ExtraServices\Base'
251 );
252 }
253
254 $item = new $params["CLASS_NAME"]($params["ID"], $params, $currency, $value, $additionalParams);
255 $this->items[$params["ID"]] = $item;
256 return $params["ID"];
257 }
258
262 public function setValues(array $values = array())
263 {
264 foreach($values as $eSrvId => $value)
265 {
266 $item = $this->getItem($eSrvId);
267
268 if($item)
269 $item->setValue($value);
270 }
271 }
272
276
278 {
279 foreach($this->items as $itemId => $item)
280 $item->setOperatingCurrency($currency);
281 }
282
283 public static function getValuesForShipment(int $shipmentId, int $deliveryId): array
284 {
285 $result = [];
286
287 if ($shipmentId <= 0 || $deliveryId <= 0)
288 {
289 return $result;
290 }
291
292 $dbRes = ShipmentExtraServiceTable::getList([
293 'filter' => [
294 '=SHIPMENT_ID' => $shipmentId,
295 '!=ID' => self::getStoresValueId($deliveryId),
296 ],
297 ]);
298
299 while ($row = $dbRes->fetch())
300 {
301 $result[$row['EXTRA_SERVICE_ID']] = $row['VALUE'];
302 }
303
304 return $result;
305 }
306
315 public static function saveValuesForShipment($shipmentId, $extraServices)
316 {
317 $result = new Result();
318
319 if(intval($shipmentId) <= 0)
320 throw new ArgumentNullException("shipmentId");
321
322 $exist = array();
323
324 $dbRes = ShipmentExtraServiceTable::getList(array(
325 'filter' => array(
326 '=SHIPMENT_ID' => $shipmentId
327 )
328 ));
329
330 while($row = $dbRes->fetch())
331 $exist[$row["EXTRA_SERVICE_ID"]] = $row["ID"];
332
333 if(is_array($extraServices))
334 {
335 foreach($extraServices as $extraServiceId => $value)
336 {
337 if(array_key_exists($extraServiceId, $exist))
338 {
339 $res = ShipmentExtraServiceTable::update($exist[$extraServiceId], array("VALUE" => $value));
340 }
341 else
342 {
343 $res = ShipmentExtraServiceTable::add(array(
344 "EXTRA_SERVICE_ID" => $extraServiceId,
345 "SHIPMENT_ID" => $shipmentId,
346 "VALUE" => $value
347 ));
348 }
349
350 if($res->isSuccess())
351 unset($exist[$extraServiceId]);
352 else
353 foreach($res->getErrors() as $error)
354 $result->addError($error);
355
356 }
357 }
358
359 foreach($exist as $extraServiceId => $value)
360 {
361 $res = ShipmentExtraServiceTable::delete($extraServiceId);
362
363 if(!$res->isSuccess())
364 foreach($res->getErrors() as $error)
365 $result->addError($error);
366 }
367
368 return $result;
369 }
370
378 public static function getObjectsForShipment(int $shipmentId, int $deliveryId, string $currency): array
379 {
380 $result = [];
381
382 $extraServiceValuesList = ShipmentExtraServiceTable::getList(
383 [
384 'filter' => [
385 '=SHIPMENT_ID' => $shipmentId,
386 '!=ID' => self::getStoresValueId($deliveryId)
387 ],
388 'select' => [
389 '*',
390 'EXTRA_SERVICE',
391 ]
392 ]
393 );
394
395 while ($extraServiceValue = $extraServiceValuesList->fetchObject())
396 {
397 $extraService = $extraServiceValue->getExtraService();
398
399 $className = $extraService->getClassName();
400
402 $extraServiceInstance = new $className(
403 $extraService->getId(),
404 [
405 'NAME' => $extraService->getName(),
406 'CODE' => $extraService->getCode(),
407 'INIT_VALUE' => $extraService->getInitValue(),
408 'PARAMS' => $extraService->getParams()
409 ],
410 $currency,
411 $extraServiceValue->getValue()
412 );
413
414 if (!$extraServiceInstance instanceof Base)
415 {
416 throw new SystemException(
417 sprintf(
418 'Object is not of expected type: %s',
419 Base::class
420 )
421 );
422 }
423
424 $result[$extraServiceValue['EXTRA_SERVICE_ID']] = $extraServiceInstance;
425 }
426
427 return $result;
428 }
429
430 public static function getStoreIdForShipment(int $shipmentId, int $deliveryId): int
431 {
432 if ($shipmentId <= 0 || $deliveryId <= 0)
433 {
434 return 0;
435 }
436
437 $storeFields = self::getStoresFields($deliveryId);
438 if (empty($storeFields))
439 {
440 return 0;
441 }
442
443 $row = ShipmentExtraServiceTable::getList([
444 'filter' => [
445 '=SHIPMENT_ID' => $shipmentId,
446 '=EXTRA_SERVICE_ID' => $storeFields['ID'],
447 ],
448 'limit' => 1,
449 ])->fetch();
450
451 return $row ? (int)$row['VALUE'] : 0;
452 }
453
463 public static function saveStoreIdForShipment($shipmentId, $deliveryId, $storeId)
464 {
465 if(intval($shipmentId) <= 0)
466 throw new ArgumentNullException("shipmentId");
467
468 $result = new Result();
469
470 if(intval($deliveryId) <= 0)
471 return $result;
472
473 $storeFields = self::getStoresFields($deliveryId, false);
474
475 if(isset($storeFields['ID']))
476 {
477 $dbRes = ShipmentExtraServiceTable::getList(array(
478 'filter' => array(
479 '=SHIPMENT_ID' => $shipmentId,
480 '=EXTRA_SERVICE_ID' => $storeFields['ID']
481 )
482 ));
483
484 $storeRowId = 0;
485
486 if($row = $dbRes->fetch())
487 $storeRowId = $row["ID"];
488
489 if($storeRowId > 0)
490 {
491 $res = ShipmentExtraServiceTable::update($storeRowId, array("VALUE" => $storeId));
492 }
493 else
494 {
495 $res = ShipmentExtraServiceTable::add(array(
496 "EXTRA_SERVICE_ID" => $storeFields['ID'],
497 "SHIPMENT_ID" => $shipmentId,
498 "VALUE" => $storeId
499 ));
500 }
501
502 if(!$res->isSuccess())
503 foreach($res->getErrors() as $error)
504 $result->addError($error);
505 }
506
507 return $result;
508 }
509
514 protected static function getStoresValueId($deliveryId)
515 {
516 $fields = self::getStoresFields($deliveryId);
517
518 if(isset($fields["ID"]))
519 $result = $fields["ID"];
520 else
521 $result = 0;
522
523 return $result;
524 }
525
531 public static function getStoresFields($deliveryId, $onlyActive = true)
532 {
533 if(intval($deliveryId) <= 0)
534 return array();
535
536 $result = self::getExtraServicesList($deliveryId, true);
537
538 if(
539 $onlyActive
540 && (empty($result['ACTIVE']) || $result['ACTIVE'] !== 'Y')
541 )
542 {
543 return [];
544 }
545
546 return $result;
547 }
548
553 public static function getStoresList($deliveryId)
554 {
555 $stores = self::getStoresFields($deliveryId);
556 return isset($stores["PARAMS"]["STORES"]) ? $stores["PARAMS"]["STORES"] : array();
557 }
558
564 public static function deleteStores($deliveryId)
565 {
566 $storesFields = self::getStoresFields($deliveryId, false);
567
568 if(empty($storesFields['ID']))
569 return new Result();
570
571 $result = Table::delete($storesFields['ID']);
572
573 if($result->isSuccess())
574 unset(static::$cachedFields[$deliveryId][$storesFields['ID']]);
575
576 return $result;
577 }
578
584 public static function setStoresUnActive($deliveryId)
585 {
586 if(intval($deliveryId) <= 0)
587 return new Result();
588
589 $storesFields = self::getStoresFields($deliveryId);
590
591 if(empty($storesFields['ID']))
592 return new Result();
593
594 $result = Table::update(
595 $storesFields['ID'],
596 array(
597 "ACTIVE" => "N"
598 )
599 );
600
601 if($result->isSuccess())
602 static::$cachedFields[$deliveryId][$storesFields['ID']]["ACTIVE"] = "N";
603
604 return $result;
605 }
606
613 public static function saveStores($deliveryId, array $storesList)
614 {
615 $result = new Result();
616 $storesFields = self::getStoresFields($deliveryId, false);
617
618 if(!empty($storesFields['ID']))
619 {
620 $res = Table::update(
621 $storesFields["ID"],
622 array(
623 "ACTIVE" => "Y",
624 "PARAMS" => array(
625 "STORES" => $storesList
626 )
627 )
628 );
629 }
630 else
631 {
632 $res = Table::add(
633 array(
634 "CODE" => self::STORE_PICKUP_CODE,
635 "NAME" => Loc::getMessage("DELIVERY_SERVICE_MANAGER_ES_NAME"),
636 "DESCRIPTION" => Loc::getMessage("DELIVERY_SERVICE_MANAGER_ES_DESCRIPTION"),
637 "CLASS_NAME" => self::STORE_PICKUP_CLASS,
638 "DELIVERY_ID" => $deliveryId,
639 "RIGHTS" => "YYY",
640 "ACTIVE" => "Y",
641 "PARAMS" => array(
642 "STORES" => $storesList
643 )
644 )
645 );
646 }
647
648 if(!$res->isSuccess())
649 $result->addErrors($res->getErrors());
650
651 return $result;
652 }
653
660 public static function getExtraServicesList($deliveryId, $stores = false)
661 {
662 if(intval($deliveryId) <= 0)
663 return array();
664
665 if(!isset(static::$cachedFields[$deliveryId]))
666 {
667 $srv = Services\Manager::getById($deliveryId);
668
669 if(!empty($srv['PARENT_ID']))
670 {
671 self::prepareData(array($deliveryId, $srv['PARENT_ID']));
672 static::$cachedFields[$deliveryId] = static::$cachedFields[$deliveryId] + static::$cachedFields[$srv['PARENT_ID']];
673 }
674 else
675 {
676 self::prepareData(array($deliveryId));
677 }
678 }
679
680 $result = array();
681
682 foreach(static::$cachedFields[$deliveryId] as $id => $es)
683 {
684 if($es['CLASS_NAME'] == self::STORE_PICKUP_CLASS)
685 {
686 if($stores)
687 return $es;
688
689 continue;
690 }
691
692 if(!$stores)
693 $result[$id] = $es;
694 }
695
696 return $result;
697 }
698
705 public static function prepareData(array $servicesIds)
706 {
707 if(empty($servicesIds))
708 return;
709
710 foreach($servicesIds as $id)
711 {
712 $srv = Services\Manager::getById($id);
713
714 if(!empty($srv['PARENT_ID']) && !in_array($id, $servicesIds))
715 $servicesIds[] = $id;
716 }
717
718 $ids = array_diff($servicesIds, array_keys(static::$cachedFields));
719
720 $dbRes = Table::getList(array(
721 'filter' => array(
722 '=DELIVERY_ID' => $ids,
723 array(
724 "LOGIC" => "OR",
725 "=ACTIVE" => "Y",
726 "=CLASS_NAME" => self::STORE_PICKUP_CLASS
727 )
728 ),
729 "order" => array(
730 "SORT" =>"ASC",
731 "NAME" => "ASC"
732 ),
733 "select" => array("*", "CURRENCY" => "DELIVERY_SERVICE.CURRENCY")
734 ));
735
736 while($es = $dbRes->fetch())
737 {
738 if(!isset(static::$cachedFields[$es['DELIVERY_ID']]))
739 static::$cachedFields[$es['DELIVERY_ID']] = array();
740
741 static::$cachedFields[$es['DELIVERY_ID']][$es["ID"]] = $es;
742 }
743
744 foreach($ids as $deliveryId)
745 if(!isset(static::$cachedFields[$deliveryId]))
746 static::$cachedFields[$deliveryId] = array();
747 }
748
755 public function createClone(\SplObjectStorage $cloneEntity)
756 {
757 if ($this->isClone() && $cloneEntity->contains($this))
758 {
759 return $cloneEntity[$this];
760 }
761
762 $extraServiceClone = clone $this;
763 $extraServiceClone->isClone = true;
764
765 if (!$cloneEntity->contains($this))
766 {
767 $cloneEntity[$this] = $extraServiceClone;
768 }
769
770 return $extraServiceClone;
771 }
772
776 public function isClone()
777 {
778 return $this->isClone;
779 }
780
786 public function getTotalCost()
787 {
788 $result = 0;
789
790 foreach($this->items as $itemId => $item)
791 $result += $item->getCost();
792
793 return $result;
794 }
795}
796
797\Bitrix\Sale\Delivery\ExtraServices\Manager::initClassesList();
static registerAutoLoadClasses($moduleName, array $classes)
Определения loader.php:273
static deleteStores($deliveryId)
Определения manager.php:564
setValues(array $values=array())
Определения manager.php:262
__construct($initParam, $currency="", $values=array(), array $additionalParams=array())
Определения manager.php:41
createClone(\SplObjectStorage $cloneEntity)
Определения manager.php:755
static saveValuesForShipment($shipmentId, $extraServices)
Определения manager.php:315
getTotalCostShipment(Shipment $shipment=null)
Определения manager.php:168
static saveStoreIdForShipment($shipmentId, $deliveryId, $storeId)
Определения manager.php:463
static getStoresList($deliveryId)
Определения manager.php:553
static setStoresUnActive($deliveryId)
Определения manager.php:584
addItem($params, $currency, $value=null, array $additionalParams=array())
Определения manager.php:236
static prepareData(array $servicesIds)
Определения manager.php:705
static getStoreIdForShipment(int $shipmentId, int $deliveryId)
Определения manager.php:430
static getValuesForShipment(int $shipmentId, int $deliveryId)
Определения manager.php:283
static getAdminParamsControl($className, $name, array $params)
Определения manager.php:216
setOperationCurrency($currency)
Определения manager.php:277
static prepareParamsToSave($params)
Определения manager.php:183
static getExtraServicesList($deliveryId, $stores=false)
Определения manager.php:660
static saveStores($deliveryId, array $storesList)
Определения manager.php:613
static getStoresValueId($deliveryId)
Определения manager.php:514
static getStoresFields($deliveryId, $onlyActive=true)
Определения manager.php:531
static getHandlersList()
Определения manager.php:636
static getById($deliveryId)
Определения manager.php:53
static delete($primary)
Определения table.php:193
</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
if(!is_null($config))($config as $configItem)(! $configItem->isVisible()) $code
Определения options.php:195
sortByColumn(array &$array, $columns, $callbacks='', $defaultValueIfNotSetValue=null, $preserveKeys=false)
Определения tools.php:5087
$name
Определения menu_edit.php:35
Определения buffer.php:3
$event
Определения prolog_after.php:141
$currency
Определения template.php:266
if($inWords) echo htmlspecialcharsbx(Number2Word_Rus(roundEx($totalVatSum $params['CURRENCY']
Определения template.php:799
$items
Определения template.php:224
$error
Определения subscription_card_product.php:20
$dbRes
Определения yandex_detail.php:168
$fields
Определения yandex_run.php:501