Your IP : 3.144.253.106


Current Path : /home/bitrix/ext_www/crm.klimatlend.ua/bitrix/components/bitrix/crm.quote.details/
Upload File :
Current File : /home/bitrix/ext_www/crm.klimatlend.ua/bitrix/components/bitrix/crm.quote.details/ajax.php

<?php
define('NO_KEEP_STATISTIC', 'Y');
define('NO_AGENT_STATISTIC','Y');
define('NO_AGENT_CHECK', true);
define('DisableEventsCheck', true);

require_once($_SERVER['DOCUMENT_ROOT'].'/bitrix/modules/main/include/prolog_before.php');
if (!CModule::IncludeModule('crm'))
{
	return;
}

/*
 * ONLY 'POST' METHOD SUPPORTED
 * SUPPORTED ACTIONS:
 * 'SAVE'
 * 'GET_FORMATTED_SUM'
 */
global $DB, $APPLICATION;

use Bitrix\Main;
use Bitrix\Crm\Integration\StorageType;
use Bitrix\Crm\Integration\StorageManager;
use Bitrix\Crm\Security\EntityAuthorization;
use Bitrix\Crm\Synchronization\UserFieldSynchronizer;
use Bitrix\Crm\Conversion\QuoteConversionConfig;
use Bitrix\Crm\Conversion\QuoteConversionWizard;

Main\Localization\Loc::loadMessages(__FILE__);
if(!function_exists('__CrmQuoteDetailsEndJsonResonse'))
{
	function __CrmQuoteDetailsEndJsonResonse($result)
	{
		$GLOBALS['APPLICATION']->RestartBuffer();
		Header('Content-Type: application/x-javascript; charset='.LANG_CHARSET);
		if(!empty($result))
		{
			echo CUtil::PhpToJSObject($result);
		}
		if(!defined('PUBLIC_AJAX_MODE'))
		{
			define('PUBLIC_AJAX_MODE', true);
		}
		require_once($_SERVER['DOCUMENT_ROOT'].'/bitrix/modules/main/include/epilog_after.php');
		die();
	}
}

if (!CCrmSecurityHelper::IsAuthorized() || !check_bitrix_sessid() || $_SERVER['REQUEST_METHOD'] != 'POST')
{
	return;
}

CUtil::JSPostUnescape();
$APPLICATION->RestartBuffer();
Header('Content-Type: application/x-javascript; charset='.LANG_CHARSET);

$currentUserID = CCrmSecurityHelper::GetCurrentUserID();
$currentUserPermissions =  CCrmPerms::GetCurrentUserPermissions();

