%PDF- %PDF-
Mini Shell

Mini Shell

Direktori : /proc/self/root/home/bitrix/www/bitrix/modules/sale/lib/internals/
Upload File :
Create Path :
Current File : //proc/self/root/home/bitrix/www/bitrix/modules/sale/lib/internals/providerbuilderbase.php

<?php

namespace Bitrix\Sale\Internals;

use Bitrix\Main;
use Bitrix\Sale;

/**
 * Class ProviderBuilderBase
 * @package Bitrix\Sale\Internals
 */
abstract class ProviderBuilderBase
{
	protected $items = array();
	protected $providerClass = null;
	protected $callbackFunction = null;
	protected $context = array();

	/**
	 * @param $providerClass
	 * @param $context
	 *
	 * @return ProviderBuilderBase
	 */
	public static function createBuilder($providerClass, $context)
	{
		if ($providerClass && ($providerClass instanceof Sale\SaleProviderBase))
		{
			$builder = ProviderBuilder::create($providerClass, $context);
		}
		else
		{
			$builder = ProviderBuilderCompatibility::create($providerClass, $context);
		}

		return $builder;
	}

	/**
	 * @param $providerClass
	 * @param $context
	 *
	 * @return ProviderBuilderBase
	 */
	public static function create($providerClass, $context)
	{
		$builder = new static();

		if ($providerClass && !is_string($providerClass))
		{
			$builder->providerClass = $providerClass;
		}
		$builder->context = $context;

		return $builder;
	}

	/**
	 * @param string $className
	 * @param string $methodName
	 * @param Sale\Result|null $result
	 *
	 * @return Sale\Result
	 * @throws Main\ArgumentOutOfRangeException
	 */
	protected function callTransferMethod($className, $methodName, Sale\Result $result = null)
	{
		if (!class_exists($className))
		{
			throw new Main\ArgumentOutOfRangeException('className');
		}

		/**
		 * @var TransferProviderBase $transfer
		 * @var TransferProviderBase $className
		 */
		$transfer = $className::create($this->getProviderClass(), $this->getContext());
		if (!method_exists($transfer, $methodName))
		{
			throw new Main\ArgumentOutOfRangeException('methodName');
		}

		if ($result)
		{
			$r = $transfer->$methodName($this->getItems(), $result);
		}
		else
		{
			$r = $transfer->$methodName($this->getItems());
		}

		return $r;

	}

	/**
	* @param Sale\BasketItemBase $basketItem
	*/
	abstract public function addProductByBasketItem(Sale\BasketItemBase $basketItem);

	/**
	 * @param Sale\ShipmentItem $shipmentItem
	 */
	abstract public function addProductByShipmentItem(Sale\ShipmentItem $shipmentItem);

	/**
	 * @param array $shipmentProductData
	 */
	abstract public function addProductByShipmentProductData(array $shipmentProductData);

	/**
	 * @param array $barcodeParams
	 */
	public function addBasketItemBarcodeData(array $barcodeParams)
	{
		$this->addItem($barcodeParams['PRODUCT_ID'], $barcodeParams);
	}

	/**
	 * @param int $productId
	 */
	public function addProductById($productId)
	{
		$fields = array(
			'PRODUCT_ID' => $productId,
		);

		$this->addItem($productId, $fields);
	}

	/**
	 * @param $outputName
	 *
	 * @return Sale\Result
	 */
	public function getProductData($outputName)
	{
		$r = static::callTransferMethod($this->getTransferClassName(), 'getProductData');
		if (!$r->isSuccess())
		{
			return $r;
		}

		return $this->decomposeIntoProvider($r, $outputName);
	}

	/**
	 * @param $outputName
	 *
	 * @return Sale\Result
	 */
	public function getAvailableQuantity($outputName)
	{
		$r = static::callTransferMethod($this->getTransferClassName(), 'getAvailableQuantity');
		if (!$r->isSuccess())
		{
			return $r;
		}

		return $this->decomposeIntoProvider($r, $outputName);
	}

	/**
	 * @param $outputName
	 *
	 * @return Sale\Result
	 */
	public function getAvailableQuantityAndPrice($outputName)
	{
		$r = static::callTransferMethod($this->getTransferClassName(), 'getAvailableQuantityAndPrice');
		if (!$r->isSuccess())
		{
			return $r;
		}

		return $this->decomposeIntoProvider($r, $outputName);
	}

	/**
	 * @param Sale\Result $resultProvider
	 * @param $outputName
	 *
	 * @return Sale\Result
	 */
	protected function decomposeIntoProvider(Sale\Result $resultProvider, $outputName)
	{
		$result = new Sale\Result();
		$providerData = $resultProvider->getData();

		if (empty($providerData[$outputName]))
		{
			return $result;
		}

		$result->setData($providerData);
		return $result;
	}

