Your IP : 3.16.67.57


Current Path : /home/bitrix/ext_www/klimatlend.ua/bitrix/modules/sale/lib/
Upload File :
Current File : /home/bitrix/ext_www/klimatlend.ua/bitrix/modules/sale/lib/basket.php

<?php
/**
 * Bitrix Framework
 * @package bitrix
 * @subpackage sale
 * @copyright 2001-2012 Bitrix
 */
namespace Bitrix\Sale;

use Bitrix\Main\Localization\Loc;
use Bitrix\Sale\Internals;
use Bitrix\Main;

Loc::loadMessages(__FILE__);

/**
 * Class Basket
 * @package Bitrix\Sale
 */
class Basket extends BasketBase
{
	const BASKET_DELETE_LIMIT = 2000;

	/**
	 * @throws Main\NotImplementedException
	 * @return Basket
	 */
	protected static function createBasketObject()
	{
		$registry = Registry::getInstance(Registry::REGISTRY_TYPE_ORDER);
		$basketClassName = $registry->getBasketClassName();

		return new $basketClassName;
	}

	/**
	 * @param array $filter
	 *
	 * @return Basket
	 */
	public function loadFromDb(array $filter)
	{
		$select = array(
			"ID", "LID", "MODULE", "PRODUCT_ID", "QUANTITY", "WEIGHT",
			"DELAY", "CAN_BUY", "PRICE", "CUSTOM_PRICE", "BASE_PRICE",
			'PRODUCT_PRICE_ID', 'PRICE_TYPE_ID', "CURRENCY", 'BARCODE_MULTI',
			"RESERVED", "RESERVE_QUANTITY",	"NAME", "CATALOG_XML_ID",
			"VAT_RATE", "NOTES", "DISCOUNT_PRICE","PRODUCT_PROVIDER_CLASS",
			"CALLBACK_FUNC", "ORDER_CALLBACK_FUNC", "PAY_CALLBACK_FUNC",
			"CANCEL_CALLBACK_FUNC", "DIMENSIONS", "TYPE", "SET_PARENT_ID",
			"DETAIL_PAGE_URL", "FUSER_ID", 'MEASURE_CODE', 'MEASURE_NAME',
			'ORDER_ID', 'DATE_INSERT', 'DATE_UPDATE', 'PRODUCT_XML_ID',
			'SUBSCRIBE', 'RECOMMENDATION', 'VAT_INCLUDED', 'SORT',
			'DATE_REFRESH', 'DISCOUNT_NAME', 'DISCOUNT_VALUE', 'DISCOUNT_COUPON'
		);

		$itemList = array();
		$first = true;

		$res = static::getList(array(
			"select" => $select,
			"filter" => $filter,
			"order" => array('SORT' => 'ASC', 'ID' => 'ASC'),
		));
		while ($item = $res->fetch())
		{
			if ($first)
			{
				$this->setSiteId($item['LID']);
				$this->setFUserId($item['FUSER_ID']);
				$first = false;
			}

			$itemList[$item['ID']] = $item;
		}

		foreach ($itemList as $id => $item)
		{
			if ($item['SET_PARENT_ID'] > 0)
			{
				$itemList[$item['SET_PARENT_ID']]['ITEMS'][$id] = &$itemList[$id];
			}
		}

		$result = array();
		foreach ($itemList as $id => $item)
		{
			if ($item['SET_PARENT_ID'] == 0)
				$result[$id] = $item;
		}

		$this->loadFromArray($result);

		return $this;
	}

	/**
	 * @param array $parameters
	 * @return \Bitrix\Main\DB\Result
	 */
	public static function getList(array $parameters = array())
	{
		return Internals\BasketTable::getList($parameters);
	}

	/**
	 * @internal
	 *
	 * Delete basket items without demands.
	 *
	 * @param $idOrder
	 * @return Result
	 * @throws Main\ObjectNotFoundException
	 */
	public static function deleteNoDemand($idOrder)
	{
		$result = new Result();

		$itemsDataList = Internals\BasketTable::getList(
			array(
				"filter" => array("=ORDER_ID" => $idOrder),
				"select" => array("ID")
			)
		);

		while ($item = $itemsDataList->fetch())
		{
			$r = Internals\BasketTable::deleteWithItems($item['ID']);
			if (!$r->isSuccess())
			{
				$result->addErrors($r->getErrors());
			}
		}

		return $result;
	}


