%PDF- %PDF-
Direktori : /home/bitrix/www/bitrix/modules/sale/handlers/delivery/additional/ |
Current File : //home/bitrix/www/bitrix/modules/sale/handlers/delivery/additional/profile.php |
<? namespace Sale\Handlers\Delivery; use Bitrix\Main\Error; use Bitrix\Main\Loader; use Bitrix\Main\SystemException; use Bitrix\Sale\Delivery\Requests\Result; use Bitrix\Sale\Order; use Bitrix\Sale\Shipment; use Bitrix\Main\Localization\Loc; use Bitrix\Main\ArgumentNullException; use Bitrix\Sale\Delivery\Services\Manager; use Bitrix\Sale\Delivery\CalculationResult; use Bitrix\Sale\ShipmentCollection; use Sale\Handlers\Delivery\Additional\RestClient; use Sale\Handlers\Delivery\Additional\RusPost\Helper; Loc::loadMessages(__FILE__); class AdditionalProfile extends \Bitrix\Sale\Delivery\Services\Base { /** @var AdditionalHandler Parent service. */ protected $additionalHandler = null; /** @var string Service type */ protected $profileType = ""; protected $trackingTitle = ""; protected $trackingDescription = ""; protected static $whetherAdminExtraServicesShow = true; /** @var bool This handler is profile */ protected static $isProfile = true; /** * @param array $initParams * @throws ArgumentNullException * @throws \Bitrix\Main\ArgumentTypeException */ public function __construct(array $initParams) { if(empty($initParams["PARENT_ID"])) throw new ArgumentNullException('initParams[PARENT_ID]'); parent::__construct($initParams); $this->additionalHandler = Manager::getObjectById($this->parentId); if(!($this->additionalHandler instanceof AdditionalHandler)) throw new ArgumentNullException('this->additionalHandler is not instance of AdditionalHandler'); if(isset($initParams['PROFILE_ID']) && strlen($initParams['PROFILE_ID']) > 0) $this->profileType = $initParams['PROFILE_ID']; elseif(isset($this->config['MAIN']['PROFILE_TYPE']) && strlen($this->config['MAIN']['PROFILE_TYPE']) > 0) $this->profileType = $this->config['MAIN']['PROFILE_TYPE']; if(strlen($this->profileType) > 0) { $profileParams = $this->getProfileParams(); if(!empty($profileParams) && $this->id <= 0) { $this->name = $profileParams['NAME']; $this->description = $profileParams['DESCRIPTION']; if(!empty($profileParams['LOGOTIP'])) $this->logotip = $profileParams['LOGOTIP']; } if($this->isRusPost()) { if(empty($this->config['MAIN']['IS_OTPRAVKA_SUPPORTED'])) { if(isset($profileParams['IS_OTPRAVKA_SUPPORTED']) && $profileParams['IS_OTPRAVKA_SUPPORTED'] == 'Y') { $this->config['MAIN']['IS_OTPRAVKA_SUPPORTED'] = 'Y'; } else { $this->config['MAIN']['IS_OTPRAVKA_SUPPORTED'] = 'N'; } } } } $this->inheritParams(); } protected function isRusPost() { $parentConfig = $this->additionalHandler->getConfigValues(); return $parentConfig['MAIN']['SERVICE_TYPE'] == "RUSPOST"; } /** * @return array */ protected function getProfileParams() { $result = array(); $list = $this->additionalHandler->getProfilesListFull(); if(!empty($list[$this->profileType])) $result = $list[$this->profileType]; return $result; } /** * @return string */ public static function getClassTitle() { return Loc::getMessage("SALE_DLVRS_ADDP_NAME"); } /** * @return string */ public static function getClassDescription() { return Loc::getMessage("SALE_DLVRS_ADDP_DESCRIPTION"); } /** * Defines inheritance behavior. * @throws ArgumentNullException * @throws \Bitrix\Main\SystemException */ protected function inheritParams() { if(strlen($this->name) <= 0) $this->name = $this->additionalHandler->getName(); if(intval($this->logotip) <= 0) $this->logotip = $this->additionalHandler->getLogotip(); if(strlen($this->description) <= 0) $this->description = $this->additionalHandler->getDescription(); $this->trackingParams = $this->additionalHandler->getTrackingParams(); $this->trackingClass = $this->additionalHandler->getTrackingClass(); $this->trackingTitle = $this->additionalHandler->getTrackingClassTitle(); $this->trackingDescription = $this->additionalHandler->getTrackingClassDescription(); if(!$this->isRusPost() || $this->config['MAIN']['IS_OTPRAVKA_SUPPORTED'] == 'Y') { $this->deliveryRequestHandler = $this->additionalHandler->getDeliveryRequestHandler(); } $parentES = \Bitrix\Sale\Delivery\ExtraServices\Manager::getExtraServicesList($this->parentId); if(!empty($parentES)) { foreach($parentES as $esFields) { if( (strlen($esFields['CODE']) > 0 && !$this->extraServices->getItemByCode($esFields['CODE'])) || strlen($esFields['CODE']) <= 0 ) { $this->extraServices->addItem($esFields, $this->currency); } } } } /** * Calculates price * @param Shipment $shipment * @return CalculationResult * @throws SystemException * todo: Send default values if some params added to config, but not saved yet. */ protected function calculateConcrete(Shipment $shipment) { $client = new \Sale\Handlers\Delivery\Additional\RestClient(); try { $result = $client->getDeliveryPrice( $this->additionalHandler->getServiceType(), $this->profileType, self::extractConfigValues($this->additionalHandler->getConfig()), self::extractConfigValues($this->getConfig()), $shipment ); } catch(SystemException $e) { $result = new CalculationResult(); $result->addError(new Error($e->getMessage())); } /** @var ShipmentCollection $shipmentCollection */ $shipmentCollection = $shipment->getCollection(); /** @var Order $order */ $order = $shipmentCollection->getOrder(); $shipmentCurrency = $order->getCurrency(); if ($result->isSuccess() && $this->currency != $shipmentCurrency) { if(!Loader::includeModule('currency')) throw new SystemException("Can't include module \"Currency\""); $result->setDeliveryPrice( \CCurrencyRates::convertCurrency( $result->getPrice(), $this->currency, $shipmentCurrency )); } return $result; } /** * @param array $config * @return array */ public static function extractConfigValues(array $config) { if(!is_array($config) || empty($config)) return array(); $result = array(); foreach($config as $sectionKey => $sectionConfig) { if(isset($sectionConfig["ITEMS"]) && is_array($sectionConfig["ITEMS"]) && !empty($sectionConfig["ITEMS"])) { $result[$sectionKey] = array(); foreach($sectionConfig["ITEMS"] as $name => $params) { $value = ""; if(isset($params['VALUE'])) $value = $params['VALUE']; elseif(isset($params['DEFAULT'])) $value = $params['DEFAULT']; $result[$sectionKey][$name] = $value; } } } return $result; } /** * @return bool */ public function isCalculatePriceImmediately() { return $this->additionalHandler->isCalculatePriceImmediately(); } /** * @return array Handler's configuration */ protected function getConfigStructure() { $client = new \Sale\Handlers\Delivery\Additional\RestClient(); $res = $client->getProfileConfig( $this->additionalHandler->getServiceType(), $this->profileType ); if(!$res->isSuccess()) array(); return $res->getData(); } /** * @return \Bitrix\Sale\Delivery\Services\Base|\Sale\Handlers\Delivery\SpsrHandler Parent sevice. */ public function getParentService() { return $this->additionalHandler; } /** * @param Shipment $shipment * @return bool */ public function isCompatible(Shipment $shipment) { return array_key_exists( $this->profileType, $this->additionalHandler->getCompatibleProfiles($shipment) ); } /** * Install handler */ public static function install() { AdditionalHandler::install(); } /** * Uninstall */ public static function unInstall() { AdditionalHandler::unInstall(); } /** * Is handler installed */ public static function isInstalled() { AdditionalHandler::isInstalled(); } /** * @return bool */ public static function isProfile() { return self::$isProfile; } /** * @return bool */ public static function whetherAdminExtraServicesShow() { return self::$whetherAdminExtraServicesShow; } /** * @return array */ public function getEmbeddedExtraServicesList() { static $result = null; if($result === null) { $result = array(); $client = new RestClient(); $res = $client->getProfileExtraServices( $this->additionalHandler->getServiceType(), $this->profileType, self::extractConfigValues($this->getConfig()) ); if($res->isSuccess()) $result = $res->getData(); } 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 bool */ public function isTrackingInherited() { return true; } public function execAdminAction() { $result = new \Bitrix\Sale\Result(); if($this->isRusPost() && !empty($this->config['MAIN']['OTPRAVKA_RPO'])) { $parentConfig = $this->getParentService()->getConfigValues(); if(empty($parentConfig['MAIN']['SHIPPING_POINT']['VALUE'])) { return $result; } $selectedShippingPoint = $parentConfig['MAIN']['SHIPPING_POINT']['VALUE']; $shippingPoints = Helper::getEnabledShippingPointsList($this->id); if(isset($shippingPoints[$selectedShippingPoint])) { if(in_array($this->config['MAIN']['OTPRAVKA_RPO'], $shippingPoints[$selectedShippingPoint]['available-mail-types'])) { $this->config['MAIN']['IS_OTPRAVKA_SUPPORTED'] = 'Y'; $this->config['MAIN']['IS_OTPRAVKA_SUPPORTED_LABEL'] = Loc::getMessage('SALE_DLVRS_ADDP_Y'); } else { $this->config['MAIN']['IS_OTPRAVKA_SUPPORTED'] = 'N'; $this->config['MAIN']['IS_OTPRAVKA_SUPPORTED_LABEL'] = Loc::getMessage('SALE_DLVRS_ADDP_N'); } } } return $result; } }