- Модуль: sale
- Путь к файлу: ~/bitrix/modules/sale/lib/discount/migration/orderdiscountmigrator.php
- Класс: BitrixSaleDiscountMigrationOrderDiscountMigrator
- Вызов: OrderDiscountMigrator::processing
static function processing(array $order)
{
static $useBasePrice = null;
if ($useBasePrice === null)
$useBasePrice = (string)MainConfigOption::get('sale', 'get_discount_percent_from_base_price');
$process = true;
$result = new SaleResult();
if (empty($order['ID']) || (int)$order['ID'] <= 0)
{
$process = false;
$result->addError(new MainEntityEntityError(
Loc::getMessage('SALE_ORDER_DISCOUNT_MIGRATOR_ERR_EMPTY_ORDER_ID'),
self::ERROR_ID
));
}
$catalogOrder = false;
$basketData = array();
if ($process)
{
$order['ID'] = (int)$order['ID'];
$basePrices = array();
$basketIterator = SaleInternalsBasketTable::getList(array(
'select' => array(
'ID', 'DISCOUNT_COUPON', 'DISCOUNT_NAME', 'DISCOUNT_VALUE',
'MODULE', 'PRICE', 'DISCOUNT_PRICE', 'CURRENCY', 'SET_PARENT_ID', 'TYPE'
),
'filter' => array('=ORDER_ID' => $order['ID'])
));
while ($basket = $basketIterator->fetch())
{
$basket['ID'] = (int)$basket['ID'];
$basket['MODULE'] = (string)$basket['MODULE'];
$basket['DISCOUNT_COUPON'] = trim((string)$basket['DISCOUNT_COUPON']);
$basket['DISCOUNT_NAME'] = trim((string)$basket['DISCOUNT_NAME']);
$basket['SET_PARENT_ID'] = (int)$basket['SET_PARENT_ID'];
$basket['TYPE'] = (int)$basket['TYPE'];
if ($basket['MODULE'] == 'catalog')
{
$basePrices[$basket['ID']] = array(
'BASE_PRICE' => $basket['PRICE'] + $basket['DISCOUNT_PRICE'],
'BASE_PRICE_CURRENCY' => $basket['CURRENCY']
);
}
if ($basket['MODULE'] != 'catalog' || ($basket['DISCOUNT_NAME'] == '' && $basket['DISCOUNT_COUPON'] == ''))
continue;
if ($basket['SET_PARENT_ID'] > 0 && $basket['TYPE'] <= 0)
continue;
$catalogOrder = true;
$hash = md5($basket['DISCOUNT_NAME'].'|'.$basket['DISCOUNT_COUPON']);
if (!isset($basketData[$hash]))
$basketData[$hash] = array(
'DISCOUNT_NAME' => $basket['DISCOUNT_NAME'],
'DISCOUNT_COUPON' => $basket['DISCOUNT_COUPON'],
'ITEMS' => array()
);
$basketData[$hash]['ITEMS'][$basket['ID']] = $basket;
}
unset($basket, $basketIterator);
}
if ($process && $catalogOrder)
{
SaleOrderDiscount::setManagerConfig(array(
'CURRENCY' => $order['CURRENCY'],
'SITE_ID' => $order['LID'],
'USE_BASE_PRICE' => $useBasePrice
));
foreach ($basketData as $row)
{
if (!self::migrateDiscount($order['ID'], $row))
{
$process = false;
$result->addError(new MainEntityEntityError(
Loc::getMessage('SALE_ORDER_DISCOUNT_MIGRATOR_ERR_SAVE_MIGRATE_DISCOUNT'),
self::ERROR_ID
));
break;
}
}
unset($row);
}
unset($basketData);
SaleInternalsOrderDiscountDataTable::clearByOrder($order['ID']);
if ($process)
{
if (!empty($basePrices))
{
foreach ($basePrices as $basketId => $price)
{
$fields = array(
'ORDER_ID' => $order['ID'],
'ENTITY_TYPE' => SaleInternalsOrderDiscountDataTable::ENTITY_TYPE_BASKET_ITEM,
'ENTITY_ID' => $basketId,
'ENTITY_VALUE' => $basketId,
'ENTITY_DATA' => $price,
);
$operationResult = SaleInternalsOrderDiscountDataTable::add($fields);
if (!$operationResult->isSuccess())
{
$process = false;
$result->addErrors($operationResult->getErrors());
}
unset($operationResult);
}
unset($basketId, $price);
}
}
if ($process)
{
$fields = array(
'ORDER_ID' => $order['ID'],
'ENTITY_TYPE' => SaleInternalsOrderDiscountDataTable::ENTITY_TYPE_ORDER,
'ENTITY_ID' => $order['ID'],
'ENTITY_VALUE' => $order['ID'],
'ENTITY_DATA' => array(
'OLD_ORDER' => 'Y'
)
);
$operationResult = SaleInternalsOrderDiscountDataTable::add($fields);
if (!$operationResult->isSuccess())
{
$process = false;
$result->addErrors($operationResult->getErrors());
}
unset($operationResult);
}
unset($process);
return $result;
}