	/**
	 * @param int $days
	 *
	 * @return bool
	 */
	public static function deleteOld($days)
	{
		$expired = new Main\Type\DateTime();
		$expired->add('-'.$days.' days');
		$expiredValue = $expired->format('Y-m-d H:i:s');

		/** @var Main\DB\Connection $connection */
		$connection = Main\Application::getConnection();
		/** @var Main\DB\SqlHelper $sqlHelper */
		$sqlHelper = $connection->getSqlHelper();

		$sqlExpiredDate = $sqlHelper->getDateToCharFunction("'" . $expiredValue . "'");

		$query = "DELETE FROM b_sale_basket	WHERE
			FUSER_ID IN (
				SELECT b_sale_fuser.id FROM b_sale_fuser WHERE
						b_sale_fuser.DATE_UPDATE < ".$sqlExpiredDate."
						AND b_sale_fuser.USER_ID IS NULL
				) AND ORDER_ID IS NULL LIMIT ". static::BASKET_DELETE_LIMIT;

		$connection->queryExecute($query);
		$affectRows = $connection->getAffectedRowsCount();

		$query = "DELETE FROM b_sale_basket	
			WHERE
				FUSER_ID NOT IN (SELECT b_sale_fuser.id FROM b_sale_fuser)
				AND 
				ORDER_ID IS NULL
			LIMIT ". static::BASKET_DELETE_LIMIT;

		$connection->queryExecute($query);
		$affectRows = max($affectRows, $connection->getAffectedRowsCount());

		$query = "
			DELETE
			FROM b_sale_basket_props 
			WHERE b_sale_basket_props.BASKET_ID NOT IN (
				SELECT b_sale_basket.ID FROM b_sale_basket
			)
			LIMIT ".static::BASKET_DELETE_LIMIT;

		$connection->queryExecute($query);

		return max($affectRows, $connection->getAffectedRowsCount());
	}

	/**
	 * @param $days
	 * @param int $speed
	 * @return string
	 * @throws Main\ArgumentNullException
	 * @throws Main\ArgumentOutOfRangeException
	 */
	public static function deleteOldAgent($days, $speed = 0)
	{
		if (!isset($GLOBALS["USER"]) || !is_object($GLOBALS["USER"]))
		{
			$tmpUser = True;
			$GLOBALS["USER"] = new \CUser();
		}

		$affectRows = static::deleteOld($days);
		Fuser::deleteOld($days);

		$days = intval(Main\Config\Option::get("sale", "delete_after", "30"));
		$result = "\Bitrix\Sale\Basket::deleteOldAgent(".$days.");";

		if ($affectRows === static::BASKET_DELETE_LIMIT)
		{
			global $pPERIOD;
			$pPERIOD = 300;
		}

		if (isset($tmpUser))
		{
			unset($GLOBALS["USER"]);
		}

		return $result;
	}

	/**
	 * @internal
	 * @return array|bool
	 */
	// must be moved to notify
	public function getListOfFormatText()
	{
		$list = array();

		$registry = Registry::getInstance(Registry::REGISTRY_TYPE_ORDER);
		/** @var BasketItem $basketItemClassName */
		$basketItemClassName = $registry->getBasketItemClassName();

		/** @var BasketItem $basketItem */
		foreach ($this->collection as $basketItem)
		{
			$basketItemData = $basketItem->getField("NAME");

			/** @var \Bitrix\Sale\BasketPropertiesCollection $basketPropertyCollection */
			if ($basketPropertyCollection = $basketItem->getPropertyCollection())
			{
				$basketItemDataProperty = "";
				/** @var \Bitrix\Sale\BasketPropertyItem $basketPropertyItem */
				foreach ($basketPropertyCollection as $basketPropertyItem)
				{
					if ($basketPropertyItem->getField('CODE') == "PRODUCT.XML_ID"
						|| $basketPropertyItem->getField('CODE') == "CATALOG.XML_ID"
						|| $basketPropertyItem->getField('CODE') == "SUM_OF_CHARGE"
					)
					{
						continue;
					}

					if (strval(trim($basketPropertyItem->getField('VALUE'))) == "")
						continue;


					$basketItemDataProperty .= (!empty($basketItemDataProperty) ? "; " : "").trim($basketPropertyItem->getField('NAME')).": ".trim($basketPropertyItem->getField('VALUE'));
				}

				if (!empty($basketItemDataProperty))
					$basketItemData .= " [".$basketItemDataProperty."]";
			}

			$measure = (strval($basketItem->getField("MEASURE_NAME")) != '') ? $basketItem->getField("MEASURE_NAME") : Loc::getMessage("SOA_SHT");
			$list[$basketItem->getBasketCode()] = $basketItemData." - ".$basketItemClassName::formatQuantity($basketItem->getQuantity())." ".$measure." x ".SaleFormatCurrency($basketItem->getPrice(), $basketItem->getCurrency());

		}

		return !empty($list) ? $list : false;
	}

