• Модуль: sale
  • Путь к файлу: ~/bitrix/modules/sale/lib/controller/paymentitembasket.php
  • Класс: BitrixSaleControllerPaymentItemBasket
  • Вызов: PaymentItemBasket::addAction
public function addAction(array $fields): ?array
{
	$result = new Result();
	$paymentItem = null;

	$registry = Registry::getInstance(Registry::REGISTRY_TYPE_ORDER);

	$basketId = $fields['BASKET_ID'];
	$paymentId = $fields['PAYMENT_ID'];

	unset($fields['PAYMENT_ID'], $fields['BASKET_ID']);

	/** @var Basket $basketClass */
	$basketClass = $registry->getBasketClassName();

	$r = $basketClass::getList([
		'select'=>['ORDER_ID'],
		'filter'=>['ID'=>$basketId]
	]);

	if($row = $r->fetch())
	{
		/** @var BitrixSaleOrder $orderClass */
		$orderClass = $registry->getOrderClassName();

		$order = $orderClass::load($row['ORDER_ID']);
		$basketItem = $order->getBasket()->getItemByBasketCode($basketId);
		if($basketItem instanceof BasketItem)
		{
			/** @var PaymentCollection $collection */
			$collection = $order->getPaymentCollection();
			$payment = $collection->getItemById($paymentId);
			if($payment instanceof BitrixSalePayment)
			{
				$paymentItems = $payment->getPayableItemCollection()->getBasketItems();
				if($this->isExistBasketItem($paymentItems, $basketItem) == false)
				{
					/** @var PayableBasketItem $paymentItem */
					$paymentItem = $payment->getPayableItemCollection()->createItemByBasketItem($basketItem);
					$result = $paymentItem->setFields($fields);
					if($result->isSuccess() && $result->hasWarnings() == false)
					{
						$r = $this->save($paymentItem);
						if(!$r->isSuccess())
						{
							$result->addErrors($r->getErrors());
						}
					}
				}
				else
				{
					$result->addError(new Error('Duplicate entry for key [basketId, paymentId]', 201250000001));
				}
			}
			else
			{
				$result->addError(new Error('payment not exists', 201240400002));
			}
		}
	}
	else
	{
		$result->addError(new Error('basket item not exists', 201240400003));
	}

	if(!$result->isSuccess())
	{
		$this->addErrors($result->getErrors());
		return null;
	}
	elseif($result->hasWarnings())
	{
		$this->addErrors($result->getWarnings());
		return null;
	}
	elseif($paymentItem instanceof PayableItem)
	{
		return ['PAYMENT_ITEM_BASKET'=>$paymentItem->toArray()];
	}
	else
	{
		return ['PAYMENT_ITEM_BASKET'=>$paymentItem];
	}
}