• Модуль: sale
  • Путь к файлу: ~/bitrix/modules/sale/lib/compatible/ordercompatibility.php
  • Класс: BitrixSaleCompatibleOrderCompatibility
  • Вызов: OrderCompatibility::modifyOrder
static function modifyOrder($action, array $fields)
{
	$result = new SaleResult();

	try
	{
		$adminSection = (defined('ADMIN_SECTION') && ADMIN_SECTION === true);

		/** @var SaleCompatibleOrderCompatibility $orderCompatibility */
		$orderCompatibility = static::create($fields);

		/** @var SaleOrder $order */
		$order = $orderCompatibility->getOrder();

		/** @var SalePropertyValueCollection $propCollection */
		$propCollection = $order->getPropertyCollection();

		if (!empty($fields['ORDER_PROP']) && is_array($fields['ORDER_PROP']))
		{
			$fields['PROPERTIES'] = $fields['ORDER_PROP'];
		}

		if (!isset($fields['PROPERTIES']) || !is_array($fields['PROPERTIES']))
		{
			$fields['PROPERTIES'] = array();
		}

		// compatibility to prevent setting default values for empty properties
		/** @var SalePropertyValue $propertyValue */
		foreach ($propCollection as $propertyValue)
		{
			$propertyFields = $propertyValue->getProperty();
			$key = isset($propertyFields['ID']) ? $propertyFields['ID'] : 'n'.$propertyValue->getId();

			if ($propertyValue->getId() <=0
				&& !array_key_exists($key, $fields['PROPERTIES'])
			)
			{
				$propertyValue->delete();
			}
		}

		/** @var SaleResult $r */
		$r = $propCollection->setValuesFromPost($fields, $_FILES);
		if (!$r->isSuccess())
		{
			$result->addErrors($r->getErrors());
			return $result;
		}


		$oldPrice = $order->getPrice();

//			$isStartField = $order->isStartField();


		/** @var SaleBasket $basket */
		$basket = $order->getBasket();

		if (!$basket && $action == static::ORDER_COMPAT_ACTION_SAVE)
		{
			$fUserId = null;


			if (!empty($fields['BASKET_ITEMS']) && is_array($fields['BASKET_ITEMS']))
			{
				foreach ($fields['BASKET_ITEMS'] as $basketItemData)
				{
					if (!empty($basketItemData['FUSER_ID']) && intval($basketItemData['FUSER_ID']) > 0)
					{
						$fUserId = intval($basketItemData['FUSER_ID']);
						break;
					}
				}
			}


			if (intval($fUserId) <= 0 && !$adminSection)
			{
				$fUserId = static::getDefaultFuserId();
			}

			$userId = $order->getUserId();
			if ($userId > 0)
			{
				$fUserIdByUserId = SaleFuser::getIdByUserId($userId);
				if (intval($fUserId) > 0 && intval($fUserIdByUserId) > 0
					&& intval($fUserId) != intval($fUserIdByUserId))
				{
					// TODO: ... [SALE_BASKET_001] - the call of old method of the basket
					CSaleBasket::TransferBasket($fUserId, $fUserIdByUserId);
				}

				$fUserId = $fUserIdByUserId;
			}

			if (intval($fUserId) <= 0)
			{
				$result->addError(new SaleResultError(MainLocalizationLoc::getMessage('SALE_COMPATIBLE_ORDER_FUSERID_NOT_FOUND'), "SALE_COMPATIBLE_ORDER_FUSERID_NOT_FOUND"));
				return $result;
			}


			$registry = SaleRegistry::getInstance(static::getRegistryType());
			/** @var SaleBasket $basketClassName */
			$basketClassName = $registry->getBasketClassName();

			if (!$adminSection)
			{
				$siteId = !empty($fields["SITE_ID"]) ? $fields["SITE_ID"] : (!empty($fields["LID"]) ? $fields['LID']: null);
				$allBasket = $basketClassName::loadItemsForFUser($fUserId, $siteId);

				if ($allBasket)
				{
					$basket = $allBasket->getOrderableItems();
				}
			}


			if (!$basket)
			{
				$basket = $basketClassName::create($order->getSiteId());
				$basket->setFUserId($fUserId);
			}
		}

		$isStartField = $order->isStartField(true);


		if ($basket)
		{
			/** @var BasketCompatibility $basketCompatibilityClassName */
			$basketCompatibilityClassName = static::getBasketCompatibilityClassName();
			$basketCompatibility = $basketCompatibilityClassName::create($orderCompatibility);

			/** @var SaleResult $r */
			$r = $basketCompatibility->fillBasket($basket, $fields);
			if (!$r->isSuccess())
			{
				$result->addErrors($r->getErrors());
				return $result;
			}

			if ($action == static::ORDER_COMPAT_ACTION_SAVE && $order->getId() == 0 && count($basket) > 0)
			{
				$order->setMathActionOnly(true);
				$order->setBasket($basket);
				$order->setMathActionOnly(false);
			}
			
			if ($orderCompatibility->isExistPrice() && $oldPrice == $order->getPrice())
			{
				$order->setFieldNoDemand('PRICE', $orderCompatibility->externalPrice);
			}

		}

		/** @var SaleResult $r */
		$r = $orderCompatibility->fillTaxFromRequest($order->getTax(), $fields);
		if (!$r->isSuccess())
		{
			$result->addErrors($r->getErrors());
			return $result;
		}

		/** @var SaleResult $r */
		$r = $orderCompatibility->fillShipmentCollectionFromRequest( $order->getShipmentCollection(), $fields);
		if (!$r->isSuccess())
		{
			$result->addErrors($r->getErrors());
			return $result;
		}

		if ($isStartField)
		{
			$hasMeaningfulFields = $order->hasMeaningfulField();

			/** @var SaleResult $r */
			$r = $order->doFinalAction($hasMeaningfulFields);
			if (!$r->isSuccess())
			{
				$result->addErrors($r->getErrors());
				return $result;
			}
		}

		$order->setMathActionOnly(false);

		/** @var SaleResult $r */
		$r = $orderCompatibility->fillPaymentCollectionFromRequest($fields);
		if (!$r->isSuccess())
		{
			$result->addErrors($r->getErrors());
			return $result;
		}

		/** @var SaleResult $r */
		$r = static::fillOrderFromRequest($order, $fields);
		if (!$r->isSuccess())
		{
			$result->addErrors($r->getErrors());
			return $result;
		}

	}
	catch(SaleUserMessageException $e)
	{
		$result->addError(new SaleResultError($e->getMessage(), $e->getCode()));
		return $result;
	}

	static::transformationLocation($order);

	/** @var SaleResult $r */
	$r = $order->save();
	if ($r->isSuccess())
	{
		if ($orderData = $r->getData())
			$result->setData($orderData);

		if ($orderId = $r->getId())
			$result->setId($orderId);

		/** @var SaleResult $r */
		$r = $orderCompatibility->saveRawFields($order, static::ENTITY_ORDER);
	}

	if (!$r->isSuccess())
	{
		$result->addErrors($r->getErrors());
	}
	else
	{
		$oldFields = static::convertDateFieldsToOldFormat($order->getFieldValues());
		$oldFields = $oldFields + $orderCompatibility->rawFields;

		/** @var SalePaymentCollection $paymentCollection */
		if ($paymentCollection = $order->getPaymentCollection())
		{
			/** @var SalePayment $payment */
			foreach ($paymentCollection as $payment)
			{
				if ($payment->getId() <= 0)
				{
					continue;
				}

				/** @var SaleResult $r */
				$r = $orderCompatibility->saveRawFields($payment, static::ENTITY_PAYMENT);
				if (!$r->isSuccess())
				{
					$result->addErrors($r->getErrors());
				}
			}
		}
		
		$result->setData(array(
							'OLD_FIELDS' => $oldFields
						));
	}

	return $result;
}