- Модуль: 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];
}
}