%PDF- %PDF-
Direktori : /home/bitrix/www/bitrix/modules/sale/lib/delivery/services/ |
Current File : //home/bitrix/www/bitrix/modules/sale/lib/delivery/services/automatic_profile.php |
<?php namespace Bitrix\Sale\Delivery\Services; use Bitrix\Currency\CurrencyManager; use Bitrix\Main\SystemException; use Bitrix\Main\Localization\Loc; use Bitrix\Main\ArgumentNullException; use Bitrix\Sale\Shipment; Loc::loadMessages(__FILE__); /** * Class AutomaticProfile * Adapter for old delivery services profile to work with new API. * @package Bitrix\Sale\Delivery\Services */ class AutomaticProfile extends Base { protected $profileId = ""; protected $oldConfig; protected $parentSid; /** @var Automatic|null $parentAutomatic */ protected $parentAutomatic = null; protected $parentHandlerInitParams = array(); protected $profileConfig = null; protected $profileOldConfig = null; protected $profileOldConfigActualized = false; protected static $isProfile = true; public function __construct(array $initParams) { if(!isset($initParams["PARENT_ID"])) throw new ArgumentNullException('initParams["PARENT_ID"]'); $this->parentAutomatic = Manager::getObjectById($initParams["PARENT_ID"]); if(!$this->parentAutomatic || !($this->parentAutomatic instanceof Automatic)) throw new SystemException("Can't initialize AutomaticProfile's id: ".$initParams["ID"]." parent Automatic parent_id: ".$initParams["PARENT_ID"]); $this->parentSid = $this->parentAutomatic->getSid(); if(strlen($this->parentSid) <= 0) throw new SystemException("Can't determine AutomaticProfile's SID. profile id: ".$initParams["ID"]." parent Automatic id: ".$initParams["PARENT_ID"]); $this->parentHandlerInitParams = $this->parentAutomatic->getHandlerInitParams($this->parentSid); if($this->parentHandlerInitParams === false) throw new SystemException("Can't get init services params of Automatic delivery service with sid: ".$this->parentSid); parent::__construct($initParams); if(isset($initParams['PROFILE_ID']) && strlen($initParams['PROFILE_ID']) > 0) $this->profileId = $initParams['PROFILE_ID']; elseif(isset($this->config["MAIN"]["PROFILE_ID"])) $this->profileId = $this->config["MAIN"]["PROFILE_ID"]; if(strlen($this->profileId) > 0 && !array_key_exists($this->profileId, $this->parentHandlerInitParams["PROFILES"])) throw new SystemException("Profile \"".$this->profileId."\" is not part of Automatic delivery service with sid: ".$this->parentSid); if(strlen($this->name) <= 0 && isset($this->parentHandlerInitParams['PROFILES'][$this->profileId]['TITLE'])) $this->name = $this->parentHandlerInitParams['PROFILES'][$this->profileId]['TITLE']; if(strlen($this->description) <= 0 && isset($this->parentHandlerInitParams['PROFILES'][$this->profileId]['DESCRIPTION'])) $this->description = $this->parentHandlerInitParams['PROFILES'][$this->profileId]['DESCRIPTION']; if(!empty($this->parentHandlerInitParams["PROFILES"][$this->profileId]["TRACKING_CLASS_NAME"])) $this->trackingClass = $this->parentHandlerInitParams["PROFILES"][$this->profileId]["TRACKING_CLASS_NAME"]; $this->inheritParams(); } protected function inheritParams() { if(strlen($this->name) <= 0) $this->name = $this->parentAutomatic->getName(); if(intval($this->logotip) <= 0) $this->logotip = $this->parentAutomatic->getLogotip(); if(strlen($this->description) <= 0) $this->description = $this->parentAutomatic->getDescription(); if(strlen($this->trackingClass) <= 0) $this->trackingClass = $this->parentAutomatic->getTrackingClass(); $parentTP = $this->parentAutomatic->getTrackingParams(); if(is_array($parentTP) && !empty($parentTP)) { if(empty($this->trackingParams) || !is_array($this->trackingParams)) { $this->trackingParams = $parentTP; } else { foreach($this->trackingParams as $k => $v) if(empty($v) && !empty($parentTP[$k])) $this->trackingParams[$k] = $parentTP[$k]; } } } /** * @param bool $actualizeProfiles * @return array Old config. * @internal */ public function getOldConfig($actualizeProfiles = false) { if($this->profileOldConfig === null) { $own = Automatic::createConfig($this->parentHandlerInitParams, $this->config["MAIN"]["OLD_SETTINGS"]); $parent = $this->getParentService()->getOldConfig(); $profileOldConfig = array( "CONFIG" => array_merge( isset($parent["CONFIG"]) && is_array($parent["CONFIG"]) ? $parent["CONFIG"] : array(), isset($own["CONFIG"]) && is_array($own["CONFIG"]) ? $own["CONFIG"] : array() ), "CONFIG_GROUPS" => isset($parent["CONFIG_GROUPS"]) && is_array($parent["CONFIG"])? $parent["CONFIG_GROUPS"] : array() ); if(isset($own["CONFIG"]) && is_array($own["CONFIG"])) foreach($own["CONFIG"] as $k => $v) if(empty($v["GROUP"]) || $v["GROUP"] != $this->profileId) $profileOldConfig["CONFIG"][$k] = $parent["CONFIG"][$k]; $this->profileOldConfig = $profileOldConfig; } if($actualizeProfiles && !$this->profileOldConfigActualized) { $this->profileOldConfig = $this->actualizeProfilesConfig($this->profileOldConfig); $this->profileOldConfigActualized = true; } return $this->profileOldConfig; } /** * @param array $oldConfig * @return array */ protected function actualizeProfilesConfig(array $oldConfig) { $profiles = Manager::getByParentId($this->parentId); $actualizedCodes = array(); foreach($profiles as $id => $fields) { if($id == $this->id) continue; if(strlen($fields['CODE']) > 0) { if($fields['CODE'] == $this->code) continue; if(in_array($fields['CODE'], $actualizedCodes)) continue; } /** @var \Bitrix\Sale\Delivery\Services\AutomaticProfile $service */ $service = Manager::getPooledObject($fields); if($service) { $config = $service->getConfig(); $serviceProfileId = $config['MAIN']['ITEMS']['PROFILE_ID']['VALUE']; if($serviceProfileId == $this->profileId) continue; $profileOldConfig = $service->getOldConfig(); foreach($profileOldConfig['CONFIG'] as $k => $v) if(isset($v['GROUP']) && $v['GROUP'] == $serviceProfileId) $oldConfig['CONFIG'][$k] = $v; $actualizedCodes[] = $fields['CODE']; } } return $oldConfig; } public function getConfig() { if($this->profileConfig === null) { $configStructure = $this->getConfigStructure(); $profileConfig = array(); foreach($configStructure as $key => $configSection) $profileConfig[$key] = $this->glueValuesToConfig($configSection, isset($this->config[$key]) ? $this->config[$key] : array()); if(strlen($this->profileId) > 0) { $oldConfig = Automatic::createConfig($this->parentHandlerInitParams, $this->config["MAIN"]["OLD_SETTINGS"]); $newConfig = Automatic::convertOldConfigToNew($oldConfig); foreach($newConfig as $groupId => $groupParams) if($groupId != $this->profileId) unset($newConfig[$groupId]); $profileConfig= array_merge($this->config, $profileConfig, $newConfig); } $this->profileConfig = $profileConfig; } return $this->profileConfig; } public static function getClassTitle() { return Loc::getMessage("SALE_DLVR_HANDL_AUTP_NAME"); } public static function getClassDescription() { return Loc::getMessage("SALE_DLVR_HANDL_AUTP_DESCRIPTION"); } protected function calculateConcrete(\Bitrix\Sale\Shipment $shipment) { $result = $this->parentAutomatic->calculateProfile($this->profileId, $this->getOldConfig(true), $shipment); $result->setDeliveryPrice( $result->getPrice() + $this->getMarginPrice($result->getPrice()) ); return $result; } protected function getMarginPrice($price) { if($this->config["MAIN"]["MARGIN_TYPE"] == "%") $marginPrice = $price * floatval($this->config["MAIN"]["MARGIN_VALUE"]) / 100; else $marginPrice = floatval($this->config["MAIN"]["MARGIN_VALUE"]); return $marginPrice; } protected function getConfigStructure() { static $profiles = null; if($profiles === null) { $profiles = array("" => ""); foreach($this->parentHandlerInitParams["PROFILES"] as $profileId => $profileParams) if(strlen($profileParams["TITLE"]) > 0) $profiles[$profileId] = $profileParams["TITLE"]." [".$profileId."]"; } $result = array( "MAIN" => array( "TITLE" => Loc::getMessage("SALE_DLVR_HANDL_AUTP_CONF_MAIN_TITLE"), "DESCRIPTION" => Loc::getMessage("SALE_DLVR_HANDL_AUTP_CONF_MAIN_DESCR"), "ITEMS" => array ( "PROFILE_ID" => array( "TYPE" => "STRING", "NAME" => "PROFILE_ID", "HIDDEN" => true, "DEFAULT" => $this->profileId ), "PROFILE_NAME" => array( "TYPE" => "STRING", "NAME" => Loc::getMessage("SALE_DLVR_HANDL_AUTP_CONF_MAIN_PROFILE_ID"), "DEFAULT" => $profiles[$this->profileId], "READONLY" => true ) ) ) ); $serviceCurrency = $this->currency; if(\Bitrix\Main\Loader::includeModule('currency')) { $currencyList = CurrencyManager::getCurrencyList(); if (isset($currencyList[$this->currency])) $serviceCurrency = $currencyList[$this->currency]; unset($currencyList); } $marginTypes = array( "%" => "%", "CURRENCY" => $serviceCurrency ); $result["MAIN"]["ITEMS"]["MARGIN_VALUE"] = array( "TYPE" => "STRING", "NAME" => Loc::getMessage("SALE_DLVR_HANDL_AUT_MARGIN_VALUE"), "DEFAULT" => 0 ); $result["MAIN"]["ITEMS"]["MARGIN_TYPE"] = array( "TYPE" => "ENUM", "NAME" => Loc::getMessage("SALE_DLVR_HANDL_AUT_MARGIN_TYPE"), "DEFAULT" => "%", "OPTIONS" => $marginTypes ); $configProfileIds = array_keys($this->parentHandlerInitParams["PROFILES"]); if(strlen($this->profileId) > 0 && in_array($this->profileId, $configProfileIds)) { $oldAutoConfig = $this->parentAutomatic->getOldConfig(); if($oldAutoConfig && isset($oldAutoConfig["CONFIG_GROUPS"]) && is_array($oldAutoConfig["CONFIG_GROUPS"])) { foreach($oldAutoConfig["CONFIG_GROUPS"] as $key => $groupId) if($this->profileId != $groupId) unset($oldAutoConfig["CONFIG_GROUPS"][$key]); foreach($oldAutoConfig["CONFIG"] as $key => $params) if($this->profileId != $params["CONFIG"]) unset($oldAutoConfig["CONFIG"][$key]); } $oldConfig = Automatic::convertOldConfigToNew($oldAutoConfig); if(!empty($oldConfig)) { if(isset($oldConfig["CONFIG_GROUPS"]["MAIN"])) { $oldConfig["CONFIG_GROUPS"]["MAIN_OLD"] = $oldConfig["CONFIG_GROUPS"]["MAIN"]; unset($oldConfig["CONFIG_GROUPS"]["MAIN"]); } $result = array_merge($result, $oldConfig); } } return $result; } public function prepareFieldsForSaving(array $fields) { $parentAutoConfig = $this->parentAutomatic->getConfigValues(); if(isset($fields["CONFIG"]) && is_array($fields["CONFIG"])) $fields["CONFIG"] = array_merge($parentAutoConfig, $fields["CONFIG"]); $configMain = $fields["CONFIG"]["MAIN"]; $handler = $this->parentHandlerInitParams; if (isset($handler["DBSETSETTINGS"]) && is_callable($handler["DBSETSETTINGS"])) { $oldSettings = $fields["CONFIG"]; unset($oldSettings["MAIN"]); if(is_array($oldSettings)) $oldSettings = Automatic::convertNewSettingsToOld($oldSettings); if (!$strOldSettings = call_user_func($handler["DBSETSETTINGS"], $oldSettings)) throw new SystemException("Can't save delivery services's old settings"); } else { $strOldSettings = ""; } $strOldSettings = serialize($strOldSettings); $fields["CONFIG"] = array( "MAIN" => $configMain ); $fields["CONFIG"]["MAIN"]["OLD_SETTINGS"] = $strOldSettings; $fields = parent::prepareFieldsForSaving($fields); $fields["CODE"] = $this->parentAutomatic->getSid().":".$this->profileId; if(!empty($fields['TRACKING_PARAMS']) && is_array($fields['TRACKING_PARAMS'])) { $parentTP = $this->parentAutomatic->getTrackingParams(); foreach($fields['TRACKING_PARAMS'] as $k => $v) if(!empty($parentTP[$k]) && $v == $parentTP[$k]) $fields['TRACKING_PARAMS'][$k] =''; } return $fields; } public function getParentService() { return $this->parentAutomatic; } public function isCompatible(Shipment $shipment) { return $this->parentAutomatic->isProfileCompatible($this->profileId, $this->getOldConfig(true), $shipment); } public static function isProfile() { return self::$isProfile; } public function getAdditionalInfoShipmentEdit(Shipment $shipment) { return $this->parentAutomatic->getAdditionalInfoShipmentEdit($shipment); } public function processAdditionalInfoShipmentEdit(Shipment $shipment, array $requestData) { return $this->parentAutomatic->processAdditionalInfoShipmentEdit($shipment, $requestData); } public function getAdditionalInfoShipmentView(Shipment $shipment) { return $this->parentAutomatic->getAdditionalInfoShipmentView($shipment); } }