7use Bitrix\Sale\Location\Admin\LocationHelper as Helper;
33 $class = self::CONN_ENTITY_NAME.
'Table';
34 return $field.
" in (".$class::getConnectedEntitiesQuery(intval(
$val),
'id',
array(
'select' =>
array(
'ID'))).
")";
54 if($deliveryCode ==
'' || $deliveryCode ==
'0')
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"]
82 if ($isOrderConverted !=
'N'
83 && !empty($arOrder[
'ORDER_PROP']) && is_array($arOrder[
'ORDER_PROP']))
85 $arOrderTmpDel[
'PROPERTIES'] = $arOrder[
'ORDER_PROP'];
90 $arOrder[
"DELIVERY_ID"] = $deliveryCode;
91 $shipment = self::convertOrderOldToNew($arOrderTmpDel);
93 if(isset($arOrder[
"DELIVERY_EXTRA_SERVICES"]))
94 $shipment->setExtraServices($arOrder[
"DELIVERY_EXTRA_SERVICES"]);
96 $calculationResult =
$service->calculate($shipment);
98 if (!$calculationResult->isSuccess())
99 $arErrors[] =
array(
"CODE" =>
"CALCULATE",
"TEXT" => implode(
"<br>\n", $calculationResult->getErrorMessages()));
105 $arErrors[] =
array(
"CODE" =>
"CALCULATE",
"TEXT" =>
GetMessage(
'SKGD_DELIVERY_NOT_FOUND'));
122 $arMaxDimensions =
array();
124 foreach ($arShoppingCart as $arBasketItem)
126 if (!is_array($arBasketItem[
"DIMENSIONS"]))
128 $arDim = unserialize($arBasketItem[
"~DIMENSIONS"], [
'allowed_classes' =>
false]);
129 $arBasketItem[
"DIMENSIONS"] = $arDim;
130 unset($arBasketItem[
"~DIMENSIONS"]);
133 $arDim = $arBasketItem[
"DIMENSIONS"];
135 if (is_array($arDim))
138 array($arDim[
"WIDTH"], $arDim[
"HEIGHT"], $arDim[
"LENGTH"]),
145 "COMPABILITY" =>
array(
148 "LOCATION_FROM" => COption::GetOptionString(
'sale',
'location',
false,
$siteId),
150 "LOCATION_ZIP" => $locationZip,
151 "MAX_DIMENSIONS" => $arMaxDimensions,
152 "ITEMS" => $arShoppingCart
158 while ($arDeliveryService = $dbDeliveryServices->GetNext())
160 if (!is_array($arDeliveryService) || !is_array($arDeliveryService[
"PROFILES"]))
163 foreach ($arDeliveryService[
"PROFILES"] as $profileId => $arDeliveryProfile)
165 if ($arDeliveryProfile[
"ACTIVE"] !=
"Y")
168 if (!array_key_exists($arDeliveryService[
"SID"],
$arResult))
171 "SID" => $arDeliveryService[
"SID"],
172 "TITLE" => $arDeliveryService[
"NAME"],
173 "DESCRIPTION" => $arDeliveryService[
"~DESCRIPTION"],
174 "PROFILES" =>
array(),
178 $arResult[$arDeliveryService[
"SID"]][
"PROFILES"][$profileId] =
array(
179 "ID" => $arDeliveryService[
"SID"].
":".$profileId,
181 "TITLE" => $arDeliveryProfile[
"TITLE"],
182 "DESCRIPTION" => $arDeliveryProfile[
"~DESCRIPTION"],
183 "FIELD_NAME" =>
"DELIVERY_ID",
187 $arDeliveryService[
"SID"],
192 "LOCATION_FROM" => COption::GetOptionString(
'sale',
'location',
false,
$siteId),
194 "LOCATION_ZIP" => $locationZip,
195 "ITEMS" => $arShoppingCart
200 if ($arDeliveryPriceTmp[
"RESULT"] !=
"ERROR")
209 array(
"SORT" =>
"ASC",
"NAME" =>
"ASC"),
212 "+<=WEIGHT_FROM" => $weight,
213 "+>=WEIGHT_TO" => $weight,
214 "+<=ORDER_PRICE_FROM" => $price,
215 "+>=ORDER_PRICE_TO" => $price,
220 while ($arDelivery = $dbDelivery->GetNext())
223 $arDelivery[
"DESCRIPTION"] = $arDeliveryDescription[
"DESCRIPTION"];
225 $arDelivery[
"FIELD_NAME"] =
"DELIVERY_ID";
226 if (intval($arDelivery[
"PERIOD_FROM"]) > 0 || intval($arDelivery[
"PERIOD_TO"]) > 0)
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").
" ";
238 $arDelivery[
"PERIOD_TEXT"] .=
" ".GetMessage(
"SOA_DAY").
" ";
252 return $res->Fetch();
267 $locations =
array();
270 while($loc =
$res->Fetch())
274 if($oldDeliveryId ==
'')
277 $loc[
'DELIVERY_ID'] = $oldDeliveryId;
283 $locations =
array();
301 $GLOBALS[
"APPLICATION"]->ThrowException(
GetMessage(
"SKGD_EMPTY_DELIVERY"),
"ERROR_NO_NAME");
307 $GLOBALS[
"APPLICATION"]->ThrowException(
GetMessage(
"SKGD_EMPTY_SITE"),
"ERROR_NO_SITE");
326 $GLOBALS[
"APPLICATION"]->ThrowException(
GetMessage(
"SKGD_EMPTY_CURRENCY"),
"ERROR_NO_CURRENCY");
344 $GLOBALS[
"APPLICATION"]->ThrowException(
GetMessage(
"SKGD_EMPTY_LOCATION"),
"ERROR_NO_LOCATIONS");
350 $dbSite = CSite::GetByID(
$arFields[
"LID"]);
351 if (!$dbSite->Fetch())
362 $GLOBALS[
"APPLICATION"]->ThrowException(str_replace(
"#ID#",
$arFields[
"CURRENCY"],
GetMessage(
"SKGD_NO_CURRENCY")),
"ERROR_NO_CURRENCY");
370 for (
$i = 0;
$i < $countField;
$i++)
372 if (
$arFields[
"LOCATIONS"][
$i][
"LOCATION_TYPE"] !=
"G")
388 $class = self::CONN_ENTITY_NAME.
'Table';
390 $links = Helper::prepareLinksForSaving($class, $locations);
391 $class::resetMultipleForOwner(
$ID, $links);
402 $dbRes = Bitrix\Sale\Delivery\Services\Table::getList(
array(
405 "=CLASS_NAME" =>
'\Bitrix\Sale\Delivery\Services\Configurable'
409 $oldData =
$dbRes->fetch();
414 $newId = $oldData[
"ID"];
420 if(array_key_exists(
"LOGOTIP",
$fields) && is_array(
$fields[
"LOGOTIP"]))
422 $fields[
"LOGOTIP"][
"MODULE_ID"] =
"sale";
423 CFile::SaveForDB(
$fields,
"LOGOTIP",
"sale/delivery/logotip");
428 "PRICE" => isset(
$arFields[
"PRICE"]) ?
$arFields[
"PRICE"] : $oldData[
"CONFIG"][
"MAIN"][
"PRICE"],
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"]
439 if(!
$res->isSuccess())
444 Helper::resetLocationsForEntity($newId,
$arFields[
'LOCATIONS'], self::CONN_ENTITY_NAME, !!
$arOptions[
'EXPECT_LOCATION_CODES']);
452 "SERVICE_ID" => $newId,
453 "CLASS_NAME" =>
'\Bitrix\Sale\Delivery\Restrictions\BySite',
454 "SERVICE_TYPE" => \
Bitrix\Sale\Services\Base\RestrictionManager::SERVICE_TYPE_SHIPMENT,
460 $rstrRes = \Bitrix\Sale\Internals\ServiceRestrictionTable::getList(
array(
462 "=SERVICE_ID" => $newId,
463 "=SERVICE_TYPE" => \
Bitrix\Sale\Services\Base\RestrictionManager::SERVICE_TYPE_SHIPMENT,
464 "=CLASS_NAME" =>
'\Bitrix\Sale\Delivery\Restrictions\BySite'
468 if($restrict = $rstrRes->fetch())
469 $rres = \Bitrix\Sale\Internals\ServiceRestrictionTable::update($restrict[
"ID"], $rfields);
471 $rres = \Bitrix\Sale\Internals\ServiceRestrictionTable::add($rfields);
477 "SERVICE_ID" => $newId,
478 "SERVICE_TYPE" => \
Bitrix\Sale\Services\Base\RestrictionManager::SERVICE_TYPE_SHIPMENT,
479 "CLASS_NAME" =>
'\Bitrix\Sale\Delivery\Restrictions\BySite',
486 $rstrRes = \Bitrix\Sale\Internals\ServiceRestrictionTable::getList(
array(
488 "=SERVICE_ID" => $newId,
489 "=SERVICE_TYPE" => \
Bitrix\Sale\Services\Base\RestrictionManager::SERVICE_TYPE_SHIPMENT,
490 "=CLASS_NAME" =>
'\Bitrix\Sale\Delivery\Restrictions\BySite'
494 if($restrict = $rstrRes->fetch())
495 $rres = \Bitrix\Sale\Internals\ServiceRestrictionTable::update($restrict[
"ID"], $rfields);
497 $rres = \Bitrix\Sale\Internals\ServiceRestrictionTable::add($rfields);
503 "SERVICE_ID" => $newId,
504 "CLASS_NAME" =>
'\Bitrix\Sale\Delivery\Restrictions\ByWeight',
505 "SERVICE_TYPE" => \
Bitrix\Sale\Services\Base\RestrictionManager::SERVICE_TYPE_SHIPMENT,
512 $rstrRes = \Bitrix\Sale\Internals\ServiceRestrictionTable::getList(
array(
514 "=SERVICE_ID" => $newId,
515 "=SERVICE_TYPE" => \
Bitrix\Sale\Services\Base\RestrictionManager::SERVICE_TYPE_SHIPMENT,
516 "=CLASS_NAME" =>
'\Bitrix\Sale\Delivery\Restrictions\ByWeight'
520 if($restrict = $rstrRes->fetch())
524 $rres = \Bitrix\Sale\Internals\ServiceRestrictionTable::delete($restrict[
"ID"]);
529 $rfields[
"PARAMS"][
"MIN_WEIGHT"] = $restrict[
"PARAMS"][
"MIN_WEIGHT"];
532 $rfields[
"PARAMS"][
"MAX_WEIGHT"] = $restrict[
"PARAMS"][
"MAX_WEIGHT"];
534 $rres = \Bitrix\Sale\Internals\ServiceRestrictionTable::update($restrict[
"ID"], $rfields);
539 $rres = \Bitrix\Sale\Internals\ServiceRestrictionTable::add($rfields);
547 "SERVICE_ID" => $newId,
548 "CLASS_NAME" =>
'\Bitrix\Sale\Delivery\Restrictions\ByPrice',
549 "SERVICE_TYPE" => \
Bitrix\Sale\Services\Base\RestrictionManager::SERVICE_TYPE_SHIPMENT,
551 "MIN_PRICE" => isset(
$arFields[
"ORDER_PRICE_FROM"]) ?
$arFields[
"ORDER_PRICE_FROM"] : 0,
557 $rstrRes = \Bitrix\Sale\Internals\ServiceRestrictionTable::getList(
array(
559 "=SERVICE_ID" => $newId,
560 "=SERVICE_TYPE" => \
Bitrix\Sale\Services\Base\RestrictionManager::SERVICE_TYPE_SHIPMENT,
561 "=CLASS_NAME" =>
'\Bitrix\Sale\Delivery\Restrictions\ByPrice'
565 if($restrict = $rstrRes->fetch())
567 if(floatval(
$arFields[
"ORDER_PRICE_FROM"]) <= 0 && floatval(
$arFields[
"ORDER_PRICE_TO"]) <= 0 &&
$arFields[
"ORDER_CURRENCY"] ==
'')
569 $rres = \Bitrix\Sale\Internals\ServiceRestrictionTable::delete($restrict[
"ID"]);
573 if(!isset(
$arFields[
"ORDER_PRICE_FROM"]))
574 $rfields[
"PARAMS"][
"MIN_PRICE"] = $restrict[
"PARAMS"][
"MIN_PRICE"];
577 $rfields[
"PARAMS"][
"MAX_PRICE"] = $restrict[
"PARAMS"][
"MAX_PRICE"];
580 $rfields[
"PARAMS"][
"CURRENCY"] = $restrict[
"PARAMS"][
"CURRENCY"];
582 $rres = \Bitrix\Sale\Internals\ServiceRestrictionTable::update($restrict[
"ID"], $rfields);
587 $rres = \Bitrix\Sale\Internals\ServiceRestrictionTable::add($rfields);
593 $stores = unserialize(
$arFields[
"STORE"], [
'allowed_classes' =>
false]);
614 catch(\
Bitrix\Main\SystemException $e)
616 $GLOBALS[
"APPLICATION"]->ThrowException($e->getMessage());
637 array(
"DELIVERY_ID",
"PAYSYSTEM_ID"),
638 array(
"DELIVERY_ID",
"PAYSYSTEM_ID")
672 foreach(
$filter as $fName => $fValue)
673 if(preg_replace(
'/[^A-Z_]/',
'', $fName) == $fieldName)
686 $res = array_key_exists(preg_replace(
'/[^A-Z_]/',
'', $fieldName),
$filter);
700 if(preg_replace(
'/[^A-Z_]/',
'',
$key) == $fieldName)
733 foreach(
$filter as $fieldName => $fieldValue)
734 if(self::hasNewServiceField($fieldName))
735 $result[$fieldName] = $fieldValue;
746 if(!is_array($groupBy) || empty($groupBy))
752 foreach($groupBy as $group)
753 if(array_key_exists($group, $serviceFields))
775 if(array_key_exists(
$select, $serviceFields))
805 switch($restriction[
"CLASS_NAME"])
807 case '\Bitrix\Sale\Delivery\Restrictions\BySite':
815 if(is_array($restriction[
"PARAMS"][
"SITE_ID"]))
816 $result = in_array($value, $restriction[
"PARAMS"][
"SITE_ID"]);
818 $result = ($value == $restriction[
"PARAMS"][
"SITE_ID"]);
822 case '\Bitrix\Sale\Delivery\Restrictions\ByWeight':
827 case '\Bitrix\Sale\Delivery\Restrictions\ByPrice':
831 $value = floatval($value);
833 if($fieldInFilter && $value > 0 && floatval($restriction[
"PARAMS"][
"MIN_PRICE"]) > 0)
835 $result = floatval($value) > floatval($restriction[
"PARAMS"][
"MIN_PRICE"]);
843 $value = floatval($value);
845 if($fieldInFilter && $value > 0 && floatval($restriction[
"PARAMS"][
"MAX_PRICE"]) > 0)
847 $result = floatval($value) < floatval($restriction[
"PARAMS"][
"MAX_PRICE"]);
856 if($fieldInFilter && $value <>
'' && $restriction[
"PARAMS"][
"CURRENCY"] <>
'')
858 $result = ($value == $restriction[
"PARAMS"][
"CURRENCY"]);
866 case '\Bitrix\Sale\Delivery\Restrictions\ByLocation':
870 if($fieldInFilter && $value <>
'' && $restriction[
'SERVICE_ID'] > 0)
875 intval($restriction[
'SERVICE_ID']),
878 'LOCATION_LINK_TYPE' =>
'CODE'
882 catch(\
Bitrix\Sale\Location\Tree\NodeNotFoundException $e)
892 return \Bitrix\Sale\Delivery\DeliveryLocationTable::checkConnectionExists(
893 intval($restriction[
'SERVICE_ID']),
896 'LOCATION_LINK_TYPE' =>
'ID'
900 catch(\
Bitrix\Sale\Location\Tree\NodeNotFoundException $e)
925 switch($restriction[
"CLASS_NAME"])
927 case '\Bitrix\Sale\Delivery\Restrictions\BySite':
929 if(self::isFieldSelected(
"LID", $selectedFields))
931 $lids = $restriction[
"PARAMS"][
"SITE_ID"];
936 $fields[
"LID"] = current($lids);
946 case '\Bitrix\Sale\Delivery\Restrictions\ByWeight':
948 if(self::isFieldSelected(
"WEIGHT_FROM", $selectedFields))
949 $fields[
"WEIGHT_FROM"] = $restriction[
"PARAMS"][
"MIN_WEIGHT"];
951 if(self::isFieldSelected(
"WEIGHT_TO", $selectedFields))
952 $fields[
"WEIGHT_TO"] = $restriction[
"PARAMS"][
"MAX_WEIGHT"];
956 case '\Bitrix\Sale\Delivery\Restrictions\ByPrice':
958 if(self::isFieldSelected(
"ORDER_PRICE_FROM", $selectedFields))
959 $fields[
"ORDER_PRICE_FROM"] = $restriction[
"PARAMS"][
"MIN_PRICE"];
961 if(self::isFieldSelected(
"ORDER_PRICE_TO", $selectedFields))
962 $fields[
"ORDER_PRICE_TO"] = $restriction[
"PARAMS"][
"MAX_PRICE"];
964 if(self::isFieldSelected(
"ORDER_CURRENCY", $selectedFields))
965 $fields[
"ORDER_CURRENCY"] = $restriction[
"PARAMS"][
"CURRENCY"];
989 public static function GetList($arOrder =
array(
"SORT" =>
"ASC",
"NAME" =>
"ASC"),
$arFilter =
array(), $arGroupBy =
false, $arNavStartParams =
false, $arSelectFields =
array(
'*'))
991 if(empty($arSelectFields))
992 $arSelectFields =
array(
'*');
995 'order' => self::convertFilterOldToNew($arOrder),
996 'filter' => self::convertFilterOldToNew(
$arFilter),
997 'group' => self::convertGroupOldToNew($arGroupBy),
998 'select' => self::convertSelectOldToNew($arSelectFields)
1001 $services =
array();
1002 $params[
'filter'][
'=CLASS_NAME'] =
'\Bitrix\Sale\Delivery\Services\Configurable';
1003 $dbRes = \Bitrix\Sale\Delivery\Services\Table::getList(
$params);
1023 $dbRstrRes = \Bitrix\Sale\Internals\ServiceRestrictionTable::getList(
array(
1026 "=SERVICE_TYPE" => \
Bitrix\Sale\Services\Base\RestrictionManager::SERVICE_TYPE_SHIPMENT
1030 while($restr = $dbRstrRes->fetch())
1032 if(!self::checkRestrictionFilter($restr,
$arFilter))
1038 $selectAsterisk = in_array(
'*', $arSelectFields);
1039 $mofifiedFields =
array(
"LID",
"WEIGHT_FROM",
"WEIGHT_TO",
"ORDER_PRICE_FROM",
"ORDER_PRICE_TO",
"ORDER_CURRENCY");
1041 foreach($mofifiedFields as $field)
1042 if(($selectAsterisk || in_array($field, $arSelectFields)) && !array_key_exists($field,
$service))
1045 if($selectAsterisk || in_array(
"PERIOD_FROM", $arSelectFields))
1048 if($selectAsterisk || in_array(
"PERIOD_TO", $arSelectFields))
1051 if($selectAsterisk || in_array(
"PERIOD_TYPE", $arSelectFields))
1054 if($selectAsterisk || in_array(
"PRICE", $arSelectFields))
1056 $service[
"CLASS_NAME"] =
'\Bitrix\Sale\Delivery\Services\Configurable';
1061 $res = $tmpSrv->calculate();
1070 if($selectAsterisk || in_array(
"STORE", $arSelectFields))
1073 $service[
"STORE"] =
count($stores) > 0 ? serialize($stores) :
"";
1083 if(!empty($arOrder))
1085 foreach($arOrder as
$k => $v)
1088 $arOrder[
$k] = SORT_ASC;
1090 $arOrder[
$k] = SORT_DESC;
1097 $result->InitFromArray($services);
1115 $arFields[
"LOGOTIP"][
"MODULE_ID"] =
"sale";
1116 CFile::SaveForDB(
$arFields,
"LOGOTIP",
"sale/delivery/logotip");
1121 $fields[
"CLASS_NAME"] =
'\Bitrix\Sale\Delivery\Services\Configurable';
1133 $res = \Bitrix\Sale\Delivery\Services\Manager::add(
$fields);
1135 if(!
$res->isSuccess())
1138 $newId =
$res->getId();
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',
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',
1161 "MIN_WEIGHT" =>
$arFields[
"WEIGHT_FROM"],
1167 if(intval(
$arFields[
"ORDER_PRICE_FROM"]) > 0 || intval(
$arFields[
"ORDER_PRICE_TO"]) > 0)
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',
1174 "MIN_PRICE" =>
$arFields[
"ORDER_PRICE_FROM"],
1175 "MAX_PRICE" =>
$arFields[
"ORDER_PRICE_TO"],
1176 "CURRENCY" =>
$arFields[
"ORDER_CURRENCY"]
1183 Helper::resetLocationsForEntity($newId,
$arFields[
'LOCATIONS'], self::CONN_ENTITY_NAME, !!
$arOptions[
'EXPECT_LOCATION_CODES']);
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',
1198 $stores = unserialize(
$arFields[
"STORE"], [
'allowed_classes' =>
false]);
1210 $result = new \Bitrix\Sale\Result();
1214 if(!in_array(
$type,
array(
'mssql',
'mysql',
'oracle')))
1216 $result->addError(
new \
Bitrix\Main\Error(
'Wrong connection type!'));
1224 "CREATE TABLE B_SALE_DELIVERY2LOCATION_TMP
1226 DELIVERY_ID int NOT NULL,
1227 LOCATION_CODE varchar(100) NOT NULL,
1228 LOCATION_TYPE char(1) NOT NULL
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"
1238 "create table if not exists b_sale_delivery2location_tmp
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)
1250 "CREATE TABLE B_SALE_DELIVERY2LOCATION_TMP
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)
1262 $con->queryExecute($q);
1276 $result = new \Bitrix\Sale\Result();
1279 if(!
$con->isTableExists(
"b_sale_delivery"))
1282 if(!
$con->isTableExists(
"b_sale_delivery2location_tmp"))
1286 if(!
$res->isSuccess())
1292 $con->queryExecute(
'
1294 b_sale_delivery2location_tmp(DELIVERY_ID, LOCATION_CODE, LOCATION_TYPE)
1296 DELIVERY_ID, LOCATION_CODE, LOCATION_TYPE FROM b_sale_delivery2location
1299 $con->queryExecute(
'DELETE FROM b_sale_delivery2location');
1302 $sqlHelper =
$con->getSqlHelper();
1303 $deliveryRes =
$con->query(
'SELECT * FROM b_sale_delivery WHERE CONVERTED != \'Y\'');
1305 while($delivery = $deliveryRes->fetch())
1307 $delivery[
"CODE"] = $delivery[
"ID"];
1308 unset($delivery[
"ID"]);
1312 if(intval($newId) <= 0)
1314 $result->addError(
new \
Bitrix\Main\Entity\EntityError(
"Can't convert old delivery id: ".$delivery[
"CODE"]));
1318 if(!
$res->isSuccess())
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"]).
"'");
1326 $con->queryExecute(
'
1328 b_sale_delivery2location(DELIVERY_ID, LOCATION_CODE, LOCATION_TYPE)
1330 '.$sqlHelper->forSql($newId).
', LOCATION_CODE, LOCATION_TYPE FROM b_sale_delivery2location_tmp
1332 DELIVERY_ID = '.$sqlHelper->forSql($delivery[
"CODE"]).
'
1335 $con->queryExecute(
'DELETE FROM b_sale_delivery2location_tmp WHERE DELIVERY_ID = '.$sqlHelper->forSql($delivery[
"CODE"]));
1337 $d2pRes = \Bitrix\Sale\Internals\DeliveryPaySystemTable::getList(
array(
1339 'DELIVERY_ID' => $newId
1341 'select' =>
array(
"DELIVERY_ID"),
1342 'group' =>
array(
"DELIVERY_ID")
1345 if($d2p = $d2pRes->fetch())
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',
1354 if(!
$res->isSuccess())
1361 $con->dropTable(
'b_sale_delivery2location_tmp');
1364 $con->renameTable(
"b_sale_delivery",
"b_sale_delivery_old");
1399 $result = new \Bitrix\Sale\Result();
1402 if(!
$con->isTableExists(
"b_sale_delivery2paysystem"))
1405 $query = new \Bitrix\Main\Entity\Query(DeliveryPaySystemTable::getEntity());
1407 $query->addFilter(
'LINK_DIRECTION', NULL);
1414 $con->queryExecute(
'UPDATE b_sale_delivery2paysystem SET LINK_DIRECTION=\''.DeliveryPaySystemTable::LINK_DIRECTION_DELIVERY_PAYSYSTEM.
'\'');
1415 $res = DeliveryPaySystemTable::getList(
array());
1417 while($rec =
$res->fetch())
1420 $rec[
"LINK_DIRECTION"] = DeliveryPaySystemTable::LINK_DIRECTION_PAYSYSTEM_DELIVERY;
1421 DeliveryPaySystemTable::Add($rec);
1432 public static function convertOrderNewToOld(\
Bitrix\Sale\Shipment $shipment)
1435 $shipmentCollection = $shipment->getCollection();
1437 $newOrder = $shipmentCollection->getOrder();
1438 $props = $newOrder->getPropertyCollection();
1439 $oldOrder =
array();
1441 if(intval($newOrder->getId()) > 0)
1442 $oldOrder[
"ID"] = $newOrder->getId();
1445 if($collection = $shipment->getShipmentItemCollection())
1446 $oldOrder[
"PRICE"] = $collection->getPrice();
1452 $newOrder->getSiteId());
1453 $oldOrder[
"SITE_ID"] = $newOrder->getSiteId();
1454 $oldOrder[
"PERSON_TYPE_ID"] = $newOrder->getPersonTypeId();
1455 $oldOrder[
"CURRENCY"] = $newOrder->getCurrency();
1457 $loc =
$props->getDeliveryLocation();
1458 $oldOrder[
"LOCATION_TO"] = !!$loc ? $loc->getValue() :
"";
1460 $loc =
$props->getDeliveryLocationZip();
1461 $oldOrder[
"LOCATION_ZIP"] = !!$loc ? $loc->getValue() :
"";
1463 $oldOrder[
"ITEMS"] =
array();
1466 foreach($shipment->getShipmentItemCollection() as $shipmentItem)
1468 $basketItem = $shipmentItem->getBasketItem();
1473 if($basketItem->isBundleChild())
1476 $itemFieldValues = $basketItem->getFieldValues();
1477 $itemFieldValues[
"QUANTITY"] = $shipmentItem->getField(
"QUANTITY");
1479 if(!empty($itemFieldValues[
"DIMENSIONS"]) && is_string($itemFieldValues[
"DIMENSIONS"]))
1480 $itemFieldValues[
"DIMENSIONS"] = unserialize($itemFieldValues[
"DIMENSIONS"], [
'allowed_classes' =>
false]);
1482 unset($itemFieldValues[
'DATE_INSERT'], $itemFieldValues[
'DATE_UPDATE']);
1483 $oldOrder[
"ITEMS"][] = $itemFieldValues;
1484 $oldOrder[
"WEIGHT"] = $shipment->getWeight();
1495 public static function convertOrderOldToNew(
array $oldOrder)
1497 $siteId = isset($oldOrder[
"SITE_ID"]) ? $oldOrder[
"SITE_ID"] :
SITE_ID;
1499 $registry = \Bitrix\Sale\Registry::getInstance(\Bitrix\Sale\Registry::REGISTRY_TYPE_ORDER);
1502 $orderClass = $registry->getOrderClassName();
1504 $newOrder = $orderClass::create(
$siteId,
null, $oldOrder[
"CURRENCY"]);
1505 $isStartField = $newOrder->isStartField();
1507 if(!empty($oldOrder[
"PERSON_TYPE_ID"]) && intval($oldOrder[
"PERSON_TYPE_ID"]) > 0)
1509 $personTypeId = $oldOrder[
"PERSON_TYPE_ID"];
1513 $dbPersonType = \CSalePersonType::GetList(
array(
"SORT" =>
"ASC",
"NAME" =>
"ASC"),
array(
"ACTIVE" =>
"Y",
"LID"=>
$siteId));
1515 if($arPersonType = $dbPersonType->GetNext())
1516 $personTypeId = $arPersonType[
"ID"];
1521 $newOrder->setPersonTypeId($personTypeId);
1522 $newOrder->setFieldNoDemand(
"PRICE", $oldOrder[
"PRICE"]);
1525 $basketClass = $registry->getBasketClassName();
1527 $basket = $basketClass::create(
$siteId);
1528 $settableFields = array_flip(\Bitrix\Sale\BasketItemBase::getSettableFields());
1530 if (!empty($oldOrder[
"ITEMS"]) && is_array($oldOrder[
"ITEMS"]))
1532 foreach($oldOrder[
"ITEMS"] as $oldBasketItem)
1535 if (!empty($oldBasketItem[
'ID']) && intval($oldBasketItem[
'ID']) > 0)
1536 $basketId = $oldBasketItem[
'ID'];
1538 $newBasketItem = \Bitrix\Sale\BasketItem::create($basket, $oldBasketItem[
'MODULE'], $oldBasketItem[
'PRODUCT_ID']);
1539 $oldBasketItem = array_intersect_key($oldBasketItem, $settableFields);
1541 $newBasketItem->setFieldsNoDemand($oldBasketItem);
1544 $newBasketItem->setFieldNoDemand(
'ID', $basketId);
1546 if ($newBasketItem->isBundleChild())
1548 $basket->addItem($newBasketItem);
1552 $props = $newOrder->getPropertyCollection();
1554 if (!empty($oldOrder[
'PROPERTIES']) && is_array($oldOrder[
'PROPERTIES']))
1556 $r =
$props->setValuesFromPost($oldOrder, $_FILES);
1559 $newOrder->setBasket($basket);
1562 if($loc =
$props->getDeliveryLocation())
1563 $loc->setValue($oldOrder[
"LOCATION_TO"]);
1565 if($loc =
$props->getDeliveryLocationZip())
1566 $loc->setValue($oldOrder[
"LOCATION_ZIP"]);
1569 $shipmentCollection = $newOrder->getShipmentCollection();
1570 $shipment = $shipmentCollection->createItem();
1571 $shipment->setField(
"CURRENCY", $oldOrder[
"CURRENCY"]);
1572 $shipmentItemCollection = $shipment->getShipmentItemCollection();
1574 foreach($newOrder->getBasket() as $item)
1576 $shipmentItem = $shipmentItemCollection->createItem($item);
1577 $shipmentItem->setQuantity($item->getQuantity());
1579 if($shipmentItem->getField(
"DIMENSIONS") <>
'')
1581 $shipmentItem->setField(
"DIMENSIONS", unserialize($shipmentItem->getField(
"DIMENSIONS"), [
'allowed_classes' =>
false]));
1585 if (isset($arOrder[
"DELIVERY_EXTRA_SERVICES"]))
1586 $shipment->setExtraServices($arOrder[
"DELIVERY_EXTRA_SERVICES"]);
1606 $fields[
"CLASS_NAME"] =
'\Bitrix\Sale\Delivery\Services\EmptyDeliveryService';
1611 'CURRENCY' =>
'RUB',
1620 $res = \Bitrix\Sale\Delivery\Services\Manager::add(
$fields);
1621 $id =
$res->getId();
1624 'SERVICE_ID' => $id,
1625 'SERVICE_TYPE' => \
Bitrix\Sale\Delivery\Restrictions\Manager::SERVICE_TYPE_SHIPMENT,
1627 'PUBLIC_SHOW' =>
'N'
1630 $rstrPM = new \Bitrix\Sale\Delivery\Restrictions\ByPublicMode();
1657 if(intval($id) <= 0)
1663 $code =
'new'.strval($id).
':profile';
static getConnection($name="")
static get($moduleId, $name, $default="", $siteId=false)
static loadLanguageFile($file, $language=null, $normalize=true)
static getMessage($code, $replace=null, $language=null)
static getEmptyDeliveryServiceId()
static getObjectById($deliveryId)
static delete($id, bool $checkServiceUsage=true)
static getIdByCode($code)
static getObjectByCode($serviceCode)
static update($id, array $fields)
static getPooledObject(array $fields)
static checkConnectionExists($entityPrimary, $locationPrimary, array $behaviour=array('LOCATION_LINK_TYPE'=> 'ID'))
static GetByID($currency)
static getIdFromNewSid($sid)
static CalculateFull($SID, $profile, $arOrder, $currency, $SITE_ID=false)
static GetList($arSort=array("SORT"=> "ASC"), $arFilter=array())
static isFieldSelected($fieldName, array $select)
static GetDelivery2PaySystem($arFilter=array())
static isFieldInFilter2($fieldName, $filter)
static isFieldInFilter($fieldName, $filter)
static convertPSRelationsAgent()
static GetList($arOrder=array("SORT"=> "ASC", "NAME"=> "ASC"), $arFilter=array(), $arGroupBy=false, $arNavStartParams=false, $arSelectFields=array(' *'))
static createNoDeliveryServiceAgent()
static hasNewServiceField($name)
static convertFilterOldToNew(array $filter=array())
static convertToNewAgent($renameTable=false)
static GetLocationList($arFilter=Array())
static getIdByCode($code)
static Add($arFields, $arOptions=array())
static CheckFields($ACTION, &$arFields)
static convertGroupOldToNew($groupBy)
static SetDeliveryLocationPro($ID, $locations)
static UpdateDeliveryPay($ID, $arFields)
static convertPSRelations()
static getFilterValue($fieldName, $filter)
static PrepareLocation24Where($val, $key, $operation, $negative, $field, &$arField, &$arFilter)
static DoLoadDelivery($location, $locationZip, $weight, $price, $currency, $siteId=null, $arShoppingCart=array())
static DoProcessOrder(&$arOrder, $deliveryCode, &$arErrors)
static convertSelectOldToNew(array $selectFields=array())
static checkRestrictionFilter(array $restriction, array $filter)
static Update($oldId, $arFields, $arOptions=array())
static getSelectedRestrictionField(array $service, array $restriction, array $selectedFields)
static convertToNew($renameTable=false)
static getDenormalizedLocationList($entityName, $arFilter=array())
static GetList($arFilter=array(), $arGroupBy=false, $arSelectFields=array())
static UpdateDelivery($ID, $arFields)
static getMaxDimensions($arDim1, $arDim2)
</td ></tr ></table ></td ></tr >< tr >< td class="bx-popup-label bx-width30"><?=GetMessage("PAGE_NEW_TAGS")?> array( $site)
$_SERVER["DOCUMENT_ROOT"]
if(!is_null($config))($config as $configItem)(! $configItem->isVisible()) $code
IncludeModuleLangFile($filepath, $lang=false, $bReturnArray=false)
GetMessage($name, $aReplace=null)
sortByColumn(array &$array, $columns, $callbacks='', $defaultValueIfNotSetValue=null, $preserveKeys=false)
if( $daysToExpire >=0 &&$daysToExpire< 60 elseif)( $daysToExpire< 0)
if(empty($signedUserToken)) $key
</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."%"
if($inWords) echo htmlspecialcharsbx(Number2Word_Rus(roundEx($totalVatSum $params['CURRENCY']
const SALE_VALUE_PRECISION
$GLOBALS['_____370096793']