$action = isset($_POST['ACTION']) ? $_POST['ACTION'] : '';
if($action === '' && isset($_POST['MODE']))
{
	$action = $_POST['MODE'];
}
if($action === '')
{
	__CrmQuoteDetailsEndJsonResonse(array('ERROR'=>'ACTION IS NOT DEFINED!'));
}
if($action === 'GET_FORMATTED_SUM')
{
	$sum = isset($_POST['SUM']) ? $_POST['SUM'] : 0.0;
	$currencyID = isset($_POST['CURRENCY_ID']) ? $_POST['CURRENCY_ID'] : '';
	if($currencyID === '')
	{
		$currencyID = \CCrmCurrency::GetBaseCurrencyID();
	}

	__CrmQuoteDetailsEndJsonResonse(
		array(
			'FORMATTED_SUM' => \CCrmCurrency::MoneyToString($sum, $currencyID, '#'),
			'FORMATTED_SUM_WITH_CURRENCY' => \CCrmCurrency::MoneyToString($sum, $currencyID, '')
		)
	);
}
elseif($action === 'SAVE')
{
	$ID = isset($_POST['ACTION_ENTITY_ID']) ? max((int)$_POST['ACTION_ENTITY_ID'], 0) : 0;
	if(($ID > 0 && !\CCrmQuote::CheckUpdatePermission($ID, $currentUserPermissions))
		|| ($ID === 0 && !\CCrmQuote::CheckCreatePermission($currentUserPermissions))
	)
	{
		__CrmQuoteDetailsEndJsonResonse(array('ERROR'=>'PERMISSION DENIED!'));
	}

	$params = isset($_POST['PARAMS']) && is_array($_POST['PARAMS']) ? $_POST['PARAMS'] : array();
	$sourceEntityID =  isset($params['LEAD_ID']) ? (int)$params['LEAD_ID'] : 0;

	$isNew = $ID === 0;
	$isCopyMode = $isNew && $sourceEntityID > 0;
	$isExternal = false;

	$previousFields = !$isNew ? \CCrmQuote::GetByID($ID, false) : null;

	$fields = array();
	$fieldsInfo = \CCrmQuote::GetFieldsInfo();
	$userType = new \CCrmUserType($GLOBALS['USER_FIELD_MANAGER'], \CCrmQuote::GetUserFieldEntityID());
	$userType->PrepareFieldsInfo($fieldsInfo);

	$sourceFields = array();
	if($sourceEntityID > 0)
	{
		$dbResult = \CCrmQuote::GetList(
			array(),
			array('=ID' => $sourceEntityID, 'CHECK_PERMISSIONS' => 'N'),
			false,
			false,
			array('*', 'UF_*')
		);
		$sourceFields = $dbResult->Fetch();
		if(!is_array($sourceFields))
		{
			$sourceFields = array();
		}
	}

	foreach(array_keys($fieldsInfo) as $fieldName)
	{
		if(isset($_POST[$fieldName]))
		{
			$fields[$fieldName] = $_POST[$fieldName];
		}
	}
	$USER_FIELD_MANAGER->EditFormAddFields(\CCrmQuote::USER_FIELD_ENTITY_ID, $fields, [
		'FORM' => $fields,
		'FILES' => [],
	]);

	//region CLIENT
	$primaryClientTypeName = isset($_POST['CLIENT_PRIMARY_ENTITY_TYPE']) ? $_POST['CLIENT_PRIMARY_ENTITY_TYPE'] : '';
	$primaryClientTypeID = \CCrmOwnerType::ResolveID($primaryClientTypeName);

	$secondaryClientTypeName = isset($_POST['CLIENT_SECONDARY_ENTITY_TYPE']) ? $_POST['CLIENT_SECONDARY_ENTITY_TYPE'] : '';
	$secondaryClientTypeID = \CCrmOwnerType::ResolveID($secondaryClientTypeName);

	$primaryClientID = 0;

	$boundSecondaryClientIDs = array();
	$unboundSecondaryClientIDs = array();
	if($primaryClientTypeID !== \CCrmOwnerType::Undefined && $secondaryClientTypeID !== \CCrmOwnerType::Undefined)
	{
		$companyID = 0;
		$contactIDs = array();

		$primaryClientID = isset($_POST['CLIENT_PRIMARY_ENTITY_ID']) ? (int)$_POST['CLIENT_PRIMARY_ENTITY_ID'] : 0;
		if($primaryClientID < 0)
		{
			$primaryClientID = 0;
		}

		if($primaryClientID > 0)
		{
			if($primaryClientTypeID === \CCrmOwnerType::Company)
			{
				$companyID = $primaryClientID;
			}
			elseif($primaryClientTypeID === \CCrmOwnerType::Contact)
			{
				$contactIDs[$primaryClientID] = true;
			}
		}

		$secondaryClientIDs = isset($_POST['CLIENT_SECONDARY_ENTITY_IDS']) ? $_POST['CLIENT_SECONDARY_ENTITY_IDS'] : '';
		$secondaryClientIDs = $secondaryClientIDs !== '' ? explode(',', $secondaryClientIDs) : array();

		foreach($secondaryClientIDs as $clientID)
		{
			$contactIDs[$clientID] = true;
		}
		$contactIDs = array_keys($contactIDs);

		$fields['COMPANY_ID'] = $companyID;
		$fields['CONTACT_IDS'] = $contactIDs;

		$s = isset($_POST['CLIENT_UBOUND_SECONDARY_ENTITY_IDS']) ? $_POST['CLIENT_UBOUND_SECONDARY_ENTITY_IDS'] : '';
		$unboundSecondaryClientIDs = $s !== '' ? explode(',', $s) : array();

		$s = isset($_POST['CLIENT_BOUND_SECONDARY_ENTITY_IDS']) ? $_POST['CLIENT_BOUND_SECONDARY_ENTITY_IDS'] : '';
		$boundSecondaryClientIDs = $s !== '' ? explode(',', $s) : array();
	}
	//endregion

	//region PRODUCT ROWS
	$enableProductRows = false;
	$originalProductRows = !$isNew ? \CCrmQuote::LoadProductRows($ID) : array();

	$productRows = array();
	$productRowSettings = array();
	if(isset($_POST['QUOTE_PRODUCT_DATA'])
		&& !(isset($_POST['SKIP_PRODUCT_DATA']) && strcasecmp($_POST['SKIP_PRODUCT_DATA'], 'Y') === 0)
	)
	{
		$productRows = \CUtil::JsObjectToPhp($_POST['QUOTE_PRODUCT_DATA']);
		if(!is_array($productRows))
		{
			$productRows = array();
		}

		$enableProductRows = true;
		if(!$isNew
			&& !$isCopyMode
			&& \CCrmProductRow::AreEquals($productRows, $originalProductRows)
		)
		{
			$enableProductRows = false;
		}
	}

	if($enableProductRows)
	{
		if(!empty($productRows))
		{
			if($isCopyMode)
			{
				for($index = 0, $qty = count($productRows); $index < $qty; $index++)
				{
					unset($productRows[$index]['ID']);
				}
			}

			$calculationParams = $fields;
			if(!isset($calculationParams['CURRENCY_ID']))
			{
				if(is_array($previousFields) && isset($previousFields['CURRENCY_ID']))
				{
					$calculationParams['CURRENCY_ID'] = $previousFields['CURRENCY_ID'];
				}
				elseif(isset($sourceFields['CURRENCY_ID']))
				{
					$calculationParams['CURRENCY_ID'] = $sourceFields['CURRENCY_ID'];
				}
				else
				{
					$calculationParams['CURRENCY_ID'] = CCrmCurrency::GetBaseCurrencyID();
				}
			}

			$totals = \CCrmProductRow::CalculateTotalInfo(\CCrmQuote::OWNER_TYPE, 0, false, $calculationParams, $productRows);
			$fields['OPPORTUNITY'] = isset($totals['OPPORTUNITY']) ? $totals['OPPORTUNITY'] : 0.0;
			$fields['TAX_VALUE'] = isset($totals['TAX_VALUE']) ? $totals['TAX_VALUE'] : 0.0;
		}
		else
		{
			$fields['TAX_VALUE'] = 0.0;
			if(!isset($fields['OPPORTUNITY']) && ($isNew || !empty($originalProductRows)))
			{
				$fields['OPPORTUNITY'] = 0.0;
			}
		}

		if(isset($_POST['QUOTE_PRODUCT_DATA_SETTINGS']) && $_POST['QUOTE_PRODUCT_DATA_SETTINGS'] !== '')
		{
			$settings = \CUtil::JsObjectToPhp($_POST['QUOTE_PRODUCT_DATA_SETTINGS']);
			if(is_array($settings))
			{
				$productRowSettings['ENABLE_DISCOUNT'] = isset($settings['ENABLE_DISCOUNT'])
					? $settings['ENABLE_DISCOUNT'] === 'Y' : false;
				$productRowSettings['ENABLE_TAX'] = isset($settings['ENABLE_TAX'])
					? $settings['ENABLE_TAX'] === 'Y' : false;
			}
		}
	}
	//endregion

	$storageTypeID = isset($_POST['storageTypeId']) ? (int)$_POST['storageTypeId'] : StorageType::Undefined;
	if(!StorageType::isDefined($storageTypeID))
	{
		if($isNew)
		{
			$storageTypeID = \CCrmQuote::GetDefaultStorageTypeID();
		}
		else
		{
			$storageTypeID = isset($previousFields['STORAGE_TYPE_ID'])
				? (int)$previousFields['STORAGE_TYPE_ID'] : StorageType::Undefined;
			if(!StorageType::isDefined($storageTypeID))
			{
				$storageTypeID = \CCrmQuote::GetDefaultStorageTypeID();
			}
		}
	}
	$fields['STORAGE_TYPE_ID'] = $storageTypeID;

	if(isset($_POST['STORAGE_ELEMENT_IDS']))
	{
		$storageElementIDs = isset($_POST['STORAGE_ELEMENT_IDS']) && is_array($_POST['STORAGE_ELEMENT_IDS'])
			? $_POST['STORAGE_ELEMENT_IDS'] : array();

		if(!$isNew && isset($previousFields['STORAGE_ELEMENT_IDS']) && is_array($previousFields['STORAGE_ELEMENT_IDS']))
		{
			$previousStorageElementIDs = $previousFields['STORAGE_ELEMENT_IDS'];

			$persistentStorageElementIDs = array_intersect($previousStorageElementIDs, $storageElementIDs);
			$newStorageElementIDs = StorageManager::filterFiles(
				array_diff($storageElementIDs, $previousStorageElementIDs),
				$storageTypeID
			);

			$storageElementIDs = array_merge($persistentStorageElementIDs, $newStorageElementIDs);
		}
		$fields['STORAGE_ELEMENT_IDS'] = $storageElementIDs;
	}

	if(!empty($fields) || $enableProductRows)
	{
		if(!empty($fields))
		{
			if($isCopyMode)
			{
				if(!isset($fields['ASSIGNED_BY_ID']))
				{
					$fields['ASSIGNED_BY_ID'] = $currentUserID;
				}

				//TODO: Create Quote Merger
				//$merger = new \Bitrix\Crm\Merger\QuoteMerger($currentUserID, false);
				//$merger->mergeFields($sourceFields, $fields, true);
			}

			if(isset($fields['CONTENT']))
			{
				$fields['CONTENT'] = \Bitrix\Crm\Format\TextHelper::sanitizeHtml($fields['CONTENT']);
			}

			if(isset($fields['TERMS']))
			{
				$fields['TERMS'] = \Bitrix\Crm\Format\TextHelper::sanitizeHtml($fields['TERMS']);
			}

			if(isset($fields['COMMENTS']))
			{
				$fields['COMMENTS'] = \Bitrix\Crm\Format\TextHelper::sanitizeHtml($fields['COMMENTS']);
			}

			$entity = new \CCrmQuote(false);
			if($isNew)
			{
				if(!isset($fields['TITLE']) || $fields['TITLE'] === '')
				{
					$fields['TITLE'] = GetMessage('CRM_QUOTE_DEAULT_TITLE');
				}

				if(!isset($fields['OPENED']))
				{
					$fields['OPENED'] = \Bitrix\Crm\Settings\QuoteSettings::getCurrent()->getOpenedFlag() ? 'Y' : 'N';
				}

				if(!isset($fields['CURRENCY_ID']))
				{
					$fields['CURRENCY_ID'] = CCrmCurrency::GetBaseCurrencyID();
				}

				$fields['EXCH_RATE'] = CCrmCurrency::GetExchangeRate($fields['CURRENCY_ID']);

				$ID = $entity->Add($fields);
				if($ID <= 0)
				{
					__CrmQuoteDetailsEndJsonResonse(array('ERROR' => $entity->LAST_ERROR));
				}
			}
			else
			{
				if(isset($fields['OPPORTUNITY']) || isset($fields['CURRENCY_ID']))
				{
					if(!isset($fields['OPPORTUNITY']))
					{
						if(is_array($previousFields) && isset($previousFields['OPPORTUNITY']))
						{
							$fields['OPPORTUNITY'] = $previousFields['OPPORTUNITY'];
						}
						elseif(isset($sourceFields['OPPORTUNITY']))
						{
							$fields['OPPORTUNITY'] = $sourceFields['OPPORTUNITY'];
						}
					}

					if(!isset($fields['CURRENCY_ID']))
					{
						if(is_array($previousFields) && isset($previousFields['CURRENCY_ID']))
						{
							$fields['CURRENCY_ID'] = $previousFields['CURRENCY_ID'];
						}
						elseif(isset($sourceFields['CURRENCY_ID']))
						{
							$fields['CURRENCY_ID'] = $sourceFields['CURRENCY_ID'];
						}
						else
						{
							$fields['CURRENCY_ID'] = CCrmCurrency::GetBaseCurrencyID();
						}
					}

					$fields['EXCH_RATE'] = CCrmCurrency::GetExchangeRate($fields['CURRENCY_ID']);
				}

				if(!$entity->Update($ID, $fields))
				{
					__CrmQuoteDetailsEndJsonResonse(array('ERROR' => $entity->LAST_ERROR));
				}
			}
		}

		if(!$isExternal && $enableProductRows && (!$isNew || !empty($productRows)))
		{
			if(!\CCrmQuote::SaveProductRows($ID, $productRows, true, true, false))
			{
				__CrmQuoteDetailsEndJsonResonse(array('ERROR' => GetMessage('CRM_QUOTE_PRODUCT_ROWS_SAVING_ERROR')));
			}
		}

		if(!empty($productRowSettings))
		{
			if(!$isNew)
			{
				$productRowSettings = array_merge(
					\CCrmProductRow::LoadSettings(\CCrmQuote::OWNER_TYPE, $ID),
					$productRowSettings
				);
			}
			\CCrmProductRow::SaveSettings(\CCrmQuote::OWNER_TYPE, $ID, $productRowSettings);
		}

		\Bitrix\Crm\Tracking\UI\Details::saveEntityData(
			\CCrmOwnerType::Quote,
			$ID,
			$_POST,
			$isNew
		);

		if($primaryClientID > 0 && $primaryClientTypeID === \CCrmOwnerType::Company)
		{
			if(!empty($unboundSecondaryClientIDs))
			{
				\Bitrix\Crm\Binding\ContactCompanyTable::unbindContactIDs($primaryClientID, $unboundSecondaryClientIDs);
			}
			if(!empty($boundSecondaryClientIDs))
			{
				\Bitrix\Crm\Binding\ContactCompanyTable::bindContactIDs($primaryClientID, $boundSecondaryClientIDs);
			}
		}
	}

	CBitrixComponent::includeComponentClass('bitrix:crm.quote.details');
	$component = new CCrmQuoteDetailsComponent();
	$component->initializeParams(
		isset($_POST['PARAMS']) && is_array($_POST['PARAMS']) ? $_POST['PARAMS'] : array()
	);
	$component->setEntityID($ID);
	$result = array('ENTITY_ID' => $ID, 'ENTITY_DATA' => $component->prepareEntityData());
	if($isNew)
	{
		$result['REDIRECT_URL'] = \CCrmOwnerType::GetDetailsUrl(
			\CCrmOwnerType::Quote,
			$ID,
			false,
			array('ENABLE_SLIDER' => true)
		);
	}

	__CrmQuoteDetailsEndJsonResonse($result);
}
elseif($action === 'CONVERT')
{
	if(!\Bitrix\Crm\Restriction\RestrictionManager::isConversionPermitted())
	{
		__CrmQuoteDetailsEndJsonResonse(array('ERROR' => array('MESSAGE' => GetMessage('CRM_QUOTE_CONVERSION_ACCESS_DENIED'))));
	}

	$entityID = isset($_POST['ENTITY_ID']) ? (int)$_POST['ENTITY_ID'] : 0;
	if($entityID <= 0)
	{
		__CrmQuoteDetailsEndJsonResonse(array('ERROR' => array('MESSAGE' => GetMessage('CRM_QUOTE_CONVERSION_ID_NOT_DEFINED'))));
	}

	if(!CCrmQuote::Exists($entityID))
	{
		__CrmQuoteDetailsEndJsonResonse(array('ERROR' => array('MESSAGE' => GetMessage('CRM_QUOTE_CONVERSION_NOT_FOUND'))));
	}

	if(!CCrmQuote::CheckReadPermission($entityID, $currentUserPermissions))
	{
		__CrmQuoteDetailsEndJsonResonse(array('ERROR' => array('MESSAGE' => GetMessage('CRM_QUOTE_CONVERSION_ACCESS_DENIED'))));
	}

	$configParams = isset($_POST['CONFIG']) && is_array($_POST['CONFIG']) ? $_POST['CONFIG'] : null;
	if(is_array($configParams))
	{
		$config = new QuoteConversionConfig();
		$config->fromJavaScript($configParams);
		$config->save();
	}
	else
	{
		$config = QuoteConversionConfig::load();
		if($config === null)
		{
			$config = QuoteConversionConfig::getDefault();
		}
	}

	if(!isset($_POST['ENABLE_SYNCHRONIZATION']) || $_POST['ENABLE_SYNCHRONIZATION'] !== 'Y')
	{
		$needForSync = false;
		$entityConfigs = $config->getItems();
		$syncFieldNames = array();
		foreach($entityConfigs as $entityTypeID => $entityConfig)
		{
			if(!EntityAuthorization::checkCreatePermission($entityTypeID, $currentUserPermissions)
				&& !EntityAuthorization::checkUpdatePermission($entityTypeID, 0, $currentUserPermissions))
			{
				continue;
			}

			$enableSync = $entityConfig->isActive();
			if($enableSync)
			{
				$syncFields = UserFieldSynchronizer::getSynchronizationFields(CCrmOwnerType::Quote, $entityTypeID);
				$enableSync = !empty($syncFields);
				foreach($syncFields as $field)
				{
					$syncFieldNames[$field['ID']] = UserFieldSynchronizer::getFieldLabel($field);
				}
			}

			if($enableSync && !$needForSync)
			{
				$needForSync = true;
			}
			$entityConfig->enableSynchronization($enableSync);
		}

		if($needForSync)
		{
			__CrmQuoteDetailsEndJsonResonse(
				array(
					'REQUIRED_ACTION' => array(
						'NAME' => 'SYNCHRONIZE',
						'DATA' => array(
							'CONFIG' => $config->toJavaScript(),
							'FIELD_NAMES' => array_values($syncFieldNames)
						)
					)
				)
			);
		}
	}
	else
	{
		$entityConfigs = $config->getItems();
		foreach($entityConfigs as $entityTypeID => $entityConfig)
		{
			if(!EntityAuthorization::checkCreatePermission($entityTypeID, $currentUserPermissions)
				&& !EntityAuthorization::checkUpdatePermission($entityTypeID, 0, $currentUserPermissions))
			{
				continue;
			}

			if(!$entityConfig->isActive())
			{
				continue;
			}

			if(!UserFieldSynchronizer::needForSynchronization(CCrmOwnerType::Quote, $entityTypeID))
			{
				continue;
			}

			if($entityConfig->isSynchronizationEnabled())
			{
				UserFieldSynchronizer::synchronize(\CCrmOwnerType::Quote, $entityTypeID);
			}
			else
			{
				UserFieldSynchronizer::markAsSynchronized(\CCrmOwnerType::Quote, $entityTypeID);
			}
		}
	}

	QuoteConversionWizard::remove($entityID);
	$wizard = new QuoteConversionWizard($entityID, $config);
	$wizard->setOriginUrl(isset($_POST['ORIGIN_URL']) ? $_POST['ORIGIN_URL'] : '');

	$wizard->setSliderEnabled(true);

	if($wizard->execute())
	{
		__CrmQuoteDetailsEndJsonResonse(
			array(
				'DATA' => array(
					'URL' => $wizard->getRedirectUrl(),
					'IS_FINISHED' => $wizard->isFinished() ? 'Y' : 'N'
				)
			)
		);
	}
	else
	{
		$url = $wizard->getRedirectUrl();
		if($url !== '')
		{
			__CrmQuoteDetailsEndJsonResonse(
				array(
					'DATA' => array(
						'URL' => $url,
						'IS_FINISHED' => $wizard->isFinished() ? 'Y' : 'N'
					)
				)
			);
		}
		else
		{
			__CrmQuoteDetailsEndJsonResonse(array('ERROR' => array('MESSAGE' => $wizard->getErrorText())));
		}
	}
}
elseif($action === 'DELETE')
{
	$ID = isset($_POST['ACTION_ENTITY_ID']) ? max((int)$_POST['ACTION_ENTITY_ID'], 0) : 0;
	if($ID <= 0)
	{
		__CrmQuoteDetailsEndJsonResonse(array('ERROR' => GetMessage('CRM_QUOTE_NOT_FOUND')));
	}

	if(!\CCrmQuote::CheckDeletePermission($ID, $currentUserPermissions))
	{
		__CrmQuoteDetailsEndJsonResonse(array('ERROR' => GetMessage('CRM_QUOTE_ACCESS_DENIED')));
	}

	$entity = new \CCrmQuote(false);
	if (!$entity->Delete($ID))
	{
		/** @var CApplicationException $ex */
		$ex = $APPLICATION->GetException();
		__CrmQuoteDetailsEndJsonResonse(
			array(
				'ERROR' => ($ex instanceof CApplicationException) ? $ex->GetString() : GetMessage('CRM_QUOTE_DELETION_ERROR')
			)
		);
	}
	__CrmQuoteDetailsEndJsonResonse(array('ENTITY_ID' => $ID));
}