Your IP : 13.59.36.4


Current Path : /var/www/u0635749/data/www/hobbyclick.ru/public/bitrix/modules/sale/general/
Upload File :
Current File : /var/www/u0635749/data/www/hobbyclick.ru/public/bitrix/modules/sale/general/step_operations.php

<?
use Bitrix\Main,
	Bitrix\Main\Localization\Loc,
	Bitrix\Main\Loader,
	Bitrix\Sale;

if (!Loader::includeModule('catalog'))
	return;

Loc::loadMessages(__FILE__);

class CSaleBasketDiscountConvert extends CCatalogStepOperations
{
	const SESSION_PREFIX = 'BDC';

	protected $filter = array();
	protected $orderViewUrl = '';

	public function __construct($sessID, $maxExecutionTime, $maxOperationCounter)
	{
		$sessID = (string)$sessID;
		if ($sessID == '')
			$sessID = self::SESSION_PREFIX.time();

		if (Main\Config\Option::get('main', '~sale_converted_15', 'N') == 'Y')
			$this->orderViewUrl = '/bitrix/admin/sale_order_view.php?ID=#ID#&lang='.LANGUAGE_ID;
		else
			$this->orderViewUrl = '/bitrix/admin/sale_order_detail.php?ID=#ID#&lang='.LANGUAGE_ID;

		parent::__construct($sessID, $maxExecutionTime, $maxOperationCounter);
	}

	public function setFilter($filter)
	{
		if (empty($filter) || !is_array($filter))
			return;
		$this->filter = $filter;
	}

	public function runOperation()
	{
		$found = false;
		$filter = array('>ID' => $this->lastID, 'ORDER_DISCOUNT_DATA.ID' => null);
		if (!empty($this->filter))
		{
			foreach ($this->filter as $filterKey => $filterValue)
				$filter[$filterKey] = $filterValue;
			unset($filterKey, $filterValue);
		}
		$ordersIterator = Sale\Internals\OrderTable::getList(array(
			'select' => array('ID', 'CURRENCY', 'LID'),
			'filter' => $filter,
			'order' => array('ID' => 'ASC'),
			'limit' => $this->maxOperationCounter
		));
		while ($order = $ordersIterator->fetch())
		{
			$found = true;

			$migrateResult = Sale\Discount\Migration\OrderDiscountMigrator::processing($order);
			$this->lastID = $order['ID'];
			$this->allOperationCounter++;
			if (!$migrateResult->isSuccess())
			{
				$this->errorCounter++;
				$this->stepErrors[] = Loc::getMessage(
					'SALE_BASKET_DISCOUNT_ORDER_ERROR_REPORT',
					array(
						'#URL#' => str_replace('#ID#', $order['ID'], $this->orderViewUrl),
						'#TITLE#' => $order['ID'],
						'#ERRORS#' => implode('; ', $migrateResult->getErrorMessages())
					)
				);
			}
			unset($migrateResult);

			if ($this->maxExecutionTime > 0 && (time() - $this->startOperationTime > $this->maxExecutionTime))
				break;
		}
		unset($order, $ordersIterator);
		if (!$found)
			$this->finishOperation = true;
	}

	public static function getAllCounter()
	{
		$countQuery = new Main\Entity\Query(Sale\Internals\OrderTable::getEntity());
		$countQuery->addSelect(new Main\Entity\ExpressionField('CNT', 'COUNT(1)'));
		$countQuery->setFilter(array('ORDER_DISCOUNT_DATA.ID' => null));
		$totalCount = $countQuery->setLimit(null)->setOffset(null)->exec()->fetch();
		return (int)$totalCount['CNT'];
	}

	public static function getFilterCounter($filter)
	{
		if (!is_array($filter))
			$filter = array();
		if (empty($filter))
			return self::getAllCounter();
		$filter['ORDER_DISCOUNT_DATA.ID'] = null;
		$countQuery = new Main\Entity\Query(Sale\Internals\OrderTable::getEntity());
		$countQuery->addSelect(new Main\Entity\ExpressionField('CNT', 'COUNT(1)'));
		$countQuery->setFilter($filter);
		$totalCount = $countQuery->setLimit(null)->setOffset(null)->exec()->fetch();
		return (int)$totalCount['CNT'];
	}

