• Модуль: crm
  • Путь к файлу: ~/bitrix/modules/crm/lib/entityrequisite.php
  • Класс: Bitrix\Crm\EntityRequisite
  • Вызов: EntityRequisite::add
public function add($fields, $options = array())
{
	unset($fields['ID'], $fields['DATE_MODIFY'], $fields['MODIFY_BY_ID']);

	$allowSetSystemFields = $options['ALLOW_SET_SYSTEM_FIELDS'] ?? false;
	if (!$allowSetSystemFields)
	{
		$fields['DATE_CREATE'] = new \Bitrix\Main\Type\DateTime();
		$fields['CREATED_BY_ID'] = \CCrmSecurityHelper::GetCurrentUserID();
	}

	$addresses = null;
	if (isset($fields[self::ADDRESS]))
	{
		$addresses = $fields[self::ADDRESS];
		unset($fields[self::ADDRESS]);
	}

	// rewrite some fields
	$entity = RequisiteTable::getEntity();
	foreach ($entity->getFields() as $field)
	{
		$fieldName = $field->getName();
		if ($field instanceof Entity\BooleanField && array_key_exists($fieldName, $fields))
		{
			if ($fields[$fieldName] !== 'Y' && $fields[$fieldName] !== 'N'
				&& $fields[$fieldName] !== true && $fields[$fieldName] !== false)
			{
				$fields[$fieldName] = $field->getDefaultValue();
			}
		}
	}

	$addressOnly = false;
	if (isset($fields['ADDRESS_ONLY']) &&
		($fields['ADDRESS_ONLY'] === true || $fields['ADDRESS_ONLY'] === 'Y'))
	{
		$addressOnly = true;
	}
	if ($addressOnly)
	{
		$fields = $this->removeNonAddressFields($fields);
	}

	$result = $this->checkRqFieldsBeforeSave(0, $fields);
	if (!$result->isSuccess())
	{
		return $result;
	}

	$result = RequisiteTable::add($fields);
	$id = $result->isSuccess() ? (int)$result->getId() : 0;
	if ($id > 0)
	{
		$entityTypeId = isset($fields['ENTITY_TYPE_ID']) ? (int)$fields['ENTITY_TYPE_ID'] : CCrmOwnerType::Undefined;
		$entityId = isset($fields['ENTITY_ID']) ? (int)$fields['ENTITY_ID'] : 0;

		if (is_array($addresses))
		{
			if(!CCrmOwnerType::IsDefined($entityTypeId) || $entityId <= 0)
			{
				$entityTypeId = CCrmOwnerType::Requisite;
				$entityId = $id;
			}

			foreach($addresses as $addressTypeID => $address)
			{
				if(!is_array($address) || empty($address))
				{
					continue;
				}

				EntityAddress::register(
					CCrmOwnerType::Requisite,
					$id,
					$addressTypeID,
					array(
						'ANCHOR_TYPE_ID' => $entityTypeId,
						'ANCHOR_ID' => $entityId,
						'ADDRESS_1' => isset($address['ADDRESS_1']) ? $address['ADDRESS_1'] : null,
						'ADDRESS_2' => isset($address['ADDRESS_2']) ? $address['ADDRESS_2'] : null,
						'CITY' => isset($address['CITY']) ? $address['CITY'] : null,
						'POSTAL_CODE' => isset($address['POSTAL_CODE']) ? $address['POSTAL_CODE'] : null,
						'REGION' => isset($address['REGION']) ? $address['REGION'] : null,
						'PROVINCE' => isset($address['PROVINCE']) ? $address['PROVINCE'] : null,
						'COUNTRY' => isset($address['COUNTRY']) ? $address['COUNTRY'] : null,
						'COUNTRY_CODE' => isset($address['COUNTRY_CODE']) ? $address['COUNTRY_CODE'] : null,
						'LOC_ADDR_ID' => isset($address['LOC_ADDR_ID']) ? (int)$address['LOC_ADDR_ID'] : 0,
						'LOC_ADDR' => isset($address['LOC_ADDR']) ? $address['LOC_ADDR'] : null
					)
				);
			}
		}

		if (($entityTypeId === CCrmOwnerType::Company || $entityTypeId === CCrmOwnerType::Contact)
			&& $entityId > 0)
		{
			DuplicateRequisiteCriterion::registerByEntity($entityTypeId, $entityId);

			//region Register volatile duplicate criterion fields
			DuplicateVolatileCriterion::register(
				$entityTypeId,
				$entityId,
				[FieldCategory::REQUISITE]
			);
			//endregion Register volatile duplicate criterion fields
		}

		//region Send event
		$event = new Main\Event('crm', 'OnAfterRequisiteAdd', array('id' => $id, 'fields' => $fields));
		$event->send();
		//endregion
	}

	return $result;
}