public function getItems(array $filter = [], int $blockPage = 1, array $params = []): array
{
$this->blockPage = $blockPage;
static $path = null;
static $currency = null;
static $columns = null;
$select = $this->getSelect();
if ($this->requiredFields)
{
$select = array_merge($select, array_keys($this->requiredFields));
}
$type = $this->entity->getTypeName();
$runtime = [];
$filterCommon = ($type === \CCrmOwnerType::OrderName ? $this->getOrderFilter($runtime) : $this->getFilter($params['filter'] ?? []));
// remove conflict keys and merge filters
$filter = array_merge($filterCommon, $filter);
if ($path === null)
{
$path = $this->getEntityPath($type);
}
if ($currency === null)
{
$currency = $this->currency;
}
if ($columns === null)
{
$columns = $this->getColumns(false, false, $this->params);
}
$parameters = [
'filter' => $filter,
'select' => $select,
'order' => $this->getOrder(),
'limit' => static::BLOCK_SIZE,
'offset' => static::BLOCK_SIZE * ($this->blockPage - 1),
];
if(!empty($runtime))
{
$parameters['runtime'] = $runtime;
}
// Pass symantic param to the deadlines view for correct filter works
if (
$this->viewMode === ViewMode::MODE_DEADLINES &&
!empty($this->allowSemantics) &&
is_array($this->allowSemantics) &&
$this->entity instanceof \Bitrix\Crm\Kanban\Entity\Dynamic
) {
$parameters['filter']['STAGE_SEMANTIC_ID'] = $this->allowSemantics;
}
$res = $this->entity->getItems($parameters);
$rows = [];
while ($row = $res->fetch())
{
$row = $this->entity->prepareItemCommonFields($row);
$rows[$row['ID']] = $row;
}
$addSelect = array_keys($this->additionalSelect);
$rows = $this->entity->appendRelatedEntitiesValues($rows, $addSelect);
$displayOptions = new \Bitrix\Crm\Service\Display\Options();
$restriction = \Bitrix\Crm\Restriction\RestrictionManager::getWebFormResultsRestriction();
$restrictedItemIds = [];
$restrictedValueClickCallback = null;
if (!$restriction->hasPermission())
{
$itemIds = array_keys($rows);
$restriction->prepareDisplayOptions($this->entity->getTypeId(), $itemIds, $displayOptions);
$restrictedItemIds = $displayOptions->getRestrictedItemIds();
$restrictedValueClickCallback = $restriction->prepareInfoHelperScript();
}
$displayedFields = $this->getDisplayedFieldsList();
$display = new \Bitrix\Crm\Service\Display($this->entity->getTypeId(), $displayedFields, $displayOptions);
$display->setItems($rows);
$renderedRows = $display->getAllValues();
$inlineFieldTypes = $this->getInlineFieldTypes();
$specialReqKeys = $this->getSpecialReqKeys();
$result = [];
$lastActivityInfo = $this->getEntity()->prepareMultipleItemsLastActivity($rows);
$activeAutomationDebugEntityIds = \CCrmBizProcHelper::getActiveDebugEntityIds($this->entity->getTypeId());
foreach($rows as $rowId => $row)
{
if (is_array($renderedRows[$rowId]))
{
$row = $this->mergeItemFieldsValues($row, $renderedRows[$rowId]);
}
if (isset($row['CONTACT_ID']) && $row['CONTACT_ID'] > 0)
{
$row['CONTACT_TYPE'] = 'CRM_CONTACT';
}
if (isset($row['COMPANY_ID']) && $row['COMPANY_ID'] > 0)
{
$row['CONTACT_TYPE'] = 'CRM_COMPANY';
}
//additional fields
$fields = [];
foreach ($addSelect as $code)
{
if (array_key_exists($code, $row) && array_key_exists($code, $displayedFields))
{
$displayedField = $displayedFields[$code];
if ($this->shouldShowField($displayedField, $row[$code]))
{
$field = [
'code' => $code,
'title' => $this->sanitizeString($displayedField->getTitle()),
'type' => $displayedField->getType(),
'valueDelimiter' => in_array($displayedField->getType(), $inlineFieldTypes) ? ', ' : '
',
'icon' => $displayedField->getDisplayParam('icon'),
'html' => $displayedField->wasRenderedAsHtml(),
'isMultiple' => $displayedField->isMultiple(),
];
$this->prepareField($field, $row[$code], $renderedRows[$rowId]);
$fields[] = $field;
}
}
}
$returnCustomer = (isset($row['IS_RETURN_CUSTOMER']) && $row['IS_RETURN_CUSTOMER'] === 'Y');
// collect required
$required = [];
$requiredFm = [];
if ($this->requiredFields && $this->viewMode === ViewMode::MODE_STAGES)
{
// fm fields check later
foreach ($this->getAllowedFmTypes() as $fm)
{
$fmUp = mb_strtoupper($fm);
$requiredFm[$fmUp] = true;
$row[$fmUp] = '';
}
// check each key
foreach ($row as $fieldName => $fieldValue)
{
if ($returnCustomer && isset($this->exclusiveFieldsReturnCustomer[$fieldName]))
{
continue;
}
if (
isset($this->requiredFields[$fieldName])
&& !$fieldValue
&& $fieldValue !== '0'
&& $fieldValue !== 0
&& $fieldValue !== 0.0
)
{
foreach ($this->requiredFields[$fieldName] as $stageId)
{
if (!isset($required[$stageId]))
{
$required[$stageId] = [];
}
$required[$stageId][] = $fieldName;
}
}
}
// special keys
foreach ($specialReqKeys as $reqKeyOrig => $reqKey)
{
if(
isset($this->requiredFields[$reqKey])
&& $reqKey === 'CLIENT'
&& (!empty($row['COMPANY_ID']) || !empty($row['CONTACT_ID']))
)
{
continue;
}
if (
isset($this->requiredFields[$reqKey])
&& (!$row[$reqKeyOrig] || ($reqKeyOrig === 'OPPORTUNITY' && $row['OPPORTUNITY_ACCOUNT'] <= 0))
)
{
foreach ($this->requiredFields[$reqKey] as $status)
{
if (!isset($required[$status]))
{
$required[$status] = [];
}
$required[$status][] = $reqKey;
}
}
}
}
//add
$columnId = $this->sanitizeString((string)$row[$this->getStatusKey()]);
$rowId = $row['ID'];
$result[$rowId] = [
'id' => $rowId,
'name' => $this->sanitizeString($this->getItemTitle($row) ?: '#' . $rowId),
'link' => $row['LINK'] ?? str_replace($this->getPathMarkers(), $rowId, $path),
'columnId' => $columnId,
'columnColor' => $columns[$columnId]['color'] ?? '',
'price' => $row['PRICE'],
'price_formatted' => $row['PRICE_FORMATTED'],
'entity_price' => $row['OPPORTUNITY_VALUE'],
'currency' => $row['CURRENCY_ID'],
'entity_currency' => $row['ENTITY_CURRENCY_ID'],
'date' => $row['DATE_FORMATTED'],
'dateCreate' => $row['DATE_CREATE'] ?? '',
'contactId' => (int)$row['CONTACT_ID'],
'companyId' => (!empty($row['COMPANY_ID']) ? (int)$row['COMPANY_ID'] : null),
'contactType' => $row['CONTACT_TYPE'],
'modifyById' => ($row['MODIFY_BY_ID'] ?? 0),
'modifyByAvatar' => '',
'activityStageId' => ($row['ACTIVITY_STAGE_ID'] ?? null),
'activityShow' => 1,
'activityIncomingTotal' => 0,
'activityCounterTotal' => 0,
'activityProgress' => 0,
'activityTotal' => 0,
'activitiesByUser' => [],
'badges' => [],
'page' => $this->blockPage,
'fields' => $fields,
'return' => $returnCustomer,
'returnApproach' => (isset($row['IS_REPEATED_APPROACH']) && $row['IS_REPEATED_APPROACH'] === 'Y'),
'assignedBy' => $row['ASSIGNED_BY'],
'required' => $required,
'required_fm' => $requiredFm,
'sort' => $this->getEntity()->prepareItemSort($rows[$rowId]),
'lastActivity' => $lastActivityInfo[$row['ID']] ?? null,
];
$result[$rowId] = array_merge($result[$rowId], $this->prepareAdditionalFields($row));
$isRestricted = (!empty($restrictedItemIds) && in_array($row['ID'], $restrictedItemIds));
if ($isRestricted)
{
$result[$row['ID']]['updateRestrictionCallback'] = $restriction->prepareInfoHelperScript();
}
if ($this->entity->hasClientFields())
{
foreach ($this->getClientFields() as $clientField)
{
if (isset($row[$clientField]) && $row[$clientField])
{
$result[$row['ID']][$clientField] = (
$isRestricted
? $displayOptions->getRestrictedValueHtmlReplacer()
: $row[$clientField]
);
}
}
}
$isAutomationDebugItem =
!empty($activeAutomationDebugEntityIds) && in_array($row['ID'], $activeAutomationDebugEntityIds)
;
$result[$row['ID']]['isAutomationDebugItem'] = $isAutomationDebugItem;
}
if ($this->getEntity()->getSortSettings()->isUserSortSupported())
{
$result = $this->sort($result);
}
return [
'ITEMS' => $result,
'RESTRICTED_VALUE_CLICK_CALLBACK' => $restrictedValueClickCallback,
];
}