- Модуль: sale
- Путь к файлу: ~/bitrix/modules/sale/lib/discountbase.php
- Класс: BitrixSaleDiscountBase
- Вызов: DiscountBase::saveApply
protected function saveApply()
{
$result = new Result;
$process = true;
$orderId = $this->getOrder()->getId();
if (!$this->isValidState())
return $result;
$basketResult = $this->getBasketTables();
if (!$basketResult->isSuccess())
{
$process = false;
$result->addErrors($basketResult->getErrors());
}
/** @var OrderDiscount $storageClassName */
$storageClassName = $this->getOrderDiscountClassName();
/** @var DiscountCouponsManager $couponClassName */
$couponClassName = $this->getDiscountCouponClassName();
$rulesList = array();
$roundList = array();
foreach ($this->discountResult['APPLY_BLOCKS'] as $counter => $applyBlock)
{
if ($counter == $this->discountResultCounter)
continue;
if (!empty($applyBlock['BASKET']))
{
foreach ($applyBlock['BASKET'] as $basketCode => $discountList)
{
foreach ($discountList as $discount)
{
if (!isset($discount['RULE_ID']) || (int)$discount['RULE_ID'] < 0)
{
$process = false;
$result->addError(new MainEntityEntityError(
Loc::getMessage('BX_SALE_DISCOUNT_ERR_EMPTY_RULE_ID_EXT_DISCOUNT'),
self::ERROR_ID
));
continue;
}
$rulesList[] = array(
'RULE_ID' => $discount['RULE_ID'],
'APPLY' => $discount['RESULT']['APPLY'],
'DESCR_ID' => (isset($discount['RULE_DESCR_ID']) ? (int)$discount['RULE_DESCR_ID'] : 0),
'DESCR' => $discount['RESULT']['DESCR_DATA']['BASKET'],
);
}
unset($discount);
}
unset($basketCode, $discountList);
}
if (!empty($applyBlock['ORDER']))
{
foreach ($applyBlock['ORDER'] as $discount)
{
if (!empty($discount['RESULT']['BASKET']))
{
foreach ($discount['RESULT']['BASKET'] as $basketCode => $applyData)
{
if (!isset($applyData['RULE_ID']) || (int)$applyData['RULE_ID'] < 0)
{
$process = false;
$result->addError(new MainEntityEntityError(
Loc::getMessage('BX_SALE_DISCOUNT_ERR_EMPTY_RULE_ID_SALE_DISCOUNT'),
self::ERROR_ID
));
continue;
}
$ruleData = array(
'RULE_ID' => $applyData['RULE_ID'],
'APPLY' => $applyData['APPLY'],
'DESCR_ID' => (isset($applyData['RULE_DESCR_ID']) ? (int)$applyData['RULE_DESCR_ID'] : 0),
'DESCR' => $applyData['DESCR_DATA'],
);
if (!$discount['ACTION_BLOCK_LIST'])
$ruleData['ACTION_BLOCK_LIST'] = $applyData['ACTION_BLOCK_LIST'];
$rulesList[] = $ruleData;
unset($ruleData);
}
unset($basketCode, $applyData);
}
if (!empty($discount['RESULT']['DELIVERY']))
{
if (!isset($discount['RESULT']['DELIVERY']['RULE_ID']) || (int)$discount['RESULT']['DELIVERY']['RULE_ID'] < 0)
{
$process = false;
$result->addError(new MainEntityEntityError(
Loc::getMessage('BX_SALE_DISCOUNT_ERR_EMPTY_RULE_ID_SALE_DISCOUNT'),
self::ERROR_ID
));
continue;
}
$ruleData = array(
'RULE_ID' => $discount['RESULT']['DELIVERY']['RULE_ID'],
'APPLY' => $discount['RESULT']['DELIVERY']['APPLY'],
'DESCR_ID' => (isset($discount['RESULT']['DELIVERY']['RULE_DESCR_ID']) ? (int)$discount['RESULT']['DELIVERY']['RULE_DESCR_ID'] : 0),
'DESCR' => $discount['RESULT']['DELIVERY']['DESCR_DATA']
);
$rulesList[] = $ruleData;
unset($ruleData);
}
}
unset($discount);
}
if (!empty($applyBlock['BASKET_ROUND']))
{
foreach ($applyBlock['BASKET_ROUND'] as $row)
{
$roundList[] = array(
'RULE_ID' => $row['RULE_ID'],
'APPLY' => 'Y'
);
}
unset($row);
}
}
if ($process)
{
$ruleResult = $storageClassName::updateResultBlock($orderId, $rulesList);
if (!$ruleResult->isSuccess())
{
}
unset($ruleResult);
$roundResult = $storageClassName::updateRoundBlock($orderId, $roundList);
if (!$roundResult->isSuccess())
{
}
unset($roundResult);
}
if ($process)
{
if (!empty($this->discountResult['APPLY_BLOCKS'][$this->discountResultCounter]))
{
$couponClassName::finalApply();
$couponClassName::saveApplied();
$couponsResult = $this->saveCoupons();
if (!$couponsResult->isSuccess())
{
$process = false;
$result->addErrors($couponsResult->getErrors());
}
if ($process)
{
$lastApplyBlockResult = $this->saveLastApplyBlock();
if (!$lastApplyBlockResult->isSuccess())
{
$process = false;
$result->addErrors($lastApplyBlockResult->getErrors());
}
unset($lastApplyBlockResult);
}
}
}
if ($process)
{
if (!empty($this->discountStoredActionData))
{
$dataResult = $storageClassName::saveOrderStoredData(
$orderId,
$storageClassName::STORAGE_TYPE_DISCOUNT_ACTION_DATA,
$this->discountStoredActionData,
array('ALLOW_UPDATE' => 'Y')
);
if (!$dataResult->isSuccess())
{
$result->addError(new MainEntityEntityError(
Loc::getMessage('BX_SALE_DISCOUNT_ERR_SAVE_APPLY_RULES'),
self::ERROR_ID
));
}
unset($dataResult);
}
}
if ($process)
{
if ($couponClassName::usedByManager())
$couponClassName::clear(true);
}
return $result;
}