	public static function checkFilter(Main\HttpRequest $request)
	{
		$filter = array();

		if (!empty($request['filter']['filter_type']))
		{
			switch ($request['filter']['filter_type'])
			{
				case 'id':
					if (isset($request['filter']['order_id_from']) && (int)$request['filter']['order_id_from'] > 0)
						$filter['>=ID'] = (int)$request['filter']['order_id_from'];
					if (isset($request['filter']['order_id_to']) && (int)$request['filter']['order_id_to'] > 0)
						$filter['<=ID'] = (int)$request['filter']['order_id_to'];
					break;
				case 'date':
					CTimeZone::Disable();
					if (isset($request['filter']['order_date_from']) && is_string($request['filter']['order_date_from']))
					{
						$date = trim($request['filter']['order_date_from']);
						if ($date != '')
						{
							try
							{
								$filter['>=DATE_INSERT'] = Main\Type\DateTime::createFromUserTime($date);
							}
							catch (Main\ObjectException $e)
							{

							}
						}
						unset($date);
					}
					if (isset($request['filter']['order_date_to']) && is_string($request['filter']['order_date_to']))
					{
						$date = trim($request['filter']['order_date_to']);
						if ($date != '')
						{
							try
							{
								$filter['<=DATE_INSERT'] = Main\Type\DateTime::createFromUserTime($date);
							}
							catch (Main\ObjectException $e)
							{

							}
						}
						unset($date);
					}
					CTimeZone::Enable();
					break;
			}
		}

		return $filter;
	}
}

class CSaleDiscountReindex extends CCatalogStepOperations
{
	const SESSION_PREFIX = 'SDR';

	protected $discountEditUrl = '';

	public function __construct($sessID, $maxExecutionTime, $maxOperationCounter)
	{
		$sessID = (string)$sessID;
		if ($sessID == '')
			$sessID = self::SESSION_PREFIX.time();
		$this->discountEditUrl = '/bitrix/admin/sale_discount_edit.php?ID=#ID#&lang='.LANGUAGE_ID;
		parent::__construct($sessID, $maxExecutionTime, $maxOperationCounter);
	}

	public function runOperation()
	{
		global $APPLICATION;

		$found = false;
		$filter = array('>ID' => $this->lastID, '=VERSION' => Sale\Internals\DiscountTable::VERSION_15);

		$discountsIterator = Sale\Internals\DiscountTable::getList(array(
			'select' => array(
				'ID', 'MODIFIED_BY', 'TIMESTAMP_X', 'CONDITIONS_LIST', 'ACTIONS_LIST', 'NAME'
			),
			'filter' => $filter,
			'order' => array('ID' => 'ASC'),
			'limit' => $this->maxOperationCounter
		));
		while ($discount = $discountsIterator->fetch())
		{
			$found = true;
			$error = array();
			$rawFields = array(
				'ID' => $discount['ID'],
				'CONDITIONS' => $discount['CONDITIONS_LIST'],
				'ACTIONS' => $discount['ACTIONS_LIST']
			);
			if (\CSaleDiscount::checkFields('UPDATE', $rawFields))
			{
				$fields = array(
					'MODIFIED_BY' => $discount['MODIFIED_BY'],
					'TIMESTAMP_X' => $discount['TIMESTAMP_X'],
					'UNPACK' => $rawFields['UNPACK'],
					'APPLICATION' => $rawFields['APPLICATION']
				);
				if (isset($rawFields['EXECUTE_MODULE']))
					$fields['EXECUTE_MODULE'] = $rawFields['EXECUTE_MODULE'];
				$useCoupons = 'N';
				$coupon = Sale\Internals\DiscountCouponTable::getList(array(
					'select' => array('ID', 'DISCOUNT_ID'),
					'filter' => array('=DISCOUNT_ID' => $discount['ID']),
					'limit' => 1
				))->fetch();
				if (!empty($coupon))
					$useCoupons = 'Y';
				$fields['USE_COUPONS'] = $useCoupons;
				unset($coupon, $useCoupons);
				$updateResult = Sale\Internals\DiscountTable::update($discount['ID'], $fields);
				if ($updateResult->isSuccess())
				{
					if (isset($rawFields['ENTITIES']))
						Sale\Internals\DiscountEntitiesTable::updateByDiscount($discount['ID'], $rawFields['ENTITIES'], true);
					if (isset($rawFields['HANDLERS']['MODULES']))
						Sale\Internals\DiscountModuleTable::updateByDiscount($discount['ID'], $rawFields['HANDLERS']['MODULES'], true);
				}
				else
				{
					$error = $updateResult->getErrorMessages();
				}
			}
			else
			{
				if ($ex = $APPLICATION->GetException())
					$error[] = $ex->GetString();
				else
					$error[] = Loc::getMessage('SALE_DISCOUNT_REINDEX_UPDATE_UNKNOWN_ERROR');
			}
			$this->lastID = $discount['ID'];
			$this->allOperationCounter++;
			if (!empty($error))
			{
				$this->errorCounter++;
				$this->stepErrors[] = Loc::getMessage(
					'SALE_DISCOUNT_REINDEX_ORDER_ERROR_REPORT',
					array(
						'#URL#' => str_replace('#ID#', $discount['ID'], $this->discountEditUrl),
						'#TITLE#' => (trim((string)$discount['NAME']) != '' ? $discount['NAME'] : $discount['ID']),
						'#ERRORS#' => implode('; ', $error)
					)
				);
			}

			if ($this->maxExecutionTime > 0 && (time() - $this->startOperationTime > $this->maxExecutionTime))
				break;
		}
		unset($discount, $discountsIterator);

		if (!$found)
			$this->finishOperation = true;
	}

