• Модуль: crm
  • Путь к файлу: ~/bitrix/modules/crm/lib/statistics/invoicesumstatisticentry.php
  • Класс: Bitrix\Crm\Statistics\InvoiceSumStatisticEntry
  • Вызов: InvoiceSumStatisticEntry::register
static function register($ownerID, array $entityFields = null, array $options = 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 = \CCrmInvoice::GetList(
			array(),
			array('=ID' => $ownerID, 'CHECK_PERMISSIONS' => 'N')
		);
		$entityFields = is_object($dbResult) ? $dbResult->Fetch() : null;
		if(!is_array($entityFields))
		{
			return;
		}
	}

	if(!is_array($options))
	{
		$options = array();
	}
	$forced = isset($options['FORCED']) ? $options['FORCED'] : false;

	/** @var Date $date */
	$date = self::resolveEntityCreationDate($entityFields);
	$statusID = isset($entityFields['STATUS_ID']) ? $entityFields['STATUS_ID'] : '';
	$semanticID = \CCrmInvoice::GetSemanticID($statusID);
	$isJunk = PhaseSemantics::isLost($semanticID);
	$responsibleID = isset($entityFields['RESPONSIBLE_ID']) ? (int)$entityFields['RESPONSIBLE_ID'] : 0;
	$companyID = isset($entityFields['UF_COMPANY_ID']) ? (int)$entityFields['UF_COMPANY_ID'] : 0;
	$contactID = isset($entityFields['UF_CONTACT_ID']) ? (int)$entityFields['UF_CONTACT_ID'] : 0;
	/** @var Date $billDate */
	$billDate = self::resolveEntityBillDate($entityFields, $date);
	/** @var Date $payBeforeDate */
	$payBeforeDate = self::resolveEntityPayBeforeDate($entityFields);
	/** @var Date $paidDate */
	$paidDate = self::resolveEntityPaidDate($entityFields);
	$isPaidInTime = self::resolveEntityPaidInTime($entityFields);
	/** @var Date $closedDate */
	$closedDate = self::resolveEntityClosedDate($entityFields, $semanticID, $date);

	//$day = (int)$date->format('d');
	//$month = (int)$date->format('m');
	//$quarter = $month <= 3 ? 1 : ($month <= 6 ? 2 : ($month <= 9 ? 3 : 4));
	//$year = (int)$date->format('Y');

	$currencyID = isset($entityFields['CURRENCY']) ? $entityFields['CURRENCY'] : '';
	$accountingCurrencyID = \CCrmCurrency::GetAccountCurrencyID();
	$sum = isset($entityFields['PRICE']) ? (double)$entityFields['PRICE'] : 0.0;

	$bindingMap = self::getCurrent()->getSlotBindingMap();
	$binding = $bindingMap->get('SUM_TOTAL');
	if($binding === null)
	{
		$total = isset($entityFields['PRICE']) ? (double)$entityFields['PRICE'] : 0.0;
	}
	else
	{
		$bindingFieldName = $binding->getFieldName();
		if($bindingFieldName === '')
		{
			$bindingFieldName = 'PRICE';
		}
		$total = isset($entityFields[$bindingFieldName]) ? (double)$entityFields[$bindingFieldName] : 0.0;

		if($bindingFieldName !== 'PRICE' && $binding->getOption('ADD_PRODUCT_ROW_SUM') === 'Y')
		{
			$total += $sum;
		}
	}

	if($currencyID !== $accountingCurrencyID)
	{
		$accData = \CCrmAccountingHelper::PrepareAccountingData(
			array(
				'CURRENCY_ID' => $currencyID,
				'SUM' => $total
			)
		);
		if(is_array($accData))
		{
			$total = (double)$accData['ACCOUNT_SUM'];
		}
	}

	$sumSlots = array();
	$sumSlotFields = InvoiceSumStatisticsTable::getSumSlotFieldNames();
	foreach($sumSlotFields as $fieldName)
	{
		$binding = $bindingMap->get($fieldName);
		if($binding === null)
		{
			$slotSum = 0.0;
		}
		else
		{
			$bindingFieldName = $binding->getFieldName();
			$slotSum = $bindingFieldName !== '' && isset($entityFields[$bindingFieldName])
				? (double)$entityFields[$bindingFieldName] : 0.0;

			if($binding->getOption('ADD_PRODUCT_ROW_SUM') === 'Y')
			{
				$slotSum += $sum;
			}
		}

		if($currencyID !== $accountingCurrencyID)
		{
			$accData = \CCrmAccountingHelper::PrepareAccountingData(
				array(
					'CURRENCY_ID' => $currencyID,
					'SUM' => $slotSum
				)
			);
			if(is_array($accData))
			{
				$slotSum = (double)$accData['ACCOUNT_SUM'];
			}
		}

		$sumSlots[$fieldName] = $slotSum;
	}

	$latest = self::getLatest($ownerID);
	if(is_array($latest))
	{
		if($forced)
		{
			InvoiceSumStatisticsTable::synchronizeSumFields(
				$ownerID,
				array_merge(array('SUM_TOTAL' => $total), $sumSlots)
			);
		}

		$latestResponsibleID = (int)$latest['RESPONSIBLE_ID'];
		$latestCompanyID = (int)$latest['COMPANY_ID'];
		$latestContactID = (int)$latest['CONTACT_ID'];
		/** @var Date $latestBillDate */
		$latestBillDate = $latest['BILL_DATE'];
		/** @var Date $latestPayBeforeDate */
		$latestPayBeforeDate = $latest['PAY_BEFORE_DATE'];
		/** @var Date $latestPaidDate */
		$latestPaidDate = isset($latest['PAID_DATE']) ? $latest['PAID_DATE'] : null;
		/** @var Date $latestClosedDate */
		$latestClosedDate = isset($latest['CLOSED_DATE']) ? $latest['CLOSED_DATE'] : null;

		if($responsibleID !== $latestResponsibleID
			|| $companyID !== $latestCompanyID
			|| $contactID !== $latestContactID
			|| self::nullSafeCompareDates($payBeforeDate, $latestPayBeforeDate) !== 0
			|| self::nullSafeCompareDates($billDate, $latestBillDate) !== 0
			|| self::nullSafeCompareDates($closedDate, $latestClosedDate) !== 0
			|| self::nullSafeCompareDates($paidDate, $latestPaidDate) !== 0)
		{
			//Update responsible user and dates in all related records
			InvoiceSumStatisticsTable::synchronize(
				$ownerID,
				array(
					'RESPONSIBLE_ID' => $responsibleID,
					'COMPANY_ID' => $companyID,
					'CONTACT_ID' => $contactID,
					'BILL_DATE' => $billDate,
					'PAY_BEFORE_DATE' => $payBeforeDate,
					'PAID_DATE' => $paidDate,
					'IS_PAID_INTIME' => $isPaidInTime,
					'CLOSED_DATE' => $closedDate
				)
			);
		}

		if($statusID === $latest['STATUS_ID']
			&& $currencyID === $latest['CURRENCY_ID']
			&& $total === (double)$latest['SUM_TOTAL']
			&& $sumSlots['UF_SUM_1'] === (double)$latest['UF_SUM_1']
			&& $sumSlots['UF_SUM_2'] === (double)$latest['UF_SUM_2']
			&& $sumSlots['UF_SUM_3'] === (double)$latest['UF_SUM_3']
			&& $sumSlots['UF_SUM_4'] === (double)$latest['UF_SUM_4']
			&& $sumSlots['UF_SUM_5'] === (double)$latest['UF_SUM_5'])
		{
			return;
		}
	}

	$data = array_merge(
		array(
			'OWNER_ID' => $ownerID,
			'CREATED_DATE' => $date,
			'BILL_DATE' => $billDate,
			'PAY_BEFORE_DATE' => $payBeforeDate,
			'PAID_DATE' => $paidDate,
			'IS_PAID_INTIME' => $isPaidInTime,
			'CLOSED_DATE' => $closedDate,
			//'PERIOD_YEAR' => $year,
			//'PERIOD_QUARTER' => $quarter,
			//'PERIOD_MONTH' => $month,
			//'PERIOD_DAY' => $day,
			'RESPONSIBLE_ID' => $responsibleID,
			'COMPANY_ID' => $companyID,
			'CONTACT_ID' => $contactID,
			'STATUS_SEMANTIC_ID' => $semanticID,
			'STATUS_ID' => $statusID,
			'IS_JUNK' => $isJunk ? 'Y' : 'N',
			'CURRENCY_ID' => $accountingCurrencyID,
			'SUM_TOTAL' => $total
		),
		$sumSlots
	);
	InvoiceSumStatisticsTable::upsert($data);
}