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