%PDF- %PDF- 403WebShell
403Webshell
Server IP : 37.220.80.31  /  Your IP : 3.145.107.1
Web Server : Apache/2.4.52 (Ubuntu)
System : Linux 3051455-guretool.twc1.net 5.15.0-107-generic #117-Ubuntu SMP Fri Apr 26 12:26:49 UTC 2024 x86_64
User : www-root ( 1010)
PHP Version : 7.4.33
Disable Function : pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,
MySQL : OFF  |  cURL : ON  |  WGET : OFF  |  Perl : OFF  |  Python : OFF  |  Sudo : OFF  |  Pkexec : OFF
Directory :  /var/www/www-root/data/www/dev.artlot24.ru/bitrix/modules/sale/lib/internals/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Command :


[ Back ]     

Current File : /var/www/www-root/data/www/dev.artlot24.ru/bitrix/modules/sale/lib/internals/shipmentrules.php
<?php

namespace Bitrix\Sale\Internals;

use Bitrix\Main;
use Bitrix\Sale;

/**
 * Class ShipmentRules
 * @package Bitrix\Sale\Internals
 */
class ShipmentRules
{
	/**
	 * ShipmentRules constructor.
	 */
	protected function __construct()
	{
	}

	/**
	 * @param Sale\Order $order
	 * @param PoolQuantity $pool
	 *
	 * @return array
	 */
	public static function createOrderRuleMap(Sale\Order $order, PoolQuantity $pool)
	{
		$resultList = array();

		$items = ItemsPool::getPoolByCode($order->getInternalId());
		if (empty($items))
		{
			return $resultList;
		}

		foreach ($items as $productId => $shipmentItemList)
		{
			foreach ($shipmentItemList as $shipmentItem)
			{
				$shipmentItemRule = static::createReserveRule($shipmentItem, $pool);
				if (!empty($shipmentItemRule) && is_array($shipmentItemRule))
				{
					$resultList[] = $shipmentItemRule;
				}

				$shipmentItemRule = static::createShipRule($shipmentItem, $pool);
				if (!empty($shipmentItemRule) && is_array($shipmentItemRule))
				{
					$resultList[] = $shipmentItemRule;
				}
			}
		}
		return $resultList;
	}

	/**
	 * @param Sale\ShipmentItem $shipmentItem
	 * @param PoolQuantity $pool
	 *
	 * @return array|bool
	 * @throws Main\ObjectNotFoundException
	 */
	private static function createShipRule(Sale\ShipmentItem $shipmentItem, PoolQuantity $pool)
	{
		$basketItem = $shipmentItem->getBasketItem();
		if (!$basketItem)
		{
			throw new Main\ObjectNotFoundException('Entity "BasketItem" not found');
		}

		if ($basketItem->isBundleParent())
		{
			return false;
		}

		/** @var Sale\ShipmentItemCollection $shipmentItemCollection */
		$shipmentItemCollection = $shipmentItem->getCollection();

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

		$shipment = $shipmentItemCollection->getShipment();
		if (!$shipment)
		{
			throw new Main\ObjectNotFoundException('Entity "Shipment" not found');
		}

		$poolQuantitiesList = $pool->getQuantities(PoolQuantity::POOL_QUANTITY_TYPE);
		if (empty($poolQuantitiesList))
		{
			return false;
		}

		$productId = $basketItem->getProductId();
		$needQuantity = (float)$shipmentItem->getQuantity();

		$rule = array(
			'SHIPMENT_ITEM' => $shipmentItem,
			'PRODUCT_ID' => $productId,
			'PROVIDER_NAME' => $basketItem->getProvider(),
			'NEED_RESERVE' => $shipmentItem->needReserve(),
		);

		$storeData = Sale\Internals\Catalog\Provider::createMapShipmentItemStoreData($shipmentItem);
		if (!empty($storeData))
		{
			$shipmentItemIndex = $shipmentItem->getInternalIndex();
			$rule['STORE_DATA'] = array(
				$shipmentItemIndex => $storeData
			);
		}

		if (array_key_exists($productId, $poolQuantitiesList))
		{
			if ($shipment->needShip() === Sale\Internals\Catalog\Provider::SALE_TRANSFER_PROVIDER_SHIPMENT_NEED_SHIP)
			{
				$needQuantity *= -1;
			}

			$shipQuantity = $poolQuantitiesList[$productId] - $needQuantity;
			$rule['ACTION'][PoolQuantity::POOL_QUANTITY_TYPE] = $needQuantity;

			$pool->set(PoolQuantity::POOL_QUANTITY_TYPE, $productId, $shipQuantity);
		}

		return $rule;
	}

