- Модуль: sale
- Путь к файлу: ~/bitrix/modules/sale/lib/compatible/basketcompatibility.php
- Класс: BitrixSaleCompatibleBasketCompatibility
- Вызов: BasketCompatibility::update
static function update($id, array $fields)
{
$result = new SaleResult();
$item = null;
$basket = null;
/** @var SaleOrder $order */
$order = null;
$orderId = null;
$registry = SaleRegistry::getInstance(static::getRegistryType());
/** @var SaleResult $itemResult */
$itemResult = static::loadEntityFromBasket($id);
if ($itemResult->isSuccess())
{
$itemResultData = $itemResult->getData();
if (isset($itemResultData['BASKET_ITEM']))
{
/** @var SaleBasketItem $item */
$item = $itemResultData['BASKET_ITEM'];
$basket = $item->getBasket();
}
if (isset($itemResultData['ORDER']))
{
$order = $itemResultData['ORDER'];
}
}
if (!$item)
{
$result->addError(new SaleResultError(MainLocalizationLoc::getMessage('SALE_BASKET_COMPATIBLE_BASKET_ITEM_NOT_FOUND'), 'BASKET_ITEM_NOT_FOUND'));
return $result;
}
if ($order !== null &&
$fields['ORDER_ID'] > 0 &&
(int)$fields['ORDER_ID'] !== (int)$order->getId()
)
{
$result->addError(
new SaleResultError(
MainLocalizationLoc::getMessage('SALE_BASKET_COMPATIBLE_BASKET_ITEM_ERROR_BIND_TO_ORDER'),
'BASKET_ITEM_NOT_FOUND'
)
);
return $result;
}
if (isset($fields["PROPS"]) && is_array($fields["PROPS"]))
{
/** @var SaleBasketPropertiesCollection $property */
$property = $item->getPropertyCollection();
$property->clearCollection();
$property->setProperty($fields["PROPS"]);
}
if ($order !== null && isset($fields['PRICE']))
{
if ($fields['PRICE'] != $item->getPrice())
$fields['CUSTOM_PRICE'] = 'Y';
}
if (!empty($fields['FUSER_ID']))
{
$item->setFieldNoDemand('FUSER_ID', intval($fields['FUSER_ID']));
unset($fields['FUSER_ID']);
}
$r = $item->setFields(static::clearFields($fields));
if (!$r->isSuccess())
{
$result->addErrors($r->getErrors());
}
if(DiscountCompatibility::isUsed())
{
if (!DiscountCompatibility::isInited())
DiscountCompatibility::init();
if (DiscountCompatibility::usedByClient())
{
DiscountCompatibility::setBasketItemData($id, $fields);
DiscountCompatibility::setBasketCode($id, $item->getBasketCode());
}
}
if ($order === null && !empty($fields['ORDER_ID']) && intval($fields['ORDER_ID']) > 0)
{
$orderId = intval($fields['ORDER_ID']);
$orderClassName = $registry->getOrderClassName();
if ($order = $orderClassName::load($orderId))
{
/** @var SaleBasket $basket */
if ($basket = $order->getBasket())
{
$basket->addItem($item);
/** @var SaleShipmentCollection $shipmentCollection */
if (!$shipmentCollection = $order->getShipmentCollection())
{
throw new MainObjectNotFoundException('Entity "ShipmentCollection" not found');
}
/** @var OrderCompatibility $orderCompatibilityClassName */
$orderCompatibilityClassName = static::getOrderCompatibilityClassName();
$orderCompatibilityClassName::createShipmentFromShipmentSystem($shipmentCollection);
/** @var SaleResult $r */
$r = static::syncShipmentCollectionAndBasket($shipmentCollection, $basket);
if (!$r->isSuccess())
{
$result->addErrors($r->getErrors());
return $result;
}
$r = $order->refreshData(array("PRICE_DELIVERY"));
if (!$r->isSuccess())
{
$result->addErrors($r->getErrors());
return $result;
}
$r = $order->doFinalAction(true);
if (!$r->isSuccess())
{
$result->addErrors($r->getErrors());
return $result;
}
}
}
}
if ($order !== null)
{
/** @var SaleShipmentCollection $shipmentCollection */
if ($shipmentCollection = $order->getShipmentCollection())
{
if (count($shipmentCollection) == 2 && $shipmentCollection->isExistsSystemShipment())
{
/** @var SaleShipment $shipment */
foreach ($shipmentCollection as $shipment)
{
if ($shipment->isSystem() || $shipment->isShipped())
continue;
/** @var SaleShipment $systemShipment */
$systemShipment = $shipmentCollection->getSystemShipment();
/** @var SaleShipmentItemCollection $systemShipmentItemCollection */
$systemShipmentItemCollection = $systemShipment->getShipmentItemCollection();
/** @var SaleShipmentItem $systemShipmentItem */
if (!$systemShipmentItem = $systemShipmentItemCollection->getItemByBasketCode($item->getBasketCode()))
continue;
/** @var SaleShipmentItemCollection $shipmentItemCollection */
if (!$shipmentItemCollection = $shipment->getShipmentItemCollection())
continue;
/** @var SaleShipmentItem $shipmentItem */
if (!$shipmentItem = $shipmentItemCollection->getItemByBasketCode($item->getBasketCode()))
continue;
if ($systemShipmentItem->getQuantity() > 0)
{
$r = $shipmentItem->setQuantity(($shipmentItem->getQuantity() + $systemShipmentItem->getQuantity()));
if (!$r->isSuccess())
{
$result->addErrors($r->getErrors());
}
}
}
}
}
if (!$result->isSuccess())
{
return $result;
}
$r = $order->save();
}
else
{
if (!$result->isSuccess())
{
return $result;
}
$r = $basket->save();
}
if (!$r->isSuccess())
{
$result->addErrors($r->getErrors());
}
return $result;
}