1C-Bitrix 25.700.0
Загрузка...
Поиск...
Не найдено
delivery.php
См. документацию.
1<?php
2
4
7use Bitrix\Sale\Location\Admin\LocationHelper as Helper;
8
14{
15 const CONN_ENTITY_NAME = 'Bitrix\Sale\Delivery\DeliveryLocation';
16
29 public static function PrepareLocation24Where($val, $key, $operation, $negative, $field, &$arField, &$arFilter)
30 {
31 try
32 {
33 $class = self::CONN_ENTITY_NAME.'Table';
34 return $field." in (".$class::getConnectedEntitiesQuery(intval($val), 'id', array('select' => array('ID'))).")";
35 }
36 catch(Exception $e)
37 {
38 return false;
39 }
40 }
41
52 public static function DoProcessOrder(&$arOrder, $deliveryCode, &$arErrors)
53 {
54 if($deliveryCode == '' || $deliveryCode == '0')
55 return false;
56
57 if(CSaleDeliveryHandler::isSidNew($deliveryCode))
58 {
61 );
62 }
63 else
64 {
66 }
67
68 if ($service)
69 {
70 $isOrderConverted = \Bitrix\Main\Config\Option::get("main", "~sale_converted_15", 'Y');
71
72 $arOrderTmpDel = array(
73 "PRICE" => $arOrder["ORDER_PRICE"] + $arOrder["TAX_PRICE"] - $arOrder["DISCOUNT_PRICE"],
74 "WEIGHT" => $arOrder["ORDER_WEIGHT"],
75 "LOCATION_FROM" => COption::GetOptionString('sale', 'location', '2961', $arOrder["SITE_ID"]),
76 "LOCATION_TO" => isset($arOrder["DELIVERY_LOCATION"]) ? $arOrder["DELIVERY_LOCATION"] : 0,
77 "LOCATION_ZIP" => $arOrder["DELIVERY_LOCATION_ZIP"],
78 "ITEMS" => $arOrder["BASKET_ITEMS"],
79 "CURRENCY" => $arOrder["CURRENCY"]
80 );
81
82 if ($isOrderConverted != 'N'
83 && !empty($arOrder['ORDER_PROP']) && is_array($arOrder['ORDER_PROP']))
84 {
85 $arOrderTmpDel['PROPERTIES'] = $arOrder['ORDER_PROP'];
86 }
87
88 //$r = $propCollection->setValuesFromPost($fields, $_FILES);
89
90 $arOrder["DELIVERY_ID"] = $deliveryCode;
91 $shipment = self::convertOrderOldToNew($arOrderTmpDel);
92
93 if(isset($arOrder["DELIVERY_EXTRA_SERVICES"]))
94 $shipment->setExtraServices($arOrder["DELIVERY_EXTRA_SERVICES"]);
95
96 $calculationResult = $service->calculate($shipment);
97
98 if (!$calculationResult->isSuccess())
99 $arErrors[] = array("CODE" => "CALCULATE", "TEXT" => implode("<br>\n", $calculationResult->getErrorMessages()));
100 else
101 $arOrder["DELIVERY_PRICE"] = roundEx($calculationResult->getPrice(), SALE_VALUE_PRECISION);
102 }
103 else
104 {
105 $arErrors[] = array("CODE" => "CALCULATE", "TEXT" => GetMessage('SKGD_DELIVERY_NOT_FOUND'));
106 }
107 }
108
112 public static function DoLoadDelivery($location, $locationZip, $weight, $price, $currency, $siteId = null, $arShoppingCart = array())
113 {
114 $location = intval($location);
115 if ($location <= 0)
116 return null;
117
118 if ($siteId == null)
120
121 $arResult = array();
122 $arMaxDimensions = array();
123
124 foreach ($arShoppingCart as $arBasketItem)
125 {
126 if (!is_array($arBasketItem["DIMENSIONS"]))
127 {
128 $arDim = unserialize($arBasketItem["~DIMENSIONS"], ['allowed_classes' => false]);
129 $arBasketItem["DIMENSIONS"] = $arDim;
130 unset($arBasketItem["~DIMENSIONS"]);
131 }
132 else
133 $arDim = $arBasketItem["DIMENSIONS"];
134
135 if (is_array($arDim))
136 {
137 $arMaxDimensions = CSaleDeliveryHelper::getMaxDimensions(
138 array($arDim["WIDTH"], $arDim["HEIGHT"], $arDim["LENGTH"]),
139 $arMaxDimensions
140 );
141 }
142 }
143
145 "COMPABILITY" => array(
146 "WEIGHT" => $weight,
147 "PRICE" => $price,
148 "LOCATION_FROM" => COption::GetOptionString('sale', 'location', false, $siteId),
149 "LOCATION_TO" => $location,
150 "LOCATION_ZIP" => $locationZip,
151 "MAX_DIMENSIONS" => $arMaxDimensions,
152 "ITEMS" => $arShoppingCart
153 ),
154 "SITE_ID" => $siteId,
155 );
156 $dbDeliveryServices = CSaleDeliveryHandler::GetList(array("SORT" => "ASC"), $arFilter);
157
158 while ($arDeliveryService = $dbDeliveryServices->GetNext())
159 {
160 if (!is_array($arDeliveryService) || !is_array($arDeliveryService["PROFILES"]))
161 continue;
162
163 foreach ($arDeliveryService["PROFILES"] as $profileId => $arDeliveryProfile)
164 {
165 if ($arDeliveryProfile["ACTIVE"] != "Y")
166 continue;
167
168 if (!array_key_exists($arDeliveryService["SID"], $arResult))
169 {
170 $arResult[$arDeliveryService["SID"]] = array(
171 "SID" => $arDeliveryService["SID"],
172 "TITLE" => $arDeliveryService["NAME"],
173 "DESCRIPTION" => $arDeliveryService["~DESCRIPTION"],
174 "PROFILES" => array(),
175 );
176 }
177
178 $arResult[$arDeliveryService["SID"]]["PROFILES"][$profileId] = array(
179 "ID" => $arDeliveryService["SID"].":".$profileId,
180 "SID" => $profileId,
181 "TITLE" => $arDeliveryProfile["TITLE"],
182 "DESCRIPTION" => $arDeliveryProfile["~DESCRIPTION"],
183 "FIELD_NAME" => "DELIVERY_ID",
184 );
185
186 $arDeliveryPriceTmp = CSaleDeliveryHandler::CalculateFull(
187 $arDeliveryService["SID"],
188 $profileId,
189 array(
190 "PRICE" => $price,
191 "WEIGHT" => $weight,
192 "LOCATION_FROM" => COption::GetOptionString('sale', 'location', false, $siteId),
193 "LOCATION_TO" => $location,
194 "LOCATION_ZIP" => $locationZip,
195 "ITEMS" => $arShoppingCart
196 ),
198 );
199
200 if ($arDeliveryPriceTmp["RESULT"] != "ERROR")
201 {
202 $arResult[$arDeliveryService["SID"]]["PROFILES"][$profileId]["DELIVERY_PRICE"] = roundEx($arDeliveryPriceTmp["VALUE"], SALE_VALUE_PRECISION);
203 $arResult[$arDeliveryService["SID"]]["PROFILES"][$profileId]["CURRENCY"] = $currency;
204 }
205 }
206 }
207
208 $dbDelivery = CSaleDelivery::GetList(
209 array("SORT" => "ASC", "NAME" => "ASC"),
210 array(
211 "LID" => $siteId,
212 "+<=WEIGHT_FROM" => $weight,
213 "+>=WEIGHT_TO" => $weight,
214 "+<=ORDER_PRICE_FROM" => $price,
215 "+>=ORDER_PRICE_TO" => $price,
216 "ACTIVE" => "Y",
217 "LOCATION" => $location,
218 )
219 );
220 while ($arDelivery = $dbDelivery->GetNext())
221 {
222 $arDeliveryDescription = CSaleDelivery::GetByID($arDelivery["ID"]);
223 $arDelivery["DESCRIPTION"] = $arDeliveryDescription["DESCRIPTION"];
224
225 $arDelivery["FIELD_NAME"] = "DELIVERY_ID";
226 if (intval($arDelivery["PERIOD_FROM"]) > 0 || intval($arDelivery["PERIOD_TO"]) > 0)
227 {
228 $arDelivery["PERIOD_TEXT"] = GetMessage("SALE_DELIV_PERIOD");
229 if (intval($arDelivery["PERIOD_FROM"]) > 0)
230 $arDelivery["PERIOD_TEXT"] .= " ".GetMessage("SOA_FROM")." ".intval($arDelivery["PERIOD_FROM"]);
231 if (intval($arDelivery["PERIOD_TO"]) > 0)
232 $arDelivery["PERIOD_TEXT"] .= " ".GetMessage("SOA_TO")." ".intval($arDelivery["PERIOD_TO"]);
233 if ($arDelivery["PERIOD_TYPE"] == "H")
234 $arDelivery["PERIOD_TEXT"] .= " ".GetMessage("SOA_HOUR")." ";
235 elseif ($arDelivery["PERIOD_TYPE"] == "M")
236 $arDelivery["PERIOD_TEXT"] .= " ".GetMessage("SOA_MONTH")." ";
237 else
238 $arDelivery["PERIOD_TEXT"] .= " ".GetMessage("SOA_DAY")." ";
239 }
240 $arResult[] = $arDelivery;
241 }
242
243 return $arResult;
244 }
245
249 public static function GetByID($ID)
250 {
251 $res = self::GetList(array(), array("ID" => $ID));
252 return $res->Fetch();
253 }
254
260 public static function GetLocationList($arFilter = Array())
261 {
262 if(!empty($arFilter['DELIVERY_ID']))
263 $arFilter['DELIVERY_ID'] = self::getIdByCode($arFilter['DELIVERY_ID']);
264
265 try
266 {
267 $locations = array();
269
270 while($loc = $res->Fetch())
271 {
272 $oldDeliveryId = self::getCodeById($loc['DELIVERY_ID']);
273
274 if($oldDeliveryId == '')
275 continue;
276
277 $loc['DELIVERY_ID'] = $oldDeliveryId;
278 $locations[] = $loc;
279 }
280 }
281 catch(Exception $e)
282 {
283 $locations = array();
284 }
285
286 $dbResult = new CDBResult();
287 $dbResult->InitFromArray($locations);
288 return $dbResult;
289 }
290
295 public static function CheckFields($ACTION, &$arFields)
296 {
297 global $DB;
298
299 if ((is_set($arFields, "NAME") || $ACTION=="ADD") && $arFields["NAME"] == '')
300 {
301 $GLOBALS["APPLICATION"]->ThrowException(GetMessage("SKGD_EMPTY_DELIVERY"), "ERROR_NO_NAME");
302 return false;
303 }
304
305 if ((is_set($arFields, "LID") || $ACTION=="ADD") && $arFields["LID"] == '')
306 {
307 $GLOBALS["APPLICATION"]->ThrowException(GetMessage("SKGD_EMPTY_SITE"), "ERROR_NO_SITE");
308 return false;
309 }
310
311 if (is_set($arFields, "ACTIVE") && $arFields["ACTIVE"] != "Y")
312 $arFields["ACTIVE"] = "N";
313 if ((is_set($arFields, "SORT") || $ACTION=="ADD") && intval($arFields["SORT"]) <= 0)
314 $arFields["SORT"] = 100;
315
316 if (is_set($arFields, "PRICE"))
317 {
318 $arFields["PRICE"] = str_replace(",", ".", $arFields["PRICE"]);
319 $arFields["PRICE"] = DoubleVal($arFields["PRICE"]);
320 }
321 if ((is_set($arFields, "PRICE") || $ACTION=="ADD") && DoubleVal($arFields["PRICE"]) < 0)
322 return false;
323
324 if ((is_set($arFields, "CURRENCY") || $ACTION=="ADD") && $arFields["CURRENCY"] == '')
325 {
326 $GLOBALS["APPLICATION"]->ThrowException(GetMessage("SKGD_EMPTY_CURRENCY"), "ERROR_NO_CURRENCY");
327 return false;
328 }
329
330 if (is_set($arFields, "ORDER_PRICE_FROM"))
331 {
332 $arFields["ORDER_PRICE_FROM"] = str_replace(",", ".", $arFields["ORDER_PRICE_FROM"]);
333 $arFields["ORDER_PRICE_FROM"] = DoubleVal($arFields["ORDER_PRICE_FROM"]);
334 }
335
336 if (is_set($arFields, "ORDER_PRICE_TO"))
337 {
338 $arFields["ORDER_PRICE_TO"] = str_replace(",", ".", $arFields["ORDER_PRICE_TO"]);
339 $arFields["ORDER_PRICE_TO"] = DoubleVal($arFields["ORDER_PRICE_TO"]);
340 }
341
342 if ((is_set($arFields, "LOCATIONS") || $ACTION=="ADD") && (!is_array($arFields["LOCATIONS"]) || count($arFields["LOCATIONS"]) <= 0))
343 {
344 $GLOBALS["APPLICATION"]->ThrowException(GetMessage("SKGD_EMPTY_LOCATION"), "ERROR_NO_LOCATIONS");
345 return false;
346 }
347
348 if (is_set($arFields, "LID"))
349 {
350 $dbSite = CSite::GetByID($arFields["LID"]);
351 if (!$dbSite->Fetch())
352 {
353 $GLOBALS["APPLICATION"]->ThrowException(str_replace("#ID#", $arFields["LID"], GetMessage("SKGD_NO_SITE")), "ERROR_NO_SITE");
354 return false;
355 }
356 }
357
358 if (is_set($arFields, "CURRENCY"))
359 {
360 if (!($arCurrency = CCurrency::GetByID($arFields["CURRENCY"])))
361 {
362 $GLOBALS["APPLICATION"]->ThrowException(str_replace("#ID#", $arFields["CURRENCY"], GetMessage("SKGD_NO_CURRENCY")), "ERROR_NO_CURRENCY");
363 return false;
364 }
365 }
366
367 if (is_set($arFields, "LOCATIONS"))
368 {
369 $countField = count($arFields["LOCATIONS"]);
370 for ($i = 0; $i < $countField; $i++)
371 {
372 if ($arFields["LOCATIONS"][$i]["LOCATION_TYPE"] != "G")
373 $arFields["LOCATIONS"][$i]["LOCATION_TYPE"] = "L";
374 }
375 }
376
377 return True;
378 }
379
386 public static function SetDeliveryLocationPro($ID, $locations)
387 {
388 $class = self::CONN_ENTITY_NAME.'Table';
389
390 $links = Helper::prepareLinksForSaving($class, $locations);
391 $class::resetMultipleForOwner($ID, $links);
392 }
393
397 public static function Update($oldId, $arFields, $arOptions = array())
398 {
399 if($oldId == '')
400 return false;
401
402 $dbRes = Bitrix\Sale\Delivery\Services\Table::getList(array(
403 'filter' => array(
404 "CODE" => $oldId,
405 "=CLASS_NAME" => '\Bitrix\Sale\Delivery\Services\Configurable'
406 )
407 ));
408
409 $oldData = $dbRes->fetch();
410
411 if(!$oldData)
412 return false;
413
414 $newId = $oldData["ID"];
415
416 $fields = array_intersect_key($arFields, Bitrix\Sale\Delivery\Services\Table::getMap());
417
418 if(!empty($fields))
419 {
420 if(array_key_exists("LOGOTIP", $fields) && is_array($fields["LOGOTIP"]))
421 {
422 $fields["LOGOTIP"]["MODULE_ID"] = "sale";
423 CFile::SaveForDB($fields, "LOGOTIP", "sale/delivery/logotip");
424 }
425
426 $fields["CONFIG"] = array(
427 "MAIN" => array(
428 "PRICE" => isset($arFields["PRICE"]) ? $arFields["PRICE"] : $oldData["CONFIG"]["MAIN"]["PRICE"],
429 "PERIOD" => array(
430 "FROM" => isset($arFields["PERIOD_FROM"]) ? $arFields["PERIOD_FROM"] : $oldData["CONFIG"]["MAIN"]["PERIOD"]["FROM"],
431 "TO" => isset($arFields["PERIOD_TO"]) ? $arFields["PERIOD_TO"] : $oldData["CONFIG"]["MAIN"]["PERIOD"]["TO"],
432 "TYPE" => isset($arFields["PERIOD_TYPE"]) ? $arFields["PERIOD_TYPE"] : $oldData["CONFIG"]["MAIN"]["PERIOD"]["TYPE"]
433 )
434 )
435 );
436
438
439 if(!$res->isSuccess())
440 return false;
441 }
442
443 if(is_set($arFields, "LOCATIONS"))
444 Helper::resetLocationsForEntity($newId, $arFields['LOCATIONS'], self::CONN_ENTITY_NAME, !!$arOptions['EXPECT_LOCATION_CODES']);
445
446 if (is_set($arFields, "PAY_SYSTEM"))
447 CSaleDelivery::UpdateDeliveryPay($newId, $arFields["PAY_SYSTEM"]);
448
449 if(isset($arFields["LID"]))
450 {
451 $rfields = array(
452 "SERVICE_ID" => $newId,
453 "CLASS_NAME" => '\Bitrix\Sale\Delivery\Restrictions\BySite',
454 "SERVICE_TYPE" => \Bitrix\Sale\Services\Base\RestrictionManager::SERVICE_TYPE_SHIPMENT,
455 "PARAMS" => array(
456 "SITE_ID" => $arFields["LID"]
457 )
458 );
459
460 $rstrRes = \Bitrix\Sale\Internals\ServiceRestrictionTable::getList(array(
461 'filter' =>array(
462 "=SERVICE_ID" => $newId,
463 "=SERVICE_TYPE" => \Bitrix\Sale\Services\Base\RestrictionManager::SERVICE_TYPE_SHIPMENT,
464 "=CLASS_NAME" => '\Bitrix\Sale\Delivery\Restrictions\BySite'
465 )
466 ));
467
468 if($restrict = $rstrRes->fetch())
469 $rres = \Bitrix\Sale\Internals\ServiceRestrictionTable::update($restrict["ID"], $rfields);
470 else
471 $rres = \Bitrix\Sale\Internals\ServiceRestrictionTable::add($rfields);
472 }
473
474 if(isset($arFields["LID"]) && $arFields["LID"] <> '')
475 {
476 $rfields = array(
477 "SERVICE_ID" => $newId,
478 "SERVICE_TYPE" => \Bitrix\Sale\Services\Base\RestrictionManager::SERVICE_TYPE_SHIPMENT,
479 "CLASS_NAME" => '\Bitrix\Sale\Delivery\Restrictions\BySite',
480
481 "PARAMS" => array(
482 "SITE_ID" => $arFields["LID"]
483 )
484 );
485
486 $rstrRes = \Bitrix\Sale\Internals\ServiceRestrictionTable::getList(array(
487 'filter' =>array(
488 "=SERVICE_ID" => $newId,
489 "=SERVICE_TYPE" => \Bitrix\Sale\Services\Base\RestrictionManager::SERVICE_TYPE_SHIPMENT,
490 "=CLASS_NAME" => '\Bitrix\Sale\Delivery\Restrictions\BySite'
491 )
492 ));
493
494 if($restrict = $rstrRes->fetch())
495 $rres = \Bitrix\Sale\Internals\ServiceRestrictionTable::update($restrict["ID"], $rfields);
496 else
497 $rres = \Bitrix\Sale\Internals\ServiceRestrictionTable::add($rfields);
498 }
499
500 if(isset($arFields["WEIGHT_FROM"]) || isset($arFields["WEIGHT_TO"]))
501 {
502 $rfields = array(
503 "SERVICE_ID" => $newId,
504 "CLASS_NAME" => '\Bitrix\Sale\Delivery\Restrictions\ByWeight',
505 "SERVICE_TYPE" => \Bitrix\Sale\Services\Base\RestrictionManager::SERVICE_TYPE_SHIPMENT,
506 "PARAMS" => array(
507 "MIN_WEIGHT" => isset($arFields["WEIGHT_FROM"]) ? $arFields["WEIGHT_FROM"] : 0,
508 "MAX_WEIGHT" => isset($arFields["WEIGHT_TO"]) ? $arFields["WEIGHT_TO"] : 0
509 )
510 );
511
512 $rstrRes = \Bitrix\Sale\Internals\ServiceRestrictionTable::getList(array(
513 'filter' =>array(
514 "=SERVICE_ID" => $newId,
515 "=SERVICE_TYPE" => \Bitrix\Sale\Services\Base\RestrictionManager::SERVICE_TYPE_SHIPMENT,
516 "=CLASS_NAME" => '\Bitrix\Sale\Delivery\Restrictions\ByWeight'
517 )
518 ));
519
520 if($restrict = $rstrRes->fetch())
521 {
522 if(floatval($arFields["WEIGHT_FROM"]) <= 0 && floatval($arFields["WEIGHT_TO"]) <= 0)
523 {
524 $rres = \Bitrix\Sale\Internals\ServiceRestrictionTable::delete($restrict["ID"]);
525 }
526 else
527 {
528 if(!isset($arFields["WEIGHT_FROM"]))
529 $rfields["PARAMS"]["MIN_WEIGHT"] = $restrict["PARAMS"]["MIN_WEIGHT"];
530
531 if(!isset($arFields["WEIGHT_TO"]))
532 $rfields["PARAMS"]["MAX_WEIGHT"] = $restrict["PARAMS"]["MAX_WEIGHT"];
533
534 $rres = \Bitrix\Sale\Internals\ServiceRestrictionTable::update($restrict["ID"], $rfields);
535 }
536 }
537 else
538 {
539 $rres = \Bitrix\Sale\Internals\ServiceRestrictionTable::add($rfields);
540 }
541
542 }
543
544 if(isset($arFields["ORDER_PRICE_FROM"]) || isset($arFields["ORDER_PRICE_TO"]) || isset($arFields["ORDER_CURRENCY"]))
545 {
546 $rfields = array(
547 "SERVICE_ID" => $newId,
548 "CLASS_NAME" => '\Bitrix\Sale\Delivery\Restrictions\ByPrice',
549 "SERVICE_TYPE" => \Bitrix\Sale\Services\Base\RestrictionManager::SERVICE_TYPE_SHIPMENT,
550 "PARAMS" => array(
551 "MIN_PRICE" => isset($arFields["ORDER_PRICE_FROM"]) ? $arFields["ORDER_PRICE_FROM"] : 0,
552 "MAX_PRICE" => isset($arFields["ORDER_PRICE_TO"]) ? $arFields["ORDER_PRICE_TO"] : 0,
553 "CURRENCY" => isset($arFields["ORDER_CURRENCY"]) ? $arFields["ORDER_CURRENCY"] : ""
554 )
555 );
556
557 $rstrRes = \Bitrix\Sale\Internals\ServiceRestrictionTable::getList(array(
558 'filter' =>array(
559 "=SERVICE_ID" => $newId,
560 "=SERVICE_TYPE" => \Bitrix\Sale\Services\Base\RestrictionManager::SERVICE_TYPE_SHIPMENT,
561 "=CLASS_NAME" => '\Bitrix\Sale\Delivery\Restrictions\ByPrice'
562 )
563 ));
564
565 if($restrict = $rstrRes->fetch())
566 {
567 if(floatval($arFields["ORDER_PRICE_FROM"]) <= 0 && floatval($arFields["ORDER_PRICE_TO"]) <= 0 && $arFields["ORDER_CURRENCY"] == '')
568 {
569 $rres = \Bitrix\Sale\Internals\ServiceRestrictionTable::delete($restrict["ID"]);
570 }
571 else
572 {
573 if(!isset($arFields["ORDER_PRICE_FROM"]))
574 $rfields["PARAMS"]["MIN_PRICE"] = $restrict["PARAMS"]["MIN_PRICE"];
575
576 if(!isset($arFields["ORDER_PRICE_TO"]))
577 $rfields["PARAMS"]["MAX_PRICE"] = $restrict["PARAMS"]["MAX_PRICE"];
578
579 if(!isset($arFields["ORDER_CURRENCY"]))
580 $rfields["PARAMS"]["CURRENCY"] = $restrict["PARAMS"]["CURRENCY"];
581
582 $rres = \Bitrix\Sale\Internals\ServiceRestrictionTable::update($restrict["ID"], $rfields);
583 }
584 }
585 else
586 {
587 $rres = \Bitrix\Sale\Internals\ServiceRestrictionTable::add($rfields);
588 }
589 }
590
591 if(isset($arFields["STORE"]))
592 {
593 $stores = unserialize($arFields["STORE"], ['allowed_classes' => false]);
594
595 if($stores)
597 }
598
599
600 return $oldId;
601 }
602
606 public static function Delete($ID)
607 {
609
610 try
611 {
613 }
614 catch(\Bitrix\Main\SystemException $e)
615 {
616 $GLOBALS["APPLICATION"]->ThrowException($e->getMessage());
617 return false;
618 }
619
620 return new CDBResult($res);
621 }
622
630 public static function GetDelivery2PaySystem($arFilter = array())
631 {
632 if(isset($arFilter["DELIVERY_ID"]))
633 $arFilter["DELIVERY_ID"] = self::getIdByCode($arFilter["DELIVERY_ID"]);
634
636 $arFilter,
637 array("DELIVERY_ID", "PAYSYSTEM_ID"),
638 array("DELIVERY_ID", "PAYSYSTEM_ID")
639 );
640 }
641
650 public static function UpdateDeliveryPay($ID, $arFields)
651 {
652 $ID = trim($ID);
653
654 if ($ID == '' || !is_array($arFields) || empty($arFields))
655 return false;
656
657 if ($arFields[0] == "")
658 unset($arFields[0]);
659
661 }
662
668 protected static function getFilterValue($fieldName, $filter)
669 {
670 $result = false;
671
672 foreach($filter as $fName => $fValue)
673 if(preg_replace('/[^A-Z_]/', '', $fName) == $fieldName)
674 return $fValue;
675
676 return $result;
677 }
678
684 protected static function isFieldInFilter($fieldName, $filter)
685 {
686 $res = array_key_exists(preg_replace('/[^A-Z_]/', '', $fieldName), $filter);
687 return $res;
688 }
689
695 protected static function isFieldInFilter2($fieldName, $filter)
696 {
697 $result = false;
698
699 foreach($filter as $key => $value)
700 if(preg_replace('/[^A-Z_]/', '', $key) == $fieldName)
701 return true;
702
703 return $result;
704 }
705
710 protected static function hasNewServiceField($name)
711 {
713 return self::isFieldInFilter($name, $serviceFields);
714 }
715
720 protected static function convertFilterOldToNew(array $filter = array())
721 {
722 if(empty($filter))
723 return array();
724
725 $result = array();
726
727 if(isset($filter["ID"]))
728 {
729 $filter["CODE"] = $filter["ID"];
730 unset($filter["ID"]);
731 }
732
733 foreach($filter as $fieldName => $fieldValue)
734 if(self::hasNewServiceField($fieldName))
735 $result[$fieldName] = $fieldValue;
736
737 return $result;
738 }
739
744 protected static function convertGroupOldToNew($groupBy)
745 {
746 if(!is_array($groupBy) || empty($groupBy))
747 return array();
748
749 $result = array();
751
752 foreach($groupBy as $group)
753 if(array_key_exists($group, $serviceFields))
754 $result[] = $group;
755
756 return $result;
757 }
758
763 protected static function convertSelectOldToNew(array $selectFields = array())
764 {
765 if(empty($selectFields))
766 return array();
767
768 if(in_array('*', $selectFields))
769 return array('*');
770
771 $result = array();
773
774 foreach($selectFields as $select)
775 if(array_key_exists($select, $serviceFields))
776 $result[] = $select;
777
778 if(in_array('ID', $selectFields))
779 $result[] = "CODE";
780
781 return $result;
782 }
783
789 protected static function isFieldSelected($fieldName , array $select)
790 {
791 $result = empty($select) || in_array($fieldName, $select) || in_array("*", $select);
792 return $result;
793 }
794
801 protected static function checkRestrictionFilter(array $restriction, array $filter)
802 {
803 $result = true;
804
805 switch($restriction["CLASS_NAME"])
806 {
807 case '\Bitrix\Sale\Delivery\Restrictions\BySite':
808
809 $fieldInFilter = self::isFieldInFilter2("LID", $filter);
810 $value = self::getFilterValue("LID", $filter);
811
812 if(!$fieldInFilter)
813 break;
814
815 if(is_array($restriction["PARAMS"]["SITE_ID"]))
816 $result = in_array($value, $restriction["PARAMS"]["SITE_ID"]);
817 else
818 $result = ($value == $restriction["PARAMS"]["SITE_ID"]);
819
820 break;
821
822 case '\Bitrix\Sale\Delivery\Restrictions\ByWeight':
823 $result = !(self::isFieldInFilter2("WEIGHT_FROM", $filter) && floatval(self::getFilterValue("WEIGHT_FROM", $filter)) < floatval($restriction["PARAMS"]["MIN_WEIGHT"]));
824 $result = $result && !(self::isFieldInFilter2("WEIGHT_TO", $filter) && floatval(self::getFilterValue("WEIGHT_TO", $filter)) > floatval($restriction["PARAMS"]["MAX_WEIGHT"]));
825 break;
826
827 case '\Bitrix\Sale\Delivery\Restrictions\ByPrice':
828
829 $fieldInFilter = self::isFieldInFilter2("ORDER_PRICE_FROM", $filter);
830 $value = self::getFilterValue("ORDER_PRICE_FROM", $filter);
831 $value = floatval($value);
832
833 if($fieldInFilter && $value > 0 && floatval($restriction["PARAMS"]["MIN_PRICE"]) > 0)
834 {
835 $result = floatval($value) > floatval($restriction["PARAMS"]["MIN_PRICE"]);
836
837 if(!$result)
838 break;
839 }
840
841 $fieldInFilter = self::isFieldInFilter2("ORDER_PRICE_TO", $filter);
842 $value = self::getFilterValue("ORDER_PRICE_TO", $filter);
843 $value = floatval($value);
844
845 if($fieldInFilter && $value > 0 && floatval($restriction["PARAMS"]["MAX_PRICE"]) > 0)
846 {
847 $result = floatval($value) < floatval($restriction["PARAMS"]["MAX_PRICE"]);
848
849 if(!$result)
850 break;
851 }
852
853 $fieldInFilter = self::isFieldInFilter2("ORDER_CURRENCY", $filter);
854 $value = self::getFilterValue("ORDER_CURRENCY", $filter);
855
856 if($fieldInFilter && $value <> '' && $restriction["PARAMS"]["CURRENCY"] <> '')
857 {
858 $result = ($value == $restriction["PARAMS"]["CURRENCY"]);
859
860 if(!$result)
861 break;
862 }
863
864 break;
865
866 case '\Bitrix\Sale\Delivery\Restrictions\ByLocation':
867 $fieldInFilter = self::isFieldInFilter2("LOCATION", $filter);
868 $value = self::getFilterValue("LOCATION", $filter);
869
870 if($fieldInFilter && $value <> '' && $restriction['SERVICE_ID'] > 0)
871 {
872 try
873 {
875 intval($restriction['SERVICE_ID']),
876 $value,
877 array(
878 'LOCATION_LINK_TYPE' => 'CODE'
879 )
880 );
881 }
882 catch(\Bitrix\Sale\Location\Tree\NodeNotFoundException $e)
883 {
884 $result = false;
885 }
886
887 if($result)
888 return true;
889
890 try
891 {
892 return \Bitrix\Sale\Delivery\DeliveryLocationTable::checkConnectionExists(
893 intval($restriction['SERVICE_ID']),
894 $value,
895 array(
896 'LOCATION_LINK_TYPE' => 'ID'
897 )
898 );
899 }
900 catch(\Bitrix\Sale\Location\Tree\NodeNotFoundException $e)
901 {
902 $result = false;
903 }
904 }
905
906 break;
907
908 default:
909 break;
910 }
911
912 return $result;
913 }
914
921 protected static function getSelectedRestrictionField(array $service, array $restriction, array $selectedFields)
922 {
923 $fields = array();
924
925 switch($restriction["CLASS_NAME"])
926 {
927 case '\Bitrix\Sale\Delivery\Restrictions\BySite':
928
929 if(self::isFieldSelected("LID", $selectedFields))
930 {
931 $lids = $restriction["PARAMS"]["SITE_ID"];
932
933 if(is_array($lids))
934 {
935 reset($lids);
936 $fields["LID"] = current($lids);
937 }
938 else
939 {
940 $fields["LID"] = $lids;
941 }
942 }
943
944 break;
945
946 case '\Bitrix\Sale\Delivery\Restrictions\ByWeight':
947
948 if(self::isFieldSelected("WEIGHT_FROM", $selectedFields))
949 $fields["WEIGHT_FROM"] = $restriction["PARAMS"]["MIN_WEIGHT"];
950
951 if(self::isFieldSelected("WEIGHT_TO", $selectedFields))
952 $fields["WEIGHT_TO"] = $restriction["PARAMS"]["MAX_WEIGHT"];
953
954 break;
955
956 case '\Bitrix\Sale\Delivery\Restrictions\ByPrice':
957
958 if(self::isFieldSelected("ORDER_PRICE_FROM", $selectedFields))
959 $fields["ORDER_PRICE_FROM"] = $restriction["PARAMS"]["MIN_PRICE"];
960
961 if(self::isFieldSelected("ORDER_PRICE_TO", $selectedFields))
962 $fields["ORDER_PRICE_TO"] = $restriction["PARAMS"]["MAX_PRICE"];
963
964 if(self::isFieldSelected("ORDER_CURRENCY", $selectedFields))
965 $fields["ORDER_CURRENCY"] = $restriction["PARAMS"]["CURRENCY"];
966
967 break;
968
969 default:
970 break;
971 }
972
973 if(!empty($fields))
974 $service = array_merge($service, $fields);
975
976 return $service;
977 }
978
989 public static function GetList($arOrder = array("SORT" => "ASC", "NAME" => "ASC"), $arFilter = array(), $arGroupBy = false, $arNavStartParams = false, $arSelectFields = array('*'))
990 {
991 if(empty($arSelectFields))
992 $arSelectFields = array('*');
993
994 $params = array(
995 'order' => self::convertFilterOldToNew($arOrder),
996 'filter' => self::convertFilterOldToNew($arFilter),
997 'group' => self::convertGroupOldToNew($arGroupBy),
998 'select' => self::convertSelectOldToNew($arSelectFields)
999 );
1000
1001 $services = array();
1002 $params['filter']['=CLASS_NAME'] = '\Bitrix\Sale\Delivery\Services\Configurable';
1003 $dbRes = \Bitrix\Sale\Delivery\Services\Table::getList($params);
1004
1005 if (isset($arFilter["WEIGHT"]) && DoubleVal($arFilter["WEIGHT"]) > 0)
1006 {
1007 if (!isset($arFilter["WEIGHT_FROM"]) || floatval($arFilter["WEIGHT"]) > floatval($arFilter["WEIGHT_FROM"]))
1008 $arFilter["+<=WEIGHT_FROM"] = $arFilter["WEIGHT"];
1009 if (!isset($arFilter["WEIGHT_TO"]) || floatval($arFilter["WEIGHT"]) < floatval($arFilter["WEIGHT_TO"]))
1010 $arFilter["+>=WEIGHT_TO"] = $arFilter["WEIGHT"];
1011 }
1012
1013 if (isset($arFilter["ORDER_PRICE"]) && intval($arFilter["ORDER_PRICE"]) > 0)
1014 {
1015 if (!isset($arFilter["ORDER_PRICE_FROM"]) || floatval($arFilter["ORDER_PRICE"]) > floatval($arFilter["ORDER_PRICE_FROM"]))
1016 $arFilter["+<=ORDER_PRICE_FROM"] = $arFilter["ORDER_PRICE"];
1017 if (!isset($arFilter["ORDER_PRICE_TO"]) || floatval($arFilter["ORDER_PRICE"]) < floatval($arFilter["ORDER_PRICE_TO"]))
1018 $arFilter["+>=ORDER_PRICE_TO"] = $arFilter["ORDER_PRICE"];
1019 }
1020
1021 while($service = $dbRes->fetch())
1022 {
1023 $dbRstrRes = \Bitrix\Sale\Internals\ServiceRestrictionTable::getList(array(
1024 'filter' => array(
1025 "=SERVICE_ID" => $service["ID"],
1026 "=SERVICE_TYPE" => \Bitrix\Sale\Services\Base\RestrictionManager::SERVICE_TYPE_SHIPMENT
1027 )
1028 ));
1029
1030 while($restr = $dbRstrRes->fetch())
1031 {
1032 if(!self::checkRestrictionFilter($restr, $arFilter))
1033 continue(2);
1034
1035 $service = self::getSelectedRestrictionField($service, $restr, $arSelectFields);
1036 }
1037
1038 $selectAsterisk = in_array('*', $arSelectFields);
1039 $mofifiedFields = array("LID", "WEIGHT_FROM", "WEIGHT_TO","ORDER_PRICE_FROM", "ORDER_PRICE_TO", "ORDER_CURRENCY");
1040
1041 foreach($mofifiedFields as $field)
1042 if(($selectAsterisk || in_array($field, $arSelectFields)) && !array_key_exists($field, $service))
1043 $service[$field] = "";
1044
1045 if($selectAsterisk || in_array("PERIOD_FROM", $arSelectFields))
1046 $service["PERIOD_FROM"] = $service["CONFIG"]["MAIN"]["PERIOD"]["FROM"];
1047
1048 if($selectAsterisk || in_array("PERIOD_TO", $arSelectFields))
1049 $service["PERIOD_TO"] = $service["CONFIG"]["MAIN"]["PERIOD"]["TO"];
1050
1051 if($selectAsterisk || in_array("PERIOD_TYPE", $arSelectFields))
1052 $service["PERIOD_TYPE"] = $service["CONFIG"]["MAIN"]["PERIOD"]["TYPE"];
1053
1054 if($selectAsterisk || in_array("PRICE", $arSelectFields))
1055 {
1056 $service["CLASS_NAME"] = '\Bitrix\Sale\Delivery\Services\Configurable';
1058
1059 if($tmpSrv)
1060 {
1061 $res = $tmpSrv->calculate();
1062 $service["PRICE"] = $res->getPrice();
1063 }
1064 else
1065 {
1066 $service["PRICE"] = 0;
1067 }
1068 }
1069
1070 if($selectAsterisk || in_array("STORE", $arSelectFields))
1071 {
1073 $service["STORE"] = count($stores) > 0 ? serialize($stores) : "";
1074 }
1075
1076 if(intval($service["CODE"]) > 0)
1077 $service["ID"] = $service["CODE"];
1078
1079 unset($service["CODE"], $service["CLASS_NAME"], $service["CONFIG"], $service["PARENT_ID"]);
1080 $services[] = $service;
1081 }
1082
1083 if(!empty($arOrder))
1084 {
1085 foreach($arOrder as $k => $v)
1086 {
1087 if($v == 'ASC')
1088 $arOrder[$k] = SORT_ASC;
1089 elseif($v == 'DESC')
1090 $arOrder[$k] = SORT_DESC;
1091 }
1092
1093 sortByColumn($services, $arOrder);
1094 }
1095
1096 $result = new \CDBResult;
1097 $result->InitFromArray($services);
1098
1099 return $result;
1100 }
1101
1109 public static function Add($arFields, $arOptions = array())
1110 {
1111 $fields = array_intersect_key($arFields, Bitrix\Sale\Delivery\Services\Table::getMap());
1112
1113 if (array_key_exists("LOGOTIP", $arFields) && is_array($arFields["LOGOTIP"]))
1114 {
1115 $arFields["LOGOTIP"]["MODULE_ID"] = "sale";
1116 CFile::SaveForDB($arFields, "LOGOTIP", "sale/delivery/logotip");
1117 $fields["LOGOTIP"] = $arFields["LOGOTIP"];
1118 }
1119
1120 $fields["PARENT_ID"] = 0;
1121 $fields["CLASS_NAME"] = '\Bitrix\Sale\Delivery\Services\Configurable';
1122 $fields["CONFIG"] = array(
1123 "MAIN" => array(
1124 "PRICE" => $arFields["PRICE"],
1125 "PERIOD" => array(
1126 "FROM" => $arFields["PERIOD_FROM"],
1127 "TO" => $arFields["PERIOD_TO"],
1128 "TYPE" => $arFields["PERIOD_TYPE"],
1129 )
1130 )
1131 );
1132
1133 $res = \Bitrix\Sale\Delivery\Services\Manager::add($fields);
1134
1135 if(!$res->isSuccess())
1136 return false;
1137
1138 $newId = $res->getId();
1139
1140 if(empty($arFields["CODE"]))
1141 {
1142 \Bitrix\Sale\Delivery\Services\Manager::update($newId, array('CODE' => $newId));
1143 }
1144
1145 $res = \Bitrix\Sale\Internals\ServiceRestrictionTable::add(array(
1146 "SERVICE_ID" => $newId,
1147 "SERVICE_TYPE" => \Bitrix\Sale\Services\Base\RestrictionManager::SERVICE_TYPE_SHIPMENT,
1148 "CLASS_NAME" => '\Bitrix\Sale\Delivery\Restrictions\BySite',
1149 "PARAMS" => array(
1150 "SITE_ID" => array($arFields["LID"]),
1151 )
1152 ));
1153
1154 if(intval($arFields["WEIGHT_FROM"]) > 0 || intval($arFields["WEIGHT_TO"]) > 0)
1155 {
1156 $res = \Bitrix\Sale\Internals\ServiceRestrictionTable::add(array(
1157 "SERVICE_ID" => $newId,
1158 "SERVICE_TYPE" => \Bitrix\Sale\Services\Base\RestrictionManager::SERVICE_TYPE_SHIPMENT,
1159 "CLASS_NAME" => '\Bitrix\Sale\Delivery\Restrictions\ByWeight',
1160 "PARAMS" => array(
1161 "MIN_WEIGHT" => $arFields["WEIGHT_FROM"],
1162 "MAX_WEIGHT" => $arFields["WEIGHT_TO"]
1163 )
1164 ));
1165 }
1166
1167 if(intval($arFields["ORDER_PRICE_FROM"]) > 0 || intval($arFields["ORDER_PRICE_TO"]) > 0)
1168 {
1169 $res = \Bitrix\Sale\Internals\ServiceRestrictionTable::add(array(
1170 "SERVICE_ID" => $newId,
1171 "SERVICE_TYPE" => \Bitrix\Sale\Services\Base\RestrictionManager::SERVICE_TYPE_SHIPMENT,
1172 "CLASS_NAME" => '\Bitrix\Sale\Delivery\Restrictions\ByPrice',
1173 "PARAMS" => array(
1174 "MIN_PRICE" => $arFields["ORDER_PRICE_FROM"],
1175 "MAX_PRICE" => $arFields["ORDER_PRICE_TO"],
1176 "CURRENCY" => $arFields["ORDER_CURRENCY"]
1177 )
1178 ));
1179 }
1180
1181 if(isset($arFields["LOCATIONS"]) && is_array($arFields["LOCATIONS"]))
1182 {
1183 Helper::resetLocationsForEntity($newId, $arFields['LOCATIONS'], self::CONN_ENTITY_NAME, !!$arOptions['EXPECT_LOCATION_CODES']);
1184
1185 \Bitrix\Sale\Internals\ServiceRestrictionTable::add(array(
1186 "SERVICE_ID" => $newId,
1187 "SERVICE_TYPE" => \Bitrix\Sale\Services\Base\RestrictionManager::SERVICE_TYPE_SHIPMENT,
1188 "CLASS_NAME" => '\Bitrix\Sale\Delivery\Restrictions\ByLocation',
1189 "SORT" => 100
1190 ));
1191 }
1192
1193 if (isset($arFields["PAY_SYSTEM"]))
1194 CSaleDelivery::UpdateDeliveryPay($newId, $arFields["PAY_SYSTEM"]);
1195
1196 if(isset($arFields["STORE"]))
1197 {
1198 $stores = unserialize($arFields["STORE"], ['allowed_classes' => false]);
1199
1200 if($stores)
1202 }
1203
1204 return $newId;
1205 }
1206
1207 protected static function createD2LTable()
1208 {
1210 $result = new \Bitrix\Sale\Result();
1211 $type = $con->getType();
1212 $query = array();
1213
1214 if(!in_array($type, array('mssql', 'mysql', 'oracle')))
1215 {
1216 $result->addError(new \Bitrix\Main\Error('Wrong connection type!'));
1217 return $result;
1218 }
1219
1220 switch($type)
1221 {
1222 case 'mssql':
1223 $query = array(
1224 "CREATE TABLE B_SALE_DELIVERY2LOCATION_TMP
1225 (
1226 DELIVERY_ID int NOT NULL,
1227 LOCATION_CODE varchar(100) NOT NULL,
1228 LOCATION_TYPE char(1) NOT NULL
1229 )",
1230 "ALTER TABLE B_SALE_DELIVERY2LOCATION_TMP ADD CONSTRAINT PK_B_SALE_DELIVERY2LOCATION_TMP PRIMARY KEY (DELIVERY_ID, LOCATION_CODE, LOCATION_TYPE)",
1231 "ALTER TABLE B_SALE_DELIVERY2LOCATION_TMP ADD CONSTRAINT DF_B_SALE_DELIVERY2LOCATION_TMP_LOCATION_TYPE DEFAULT 'L' FOR LOCATION_TYPE"
1232 );
1233
1234 break;
1235
1236 case 'mysql':
1237 $query = array(
1238 "create table if not exists b_sale_delivery2location_tmp
1239 (
1240 DELIVERY_ID int not null,
1241 LOCATION_CODE varchar(100) not null,
1242 LOCATION_TYPE char(1) not null default 'L',
1243 primary key (DELIVERY_ID, LOCATION_CODE, LOCATION_TYPE)
1244 )");
1245
1246 break;
1247
1248 case 'oracle':
1249 $query = array(
1250 "CREATE TABLE B_SALE_DELIVERY2LOCATION_TMP
1251 (
1252 DELIVERY_ID NUMBER(18) NOT NULL,
1253 LOCATION_CODE VARCHAR2(100 CHAR) NOT NULL,
1254 LOCATION_TYPE CHAR(1 CHAR) DEFAULT 'L' NOT NULL,
1255 PRIMARY KEY (DELIVERY_ID, LOCATION_CODE, LOCATION_TYPE)
1256 )");
1257
1258 break;
1259 }
1260
1261 foreach($query as $q)
1262 $con->queryExecute($q);
1263
1264 return $result;
1265 }
1266
1274 public static function convertToNew($renameTable = false)
1275 {
1276 $result = new \Bitrix\Sale\Result();
1278
1279 if(!$con->isTableExists("b_sale_delivery"))
1280 return $result;
1281
1282 if(!$con->isTableExists("b_sale_delivery2location_tmp"))
1283 {
1285
1286 if(!$res->isSuccess())
1287 {
1288 $result->addErrors($res->getErrors());
1289 return $result;
1290 }
1291
1292 $con->queryExecute('
1293 INSERT INTO
1294 b_sale_delivery2location_tmp(DELIVERY_ID, LOCATION_CODE, LOCATION_TYPE)
1295 SELECT
1296 DELIVERY_ID, LOCATION_CODE, LOCATION_TYPE FROM b_sale_delivery2location
1297 ');
1298
1299 $con->queryExecute('DELETE FROM b_sale_delivery2location');
1300 }
1301
1302 $sqlHelper = $con->getSqlHelper();
1303 $deliveryRes = $con->query('SELECT * FROM b_sale_delivery WHERE CONVERTED != \'Y\'');
1304
1305 while($delivery = $deliveryRes->fetch())
1306 {
1307 $delivery["CODE"] = $delivery["ID"];
1308 unset($delivery["ID"]);
1309
1310 $newId = \CSaleDelivery::Add($delivery);
1311
1312 if(intval($newId) <= 0)
1313 {
1314 $result->addError( new \Bitrix\Main\Entity\EntityError("Can't convert old delivery id: ".$delivery["CODE"]));
1315 continue;
1316 }
1317
1318 if(!$res->isSuccess())
1319 $result->addErrors($res->getErrors());
1320
1321 $con->queryExecute('UPDATE b_sale_delivery SET CONVERTED=\'Y\' WHERE ID='.$sqlHelper->forSql($delivery["CODE"]));
1322 $con->queryExecute("UPDATE b_sale_order SET DELIVERY_ID='".$sqlHelper->forSql($newId)."' WHERE DELIVERY_ID = '".$sqlHelper->forSql($delivery["CODE"])."'");
1323 $con->queryExecute("UPDATE b_sale_order_history SET DELIVERY_ID='".$sqlHelper->forSql($newId)."' WHERE DELIVERY_ID = '".$sqlHelper->forSql($delivery["CODE"])."'");
1324 $con->queryExecute("UPDATE b_sale_delivery2paysystem SET DELIVERY_ID='".$sqlHelper->forSql($newId)."', DELIVERY_PROFILE_ID='##CONVERTED##' WHERE DELIVERY_ID = '".$sqlHelper->forSql($delivery["CODE"])."'");
1325
1326 $con->queryExecute('
1327 INSERT INTO
1328 b_sale_delivery2location(DELIVERY_ID, LOCATION_CODE, LOCATION_TYPE)
1329 SELECT
1330 '.$sqlHelper->forSql($newId).', LOCATION_CODE, LOCATION_TYPE FROM b_sale_delivery2location_tmp
1331 WHERE
1332 DELIVERY_ID = '.$sqlHelper->forSql($delivery["CODE"]).'
1333 ');
1334
1335 $con->queryExecute('DELETE FROM b_sale_delivery2location_tmp WHERE DELIVERY_ID = '.$sqlHelper->forSql($delivery["CODE"]));
1336
1337 $d2pRes = \Bitrix\Sale\Internals\DeliveryPaySystemTable::getList(array(
1338 'filter' => array(
1339 'DELIVERY_ID' => $newId
1340 ),
1341 'select' => array("DELIVERY_ID"),
1342 'group' => array("DELIVERY_ID")
1343 ));
1344
1345 if($d2p = $d2pRes->fetch())
1346 {
1347 $res = \Bitrix\Sale\Internals\ServiceRestrictionTable::add(array(
1348 "SERVICE_ID" => $d2p["DELIVERY_ID"],
1349 "SERVICE_TYPE" => \Bitrix\Sale\Services\Base\RestrictionManager::SERVICE_TYPE_SHIPMENT,
1350 "CLASS_NAME" => '\Bitrix\Sale\Delivery\Restrictions\ByPaySystem',
1351 "SORT" => 100
1352 ));
1353
1354 if(!$res->isSuccess())
1355 $result->addErrors($res->getErrors());
1356 }
1357 }
1358
1359 if($result->isSuccess())
1360 {
1361 $con->dropTable('b_sale_delivery2location_tmp');
1362
1363 if($renameTable)
1364 $con->renameTable("b_sale_delivery", "b_sale_delivery_old");
1365 }
1366
1367 return $result;
1368 }
1369
1375 public static function convertToNewAgent($renameTable = false)
1376 {
1377 self::convertToNew($renameTable);
1378 return "";
1379 }
1380
1385 public static function convertPSRelationsAgent()
1386 {
1388 return "";
1389 }
1390
1397 public static function convertPSRelations()
1398 {
1399 $result = new \Bitrix\Sale\Result();
1401
1402 if(!$con->isTableExists("b_sale_delivery2paysystem"))
1403 return $result;
1404
1405 $query = new \Bitrix\Main\Entity\Query(DeliveryPaySystemTable::getEntity());
1406 $query->setSelect(array('DELIVERY_ID'));
1407 $query->addFilter('LINK_DIRECTION', NULL);
1408 $query->setLimit(1);
1409 $res = $query->exec();
1410
1411 if (!$res->fetch())
1412 return $result;
1413
1414 $con->queryExecute('UPDATE b_sale_delivery2paysystem SET LINK_DIRECTION=\''.DeliveryPaySystemTable::LINK_DIRECTION_DELIVERY_PAYSYSTEM.'\'');
1415 $res = DeliveryPaySystemTable::getList(array());
1416
1417 while($rec = $res->fetch())
1418 {
1419 unset($rec["ID"]);
1420 $rec["LINK_DIRECTION"] = DeliveryPaySystemTable::LINK_DIRECTION_PAYSYSTEM_DELIVERY;
1421 DeliveryPaySystemTable::Add($rec);
1422 }
1423
1424 return $result;
1425 }
1426
1432 public static function convertOrderNewToOld(\Bitrix\Sale\Shipment $shipment)
1433 {
1435 $shipmentCollection = $shipment->getCollection();
1437 $newOrder = $shipmentCollection->getOrder();
1438 $props = $newOrder->getPropertyCollection();
1439 $oldOrder = array();
1440
1441 if(intval($newOrder->getId()) > 0)
1442 $oldOrder["ID"] = $newOrder->getId();
1443
1445 if($collection = $shipment->getShipmentItemCollection())
1446 $oldOrder["PRICE"] = $collection->getPrice();
1447
1448 $oldOrder["LOCATION_FROM"] = \Bitrix\Main\Config\Option::get(
1449 'sale',
1450 'location',
1451 "",
1452 $newOrder->getSiteId());
1453 $oldOrder["SITE_ID"] = $newOrder->getSiteId();
1454 $oldOrder["PERSON_TYPE_ID"] = $newOrder->getPersonTypeId();
1455 $oldOrder["CURRENCY"] = $newOrder->getCurrency();
1456
1457 $loc = $props->getDeliveryLocation();
1458 $oldOrder["LOCATION_TO"] = !!$loc ? $loc->getValue() : "";
1459
1460 $loc = $props->getDeliveryLocationZip();
1461 $oldOrder["LOCATION_ZIP"] = !!$loc ? $loc->getValue() : "";
1462
1463 $oldOrder["ITEMS"] = array();
1464
1466 foreach($shipment->getShipmentItemCollection() as $shipmentItem)
1467 {
1468 $basketItem = $shipmentItem->getBasketItem();
1469
1470 if(!$basketItem)
1471 continue;
1472
1473 if($basketItem->isBundleChild())
1474 continue;
1475
1476 $itemFieldValues = $basketItem->getFieldValues();
1477 $itemFieldValues["QUANTITY"] = $shipmentItem->getField("QUANTITY");
1478
1479 if(!empty($itemFieldValues["DIMENSIONS"]) && is_string($itemFieldValues["DIMENSIONS"]))
1480 $itemFieldValues["DIMENSIONS"] = unserialize($itemFieldValues["DIMENSIONS"], ['allowed_classes' => false]);
1481
1482 unset($itemFieldValues['DATE_INSERT'], $itemFieldValues['DATE_UPDATE']);
1483 $oldOrder["ITEMS"][] = $itemFieldValues;
1484 $oldOrder["WEIGHT"] = $shipment->getWeight();
1485 }
1486
1487 return $oldOrder;
1488 }
1489
1495 public static function convertOrderOldToNew(array $oldOrder)
1496 {
1497 $siteId = isset($oldOrder["SITE_ID"]) ? $oldOrder["SITE_ID"] : SITE_ID;
1498
1499 $registry = \Bitrix\Sale\Registry::getInstance(\Bitrix\Sale\Registry::REGISTRY_TYPE_ORDER);
1500
1502 $orderClass = $registry->getOrderClassName();
1503
1504 $newOrder = $orderClass::create($siteId, null, $oldOrder["CURRENCY"]);
1505 $isStartField = $newOrder->isStartField();
1506
1507 if(!empty($oldOrder["PERSON_TYPE_ID"]) && intval($oldOrder["PERSON_TYPE_ID"]) > 0)
1508 {
1509 $personTypeId = $oldOrder["PERSON_TYPE_ID"];
1510 }
1511 else
1512 {
1513 $dbPersonType = \CSalePersonType::GetList(array("SORT" => "ASC", "NAME" => "ASC"), array("ACTIVE" => "Y", "LID"=> $siteId));
1514
1515 if($arPersonType = $dbPersonType->GetNext())
1516 $personTypeId = $arPersonType["ID"];
1517 else
1518 $personTypeId = 1;
1519 }
1520
1521 $newOrder->setPersonTypeId($personTypeId);
1522 $newOrder->setFieldNoDemand("PRICE", $oldOrder["PRICE"]);
1523
1525 $basketClass = $registry->getBasketClassName();
1526
1527 $basket = $basketClass::create($siteId);
1528 $settableFields = array_flip(\Bitrix\Sale\BasketItemBase::getSettableFields());
1529
1530 if (!empty($oldOrder["ITEMS"]) && is_array($oldOrder["ITEMS"]))
1531 {
1532 foreach($oldOrder["ITEMS"] as $oldBasketItem)
1533 {
1534 $basketId = null;
1535 if (!empty($oldBasketItem['ID']) && intval($oldBasketItem['ID']) > 0)
1536 $basketId = $oldBasketItem['ID'];
1537
1538 $newBasketItem = \Bitrix\Sale\BasketItem::create($basket, $oldBasketItem['MODULE'], $oldBasketItem['PRODUCT_ID']);
1539 $oldBasketItem = array_intersect_key($oldBasketItem, $settableFields);
1540
1541 $newBasketItem->setFieldsNoDemand($oldBasketItem);
1542
1543 if ($basketId > 0)
1544 $newBasketItem->setFieldNoDemand('ID', $basketId);
1545
1546 if ($newBasketItem->isBundleChild())
1547 continue;
1548 $basket->addItem($newBasketItem);
1549 }
1550 }
1551
1552 $props = $newOrder->getPropertyCollection();
1553
1554 if (!empty($oldOrder['PROPERTIES']) && is_array($oldOrder['PROPERTIES']))
1555 {
1556 $r = $props->setValuesFromPost($oldOrder, $_FILES);
1557 }
1558
1559 $newOrder->setBasket($basket);
1560
1561
1562 if($loc = $props->getDeliveryLocation())
1563 $loc->setValue($oldOrder["LOCATION_TO"]);
1564
1565 if($loc = $props->getDeliveryLocationZip())
1566 $loc->setValue($oldOrder["LOCATION_ZIP"]);
1567
1569 $shipmentCollection = $newOrder->getShipmentCollection();
1570 $shipment = $shipmentCollection->createItem();
1571 $shipment->setField("CURRENCY", $oldOrder["CURRENCY"]);
1572 $shipmentItemCollection = $shipment->getShipmentItemCollection();
1573
1574 foreach($newOrder->getBasket() as $item)
1575 {
1576 $shipmentItem = $shipmentItemCollection->createItem($item);
1577 $shipmentItem->setQuantity($item->getQuantity());
1578
1579 if($shipmentItem->getField("DIMENSIONS") <> '')
1580 {
1581 $shipmentItem->setField("DIMENSIONS", unserialize($shipmentItem->getField("DIMENSIONS"), ['allowed_classes' => false]));
1582 }
1583 }
1584
1585 if (isset($arOrder["DELIVERY_EXTRA_SERVICES"]))
1586 $shipment->setExtraServices($arOrder["DELIVERY_EXTRA_SERVICES"]);
1587
1588 return $shipment;
1589 }
1590
1596 public static function createNoDeliveryServiceAgent()
1597 {
1599
1600 if ($id <= 0)
1601 {
1602 Bitrix\Main\Localization\Loc::loadLanguageFile($_SERVER['DOCUMENT_ROOT'].'/bitrix/modules/sale/lib/delivery/helper.php', 'ru');
1603
1604 $fields = array();
1605 $fields["NAME"] = \Bitrix\Main\Localization\Loc::getMessage('SALE_DELIVERY_HELPER_NO_DELIVERY_SERVICE');
1606 $fields["CLASS_NAME"] = '\Bitrix\Sale\Delivery\Services\EmptyDeliveryService';
1607 $fields["CURRENCY"] = 'RUB';
1608 $fields["ACTIVE"] = "Y";
1609 $fields["CONFIG"] = array(
1610 'MAIN' => array(
1611 'CURRENCY' => 'RUB',
1612 'PRICE' => 0,
1613 'PERIOD' => array(
1614 'FROM' => 0,
1615 'TO' => 0,
1616 'TYPE' => 'D'
1617 )
1618 )
1619 );
1620 $res = \Bitrix\Sale\Delivery\Services\Manager::add($fields);
1621 $id = $res->getId();
1622 $fields = array(
1623 'SORT' => 100,
1624 'SERVICE_ID' => $id,
1625 'SERVICE_TYPE' => \Bitrix\Sale\Delivery\Restrictions\Manager::SERVICE_TYPE_SHIPMENT,
1626 'PARAMS' => array(
1627 'PUBLIC_SHOW' => 'N'
1628 )
1629 );
1630 $rstrPM = new \Bitrix\Sale\Delivery\Restrictions\ByPublicMode();
1631 $rstrPM->save($fields);
1632 }
1633
1634 return "";
1635 }
1636
1641 public static function getIdByCode($code)
1642 {
1645 else
1647
1648 return (int)$id;
1649 }
1650
1655 public static function getCodeById($id)
1656 {
1657 if(intval($id) <= 0)
1658 return "";
1659
1661
1662 if($code == '')
1663 $code = 'new'.strval($id).':profile';
1664
1665 return $code;
1666 }
1667}
$con
Определения admin_tab.php:7
$type
Определения options.php:106
$arResult
Определения generate_coupon.php:16
static getConnection($name="")
Определения application.php:638
static get($moduleId, $name, $default="", $siteId=false)
Определения option.php:30
static loadLanguageFile($file, $language=null, $normalize=true)
Определения loc.php:225
static getMessage($code, $replace=null, $language=null)
Определения loc.php:30
static getStoresList($deliveryId)
Определения manager.php:553
static saveStores($deliveryId, array $storesList)
Определения manager.php:613
static getObjectById($deliveryId)
Определения manager.php:438
static delete($id, bool $checkServiceUsage=true)
Определения manager.php:868
static getCodeById($id)
Определения manager.php:1058
static getIdByCode($code)
Определения manager.php:1018
static getObjectByCode($serviceCode)
Определения manager.php:458
static update($id, array $fields)
Определения manager.php:817
static getPooledObject(array $fields)
Определения manager.php:424
static getMap()
Определения table.php:60
static checkConnectionExists($entityPrimary, $locationPrimary, array $behaviour=array('LOCATION_LINK_TYPE'=> 'ID'))
Определения connector.php:1035
static GetByID($currency)
Определения currency.php:453
static getIdFromNewSid($sid)
Определения delivery_handler.php:68
static CalculateFull($SID, $profile, $arOrder, $currency, $SITE_ID=false)
Определения delivery_handler.php:1237
static isSidNew($sid)
Определения delivery_handler.php:63
static GetList($arSort=array("SORT"=> "ASC"), $arFilter=array())
Определения delivery_handler.php:208
Определения delivery.php:14
static isFieldSelected($fieldName, array $select)
Определения delivery.php:789
static GetDelivery2PaySystem($arFilter=array())
Определения delivery.php:630
static isFieldInFilter2($fieldName, $filter)
Определения delivery.php:695
static createD2LTable()
Определения delivery.php:1207
static isFieldInFilter($fieldName, $filter)
Определения delivery.php:684
static convertPSRelationsAgent()
Определения delivery.php:1385
static GetList($arOrder=array("SORT"=> "ASC", "NAME"=> "ASC"), $arFilter=array(), $arGroupBy=false, $arNavStartParams=false, $arSelectFields=array(' *'))
Определения delivery.php:989
static Delete($ID)
Определения delivery.php:606
static createNoDeliveryServiceAgent()
Определения delivery.php:1596
static hasNewServiceField($name)
Определения delivery.php:710
static convertFilterOldToNew(array $filter=array())
Определения delivery.php:720
static GetByID($ID)
Определения delivery.php:249
static convertToNewAgent($renameTable=false)
Определения delivery.php:1375
static GetLocationList($arFilter=Array())
Определения delivery.php:260
static getCodeById($id)
Определения delivery.php:1655
const CONN_ENTITY_NAME
Определения delivery.php:15
static getIdByCode($code)
Определения delivery.php:1641
static Add($arFields, $arOptions=array())
Определения delivery.php:1109
static CheckFields($ACTION, &$arFields)
Определения delivery.php:295
static convertGroupOldToNew($groupBy)
Определения delivery.php:744
static SetDeliveryLocationPro($ID, $locations)
Определения delivery.php:386
static UpdateDeliveryPay($ID, $arFields)
Определения delivery.php:650
static convertPSRelations()
Определения delivery.php:1397
static getFilterValue($fieldName, $filter)
Определения delivery.php:668
static PrepareLocation24Where($val, $key, $operation, $negative, $field, &$arField, &$arFilter)
Определения delivery.php:29
static DoLoadDelivery($location, $locationZip, $weight, $price, $currency, $siteId=null, $arShoppingCart=array())
Определения delivery.php:112
static DoProcessOrder(&$arOrder, $deliveryCode, &$arErrors)
Определения delivery.php:52
static convertSelectOldToNew(array $selectFields=array())
Определения delivery.php:763
static checkRestrictionFilter(array $restriction, array $filter)
Определения delivery.php:801
static Update($oldId, $arFields, $arOptions=array())
Определения delivery.php:397
static getSelectedRestrictionField(array $service, array $restriction, array $selectedFields)
Определения delivery.php:921
static convertToNew($renameTable=false)
Определения delivery.php:1274
static getDenormalizedLocationList($entityName, $arFilter=array())
Определения location.php:745
Определения dbresult.php:88
static GetList($arFilter=array(), $arGroupBy=false, $arSelectFields=array())
Определения delivery_2_pay_system.php:68
static UpdateDelivery($ID, $arFields)
Определения delivery_2_pay_system.php:297
static getMaxDimensions($arDim1, $arDim2)
Определения delivery_helper.php:160
$arFields
Определения dblapprove.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
$query
Определения get_search.php:11
if($ajaxMode) $ID
Определения get_user.php:27
$select
Определения iblock_catalog_list.php:194
$filter
Определения iblock_catalog_list.php:54
$selectFields
Определения iblock_catalog_list.php:160
$_SERVER["DOCUMENT_ROOT"]
Определения cron_frame.php:9
global $DB
Определения cron_frame.php:29
$ACTION
Определения csv_new_setup.php:27
if(!is_null($config))($config as $configItem)(! $configItem->isVisible()) $code
Определения options.php:195
$arOptions
Определения structure.php:223
$siteId
Определения ajax.php:8
roundEx($value, $prec=0)
Определения tools.php:4635
IncludeModuleLangFile($filepath, $lang=false, $bReturnArray=false)
Определения tools.php:3778
is_set($a, $k=false)
Определения tools.php:2133
GetMessage($name, $aReplace=null)
Определения tools.php:3397
sortByColumn(array &$array, $columns, $callbacks='', $defaultValueIfNotSetValue=null, $preserveKeys=false)
Определения tools.php:5087
$name
Определения menu_edit.php:35
$service
Определения payment.php:18
if( $daysToExpire >=0 &&$daysToExpire< 60 elseif)( $daysToExpire< 0)
Определения prolog_main_admin.php:393
if(empty($signedUserToken)) $key
Определения quickway.php:257
$i
Определения factura.php:643
</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."%"
Определения waybill.php:936
$currency
Определения template.php:266
$props
Определения template.php:269
if($inWords) echo htmlspecialcharsbx(Number2Word_Rus(roundEx($totalVatSum $params['CURRENCY']
Определения template.php:799
const SALE_VALUE_PRECISION
Определения include.php:46
$val
Определения options.php:1793
$location
Определения options.php:2729
const SITE_ID
Определения sonet_set_content_view.php:12
$k
Определения template_pdf.php:567
$GLOBALS['_____370096793']
Определения update_client.php:1
$dbResult
Определения updtr957.php:3
$arFilter
Определения user_search.php:106
$dbRes
Определения yandex_detail.php:168
$fields
Определения yandex_run.php:501