- Модуль: crm
- Путь к файлу: ~/bitrix/modules/crm/lib/widget/data/company/invoicesumstatistics.php
- Класс: Bitrix\Crm\Widget\Data\Company\InvoiceSumStatistics
- Вызов: InvoiceSumStatistics::getList
public function getList(array $params)
{
/** @var Filter $filter */
$filter = isset($params['filter']) ? $params['filter'] : null;
if(!($filter instanceof Filter))
{
throw new Main\ObjectNotFoundException("The 'filter' is not found in params.");
}
$group = isset($params['group'])? mb_strtoupper($params['group']) : '';
if($group !== ''
&& $group !== self::GROUP_BY_USER
&& $group !== self::GROUP_BY_DATE)
{
$group = '';
}
$enableGroupKey = isset($params['enableGroupKey']) ? (bool)$params['enableGroupKey'] : false;
/** @var array $select */
$select = isset($params['select']) && is_array($params['select']) ? $params['select'] : array();
$name = '';
$aggregate = '';
if(!empty($select))
{
$selectItem = $select[0];
if(isset($selectItem['name']))
{
$name = $selectItem['name'];
}
if(isset($selectItem['aggregate']))
{
$aggregate = mb_strtoupper($selectItem['aggregate']);
}
}
if($name === '')
{
$name = 'SUM_TOTAL';
}
$semanticID = PhaseSemantics::UNDEFINED;
switch ($name)
{
case 'PROCESS_COUNT':
case 'PROCESS_SUM':
$semanticID = PhaseSemantics::PROCESS;
break;
case 'SUCCESS_COUNT':
case 'SUCCESS_SUM':
case 'PAID_INTIME_COUNT':
$semanticID = PhaseSemantics::SUCCESS;
break;
}
if($aggregate !== '' && !in_array($aggregate, array('SUM', 'COUNT', 'MAX', 'MIN')))
{
$aggregate = '';
}
$permissionSql = '';
if($this->enablePermissionCheck)
{
$permissionSql = $this->preparePermissionSql();
if($permissionSql === false)
{
//Access denied;
return array();
}
}
$period = $filter->getPeriod();
$periodStartDate = $period['START'];
$periodEndDate = $period['END'];
$query = new Query(InvoiceSumStatisticsTable::getEntity());
$query->setTableAliasPostfix('_s1');
$nameAlias = $name;
if($aggregate !== '')
{
if($aggregate === 'COUNT')
{
$query->registerRuntimeField('', new ExpressionField($nameAlias, "COUNT(*)"));
}
else
{
$nameAlias = "{$nameAlias}_R";
$query->registerRuntimeField('', new ExpressionField($nameAlias, "{$aggregate}(%s)", 'SUM_TOTAL'));
}
}
$query->addSelect($nameAlias);
$subQuery = new Query(InvoiceSumStatisticsTable::getEntity());
$subQuery->setTableAliasPostfix('_s2');
$subQuery->addSelect('OWNER_ID');
$dateFieldName = 'CREATED_DATE';
if($semanticID !== PhaseSemantics::UNDEFINED)
{
$subQuery->addFilter('=STATUS_SEMANTIC_ID', $semanticID);
if(PhaseSemantics::isFinal($semanticID))
{
$dateFieldName = 'CLOSED_DATE';
}
}
$subQuery->addFilter(">={$dateFieldName}", $periodStartDate);
$subQuery->addFilter("<={$dateFieldName}", $periodEndDate);
if ($name === 'PAID_INTIME_COUNT')
$subQuery->addFilter("=IS_PAID_INTIME", 'Y');
if($this->enablePermissionCheck && is_string($permissionSql) && $permissionSql !== '')
{
$subQuery->addFilter('@OWNER_ID', new SqlExpression($permissionSql));
}
$responsibleIDs = $filter->getResponsibleIDs();
if(!empty($responsibleIDs))
{
$subQuery->addFilter('@RESPONSIBLE_ID', $responsibleIDs);
}
$subQuery->addGroup('OWNER_ID');
$subQuery->addSelect('MAX_CREATED_DATE');
$subQuery->registerRuntimeField('', new ExpressionField('MAX_CREATED_DATE', 'MAX(%s)', 'CREATED_DATE'));
if (
$filter->getContextEntityTypeName() === \CCrmOwnerType::CompanyName
&& $filter->getContextEntityID() > 0
)
{
$subQuery->addFilter('=COMPANY_ID', $filter->getContextEntityID());
}
$query->registerRuntimeField('',
new ReferenceField('M',
Base::getInstanceByQuery($subQuery),
array('=this.OWNER_ID' => 'ref.OWNER_ID', '=this.CREATED_DATE' => 'ref.MAX_CREATED_DATE'),
array('join_type' => 'INNER')
)
);
$sort = isset($params['sort']) && is_array($params['sort']) && !empty($params['sort']) ? $params['sort'] : null;
if($sort)
{
foreach($sort as $sortItem)
{
if(isset($sortItem['name']))
{
$sortName = $sortItem['name'];
if($sortName === $name)
{
$sortName = $nameAlias;
}
$query->addOrder($sortName, isset($sortItem['order']) ? $sortItem['order'] : 'ASC');
}
}
}
if($group !== '')
{
if($group === self::GROUP_BY_USER)
{
$query->addSelect('RESPONSIBLE_ID', 'USER_ID');
$query->addGroup('RESPONSIBLE_ID');
}
elseif($group === self::GROUP_BY_DATE)
{
$query->addSelect($dateFieldName, 'DATE');
$query->addGroup($dateFieldName);
if(!$sort)
{
$query->addOrder($dateFieldName, 'ASC');
}
}
}
$dbResult = $query->exec();
$result = array();
$useAlias = $nameAlias !== $name;
if($group === self::GROUP_BY_DATE)
{
while($ary = $dbResult->fetch())
{
if($useAlias && isset($ary[$nameAlias]))
{
$ary[$name] = $ary[$nameAlias];
unset($ary[$nameAlias]);
}
/** @var Date $d */
$d = $ary['DATE'];
$ary['DATE'] = $d->format('Y-m-d');
if($ary['DATE'] === '9999-12-31')
{
//Skip empty dates
continue;
}
if($enableGroupKey)
{
$result[$ary['DATE']] = $ary;
}
else
{
$result[] = $ary;
}
}
}
elseif($group === self::GROUP_BY_USER)
{
$rawResult = array();
$userIDs = array();
while($ary = $dbResult->fetch())
{
if($useAlias && isset($ary[$nameAlias]))
{
$ary[$name] = $ary[$nameAlias];
unset($ary[$nameAlias]);
}
$userID = $ary['USER_ID'] = (int)$ary['USER_ID'];
if($userID > 0 && !isset($userIDs[$userID]))
{
$userIDs[$userID] = true;
}
$rawResult[] = $ary;
}
$userNames = self::prepareUserNames(array_keys($userIDs));
if($enableGroupKey)
{
foreach($rawResult as $item)
{
$userID = $item['USER_ID'];
$item['USER'] = isset($userNames[$userID]) ? $userNames[$userID] : "[{$userID}]";
$result[$userID] = $item;
}
}
else
{
foreach($rawResult as $item)
{
$userID = $item['USER_ID'];
$item['USER'] = isset($userNames[$userID]) ? $userNames[$userID] : "[{$userID}]";
$result[] = $item;
}
}
}
else
{
while($ary = $dbResult->fetch())
{
if($useAlias && isset($ary[$nameAlias]))
{
$ary[$name] = $ary[$nameAlias];
unset($ary[$nameAlias]);
}
$result[] = $ary;
}
}
return $result;
}