• Модуль: crm
  • Путь к файлу: ~/bitrix/modules/crm/classes/general/restservice_invoice.php
  • Класс: \CCrmInvoiceRestService
  • Вызов: CCrmInvoiceRestService::add
static function add($params)
{
	/** @global CMain $APPLICATION*/
	global $APPLICATION, $DB;

	$invoice = new CCrmInvoice();
	if(!CCrmInvoice::CheckCreatePermission())
		throw new RestException('Access denied.');

	$fields = CCrmInvoiceRestUtil::getParamArray($params, 'fields');

	$fields = self::filterFields($fields, 'add');

	self::internalizeUserFields($fields, array());

	if (!is_array($fields) || count($fields) === 0)
		throw new RestException('Invalid parameters.');

	// sanitize
	$comments = isset($fields['COMMENTS']) ? trim($fields['COMMENTS']) : '';
	$userDescription = isset($fields['USER_DESCRIPTION']) ? trim($fields['USER_DESCRIPTION']) : '';
	$bSanitizeComments = ($comments !== '' && mb_strpos($comments, '<') !== false);
	$bSanitizeUserDescription = ($userDescription !== '' && mb_strpos($userDescription, '<') !== false);
	if ($bSanitizeComments || $bSanitizeUserDescription)
	{
		$sanitizer = new CBXSanitizer();
		$sanitizer->ApplyDoubleEncode(false);
		$sanitizer->SetLevel(CBXSanitizer::SECURE_LEVEL_MIDDLE);
		//Crutch for for Chrome line break behaviour in HTML editor.
		$sanitizer->AddTags(array('div' => array()));
		if ($bSanitizeComments)
			$fields['COMMENTS'] = $sanitizer->SanitizeHtml($fields['COMMENTS']);
		if ($bSanitizeUserDescription)
			$fields['USER_DESCRIPTION'] = $sanitizer->SanitizeHtml($fields['USER_DESCRIPTION']);
		unset($sanitizer);
	}
	unset($bSanitizeComments, $bSanitizeUserDescription);
	$fields['COMMENTS'] = $comments;
	$fields['USER_DESCRIPTION'] = $userDescription;
	unset($comments, $userDescription);

	$bStatusSuccess = CCrmStatusInvoice::isStatusSuccess($fields['STATUS_ID']);
	if ($bStatusSuccess)
		$bStatusFailed = false;
	else
		$bStatusFailed = CCrmStatusInvoice::isStatusFailed($fields['STATUS_ID']);

	$options = array();
	if(!self::isRequiredUserFieldCheckEnabled())
	{
		$options['DISABLE_REQUIRED_USER_FIELD_CHECK'] = true;
	}

	if (!$invoice->CheckFields($fields, false, $bStatusSuccess, $bStatusFailed, $options))
	{
		if (!empty($invoice->LAST_ERROR))
			throw new RestException($invoice->LAST_ERROR);
		else
			throw new RestException('Error on check fields.');
	}

	// person type
	$arPersonTypes = CCrmPaySystem::getPersonTypeIDs();
	if (!isset($arPersonTypes['COMPANY']) || !isset($arPersonTypes['CONTACT']))
		throw new RestException('Incorrect values in the peson type settings.');
	$personTypeId = isset($fields['PERSON_TYPE_ID']) ? (int)$fields['PERSON_TYPE_ID'] : 0;
	if (isset($fields['UF_COMPANY_ID']) && intval($fields['UF_COMPANY_ID']) > 0)
		$personTypeId = (int)$arPersonTypes['COMPANY'];
	else if (isset($fields['UF_CONTACT_ID']) && intval($fields['UF_CONTACT_ID']) > 0)
		$personTypeId = (int)$arPersonTypes['CONTACT'];
	if ($personTypeId !== intval($arPersonTypes['COMPANY']) && $personTypeId !== intval($arPersonTypes['CONTACT']))
	{
		throw new RestException('Incorrect value of PERSON_TYPE_ID field ('.
			$arPersonTypes['CONTACT'].' - Contact, '.$arPersonTypes['CONTACT'].' - Company)');
	}
	$fields['PERSON_TYPE_ID'] = $personTypeId;

	if (!is_array($fields['INVOICE_PROPERTIES']))
	{
		$fields['INVOICE_PROPERTIES'] = array();
	}
	if (isset($fields['PR_LOCATION']))
	{
		$fields['INVOICE_PROPERTIES']['LOCATION'] = $fields['PR_LOCATION'];
	}
	$propsInfo = CCrmInvoice::GetPropertiesInfo($fields['PERSON_TYPE_ID']);
	$propsInfo = is_array($propsInfo[$fields['PERSON_TYPE_ID']]) ? $propsInfo[$fields['PERSON_TYPE_ID']] : array();
	$invoiceProperties = array();
	foreach ($fields['INVOICE_PROPERTIES'] as $code => $value)
	{
		if (array_key_exists($code, $propsInfo))
		{
			$invoiceProperties[$propsInfo[$code]['ID']] = $value;
		}
		else if ($code === 'COMPANY' && array_key_exists('COMPANY_NAME', $propsInfo))    // ua company name hack
		{
			$invoiceProperties[$propsInfo['COMPANY_NAME']['ID']] = $value;
		}
	}
	$fields['INVOICE_PROPERTIES'] = $invoiceProperties;
	unset($propsInfo, $invoiceProperties, $code, $value);

	$defRqLinkParams = Requisite\EntityLink::determineRequisiteLinkBeforeSave(
		CCrmOwnerType::Invoice, 0, Requisite\EntityLink::ENTITY_OPERATION_ADD, $fields
	);

	//region Autocomplete property values
	$companyId = 0;
	$contactId = 0;
	$requisiteIdLinked = 0;

	if (isset($defRqLinkParams['CLIENT_ENTITY_TYPE_ID']) && isset($defRqLinkParams['CLIENT_ENTITY_ID'])
		&& $defRqLinkParams['CLIENT_ENTITY_ID'] > 0)
	{
		if ($defRqLinkParams['CLIENT_ENTITY_TYPE_ID'] === CCrmOwnerType::Company)
		{
			$companyId = (int)$defRqLinkParams['CLIENT_ENTITY_ID'];
		}
		else if ($defRqLinkParams['CLIENT_ENTITY_TYPE_ID'] === CCrmOwnerType::Contact)
		{
			$contactId = (int)$defRqLinkParams['CLIENT_ENTITY_ID'];
		}
	}
	if ($contactId <= 0 && isset($fields['UF_CONTACT_ID']) && $fields['UF_CONTACT_ID'] > 0)
	{
		$contactId = (int)$fields['UF_CONTACT_ID'];
	}
	if (isset($defRqLinkParams['REQUISITE_ID']) && $defRqLinkParams['REQUISITE_ID'] > 0)
	{
		$requisiteIdLinked = $defRqLinkParams['REQUISITE_ID'];
	}
	$props = $invoice->GetProperties(0, $personTypeId);
	CCrmInvoice::__RewritePayerInfo($companyId, $contactId, $props);
	CCrmInvoice::rewritePropsFromRequisite($personTypeId, $requisiteIdLinked, $props);
	$formProps = array();
	$propsValues = $invoice->ParsePropertiesValuesFromPost($personTypeId, $formProps, $props);
	if (isset($propsValues['PROPS_VALUES']) && is_array($propsValues['PROPS_VALUES']))
	{
		foreach($propsValues['PROPS_VALUES'] as $propertyId => $propertyValue)
		{
			if (!isset($fields['INVOICE_PROPERTIES'][$propertyId])
				|| $fields['INVOICE_PROPERTIES'][$propertyId] === '')
			{
				$fields['INVOICE_PROPERTIES'][$propertyId] = $propertyValue;
			}
		}
		unset($propertyId, $propertyValue);
	}
	unset($companyId, $contactId, $requisiteIdLinked, $props, $propsValues, $formProps);
	//endregion Autocomplete property values

	$DB->StartTransaction();
	$recalculate = false;
	$ID = $invoice->Add($fields, $recalculate, SITE_ID, array('UPDATE_SEARCH' => true));
	if(!is_int($ID) || $ID <= 0)
	{
		$DB->Rollback();

		$errMsg = '';
		if (!empty($invoice->LAST_ERROR))
		{
			$errMsg = $invoice->LAST_ERROR;
		}
		else
		{
			$ex = $APPLICATION->GetException();
			if ($ex)
			{
				$APPLICATION->ResetException();
				if ($errMsg == '')
					$errMsg = $ex->GetString();
			}
		}
		throw new RestException((!empty($errMsg) ? $errMsg : 'Unknown error during invoice creation.')."
\n"); } else { Requisite\EntityLink::register( CCrmOwnerType::Invoice, $ID, $defRqLinkParams['REQUISITE_ID'], $defRqLinkParams['BANK_DETAIL_ID'], $defRqLinkParams['MC_REQUISITE_ID'], $defRqLinkParams['MC_BANK_DETAIL_ID'] ); $DB->Commit(); } return $ID; }