Current Path : /var/www/www-root/data/www/info.monolith-realty.ru/bitrix/modules/seo/lib/ |
Current File : /var/www/www-root/data/www/info.monolith-realty.ru/bitrix/modules/seo/lib/advsession.php |
<?php namespace Bitrix\Seo; use Bitrix\Currency\CurrencyManager; use Bitrix\Main; use Bitrix\Main\Application; use Bitrix\Main\Localization\Loc; use Bitrix\Main\Session\Session; use Bitrix\Sale\Internals\BasketTable; use Bitrix\Catalog\ProductTable; use Bitrix\Seo\Adv\LinkTable; use Bitrix\Seo\Adv\OrderTable; use Bitrix\Seo\Adv\YandexBannerTable; use Bitrix\Seo\Engine\YandexDirect; Loc::loadMessages(__FILE__); /** * Class AdvSession * * Events handler for managing users came from yandex.direct ad * * @package Bitrix\Seo **/ class AdvSession { const URL_PARAM_CAMPAIGN = 'bxydcampaign'; const URL_PARAM_CAMPAIGN_VALUE = '{campaign_id}'; const URL_PARAM_BANNER = 'bxydbanner'; const URL_PARAM_BANNER_VALUE = '{banner_id}'; private const DATA_INDEX = 'SEO_ADV'; protected static $orderHandlerCalled = array(); public static function checkSession() { $request = Main\Context::getCurrent()->getRequest(); if( isset($request[static::URL_PARAM_CAMPAIGN]) && isset($request[static::URL_PARAM_BANNER]) ) { $session = self::getSessionStorage(); $session?->set( self::DATA_INDEX, [ 'ENGINE' => YandexDirect::ENGINE_ID, 'CAMPAIGN_ID' => $request[static::URL_PARAM_CAMPAIGN], 'BANNER_ID' => $request[static::URL_PARAM_BANNER], ] ); } } public static function isSession() { $session = self::getSessionStorage(); if ($session === null) { return false; } $data = $session->get(self::DATA_INDEX); unset($session); return !empty($data) && is_array($data); } public static function getSession() { $session = self::getSessionStorage(); if ($session === null) { return null; } $data = $session->get(self::DATA_INDEX); unset($session); if (!empty($data) && is_array($data)) { return $data; } return null; } public static function onOrderSave($orderId, $orderFields, $orderData, $isNew) { if($isNew) { static::checkSessionOrder($orderId); } } public static function onBasketOrder($orderId) { static::checkSessionOrder($orderId); } public static function onSalePayOrder($orderId, $val) { if($val == 'Y') { static::countSessionOrder($orderId); } } public static function onSaleDeductOrder($orderId, $val) { if($val == 'Y') { static::countSessionOrder($orderId); } } public static function onSaleDeliveryOrder($orderId, $val) { if($val == 'Y') { static::countSessionOrder($orderId); } } public static function onSaleStatusOrder($orderId, $status) { if($status == 'F') { static::countSessionOrder($orderId); } } protected static function checkSessionOrder($orderId) { if (in_array($orderId, static::$orderHandlerCalled)) { return; } if (!( Main\Loader::includeModule('sale') && Main\Loader::includeModule('catalog') )) { return; } $data = self::getSession(); if ($data === null) { return; } $bannerId = (string)($data['BANNER_ID'] ?? ''); if ($bannerId !== '') { static::$orderHandlerCalled[] = $orderId; $banner = null; $engine = (string)($data['ENGINE'] ?? ''); switch ($engine) { case YandexDirect::ENGINE_ID: $dbRes = YandexBannerTable::getList(array( 'filter' => array( '=XML_ID' => $bannerId, '=ENGINE.CODE' => YandexDirect::ENGINE_ID, ), 'select' => array( 'ID', 'CAMPAIGN_ID', 'ENGINE_ID', ) )); $banner = $dbRes->fetch(); break; } if ($banner) { $linkedProductsList = static::getBannerLinkedProducts($banner['ID']); if (count($linkedProductsList) > 0) { $basket = BasketTable::getList(array( 'filter' => array( '=ORDER_ID' => $orderId, ), 'select' => array('PRODUCT_ID'), )); $addEntry = false; while ($item = $basket->fetch()) { if (in_array($item['PRODUCT_ID'], $linkedProductsList)) { $addEntry = true; break; } else { $productInfo = \CCatalogSKU::GetProductInfo($item['PRODUCT_ID']); if (is_array($productInfo) && in_array($productInfo['ID'], $linkedProductsList)) { $addEntry = true; break; } } } if ($addEntry) { $entryData = array( 'ENGINE_ID' => $banner['ENGINE_ID'], 'CAMPAIGN_ID' => $banner['CAMPAIGN_ID'], 'BANNER_ID' => $banner['ID'], 'ORDER_ID' => $orderId, 'SUM' => 0, 'PROCESSED' => OrderTable::NOT_PROCESSED, ); OrderTable::add($entryData); } } } } } protected static function countSessionOrder($orderId) { if( Main\Loader::includeModule('sale') && Main\Loader::includeModule('catalog') && Main\Loader::includeModule('currency') ) { $orderLinks = OrderTable::getList(array( 'filter' => array( '=ORDER_ID' => $orderId, '=PROCESSED' => OrderTable::NOT_PROCESSED, ), 'select' => array('ID', 'BANNER_ID') )); $orderLink = $orderLinks->fetch(); if($orderLink) { $linkedProductsList = static::getBannerLinkedProducts($orderLink['BANNER_ID']); if(count($linkedProductsList) > 0) { $basket = BasketTable::getList(array( 'filter' => array( '=ORDER_ID' => $orderId, ), 'select' => array('PRODUCT_ID', 'GROSS_PROFIT', 'SUMMARY_PRICE', 'SUMMARY_PURCHASING_PRICE', 'QUANTITY'), )); $sum = 0; while($item = $basket->fetch()) { if(in_array($item['PRODUCT_ID'], $linkedProductsList)) { $sum += static::getProductProfit($item); } else { $productInfo = \CCatalogSKU::GetProductInfo($item['PRODUCT_ID']); if(is_array($productInfo) && in_array($productInfo['ID'], $linkedProductsList)) { $sum += static::getProductProfit($item); } } } OrderTable::update($orderLink['ID'], array( 'SUM' => $sum, 'PROCESSED' => OrderTable::PROCESSED, )); } } } } protected static function getBannerLinkedProducts($bannerId) { $linkedProductsList = array(); $linkedProducts = LinkTable::getList( array( 'filter' => array( '=LINK_TYPE' => LinkTable::TYPE_IBLOCK_ELEMENT, '=BANNER_ID' => $bannerId, ), 'select' => array( 'LINK_ID' ) ) ); while($link = $linkedProducts->fetch()) { $linkedProductsList[] = $link['LINK_ID']; } return $linkedProductsList; } // TODO: remove all this math when /sale_refactoring_mince releases protected static function getProductProfit($productInfo) { if($productInfo['GROSS_PROFIT'] <> '') { $profit = doubleval($productInfo['GROSS_PROFIT']); } else { $purchasingCost = 0; if($productInfo['SUMMARY_PURCHASING_PRICE'] <> '') { $purchasingCost = doubleval($productInfo['SUMMARY_PURCHASING_PRICE']); } else { $dbRes = ProductTable::getList(array( 'filter' => array( '=ID' => $productInfo['PRODUCT_ID'], ), 'select' => array( 'ID', 'PURCHASING_PRICE', 'PURCHASING_CURRENCY' ) )); $productInfoBase = $dbRes->fetch(); if($productInfoBase) { $purchasingCost = $productInfoBase['PURCHASING_PRICE'] * $productInfo['QUANTITY']; $baseCurrency = CurrencyManager::getBaseCurrency(); if($baseCurrency != $productInfoBase['PURCHASING_CURRENCY']) { $purchasingCost = \CCurrencyRates::convertCurrency( $purchasingCost, $productInfoBase['PURCHASING_CURRENCY'], $baseCurrency ); } } } $profit = doubleval($productInfo['SUMMARY_PRICE'])-$purchasingCost; } return $profit; } /** * Session object. * * If session is not accessible, returns null. * * @return Session|null */ private static function getSessionStorage(): ?Session { /** @var Session $session */ $session = Application::getInstance()->getSession(); if (!$session->isAccessible()) { return null; } return $session; } }