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