1C-Bitrix 25.700.0
Загрузка...
Поиск...
Не найдено
delivery_helper.php
См. документацию.
1<?php
2
4
6
12{
17 public static function getRegionsList($countryId = 0, $bFlip = false)
18 {
19 static $arRegions = array();
20 $flipIndex = intval($bFlip);
21
22 $countryId = (int)$countryId;
23
24 if(isset($arRegions[$countryId][$flipIndex]))
25 return $arRegions[$countryId][$flipIndex];
26
28 {
29 $types = [];
30 $res = Location\TypeTable::getList([
31 'select' => [
32 'ID',
33 'CODE',
34 ]
35 ]);
36 while($item = $res->fetch())
37 {
38 $types[$item['CODE']] = $item['ID'];
39 }
40 unset($item, $res);
41
42 if (empty($types))
43 {
44 return [];
45 }
46
47 $filter = [
48 [
49 'LOGIC' => 'OR',
50 [
51 '=TYPE_ID' => $types['CITY'] ?? null,
52 '=NAME.LANGUAGE_ID' => LANGUAGE_ID,
53 [
54 'LOGIC' => 'OR',
55 [
56 '=PARENT.TYPE_ID' => $types['COUNTRY'] ?? null
57 ],
58 [
59 '=PARENT.TYPE_ID' => $types['COUNTRY_DISTRICT'] ?? null
60 ],
61 [
62 '=PARENT_ID' => '0'
63 ]
64 ]
65 ],
66 [
67 '=TYPE_ID' => $types['REGION'] ?? null,
68 ]
69 ]
70 ];
71
72 if ($countryId > 0)
73 {
74 $filter['=PARENTS.TYPE_ID'] = $types['COUNTRY'] ?? null;
75 $filter['=PARENTS.ID'] = $countryId;
76 }
77
78 $dbRegionList = Location\LocationTable::getList([
79 'filter' => $filter,
80 'select' => [
81 'ID',
82 'CODE',
83 'NAME_LANG' => 'NAME.NAME',
84 ],
85 'order' => [
86 'NAME_LANG' => 'ASC',
87 ],
88 ]);
89
90 }
91 else
92 {
93 $arFilterRegion = [];
94 if ($countryId > 0)
95 {
96 $arFilterRegion["COUNTRY_ID"] = $countryId;
97 }
98
99 $dbRegionList = CSaleLocation::GetRegionList(array("NAME_LANG"=>"ASC"), $arFilterRegion, LANGUAGE_ID);
100 }
101
102 $key = 'ID';
103
104 while ($arRegionList = $dbRegionList->Fetch())
105 {
106 if($key == 'ID' && isset($arRegionList['CODE']))
107 {
108 $key = 'CODE';
109 }
110
111 if($key == 'CODE' && $arRegionList['CODE'] == '')
112 {
113 continue;
114 }
115
116 $arRegions[$countryId][0][$arRegionList[$key]] = $arRegionList["NAME_LANG"]; // $bFlip == false
117 $arRegions[$countryId][1][$arRegionList["NAME_LANG"]] = $arRegionList[$key]; // $bFlip == true
118 }
119
120 return $arRegions[$countryId][$flipIndex] ?? [];
121 }
122
123 public static function getDeliverySIDAndProfile($deliveryId)
124 {
125 $arResult = array();
126
127 $dId = $dpId = false;
128
129 if (mb_strpos($deliveryId, ":") !== false)
130 {
131 $arId = explode(":", $deliveryId);
132 $dId = $arId[0];
133 $dpId = $arId[1];
134 }
135 else
136 {
137 $dId = $deliveryId;
138 }
139
140 $arResult["SID"] = $dId;
141
142 if($dpId !== false)
143 $arResult["PROFILE"] = $dpId;
144
145 return $arResult;
146 }
147
148 public static function getConfValue($arField)
149 {
150 $retVal = false;
151
152 if(isset($arField['VALUE']))
153 $retVal = $arField['VALUE'];
154 elseif(isset($arField['DEFAULT']))
155 $retVal = $arField['DEFAULT'];
156
157 return $retVal;
158 }
159
160 public static function getMaxDimensions($arDim1, $arDim2)
161 {
162 if(!is_array($arDim1) && !is_array($arDim2))
163 return array();
164
165 $dimCount = 3; //width, height, length
166 $arResult = array();
167
168 rsort($arDim1, SORT_NUMERIC);
169 rsort($arDim2, SORT_NUMERIC);
170
171 for ($i=0; $i<$dimCount; $i++)
172 {
173 if(!isset($arDim1[$i]))
174 $arDim1[$i] = 0;
175
176 if(!isset($arDim2[$i]))
177 $arDim2[$i] = 0;
178
179 if(floatval($arDim1[$i]) > floatval($arDim2[$i]))
180 $arResult[$i] = $arDim1[$i];
181 else
182 $arResult[$i] = $arDim2[$i];
183 }
184
185 return $arResult;
186 }
187
204 public static function getRequiredPacks(&$arItems, $arPacks, $maxWeight, $reservedSpace = 0.15)
205 {
206 $packCount = 1;
207 $packVolume = 0;
208 $itemsDims = [];
209
210 reset($arPacks);
211 $FIRST_PACK = key($arPacks);
212
213 $P_WIDTH_IDX = 0;
214 $P_HEIGHT_IDX = 1;
215 $P_LENGTH_IDX = 2;
216
217 $arResultPacksParams = array();
218
219 if(
220 isset($arPacks[$FIRST_PACK]['DIMENSIONS'][$P_WIDTH_IDX])
221 &&
222 isset($arPacks[$FIRST_PACK]['DIMENSIONS'][$P_HEIGHT_IDX])
223 &&
224 isset($arPacks[$FIRST_PACK]['DIMENSIONS'][$P_LENGTH_IDX]))
225 {
226 $packVolume = $arPacks[$FIRST_PACK]['DIMENSIONS'][$P_WIDTH_IDX]*$arPacks[$FIRST_PACK]['DIMENSIONS'][$P_HEIGHT_IDX]*$arPacks[$FIRST_PACK]['DIMENSIONS'][$P_LENGTH_IDX];
227 }
228
229 if(is_array($arItems))
230 {
231 $arTmpItems = array();
232
233 foreach ($arItems as $itemId => $item)
234 {
235 $arTmpItems[$item["PRODUCT_ID"]]["VOLUME"] = self::calcItemVolume($item);
236 $arTmpItems[$item["PRODUCT_ID"]]["WEIGHT"] = $item["WEIGHT"];
237 $arTmpItems[$item["PRODUCT_ID"]]["PRICE"] = $item["PRICE"];
238
239 // set items parameters
240 $arTmpItems[$item["PRODUCT_ID"]]["SET_PARENT_ID"] = $item["SET_PARENT_ID"] ?? null;
241 $arTmpItems[$item["PRODUCT_ID"]]["TYPE"] = $item["TYPE"];
242
243 if( $packVolume <= 0
244 && (int)$item['DIMENSIONS']['LENGTH'] > 0
245 && (int)$item['DIMENSIONS']['WIDTH'] > 0
246 && (int)$item['DIMENSIONS']['HEIGHT'] > 0
247 )
248 {
249 $itemsDims[] = [
250 (int)$item['DIMENSIONS']['LENGTH'],
251 (int)$item['DIMENSIONS']['WIDTH'],
252 (int)$item['DIMENSIONS']['HEIGHT']
253 ];
254 }
255
256 if($item["QUANTITY"] > 1)
257 {
258 for ($i=$item["QUANTITY"]; $i > 1 ; $i--)
259 {
260 $arTmpItems[$item["PRODUCT_ID"]."_".$i] = $arTmpItems[$item["PRODUCT_ID"]];
261 $itemsDims[] = [
262 (int)$item['DIMENSIONS']['LENGTH'],
263 (int)$item['DIMENSIONS']['WIDTH'],
264 (int)$item['DIMENSIONS']['HEIGHT']
265 ];
266 }
267 }
268 }
269
270 // calculate set parent total volume
271 foreach ($arTmpItems as $id => $item)
272 {
274 $arTmpItems[$item["SET_PARENT_ID"]]["VOLUME"] += $item["VOLUME"];
275 }
276
277 // remove set items params
278 foreach ($arTmpItems as $id => $item)
279 {
281 unset($arTmpItems[$id]);
282 }
283
284 if(!empty($arTmpItems))
285 {
286 sortByColumn($arTmpItems, array(
287 "VOLUME" => array(SORT_NUMERIC, SORT_DESC),
288 "WEIGHT" => array(SORT_NUMERIC, SORT_DESC),
289 )
290 );
291
292 $tmpPackageVolume = 0;
293 $tmpPackageWeight = 0;
294 $tmpPackagePrice = 0;
295
296 foreach ($arTmpItems as $arItem)
297 {
298 if(
299 (
300 $packVolume > 0
301 &&
302 $arItem["VOLUME"] > $packVolume
303 )
304 ||
305 (
306 $maxWeight > 0
307 &&
308 $arItem["WEIGHT"] > $maxWeight
309 )
310 )
311 {
312 return array();
313 }
314
315 $correctCoeff = $tmpPackageVolume > 0 ? (1 - $reservedSpace) : 1;
316
317 if(
318 (
319 $packVolume <= 0
320 ||
321 $tmpPackageVolume + $arItem["VOLUME"] <= $packVolume*$correctCoeff
322 )
323 &&
324 (
325 $maxWeight <= 0
326 ||
327 $tmpPackageWeight + $arItem["WEIGHT"] <= $maxWeight
328 )
329 )
330 {
331 $tmpPackageVolume += $arItem["VOLUME"];
332 $tmpPackageWeight += $arItem["WEIGHT"];
333 $tmpPackagePrice += $arItem["PRICE"];
334 }
335 else
336 {
337 $arResultPacksParams[$packCount-1] = array();
338 $arResultPacksParams[$packCount-1]["VOLUME"] = $packVolume;
339 $arResultPacksParams[$packCount-1]["WEIGHT"] = $tmpPackageWeight;
340 $arResultPacksParams[$packCount-1]["PRICE"] = $tmpPackagePrice;
341 $arResultPacksParams[$packCount-1]["DIMENSIONS"] = array(
342 "WIDTH" => $arPacks[$FIRST_PACK]['DIMENSIONS'][$P_WIDTH_IDX],
343 "HEIGHT" => $arPacks[$FIRST_PACK]['DIMENSIONS'][$P_HEIGHT_IDX],
344 "LENGTH" => $arPacks[$FIRST_PACK]['DIMENSIONS'][$P_LENGTH_IDX]
345 );
346
347 $tmpPackageVolume = $arItem["VOLUME"];
348 $tmpPackageWeight = $arItem["WEIGHT"];
349 $tmpPackagePrice = $arItem["PRICE"];
350 $packCount += 1;
351 }
352 }
353
354 $arResultPacksParams[$packCount-1] = array();
355 $arResultPacksParams[$packCount-1]["WEIGHT"] = $tmpPackageWeight;
356 $arResultPacksParams[$packCount-1]["PRICE"] = $tmpPackagePrice;
357
358 if($packCount == 1 && $packVolume <= 0 && !empty($itemsDims))
359 {
361 $arResultPacksParams[$packCount-1]["DIMENSIONS"] = array(
362 "WIDTH" => $dimensions[0],
363 "HEIGHT" => $dimensions[1],
364 "LENGTH" => $dimensions[2],
365 );
366
367 $volume = $dimensions[0]*$dimensions[1]*$dimensions[2];
368
369 if($tmpPackageVolume < $volume)
370 {
371 $tmpPackageVolume = $volume;
372 }
373 }
374 else
375 {
376 $arResultPacksParams[$packCount-1]["DIMENSIONS"] = array(
377 "WIDTH" => $arPacks[$FIRST_PACK]['DIMENSIONS'][$P_WIDTH_IDX],
378 "HEIGHT" => $arPacks[$FIRST_PACK]['DIMENSIONS'][$P_HEIGHT_IDX],
379 "LENGTH" => $arPacks[$FIRST_PACK]['DIMENSIONS'][$P_LENGTH_IDX]
380 );
381 }
382
383 $arResultPacksParams[$packCount-1]["VOLUME"] = intval($packVolume) > 0 ? $packVolume : $tmpPackageVolume;
384 }
385 }
386
387 return $arResultPacksParams;
388 }
389
390 public static function makeBoxConfig($boxId, $arBox, $group, &$arConfig)
391 {
392 if(
393 !isset($arBox['NAME'])
394 ||
395 !isset($arBox['DIMENSIONS'])
396 ||
397 count($arBox['DIMENSIONS']) < 3
398 ||
399 !is_array($arConfig)
400 )
401 {
402 return false;
403 }
404
405 $arConfig['CONFIG']['box_section_'.$group] = array(
406 'TYPE' => 'SECTION',
407 'TITLE' => GetMessage('SALE_DHLP_AVIABLE_BOXES'),
408 'GROUP' => $group
409 );
410
411 $arConfig['CONFIG']['BOX_AV_CONTROL_'.$group.'_'.$boxId] = array(
412 'TYPE' => 'MULTI_CONTROL_STRING',
413 'MCS_ID' => 'BOX_'.$group.'_'.$boxId,
414 'TITLE' => $arBox['NAME'],
415 'GROUP' => $group
416 );
417
418 $arConfig['CONFIG']['BOX_AV_LENGTH_'.$group.'_'.$boxId] = array(
419 'TYPE' => 'STRING',
420 'MCS_ID' => 'BOX_'.$group.'_'.$boxId,
421 'POST_TEXT' => '&nbsp;',
422 'SIZE' => 8,
423 'DEFAULT' => $arBox['DIMENSIONS'][0],
424 'GROUP' => $group,
425 'CHECK_FORMAT' => 'NUMBER'
426 );
427
428 $arConfig['CONFIG']['BOX_AV_WIDTH_'.$group.'_'.$boxId] = array(
429 'TYPE' => 'STRING',
430 'MCS_ID' => 'BOX_'.$group.'_'.$boxId,
431 'POST_TEXT' => '&nbsp;',
432 'SIZE' => 8,
433 'DEFAULT' => $arBox['DIMENSIONS'][1],
434 'GROUP' => $group,
435 'CHECK_FORMAT' => 'NUMBER'
436 );
437 $arConfig['CONFIG']['BOX_AV_HEIGHT_'.$group.'_'.$boxId] = array(
438 'TYPE' => 'STRING',
439 'MCS_ID' => 'BOX_'.$group.'_'.$boxId,
440 'SIZE' => 8,
441 'DEFAULT' => $arBox['DIMENSIONS'][2],
442 'GROUP' => $group,
443 'CHECK_FORMAT' => 'NUMBER'
444 );
445 }
446
447 public static function getBoxesFromConfig($profile, &$arConfig)
448 {
449 $arBoxes = array();
450
451 if(is_array($arConfig) && $profile <> '')
452 {
453 foreach ($arConfig as $key => $value)
454 {
455 if($profile != $value['GROUP'])
456 continue;
457
458 if(!isset($value['MCS_ID']))
459 continue;
460
461 $boxId = mb_substr($value['MCS_ID'], 4);
462 $subKey = mb_substr($key, 0, 8);
463
464 if($subKey == 'BOX_AV_C')
465 $arBoxes[$boxId]['NAME'] = $value['TITLE'];
466
467 if($subKey == 'BOX_AV_L')
468 $arBoxes[$boxId]['DIMENSIONS'][0] = self::getConfValue($value);
469
470 if($subKey == 'BOX_AV_W')
471 $arBoxes[$boxId]['DIMENSIONS'][1] = self::getConfValue($value);
472
473 if($subKey == 'BOX_AV_H')
474 $arBoxes[$boxId]['DIMENSIONS'][2] = self::getConfValue($value);
475 }
476 }
477
478 return $arBoxes;
479 }
480
481 public static function calcItemVolume($item)
482 {
483 $volume = 0;
484
485 if(is_array($item))
486 {
487 $width = $height = $length = 0;
488
489 if(isset($item["DIMENSIONS"]["WIDTH"]))
490 $width = floatval($item["DIMENSIONS"]["WIDTH"]);
491
492 if(isset($item["DIMENSIONS"]["HEIGHT"]))
493 $height = floatval($item["DIMENSIONS"]["HEIGHT"]);
494
495 if(isset($item["DIMENSIONS"]["LENGTH"]))
496 $length = floatval($item["DIMENSIONS"]["LENGTH"]);
497
498 $volume = $width*$height*$length;
499
500 if($volume < 0)
501 $volume = 0;
502 }
503
504 return $volume;
505 }
506
507 public static function getFormatError($value, $formatName, $name)
508 {
509 static $locale = array();
510
511 if(empty($locale))
512 $locale = localeconv();
513
514 $pattern = $error = $result = null;
515
516 if($formatName == 'NUMBER')
517 {
518 $pattern = '#[^0-9\\';
519 $pattern .= $locale["decimal_point"] == '.' ? '\.' : $locale["decimal_point"];
520 $pattern .= $locale["thousands_sep"] == ' ' ? '\s' : $locale["thousands_sep"];
521 $pattern .= ']#';
522 $error = GetMessage("SALE_DHLP_FIELD")." \"".$name.
523 "\" ".GetMessage("SALE_DHLP_CONTAIN")." \"".$locale["decimal_point"]."\"";
524
525 if($locale["thousands_sep"] <> '')
526 $error .= " ".GetMessage("SALE_DHLP_SEPARATOR")." \"".$locale["thousands_sep"]."\"";
527 $error .= "<br>\n";
528 }
529
530 if(!is_null($pattern) && !is_null($error))
531 {
532 if(preg_match($pattern, $value))
533 $result = $error;
534 else
535 $result = null;
536 }
537
538 return $result;
539 }
540
541 public static function execHandlerAction($orderId, $actionId)
542 {
543 global $DB, $USER;
544 $arResult = array();
545 $arOrder = CSaleOrder::GetById($orderId);
546
547 $handlerActions = CSaleDeliveryHandler::getActionsList($arOrder["DELIVERY_ID"]);
548
549 if(!array_key_exists($actionId, $handlerActions))
550 {
552 "RESULT" => "ERROR",
553 "TEXT" => GetMessage("SALE_DHLP_HANDLER_HAS_NO_ACTION")
554 );
555 }
556
557 $dt = new \Bitrix\Main\Type\DateTime();
558 $depList = \Bitrix\Sale\Internals\OrderDeliveryReqTable::getList(array(
559 'filter'=>array('=ORDER_ID' => $orderId),
560 ));
561
562 $dep = $depList->fetch();
563
564 if($dep && !is_null($dep["DATE_REQUEST"]))
565 {
567 "RESULT" => "ERROR",
568 "TEXT" => GetMessage("SALE_DHLP_HANDLER_REQUEST_ALREADY_SENT")
569 );
570 }
571
572 if(empty($arResult))
573 {
574 $arUserGroups = $USER->GetUserGroupArray();
575 $arOrder["ITEMS"] = array();
576
577 $dbItemsList = CSaleBasket::GetList(
578 array("SET_PARENT_ID" => "DESC", "TYPE" => "DESC", "NAME" => "ASC"),
579 array("ORDER_ID" => $orderId)
580 );
581
582 while ($arItem = $dbItemsList->GetNext())
583 {
584 $arItem["DIMENSIONS"] = unserialize($arItem["~DIMENSIONS"], ['allowed_classes' => false]);
585 unset($arItem["~DIMENSIONS"]);
586 $arOrder["ITEMS"][] = $arItem;
587 }
588
589 $arResult = CSaleDeliveryHandler::executeAction($arOrder["DELIVERY_ID"], $actionId, $arOrder);
590
591 if($actionId == "REQUEST_SELF" && isset($arResult["TRACKING_NUMBER"]))
592 {
593 $bUserCanEditOrder = CSaleOrder::CanUserUpdateOrder($orderId, $arUserGroups);
594
595 if ($bUserCanEditOrder)
596 {
597 if($dep)
598 {
599 \Bitrix\Sale\Internals\OrderDeliveryReqTable::update(
600 $dep["ID"],
601 array(
602 "DATE_REQUEST" => $dt
603 )
604 );
605 }
606 else
607 {
608 \Bitrix\Sale\Internals\OrderDeliveryReqTable::add(
609 array(
610 "ORDER_ID" => $orderId,
611 "DATE_REQUEST" => $dt
612 )
613 );
614 }
615
616 $fields = array();
617
618 if(isset($arResult["TRACKING_NUMBER"]))
619 $fields["TRACKING_NUMBER"] = $arResult["TRACKING_NUMBER"];
620
621 if(isset($arResult["DELIVERY_DOC_NUM"]))
622 {
623 $fields["DELIVERY_DOC_NUM"] = $arResult["DELIVERY_DOC_NUM"];
624 $fields["DELIVERY_DOC_DATE"] = Date($DB->DateFormatToPHP(CLang::GetDateFormat("SHORT", $arOrder["LID"])));
625 }
626
628 }
629 }
630
631 CSaleOrderChange::AddRecord($orderId, "ORDER_DELIVERY_REQUEST_SENT", $arResult);
632 }
633
634 return $arResult;
635 }
636}
$arResult
Определения generate_coupon.php:16
Определения date.php:9
static countMinContainerSize(array $boxesSizes)
Определения packer.php:16
static getActionsList($deliveryId)
Определения delivery_handler.php:466
static executeAction($deliveryId, $actionId, $arOrder)
Определения delivery_handler.php:494
static isLocationProMigrated()
Определения location.php:58
static AddRecord($orderId, $type, $data=array(), $entityName=null, $entityId=null)
Определения order_change.php:126
static CanUserUpdateOrder($ID, $arUserGroups=false, $siteID=false)
Определения order.php:483
static isSetItem($arItem)
Определения basket_helper.php:26
static GetList($arOrder=array(), $arFilter=array(), $arGroupBy=false, $arNavStartParams=false, $arSelectFields=array())
Определения basket.php:33
static getMaxDimensions($arDim1, $arDim2)
Определения delivery_helper.php:160
static makeBoxConfig($boxId, $arBox, $group, &$arConfig)
Определения delivery_helper.php:390
static execHandlerAction($orderId, $actionId)
Определения delivery_helper.php:541
static calcItemVolume($item)
Определения delivery_helper.php:481
static getRequiredPacks(&$arItems, $arPacks, $maxWeight, $reservedSpace=0.15)
Определения delivery_helper.php:204
static getDeliverySIDAndProfile($deliveryId)
Определения delivery_helper.php:123
static getRegionsList($countryId=0, $bFlip=false)
Определения delivery_helper.php:17
static getConfValue($arField)
Определения delivery_helper.php:148
static getFormatError($value, $formatName, $name)
Определения delivery_helper.php:507
static getBoxesFromConfig($profile, &$arConfig)
Определения delivery_helper.php:447
static GetRegionList($arOrder=Array("NAME_LANG"=>"ASC"), $arFilter=Array(), $strLang=LANGUAGE_ID)
Определения location.php:261
static Update($ID, $arFields, $bDateUpdate=true)
Определения order.php:140
$orderId
Определения payment.php:5
</td ></tr ></table ></td ></tr >< tr >< td class="bx-popup-label bx-width30"><?=GetMessage("PAGE_NEW_TAGS")?> array( $site)
Определения file_new.php:804
$res
Определения filter_act.php:7
$result
Определения get_property_values.php:14
$filter
Определения iblock_catalog_list.php:54
global $DB
Определения cron_frame.php:29
global $USER
Определения csv_new_run.php:40
IncludeModuleLangFile($filepath, $lang=false, $bReturnArray=false)
Определения tools.php:3778
GetMessage($name, $aReplace=null)
Определения tools.php:3397
sortByColumn(array &$array, $columns, $callbacks='', $defaultValueIfNotSetValue=null, $preserveKeys=false)
Определения tools.php:5087
$name
Определения menu_edit.php:35
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
$width
Определения html.php:68
if(!Loader::includeModule('sale')) $pattern
Определения index.php:20
$error
Определения subscription_card_product.php:20
$fields
Определения yandex_run.php:501