- Модуль: sender
- Путь к файлу: ~/bitrix/modules/sender/lib/posting/builder.php
- Класс: BitrixSenderPostingBuilder
- Вызов: Builder::fill
protected function fill(ConnectorBase $connector, $group, $usedPersonalizeFields = [])
{
$count = 0;
$typeCode = $this->getTypeCode();
$isIncrementally = $connector instanceof ConnectorIncrementallyConnector && $group['FILTER_ID'];
if ($isIncrementally)
{
$segmentBuilder = new SegmentDataBuilder($group['GROUP_ID'], $group['FILTER_ID'], $group['ENDPOINT']);
if (!$segmentBuilder->isBuildingCompleted())
{
throw new NotCompletedException();
}
}
$result = $isIncrementally
? $segmentBuilder->getPreparedData()
: $connector->getResult();
while (true)
{
$dataList = array();
$maxPart = 500;
while ($data = $result->fetch())
{
if ($this->isCorrectData($data, $typeCode))
{
continue;
}
if (!isset($data[$typeCode]) && ((int)$this->typeId === RecipientType::CRM_LEAD_ID))
{
$data[$typeCode] = $data['FIELDS']['CRM_ENTITY_ID'];
}
$primary = RecipientNormalizer::normalize($data[$typeCode], $this->typeId);
if ($primary == '')
{
continue;
}
$dataList[$primary] = $data;
$count++;
$maxPart--;
if ($maxPart == 0)
{
break;
}
}
if (count($dataList) === 0)
{
break;
}
$this->setRecipientIdentificators($dataList, $group['INCLUDE']);
if ($group['INCLUDE'])
{
// add address if not exists
if ($this->checkDuplicates)
{
$primariesString = SqlBatch::getInString(array_keys($dataList));
$connection = Application::getConnection();
$rowDb = $connection->query(
"select r.CODE " .
"from b_sender_posting_recipient pr, b_sender_contact r " .
"where pr.CONTACT_ID = r.ID " .
"and pr.POSTING_ID = " . (int) $this->postingId . " " .
"and r.TYPE_ID = " . (int) $this->typeId . " " .
"and r.CODE in ($primariesString)"
);
while ($row = $rowDb->fetch())
{
unset($dataList[$row['CODE']]);
}
}
if (empty($dataList))
{
continue;
}
if(
count($usedPersonalizeFields) > 0
)
{
$preparedFields = [];
foreach($dataList as $data)
{
if(!isset($data['FIELDS']))
{
continue;
}
$field = $data['FIELDS'];
if(!isset($preparedFields[$field['CRM_ENTITY_TYPE']]))
{
$preparedFields[$field['CRM_ENTITY_TYPE']] = [];
}
$preparedFields[$field['CRM_ENTITY_TYPE']][] = $field['CRM_ENTITY_ID'];
}
foreach ($preparedFields as $entityType => $ids)
{
$this->checkUsedFields(
$entityType, $ids, $usedPersonalizeFields, $dataList
);
}
}
$this->addPostingRecipients($dataList);
}
else
{
$this->removePostingRecipients($dataList);
}
}
if (!$group['GROUP_ID'])
{
return;
}
$this->incGroupCounters($group['GROUP_ID'], $count);
}