	/**
	 * @param array $requestBasket
	 * @return Basket
	 * @throws UserMessageException
	 */
	public static function createFromRequest(array $requestBasket)
	{
		if (array_key_exists('SITE_ID', $requestBasket) && strval($requestBasket['SITE_ID']) != '')
		{
			throw new UserMessageException('site_id not found');
		}

		/** @var Basket $basket */
		$basket = static::create($requestBasket['SITE_ID']);

		foreach ($requestBasket as $requestBasketItem)
		{
			$basketItem = static::createItemInternal($basket, $requestBasketItem['MODULE'], $requestBasketItem['PRODUCT_ID']);
			$basketItem->initFields($requestBasketItem);

			$basket->addItem($basketItem);
		}

		return $basket;
	}

	/**
	 * @return array
	 */
	protected function getOriginalItemsValues()
	{
		$result = array();

		/** @var Order $order */
		$order = $this->getOrder();
		$isNew = $order && $order->isNew();

		$filter = array();
		if (!$isNew && $order && $order->getId() > 0)
		{
			$filter['ORDER_ID'] = $order->getId();
		}
		else
		{
			if ($this->isLoadForFUserId)
			{
				$filter = array(
					'FUSER_ID' => $this->getFUserId(),
					'ORDER_ID' => null,
					'LID' => $this->getSiteId()
				);
			}

			if ($isNew)
			{
				$fUserId = $this->getFUserId(true);
				if ($fUserId <= 0)
				{
					$userId = $order->getUserId();
					if (intval($userId) > 0)
					{
						$fUserId = Fuser::getIdByUserId($userId);
						if ($fUserId > 0)
							$this->setFUserId($fUserId);
					}
				}
			}
		}

		if ($filter)
		{
			$dbRes = static::getList(
				array(
					"select" => array("ID", 'TYPE', 'SET_PARENT_ID', 'PRODUCT_ID', 'NAME', 'QUANTITY', 'FUSER_ID', 'ORDER_ID'),
					"filter" => $filter,
				)
			);

			while ($item = $dbRes->fetch())
			{
				if ((int)$item['SET_PARENT_ID'] > 0 && (int)$item['SET_PARENT_ID'] != $item['ID'])
				{
					continue;
				}

				$result[$item["ID"]] = $item;
			}
		}

		return $result;
	}

	/**
	 * @param array $itemValues
	 */
	protected function deleteInternal(array $itemValues)
	{
		/** @var BasketItem $basketItemClassName */
		$basketItemClassName = $this->getBasketItemCollectionElementClassName();
		if ($itemValues['TYPE'] == $basketItemClassName::TYPE_SET)
		{
			Internals\BasketTable::deleteBundle($itemValues['ID']);
		}
		else
		{
			Internals\BasketTable::deleteWithItems($itemValues['ID']);
		}
	}

	/**
	 * @return string
	 */
	protected function getItemEventName()
	{
		/** @var BasketItem $basketItemClassName */
		$basketItemClassName = $this->getBasketItemCollectionElementClassName();
		return $basketItemClassName::getEntityEventName();
	}

	/**
	 * @return string
	 */
	protected function getBasketItemCollectionElementClassName()
	{
		$registry  = Registry::getInstance(Registry::REGISTRY_TYPE_ORDER);

		return $registry->getBasketItemClassName();
	}

	/**
	 * @return array
	 */
	public function getContext()
	{
		$context = array();

		$order = $this->getOrder();
		/** @var OrderBase $order */
		if ($order)
		{
			$context['USER_ID'] = $order->getUserId();
			$context['SITE_ID'] = $order->getSiteId();
			$context['CURRENCY'] = $order->getCurrency();
		}
		else
		{
			$context = parent::getContext();
		}

		return $context;
	}

}