%PDF- %PDF-
Mini Shell

Mini Shell

Direktori : /home/bitrix/www/bitrix/modules/sale/lib/helpers/order/builder/
Upload File :
Create Path :
Current File : //home/bitrix/www/bitrix/modules/sale/lib/helpers/order/builder/orderbuilderexist.php

<?
namespace Bitrix\Sale\Helpers\Order\Builder;

use Bitrix\Main\Error;
use Bitrix\Main\Localization\Loc;
use Bitrix\Sale\Helpers\Admin\OrderEdit;
use Bitrix\Sale\Order;
use Bitrix\Sale\Registry;
use Bitrix\Sale\Shipment;

/**
 * Class OrderBuilderExist
 * @package Bitrix\Sale\Helpers\Order\Builder
 * @internal
 */
final class OrderBuilderExist implements IOrderBuilderDelegate
{
	/** @var OrderBuilder|null  */
	protected $builder = null;

	/**
	 * OrderBuilderExist constructor.
	 * @param OrderBuilder $builder
	 */
	public function __construct(OrderBuilder $builder)
	{
		$this->builder = $builder;
	}

	/**
	 * @param array $data Form data.
	 * @return Order
	 * @throws BuildingException
	 * @throws \Bitrix\Main\ArgumentException
	 */
	public function createOrder(array $data)
	{
		$orderClassName = $this->builder->getRegistry()->getOrderClassName();
		$currentUserId = 0;
		$oldUserId = null;

		if ((int)$data["USER_ID"] > 0)
		{
			$currentUserId = (int)$data["USER_ID"];
		}

		if ((int)$data["OLD_USER_ID"] > 0)
		{
			$oldUserId = (int)$data["OLD_USER_ID"];
		}

		//If buyer changed - discount also can be changed
		OrderEdit::initCouponsData($currentUserId, $data["ID"], $oldUserId);
		$order = $orderClassName::load($data["ID"]);

		if(!$order)
		{
			$this->builder->getErrorsContainer()->addError(new Error(Loc::getMessage("SALE_HLP_OBE_ORDER_NOT_LOADED")));
			throw new BuildingException();
		}

		return $order;
	}

	public function setUser()
	{
		$currentUserId = $this->builder->getOrder()->getUserId();

		$formDataUserId = (int)$this->builder->getFormData()['USER_ID'];
		$isChanged = ((int)$currentUserId !== $formDataUserId);
		if ($currentUserId && $isChanged)
		{
			$paymentCollection = $this->builder->getOrder()->getPaymentCollection();
			/** @var \Bitrix\Sale\Payment $payment */
			foreach ($paymentCollection as $payment)
			{
				if ($payment->isPaid())
				{
					$this->builder->getErrorsContainer()->addError(new Error(
						Loc::getMessage("SALE_HLP_OBE_CHANGE_USER_ERROR")
						, 'SALE_ORDEREDIT_ERROR_CHANGE_USER_WITH_PAID_PAYMENTS'));
				}
			}
		}

		$this->builder->getOrder()->setFieldNoDemand(
			"USER_ID",
			$this->builder->getUserId()
		);

		if ($isChanged)
		{
			$personTypeId =  (int)$this->builder->getOrder()->getPersonTypeId();
			$resultLoading = \Bitrix\Sale\OrderUserProperties::loadProfiles($formDataUserId, $personTypeId);
			if (!$resultLoading->isSuccess())
			{
				return;
			}
			$profiles = $resultLoading->getData();
			if (!is_array($profiles[$personTypeId]))
			{
				return;
			}
			$currentProfile = current($profiles[$personTypeId]);
			if (empty($currentProfile))
			{
				return;
			}
			$values = $currentProfile['VALUES'];
			$propertyCollection = $this->builder->getOrder()->getPropertyCollection();
			$propertyCollection->setValuesFromPost(
				['PROPERTIES' => $values],[]
			);
		}
	}

	public function buildBasket()
	{
		if(is_array($this->builder->getFormData('PRODUCT')))
		{
			$this->builder->getBasketBuilder()
				->initBasket()
				->preliminaryDataPreparation()
				->removeDeletedItems() //edit only
				->itemsDataPreparation()
				->basketCodeMap()
				->setItemsFields()
				->finalActions();
		}
	}

	public function setShipmentPriceFields(Shipment $shipment, array $fields)
	{
		$priceDelivery = $fields['PRICE_DELIVERY'];

		if($fields['CUSTOM_PRICE_DELIVERY'] == 'Y' || !isset($fields['BASE_PRICE_DELIVERY']))
		{
			$basePriceDelivery = $priceDelivery;
		}
		else
		{
			$basePriceDelivery = $fields['BASE_PRICE_DELIVERY'];
		}

		$fields['BASE_PRICE_DELIVERY'] = $basePriceDelivery;
		$fields['PRICE_DELIVERY'] = $priceDelivery;

		$res = $shipment->setFields($fields);

		if(!$res->isSuccess())
		{
			$this->builder->getErrorsContainer()->addErrors($res->getErrors());
		}

		return $shipment;
	}
}

Zerion Mini Shell 1.0