1C-Bitrix 25.700.0
Загрузка...
Поиск...
Не найдено
delivery_handler.php
См. документацию.
1<?
3
5 "\\Bitrix\\Sale\\Delivery\\Services\\Automatic" => "lib/delivery/services/automatic.php",
6 "\\Bitrix\\Sale\\Delivery\\Services\\NewToAutomatic" => "lib/delivery/services/new_to_automatic.php",
7));
8
11{
12 public static $actions = array(
13 "REQUEST_SELF" => 0, // Request to delivery company to wait a cargo
14 "REQUEST_TAKE" => 1 // Request to delivery company to take a cargo
15 );
16
26
31 protected static function __getRegisteredHandlers()
32 {
33 return \Bitrix\Sale\Delivery\Services\Automatic::getRegisteredHandlers("SID");
34 }
35
40 public static function GetAdminList($arSort = array("SORT" => "ASC"))
41 {
42 return self::GetList($arSort, array("SITE_ID" => "ALL"));
43 }
44
45 protected static function isFieldInFilter($fieldName, $filter)
46 {
47 foreach($filter as $key => $value)
48 if(preg_replace('/[^A-Z_]/', '', $key) == $fieldName)
49 return true;
50
51 return false;
52 }
53
54 protected static function getFilterValue($fieldName, $filter)
55 {
56 foreach($filter as $fName => $fValue)
57 if(preg_replace('/[^A-Z_]/', '', $fName) == $fieldName)
58 return $fValue;
59
60 return false;
61 }
62
63 public static function isSidNew($sid)
64 {
65 return preg_match('/^new(\d+)(:profile)?/', $sid) == 1;
66 }
67
68 public static function getIdFromNewSid($sid)
69 {
70 if(!self::isSidNew($sid))
71 return $sid;
72
73 $matches = array();
74 preg_match('/^new(\d+)(:profile)?/', $sid, $matches);
75
76 return (int)$matches[1];
77 }
78
79 protected static function convertFilterOldToNew(array $oldFilter)
80 {
81 $result = array_intersect_key($oldFilter, Bitrix\Sale\Delivery\Services\Table::getMap());
82
83 $result[] = array(
84 'LOGIC' => 'OR',
85 '=CLASS_NAME' => array(
86 '\\Bitrix\\Sale\\Delivery\\Services\\Automatic',
87 '\\Bitrix\\Sale\\Delivery\\Services\\AutomaticProfile'
88 ),
89 array(
90 'LOGIC' => 'AND',
91 '=CODE' => false,
92 '!=CLASS_NAME' => array(
93 '\\Bitrix\\Sale\\Delivery\\Services\\Group',
94 '\\Bitrix\\Sale\\Delivery\\Services\\Configurable',
95 '\\Bitrix\\Sale\\Delivery\\Services\\EmptyDeliveryService'
96 )
97 ));
98
99 //$result['=PARENT_ID'] = '0';
100
101 if(empty($oldFilter))
102 return $result;
103
104 $sid = "";
105
106 if(self::isFieldInFilter("SID", $oldFilter))
107 {
108 $sid = self::getFilterValue("SID", $oldFilter);
109 }
110 elseif(self::isFieldInFilter("ID", $oldFilter))
111 {
112 $sid = self::getFilterValue("ID", $oldFilter);
113 unset($result["ID"]);
114 }
115
116 if($sid <> '')
117 {
118 if(self::isSidNew($sid))
119 {
120 $result = array("=ID" => self::getIdFromNewSid($sid));
121 }
122 else
123 {
124 $result["=CODE"] = $sid;
125 }
126 }
127
128 if(self::isFieldInFilter("ACTIVE", $oldFilter))
129 {
130 $result["=ACTIVE"] = self::getFilterValue("ACTIVE", $oldFilter);
131
132 if($result["=ACTIVE"] == "ALL")
133 unset($result["=ACTIVE"]);
134
135 unset($result["ACTIVE"]);
136 }
137
138 if(self::isFieldInFilter("HANDLER", $oldFilter))
139 {
140 $result["=HANDLER"] = self::getFilterValue("HANDLER", $oldFilter);
141 unset($result["HANDLER"]);
142 }
143
144 if(self::isFieldInFilter("PATH", $oldFilter))
145 {
146 $result["=HANDLER"] = self::getFilterValue("PATH", $oldFilter);
147 unset($result["PATH"]);
148 }
149
150 return $result;
151 }
152
153
154 protected static function isFieldInFilter2($fieldName, $filter)
155 {
156 $result = false;
157
158 foreach($filter as $key => $value)
159 if(preg_replace('/[^A-Z_]/', '', $key) == $fieldName)
160 return true;
161
162 return $result;
163 }
164
165 protected static function checkRestrictionFilter(array $restriction, array $filter)
166 {
167 $result = true;
168 switch($restriction["CLASS_NAME"])
169 {
170 case '\Bitrix\Sale\Delivery\Restrictions\BySite':
171 $intersect = array_intersect(self::getFilterValue("SITE_ID", $filter), $restriction["PARAMS"]["SITE_ID"]);
172 $result = !(self::isFieldInFilter2("SITE_ID", $filter) && empty($intersect));
173 break;
174
175 case '\Bitrix\Sale\Delivery\Restrictions\ByWeight':
176 $result = !(isset($filter["COMPABILITY"]["WEIGHT"])
177 && (
178 floatval($filter["COMPABILITY"]["WEIGHT"]) < floatval($restriction["PARAMS"]["MIN_WEIGHT"])
179 ||
180 floatval($filter["COMPABILITY"]["WEIGHT"]) > floatval($restriction["PARAMS"]["MAX_WEIGHT"])
181 )
182 );
183 break;
184
185 case '\Bitrix\Sale\Delivery\Restrictions\ByPrice':
186 $result = !(isset($filter["COMPABILITY"]["PRICE"])
187 && (
188 floatval($filter["COMPABILITY"]["PRICE"]) < floatval($restriction["PARAMS"]["MIN_PRICE"])
189 ||
190 floatval($filter["COMPABILITY"]["PRICE"]) > floatval($restriction["PARAMS"]["MAX_PRICE"])
191 )
192 );
193 break;
194
195 case '\Bitrix\Sale\Delivery\Restrictions\ByLocation':
196 case '\Bitrix\Sale\Delivery\Restrictions\ByPaySystem':
197 default:
198 break;
199 }
200
201 return $result;
202 }
203
208 public static function GetList($arSort = array("SORT" => "ASC"), $arFilter = array())
209 {
210 if(self::isFieldInFilter2("SITE", $arFilter))
211 {
212 $arFilter["SITE_ID"] = self::getFilterValue("SITE", $arFilter);
213 unset($arFilter["SITE"]);
214 }
215
216 if(isset($arFilter["SITE_ID"]))
217 {
218 if(is_string($arFilter["SITE_ID"]) && $arFilter["SITE_ID"] <> '')
219 {
220 if($arFilter["SITE_ID"] == "ALL")
221 unset($arFilter["SITE_ID"]);
222 elseif(mb_strpos($arFilter["SITE_ID"], ",") !== false)
223 $arFilter["SITE_ID"] = explode(",", $arFilter["SITE_ID"]);
224 else
225 $arFilter["SITE_ID"] = array($arFilter["SITE_ID"]);
226 }
227 }
228 else
229 {
230 $arFilter["SITE_ID"] = array(CSite::GetDefSite());
231 }
232
233 if(!isset($arFilter["ACTIVE"]))
234 $arFilter["ACTIVE"] = "Y";
235 elseif($arFilter["ACTIVE"] == "ALL")
236 unset($arFilter["ACTIVE"]);
237
238 $params = array(
239 'order' => array_intersect_key($arSort, Bitrix\Sale\Delivery\Services\Table::getMap()),
240 'filter' => self::convertFilterOldToNew($arFilter));
241
242 $services = array();
243
244 $dbRes = \Bitrix\Sale\Delivery\Services\Table::getList($params);
245
246 while($service = $dbRes->fetch())
247 {
248 $dbRstrRes = \Bitrix\Sale\Internals\ServiceRestrictionTable::getList(array(
249 'filter' => array(
250 "=SERVICE_ID" => $service["ID"],
251 "=SERVICE_TYPE" => \Bitrix\Sale\Services\Base\RestrictionManager::SERVICE_TYPE_SHIPMENT,
252 )
253 ));
254
255 while($restr = $dbRstrRes->fetch())
256 {
257 if(!self::checkRestrictionFilter($restr, $arFilter))
258 continue 2;
259
260 if($restr["CLASS_NAME"] == '\Bitrix\Sale\Delivery\Restrictions\BySite' && !empty($restr["PARAMS"]["SITE_ID"]))
261 {
262 if(is_array($restr["PARAMS"]["SITE_ID"]))
263 {
264 reset($restr["PARAMS"]["SITE_ID"]);
265 $service["LID"] = current($restr["PARAMS"]["SITE_ID"]);
266 }
267 elseif(is_string($restr["PARAMS"]["SITE_ID"]))
268 {
269 $service["LID"] = $restr["PARAMS"]["SITE_ID"];
270 }
271 else
272 {
273 $service["LID"] = "";
274 }
275 }
276 }
277
278 if($service['CODE'] <> '')
279 {
281 }
282 else
283 {
285
286 if(get_parent_class($service['CLASS_NAME']) == 'Bitrix\Sale\Delivery\Services\Base')
287 if($service['CLASS_NAME']::canHasProfiles())
288 continue;
289
291 }
292
293 if(empty($srv))
294 continue;
295
296 if (is_array($arFilter["COMPABILITY"]))
297 {
298 $arProfiles = CSaleDeliveryHandler::GetHandlerCompability($arFilter["COMPABILITY"], $srv);
299
300 if (!is_array($arProfiles) || count($arProfiles) <= 0)
301 continue;
302 else
303 $srv["PROFILES"] = $arProfiles;
304 }
305
306 if($srv)
307 $services[] = $srv;
308 }
309
310 $result = new \CDBResult;
311 $result->InitFromArray($services);
312
313 return $result;
314 }
315
320 public static function GetHandlerCompability($arOrder, $arHandler, $SITE_ID = SITE_ID)
321 {
322 if (!defined('SALE_DH_INITIALIZED'))
324
326
327 if ($currency != $arHandler["BASE_CURRENCY"])
328 $arOrder["PRICE"] = CCurrencyRates::ConvertCurrency($arOrder["PRICE"], $currency, $arHandler["BASE_CURRENCY"]);
329
330 if (is_array($arHandler["PROFILES"]))
331 {
332 $arProfilesList = $arHandler["PROFILES"];
333 foreach ($arProfilesList as $profile_id => $arProfile)
334 {
335 if (is_array($arProfile["RESTRICTIONS_WEIGHT"]) && count($arProfile["RESTRICTIONS_WEIGHT"]) > 0)
336 {
337
338 $arOrder["WEIGHT"] = doubleval($arOrder["WEIGHT"]);
339
340 if ($arOrder["WEIGHT"] < $arProfile["RESTRICTIONS_WEIGHT"][0])
341 {
342 unset($arProfilesList[$profile_id]);
343 continue;
344 }
345 else
346 {
347 if (
348 is_set($arProfile["RESTRICTIONS_WEIGHT"], 1)
349 &&
350 Doubleval($arProfile["RESTRICTIONS_WEIGHT"][1]) > 0
351 &&
352 $arOrder["WEIGHT"] > $arProfile["RESTRICTIONS_WEIGHT"][1]
353 )
354 {
355 unset($arProfilesList[$profile_id]);
356 continue;
357 }
358
359 }
360 }
361
362
363 if (is_array($arProfile["RESTRICTIONS_SUM"]) && count($arProfile["RESTRICTIONS_SUM"]) > 0)
364 {
365 if (
366 $arOrder["PRICE"] < $arProfile["RESTRICTIONS_SUM"][0]
367 ||
368 (
369 is_set($arProfile["RESTRICTIONS_SUM"], 1)
370 &&
371 Doubleval($arProfile["RESTRICTIONS_SUM"][1]) > 0
372 &&
373 $arOrder["PRICE"] > $arProfile["RESTRICTIONS_SUM"][1]
374 )
375 )
376 {
377 unset($arProfilesList[$profile_id]);
378 continue;
379 }
380 }
381
382 if (is_array($arProfile["RESTRICTIONS_DIMENSIONS"]) && count($arProfile["RESTRICTIONS_DIMENSIONS"]) > 0)
383 {
384 if (!self::checkDimensions($arOrder["MAX_DIMENSIONS"], $arProfile["RESTRICTIONS_DIMENSIONS"]))
385 {
386
387 unset($arProfilesList[$profile_id]);
388 continue;
389 }
390 }
391
392 if (intval($arProfile["RESTRICTIONS_DIMENSIONS_SUM"]) > 0)
393 {
394 if (!self::checkDimensionsSum($arOrder["ITEMS"], intval($arProfile["RESTRICTIONS_DIMENSIONS_SUM"])))
395 {
396 unset($arProfilesList[$profile_id]);
397 continue;
398 }
399 }
400
401 if (intval($arProfile["RESTRICTIONS_MAX_SIZE"]) > 0)
402 {
403 if (!self::checkMaxSize($arOrder["ITEMS"], intval($arProfile["RESTRICTIONS_MAX_SIZE"])))
404 {
405 unset($arProfilesList[$profile_id]);
406 continue;
407 }
408 }
409 }
410
411 if (is_callable($arHandler["COMPABILITY"]))
412 {
413 $arHandlerProfilesList = call_user_func($arHandler["COMPABILITY"], $arOrder, $arHandler["CONFIG"]["CONFIG"]);
414
415 if (is_array($arHandlerProfilesList))
416 {
417 foreach ($arProfilesList as $profile_id => $arHandler)
418 {
419 if (!in_array($profile_id, $arHandlerProfilesList))
420 unset($arProfilesList[$profile_id]);
421 }
422 }
423 else
424 return array();
425 }
426 return $arProfilesList;
427 }
428 else
429 return false;
430 }
431
440 public static function GetHandlerExtraParams($SID, $profileId, $arOrder, $siteId = false)
441 {
442 $result = array();
443 if (!defined('SALE_DH_INITIALIZED'))
445
446 if (!$siteId)
448
449 $rsDeliveryHandler = CSaleDeliveryHandler::GetBySID($SID, $siteId);
450 if ($arHandler = $rsDeliveryHandler->Fetch())
451 {
452 if (isset($arHandler["GETEXTRAINFOPARAMS"]) && is_callable($arHandler["GETEXTRAINFOPARAMS"]))
453 {
454 $result = call_user_func($arHandler["GETEXTRAINFOPARAMS"], $arOrder, $arHandler["CONFIG"]["CONFIG"], $profileId, $siteId);
455 }
456 }
457
458 return $result;
459 }
460
466 public static function getActionsList($deliveryId)
467 {
468 $result = array();
469
470 if (!defined('SALE_DH_INITIALIZED'))
472
474 $rsDeliveryHandler = CSaleDeliveryHandler::GetBySID($arDId["SID"]);
475
476 if ($arHandler = $rsDeliveryHandler->Fetch())
477 {
478 if (isset($arHandler["GETORDERSACTIONSLIST"]) && is_callable($arHandler["GETORDERSACTIONSLIST"]))
479 {
480 $result = call_user_func($arHandler["GETORDERSACTIONSLIST"]);
481 }
482 }
483
484 return $result;
485 }
486
494 public static function executeAction($deliveryId, $actionId, $arOrder)
495 {
496 $result = array();
498
499 if (!defined('SALE_DH_INITIALIZED'))
501
502 $rsDeliveryHandler = CSaleDeliveryHandler::GetBySID($arDId["SID"]);
503
504 if ($arHandler = $rsDeliveryHandler->Fetch())
505 {
506 if (isset($arHandler["EXECUTEACTION"]) && is_callable($arHandler["EXECUTEACTION"]))
507 {
508 $result = call_user_func($arHandler["EXECUTEACTION"], $actionId, $arDId["PROFILE"], $arOrder, $arHandler["CONFIG"]["CONFIG"]);
509 }
510 }
511
512 return $result;
513 }
514
519 public static function GetBySID($SID, $SITE_ID = false)
520 {
521 static $cache = array();
522
523 if (!isset($cache[$SITE_ID]))
524 $cache[$SITE_ID] = array();
525
526 if (!isset($cache[$SITE_ID][$SID]))
527 {
528 $dbRes = self::GetList(array(),array("SID" => $SID, "SITE_ID" => $SITE_ID));
529
530 while($handler = $dbRes->Fetch())
531 $cache[$SITE_ID][$SID][] = $handler;
532 }
533
534 $dbResult = new CDBResult();
535 $dbResult->InitFromArray($cache[$SITE_ID][$SID]);
536
537 return $dbResult;
538 }
539
541 public static function CheckFields($arData)
542 {
543 global $APPLICATION;
544
545 $numberFieldsProf = array("RESTRICTIONS_WEIGHT", "RESTRICTIONS_SUM", "TAX_RATE", "RESTRICTIONS_MAX_SIZE", "RESTRICTIONS_DIMENSIONS_SUM");
546
547 if(isset($arData["PROFILES"]) && is_array($arData["PROFILES"]))
548 {
549 foreach ($arData["PROFILES"] as $profileId => $arProfile)
550 {
551 foreach ($numberFieldsProf as $fName)
552 {
553 if (isset($arProfile[$fName]))
554 {
555 if(!is_array($arProfile[$fName]))
556 $arProfile[$fName] = array($arProfile[$fName]);
557
558 foreach ($arProfile[$fName] as $fValue)
559 {
560 if($result = CSaleDeliveryHelper::getFormatError($fValue, 'NUMBER', GetMessage("SALE_DH_CF_ERROR_P_".$fName)))
561 {
562 $APPLICATION->ThrowException($result, $fName);
563 return false;
564 }
565 }
566 }
567 }
568 }
569 }
570
571 if(isset($arData['TAX_RATE']) && $result = CSaleDeliveryHelper::getFormatError($arData['TAX_RATE'], 'NUMBER', GetMessage('SALE_DH_CF_ERROR_TAX_RATE')))
572 {
573 $APPLICATION->ThrowException($result, 'TAX_RATE');
574 return false;
575 }
576
577 if(isset($arData['SORT']) && $result = CSaleDeliveryHelper::getFormatError($arData['SORT'], 'NUMBER', GetMessage('SALE_DH_CF_ERROR_SORT')))
578 {
579 $APPLICATION->ThrowException($result, 'SORT');
580 return false;
581 }
582
583 return true;
584 }
585
592 public static function getServiceParams($sid, $siteId = false)
593 {
594 $res = \Bitrix\Sale\Delivery\Services\Table::getList(array(
595 'filter' => array(
596 'CODE' => $sid,
597 '=CLASS_NAME' => '\Bitrix\Sale\Delivery\Services\Automatic'
598 )
599 ));
600
601 while($handler = $res->fetch())
602 {
603 $rstrRes = \Bitrix\Sale\Internals\ServiceRestrictionTable::getList(array(
604 'filter' =>array(
605 "=SERVICE_ID" => $handler["ID"],
606 "=CLASS_NAME" => '\Bitrix\Sale\Delivery\Restrictions\BySite',
607 "=SERVICE_TYPE" => \Bitrix\Sale\Services\Base\RestrictionManager::SERVICE_TYPE_SHIPMENT,
608 )
609 ));
610
611 $restrict = $rstrRes->fetch();
612
613 if(!is_array($restrict) && !$siteId)
614 return $handler;
615
616 if(in_array($siteId, $restrict["PARAMS"]["SITE_ID"]))
617 return $handler;
618 }
619
620 return array();
621 }
622
631 protected static function saveRestrictionBySiteId($deliveryId, $siteId, $update)
632 {
633 $rfields = array(
634 "SERVICE_ID" => $deliveryId,
635 "CLASS_NAME" => '\Bitrix\Sale\Delivery\Restrictions\BySite',
636 "SERVICE_TYPE" => \Bitrix\Sale\Services\Base\RestrictionManager::SERVICE_TYPE_SHIPMENT,
637 "PARAMS" => array(
638 "SITE_ID" => array($siteId)
639 )
640 );
641
642 if($update)
643 {
644 $rstrRes = \Bitrix\Sale\Internals\ServiceRestrictionTable::getList(array(
645 'filter' =>array(
646 "=SERVICE_ID" => $deliveryId,
647 "=CLASS_NAME" => '\Bitrix\Sale\Delivery\Restrictions\BySite',
648 "=SERVICE_TYPE" => \Bitrix\Sale\Services\Base\RestrictionManager::SERVICE_TYPE_SHIPMENT,
649 )
650 ));
651
652 if($restrict = $rstrRes->fetch())
653 $rres = \Bitrix\Sale\Internals\ServiceRestrictionTable::update($restrict["ID"], $rfields);
654 else
655 $rres = \Bitrix\Sale\Internals\ServiceRestrictionTable::add($rfields);
656 }
657 else
658 {
659 $rres = \Bitrix\Sale\Internals\ServiceRestrictionTable::add($rfields);
660 }
661
662 return $rres->isSuccess();
663 }
664
673 protected static function saveRestrictionByWeight($deliveryId, array $weightParams, $update)
674 {
675 $rfields = array(
676 "SERVICE_ID" => $deliveryId,
677 "CLASS_NAME" => '\Bitrix\Sale\Delivery\Restrictions\ByWeight',
678 "SERVICE_TYPE" => \Bitrix\Sale\Services\Base\RestrictionManager::SERVICE_TYPE_SHIPMENT,
679 "PARAMS" => array(
680 "MIN_WEIGHT" => $weightParams[0],
681 "MAX_WEIGHT" => $weightParams[1]
682 )
683 );
684
685 if($update)
686 {
687 $rstrRes = \Bitrix\Sale\Internals\ServiceRestrictionTable::getList(array(
688 'filter' =>array(
689 "=SERVICE_ID" => $deliveryId,
690 "=SERVICE_TYPE" => \Bitrix\Sale\Services\Base\RestrictionManager::SERVICE_TYPE_SHIPMENT,
691 "=CLASS_NAME" => '\Bitrix\Sale\Delivery\Restrictions\ByWeight'
692 )
693 ));
694
695 if($restrict = $rstrRes->fetch())
696 $rres = \Bitrix\Sale\Internals\ServiceRestrictionTable::update($restrict["ID"], $rfields);
697 else
698 $rres = \Bitrix\Sale\Internals\ServiceRestrictionTable::add($rfields);
699 }
700 else
701 {
702 $rres = \Bitrix\Sale\Internals\ServiceRestrictionTable::add($rfields);
703 }
704
705 return $rres->isSuccess();
706 }
707
708 protected static function saveRestrictionByPublicShow($deliveryId, $publicShow, $update)
709 {
710 $rfields = array(
711 "SERVICE_ID" => $deliveryId,
712 "CLASS_NAME" => '\Bitrix\Sale\Delivery\Restrictions\ByPublicMode',
713 "SERVICE_TYPE" => \Bitrix\Sale\Services\Base\RestrictionManager::SERVICE_TYPE_SHIPMENT,
714 "PARAMS" => array(
715 "PUBLIC_SHOW" => ($publicShow) ? 'Y' : 'N'
716 )
717 );
718
719 if($update)
720 {
721 $rstrRes = \Bitrix\Sale\Internals\ServiceRestrictionTable::getList(array(
722 'filter' =>array(
723 "=SERVICE_ID" => $deliveryId,
724 "=SERVICE_TYPE" => \Bitrix\Sale\Services\Base\RestrictionManager::SERVICE_TYPE_SHIPMENT,
725 "=CLASS_NAME" => '\Bitrix\Sale\Delivery\Restrictions\ByPublicMode'
726 )
727 ));
728
729 if($restrict = $rstrRes->fetch())
730 $rres = \Bitrix\Sale\Internals\ServiceRestrictionTable::update($restrict["ID"], $rfields);
731 else
732 $rres = \Bitrix\Sale\Internals\ServiceRestrictionTable::add($rfields);
733 }
734 else
735 {
736 $rres = \Bitrix\Sale\Internals\ServiceRestrictionTable::add($rfields);
737 }
738
739 return $rres->isSuccess();
740 }
741
751 protected static function saveRestrictionByPrice($deliveryId, array $priceParams, $currency, $update)
752 {
753 $rfields = array(
754 "SERVICE_ID" => $deliveryId,
755 "SERVICE_TYPE" => \Bitrix\Sale\Services\Base\RestrictionManager::SERVICE_TYPE_SHIPMENT,
756 "CLASS_NAME" => '\Bitrix\Sale\Delivery\Restrictions\ByPrice',
757 "PARAMS" => array(
758 "MIN_PRICE" => $priceParams[0],
759 "MAX_PRICE" => $priceParams[1],
760 "CURRENCY" => $currency
761 )
762 );
763
764 if($update)
765 {
766 $rstrRes = \Bitrix\Sale\Internals\ServiceRestrictionTable::getList(array(
767 'filter' =>array(
768 "=SERVICE_ID" => $deliveryId,
769 "=SERVICE_TYPE" => \Bitrix\Sale\Services\Base\RestrictionManager::SERVICE_TYPE_SHIPMENT,
770 "=CLASS_NAME" => '\Bitrix\Sale\Delivery\Restrictions\ByPrice'
771 )
772 ));
773
774 if($restrict = $rstrRes->fetch())
775 $rres = \Bitrix\Sale\Internals\ServiceRestrictionTable::update($restrict["ID"], $rfields);
776 else
777 $rres = \Bitrix\Sale\Internals\ServiceRestrictionTable::add($rfields);
778 }
779 else
780 {
781 $rres = \Bitrix\Sale\Internals\ServiceRestrictionTable::add($rfields);
782 }
783
784 return $rres->isSuccess();
785 }
786
795 protected static function saveRestrictionByDimensions($deliveryId, array $params, $update)
796 {
797 $rfields = array(
798 "SERVICE_ID" => $deliveryId,
799 "SERVICE_TYPE" => \Bitrix\Sale\Services\Base\RestrictionManager::SERVICE_TYPE_SHIPMENT,
800 "CLASS_NAME" => '\Bitrix\Sale\Delivery\Restrictions\ByDimensions',
801 "PARAMS" => array(
802 "LENGTH" => $params["LENGTH"],
803 "WIDTH" => $params["WIDTH"],
804 "HEIGHT" => $params["HEIGHT"],
805 )
806 );
807
808 if($update)
809 {
810 $rstrRes = \Bitrix\Sale\Internals\ServiceRestrictionTable::getList(array(
811 'filter' =>array(
812 "=SERVICE_ID" => $deliveryId,
813 "=SERVICE_TYPE" => \Bitrix\Sale\Services\Base\RestrictionManager::SERVICE_TYPE_SHIPMENT,
814 "=CLASS_NAME" => '\Bitrix\Sale\Delivery\Restrictions\ByDimensions'
815 )
816 ));
817
818 if($restrict = $rstrRes->fetch())
819 $rres = \Bitrix\Sale\Internals\ServiceRestrictionTable::update($restrict["ID"], $rfields);
820 else
821 $rres = \Bitrix\Sale\Internals\ServiceRestrictionTable::add($rfields);
822 }
823 else
824 {
825 $rres = \Bitrix\Sale\Internals\ServiceRestrictionTable::add($rfields);
826 }
827
828 return $rres->isSuccess();
829 }
830
839 protected static function saveRestrictionByMaxSize($deliveryId, $maxSize, $update)
840 {
841 $rfields = array(
842 "SERVICE_ID" => $deliveryId,
843 "SERVICE_TYPE" => \Bitrix\Sale\Services\Base\RestrictionManager::SERVICE_TYPE_SHIPMENT,
844 "CLASS_NAME" => '\Bitrix\Sale\Delivery\Restrictions\ByMaxSize',
845 "PARAMS" => array(
846 "MAX_SIZE" => $maxSize,
847 )
848 );
849
850 if($update)
851 {
852 $rstrRes = \Bitrix\Sale\Internals\ServiceRestrictionTable::getList(array(
853 'filter' =>array(
854 "=SERVICE_ID" => $deliveryId,
855 "=SERVICE_TYPE" => \Bitrix\Sale\Services\Base\RestrictionManager::SERVICE_TYPE_SHIPMENT,
856 "=CLASS_NAME" => '\Bitrix\Sale\Delivery\Restrictions\ByMaxSize'
857 )
858 ));
859
860 if($restrict = $rstrRes->fetch())
861 $rres = \Bitrix\Sale\Internals\ServiceRestrictionTable::update($restrict["ID"], $rfields);
862 else
863 $rres = \Bitrix\Sale\Internals\ServiceRestrictionTable::add($rfields);
864 }
865 else
866 {
867 $rres = \Bitrix\Sale\Internals\ServiceRestrictionTable::add($rfields);
868 }
869
870 return $rres->isSuccess();
871 }
872
874 public static function Set($code, $arData, $siteId = false)
875 {
876 global $APPLICATION;
877
878 $serviceParams = self::getServiceParams($code, $siteId);
879 $id = isset($serviceParams["ID"]) ? $serviceParams["ID"] : false;
880
881 $update = intval($id) > 0;
882 $fields = array_intersect_key($arData, Bitrix\Sale\Delivery\Services\Table::getMap());
883
884 if(!$update) //add new
885 {
886 $fields["CODE"] = $code;
887
888 if(!isset($arData["CLASS_NAME"]))
889 $fields["CLASS_NAME"] = '\Bitrix\Sale\Delivery\Services\Automatic';
890 else
891 $fields["CLASS_NAME"] = $arData["CLASS_NAME"];
892 }
893
894 if(isset($arData["PARENT_ID"]))
895 $fields["PARENT_ID"] = $arData["PARENT_ID"];
896 elseif(!$update)
897 $fields["PARENT_ID"] = 0;
898
899 if (!defined('SALE_DH_INITIALIZED'))
901
902 $handlers = self::__getRegisteredHandlers();
903
904 if(isset($serviceParams["CONFIG"]))
905 $fields["CONFIG"] = $serviceParams["CONFIG"];
906 else
907 $fields["CONFIG"] = array();
908
909 if (isset($arData["CONFIG"]))
910 {
911 if (isset($handlers[$code]["DBSETSETTINGS"]) && is_callable($handlers[$code]["DBSETSETTINGS"]))
912 {
913 if (!$strOldSettings = call_user_func($handlers[$code]["DBSETSETTINGS"], $arData["CONFIG"]))
914 {
915 $APPLICATION->ThrowException("Can't save delivery services's old settings");
916 return false;
917 }
918 }
919 else
920 {
921 $strOldSettings = $arData["CONFIG"];
922 }
923
924 $strOldSettings = serialize($strOldSettings);
925 $fields["CONFIG"]["MAIN"]["OLD_SETTINGS"] = $strOldSettings;
926 }
927
928 if(!empty($arData["BASE_CURRENCY"]))
929 $fields["CURRENCY"] = $arData["BASE_CURRENCY"];
930 elseif(!empty($serviceParams["CURRENCY"]))
931 $fields["CURRENCY"] = $serviceParams["CURRENCY"];
932 elseif(!empty($handlers[$code]["BASE_CURRENCY"]))
933 $fields["CURRENCY"] = $handlers[$code]["BASE_CURRENCY"];
934 else
935 $fields["CURRENCY"] = COption::GetOptionString('sale', 'default_currency', 'RUB');
936
937 if (!empty($arData["SID"]))
938 {
939 $fields["CONFIG"]["MAIN"]["SID"] = $arData["SID"];
940 }
941
942 if(isset($arData["TAX_RATE"]) && floatval($arData["TAX_RATE"]) > 0)
943 {
944 $fields["CONFIG"]["MAIN"]["MARGIN_VALUE"] = $arData["TAX_RATE"];
945 $fields["CONFIG"]["MAIN"]["MARGIN_TYPE"] = "%";
946 }
947
948 elseif(!$update)
949 $fields["CONFIG"]["MAIN"]["MARGIN"] = 0;
950
951 if (!empty($arData["PROFILE_ID"]))
952 $fields["CONFIG"]["MAIN"]["PROFILE_ID"] = $arData["PROFILE_ID"];
953
954 if (isset($arData["LOGOTIP"]) && is_array($arData["LOGOTIP"]))
955 {
956 $fields["LOGOTIP"] = $arData["LOGOTIP"];
957 $fields["LOGOTIP"]["MODULE_ID"] = "sale";
958 CFile::SaveForDB($fields, "LOGOTIP", "sale/delivery/logotip");
959 }
960
961 if($update)
963 else
964 $res = \Bitrix\Sale\Delivery\Services\Manager::add($fields);
965
966 if(!$res->isSuccess())
967 {
968 throw new \Bitrix\Main\SystemException(implode("\n", $res->getErrorMessages()));
969 }
970
971 if(!$update)
972 $id = $res->getId();
973
974 if (is_array($arData["PROFILES"]))
975 {
976 foreach($arData["PROFILES"] as $profileCode => $profileData)
977 {
978 if($profileData["TITLE"] <> '')
979 $name = $profileData["TITLE"];
980 elseif($handlers[$code]['PROFILES'][$profileCode]['TITLE'] <> '')
981 $name = $handlers[$code]['PROFILES'][$profileCode]['TITLE'];
982 else
983 $name = "-";
984
985 self::Set($code.":".$profileCode,
986 array(
987 "NAME" => $name,
988 "DESCRIPTION" => isset($profileData["DESCRIPTION"]) ? $profileData["DESCRIPTION"] : '',
989 "ACTIVE" => isset($profileData["ACTIVE"]) ? $profileData["ACTIVE"] : "N",
990 "TAX_RATE" => isset($profileData["TAX_RATE"]) ? $profileData["TAX_RATE"] : 0,
991 "PARENT_ID" => isset($profileData["PARENT_ID"]) ? $profileData["PARENT_ID"] : $id,
992 "SORT" => isset($arData["SORT"]) ? $arData["SORT"] : 100,
993 "RESTRICTIONS_WEIGHT" => isset($profileData["RESTRICTIONS_WEIGHT"]) ? $profileData["RESTRICTIONS_WEIGHT"] : false,
994 "RESTRICTIONS_SUM" => isset($profileData["RESTRICTIONS_SUM"]) ? $profileData["RESTRICTIONS_SUM"] : false,
995 "RESTRICTIONS_DIMENSIONS" => isset($profileData["RESTRICTIONS_DIMENSIONS"]) ? $profileData["RESTRICTIONS_DIMENSIONS"] : false,
996 "RESTRICTIONS_MAX_SIZE" => isset($profileData["RESTRICTIONS_MAX_SIZE"]) ? $profileData["RESTRICTIONS_MAX_SIZE"] : 0,
997 "RESTRICTIONS_DIMENSIONS_SUM" => isset($profileData["RESTRICTIONS_DIMENSIONS_SUM"]) ? $profileData["RESTRICTIONS_DIMENSIONS_SUM"] : 0,
998 "CLASS_NAME" => '\Bitrix\Sale\Delivery\Services\AutomaticProfile',
999 "PROFILE_ID" => $profileCode
1000 ),
1001 $siteId <> '' ? $siteId : ""
1002 );
1003 }
1004 }
1005
1006 if($siteId <> '')
1007 {
1008 if(!self::saveRestrictionBySiteId($id, $siteId, $update))
1009 {
1010 $APPLICATION->ThrowException("Can't save delivery restriction by site", "SITE_ID");
1011 return false;
1012 }
1013 }
1014 elseif($update)
1015 {
1016 \Bitrix\Sale\Delivery\Restrictions\Manager::deleteByDeliveryIdClassName($id, '\Bitrix\Sale\Delivery\Restrictions\BySite');
1017 }
1018
1019 if(is_array($arData["RESTRICTIONS_WEIGHT"]) && (floatval($arData["RESTRICTIONS_WEIGHT"][0]) > 0 || floatval($arData["RESTRICTIONS_WEIGHT"][1]) > 0))
1020 {
1021 if(!self::saveRestrictionByWeight($id, $arData["RESTRICTIONS_WEIGHT"], $update))
1022 {
1023 $APPLICATION->ThrowException("Can't save delivery restriction by weight", "RESTRICTIONS_WEIGHT");
1024 return false;
1025 }
1026 }
1027 elseif($update)
1028 {
1029 \Bitrix\Sale\Delivery\Restrictions\Manager::deleteByDeliveryIdClassName($id, '\Bitrix\Sale\Delivery\Restrictions\ByWeight');
1030 }
1031
1032 if(is_array($arData["RESTRICTIONS_SUM"]) && (floatval($arData["RESTRICTIONS_SUM"][0]) > 0 || floatval($arData["RESTRICTIONS_SUM"][1]) > 0))
1033 {
1034 if(!self::saveRestrictionByPrice($id, $arData["RESTRICTIONS_SUM"], $fields["CURRENCY"], $update))
1035 {
1036 $APPLICATION->ThrowException("Can't save delivery restriction by sum", "RESTRICTIONS_SUM");
1037 return false;
1038 }
1039 }
1040 elseif($update)
1041 {
1042 \Bitrix\Sale\Delivery\Restrictions\Manager::deleteByDeliveryIdClassName($id, '\Bitrix\Sale\Delivery\Restrictions\ByPrice');
1043 }
1044
1045 if(
1046 (is_array($arData["RESTRICTIONS_DIMENSIONS"])
1047 && (floatval($arData["RESTRICTIONS_DIMENSIONS"][0]) > 0
1048 || floatval($arData["RESTRICTIONS_DIMENSIONS"][1]) > 0
1049 || floatval($arData["RESTRICTIONS_DIMENSIONS"][3]) > 0
1050 )
1051 )
1052 )
1053 {
1054 if(!self::saveRestrictionByDimensions(
1055 $id,
1056 array(
1057 "LENGTH" => count($arData["RESTRICTIONS_DIMENSIONS"][0]) > 0 ? $arData["RESTRICTIONS_DIMENSIONS"][0] : 0,
1058 "WIDTH" => isset($arData["RESTRICTIONS_DIMENSIONS"][1]) ? $arData["RESTRICTIONS_DIMENSIONS"][1] : 0,
1059 "HEIGHT" => isset($arData["RESTRICTIONS_DIMENSIONS"][2]) ? $arData["RESTRICTIONS_DIMENSIONS"][2] : 0
1060 ),
1061 $update
1062 )
1063 )
1064 {
1065 $APPLICATION->ThrowException("Can't save delivery restriction by dimensions");
1066 return false;
1067 }
1068 }
1069 elseif($update)
1070 {
1071 \Bitrix\Sale\Delivery\Restrictions\Manager::deleteByDeliveryIdClassName($id, '\Bitrix\Sale\Delivery\Restrictions\ByDimensions');
1072 }
1073
1074 if(floatval($arData["RESTRICTIONS_MAX_SIZE"]) > 0)
1075 {
1076 if(!self::saveRestrictionByMaxSize($id, $arData["RESTRICTIONS_MAX_SIZE"], $update))
1077 {
1078 $APPLICATION->ThrowException("Can't save delivery restriction by maxx size", "RESTRICTIONS_MAX_SIZE");
1079 return false;
1080 }
1081 }
1082 elseif($update)
1083 {
1084 \Bitrix\Sale\Delivery\Restrictions\Manager::deleteByDeliveryIdClassName($id, '\Bitrix\Sale\Delivery\Restrictions\ByMaxSize');
1085 }
1086
1087 return $id;
1088 }
1089
1091 public static function Reset($sid)
1092 {
1093 $dbRes = \Bitrix\Sale\Delivery\Services\Table::getList(array(
1094 "filter" => array(
1095 "LOGIC" => "OR",
1096 "=CODE" => $sid,
1097 "CODE" => $sid.":%"
1098 ),
1099 "select" => array(
1100 "ID"
1101 )
1102 ));
1103
1104 try
1105 {
1106 while($service = $dbRes->fetch())
1108 }
1109 catch(\Bitrix\Main\SystemException $e)
1110 {
1111 $GLOBALS["APPLICATION"]->ThrowException($e->getMessage());
1112 return false;
1113 }
1114
1115 return true;
1116 }
1117
1119 public static function ResetAll()
1120 {
1121 $serviceRes = \Bitrix\Sale\Delivery\Services\Table::getList(
1122 array(
1123 'filter' => array("=CLASS_NAME" => '\Bitrix\Sale\Delivery\Services\Automatic'),
1124 'select' => array("CODE")
1125 ));
1126
1127 while($service = $serviceRes->fetch())
1128 self::Reset($service["CODE"]);
1129
1130 return;
1131 }
1132
1134 protected static function __executeCalculateEvents($SID, $profile, $arOrder, $arReturn)
1135 {
1136 $arEventsList = array(
1137 "onSaleDeliveryHandlerCalculate",
1138 "onSaleDeliveryHandlerCalculate_".$SID,
1139 );
1140
1141 foreach ($arEventsList as $event)
1142 {
1143 foreach(GetModuleEvents("sale", $event, true) as $arEventHandler)
1144 {
1145 $arReturnTmp = ExecuteModuleEventEx($arEventHandler, array($SID, $profile, $arOrder, $arReturn));
1146
1147 if (is_array($arReturnTmp))
1148 $arReturn = $arReturnTmp;
1149 }
1150 }
1151
1152 return $arReturn;
1153 }
1154
1155 public static function execOldEventWithNewParams(Bitrix\Main\Event $params)
1156 {
1158 if(!$shipment = $params->getParameter("SHIPMENT"))
1159 return new \Bitrix\Main\EventResult(\Bitrix\Main\EventResult::ERROR, null, 'sale');
1160
1161 $deliveryId = $shipment->getDeliveryId();
1162
1163 if(intval($deliveryId) <= 0 && intval($params->getParameter("DELIVERY_ID")) > 0)
1164 $deliveryId = intval($params->getParameter("DELIVERY_ID"));
1165
1166 if(intval($deliveryId) <= 0)
1167 return new \Bitrix\Main\EventResult(\Bitrix\Main\EventResult::ERROR, null, 'sale');
1168
1170 if(!$deliverySrv = \Bitrix\Sale\Delivery\Services\Manager::getObjectById($deliveryId))
1171 return new \Bitrix\Main\EventResult(\Bitrix\Main\EventResult::ERROR, null, 'sale');
1172
1173 if(get_class($deliverySrv) != 'Bitrix\Sale\Delivery\Services\AutomaticProfile')
1174 return new \Bitrix\Main\EventResult(\Bitrix\Main\EventResult::ERROR, null, 'sale');
1175
1176 if(!$code = $deliverySrv->getCode())
1177 return new \Bitrix\Main\EventResult(\Bitrix\Main\EventResult::ERROR, null, 'sale');
1178
1180
1182 if(!$result = $params->getParameter("RESULT"))
1183 throw new \Bitrix\Main\ArgumentNullException("params[RESULT]");
1184
1185 if(!$collection = $shipment->getCollection())
1186 return new \Bitrix\Main\EventResult(\Bitrix\Main\EventResult::ERROR, null, 'sale');
1187
1189 if(!$order = $collection->getOrder())
1190 return new \Bitrix\Main\EventResult(\Bitrix\Main\EventResult::ERROR, null, 'sale');
1191
1192 $oldOrder = \Bitrix\Sale\Compatible\OrderCompatibility::convertOrderToArray($order);
1193 $errorMessage = $result->isSuccess() ? '' : implode("<br>\n", $result->getErrorMessages());
1194
1195 $oldResult = array(
1196 "VALUE" => $result->getPrice(),
1197 "TRANSIT" => $result->getPeriodDescription(),
1198 "TEXT" => $result->isSuccess() ? $result->getDescription() : $errorMessage,
1199 "RESULT" => $result->isSuccess() ? "OK" : "ERROR"
1200 );
1201
1202 if($result->isNextStep())
1203 $oldResult["RESULT"] = "NEXT_STEP";
1204
1205 if($result->isSuccess() && $result->getDescription() <> '')
1206 $oldResult["RESULT"] = "NOTE";
1207
1208 if(intval($result->getPacksCount()) > 0)
1209 $oldResult["PACKS_COUNT"] = $result->getPacksCount();
1210
1211 if($result->isNextStep() && $result->getTmpData() <> '')
1212 $oldResult["TEMP"] = CUtil::JSEscape($result->getTmpData());
1213
1214 $oldResult = self::__executeCalculateEvents($sidAndProfile["SID"], $sidAndProfile["PROFILE"], $oldOrder, $oldResult);
1215
1216 $result->setDeliveryPrice($oldResult["VALUE"]);
1217
1218 if($oldResult["RESULT"] == "ERROR")
1219 {
1220 if($oldResult["TEXT"] != $errorMessage)
1221 $result->addError(new \Bitrix\Main\Entity\EntityError($oldResult["TEXT"]));
1222 }
1223 elseif($oldResult["RESULT"] == "NEXT_STEP")
1224 {
1225 $result->setAsNextStep();
1226 }
1227
1228 if(isset($oldResult["TRANSIT"])) $result->setPeriodDescription($oldResult["TRANSIT"]);
1229 if(isset($oldResult["TEXT"])) $result->setDescription($oldResult["TEXT"]);
1230 if(isset($oldResult["PACKS_COUNT"])) $result->setPacksCount($oldResult["PACKS_COUNT"]);
1231 if(isset($oldResult["TEMP"])) $result->setTmpData($oldResult["TEMP"]);
1232
1233 return $result;
1234 }
1235
1237 public static function CalculateFull($SID, $profile, $arOrder, $currency, $SITE_ID = false)
1238 {
1239 $bFinish = false;
1240 $STEP = 0;
1241 $TMP = false;
1242
1243 while (!$bFinish)
1244 {
1245 $arResult = CSaleDeliveryHandler::Calculate(++$STEP, $SID, $profile, $arOrder, $currency, $TMP, $SITE_ID);
1246
1247 if ($arResult["RESULT"] == "NEXT_STEP" && $arResult["TEMP"] <> '')
1248 $TMP = $arResult["TEMP"];
1249
1250 $bFinish = $arResult["RESULT"] == "OK" || $arResult["RESULT"] == "ERROR";
1251 }
1252
1253 return $arResult;
1254 }
1255
1267 public static function Calculate($STEP, $SID, $profile, $arOrder, $currency, $TMP = false, $SITE_ID = false)
1268 {
1269 global $APPLICATION;
1270
1271 if (!defined('SALE_DH_INITIALIZED'))
1273
1274 if (!$SITE_ID) $SITE_ID = SITE_ID;
1275
1276 $rsDeliveryHandler = CSaleDeliveryHandler::GetBySID($SID, $SITE_ID);
1277 if (!$arHandler = $rsDeliveryHandler->Fetch())
1278 {
1279 return array(
1280 "RESULT" => "ERROR",
1281 "TEXT" => GetMessage("SALE_DH_ERROR_HANDLER_NOT_INSTALLED")
1282 );
1283 }
1284
1285 if (is_callable($arHandler["CALCULATOR"]))
1286 {
1287 $arConfig = $arHandler["CONFIG"]["CONFIG"];
1288
1289 $arOrder["PRICE"] = CCurrencyRates::ConvertCurrency(
1290 $arOrder["PRICE"],
1291 $currency,
1292 $arHandler["BASE_CURRENCY"]
1293 );
1294
1295 if ($res = call_user_func($arHandler["CALCULATOR"], $profile, $arConfig, $arOrder, $STEP, $TMP))
1296 {
1297 if (is_array($res))
1298 $arReturn = $res;
1299 elseif (is_numeric($res))
1300 $arReturn = array(
1301 "RESULT" => "OK",
1302 "VALUE" => doubleval($res)
1303 );
1304 }
1305 else
1306 {
1307 if ($ex = $APPLICATION->GetException())
1308 return array(
1309 "RESULT" => "ERROR",
1310 "TEXT" => $ex->GetString(),
1311 );
1312 else
1313 return array(
1314 "RESULT" => "OK",
1315 "VALUE" => 0
1316 );
1317 }
1318
1319 if (
1320 is_array($arReturn)
1321 &&
1322 $arReturn["RESULT"] == "OK"
1323 &&
1324 $currency != $arHandler["BASE_CURRENCY"]
1325 &&
1326 CModule::IncludeModule('currency')
1327 )
1328 {
1329 $arReturn["VALUE"] = CCurrencyRates::ConvertCurrency(
1330 $arReturn["VALUE"],
1331 $arHandler["BASE_CURRENCY"],
1332 $currency
1333 );
1334 }
1335
1336 $arReturn["VALUE"] *= 1 + ($arHandler["TAX_RATE"]/100);
1337
1338 if(isset($arHandler['PROFILES'][$profile]['TAX_RATE']))
1339 $arReturn["VALUE"] *= 1 + (floatval($arHandler['PROFILES'][$profile]['TAX_RATE'])/100);
1340
1341 $arReturn = CSaleDeliveryHandler::__executeCalculateEvents($SID, $profile, $arOrder, $arReturn);
1342
1343 return $arReturn;
1344 }
1345 else
1346 {
1347 return array(
1348 "RESULT" => "ERROR",
1349 "TEXT" => GetMessage("SALE_DH_ERROR_WRONG_HANDLER_FILE")
1350 );
1351 }
1352 }
1353
1360 public static function checkDimensions($arOrderDimensions, $arRestrictDimensions)
1361 {
1362 $dimCount = 3;
1363 if(
1364 !is_array($arOrderDimensions)
1365 ||
1366 !is_array($arRestrictDimensions)
1367 ||
1368 empty($arOrderDimensions)
1369 ||
1370 empty($arRestrictDimensions)
1371 ||
1372 count($arOrderDimensions) != $dimCount
1373 ||
1374 count($arRestrictDimensions) != $dimCount
1375 )
1376 return true;
1377
1378 $result = true;
1379
1380 rsort($arOrderDimensions, SORT_NUMERIC);
1381 rsort($arRestrictDimensions, SORT_NUMERIC);
1382
1383 for ($i=0; $i < $dimCount; $i++)
1384 {
1385 if(
1386 floatval($arRestrictDimensions[$i]) <= 0
1387 ||
1388 $arOrderDimensions[$i] <=0
1389 )
1390 {
1391 break;
1392 }
1393
1394 if($arOrderDimensions[$i] > $arRestrictDimensions[$i])
1395 {
1396 $result = false;
1397 break;
1398 }
1399 }
1400
1401 return $result;
1402 }
1403
1410 public static function checkDimensionsSum($arItems, $maxDimensionSum)
1411 {
1412 $result = true;
1413 $maxDimensionSum = floatval($maxDimensionSum);
1414
1415 if(is_array($arItems) && $maxDimensionSum > 0)
1416 {
1417 foreach ($arItems as $arItem)
1418 {
1419 if(!self::isDimensionsExist($arItem))
1420 continue;
1421
1422 $itemDimSumm = floatval($arItem["WIDTH"])+floatval($arItem["HEIGHT"])+floatval($arItem["LENGTH"]);
1423
1424 if($itemDimSumm > $maxDimensionSum)
1425 {
1426 $result = false;
1427 break;
1428 }
1429 }
1430 }
1431
1432 return $result;
1433 }
1434
1441 public static function checkMaxSize($arItems, $maxSize)
1442 {
1443 $result = true;
1444 $maxSize = floatval($maxSize);
1445
1446 if(is_array($arItems) && $maxSize > 0)
1447 {
1448
1449 foreach ($arItems as $arItem)
1450 {
1451 if(!self::isDimensionsExist($arItem))
1452 continue;
1453
1454 if(
1455 floatval($arItem["WIDTH"]) > $maxSize
1456 ||
1457 floatval($arItem["HEIGHT"]) > $maxSize
1458 ||
1459 floatval($arItem["LENGTH"]) > $maxSize
1460 )
1461 {
1462 $result = false;
1463 break;
1464 }
1465 }
1466 }
1467
1468 return $result;
1469 }
1470
1476 private static function isDimensionsExist($arItem)
1477 {
1478 return (
1479 isset($arItem["WIDTH"]) && floatval($arItem["WIDTH"]) > 0
1480 &&
1481 isset($arItem["HEIGHT"]) && floatval($arItem["HEIGHT"]) > 0
1482 &&
1483 isset($arItem["LENGTH"]) && floatval($arItem["LENGTH"]) > 0
1484 );
1485 }
1486
1491 public static function getActionsNames()
1492 {
1493 return array(
1494 "REQUEST_SELF" => GetMessage("SALE_DH_ACTION_REQUEST_SELF"),
1495 "REQUEST_TAKE" => GetMessage("SALE_DH_ACTION_REQUEST_TAKE")
1496 );
1497 }
1498
1504 public static function convertToNew($renameTable = false)
1505 {
1506 $result = new \Bitrix\Sale\Result();
1508
1509 if(!$con->isTableExists("b_sale_delivery_handler"))
1510 return $result;
1511
1512 $sqlHelper = $con->getSqlHelper();
1513 $deliveryRes = $con->query('SELECT * FROM b_sale_delivery_handler WHERE CONVERTED != \'Y\'');
1514 $tablesToUpdate = array(
1515 'b_sale_order',
1516 'b_sale_order_history',
1517 );
1518
1521
1522 while($delivery = $deliveryRes->fetch())
1523 {
1524 if($delivery["HID"] == '')
1525 {
1526 //$result->addError( new \Bitrix\Main\Entity\EntityError("Can't find delivery HID. ID: \"".$delivery["ID"]."\""));
1527 continue;
1528 }
1529
1530 if(!isset($handlers[$delivery["HID"]]))
1531 {
1533 "SEVERITY" => "ERROR",
1534 "AUDIT_TYPE_ID" => "SALE_CONVERTER_ERROR",
1535 "MODULE_ID" => "sale",
1536 "ITEM_ID" => "CAllSaleDeliveryHandler::convertToNew()",
1537 "DESCRIPTION" => "Can't find delivery handler for registered HID: \"".$delivery["HID"]."\"",
1538 ));
1539
1540 //$result->addError( new \Bitrix\Main\Entity\EntityError("Can't find delivery handler for registered HID: \"".$delivery["HID"]."\""));
1541 continue;
1542 }
1543
1544 if($delivery["PROFILES"] <> '') //get from base
1545 $delivery["PROFILES"] = unserialize($delivery["PROFILES"], ['allowed_classes' => false]);
1546 else //or default.
1547 $delivery["PROFILES"] = $handlers[$delivery["HID"]]["PROFILES"];
1548
1549 // Something strange it probably not used
1550 if($delivery["PROFILES"] == false || !is_array($delivery["PROFILES"]) || empty($delivery["PROFILES"] ))
1551 {
1552 //$result->addError( new \Bitrix\Main\Entity\EntityError("Can't receive info about profiles. Delivery HID: \"".$delivery["HID"]."\""));
1553
1555 "SEVERITY" => "ERROR",
1556 "AUDIT_TYPE_ID" => "SALE_CONVERTER_ERROR",
1557 "MODULE_ID" => "sale",
1558 "ITEM_ID" => "CAllSaleDeliveryHandler::convertToNew()",
1559 "DESCRIPTION" => "Can't receive info about profiles. Delivery HID: \"".$delivery["HID"]."\"",
1560 ));
1561
1562 continue;
1563 }
1564
1565 //Set profiles activity
1566 foreach($delivery["PROFILES"] as $id => $params)
1567 if(!isset($delivery["PROFILES"][$id]["ACTIVE"]) || $delivery["ACTIVE"] == "N")
1568 $delivery["PROFILES"][$id]["ACTIVE"] = $delivery["ACTIVE"];
1569
1570 unset($delivery["ID"]);
1571 $delivery["CONFIG"] = array();
1572
1573 if ($delivery["SETTINGS"] <> '')
1574 {
1575 if(isset($handlers[$delivery["HID"]]["DBGETSETTINGS"]) && is_callable($handlers[$delivery["HID"]]["DBGETSETTINGS"]))
1576 $delivery["CONFIG"] = call_user_func($handlers[$delivery["HID"]]["DBGETSETTINGS"], $delivery["SETTINGS"]);
1577 else
1578 $delivery["CONFIG"] = $delivery["SETTINGS"];
1579 }
1580 elseif(isset($handlers[$delivery["HID"]]["GETCONFIG"]) && is_callable($handlers[$delivery["HID"]]["GETCONFIG"]))
1581 {
1582 $config = call_user_func(
1583 $handlers[$delivery["HID"]]["GETCONFIG"],
1584 $delivery["LID"] <> '' ? $delivery["LID"] : false
1585 );
1586
1587 foreach($config["CONFIG"] as $key => $arConfig)
1588 {
1589 if(!empty($arConfig["DEFAULT"]))
1590 {
1591 $delivery["CONFIG"][$key] = $arConfig["DEFAULT"];
1592 }
1593 }
1594 }
1595
1596 if(empty($delivery["NAME"]))
1597 {
1598 if(!empty($handlers[$delivery["HID"]]["NAME"]))
1599 $delivery["NAME"] = $handlers[$delivery["HID"]]["NAME"];
1600 else
1601 $delivery["NAME"] = "-";
1602 }
1603
1604 $delivery["SID"] = $handlers[$delivery["HID"]]["SID"];
1605
1607 $delivery["HID"],
1608 $delivery,
1609 $delivery["LID"] <> '' ? $delivery["LID"] : false
1610 );
1611
1612 if(intval($id) <= 0)
1613 {
1614 $result->addError(
1615 new \Bitrix\Main\Entity\EntityError(
1616 "Can't convert delivery handler with hid: ".
1617 $delivery["HID"].
1618 ($delivery["LID"] <> '' ? " for site: ".$delivery["LID"] : "")
1619 )
1620 );
1621
1622 continue;
1623 }
1624
1625 $con->queryExecute("UPDATE b_sale_delivery_handler SET CONVERTED='Y' WHERE HID LIKE '".$sqlHelper->forSql($delivery["HID"])."'");
1626 $ids = array($id);
1627
1628 foreach($delivery["PROFILES"] as $profileName => $profileData)
1629 {
1630 $fullSid = $delivery["HID"].":".$profileName;
1631 $profileId = \CSaleDelivery::getIdByCode($fullSid);
1632 $ids[] = $profileId;
1633
1634 if(intval($profileId) > 0)
1635 {
1636 foreach($tablesToUpdate as $table)
1637 $con->queryExecute("UPDATE ".$table." SET DELIVERY_ID='".$sqlHelper->forSql($profileId)."' WHERE DELIVERY_ID = '".$sqlHelper->forSql($fullSid)."'");
1638
1639 $con->queryExecute("UPDATE b_sale_delivery2paysystem SET DELIVERY_ID='".$sqlHelper->forSql($profileId)."', DELIVERY_PROFILE_ID='##CONVERTED##' WHERE DELIVERY_ID = '".$sqlHelper->forSql($delivery["HID"])."' AND DELIVERY_PROFILE_ID='".$profileName."'");
1640 }
1641 else
1642 {
1643 $result->addError( new \Bitrix\Main\Entity\EntityError("Cant determine id for profile code: ".$fullSid));
1644 }
1645 }
1646
1647 $con->queryExecute("UPDATE b_sale_delivery2paysystem SET DELIVERY_ID='".$sqlHelper->forSql($id)."', DELIVERY_PROFILE_ID='##CONVERTED##' WHERE DELIVERY_ID = '".$sqlHelper->forSql($delivery["HID"])."' AND (DELIVERY_PROFILE_ID='' OR DELIVERY_PROFILE_ID IS NULL)");
1648
1649 $d2pRes = \Bitrix\Sale\Internals\DeliveryPaySystemTable::getList(array(
1650 'filter' => array(
1651 'DELIVERY_ID' => $ids
1652 ),
1653 'select' => array("DELIVERY_ID"),
1654 'group' => array("DELIVERY_ID")
1655 ));
1656
1657 while($d2p = $d2pRes->fetch())
1658 {
1659 $res = \Bitrix\Sale\Internals\ServiceRestrictionTable::add(array(
1660 "SERVICE_ID" => $d2p["DELIVERY_ID"],
1661 "SERVICE_TYPE" => \Bitrix\Sale\Services\Base\RestrictionManager::SERVICE_TYPE_SHIPMENT,
1662 "CLASS_NAME" => '\Bitrix\Sale\Delivery\Restrictions\ByPaySystem',
1663 "SORT" => 100
1664 ));
1665
1666 if(!$res->isSuccess())
1667 $result->addErrors($res->getErrors());
1668 }
1669 }
1670
1671 if($renameTable && $result->isSuccess())
1672 $con->renameTable('b_sale_delivery_handler','b_sale_delivery_handler_old');
1673
1674 return $result;
1675 }
1676
1677 public static function convertToNewAgent($renameTable = false)
1678 {
1679 self::convertToNew($renameTable);
1680 return "";
1681 }
1682
1683 public static function convertConfigHandlerToSidAgent()
1684 {
1688 $filter = array('=CLASS_NAME' => '\Bitrix\Sale\Delivery\Services\Automatic');
1689
1690 $res = Bitrix\Sale\Delivery\Services\Table::getList(array(
1691 'filter' => $filter,
1692 'select' => array("ID", "CODE", "CONFIG")
1693 ));
1694
1695 while($params = $res->fetch())
1696 {
1697 if(!empty($params["CONFIG"]["MAIN"]["SID"]))
1698 continue;
1699
1700 $config = $params["CONFIG"];
1701
1702 if(!empty($initedHandlersH[$config["MAIN"]["HANDLER"]]["SID"]))
1703 $config["MAIN"]["SID"] = $initedHandlersH[$config["MAIN"]["HANDLER"]]["SID"];
1704 elseif(!empty($params["CODE"]) && !empty($initedHandlersS[$params["CODE"]]))
1705 $config["MAIN"]["SID"] = $params["CODE"];
1706 else
1707 $config["MAIN"]["SID"] = "";
1708
1709 unset($config["MAIN"]["HANDLER"]);
1711 }
1712
1713 return "";
1714 }
1715}
1716?>
$con
Определения admin_tab.php:7
global $APPLICATION
Определения include.php:80
$arResult
Определения generate_coupon.php:16
static getConnection($name="")
Определения application.php:638
static registerAutoLoadClasses($moduleName, array $classes)
Определения loader.php:273
static deleteByDeliveryIdClassName($deliveryId, $className)
Определения manager.php:54
static getRegisteredHandlers($indexBy="")
Определения automatic.php:481
static convertNewServiceToOld($service, $sid=false)
Определения automatic.php:506
static getHandlersList()
Определения manager.php:636
static delete($id, bool $checkServiceUsage=true)
Определения manager.php:868
static update($id, array $fields)
Определения manager.php:817
static convertNewServiceToOld($service)
Определения new_to_automatic.php:98
static ConvertCurrency($valSum, $curFrom, $curTo, $valDate="")
Определения currency_rate.php:393
static isFieldInFilter2($fieldName, $filter)
Определения delivery_handler.php:154
static GetHandlerExtraParams($SID, $profileId, $arOrder, $siteId=false)
Определения delivery_handler.php:440
static isFieldInFilter($fieldName, $filter)
Определения delivery_handler.php:45
static ResetAll()
Определения delivery_handler.php:1119
static getActionsList($deliveryId)
Определения delivery_handler.php:466
static getActionsNames()
Определения delivery_handler.php:1491
static GetHandlerCompability($arOrder, $arHandler, $SITE_ID=SITE_ID)
Определения delivery_handler.php:320
static Calculate($STEP, $SID, $profile, $arOrder, $currency, $TMP=false, $SITE_ID=false)
Определения delivery_handler.php:1267
static getIdFromNewSid($sid)
Определения delivery_handler.php:68
static CalculateFull($SID, $profile, $arOrder, $currency, $SITE_ID=false)
Определения delivery_handler.php:1237
static saveRestrictionByWeight($deliveryId, array $weightParams, $update)
Определения delivery_handler.php:673
static checkMaxSize($arItems, $maxSize)
Определения delivery_handler.php:1441
static isSidNew($sid)
Определения delivery_handler.php:63
static convertToNewAgent($renameTable=false)
Определения delivery_handler.php:1677
static convertFilterOldToNew(array $oldFilter)
Определения delivery_handler.php:79
static GetAdminList($arSort=array("SORT"=> "ASC"))
Определения delivery_handler.php:40
static convertConfigHandlerToSidAgent()
Определения delivery_handler.php:1683
static $actions
Определения delivery_handler.php:12
static checkDimensions($arOrderDimensions, $arRestrictDimensions)
Определения delivery_handler.php:1360
static CheckFields($arData)
Определения delivery_handler.php:541
static saveRestrictionByPrice($deliveryId, array $priceParams, $currency, $update)
Определения delivery_handler.php:751
static saveRestrictionByDimensions($deliveryId, array $params, $update)
Определения delivery_handler.php:795
static saveRestrictionByPublicShow($deliveryId, $publicShow, $update)
Определения delivery_handler.php:708
static getServiceParams($sid, $siteId=false)
Определения delivery_handler.php:592
static GetBySID($SID, $SITE_ID=false)
Определения delivery_handler.php:519
static Initialize()
Определения delivery_handler.php:22
static Reset($sid)
Определения delivery_handler.php:1091
static __getRegisteredHandlers()
Определения delivery_handler.php:31
static getFilterValue($fieldName, $filter)
Определения delivery_handler.php:54
static Set($code, $arData, $siteId=false)
Определения delivery_handler.php:874
static executeAction($deliveryId, $actionId, $arOrder)
Определения delivery_handler.php:494
static checkRestrictionFilter(array $restriction, array $filter)
Определения delivery_handler.php:165
static GetList($arSort=array("SORT"=> "ASC"), $arFilter=array())
Определения delivery_handler.php:208
static __executeCalculateEvents($SID, $profile, $arOrder, $arReturn)
Определения delivery_handler.php:1134
static saveRestrictionBySiteId($deliveryId, $siteId, $update)
Определения delivery_handler.php:631
static checkDimensionsSum($arItems, $maxDimensionSum)
Определения delivery_handler.php:1410
static saveRestrictionByMaxSize($deliveryId, $maxSize, $update)
Определения delivery_handler.php:839
static convertToNew($renameTable=false)
Определения delivery_handler.php:1504
static getIdByCode($code)
Определения delivery.php:1641
static Add($arFields)
Определения event_log.php:44
static getDeliverySIDAndProfile($deliveryId)
Определения delivery_helper.php:123
static getFormatError($value, $formatName, $name)
Определения delivery_helper.php:507
static GetLangCurrency($siteId)
Определения settings.php:52
</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
$filter
Определения iblock_catalog_list.php:54
while($arParentIBlockProperty=$dbParentIBlockProperty->Fetch()) $errorMessage
if(!\Bitrix\Main\Loader::includeModule('catalog')) $profile_id
Определения cron_frame.php:43
$STEP
Определения csv_new_setup.php:23
if(!is_null($config))($config as $configItem)(! $configItem->isVisible()) $code
Определения options.php:195
$siteId
Определения ajax.php:8
ExecuteModuleEventEx($arEvent, $arParams=[])
Определения tools.php:5214
GetModuleEvents($MODULE_ID, $MESSAGE_ID, $bReturnArray=false)
Определения tools.php:5177
IncludeModuleLangFile($filepath, $lang=false, $bReturnArray=false)
Определения tools.php:3778
is_set($a, $k=false)
Определения tools.php:2133
GetMessage($name, $aReplace=null)
Определения tools.php:3397
$name
Определения menu_edit.php:35
$order
Определения payment.php:8
$service
Определения payment.php:18
$event
Определения prolog_after.php:141
if( $daysToExpire >=0 &&$daysToExpire< 60 elseif)( $daysToExpire< 0)
Определения prolog_main_admin.php:393
$config
Определения quickway.php:69
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
if($inWords) echo htmlspecialcharsbx(Number2Word_Rus(roundEx($totalVatSum $params['CURRENCY']
Определения template.php:799
$matches
Определения index.php:22
const SITE_ID
Определения sonet_set_content_view.php:12
$GLOBALS['_____370096793']
Определения update_client.php:1
$dbResult
Определения updtr957.php:3
$arFilter
Определения user_search.php:106
$dbRes
Определения yandex_detail.php:168
$SITE_ID
Определения yandex_run.php:607
$fields
Определения yandex_run.php:501