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