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