	/**
	 * @return Sale\Result
	 */
	public function tryShip()
	{
		return static::callTransferMethod($this->getTransferClassName(), 'tryShip');
	}

	/**
	 * @return Sale\Result
	 */
	public function isNeedShip()
	{
		return static::callTransferMethod($this->getTransferClassName(), 'isNeedShip');
	}

	/**
	 * @return Sale\Result
	 */
	public function getBundleItems()
	{
		return static::callTransferMethod($this->getTransferClassName(), 'getBundleItems');
	}

	/**
	 * @return Sale\Result
	 */
	public function deliver()
	{
		return static::callTransferMethod($this->getTransferClassName(), 'deliver');
	}

	/**
	 * @return Sale\Result
	 */
	public function viewProduct()
	{
		return static::callTransferMethod($this->getTransferClassName(), 'viewProduct');
	}

	/**
	 * @return Sale\Result
	 */
	public function getProductStores()
	{
		return static::callTransferMethod($this->getTransferClassName(), 'getProductStores');
	}

	/**
	 * @return Sale\Result
	 */
	public function checkBarcode()
	{
		return static::callTransferMethod($this->getTransferClassName(), 'checkBarcode');
	}


	/**
	 * @return Sale\Result
	 */
	public function recurring()
	{
		return static::callTransferMethod($this->getTransferClassName(), 'recurring');
	}

	/**
	 * @param PoolQuantity $pool
	 * @param array $productTryShipList
	 *
	 * @return Sale\Result
	 * @throws Main\ObjectNotFoundException
	 */
	abstract public function setItemsResultAfterTryShip(PoolQuantity $pool, array $productTryShipList);

	/**
	 * @param Sale\Result $result
	 *
	 * @return Sale\Result
	 */
	public function setItemsResultAfterReserve(Sale\Result $result)
	{
		return static::callTransferMethod($this->getTransferClassName(), 'setItemsResultAfterReserve', $result);
	}

	/**
	 * @param Sale\Result $result
	 *
	 * @return Sale\Result
	 */
	public function setItemsResultAfterShip(Sale\Result $result)
	{
		return static::callTransferMethod($this->getTransferClassName(), 'setItemsResultAfterShip', $result);
	}

	/**
	 * @return Sale\Result
	 */
	public function reserve()
	{
		return static::callTransferMethod($this->getTransferClassName(), 'reserve');
	}

	/**
	 * @return Sale\Result
	 */
	public function ship()
	{
		return static::callTransferMethod($this->getTransferClassName(), 'ship');
	}

	/**
	 * @param Sale\Result $resultAfterDeliver
	 *
	 * @return Sale\Result
	 * @throws Main\ObjectNotFoundException
	 */
	public function createItemsResultAfterDeliver(Sale\Result $resultAfterDeliver)
	{
		$result = new Sale\Result();
		$resultList = array();
		$products = $this->getItems();

		if (empty($products))
		{
			return $result;
		}

		$resultDeliverData = $resultAfterDeliver->getData();

		foreach ($products as $productId => $productData)
		{
			$providerName = $this->getProviderName();
			if (empty($resultDeliverData['DELIVER_PRODUCTS_LIST']) ||
				empty($resultDeliverData['DELIVER_PRODUCTS_LIST'][$providerName]) ||
				!array_key_exists($productId, $resultDeliverData['DELIVER_PRODUCTS_LIST'][$providerName]))
			{
				continue;
			}

			if (empty($productData['SHIPMENT_ITEM_LIST']))
			{
				continue;
			}

			/**
			 * @var int $shipmentItemIndex
			 * @var Sale\ShipmentItem $shipmentItem
			 */
			foreach ($productData['SHIPMENT_ITEM_LIST'] as $shipmentItemIndex => $shipmentItem)
			{
				$basketItem = $shipmentItem->getBasketItem();

				if (!$basketItem)
				{
					throw new Main\ObjectNotFoundException('Entity "BasketItem" not found');
				}

				$resultList[$basketItem->getBasketCode()] = $resultDeliverData['DELIVER_PRODUCTS_LIST'][$providerName][$productId];
			}
		}

		if (!empty($resultList))
		{
			$result->setData(
				array(
					'RESULT_AFTER_DELIVER_LIST' => $resultList
				)
			);
		}

		return $result;
	}

	/**
	 * @param array $productData
	 */
	protected function addProduct(array $productData)
	{
		$this->items[$productData['PRODUCT_ID']] = $productData;
	}

	/**
	 * @internal
	 * @return string|null
	 */
	public function getProviderClass()
	{
		return $this->providerClass;
	}

	/**
	 * @internal
	 * @return string|null
	 */
	public function getCallbackFunction()
	{
		return $this->callbackFunction;
	}