	public static function getAllCounter()
	{
		$countQuery = new Main\Entity\Query(Sale\Internals\DiscountTable::getEntity());
		$countQuery->addSelect(new Main\Entity\ExpressionField('CNT', 'COUNT(1)'));
		$countQuery->setFilter(array('=VERSION' => Sale\Internals\DiscountTable::VERSION_15));
		$totalCount = $countQuery->setLimit(null)->setOffset(null)->exec()->fetch();
		return (int)$totalCount['CNT'];
	}
}

class CSaleDiscountConvertExt extends CCatalogStepOperations
{
	const SESSION_PREFIX = 'SDC15';

	protected $discountEditUrl = '';
	protected $deliveryCodes = array();
	protected $deliveryRuleId = 'CondSaleDelivery';

	public function __construct($sessID, $maxExecutionTime, $maxOperationCounter)
	{
		$sessID = (string)$sessID;
		if ($sessID == '')
			$sessID = self::SESSION_PREFIX.time();
		$this->discountEditUrl = '/bitrix/admin/sale_discount_edit.php?ID=#ID#&lang='.LANGUAGE_ID;
		parent::__construct($sessID, $maxExecutionTime, $maxOperationCounter);
	}

	public function runOperation()
	{
		global $APPLICATION;

		$this->getDeliveryCodes();

		$found = false;
		$filter = array('>ID' => $this->lastID, '=VERSION' => Sale\Internals\DiscountTable::VERSION_NEW);

		$discountsIterator = Sale\Internals\DiscountTable::getList(array(
			'select' => array(
					'ID', 'MODIFIED_BY', 'TIMESTAMP_X', 'CONDITIONS_LIST', 'ACTIONS_LIST', 'NAME'
			),
			'filter' => $filter,
			'order' => array('ID' => 'ASC'),
			'limit' => $this->maxOperationCounter
		));
		while ($discount = $discountsIterator->fetch())
		{
			$found = true;
			$error = array();
			$this->convertDelivery($discount['CONDITIONS_LIST']);
			$rawFields = array(
				'ID' => $discount['ID'],
				'CONDITIONS' => $discount['CONDITIONS_LIST'],
				'ACTIONS' => $discount['ACTIONS_LIST']
			);
			if (\CSaleDiscount::checkFields('UPDATE', $rawFields))
			{
				$fields = array(
					'MODIFIED_BY' => $discount['MODIFIED_BY'],
					'TIMESTAMP_X' => $discount['TIMESTAMP_X'],
					'UNPACK' => $rawFields['UNPACK'],
					'CONDITIONS_LIST' => $discount['CONDITIONS_LIST'],
					'VERSION' => Sale\Internals\DiscountTable::VERSION_15
				);
				if (isset($rawFields['EXECUTE_MODULE']))
					$fields['EXECUTE_MODULE'] = $rawFields['EXECUTE_MODULE'];
				$updateResult = Sale\Internals\DiscountTable::update($discount['ID'], $fields);
				if ($updateResult->isSuccess())
				{
					if (isset($rawFields['ENTITIES']))
						Sale\Internals\DiscountEntitiesTable::updateByDiscount($discount['ID'], $rawFields['ENTITIES'], true);
					if (isset($rawFields['HANDLERS']['MODULES']))
						Sale\Internals\DiscountModuleTable::updateByDiscount($discount['ID'], $rawFields['HANDLERS']['MODULES'], true);
				}
				else
				{
					$error = $updateResult->getErrorMessages();
				}
			}
			else
			{
				if ($ex = $APPLICATION->GetException())
					$error[] = $ex->GetString();
				else
					$error[] = Loc::getMessage('SALE_DISCOUNT_REINDEX_UPDATE_UNKNOWN_ERROR');
			}
			$this->lastID = $discount['ID'];
			$this->allOperationCounter++;
			if (!empty($error))
			{
				$this->errorCounter++;
				$this->stepErrors[] = Loc::getMessage(
					'SALE_DISCOUNT_REINDEX_ORDER_ERROR_REPORT',
					array(
						'#URL#' => str_replace('#ID#', $discount['ID'], $this->discountEditUrl),
						'#TITLE#' => (trim((string)$discount['NAME']) != '' ? $discount['NAME'] : $discount['ID']),
						'#ERRORS#' => implode('; ', $error)
					)
				);
			}

			if ($this->maxExecutionTime > 0 && (time() - $this->startOperationTime > $this->maxExecutionTime))
				break;
		}
		unset($discount, $discountsIterator);

		if (!$found)
			$this->finishOperation = true;
	}

