- Модуль: sale
- Путь к файлу: ~/bitrix/modules/sale/lib/compatible/basketcompatibility.php
- Класс: BitrixSaleCompatibleBasketCompatibility
- Вызов: BasketCompatibility::add
static function add(array $fields)
{
$result = new SaleResult();
$order = null;
$basket = null;
$item = null;
$registry = SaleRegistry::getInstance(static::getRegistryType());
if (!array_key_exists('FUSER_ID', $fields) || intval($fields['FUSER_ID']) <= 0)
{
$fields['FUSER_ID'] = SaleFuser::getId(false);
}
if (!empty($fields['ORDER_ID']) && intval($fields['ORDER_ID']) > 0)
{
/** @var SaleOrder $orderClassName */
$orderClassName = $registry->getOrderClassName();
$order = $orderClassName::load(intval($fields['ORDER_ID']));
if ($order)
{
/** @var SaleBasket $basket */
$basket = $order->getBasket();
}
}
if (!$basket)
{
/** @var SaleBasket $orderClassName */
$basketClassName = $registry->getBasketClassName();
$basket = $basketClassName::loadItemsForFUser($fields["FUSER_ID"], $fields['LID']);
}
/** @var BitrixSaleBasketItem|bool $item */
if ($item = $basket->getExistsItem($fields["MODULE"], $fields["PRODUCT_ID"], ((!empty($fields["PROPS"]) && is_array($fields["PROPS"]))? $fields["PROPS"] : array())))
{
$item->setField('QUANTITY', $item->getQuantity() + $fields['QUANTITY']);
unset($fields['QUANTITY']);
/** @var SaleResult $r */
$r = $item->setFields(static::clearFields($fields));
if (!$r->isSuccess())
{
$result->addErrors($r->getErrors());
return $result;
}
else
{
if (!$order)
$basket->refreshData(array('PRICE', 'COUPONS', 'QUANTITY'), $item);
}
}
if ($item === null)
{
/** @var BitrixSaleBasketItem $item */
$item = $basket->createItem($fields["MODULE"], $fields["PRODUCT_ID"]);
if (isset($fields["PROPS"]) && is_array($fields["PROPS"]))
{
/** @var SaleBasketPropertiesCollection $property */
$property = $item->getPropertyCollection();
$property->setProperty($fields["PROPS"]);
}
/** @var SaleResult $r */
$r = $item->setFields(static::clearFields($fields));
if (!$r->isSuccess())
{
$result->addErrors($r->getErrors());
return $result;
}
if ($order)
{
$shipmentCollection = $order->getShipmentCollection();
$systemShipment = $shipmentCollection->getSystemShipment();
$systemShipmentItemCollection = $systemShipment->getShipmentItemCollection();
$systemShipmentItemCollection->resetCollection($basket);
if ($systemShipment->getDeliveryId() > 0)
{
/** @var OrderCompatibility $orderCompatibilityClassName */
$orderCompatibilityClassName = static::getOrderCompatibilityClassName();
/** @var SaleShipment $shipment */
$shipment = $orderCompatibilityClassName::getShipmentByDeliveryId($shipmentCollection, $systemShipment->getDeliveryId());
if (!$shipment)
{
if ($service = SaleDeliveryServicesManager::getObjectById($systemShipment->getDeliveryId()))
{
/** @var SaleShipment $shipment */
$shipment = $shipmentCollection->createItem($service);
}
}
if ($shipment)
{
$shipmentItemCollection = $shipment->getShipmentItemCollection();
/** @var SaleShipmentItem $shipmentItem */
$shipmentItem = $shipmentItemCollection->createItem($item);
if ($shipmentItem)
$shipmentItem->setQuantity($item->getQuantity());
}
}
/** @var SaleResult $r */
$r = $order->refreshData(array('PRICE', 'PRICE_DELIVERY'));
if (!$r->isSuccess())
{
$result->addErrors($r->getErrors());
return $result;
}
}
}
if ($order !== null)
{
/** @var SaleResult $r */
$r = $order->save();
if (!$r->isSuccess())
{
$result->addErrors($r->getErrors());
}
}
else
{
$isNew = false;
if ($item->getId() == 0)
{
$isNew = true;
}
$r = $basket->save();
if (!$r->isSuccess())
{
$result->addErrors($r->getErrors());
}
}
if ($r->isSuccess())
{
if (!DiscountCompatibility::isInited())
DiscountCompatibility::init();
if (DiscountCompatibility::usedByClient())
{
$id = $item->getId();
DiscountCompatibility::setBasketItemData($id, $fields);
DiscountCompatibility::setBasketCode($id, $item->getBasketCode());
}
$result->setId($item->getId());
$result->addData(array(
'QUANTITY' => $item->getQuantity()
));
}
return $result;
}