	/**
	 * @internal
	 * @return string
	 */
	public function getProviderName()
	{
		$providerName = null;
		$providerClass = $this->getProviderClass();
		if ($providerClass)
		{
			$reflect = new \ReflectionClass($this->getProviderClass());
			$providerName = $reflect->getName();
		}

		return  $this->clearProviderName($providerName);
	}

	/**
	 * @param $providerName
	 *
	 * @return string
	 */
	protected function clearProviderName($providerName)
	{
		if (substr($providerName, 0, 1) == "\\")
		{
			$providerName = substr($providerName, 1);
		}

		return $providerName;
	}


	/**
	 * @internal
	 * @return array
	 */
	protected function getContext()
	{
		return $this->context;
	}

	/**
	 * @return array
	 */
	protected function getItems()
	{
		return $this->items;
	}

	/**
	 * @param integer $productId
	 * @param array $productData
	 */
	protected function addItem($productId, array $productData)
	{
		$fields = array();
		if (isset($this->items[$productId]))
		{
			$fields = $this->items[$productId];
		}

		$fields = $productData + $fields;

		if (isset($fields['QUANTITY_LIST'][$productData['BASKET_CODE']]))
		{
			$fields['QUANTITY_LIST'][$productData['BASKET_CODE']] += floatval($productData['QUANTITY']);
		}
		else
		{
			$fields['QUANTITY_LIST'][$productData['BASKET_CODE']] = floatval($productData['QUANTITY']);
		}

		unset($fields['QUANTITY']);

		if (isset($fields['RESERVED_QUANTITY_LIST'][$productData['BASKET_CODE']]))
		{
			$fields['RESERVED_QUANTITY_LIST'][$productData['BASKET_CODE']] += floatval($productData['RESERVED_QUANTITY']);
		}
		else
		{
			$fields['RESERVED_QUANTITY_LIST'][$productData['BASKET_CODE']] = floatval($productData['RESERVED_QUANTITY']);
		}

		unset($fields['RESERVED_QUANTITY']);

		if (isset($productData['SHIPMENT_ITEM']))
		{
			/** @var Sale\ShipmentItem $shipmentItem */
			$shipmentItem = $productData['SHIPMENT_ITEM'];
			unset($fields['SHIPMENT_ITEM']);

			$fields['SHIPMENT_ITEM_LIST'][$shipmentItem->getInternalIndex()] = $shipmentItem;
			$fields['SHIPMENT_ITEM_QUANTITY_LIST'][$shipmentItem->getInternalIndex()] = floatval($productData['QUANTITY']);
		}

		if (isset($productData['STORE_DATA']))
		{
			if (!isset($fields['STORE_DATA_LIST']))
			{
				$fields['STORE_DATA_LIST'] = array();
			}

			$fields['STORE_DATA_LIST'] = $productData['STORE_DATA'] + $fields['STORE_DATA_LIST'];
			unset($fields['STORE_DATA']);
		}

		if (isset($productData['IS_BARCODE_MULTI']) && !isset($fields['IS_BARCODE_MULTI']))
		{
			$fields['IS_BARCODE_MULTI'] = $productData['IS_BARCODE_MULTI'];
		}

		if (isset($productData['SHIPMENT_ITEM_DATA']))
		{
			if (!isset($fields['SHIPMENT_ITEM_DATA_LIST']))
			{
				$fields['SHIPMENT_ITEM_DATA_LIST'] = array();
			}

			$fields['SHIPMENT_ITEM_DATA_LIST'] = $productData['SHIPMENT_ITEM_DATA'] + $fields['SHIPMENT_ITEM_DATA_LIST'];
			unset($fields['SHIPMENT_ITEM_DATA']);
		}

		if (isset($productData['NEED_RESERVE']))
		{
			if (!isset($fields['NEED_RESERVE_LIST']))
			{
				$fields['NEED_RESERVE_LIST'] = array();
			}

			$fields['NEED_RESERVE_LIST'] = $productData['NEED_RESERVE'] + $fields['NEED_RESERVE_LIST'];
			unset($fields['NEED_RESERVE']);
		}
		$this->items[$productId] = $fields;
	}

	/**
	 * @param $productId
	 *
	 * @return bool|array
	 */
	protected function getItem($productId)
	{
		$item = false;
		if ($this->isExistsProductIdInItems($productId))
		{
			$item = $this->items[$productId];
		}
		return $item;
	}

	/**
	 * @param $productId
	 *
	 * @return bool
	 */
	protected function isExistsProductIdInItems($productId)
	{
		return (isset($this->items[$productId]));
	}

	/**
	 * @return string
	 */
	public static function getClassName()
	{
		return get_called_class();
	}

	abstract public function getTransferClassName();
}

Zerion Mini Shell 1.0