19 static $arRegions =
array();
20 $flipIndex = intval($bFlip);
22 $countryId = (int)$countryId;
24 if(isset($arRegions[$countryId][$flipIndex]))
25 return $arRegions[$countryId][$flipIndex];
30 $res = Location\TypeTable::getList([
36 while($item =
$res->fetch())
38 $types[$item[
'CODE']] = $item[
'ID'];
51 '=TYPE_ID' => $types[
'CITY'] ??
null,
52 '=NAME.LANGUAGE_ID' => LANGUAGE_ID,
56 '=PARENT.TYPE_ID' => $types[
'COUNTRY'] ?? null
59 '=PARENT.TYPE_ID' => $types[
'COUNTRY_DISTRICT'] ?? null
67 '=TYPE_ID' => $types[
'REGION'] ??
null,
74 $filter[
'=PARENTS.TYPE_ID'] = $types[
'COUNTRY'] ??
null;
75 $filter[
'=PARENTS.ID'] = $countryId;
78 $dbRegionList = Location\LocationTable::getList([
83 'NAME_LANG' =>
'NAME.NAME',
96 $arFilterRegion[
"COUNTRY_ID"] = $countryId;
104 while ($arRegionList = $dbRegionList->Fetch())
106 if(
$key ==
'ID' && isset($arRegionList[
'CODE']))
111 if(
$key ==
'CODE' && $arRegionList[
'CODE'] ==
'')
116 $arRegions[$countryId][0][$arRegionList[
$key]] = $arRegionList[
"NAME_LANG"];
117 $arRegions[$countryId][1][$arRegionList[
"NAME_LANG"]] = $arRegionList[
$key];
120 return $arRegions[$countryId][$flipIndex] ?? [];
204 public static function getRequiredPacks(&$arItems, $arPacks, $maxWeight, $reservedSpace = 0.15)
211 $FIRST_PACK = key($arPacks);
217 $arResultPacksParams =
array();
220 isset($arPacks[$FIRST_PACK][
'DIMENSIONS'][$P_WIDTH_IDX])
222 isset($arPacks[$FIRST_PACK][
'DIMENSIONS'][$P_HEIGHT_IDX])
224 isset($arPacks[$FIRST_PACK][
'DIMENSIONS'][$P_LENGTH_IDX]))
226 $packVolume = $arPacks[$FIRST_PACK][
'DIMENSIONS'][$P_WIDTH_IDX]*$arPacks[$FIRST_PACK][
'DIMENSIONS'][$P_HEIGHT_IDX]*$arPacks[$FIRST_PACK][
'DIMENSIONS'][$P_LENGTH_IDX];
229 if(is_array($arItems))
231 $arTmpItems =
array();
233 foreach ($arItems as $itemId => $item)
236 $arTmpItems[$item[
"PRODUCT_ID"]][
"WEIGHT"] = $item[
"WEIGHT"];
237 $arTmpItems[$item[
"PRODUCT_ID"]][
"PRICE"] = $item[
"PRICE"];
240 $arTmpItems[$item[
"PRODUCT_ID"]][
"SET_PARENT_ID"] = $item[
"SET_PARENT_ID"] ??
null;
241 $arTmpItems[$item[
"PRODUCT_ID"]][
"TYPE"] = $item[
"TYPE"];
244 && (
int)$item[
'DIMENSIONS'][
'LENGTH'] > 0
245 && (
int)$item[
'DIMENSIONS'][
'WIDTH'] > 0
246 && (
int)$item[
'DIMENSIONS'][
'HEIGHT'] > 0
250 (int)$item[
'DIMENSIONS'][
'LENGTH'],
251 (
int)$item[
'DIMENSIONS'][
'WIDTH'],
252 (int)$item[
'DIMENSIONS'][
'HEIGHT']
256 if($item[
"QUANTITY"] > 1)
258 for (
$i=$item[
"QUANTITY"];
$i > 1 ;
$i--)
260 $arTmpItems[$item[
"PRODUCT_ID"].
"_".
$i] = $arTmpItems[$item[
"PRODUCT_ID"]];
262 (int)$item[
'DIMENSIONS'][
'LENGTH'],
263 (
int)$item[
'DIMENSIONS'][
'WIDTH'],
264 (int)$item[
'DIMENSIONS'][
'HEIGHT']
271 foreach ($arTmpItems as $id => $item)
274 $arTmpItems[$item[
"SET_PARENT_ID"]][
"VOLUME"] += $item[
"VOLUME"];
278 foreach ($arTmpItems as $id => $item)
281 unset($arTmpItems[$id]);
284 if(!empty($arTmpItems))
287 "VOLUME" =>
array(SORT_NUMERIC, SORT_DESC),
288 "WEIGHT" =>
array(SORT_NUMERIC, SORT_DESC),
292 $tmpPackageVolume = 0;
293 $tmpPackageWeight = 0;
294 $tmpPackagePrice = 0;
296 foreach ($arTmpItems as $arItem)
302 $arItem[
"VOLUME"] > $packVolume
308 $arItem[
"WEIGHT"] > $maxWeight
315 $correctCoeff = $tmpPackageVolume > 0 ? (1 - $reservedSpace) : 1;
321 $tmpPackageVolume + $arItem[
"VOLUME"] <= $packVolume*$correctCoeff
327 $tmpPackageWeight + $arItem[
"WEIGHT"] <= $maxWeight
331 $tmpPackageVolume += $arItem[
"VOLUME"];
332 $tmpPackageWeight += $arItem[
"WEIGHT"];
333 $tmpPackagePrice += $arItem[
"PRICE"];
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]
347 $tmpPackageVolume = $arItem[
"VOLUME"];
348 $tmpPackageWeight = $arItem[
"WEIGHT"];
349 $tmpPackagePrice = $arItem[
"PRICE"];
354 $arResultPacksParams[$packCount-1] =
array();
355 $arResultPacksParams[$packCount-1][
"WEIGHT"] = $tmpPackageWeight;
356 $arResultPacksParams[$packCount-1][
"PRICE"] = $tmpPackagePrice;
358 if($packCount == 1 && $packVolume <= 0 && !empty($itemsDims))
361 $arResultPacksParams[$packCount-1][
"DIMENSIONS"] =
array(
362 "WIDTH" => $dimensions[0],
363 "HEIGHT" => $dimensions[1],
364 "LENGTH" => $dimensions[2],
367 $volume = $dimensions[0]*$dimensions[1]*$dimensions[2];
369 if($tmpPackageVolume < $volume)
371 $tmpPackageVolume = $volume;
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]
383 $arResultPacksParams[$packCount-1][
"VOLUME"] = intval($packVolume) > 0 ? $packVolume : $tmpPackageVolume;
387 return $arResultPacksParams;
545 $arOrder = CSaleOrder::GetById(
$orderId);
549 if(!array_key_exists($actionId, $handlerActions))
553 "TEXT" =>
GetMessage(
"SALE_DHLP_HANDLER_HAS_NO_ACTION")
557 $dt = new \Bitrix\Main\Type\DateTime();
558 $depList = \Bitrix\Sale\Internals\OrderDeliveryReqTable::getList(
array(
562 $dep = $depList->fetch();
564 if($dep && !is_null($dep[
"DATE_REQUEST"]))
568 "TEXT" =>
GetMessage(
"SALE_DHLP_HANDLER_REQUEST_ALREADY_SENT")
574 $arUserGroups =
$USER->GetUserGroupArray();
575 $arOrder[
"ITEMS"] =
array();
578 array(
"SET_PARENT_ID" =>
"DESC",
"TYPE" =>
"DESC",
"NAME" =>
"ASC"),
582 while ($arItem = $dbItemsList->GetNext())
584 $arItem[
"DIMENSIONS"] = unserialize($arItem[
"~DIMENSIONS"], [
'allowed_classes' =>
false]);
585 unset($arItem[
"~DIMENSIONS"]);
586 $arOrder[
"ITEMS"][] = $arItem;
591 if($actionId ==
"REQUEST_SELF" && isset(
$arResult[
"TRACKING_NUMBER"]))
595 if ($bUserCanEditOrder)
599 \Bitrix\Sale\Internals\OrderDeliveryReqTable::update(
602 "DATE_REQUEST" => $dt
608 \Bitrix\Sale\Internals\OrderDeliveryReqTable::add(
611 "DATE_REQUEST" => $dt
624 $fields[
"DELIVERY_DOC_DATE"] =
Date(
$DB->DateFormatToPHP(CLang::GetDateFormat(
"SHORT", $arOrder[
"LID"])));