	public static function getAllCounter()
	{
		$countQuery = new Main\Entity\Query(Sale\Internals\DiscountTable::getEntity());
		$countQuery->addSelect(new Main\Entity\ExpressionField('CNT', 'COUNT(1)'));
		$countQuery->setFilter(array(
			'=VERSION' => Sale\Internals\DiscountTable::VERSION_NEW,
			'=DISCOUNT_ENTITY.ENTITY' => 'ORDER',
			'=DISCOUNT_ENTITY.FIELD_ENTITY' => 'PAY_SYSTEM_ID'
		));
		$totalCount = $countQuery->setLimit(null)->setOffset(null)->exec()->fetch();
		return (int)$totalCount['CNT'];
	}

	protected function getDeliveryCodes()
	{
		$this->deliveryCodes = array();
		$deliveryIterator = Sale\Delivery\Services\Table::getList(array(
			'select' => array('ID', 'CODE'),
		));
		while ($delivery = $deliveryIterator->fetch())
		{
			$delivery['CODE'] = (string)$delivery['CODE'];
			if ($delivery['CODE'] == '')
				continue;
			$this->deliveryCodes[$delivery['CODE']] = $delivery['ID'];
		}
		unset($delivery, $deliveryIterator);
	}

	protected function convertDelivery(&$condition)
	{
		if (empty($condition) || !is_array($condition))
			return;
		if (!isset($condition['CLASS_ID']))
			return;
		if ($condition['CLASS_ID'] == $this->deliveryRuleId)
		{
			if (empty($condition['DATA']) || !is_array($condition['DATA']))
				return;
			if (empty($condition['DATA']['value']))
				return;
			$value = $condition['DATA']['value'];
			if (!is_array($value))
				$value = array($value);
			$newValue = array();
			foreach ($value as &$item)
			{
				if (isset($this->deliveryCodes[$item]))
					$newValue[] = $this->deliveryCodes[$item];
			}
			unset($item);
			$condition['DATA']['value'] = $newValue;
			unset($newValue, $value);
		}
		elseif (!empty($condition['CHILDREN']) && is_array($condition['CHILDREN']))
		{
			foreach ($condition['CHILDREN'] as &$subCondition)
				$this->convertDelivery($subCondition);
			unset($subCondition);
		}
	}
}