%PDF- %PDF-
Direktori : /home/bitrix/www/bitrix/modules/sale/handlers/delivery/additional/ |
Current File : //home/bitrix/www/bitrix/modules/sale/handlers/delivery/additional/handler.php |
<?php namespace Sale\Handlers\Delivery; use Bitrix\Main\Error, Bitrix\Main\Loader, Bitrix\Main\IO\File, Bitrix\Sale\Shipment, Bitrix\Main\Page\Asset, Bitrix\Main\Config\Option, Bitrix\Main\SystemException, Bitrix\Main\Localization\Loc, Bitrix\Main\ArgumentNullException, Bitrix\Sale\Delivery\Services\Base, Bitrix\Sale\Delivery\ExtraServices, Bitrix\Sale\Location\ExternalTable, Bitrix\Sale\Location\LocationTable, Bitrix\Sale\Delivery\Services\Manager, Bitrix\Sale\Delivery\ExtraServices\Table, Bitrix\Sale\Location\Admin\LocationHelper, Sale\Handlers\Delivery\Additional\Location, Sale\Handlers\Delivery\Additional\RestClient, Bitrix\Sale\Internals\ServiceRestrictionTable, Sale\Handlers\Delivery\Additional\DeliveryRequests\RusPost; Loc::loadMessages(__FILE__); Loader::registerAutoLoadClasses( 'sale', array( __NAMESPACE__.'\Additional\Action' => 'handlers/delivery/additional/action.php', __NAMESPACE__.'\AdditionalProfile' => 'handlers/delivery/additional/profile.php', __NAMESPACE__.'\Additional\Location' => 'handlers/delivery/additional/location.php', __NAMESPACE__.'\Additional\CacheManager' => 'handlers/delivery/additional/cache.php', __NAMESPACE__.'\Additional\RestClient' => 'handlers/delivery/additional/restclient.php', __NAMESPACE__.'\Additional\RusPost\Helper' => 'handlers/delivery/additional/ruspost/helper.php', __NAMESPACE__.'\Additional\DeliveryRequests\RusPost\Handler' => 'handlers/delivery/additional/deliveryrequests/ruspost/handler.php', ) ); /** * Class AdditionalHandler * Allows to use additional delivery services * @package Sale\Handlers\Delivery */ class AdditionalHandler extends Base { /** @var string The real type of the handler */ protected $serviceType = ""; protected static $canHasProfiles = true; protected static $whetherAdminExtraServicesShow = true; protected $trackingClass = '\Sale\Handlers\Delivery\AdditionalTracking'; protected $trackingTitle = ''; protected $trackingDescription = ''; protected $profilesListFull = null; protected $extraServicesList = null; const LOGO_FILE_ID_OPTION = 'handlers_dlv_add_lgotip'; /** * AdditionalHandler constructor. * @param array $initParams * @throws ArgumentNullException */ public function __construct(array $initParams) { parent::__construct($initParams); if(isset($initParams['SERVICE_TYPE']) && strlen($initParams['SERVICE_TYPE']) > 0) $this->serviceType = $initParams['SERVICE_TYPE']; elseif(isset($this->config["MAIN"]["SERVICE_TYPE"])) $this->serviceType = $this->config["MAIN"]["SERVICE_TYPE"]; if(strlen($this->serviceType) <= 0) throw new ArgumentNullException('initParams[SERVICE_TYPE]'); if($initParams['CONFIG']['MAIN']['SERVICE_TYPE'] == "RUSPOST") $this->setTrackingClass('\Bitrix\Sale\Delivery\Tracking\RusPost'); elseif(empty($this->config['MAIN']['TRACKING_TITLE'])) $this->trackingClass = ''; if(intval($this->id) <= 0) { $srvParams = $this->getServiceParams(); if(!empty($srvParams['NAME'])) $this->name = $srvParams['NAME']; if(!empty($srvParams['DESCRIPTION'])) $this->description = $srvParams['DESCRIPTION']; if(!empty($srvParams['LOGOTIP'])) $this->logotip = $srvParams['LOGOTIP']; } $this->deliveryRequestHandler = $this->getDeliveryRequestHandler(); } public function getDeliveryRequestHandler() { $result = null; if($this->serviceType == "RUSPOST") if(!empty($this->config["MAIN"]["OTPRAVKA_AUTH_TOKEN"]) && !empty($this->config["MAIN"]["OTPRAVKA_AUTH_KEY"])) $result = new RusPost\Handler($this); return $result; } /** * @return string Class title. */ public static function getClassTitle() { return Loc::getMessage("SALE_DLVRS_ADD_NAME"); } /** * @return string Class, service description. */ public static function getClassDescription() { return Loc::getMessage("SALE_DLVRS_ADD_DESCRIPTION"); } /** * @param Shipment $shipment * @throws SystemException * @return \Bitrix\Sale\Delivery\CalculationResult */ protected function calculateConcrete(Shipment $shipment) { throw new SystemException("Only Additional Profiles can calculate concrete"); } /** * @return array * @throws SystemException * todo: business values for default values */ protected function getConfigStructure() { $fields = $this->getServiceParams(); if(empty($fields)) throw new SystemException(Loc::getMessage('SALE_DLVRS_ADD_CONFIG_RECEIVE_ERROR')); $result = array( "MAIN" => array( "TITLE" => Loc::getMessage("SALE_DLVRS_ADD_MAIN_TITLE"), "DESCRIPTION" => Loc::getMessage("SALE_DLVRS_ADD_MAIN_DESCRIPTION"), "ITEMS" => array( "SERVICE_TYPE_NAME" => array( "TYPE" => "STRING", "NAME" => Loc::getMessage("SALE_DLVRS_ADD_SERVICE_TYPE"), "READONLY" => true, "DEFAULT" => $fields['NAME'] ), "SERVICE_TYPE" => array( "TYPE" => "STRING", "NAME" =>"SERVICE_TYPE", "HIDDEN" => true, "DEFAULT" => $this->serviceType ) ) ) ); if(!empty($fields['CONFIG']) && is_array($fields['CONFIG'])) { foreach($fields['CONFIG'] as $key => $params) { if($this->serviceType == "RUSPOST" && $this->id <= 0 && $key == 'SHIPPING_POINT') { continue; } $result['MAIN']['ITEMS'][$key] = $params; } } $result['MAIN']['ITEMS']["DEFAULT_VALUES"] = array( "TYPE" => "DELIVERY_SECTION", "NAME" =>Loc::getMessage('SALE_DLVRS_ADD_MAIN_DEFAULT_VALUES'), ); $result['MAIN']['ITEMS']["LENGTH_DEFAULT"] = array( "TYPE" => "STRING", "NAME" =>Loc::getMessage('SALE_DLVRS_ADD_MAIN_LENGTH_DEFAULT'), "DEFAULT" => 200 ); $result['MAIN']['ITEMS']["WIDTH_DEFAULT"] = array( "TYPE" => "STRING", "NAME" =>Loc::getMessage('SALE_DLVRS_ADD_MAIN_WIDTH_DEFAULT'), "DEFAULT" => 300 ); $result['MAIN']['ITEMS']["HEIGHT_DEFAULT"] = array( "TYPE" => "STRING", "NAME" =>Loc::getMessage('SALE_DLVRS_ADD_MAIN_HEIGHT_DEFAULT'), "DEFAULT" => 200 ); $result['MAIN']['ITEMS']["WEIGHT_DEFAULT"] = array( "TYPE" => "STRING", "NAME" =>Loc::getMessage('SALE_DLVRS_ADD_MAIN_WEIGHT_DEFAULT'), "DEFAULT" => 500 ); return $result; } /** * @return array Supported types of services. */ public static function getSupportedServicesList() { static $result = null; if($result === null) { $client = new RestClient(); $res = $client->getDeliveryList(); if($res->isSuccess()) { $result = $res->getData(); } else { $errors = array(); $notes = array(); /** @var Error $error */ foreach($res->getErrorCollection() as $error) { $message = $error->getMessage(); if($message == 'verification_needed. License check failed.') $notes[$error->getCode()] = Loc::getMessage('SALE_DLVRS_ADD_LIST_LICENSE_WRONG'); else $errors[$error->getCode()] = $message; } if(!empty($errors)) $result = array("ERRORS" => $errors); if(!empty($notes)) $result['NOTES'] = $notes; if(empty($errors) && empty($notes)) $errors[] = Loc::getMessage('SALE_DLVRS_ADD_LIST_RECEIVE_ERROR'); } } return $result; } /** * @return array */ protected function getServiceParams() { $result = array(); $client = new RestClient(); $res = $client->getDeliveryFields($this->serviceType); if($res->isSuccess()) { $logo = false; $logoId = intval($this->getLogoFileId()); if($logoId > 0) { $logo = \CFile::GetByID($logoId)->Fetch(); } $result = $res->getData(); if(($logoId <= 0 || !$logo) && !empty($result['LOGOTIP']['CONTENT']) && !empty($result['LOGOTIP']['NAME'])) { $tmpDir = \CTempFile::GetDirectoryName(); CheckDirPath($tmpDir); $filePath = $tmpDir."/".$result['LOGOTIP']['NAME']; $res = File::putFileContents( $filePath, base64_decode($result['LOGOTIP']['CONTENT']) ); if($res) { $file = \CFile::MakeFileArray($tmpDir."/".$result['LOGOTIP']['NAME']); $file['MODULE_ID'] = "sale"; $logoId = intval(\CFile::SaveFile($file, $filePath)); $this->setLogoFileId($logoId); } } $result['LOGOTIP'] = $logoId > 0 ? $logoId : 0; } return $result; } protected function getLogoFileId() { return intval(Option::get('sale', self::LOGO_FILE_ID_OPTION.'_'.$this->serviceType, '')); } protected function setLogoFileId($logoId) { if(intval($logoId) > 0) Option::set('sale', self::LOGO_FILE_ID_OPTION.'_'.$this->serviceType, $logoId); } /** * @return array */ public static function getChildrenClassNames() { return array( '\Sale\Handlers\Delivery\AdditionalProfile' ); } /** * @return array profiles ids and names */ public function getProfilesList() { $result =array(); $profiles = $this->getProfilesListFull(); foreach($profiles as $profileType => $profile) $result[$profileType] = $profile['NAME']; return $result; } public function getTrackingStatuses(array $trackingNumbers = array()) { $result = array(); $client = new RestClient(); $res = $client->getTrackingStatuses( $this->serviceType, AdditionalProfile::extractConfigValues($this->getConfig()), $trackingNumbers ); if($res->isSuccess()) { $data = $res->getData(); if(!empty($data['STATUSES']) && is_array($data['STATUSES'])) $result = $data['STATUSES']; } return $result; } public function getTrackingClassTitle() { return !empty($this->config['MAIN']['TRACKING_TITLE']) ? $this->config['MAIN']['TRACKING_TITLE'] : ''; } public function getTrackingClassDescription() { return !empty($this->config['MAIN']['TRACKING_DESCRIPTION']) ? $this->config['MAIN']['TRACKING_DESCRIPTION'] : ''; } /** * @return array All profile fields. */ public function getProfilesListFull() { if($this->profilesListFull === null) { $this->profilesListFull = array(); $client = new RestClient(); $res = $client->getDeliveryProfilesList($this->serviceType); if($res->isSuccess()) $this->profilesListFull = $res->getData(); } return $this->profilesListFull; } /** * @return bool */ public static function whetherAdminExtraServicesShow() { return self::$whetherAdminExtraServicesShow; } /** * @return string */ public function getServiceType() { return $this->serviceType; } /** * @param $shipment * @return array */ public function getCompatibleProfiles($shipment) { return $this->getProfilesList(); } /** * @return bool */ public static function canHasProfiles() { return self::$canHasProfiles; } /** * @param int $serviceId * @param array $fields * @return bool */ public static function onAfterAdd($serviceId, array $fields = array()) { if($serviceId <= 0) return false; $result = true; //Add profiles $fields["ID"] = $serviceId; $srv = new self($fields); $profiles = $srv->getProfilesListFull(); if(is_array($profiles) && !empty($profiles)) { foreach($profiles as $profileType => $pFields) { if(isset($pFields['DEFAULT_INSTALL_SKIP']) && $pFields['DEFAULT_INSTALL_SKIP'] == 'Y') continue; $profile = $srv->getProfileDefaultParams($profileType, $pFields); $res = Manager::add($profile); if($res->isSuccess() && !empty($pFields["RESTRICTIONS"]) && is_array($pFields["RESTRICTIONS"])) { $profileId = $res->getId(); foreach($pFields["RESTRICTIONS"] as $restrictionType => $params) { $srv->addRestriction($restrictionType, $profileId, $params); } } $result = $result && $res->isSuccess(); } } $extraservices = $srv->getEmbeddedExtraServicesList(); if(!empty($extraservices)) { //Add extra services foreach($extraservices as $code => $esFields) { $esFields['DELIVERY_ID'] = $serviceId; $esFields['CODE'] = $code; $res = Table::add($esFields); $result = $result && $res->isSuccess(); } } return $result; } /** * @param string $type * @param string $profileId * @param array $params * @throws \Exception */ protected function addRestriction($type, $profileId, array $params) { $fields = array(); switch($type) { case "WEIGHT": $p = array(); if(isset($params['MIN'])) $p['MIN_WEIGHT'] = $params['MIN']; if(isset($params['MAX'])) $p['MAX_WEIGHT'] = $params['MAX']; if(!empty($p)) { $fields = array( "SERVICE_ID" => $profileId, "CLASS_NAME" => '\Bitrix\Sale\Delivery\Restrictions\ByWeight', "SERVICE_TYPE" => \Bitrix\Sale\Services\Base\RestrictionManager::SERVICE_TYPE_SHIPMENT, "PARAMS" => $p ); } break; case "DIMENSIONS": $p = array(); if(isset($params['LENGTH'])) $p['LENGTH'] = $params['LENGTH']; if(isset($params['WIDTH'])) $p['WIDTH'] = $params['WIDTH']; if(isset($params['HEIGHT'])) $p['HEIGHT'] = $params['HEIGHT']; if(!empty($p)) { $fields = array( "SERVICE_ID" => $profileId, "CLASS_NAME" => '\Bitrix\Sale\Delivery\Restrictions\ByDimensions', "SERVICE_TYPE" => \Bitrix\Sale\Services\Base\RestrictionManager::SERVICE_TYPE_SHIPMENT, "PARAMS" => $p ); } break; case "MAX_SIZE": $p = array(); if(isset($params['MAX_SIZE']) && intval($params['MAX_SIZE']) > 0) $p['MAX_SIZE'] = $params['MAX_SIZE']; if(!empty($p)) { $fields = array( "SERVICE_ID" => $profileId, "CLASS_NAME" => '\Bitrix\Sale\Delivery\Restrictions\ByMaxSize', "SERVICE_TYPE" => \Bitrix\Sale\Services\Base\RestrictionManager::SERVICE_TYPE_SHIPMENT, "PARAMS" => $p ); } break; } if(!empty($fields)) ServiceRestrictionTable::add($fields); } /** * @param string $type * @param array $fields * @return array */ protected function getProfileDefaultParams($type, array $fields) { if(isset($fields["ACTIVE"])) $active = $fields["ACTIVE"]; else $active = $this->active ? "Y" : "N"; if(isset($fields["SORT"])) $sort = $fields["SORT"]; else $sort = $this->sort; $result = array( "CODE" => "", "PARENT_ID" => $this->id, "NAME" => $fields["NAME"], "ACTIVE" => $active, "SORT" => $sort, "DESCRIPTION" => $fields["DESCRIPTION"], "CLASS_NAME" => '\Sale\Handlers\Delivery\AdditionalProfile', "CURRENCY" => $this->currency, "CONFIG" => array( "MAIN" => array( "PROFILE_TYPE" => $type, "NAME" => $fields["NAME"], "DESCRIPTION" => $fields["DESCRIPTION"] ) ) ); if(!empty($fields["MODE"])) $result['CONFIG']['MAIN']["MODE"] = $fields["MODE"]; if(!empty($fields['DEFAULT']['MAIN'])) $result['CONFIG']['MAIN'] = array_merge($result['CONFIG']['MAIN'], $fields['DEFAULT']['MAIN']); return $result; } public function getAdminMessage() { $result = array(); $message = ''; if($this->isLicenseWrong()) $message = Loc::getMessage('SALE_DLVRS_ADD_LICENSE_WRONG'); elseif(!Location::isInstalled() && !empty($_REQUEST['ID'])) $message = Loc::getMessage('SALE_DLVRS_ADD_LOC_INSTALL'); if(strlen($message) > 0) { $result = array( "DETAILS" => $message, "TYPE" => "ERROR", "HTML" => true ); } return $result; } protected function isLicenseWrong() { return Option::get('sale', RestClient::WRONG_LICENSE_OPTION, 'N') == 'Y'; } public function execAdminAction() { $result = new \Bitrix\Sale\Result(); Asset::getInstance()->addJs("/bitrix/js/main/core/core.js"); Asset::getInstance()->addJs("/bitrix/js/sale/additional_delivery.js"); Asset::getInstance()->addString('<link rel="stylesheet" type="text/css" href="/bitrix/css/sale/additional_delivery.css">'); Asset::getInstance()->addString('<script language="javascript"> if(top.BX) { BX.addCustomEvent( \'onSaleDeliveryRusPostShippingPointSelect\', BX.Sale.Handler.Delivery.Additional.onRusPostShippingPointsSelect ); } </script>'); return $result; } public function getAdminAdditionalTabs() { self::install(); ob_start(); require_once(__DIR__.'/location/admin_tab.php'); $content = ob_get_contents(); ob_end_clean(); return array( array( "TAB" => Loc::getMessage('SALE_DLVRS_ADD_LOC_TAB'), "TITLE" => Loc::getMessage('SALE_DLVRS_ADD_LOC_TAB_TITLE'), "CONTENT" => $content ) ); } public static function install() { global $DB; if(!file_exists($_SERVER["DOCUMENT_ROOT"].'/bitrix/css/sale/additional_delivery.css')) { CopyDirFiles( $_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/sale/handlers/delivery/additional/install/css", $_SERVER["DOCUMENT_ROOT"]."/bitrix/css/sale", true, true ); CopyDirFiles( $_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/sale/handlers/delivery/additional/install/js", $_SERVER["DOCUMENT_ROOT"]."/bitrix/js/sale", true, true ); CopyDirFiles( $_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/sale/handlers/delivery/additional/install/tools", $_SERVER["DOCUMENT_ROOT"]."/bitrix/tools/sale", true, true ); } $con = \Bitrix\Main\Application::getConnection(); if(!$con->isTableExists('b_sale_hdale')) { $DB->RunSQLBatch($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/sale/handlers/delivery/additional/install/db/".$con->getType()."/install.sql"); } $eventManager = \Bitrix\Main\EventManager::getInstance(); $eventManager->registerEventHandler('sale', 'onSaleDeliveryExtraServicesClassNamesBuildList' , 'sale', '\Sale\Handlers\Delivery\AdditionalHandler', 'onSaleDeliveryExtraServicesClassNamesBuildList'); $eventManager->registerEventHandler('sale', 'onSaleDeliveryTrackingClassNamesBuildList', 'sale', '\Sale\Handlers\Delivery\AdditionalHandler', 'onSaleDeliveryTrackingClassNamesBuildList'); return parent::install(); } public static function unInstall() { global $DB; if(file_exists($_SERVER["DOCUMENT_ROOT"].'/bitrix/css/sale/additional_delivery.css')) { DeleteDirFiles( $_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/sale/handlers/delivery/additional/install/css", $_SERVER["DOCUMENT_ROOT"]."/bitrix/css/sale" ); DeleteDirFiles( $_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/sale/handlers/delivery/additional/install/js", $_SERVER["DOCUMENT_ROOT"]."/bitrix/js/sale" ); DeleteDirFiles( $_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/sale/handlers/delivery/additional/install/tools", $_SERVER["DOCUMENT_ROOT"]."/bitrix/tools/sale" ); } $con = \Bitrix\Main\Application::getConnection(); if(!$con->isTableExists('b_sale_hdale')) { $DB->RunSQLBatch($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/sale/handlers/delivery/additional/install/db/".$con->getType()."/uninstall.sql"); } $eventManager = \Bitrix\Main\EventManager::getInstance(); $eventManager->unRegisterEventHandler('sale', 'onSaleDeliveryExtraServicesClassNamesBuildList' , 'sale', '\Sale\Handlers\Delivery\AdditionalHandler', 'onSaleDeliveryExtraServicesClassNamesBuildList'); $eventManager->unRegisterEventHandler('sale', 'onSaleDeliveryTrackingClassNamesBuildList' , 'sale', '\Sale\Handlers\Delivery\AdditionalHandler', 'onSaleDeliveryTrackingClassNamesBuildList'); return parent::install(); } public static function onSaleDeliveryTrackingClassNamesBuildList() { return new \Bitrix\Main\EventResult( \Bitrix\Main\EventResult::SUCCESS, array( '\Sale\Handlers\Delivery\AdditionalTracking' => '/bitrix/modules/sale/handlers/delivery/additional/tracking.php' ), 'sale' ); } public function getEmbeddedExtraServicesList() { if($this->extraServicesList === null) { $this->extraServicesList = array(); $client = new RestClient(); $res = $client->getDeliveryExtraServices($this->serviceType); if($res->isSuccess()) $this->extraServicesList = $res->getData(); } return $this->extraServicesList; } public static function onSaleDeliveryExtraServicesClassNamesBuildList() { return new \Bitrix\Main\EventResult( \Bitrix\Main\EventResult::SUCCESS, array( '\Sale\Handlers\Delivery\Additional\ExtraServices\Insurance' => '/bitrix/modules/sale/handlers/delivery/additional/extra_services/insurance.php', '\Sale\Handlers\Delivery\Additional\ExtraServices\Lift' => '/bitrix/modules/sale/handlers/delivery/additional/extra_services/lift.php' ), 'sale' ); } public function isCompatible(Shipment $shipment) { $client = new RestClient(); return $client->isServerAlive(); } public function getTrackingUrlTempl() { $config = \Sale\Handlers\Delivery\AdditionalProfile::extractConfigValues($this->getConfig()); return !empty($config["MAIN"]["TRACKING_URL_TEMPL"]) ? $config["MAIN"]["TRACKING_URL_TEMPL"] : ''; } /** * @param Shipment $shipment * @param string $serviceType * @return array */ public static function getShipmentParams(Shipment $shipment, $serviceType) { /** @var \Bitrix\Sale\ShipmentCollection $shipmentCollection */ $shipmentCollection = $shipment->getCollection(); /** @var \Bitrix\Sale\Order $order */ $order = $shipmentCollection->getOrder(); $props = $order->getPropertyCollection(); $loc = $props->getDeliveryLocation(); $locToInternalCode = !!$loc ? $loc->getValue() : ""; $locFromRequest = array(); $locToRequest = array(); if(!empty($locToInternalCode)) $locToRequest = self::getLocationForRequest($locToInternalCode); $shopLocation = \CSaleHelper::getShopLocation(); if(!empty($shopLocation['CODE'])) $locFromRequest = self::getLocationForRequest($shopLocation['CODE']); $result = array( "ITEMS" => array(), "LOCATION_FROM" => $locFromRequest['EXTERNAL_ID'], "LOCATION_FROM_NAME" => $locFromRequest['NAME'], "LOCATION_TO" => $locToRequest['EXTERNAL_ID'], "LOCATION_TO_NAME" => $locToRequest['NAME'], "LOCATION_TO_TYPES" => self::getLocationChainByTypes($locToInternalCode, LANGUAGE_ID) ); if($address = $props->getAddress()) $result["ADDRESS"] = $address->getValue(); if($phone = $props->getPhone()) $result["PHONE"] = $phone->getValue(); if($payerName = $props->getPayerName()) $result["PAYER_NAME"] = $payerName->getValue(); if($serviceType == "RUSPOST" ) { $zipFrom = \CSaleHelper::getShopLocationZIP(); if(strlen($zipFrom) > 0) { $result["ZIP_FROM"] = $zipFrom; } elseif(!empty($shopLocation['CODE'])) { $extLoc = LocationHelper::getZipByLocation($shopLocation['CODE'], array('limit' => 1))->fetch(); if(!empty($extLoc['XML_ID'])) $result["ZIP_FROM"] = $extLoc['XML_ID']; } $zipTo = $props->getDeliveryLocationZip(); $zipTo = !!$zipTo ? $zipTo->getValue() : ""; if(strlen($zipTo) > 0) { $result["ZIP_TO"] = $zipTo; } elseif(!empty($locToInternalCode)) { $extLoc = LocationHelper::getZipByLocation($locToInternalCode, array('limit' => 1))->fetch(); if(!empty($extLoc['XML_ID'])) $result["ZIP_TO"] = $extLoc['XML_ID']; } } $price = 0; $weight = 0; /** @var \Bitrix\Sale\ShipmentItem $shipmentItem */ foreach($shipment->getShipmentItemCollection()->getShippableItems() as $shipmentItem) { $basketItem = $shipmentItem->getBasketItem(); if(!$basketItem) continue; //$itemFieldValues = $basketItem->getFieldValues(); $itemFieldValues = array( "PRICE" => $basketItem->getPrice(), "WEIGHT" => $basketItem->getWeight(), "CURRENCY" => $basketItem->getCurrency(), "QUANTITY" => $shipmentItem->getQuantity(), "DIMENSIONS" => $basketItem->getField("DIMENSIONS") ); $price += $itemFieldValues["PRICE"] * $itemFieldValues["QUANTITY"]; $weight += $itemFieldValues["WEIGHT"] * $itemFieldValues["QUANTITY"]; if(!empty($itemFieldValues["DIMENSIONS"]) && is_string($itemFieldValues["DIMENSIONS"])) $itemFieldValues["DIMENSIONS"] = unserialize($itemFieldValues["DIMENSIONS"]); $result["ITEMS"][] = $itemFieldValues; } //Extra services $esList = \Bitrix\Sale\Delivery\ExtraServices\Manager::getExtraServicesList($shipment->getDeliveryId(), false); if(!empty($esList)) { $result['EXTRA_SERVICES'] = array(); foreach($shipment->getExtraServices() as $esId => $esVal) { if(empty($esList[$esId]['CODE'])) continue; if($esList[$esId]['CLASS_NAME'] == '\Bitrix\Sale\Delivery\ExtraServices\Checkbox' && $esVal != 'Y') continue; $result['EXTRA_SERVICES'][$esList[$esId]['CODE']] = $esVal; } } $delivery= Manager::getObjectById($shipment->getDeliveryId()); $result['DELIVERY_SERVICE_CONFIG'] = $delivery->getConfigValues(); $result['WEIGHT'] = $weight; $result['PRICE'] = $price; $result['SHIPMENT_ID'] = $shipment->getId(); return $result; } /** * @param $locationCode * @return array * @throws \Bitrix\Main\ArgumentException */ protected static function getLocationForRequest($locationCode) { if(strlen($locationCode) <= 0) return array(); static $result = array(); if(!isset($result[$locationCode])) { $externalId = Location::getExternalId($locationCode); $name = ''; if(strlen($externalId) > 0) { $dbRes = ExternalTable::getList(array( 'filter' => array( 'XML_ID' => $externalId, 'SERVICE_ID' => Location::getExternalServiceId(), 'LOCATION.NAME.LANGUAGE_ID' => 'ru' ), 'select' => array('NAME' => 'LOCATION.NAME.NAME') )); if($rec = $dbRes->fetch()) $name = $rec['NAME']; } $result[$locationCode] = array( 'EXTERNAL_ID' => $externalId, 'NAME' => $name ); } return $result[$locationCode]; } /** * @param int $locationCode Location code. * @param string $lang Language identifier. * @return array Location components by type. * @throws \Bitrix\Main\ArgumentException */ protected static function getLocationChainByTypes($locationCode, $lang = LANGUAGE_ID) { if(strlen($locationCode) <= 0) return array(); $res = LocationTable::getList(array( 'filter' => array( array( 'LOGIC' => 'OR', '=CODE' => $locationCode ), ), 'select' => array( 'ID', 'CODE', 'LEFT_MARGIN', 'RIGHT_MARGIN' ) )); if(!$loc = $res->fetch()) return array(); $result = array(); $res = LocationTable::getList(array( 'filter' => array( '<=LEFT_MARGIN' => $loc['LEFT_MARGIN'], '>=RIGHT_MARGIN' => $loc['RIGHT_MARGIN'], 'NAME.LANGUAGE_ID' => $lang, 'TYPE.NAME.LANGUAGE_ID' => $lang ), 'select' => array( 'ID', 'CODE', 'LOCATION_NAME' => 'NAME.NAME', 'TYPE_NAME' => 'TYPE.NAME.NAME', 'TYPE_CODE' => 'TYPE.CODE' ) )); while($locParent = $res->fetch()) $result[$locParent['TYPE_CODE']] = $locParent['LOCATION_NAME']; return $result; } public function prepareFieldsForSaving(array $fields) { if(isset($fields['CONFIG']['MAIN']['SHIPPING_POINT']['NAME'])) $fields['CONFIG']['MAIN']['SHIPPING_POINT']['NAME'] = htmlspecialcharsback($fields['CONFIG']['MAIN']['SHIPPING_POINT']['NAME']); if(isset($fields['CONFIG']['MAIN']['SHIPPING_POINT']['VALUE'])) $fields['CONFIG']['MAIN']['SHIPPING_POINT']['VALUE'] = htmlspecialcharsback($fields['CONFIG']['MAIN']['SHIPPING_POINT']['VALUE']); if(isset($fields['CONFIG']['MAIN']['SHIPPING_POINT']['ADDITIONAL'])) $fields['CONFIG']['MAIN']['SHIPPING_POINT']['ADDITIONAL'] = htmlspecialcharsback($fields['CONFIG']['MAIN']['SHIPPING_POINT']['ADDITIONAL']); return parent::prepareFieldsForSaving($fields); } }