• Модуль: crm
  • Путь к файлу: ~/bitrix/modules/crm/lib/statistics/dealinvoicestatisticentry.php
  • Класс: Bitrix\Crm\Statistics\DealInvoiceStatisticEntry
  • Вызов: DealInvoiceStatisticEntry::synchronize
static function synchronize($ownerID, array $entityFields = null)
{
	if(!is_int($ownerID))
	{
		$ownerID = (int)$ownerID;
	}

	if($ownerID <= 0)
	{
		throw new Main\ArgumentException('Owner ID must be greater than zero.', 'ownerID');
	}

	if(!is_array($entityFields))
	{
		$dbResult = \CCrmDeal::GetListEx(
			array(),
			array('=ID' => $ownerID, 'CHECK_PERMISSIONS' => 'N'),
			false,
			false,
			array('STAGE_ID', 'CATEGORY_ID', 'ASSIGNED_BY_ID', 'BEGINDATE', 'CLOSEDATE', 'OPPORTUNITY', 'CURRENCY_ID')
		);
		$entityFields = is_object($dbResult) ? $dbResult->Fetch() : null;
		if(!is_array($entityFields))
		{
			return false;
		}
	}

	$categoryID = isset($entityFields['CATEGORY_ID']) ? (int)$entityFields['CATEGORY_ID'] : 0;
	$stageID = isset($entityFields['STAGE_ID']) ? $entityFields['STAGE_ID'] : '';
	$semanticID = \CCrmDeal::GetSemanticID($stageID, $categoryID);
	$isLost = PhaseSemantics::isLost($semanticID);
	$responsibleID = isset($entityFields['ASSIGNED_BY_ID']) ? (int)$entityFields['ASSIGNED_BY_ID'] : 0;

	$zeroDate = new Date('0000-00-00', 'Y-m-d');
	/** @var Date $startDate */
	$startDate = self::parseDateString(isset($entityFields['BEGINDATE']) ? $entityFields['BEGINDATE'] : '');
	if($startDate === null || $startDate == $zeroDate || $startDate->getTimestamp() === false)
	{
		$startDate = new Date();
	}

	/** @var Date $endDate */
	$endDate = self::parseDateString(isset($entityFields['CLOSEDATE']) ? $entityFields['CLOSEDATE'] : '');
	if($endDate === null || $endDate == $zeroDate || $endDate->getTimestamp() === false)
	{
		$endDate = new Date('9999-12-31', 'Y-m-d');
	}

	$sum = isset($entityFields['OPPORTUNITY']) ? (double)$entityFields['OPPORTUNITY'] : 0.0;
	$currencyID = isset($entityFields['CURRENCY_ID']) ? $entityFields['CURRENCY_ID'] : '';
	if($currencyID === '')
	{
		$currencyID = \CCrmCurrency::GetBaseCurrencyID();
	}
	$accountCurrencyID = \CCrmCurrency::GetAccountCurrencyID();
	$sumData = \CCrmAccountingHelper::PrepareAccountingData(
		array('CURRENCY_ID' => $currencyID, 'SUM' => $sum)
	);

	if(is_array($sumData))
	{
		$sum = (double)$sumData['ACCOUNT_SUM'];
	}

	$latest = self::getLatest($ownerID);
	if(!is_array($latest))
	{
		if($semanticID === PhaseSemantics::SUCCESS)
		{
			//Creation of stub for successfully completed entity without invoices
			self::innerRegister(
				array(
					'OWNER_ID' => $ownerID,
					'CREATED_DATE' => new Date(),
					'START_DATE' => $startDate,
					'END_DATE' => $endDate,
					'RESPONSIBLE_ID' => $responsibleID,
					'STAGE_SEMANTIC_ID' => PhaseSemantics::SUCCESS,
					'STAGE_ID' => $stageID,
					'IS_LOST' => 'N',
					'CURRENCY_ID' => $accountCurrencyID,
					'INVOICE_SUM' => 0.0,
					'INVOICE_QTY' => 0,
					'TOTAL_INVOICE_SUM' => 0.0,
					'TOTAL_INVOICE_QTY' => 0,
					'TOTAL_SUM' => $sum
				)
			);
		}
		return true;
	}

	if($startDate == $latest['START_DATE']
		&& $endDate == $latest['END_DATE']
		&& $responsibleID === (int)$latest['RESPONSIBLE_ID']
		&& $stageID === $latest['STAGE_ID']
		&& $semanticID === $latest['STAGE_SEMANTIC_ID']
		&& $sum === (double)$latest['TOTAL_SUM'])
	{
		return false;
	}

	if($semanticID !== $latest['STAGE_SEMANTIC_ID']
		&& $latest['STAGE_SEMANTIC_ID'] === PhaseSemantics::SUCCESS
		&& (int)$latest['INVOICE_QTY'] === 0)
	{
		//Clean up stub for successfully completed entity without invoices
		DealInvoiceStatisticsTable::delete(array('OWNER_ID' => $ownerID, 'CREATED_DATE' => $latest['CREATED_DATE']));
	}
	else
	{
		DealInvoiceStatisticsTable::synchronize(
			$ownerID,
			array(
				'START_DATE' => $startDate,
				'END_DATE' => $endDate,
				'RESPONSIBLE_ID' => $responsibleID,
				'STAGE_SEMANTIC_ID' => $semanticID,
				'STAGE_ID' => $stageID,
				'IS_LOST' => $isLost ? 'Y' : 'N',
				'TOTAL_SUM' => $sum
			)
		);
	}
	return true;
}