• Модуль: crm
  • Путь к файлу: ~/bitrix/modules/crm/classes/general/crm_invoice.php
  • Класс: \CAllCrmInvoice
  • Вызов: CAllCrmInvoice::QuickRecalculate
static function QuickRecalculate($arFields, $siteId = SITE_ID)
{
	if(!CModule::IncludeModule('sale'))
	{
		return array('err'=> '1');
	}

	$tmpOrderId = isset($arFields['ID']) ? intval($arFields['ID']) : 0;
	if($tmpOrderId < 0)
	{
		$tmpOrderId = 0;
	}

	$saleUserId = intval(CSaleUser::GetAnonymousUserID());
	if ($saleUserId <= 0)
	{
		return array('err'=> '2');
	}

	$arProduct = isset($arFields['PRODUCT_ROWS']) && is_array($arFields['PRODUCT_ROWS'])
		? $arFields['PRODUCT_ROWS'] : array();
	if(empty($arProduct))
	{
		return array('err'=> '3');
	}

	$currencyId = CCrmInvoice::GetCurrencyID($siteId);
	foreach ($arProduct as &$productRow)
	{
		if (isset($productRow['PRODUCT_NAME']))
		{
			$productRow['NAME'] = $productRow['PRODUCT_NAME'];
			unset($productRow['PRODUCT_NAME']);
		}
		if (isset($productRow['PRICE']))
		{
			$productRow['PRICE_DEFAULT'] = $productRow['PRICE'];
		}
		if (!isset($productRow['CURRENCY']))
		{
			$productRow['CURRENCY'] = $currencyId;
		}
		$productRow['MODULE'] = 'catalog';
		$productRow['PRODUCT_PROVIDER_CLASS'] = 'CCatalogProductProvider';
		$productRow['CALLBACK_FUNC'] = 'Y';
	}
	unset($productRow);

	$arOrderProductPrice = self::__fGetUserShoppingCart($arProduct, $siteId, 'N');

	foreach ($arOrderProductPrice as &$arItem) // tmp hack not to update basket quantity data from catalog
	{
		$arItem['ID_TMP'] = $arItem['ID'];
		unset($arItem['ID']);
	}
	unset($arItem);

	$arErrors = array();
	$arShoppingCart = Compatible\BasketHelper::doGetUserShoppingCart(
		$siteId, $saleUserId, $arOrderProductPrice, $arErrors, $tmpOrderId
	);

	foreach ($arShoppingCart as $key => &$arItem)
	{
		$arItem['ID'] = $arItem['ID_TMP'];
		unset($arItem['ID_TMP']);
	}
	unset($arItem);

	$personTypeId = isset($arFields['PERSON_TYPE_ID']) ? intval($arFields['PERSON_TYPE_ID']) : 0;
	if($personTypeId <= 0)
	{
		$arPersonTypes = CCrmPaySystem::getPersonTypeIDs();
		if (isset($arPersonTypes['CONTACT']))
			$personTypeId = intval($arPersonTypes['CONTACT']);
	}
	if ($personTypeId <= 0)
	{
		return array('err'=> '4');
	}

	$arOrderPropsValues = array();
	if (isset($arFields['INVOICE_PROPERTIES']) && is_array($arFields['INVOICE_PROPERTIES']) && count($arFields['INVOICE_PROPERTIES']) > 0)
	{
		$arOrderPropsValues = $arFields['INVOICE_PROPERTIES'];
	}
	if (isset($arFields['INVOICE_PROPERTIES']))
	{
		unset($arFields['INVOICE_PROPERTIES']);
	}
	if (count($arOrderPropsValues) <= 0)
	{
		return array('err'=> '5');
	}

	$deliveryId = null;
	$paySystemId = isset($arFields['PAY_SYSTEM_ID']) ? intval($arFields['PAY_SYSTEM_ID']) : 0;
	$arOptions = array(
		'LOCATION_IN_CODES' => true,    // let DoCalculateOrder know we send location in CODEs
		'CART_FIX' => 'Y',
		'CURRENCY' => $currencyId
	);
	$arErrors = array();
	$arWarnings = array();

	$invoiceCompatible = Compatible\Invoice::create($arFields);
	$arOptions['ORDER'] = $invoiceCompatible->getOrder();

	return CSaleOrder::DoCalculateOrder(
		$siteId,
		$saleUserId,
		$arShoppingCart,
		$personTypeId,
		$arOrderPropsValues,
		$deliveryId,
		$paySystemId,
		$arOptions,
		$arErrors,
		$arWarnings
	);
}