%PDF- %PDF-
Direktori : /home/bitrix/www/bitrix/modules/sale/handlers/delivery/additional/ |
Current File : //home/bitrix/www/bitrix/modules/sale/handlers/delivery/additional/restclient.php |
<? namespace Sale\Handlers\Delivery\Additional; use Bitrix\Main\Config\Option; use Bitrix\Main\Context; use Bitrix\Main\Error; use Bitrix\Sale\Delivery\ExtraServices\Manager; use Bitrix\Sale\Delivery\Services\Table; use Bitrix\Sale\Location\Admin\LocationHelper; use Bitrix\Sale\Location\ExternalTable; use Bitrix\Sale\Location\Name\LocationTable; use Bitrix\Sale\Result; use Bitrix\Sale\ResultSerializable; use Bitrix\Sale\Shipment; use Bitrix\Main\Localization\Loc; use Bitrix\Sale\Delivery\CalculationResult; use Sale\Handlers\Delivery\AdditionalHandler; Loc::loadMessages(__FILE__); /** * Class RestClient * Allows exchanging information with server via rest * Caches some requests if it possible * @package Sale\Handlers\Delivery\Additional */ class RestClient extends \Bitrix\Sale\Services\Base\RestClient { const WRONG_LICENSE_OPTION = 'handlers_dlv_add_rest_wrong_license'; /** * @return \Bitrix\Sale\Result */ public function getDeliveryList() { return $this->getItem('delivery.list', CacheManager::TYPE_DELIVERY_LIST); } /** * @param string $serviceType * @return \Bitrix\Sale\Result * @throws \Bitrix\Main\ArgumentOutOfRangeException */ public function getDeliveryProfilesList($serviceType) { return $this->getItem( 'delivery.profile.list', CacheManager::TYPE_PROFILES_LIST, array('serviceType' => $serviceType), array($serviceType) ); } /** * @param string $serviceType * @param string $profileType * @return \Bitrix\Sale\Result * @throws \Bitrix\Main\ArgumentOutOfRangeException */ public function getDeliveryProfileFields($serviceType, $profileType) { return $this->getItem( 'delivery.profile.fields', CacheManager::TYPE_PROFILE_FIELDS, array('serviceType' => $serviceType, 'profileType' => $profileType), array($serviceType, $profileType) ); } /** * @param string $serviceType * @return \Bitrix\Sale\Result * @throws \Bitrix\Main\ArgumentOutOfRangeException */ public function getDeliveryFields($serviceType) { return $this->getItem( 'delivery.fields', CacheManager::TYPE_DELIVERY_FIELDS, array('serviceType' => $serviceType), array($serviceType) ); } /** * @param string $serviceType * @param string $profileType * @param array $serviceParams * @param array $profileParams * @param Shipment $shipment * @return CalculationResult * @throws \Bitrix\Main\ArgumentOutOfRangeException */ public function getDeliveryPrice($serviceType, $profileType, array $serviceParams, array $profileParams, Shipment $shipment) { $params = array( 'serviceType' => $serviceType, 'profileType' => $profileType, 'serviceParams' => $serviceParams, 'profileParams' => $profileParams, 'shipmentParams' => AdditionalHandler::getShipmentParams($shipment, $serviceType) ); $hash = md5(serialize($params)); $answer = $this->getItem( 'delivery.price', CacheManager::TYPE_DELIVERY_PRICE, $params, array($hash) ); if($answer->isSuccess()) { $data = $answer->getData(); $result = unserialize(rawurldecode($data['PRICE'])); if(!($result instanceof CalculationResult)) { $result = new CalculationResult(); $result->addError(new Error('Error. Incorrect answer about price!')); return $result; } if(!$result->isSuccess() && defined('SALE_HANDLERS_DLV_ADD_LOG_PRICE_ERRORS')) { $eventLog = new \CEventLog(); $eventLog->Add(array( "SEVERITY" => $eventLog::SEVERITY_ERROR, "AUDIT_TYPE_ID" => "SALE_HANDLERS_DLV_ADD_LOG_PRICE_ERRORS", "MODULE_ID" => "sale", "ITEM_ID" => $serviceType.'_'.$profileType, "DESCRIPTION" => implode(', ', $result->getErrorMessages()), )); } } else { $result = new CalculationResult(); $result->addErrors($answer->getErrors()); } return $result; } public function getProfileConfig($serviceType, $profileType) { return $this->getItem( 'delivery.profile.config', CacheManager::TYPE_PROFILE_CONFIG, array('serviceType' => $serviceType, 'profileType' => $profileType), array($serviceType, $profileType) ); } public function getDeliveryExtraServices($serviceType) { return $this->getItem( 'delivery.extraservices', CacheManager::TYPE_EXTRA_SERVICES, array('serviceType' => $serviceType), array($serviceType) ); } public function getProfileExtraServices($serviceType, $profileType, array $profileParams) { return $this->getItem( 'delivery.profile.extraservices', CacheManager::TYPE_EXTRA_SERVICES, array('serviceType' => $serviceType, 'profileType' => $profileType, 'profileParams' => $profileParams), array($serviceType, $profileType, $profileParams) ); } public function getTrackingStatuses($serviceType, array $serviceParams, array $trackingNumbers = array()) { return $this->getItem( 'delivery.tracking.statuses', CacheManager::TYPE_NONE, array('serviceType' => $serviceType, 'serviceParams' => $serviceParams, 'trackingNumbers' => $trackingNumbers) ); } protected function setCacheItem($result, $cacheType, array $cacheIds) { $cache = CacheManager::getItem($cacheType); $cache->set(serialize($result), $cacheIds); } protected function getItem($callMethod, $cacheType, array $callParams = array(), array $cacheIds = array()) { $cache = CacheManager::getItem($cacheType); $isLicenseWrong = Option::get('sale', self::WRONG_LICENSE_OPTION, 'N') == 'Y'; $skipCache = defined('SALE_HANDLERS_DLV_ADD_SKIP_CACHE'); $result = false; if(!$skipCache && !$isLicenseWrong && $cache && $result = $cache->get($cacheIds)) { $result = unserialize($result); } if(!($result instanceof ResultSerializable)) { if($isLicenseWrong && $cache) $cache->clean(); $result = $this->call(static::SCOPE.'.'.$callMethod, $callParams); if($result->isSuccess()) { $data = $result->getData(); if(!empty($data['ACTIONS']) && is_array($data['ACTIONS'])) { $this->processActions($data['ACTIONS']); unset($data['ACTIONS']); $result->setData($data); } if($cache) $cache->set(serialize($result), $cacheIds); } else { foreach($result->getErrors() as $error) { if($error->getCode() == self::ERROR_WRONG_LICENSE) { Option::set('sale', self::WRONG_LICENSE_OPTION, 'Y'); $isLicenseWrong = true; } } if(defined('SALE_HANDLERS_DLV_ADD_LOG_REST_ERRORS')) { $eventLog = new \CEventLog(); $eventLog->Add(array( "SEVERITY" => $eventLog::SEVERITY_ERROR, "AUDIT_TYPE_ID" => "SALE_HANDLERS_DLV_ADD_LOG_REST_ERRORS", "MODULE_ID" => "sale", "ITEM_ID" => $callMethod, "DESCRIPTION" => implode(', ', $result->getErrorMessages()), )); } } } if($result->isSuccess() && $isLicenseWrong) Option::delete('sale', array('name' => self::WRONG_LICENSE_OPTION)); return $result; } private function processActions(array $actions) { foreach($actions as $actType => $actParams) { $res = Action::execute($actParams); if(!$res->isSuccess() && defined('SALE_HANDLERS_DLV_ADD_LOG_ACTIONS_ERRORS')) { $eventLog = new \CEventLog(); $eventLog->Add(array( "SEVERITY" => $eventLog::SEVERITY_ERROR, "AUDIT_TYPE_ID" => "SALE_HANDLERS_DLV_ADD_LOG_ACTIONS_ERRORS", "MODULE_ID" => "sale", "ITEM_ID" => $actType, "DESCRIPTION" => implode(', ', $res->getErrorMessages()), )); } } } }