• Модуль: sale
  • Путь к файлу: ~/bitrix/modules/sale/lib/tax.php
  • Класс: BitrixSaleTax
  • Вызов: Tax::calculate
public function calculate()
{
	/** @var Result $result */
	$result = new Result();

	/** @var Order $order */
	if (!$order = $this->getOrder())
	{
		throw new MainObjectNotFoundException('Entity "Order" not found');
	}

	$taxResult = array();

	$taxList = $this->getTaxList();

	$taxExempt = static::loadExemptList($order->getUserId());

	$fields = array(
		"SITE_ID" => $order->getSiteid(),
		"PERSON_TYPE_ID" => $order->getPersonTypeId(),
		"TAX_LOCATION" => $order->getTaxLocation(),
		"CURRENCY" => $order->getCurrency(),
		"USE_VAT" => $order->isUsedVat(),
		"VAT_RATE" => $order->getVatRate(),
		"VAT_SUM" => $order->getVatSum(),
	);

	if (is_array($taxExempt))
	{
		$fields['TAX_EXEMPT'] = $taxExempt;
	}

	if (is_array($taxList) && !empty($taxList))
	{
		$fields['TAX_LIST'] = $taxList;
	}

	/** @var Basket $basket */
	$basket = $order->getBasket();

	if (empty($basket))
		return $result;

	/** @var BasketItem $basketItem */
	foreach ($basket as $basketItem)
	{
		if ($basketItem->getQuantity() == 0)
			continue;
		$fields['BASKET_ITEMS'][] = $basketItem->getFieldValues();
	}

	/** @var CSaleTax $className */
	$className = static::getTaxClassName();
	$className::calculateTax($fields, array());

	if (!$order->isUsedVat() && isset($fields['TAX_LIST']) && is_array($fields['TAX_LIST']))
	{
		$taxResult['TAX_LIST'] = $fields['TAX_LIST'];
	}

	if (array_key_exists('TAX_PRICE', $fields) && floatval($fields['TAX_PRICE']) >= 0)
	{
		$taxResult['TAX_PRICE'] = $fields['TAX_PRICE'];
	}

	if (array_key_exists('VAT_SUM', $fields) && floatval($fields['VAT_SUM']) > 0)
	{
		$taxResult['VAT_SUM'] = $fields['VAT_SUM'];
	}

	if (array_key_exists('TAX_LIST', $fields))
	{
		$newTaxList = $this->checkModifyTaxList($fields['TAX_LIST']);
		$taxResult['TAX_LIST'] = $newTaxList;

		$this->list = $newTaxList;
	}

	if (!$order->isUsedVat() && empty($this->list) && is_array($this->list))
	{
		$taxResult['TAX_PRICE'] = 0;
	}

	if (!empty($taxResult))
	{
		$result->setData($taxResult);
	}

	return $result;
}