• Модуль: crm
  • Путь к файлу: ~/bitrix/modules/crm/lib/requisite/invoicerequisiteconverter.php
  • Класс: Bitrix\Crm\Requisite\InvoiceRequisiteConverter
  • Вызов: InvoiceRequisiteConverter::processEntity
public function processEntity($entityID)
{
	$this->validate();

	$filter = array();
	if($this->entityTypeID === \CCrmOwnerType::Company)
	{
		$filter['=UF_COMPANY_ID'] = $entityID;
	}
	elseif($this->entityTypeID === \CCrmOwnerType::Contact)
	{
		$filter['=UF_CONTACT_ID'] = $entityID;
		$filter['=UF_COMPANY_ID'] = 0;
	}
	else
	{
		$entityTypeName = \CCrmOwnerType::ResolveName($this->entityTypeID);
		throw new Main\NotSupportedException("Entity type: '{$entityTypeName}' is not supported in current context");
	}

	if(!$this->enablePermissionCheck)
	{
		$filter['CHECK_PERMISSIONS'] = 'N';
	}

	$dbResult = \CCrmInvoice::GetList(
		array('ID' => 'DESC'),
		$filter,
		false,
		array('nTopCount' => $this->limit),
		array('ID')
	);

	$itemIDs = array();
	while($ary = $dbResult->Fetch())
	{
		$itemIDs[] = (int)$ary['ID'];
	}

	$map = array();
	$count = $this->getPropertyMapCount();
	foreach($itemIDs as $itemID)
	{
		$properties = \CCrmInvoice::GetProperties($itemID, $this->personTypeID);
		$key = $this->prepareRequisiteKey($properties);
		if($key === '')
		{
			$key = '-';
		}

		$item = isset($map[$key]) ? $map[$key] : array();
		$fields = isset($item['fields']) ? $item['fields'] : array();
		if(count($fields) < $count)
		{
			$this->prepareRequisiteFields($properties, $entityID, $fields);
			$item['fields'] = $fields;
		}

		if(!isset($item['invoices']))
		{
			$item['invoices'] = array();
		}

		$item['invoices'][] = $itemID;
		$map[$key] = $item;
	}

	if(empty($map))
	{
		return false;
	}

	$requisiteEntity = new EntityRequisite();
	foreach($map as $key => $item)
	{
		$fields = isset($item['fields']) ? $item['fields'] : array();
		if(empty($fields))
		{
			continue;
		}

		$xmlID = $this->presetID.':'.$this->entityTypeID.':'.md5($key);
		$dbResult = $requisiteEntity->getList(
			array(
				'filter' => array(
					'=PRESET_ID' => $this->presetID,
					'=ENTITY_TYPE_ID' => $this->entityTypeID,
					'=ENTITY_ID' => $entityID,
					'=XML_ID' => $xmlID
				),
				'select' => array_merge(array('ID', 'XML_ID'), $this->getPresetFieldNames()),
				'limit' => 1
			)
		);
		$requisiteFields = $dbResult->fetch();

		$requisiteID = 0;

		if(is_array($requisiteFields))
		{
			$requisiteID = (int)$requisiteFields['ID'];
			unset($requisiteFields['ID']);

			//HACK: Remove empty values for array_merge can take new values form fields
			foreach($requisiteFields as $k => $v)
			{
				if($v === '')
				{
					unset($requisiteFields[$k]);
				}
			}

			$requisiteFields[EntityRequisite::ADDRESS] = EntityRequisite::getAddresses($requisiteID);
		}
		else
		{
			$requisiteFields = array(
				'ENTITY_TYPE_ID' => $this->entityTypeID,
				'ENTITY_ID' => $entityID,
				'PRESET_ID' => $this->presetID,
				'NAME' => $this->prepareRequisiteName($entityID, $fields),
				'SORT' => 500,
				'ACTIVE' => 'Y',
				'XML_ID' => $xmlID
			);
		}

		$requisiteFields = array_merge($fields, $requisiteFields);
		if($requisiteID > 0)
		{
			$result = $requisiteEntity->update($requisiteID, $requisiteFields);
		}
		else
		{
			$result = $requisiteEntity->add($requisiteFields);
			if($result->isSuccess())
			{
				$requisiteID = (int)$result->getId();
			}
		}

		if($result->isSuccess() && $requisiteID > 0 && isset($item['invoices']))
		{
			foreach($item['invoices'] as $invoiceID)
			{
				EntityLink::register(\CCrmOwnerType::Invoice, $invoiceID, $requisiteID);
			}
		}
	}
	return true;
}