	/**
	 * @param Sale\ShipmentItem $shipmentItem
	 * @param PoolQuantity $pool
	 *
	 * @return array|bool
	 * @throws Main\ObjectNotFoundException
	 */
	private static function createReserveRule(Sale\ShipmentItem $shipmentItem, PoolQuantity $pool)
	{
		$basketItem = $shipmentItem->getBasketItem();
		if (!$basketItem)
		{
			throw new Main\ObjectNotFoundException('Entity "BasketItem" not found');
		}

		/** @var Sale\ShipmentItemCollection $shipmentItemCollection */
		$shipmentItemCollection = $shipmentItem->getCollection();

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

		$shipment = $shipmentItemCollection->getShipment();
		if (!$shipment)
		{
			throw new Main\ObjectNotFoundException('Entity "Shipment" not found');
		}

		$poolReservationList = $pool->getQuantities(PoolQuantity::POOL_RESERVE_TYPE);

		if (empty($poolReservationList))
		{
			return false;
		}

		$order = $shipment->getParentOrder();
		if (!$order)
		{
			throw new Main\ObjectNotFoundException('Entity "Order" not found');
		}

		$productId = $basketItem->getProductId();
		$needQuantity = floatval($shipmentItem->getNeedReserveQuantity());

		$rule = array(
			'SHIPMENT_ITEM' => $shipmentItem,
			'PRODUCT_ID' => $productId,
			'PROVIDER_NAME' => $basketItem->getProvider(),
			'STORE' => array()
		);

		if ($shipment->needShip() === Sale\Internals\Catalog\Provider::SALE_TRANSFER_PROVIDER_SHIPMENT_NEED_NOT_SHIP)
		{
			return false;
		}

		if (isset($poolReservationList[$productId]))
		{
			if ($needQuantity == 0)
			{
				$needQuantity = $poolReservationList[$productId];
			}

			$reserveQuantity = $poolReservationList[$productId] - $needQuantity;
			$rule['ACTION'][PoolQuantity::POOL_RESERVE_TYPE] = $needQuantity;

			$pool->set(PoolQuantity::POOL_RESERVE_TYPE, $productId, $reserveQuantity);
		}

		return $rule;
	}


	/**
	 * @param array $rules
	 * @param array $context
	 *
	 * @return Sale\Result
	 * @throws Main\ObjectNotFoundException
	 */
	public static function saveRules(array $rules, array $context)
	{
		$result = new Sale\Result();
		$shipProductsList = array();

		foreach ($rules as $ruleData)
		{
			if (empty($ruleData['ACTION']))
				continue;

			foreach ($ruleData['ACTION'] as $action => $quantity)
			{
				if ($quantity == 0)
					continue;

				$fields = $ruleData;
				$fields['QUANTITY'] = $quantity;
				unset($fields['ACTION']);

				if ($action == PoolQuantity::POOL_QUANTITY_TYPE)
				{
					$shipProductsList[] = $fields;
				}
				elseif ($action == PoolQuantity::POOL_RESERVE_TYPE)
				{
					$reserveProductsList[] = $fields;
				}
			}
		}

		if (!empty($reserveProductsList))
		{
			$creator = Sale\Internals\ProviderCreator::create($context);
			/** @var Sale\ShipmentItem $shipmentItem */
			foreach ($reserveProductsList as $reserveProductData)
			{
				$creator->addShipmentProductData($reserveProductData);
			}

			$r = $creator->reserve();
			if ($r->isSuccess())
			{
				$r = $creator->setItemsResultAfterReserve($r);
				if (!$r->isSuccess())
				{
					$result->addErrors($r->getErrors());
				}
			}
			else
			{
				$result->addErrors($r->getErrors());
			}

		}
		
		if (!empty($shipProductsList))
		{
			$creator = Sale\Internals\ProviderCreator::create($context);
			/** @var Sale\ShipmentItem $shipmentItem */
			foreach ($shipProductsList as $shipProductData)
			{
				$creator->addShipmentProductData($shipProductData);
			}

			$r = $creator->ship();
			if (!$r->isSuccess())
			{
				$result->addErrors($r->getErrors());
			}

			if ($r->hasWarnings())
			{
				$result->addWarnings($r->getWarnings());
			}

			$r = $creator->setItemsResultAfterShip($r);
			if (!$r->isSuccess())
			{
				$result->addErrors($r->getErrors());
			}
		}


		return $result;
	}

}

Youez - 2016 - github.com/yon3zu
LinuXploit