- Модуль: 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;
}